@tscircuit/eval 0.0.511 → 0.0.512

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/lib/index.js CHANGED
@@ -295,6 +295,7 @@ var getPlatformConfig = () => ({
295
295
  });
296
296
 
297
297
  // lib/eval/execution-context.ts
298
+ import * as tslib from "tslib";
298
299
  import Debug from "debug";
299
300
  var debug = Debug("tsci:eval:execution-context");
300
301
  function createExecutionContext(webWorkerConfiguration, opts = {}) {
@@ -331,6 +332,7 @@ function createExecutionContext(webWorkerConfiguration, opts = {}) {
331
332
  react: React,
332
333
  "react/jsx-runtime": ReactJsxRuntime,
333
334
  debug: Debug,
335
+ tslib,
334
336
  // This is usually used as a type import, we can remove the shim when we
335
337
  // ignore type imports in getImportsFromCode
336
338
  "@tscircuit/props": {}
@@ -2051,4 +2053,4 @@ export {
2051
2053
  runTscircuitCode,
2052
2054
  runTscircuitModule
2053
2055
  };
2054
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbGliL2V2YWwvZXhlY3V0aW9uLWNvbnRleHQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9mb290cHJpbnQtdHJhbnNsYXRvcnMvZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvZm9vdHByaW50LXRyYW5zbGF0b3JzL2dldC1qbGMtcGFja2FnZS1mcm9tLWZvb3RwcmludGVyLXN0cmluZy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2Zvb3RwcmludC10cmFuc2xhdG9ycy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2psYy1wYXJ0cy1lbmdpbmUudHMiLCAiLi4vLi4vbGliL2dldFBsYXRmb3JtQ29uZmlnLnRzIiwgIi4uLy4uL2xpYi91dGlscy9keW5hbWljYWxseS1sb2FkLWRlcGVuZGVuY3ktd2l0aC1jZG4tYmFja3VwLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvbm9ybWFsaXplRnNNYXAudHMiLCAiLi4vLi4vbGliL3V0aWxzL2Rpcm5hbWUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci90c2NvbmZpZ1BhdGhzLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcmVzb2x2ZUZpbGVQYXRoLnRzIiwgIi4uLy4uL2xpYi91dGlscy9nZXQtaW1wb3J0cy1mcm9tLWNvZGUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vbGliL2V2YWwvZXZhbC1jb21waWxlZC1qcy50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtbG9jYWwtZmlsZS50cyIsICIuLi8uLi9saWIvc2hhcmVkL3N0YXRpYy1hc3NldC1leHRlbnNpb25zLnRzIiwgIi4uLy4uL2xpYi90cmFuc3BpbGUvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZS50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtc25pcHBldC50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vbGliL2V2YWwvZXh0cmFjdEJhc2VQYWNrYWdlTmFtZS50cyIsICIuLi8uLi9saWIvZXZhbC9pc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24udHMiLCAiLi4vLi4vbGliL2V2YWwvZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeS50cyIsICIuLi8uLi9saWIvZXZhbC9nZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQudHMiLCAiLi4vLi4vbGliL2V2YWwvaXNUeXBlU2NyaXB0RW50cnlwb2ludC50cyIsICIuLi8uLi9saWIvZXZhbC9pc0Rpc3REaXJFbXB0eS50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtbnBtLXBhY2thZ2UudHMiLCAiLi4vLi4vbGliL2V2YWwvaW1wb3J0LWV2YWwtcGF0aC50cyIsICIuLi8uLi9saWIvcnVubmVyL0NpcmN1aXRSdW5uZXIudHMiLCAiLi4vLi4vbGliL3J1bm5lci9zZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQudHMiLCAiLi4vLi4vbGliL3V0aWxzL2VuaGFuY2Utcm9vdC1jaXJjdWl0LWVycm9yLnRzIiwgIi4uLy4uL2xpYi9zaGFyZWQvb2JqLXBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci9ydW5Uc2NpcmN1aXRDb2RlLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcnVuVHNjaXJjdWl0TW9kdWxlLnRzIiwgIi4uLy4uL2xpYi93b3JrZXIudHMiLCAiLi4vLi4vbGliL2dldFBvc3NpYmxlRW50cnlwb2ludENvbXBvbmVudFBhdGhzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBSb290Q2lyY3VpdCB9IGZyb20gXCJAdHNjaXJjdWl0L2NvcmVcIlxuaW1wb3J0IHR5cGUgeyBXZWJXb3JrZXJDb25maWd1cmF0aW9uIH0gZnJvbSBcImxpYi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0ICogYXMgdHNjaXJjdWl0Q29yZSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgKiBhcyBSZWFjdEpzeFJ1bnRpbWUgZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdE1hdGhVdGlscyBmcm9tIFwiQHRzY2lyY3VpdC9tYXRoLXV0aWxzXCJcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBnZXRQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJsaWIvZ2V0UGxhdGZvcm1Db25maWdcIlxuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZyB9IGZyb20gXCJsaWIvcnVubmVyL3RzY29uZmlnUGF0aHNcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6ZXhlY3V0aW9uLWNvbnRleHRcIilcblxuaW50ZXJmYWNlIFN0b3JlZExvZ2dlciB7XG4gIGluZm86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbiAgZ2V0TG9nczogKCkgPT4gQXJyYXk8eyBtc2c6IHN0cmluZyB9PlxuICBzdHJpbmdpZnlMb2dzOiAoKSA9PiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB7XG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGVudHJ5cG9pbnQ6IHN0cmluZ1xuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgY2lyY3VpdDogUm9vdENpcmN1aXRcbiAgbG9nZ2VyOiBTdG9yZWRMb2dnZXJcbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbFxuICBpbXBvcnRTdGFjazogc3RyaW5nW11cbiAgY3VycmVudGx5SW1wb3J0aW5nOiBTZXQ8c3RyaW5nPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgd2ViV29ya2VyQ29uZmlndXJhdGlvbjogV2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgb3B0czoge1xuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBwbGF0Zm9ybT86IFBsYXRmb3JtQ29uZmlnXG4gICAgcHJvamVjdENvbmZpZz86IFBhcnRpYWw8UGxhdGZvcm1Db25maWc+XG4gICAgZGVidWdOYW1lc3BhY2U/OiBzdHJpbmdcbiAgfSA9IHt9LFxuKTogRXhlY3V0aW9uQ29udGV4dCB7XG4gIGdsb2JhbFRoaXMuUmVhY3QgPSBSZWFjdFxuXG4gIGNvbnN0IGJhc2VQbGF0Zm9ybSA9IG9wdHMucGxhdGZvcm0gfHwgZ2V0UGxhdGZvcm1Db25maWcoKVxuICBjb25zdCBwbGF0Zm9ybSA9IG9wdHMucHJvamVjdENvbmZpZ1xuICAgID8geyAuLi5iYXNlUGxhdGZvcm0sIC4uLm9wdHMucHJvamVjdENvbmZpZyB9XG4gICAgOiBiYXNlUGxhdGZvcm1cblxuICBpZiAocGxhdGZvcm0ucGFydHNFbmdpbmVEaXNhYmxlZCkge1xuICAgIHBsYXRmb3JtLnBhcnRzRW5naW5lID0gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBjaXJjdWl0ID0gbmV3IFJvb3RDaXJjdWl0KHtcbiAgICBwbGF0Zm9ybSxcbiAgfSlcblxuICBpZiAob3B0cy5uYW1lKSB7XG4gICAgY2lyY3VpdC5uYW1lID0gb3B0cy5uYW1lXG4gIH1cblxuICBpZiAob3B0cy5kZWJ1Z05hbWVzcGFjZSkge1xuICAgIGNpcmN1aXQuZW5hYmxlRGVidWcob3B0cy5kZWJ1Z05hbWVzcGFjZSlcbiAgfVxuXG4gIGNvbnN0IGxvZ3M6IEFycmF5PHsgbXNnOiBzdHJpbmcgfT4gPSBbXVxuXG4gIHJldHVybiB7XG4gICAgZnNNYXA6IHt9LFxuICAgIGVudHJ5cG9pbnQ6IFwiXCIsXG4gICAgbG9nZ2VyOiB7XG4gICAgICBpbmZvOiAobWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxvZ3MucHVzaCh7IG1zZzogbWVzc2FnZSB9KVxuICAgICAgfSxcbiAgICAgIGdldExvZ3M6ICgpID0+IGxvZ3MsXG4gICAgICBzdHJpbmdpZnlMb2dzOiAoKSA9PiBsb2dzLm1hcCgobG9nKSA9PiBsb2cubXNnKS5qb2luKFwiXFxuXCIpLFxuICAgIH0sXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzOiB7XG4gICAgICBcIkB0c2NpcmN1aXQvY29yZVwiOiB0c2NpcmN1aXRDb3JlLFxuICAgICAgdHNjaXJjdWl0OiB0c2NpcmN1aXRDb3JlLFxuICAgICAgXCJAdHNjaXJjdWl0L21hdGgtdXRpbHNcIjogdHNjaXJjdWl0TWF0aFV0aWxzLFxuICAgICAgcmVhY3Q6IFJlYWN0LFxuICAgICAgXCJyZWFjdC9qc3gtcnVudGltZVwiOiBSZWFjdEpzeFJ1bnRpbWUsXG4gICAgICBkZWJ1ZzogRGVidWcsXG5cbiAgICAgIC8vIFRoaXMgaXMgdXN1YWxseSB1c2VkIGFzIGEgdHlwZSBpbXBvcnQsIHdlIGNhbiByZW1vdmUgdGhlIHNoaW0gd2hlbiB3ZVxuICAgICAgLy8gaWdub3JlIHR5cGUgaW1wb3J0cyBpbiBnZXRJbXBvcnRzRnJvbUNvZGVcbiAgICAgIFwiQHRzY2lyY3VpdC9wcm9wc1wiOiB7fSxcbiAgICB9LFxuICAgIGNpcmN1aXQsXG4gICAgdHNDb25maWc6IG51bGwsXG4gICAgaW1wb3J0U3RhY2s6IFtdLFxuICAgIGN1cnJlbnRseUltcG9ydGluZzogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgLi4ud2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgfVxufVxuIiwgIi8qKlxuICogVHJhbnNmb3JtcyBhIEtpQ2FkIGZvb3RwcmludCBzdHJpbmcgaW50byBhIGdlbmVyaWMgXCJmb290cHJpbnRlciBzdHJpbmdcIi5cbiAqIEZvciBub3csIHRoaXMgaXMgYSBzaW1wbGlmaWVkIGNvbnZlcnNpb24gdG8gYSBzdGFuZGFyZCBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwia2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljXCIgLT4gXCIwNjAzXCJcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkID0gKFxuICBraWNhZEZvb3RwcmludDogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgLy8ga2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljIC0+IDA2MDNcbiAgbGV0IG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goLzpbUkNdXyhcXGR7NH0pXy8pXG4gIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdXG5cbiAgLy8ga2ljYWQ6UGFja2FnZV9TTzpTT0lDLThfMy45eDQuOW1tX1AxLjI3bW0gLT4gU09JQy04XG4gIC8vIGtpY2FkOlBhY2thZ2VfVE9fU09UX1NNRDpTT1QtMjMgLT4gU09ULTIzXG4gIG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goXG4gICAgLzooU09JQy1cXGQrfFNPVC1cXGQrfFNPRC1cXGQrfFNTT1AtXFxkK3xUU1NPUC1cXGQrfFFGUC1cXGQrfFFGTi1cXGQrKS8sXG4gIClcbiAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG4iLCAiLyoqXG4gKiBUcmFuc2Zvcm1zIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiIGludG8gYSBKTEMtY29tcGF0aWJsZSBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwiY2FwMDYwM1wiIC0+IFwiMDYwM1wiXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nID0gKFxuICBmb290cHJpbnRlclN0cmluZzogc3RyaW5nLFxuKTogc3RyaW5nID0+IHtcbiAgaWYgKGZvb3RwcmludGVyU3RyaW5nLmluY2x1ZGVzKFwiY2FwXCIpKSB7XG4gICAgcmV0dXJuIGZvb3RwcmludGVyU3RyaW5nLnJlcGxhY2UoL2NhcC9nLCBcIlwiKVxuICB9XG4gIHJldHVybiBmb290cHJpbnRlclN0cmluZ1xufVxuIiwgImltcG9ydCB7IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkIH0gZnJvbSBcIi4vZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkXCJcbmltcG9ydCB7IGdldEpsY1BhY2thZ2VGcm9tRm9vdHByaW50ZXJTdHJpbmcgfSBmcm9tIFwiLi9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmdcIlxuXG4vKipcbiAqIEdldCBhIEpMQy1jb21wYXRpYmxlIHBhY2thZ2UgbmFtZSBmcm9tIGEgZm9vdHByaW50IHN0cmluZywgd2hpY2ggY291bGQgYmVcbiAqIGEgS2lDYWQgZm9vdHByaW50IG9yIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiLlxuICovXG5leHBvcnQgY29uc3QgZ2V0SmxjcGNiUGFja2FnZU5hbWUgPSAoXG4gIGZvb3RwcmludDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFmb290cHJpbnQpIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoZm9vdHByaW50LnN0YXJ0c1dpdGgoXCJraWNhZDpcIikpIHtcbiAgICBjb25zdCBmb290cHJpbnRlclN0cmluZyA9IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkKGZvb3RwcmludClcbiAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmcpIHtcbiAgICAgIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludGVyU3RyaW5nKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciB1bi1tYXRjaGVkIEtpQ2FkIHN0cmluZ3NcbiAgICByZXR1cm4gZm9vdHByaW50XG4gIH1cblxuICAvLyBOb3QgYSBLaUNhZCBzdHJpbmcsIGFzc3VtZSBpdCdzIGEgZm9vdHByaW50ZXIgc3RyaW5nXG4gIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBhcnRzRW5naW5lLCBTdXBwbGllclBhcnROdW1iZXJzIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgZ2V0SmxjcGNiUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYW55PigpXG5cbmNvbnN0IGdldEpsY1BhcnRzQ2FjaGVkID0gYXN5bmMgKG5hbWU6IGFueSwgcGFyYW1zOiBhbnkpID0+IHtcbiAgY29uc3QgcGFyYW1TdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAuLi5wYXJhbXMsXG4gICAganNvbjogXCJ0cnVlXCIsXG4gIH0pLnRvU3RyaW5nKClcbiAgaWYgKGNhY2hlLmhhcyhwYXJhbVN0cmluZykpIHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KHBhcmFtU3RyaW5nKVxuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgYGh0dHBzOi8vamxjc2VhcmNoLnRzY2lyY3VpdC5jb20vJHtuYW1lfS9saXN0PyR7cGFyYW1TdHJpbmd9YCxcbiAgKVxuICBjb25zdCByZXNwb25zZUpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgY2FjaGUuc2V0KHBhcmFtU3RyaW5nLCByZXNwb25zZUpzb24pXG4gIHJldHVybiByZXNwb25zZUpzb25cbn1cblxuY29uc3Qgd2l0aEJhc2ljUGFydFByZWZlcmVuY2UgPSAocGFydHM6IGFueVtdIHwgdW5kZWZpbmVkKSA9PiB7XG4gIGlmICghcGFydHMpIHJldHVybiBbXVxuICByZXR1cm4gWy4uLnBhcnRzXS5zb3J0KFxuICAgIChhLCBiKSA9PiBOdW1iZXIoYi5pc19iYXNpYyA/PyBmYWxzZSkgLSBOdW1iZXIoYS5pc19iYXNpYyA/PyBmYWxzZSksXG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IGpsY1BhcnRzRW5naW5lOiBQYXJ0c0VuZ2luZSA9IHtcbiAgZmluZFBhcnQ6IGFzeW5jICh7XG4gICAgc291cmNlQ29tcG9uZW50LFxuICAgIGZvb3RwcmludGVyU3RyaW5nLFxuICB9KTogUHJvbWlzZTxTdXBwbGllclBhcnROdW1iZXJzPiA9PiB7XG4gICAgY29uc3QgamxjcGNiUGFja2FnZSA9IGdldEpsY3BjYlBhY2thZ2VOYW1lKGZvb3RwcmludGVyU3RyaW5nKVxuXG4gICAgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Jlc2lzdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcmVzaXN0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc2lzdG9yc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5yZXNpc3RhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNpc3RvcnMpXG4gICAgICAgICAgLm1hcCgocjogYW55KSA9PiBgQyR7ci5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2FwYWNpdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY2FwYWNpdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjYXBhY2l0b3JzXCIsIHtcbiAgICAgICAgY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5jYXBhY2l0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY2FwYWNpdG9ycylcbiAgICAgICAgICAubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9waW5faGVhZGVyXCJcbiAgICApIHtcbiAgICAgIGxldCBwaXRjaDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmc/LmluY2x1ZGVzKFwiX3BcIikpIHtcbiAgICAgICAgcGl0Y2ggPSBOdW1iZXIoZm9vdHByaW50ZXJTdHJpbmcuc3BsaXQoXCJfcFwiKVsxXSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXG4gICAgICAgIFwiaGVhZGVyc1wiLFxuICAgICAgICBwaXRjaFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwaXRjaDogcGl0Y2gsXG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9LFxuICAgICAgKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShoZWFkZXJzKVxuICAgICAgICAgIC5tYXAoKGg6IGFueSkgPT4gYEMke2gubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3BvdGVudGlvbWV0ZXJcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBwb3RlbnRpb21ldGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJwb3RlbnRpb21ldGVyc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5tYXhfcmVzaXN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHBvdGVudGlvbWV0ZXJzKVxuICAgICAgICAgIC5tYXAoKHA6IGFueSkgPT4gYEMke3AubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2Rpb2RlXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgZGlvZGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImRpb2Rlc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShkaW9kZXMpXG4gICAgICAgICAgLm1hcCgoZDogYW55KSA9PiBgQyR7ZC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2hpcFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGNoaXBzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImNoaXBzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGNoaXBzKVxuICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gYEMke2MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3RyYW5zaXN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyB0cmFuc2lzdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJ0cmFuc2lzdG9yc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICAgIHRyYW5zaXN0b3JfdHlwZTogc291cmNlQ29tcG9uZW50LnRyYW5zaXN0b3JfdHlwZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHRyYW5zaXN0b3JzKVxuICAgICAgICAgIC5tYXAoKHQ6IGFueSkgPT4gYEMke3QubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Bvd2VyX3NvdXJjZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHBvd2VyX3NvdXJjZXMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicG93ZXJfc291cmNlc1wiLCB7XG4gICAgICAgIHZvbHRhZ2U6IHNvdXJjZUNvbXBvbmVudC52b2x0YWdlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocG93ZXJfc291cmNlcylcbiAgICAgICAgICAubWFwKChwOiBhbnkpID0+IGBDJHtwLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9pbmR1Y3RvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGluZHVjdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJpbmR1Y3RvcnNcIiwge1xuICAgICAgICBpbmR1Y3RhbmNlOiBzb3VyY2VDb21wb25lbnQuaW5kdWN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGluZHVjdG9ycylcbiAgICAgICAgICAubWFwKChpOiBhbnkpID0+IGBDJHtpLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9jcnlzdGFsXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY3J5c3RhbHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiY3J5c3RhbHNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIGxvYWRfY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5sb2FkX2NhcGFjaXRhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY3J5c3RhbHMpXG4gICAgICAgICAgLm1hcCgoYzogYW55KSA9PiBgQyR7Yy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbW9zZmV0XCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbW9zZmV0cyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJtb3NmZXRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgICAgbW9zZmV0X21vZGU6IHNvdXJjZUNvbXBvbmVudC5tb3NmZXRfbW9kZSxcbiAgICAgICAgY2hhbm5lbF90eXBlOiBzb3VyY2VDb21wb25lbnQuY2hhbm5lbF90eXBlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UobW9zZmV0cylcbiAgICAgICAgICAubWFwKChtOiBhbnkpID0+IGBDJHttLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9yZXNvbmF0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyByZXNvbmF0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc29uYXRvcnNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNvbmF0b3JzKVxuICAgICAgICAgIC5tYXAoKHI6IGFueSkgPT4gYEMke3IubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3N3aXRjaFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHN3aXRjaGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInN3aXRjaGVzXCIsIHtcbiAgICAgICAgc3dpdGNoX3R5cGU6IHNvdXJjZUNvbXBvbmVudC50eXBlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2Uoc3dpdGNoZXMpXG4gICAgICAgICAgLm1hcCgoczogYW55KSA9PiBgQyR7cy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbGVkXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbGVkcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJsZWRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGxlZHMpXG4gICAgICAgICAgLm1hcCgobDogYW55KSA9PiBgQyR7bC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfZnVzZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGZ1c2VzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImZ1c2VzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGZ1c2VzKVxuICAgICAgICAgIC5tYXAoKGw6IGFueSkgPT4gYEMke2wubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9XG4gIH0sXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZywgU3BpY2VFbmdpbmUgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBqbGNQYXJ0c0VuZ2luZSB9IGZyb20gXCJAdHNjaXJjdWl0L3BhcnRzLWVuZ2luZVwiXG5pbXBvcnQgeyBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbiB9IGZyb20gXCJraWNhZC1jb21wb25lbnQtY29udmVydGVyXCJcbmltcG9ydCB7IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwIH0gZnJvbSBcIi4vdXRpbHMvZHluYW1pY2FsbHktbG9hZC1kZXBlbmRlbmN5LXdpdGgtY2RuLWJhY2t1cFwiXG5jb25zdCBLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMID0gXCJodHRwczovL2tpY2FkLW1vZC1jYWNoZS50c2NpcmN1aXQuY29tXCJcblxubGV0IG5nc3BpY2VFbmdpbmVDYWNoZTogU3BpY2VFbmdpbmUgfCBudWxsID0gbnVsbFxuXG5leHBvcnQgY29uc3QgZ2V0UGxhdGZvcm1Db25maWcgPSAoKTogUGxhdGZvcm1Db25maWcgPT4gKHtcbiAgcGFydHNFbmdpbmU6IGpsY1BhcnRzRW5naW5lLFxuICBzcGljZUVuZ2luZU1hcDoge1xuICAgIG5nc3BpY2U6IHtcbiAgICAgIHNpbXVsYXRlOiBhc3luYyAoc3BpY2U6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIW5nc3BpY2VFbmdpbmVDYWNoZSkge1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSA9XG4gICAgICAgICAgICBhd2FpdCBkeW5hbWljYWxseUxvYWREZXBlbmRlbmN5V2l0aENkbkJhY2t1cChcbiAgICAgICAgICAgICAgXCJAdHNjaXJjdWl0L25nc3BpY2Utc3BpY2UtZW5naW5lXCIsXG4gICAgICAgICAgICApLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJDb3VsZCBub3QgbG9hZCBuZ3NwaWNlIGVuZ2luZSBmcm9tIGxvY2FsIG5vZGVfbW9kdWxlcyBvciBDRE4gZmFsbGJhY2suXCIsXG4gICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChjcmVhdGVOZ3NwaWNlU3BpY2VFbmdpbmUpIHtcbiAgICAgICAgICAgIG5nc3BpY2VFbmdpbmVDYWNoZSA9IGF3YWl0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZ3NwaWNlRW5naW5lQ2FjaGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkNvdWxkIG5vdCBsb2FkIG5nc3BpY2UgZW5naW5lIGZyb20gbG9jYWwgbm9kZV9tb2R1bGVzIG9yIENETiBmYWxsYmFjay5cIixcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmdzcGljZUVuZ2luZUNhY2hlLnNpbXVsYXRlKHNwaWNlKVxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRMaWJyYXJ5TWFwOiB7XG4gICAga2ljYWQ6IGFzeW5jIChmb290cHJpbnROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMfS8ke2Zvb3RwcmludE5hbWV9YFxuICAgICAgY29uc3QgY2lyY3VpdEpzb25VcmwgPSBgJHtiYXNlVXJsfS5jaXJjdWl0Lmpzb25gXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChjaXJjdWl0SnNvblVybClcbiAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlcy5qc29uKClcbiAgICAgIC8vIEZpbHRlciBwY2Jfc2lsa3NjcmVlbl90ZXh0IHRvIG9ubHkga2VlcCBlbnRyaWVzIHdpdGggdGV4dCA9PT0gXCJSRUYqKlwiXG4gICAgICAvLyBBcHBseSBmaWx0ZXJpbmcgb25seSB0byBlbGVtZW50cyBjb21pbmcgZnJvbSB0aGUga2ljYWRfbW9kX3NlcnZlciByZXNwb25zZVxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBBcnJheS5pc0FycmF5KHJhdylcbiAgICAgICAgPyByYXcuZmlsdGVyKChlbCkgPT5cbiAgICAgICAgICAgIGVsPy50eXBlID09PSBcInBjYl9zaWxrc2NyZWVuX3RleHRcIiA/IGVsPy50ZXh0ID09PSBcIlJFRioqXCIgOiB0cnVlLFxuICAgICAgICAgIClcbiAgICAgICAgOiByYXdcbiAgICAgIGNvbnN0IHdybFVybCA9IGAke2Jhc2VVcmx9LndybGBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvb3RwcmludENpcmN1aXRKc29uOiBmaWx0ZXJlZCxcbiAgICAgICAgY2FkTW9kZWw6IHsgd3JsVXJsLCBtb2RlbFVuaXRUb01tU2NhbGU6IDIuNTQgfSxcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRGaWxlUGFyc2VyTWFwOiB7XG4gICAga2ljYWRfbW9kOiB7XG4gICAgICBsb2FkRnJvbVVybDogYXN5bmMgKHVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGtpY2FkQ29udGVudCA9IGF3YWl0IGZldGNoKHVybCkudGhlbigocmVzKSA9PiByZXMudGV4dCgpKVxuICAgICAgICBjb25zdCBraWNhZEpzb24gPSBhd2FpdCBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbihraWNhZENvbnRlbnQpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9vdHByaW50Q2lyY3VpdEpzb246IEFycmF5LmlzQXJyYXkoa2ljYWRKc29uKVxuICAgICAgICAgICAgPyBraWNhZEpzb25cbiAgICAgICAgICAgIDogW2tpY2FkSnNvbl0sXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pXG4iLCAiZXhwb3J0IGNvbnN0IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwID0gYXN5bmMgKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBGaXJzdCwgdHJ5IHRvIGltcG9ydCB1c2luZyBOb2RlLmpzIHJlc29sdXRpb25cbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQocGFja2FnZU5hbWUpXG4gICAgcmV0dXJuIG1vZHVsZS5kZWZhdWx0XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGxvYWQgJHtwYWNrYWdlTmFtZX0gbG9jYWxseSwgdHJ5aW5nIENETiBmYWxsYmFjay4uLmApXG4gICAgLy8gRmFsbGJhY2sgdG8gSnNEZWxpdnIgQ0ROIGZvciBicm93c2VyIGVudmlyb25tZW50c1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vJHtwYWNrYWdlTmFtZX0vK2VzbWAsXG4gICAgICApXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCAke3BhY2thZ2VOYW1lfSBmcm9tIENETjogJHtyZXMuc3RhdHVzVGV4dH1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjb25zdCBjb2RlID0gYXdhaXQgcmVzLnRleHQoKVxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjb2RlXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiB9KVxuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0OiBsb2FkZWRNb2R1bGUgfSA9IGF3YWl0IGltcG9ydCh1cmwpXG4gICAgICAgIHJldHVybiBsb2FkZWRNb2R1bGVcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGNkbkVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBDRE4gZmFsbGJhY2sgZm9yICR7cGFja2FnZU5hbWV9IGFsc28gZmFpbGVkOmAsIGNkbkVycm9yKVxuICAgICAgdGhyb3cgY2RuRXJyb3JcbiAgICB9XG4gIH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZykge1xuICBsZXQgbm9ybUZpbGVQYXRoID0gZmlsZVBhdGhcbiAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpXG4gIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC50cmltKClcbiAgaWYgKG5vcm1GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikpIHtcbiAgICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGguc2xpY2UoMilcbiAgfVxuICBpZiAobm9ybUZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnNsaWNlKDEpXG4gIH1cbiAgcmV0dXJuIG5vcm1GaWxlUGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRnNNYXAoZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgY29uc3Qgbm9ybWFsaXplZEZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBbZnNQYXRoLCBmaWxlQ29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZnNNYXApKSB7XG4gICAgbm9ybWFsaXplZEZzTWFwW25vcm1hbGl6ZUZpbGVQYXRoKGZzUGF0aCldID0gZmlsZUNvbnRlbnRcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZEZzTWFwXG59XG4iLCAiLyoqXG4gKiBSZXR1cm5zIHRoZSBkaXJlY3RvcnkgbmFtZSBvZiBhIHBhdGgsIHNpbWlsYXIgdG8gTm9kZS5qcyBwYXRoLmRpcm5hbWVcbiAqIFdvcmtzIG9uIGJvdGggVW5peCBhbmQgV2luZG93cyBwYXRoc1xuICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gZXh0cmFjdCB0aGUgZGlyZWN0b3J5IGZyb21cbiAqIEByZXR1cm5zIFRoZSBkaXJlY3RvcnkgcGFydCBvZiB0aGUgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlybmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXBhdGgpIHJldHVybiBcIi5cIlxuXG4gIC8vIE5vcm1hbGl6ZSBwYXRoIHNlcGFyYXRvcnMgdG8gZm9yd2FyZCBzbGFzaGVzXG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKVxuXG4gIC8vIFJlbW92ZSB0cmFpbGluZyBzbGFzaGVzXG4gIGNvbnN0IGNsZWFuUGF0aCA9IG5vcm1hbGl6ZWRQYXRoLnJlcGxhY2UoL1xcLyskLywgXCJcIilcblxuICAvLyBJZiB0aGVyZSBhcmUgbm8gc2xhc2hlcywgcmV0dXJuIFwiLlwiXG4gIGlmIChjbGVhblBhdGguaW5kZXhPZihcIi9cIikgPT09IC0xKSByZXR1cm4gXCIuXCJcblxuICAvLyBSZXR1cm4gZXZlcnl0aGluZyB1cCB0byB0aGUgbGFzdCBzbGFzaFxuICByZXR1cm4gY2xlYW5QYXRoLnN1YnN0cmluZygwLCBjbGVhblBhdGgubGFzdEluZGV4T2YoXCIvXCIpKSB8fCBcIi9cIlxufVxuIiwgImltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwiLi9kaXJuYW1lXCJcblxuLyoqXG4gKiBSZXNvbHZlIGFuIGltcG9ydFBhdGggcmVsYXRpdmUgdG8gYSBjd2QsIHN1cHBvcnRpbmcgLi4vLCAuLyBhbmQgYWJzb2x1dGUgcGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGg6IHN0cmluZywgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uXG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICBjb25zdCBwYXJlbnREaXIgPSBkaXJuYW1lKGN3ZClcbiAgICByZXR1cm4gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoLnNsaWNlKDMpLCBwYXJlbnREaXIpXG4gIH1cbiAgLy8gSGFuZGxlIGN1cnJlbnQgZGlyZWN0b3J5XG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSkge1xuICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGguc2xpY2UoMiksIGN3ZClcbiAgfVxuICAvLyBIYW5kbGUgYWJzb2x1dGUgcGF0aFxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIHJldHVybiBpbXBvcnRQYXRoLnNsaWNlKDEpXG4gIH1cbiAgLy8gSGFuZGxlIHJlbGF0aXZlIHBhdGhcbiAgcmV0dXJuIGAke2N3ZH0vJHtpbXBvcnRQYXRofWBcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcblxuZXhwb3J0IHR5cGUgVHNDb25maWcgPSB7XG4gIGNvbXBpbGVyT3B0aW9ucz86IHtcbiAgICBiYXNlVXJsPzogc3RyaW5nXG4gICAgcGF0aHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duXG4gIH1cbiAgZXh0ZW5kcz86IHN0cmluZyB8IHN0cmluZ1tdXG4gIGZpbGVzPzogc3RyaW5nW11cbiAgcmVmZXJlbmNlcz86IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICBpbmNsdWRlPzogc3RyaW5nW11cbiAgZXhjbHVkZT86IHN0cmluZ1tdXG4gIFtrZXk6IHN0cmluZ106IHVua25vd25cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzQ29uZmlnKFxuICBmc01hcE9yQWxsRmlsZVBhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nW10sXG4pOiBUc0NvbmZpZyB8IG51bGwge1xuICBpZiAoQXJyYXkuaXNBcnJheShmc01hcE9yQWxsRmlsZVBhdGhzKSkgcmV0dXJuIG51bGxcbiAgY29uc3QgdHNjb25maWdDb250ZW50ID0gZnNNYXBPckFsbEZpbGVQYXRoc1tcInRzY29uZmlnLmpzb25cIl1cbiAgaWYgKCF0c2NvbmZpZ0NvbnRlbnQpIHJldHVybiBudWxsXG4gIHRyeSB7XG4gICAgY29uc3Qgc2FuaXRpemVkQ29udGVudCA9IHRzY29uZmlnQ29udGVudC5yZXBsYWNlKFxuICAgICAgL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98XFwvXFwvLiovZyxcbiAgICAgIFwiXCIsXG4gICAgKSAvLyByZW1vdmUgY29tbWVudHNcblxuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc2FuaXRpemVkQ29udGVudCkgYXMgVHNDb25maWdcbiAgICByZXR1cm4gcGFyc2VkXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIHRzY29uZmlnLmpzb246ICR7ZS5tZXNzYWdlfWApXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaXRoVHNjb25maWdQYXRocyhvcHRzOiB7XG4gIGltcG9ydFBhdGg6IHN0cmluZ1xuICBub3JtYWxpemVkRmlsZVBhdGhNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgZXh0ZW5zaW9uczogc3RyaW5nW11cbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbFxuICB0c2NvbmZpZ0Rpcj86IHN0cmluZ1xufSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgICB0c2NvbmZpZ0RpcixcbiAgfSA9IG9wdHNcbiAgY29uc3QgcGF0aHMgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5wYXRoc1xuICBpZiAoIXBhdGhzKSByZXR1cm4gbnVsbFxuICBjb25zdCBiYXNlVXJsID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybCB8fCBcIi5cIlxuXG4gIGNvbnN0IHRyeVJlc29sdmVDYW5kaWRhdGUgPSAoY2FuZGlkYXRlOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkQ2FuZGlkYXRlID0gbm9ybWFsaXplRmlsZVBhdGgoY2FuZGlkYXRlKVxuICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKG5vcm1hbGl6ZWRDYW5kaWRhdGUpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChub3JtYWxpemVkQ2FuZGlkYXRlKSFcbiAgICB9XG4gICAgZm9yIChjb25zdCBleHQgb2YgZXh0ZW5zaW9ucykge1xuICAgICAgY29uc3Qgd2l0aEV4dCA9IGAke25vcm1hbGl6ZWRDYW5kaWRhdGV9LiR7ZXh0fWBcbiAgICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHdpdGhFeHQpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHdpdGhFeHQpIVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgZm9yIChjb25zdCBbYWxpYXMsIHRhcmdldHNdIG9mIE9iamVjdC5lbnRyaWVzKHBhdGhzKSkge1xuICAgIC8vIFN1cHBvcnQgcGF0dGVybnMgbGlrZSBcIkBzcmMvKlwiIG9yIFwidXRpbHMvKlwiIGFuZCBhbHNvIGV4YWN0IG1hdGNoZXMgd2l0aG91dCBcIipcIlxuICAgIGNvbnN0IGhhc1dpbGRjYXJkID0gYWxpYXMuaW5jbHVkZXMoXCIqXCIpXG4gICAgaWYgKGhhc1dpbGRjYXJkKSB7XG4gICAgICBjb25zdCBbcHJlZml4LCBzdWZmaXhdID0gYWxpYXMuc3BsaXQoXCIqXCIpXG4gICAgICBpZiAoXG4gICAgICAgICFpbXBvcnRQYXRoLnN0YXJ0c1dpdGgocHJlZml4KSB8fFxuICAgICAgICAhaW1wb3J0UGF0aC5lbmRzV2l0aChzdWZmaXggfHwgXCJcIilcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3Qgc3Rhck1hdGNoID0gaW1wb3J0UGF0aC5zbGljZShcbiAgICAgICAgcHJlZml4Lmxlbmd0aCxcbiAgICAgICAgaW1wb3J0UGF0aC5sZW5ndGggLSAoc3VmZml4ID8gc3VmZml4Lmxlbmd0aCA6IDApLFxuICAgICAgKVxuICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICBjb25zdCByZXBsYWNlZCA9IHRhcmdldC5yZXBsYWNlKFwiKlwiLCBzdGFyTWF0Y2gpXG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9XG4gICAgICAgICAgYmFzZVVybCAmJiAhcmVwbGFjZWQuc3RhcnRzV2l0aChcIi4vXCIpICYmICFyZXBsYWNlZC5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgICAgICAgPyBgJHtiYXNlVXJsfS8ke3JlcGxhY2VkfWBcbiAgICAgICAgICAgIDogcmVwbGFjZWRcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cnlSZXNvbHZlQ2FuZGlkYXRlKGNhbmRpZGF0ZSlcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGltcG9ydFBhdGggIT09IGFsaWFzKSBjb250aW51ZVxuICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPVxuICAgICAgICAgIGJhc2VVcmwgJiYgIXRhcmdldC5zdGFydHNXaXRoKFwiLi9cIikgJiYgIXRhcmdldC5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgICAgICAgPyBgJHtiYXNlVXJsfS8ke3RhcmdldH1gXG4gICAgICAgICAgICA6IHRhcmdldFxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IHRyeVJlc29sdmVDYW5kaWRhdGUoY2FuZGlkYXRlKVxuICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkUGF0aEZyb21CYXNlVXJsID0gcmVzb2x2ZVdpdGhCYXNlVXJsKHtcbiAgICBpbXBvcnRQYXRoLFxuICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCxcbiAgICBleHRlbnNpb25zLFxuICAgIHRzQ29uZmlnLFxuICAgIHRzY29uZmlnRGlyLFxuICB9KVxuXG4gIGlmIChyZXNvbHZlZFBhdGhGcm9tQmFzZVVybCkgcmV0dXJuIHJlc29sdmVkUGF0aEZyb21CYXNlVXJsXG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaXRoQmFzZVVybChvcHRzOiB7XG4gIGltcG9ydFBhdGg6IHN0cmluZ1xuICBub3JtYWxpemVkRmlsZVBhdGhNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgZXh0ZW5zaW9uczogc3RyaW5nW11cbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbFxuICB0c2NvbmZpZ0Rpcj86IHN0cmluZ1xufSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgICB0c2NvbmZpZ0RpcixcbiAgfSA9IG9wdHNcbiAgY29uc3QgYmFzZVVybCA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmxcbiAgaWYgKCFiYXNlVXJsKSByZXR1cm4gbnVsbFxuXG4gIC8vIFJlc29sdmUgYmFzZVVybCByZWxhdGl2ZSB0byB0c2NvbmZpZyBsb2NhdGlvblxuICBjb25zdCBiYXNlRGlyID0gdHNjb25maWdEaXIgfHwgXCIuXCJcbiAgbGV0IGZpbGVQYXRoVG9SZXNvbHZlID0gYCR7YmFzZURpcn0vJHtiYXNlVXJsfS8ke2ltcG9ydFBhdGh9YFxuICAvLyBDbGVhbiB1cCBtdWx0aXBsZSBzbGFzaGVzIGFuZCBsZWFkaW5nIGRvdHNcbiAgZmlsZVBhdGhUb1Jlc29sdmUgPSBmaWxlUGF0aFRvUmVzb2x2ZS5yZXBsYWNlKC9cXC8rL2csIFwiL1wiKSAvLyBSZXBsYWNlIG11bHRpcGxlIHNsYXNoZXMgd2l0aCBzaW5nbGUgc2xhc2hcbiAgZmlsZVBhdGhUb1Jlc29sdmUgPSBmaWxlUGF0aFRvUmVzb2x2ZS5yZXBsYWNlKC9cXC9cXC5cXC8vZywgXCIvXCIpIC8vIFJlcGxhY2UgLy4vIHdpdGggL1xuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGggPSBub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aFRvUmVzb2x2ZSlcblxuICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkRmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZEZpbGVQYXRoKSFcbiAgfVxuXG4gIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCB3aXRoRXh0ID0gYCR7bm9ybWFsaXplZEZpbGVQYXRofS4ke2V4dH1gXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMod2l0aEV4dCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHdpdGhFeHQpIVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzVHNjb25maWdQYXRoUGF0dGVybihcbiAgaW1wb3J0UGF0aDogc3RyaW5nLFxuICB0c0NvbmZpZzogVHNDb25maWcgfCBudWxsLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhdGhzID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8ucGF0aHNcbiAgaWYgKCFwYXRocykgcmV0dXJuIGZhbHNlXG5cbiAgZm9yIChjb25zdCBbYWxpYXNdIG9mIE9iamVjdC5lbnRyaWVzKHBhdGhzKSkge1xuICAgIGNvbnN0IGhhc1dpbGRjYXJkID0gYWxpYXMuaW5jbHVkZXMoXCIqXCIpXG4gICAgaWYgKGhhc1dpbGRjYXJkKSB7XG4gICAgICBjb25zdCBbcHJlZml4LCBzdWZmaXhdID0gYWxpYXMuc3BsaXQoXCIqXCIpXG4gICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKHByZWZpeCkgJiYgaW1wb3J0UGF0aC5lbmRzV2l0aChzdWZmaXggfHwgXCJcIikpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGltcG9ydFBhdGggPT09IGFsaWFzKSByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuIiwgImltcG9ydCB7IG5vcm1hbGl6ZUZpbGVQYXRoIH0gZnJvbSBcIi4vbm9ybWFsaXplRnNNYXBcIlxuaW1wb3J0IHsgcmVzb2x2ZVJlbGF0aXZlUGF0aCB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZVJlbGF0aXZlUGF0aFwiXG5pbXBvcnQge1xuICByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMsXG4gIHR5cGUgVHNDb25maWcsXG4gIHJlc29sdmVXaXRoQmFzZVVybCxcbn0gZnJvbSBcIi4vdHNjb25maWdQYXRoc1wiXG5cbmNvbnN0IEZJTEVfRVhURU5TSU9OUyA9IFtcInRzeFwiLCBcInRzXCIsIFwianNvblwiLCBcImpzXCIsIFwianN4XCIsIFwib2JqXCIsIFwiZ2x0ZlwiLCBcImdsYlwiXVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpbGVQYXRoID0gKFxuICB1bmtub3duRmlsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuICBjd2Q/OiBzdHJpbmcsXG4gIG9wdHM6IHsgdHNDb25maWc/OiBUc0NvbmZpZyB8IG51bGw7IHRzY29uZmlnRGlyPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB0c0NvbmZpZyA9IG9wdHMudHNDb25maWcgPz8gbnVsbFxuICBjb25zdCBpc1JlbGF0aXZlSW1wb3J0ID1cbiAgICB1bmtub3duRmlsZVBhdGguc3RhcnRzV2l0aChcIi4vXCIpIHx8IHVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpXG4gIGNvbnN0IGhhc0Jhc2VVcmwgPSAhIXRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmxcblxuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uIHByb3Blcmx5XG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9XG4gICAgY3dkICYmIChpc1JlbGF0aXZlSW1wb3J0IHx8ICFoYXNCYXNlVXJsKVxuICAgICAgPyByZXNvbHZlUmVsYXRpdmVQYXRoKHVua25vd25GaWxlUGF0aCwgY3dkKVxuICAgICAgOiB1bmtub3duRmlsZVBhdGhcblxuICBjb25zdCBmaWxlUGF0aHMgPSBuZXcgU2V0KFxuICAgIEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocylcbiAgICAgID8gZnNNYXBPckFsbEZpbGVQYXRoc1xuICAgICAgOiBPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKSxcbiAgKVxuXG4gIGlmIChmaWxlUGF0aHMuaGFzKHJlc29sdmVkUGF0aCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZWRQYXRoXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGhNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLnNldChub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aCksIGZpbGVQYXRoKVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKHJlc29sdmVkUGF0aClcblxuICAvLyBXaGVuIGJhc2VVcmwgaXMgc2V0LCBub24tcmVsYXRpdmUgaW1wb3J0cyBzaG91bGQgZ28gdGhyb3VnaCBiYXNlVXJsIHJlc29sdXRpb25cbiAgaWYgKGlzUmVsYXRpdmVJbXBvcnQgfHwgIWhhc0Jhc2VVcmwpIHtcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkUmVzb2x2ZWRQYXRoKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZFJlc29sdmVkUGF0aCkhXG4gICAgfVxuXG4gICAgLy8gU2VhcmNoIGZvciBmaWxlIHdpdGggYSBzZXQgb2YgZGlmZmVyZW50IGV4dGVuc2lvbnNcbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBGSUxFX0VYVEVOU0lPTlMpIHtcbiAgICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkUmVzb2x2ZWRQYXRofS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhwb3NzaWJsZUZpbGVQYXRoKSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChwb3NzaWJsZUZpbGVQYXRoKSFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBUcnkgcmVzb2x2aW5nIHVzaW5nIHRzY29uZmlnIFwicGF0aHNcIiBtYXBwaW5nIHdoZW4gdGhlIGltcG9ydCBpcyBub24tcmVsYXRpdmVcbiAgaWYgKCFpc1JlbGF0aXZlSW1wb3J0KSB7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoRnJvbVBhdGhzID0gcmVzb2x2ZVdpdGhUc2NvbmZpZ1BhdGhzKHtcbiAgICAgIGltcG9ydFBhdGg6IHVua25vd25GaWxlUGF0aCxcbiAgICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCxcbiAgICAgIGV4dGVuc2lvbnM6IEZJTEVfRVhURU5TSU9OUyxcbiAgICAgIHRzQ29uZmlnLFxuICAgICAgdHNjb25maWdEaXI6IG9wdHMudHNjb25maWdEaXIsXG4gICAgfSlcbiAgICBpZiAocmVzb2x2ZWRQYXRoRnJvbVBhdGhzKSByZXR1cm4gcmVzb2x2ZWRQYXRoRnJvbVBhdGhzXG5cbiAgICBjb25zdCByZXNvbHZlZFBhdGhGcm9tQmFzZVVybCA9IHJlc29sdmVXaXRoQmFzZVVybCh7XG4gICAgICBpbXBvcnRQYXRoOiB1bmtub3duRmlsZVBhdGgsXG4gICAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgICBleHRlbnNpb25zOiBGSUxFX0VYVEVOU0lPTlMsXG4gICAgICB0c0NvbmZpZyxcbiAgICAgIHRzY29uZmlnRGlyOiBvcHRzLnRzY29uZmlnRGlyLFxuICAgIH0pXG4gICAgaWYgKHJlc29sdmVkUGF0aEZyb21CYXNlVXJsKSByZXR1cm4gcmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmxcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGl0J3MgYW4gYWJzb2x1dGUgaW1wb3J0IChvbmx5IGlmIG5vIGJhc2VVcmwgaXMgY29uZmlndXJlZCBpbiB0c2NvbmZpZylcbiAgLy8gV2hlbiBiYXNlVXJsIGlzIHNldCwgaW1wb3J0cyBzaG91bGQgcmVzb2x2ZSB2aWEgYmFzZVVybCBvciBmYWlsLCBub3QgZmFsbCBiYWNrIHRvIGFic29sdXRlIHBhdGhzXG4gIGlmICghaXNSZWxhdGl2ZUltcG9ydCAmJiAhaGFzQmFzZVVybCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGggPSBub3JtYWxpemVGaWxlUGF0aCh1bmtub3duRmlsZVBhdGgpXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZFVua25vd25GaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGgpIVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBGSUxFX0VYVEVOU0lPTlMpIHtcbiAgICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkVW5rbm93bkZpbGVQYXRofS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhwb3NzaWJsZUZpbGVQYXRoKSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChwb3NzaWJsZUZpbGVQYXRoKSFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyA9IChcbiAgdW5rbm93bkZpbGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwT3JBbGxGaWxlUGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmdbXSxcbiAgY3dkPzogc3RyaW5nLFxuICBvcHRzOiB7IHRzQ29uZmlnPzogVHNDb25maWcgfCBudWxsOyB0c2NvbmZpZ0Rpcj86IHN0cmluZyB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QgcmVzb2x2ZWRGaWxlUGF0aCA9IHJlc29sdmVGaWxlUGF0aChcbiAgICB1bmtub3duRmlsZVBhdGgsXG4gICAgZnNNYXBPckFsbEZpbGVQYXRocyxcbiAgICBjd2QsXG4gICAgb3B0cyxcbiAgKVxuICBpZiAoIXJlc29sdmVkRmlsZVBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmlsZSBub3QgZm91bmQgXCIke3Vua25vd25GaWxlUGF0aH1cIiwgYXZhaWxhYmxlIHBhdGhzOlxcblxcbiR7T2JqZWN0LmtleXMoZnNNYXBPckFsbEZpbGVQYXRocykuam9pbihcIiwgXCIpfWAsXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNvbHZlZEZpbGVQYXRoXG59XG4iLCAiZXhwb3J0IGNvbnN0IGdldEltcG9ydHNGcm9tQ29kZSA9IChjb2RlOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gIC8vIE1hdGNoIGJhc2ljIGltcG9ydCBwYXR0ZXJucyBpbmNsdWRpbmcgY29tYmluZWQgZGVmYXVsdCBhbmQgbmFtZXNwYWNlIGltcG9ydHNcbiAgY29uc3QgaW1wb3J0UmVnZXggPVxuICAgIC9eXFxzKmltcG9ydFxccysoPzooPzpbXFx3XFxzXSssXFxzKik/KD86XFwqXFxzK2FzXFxzK1tcXHdcXHNdK3xcXHtbXFxzXFx3LF0rXFx9fFxcdyspXFxzK2Zyb21cXHMqKT9bJ1wiXSguKz8pWydcIl0vZ21cbiAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXVxuICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXNzaWduSW5FeHByZXNzaW9uczogPGV4cGxhbmF0aW9uPlxuICB3aGlsZSAoKG1hdGNoID0gaW1wb3J0UmVnZXguZXhlYyhjb2RlKSkgIT09IG51bGwpIHtcbiAgICBjb25zdCBmdWxsTWF0Y2ggPSBtYXRjaFswXVxuICAgIGlmICgvXlxccyppbXBvcnRcXHMrdHlwZVxcYi8udGVzdChmdWxsTWF0Y2gpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpbXBvcnRzLnB1c2gobWF0Y2hbMV0pXG4gIH1cblxuICAvLyBNYXRjaCByZS1leHBvcnRzXG4gIGNvbnN0IHJlRXhwb3J0UmVnZXggPVxuICAgIC9eXFxzKmV4cG9ydFxccysoPzp0eXBlXFxzKyk/KD86XFwqXFxzK2FzXFxzK1tcXHckXSt8XFwqfFxce1tefV0rXFx9KVxccytmcm9tXFxzKlsnXCJdKC4rPylbJ1wiXS9nbVxuICBsZXQgcmVFeHBvcnRNYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXNzaWduSW5FeHByZXNzaW9uczogPGV4cGxhbmF0aW9uPlxuICB3aGlsZSAoKHJlRXhwb3J0TWF0Y2ggPSByZUV4cG9ydFJlZ2V4LmV4ZWMoY29kZSkpICE9PSBudWxsKSB7XG4gICAgY29uc3QgZnVsbE1hdGNoID0gcmVFeHBvcnRNYXRjaFswXVxuICAgIGlmICgvXlxccypleHBvcnRcXHMrdHlwZVxcYi8udGVzdChmdWxsTWF0Y2gpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpbXBvcnRzLnB1c2gocmVFeHBvcnRNYXRjaFsxXSlcbiAgfVxuXG4gIHJldHVybiBpbXBvcnRzXG59XG4iLCAiaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCIuL2Rpcm5hbWVcIlxuXG50eXBlIEV4cG9ydFZhbHVlID0gc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj5cblxuaW50ZXJmYWNlIFBhY2thZ2VKc29uIHtcbiAgbWFpbj86IHN0cmluZ1xuICBtb2R1bGU/OiBzdHJpbmdcbiAgZXhwb3J0cz86IFJlY29yZDxzdHJpbmcsIEV4cG9ydFZhbHVlPlxufVxuXG5pbnRlcmZhY2UgTm9kZVJlc29sdXRpb25Db250ZXh0IHtcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZXh0ZW5zaW9uczogc3RyaW5nW11cbiAgYmFzZVBhdGg6IHN0cmluZ1xuICBtb2R1bGVQYXRoOiBzdHJpbmdcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChcbiAgbW9kdWxlUGF0aDogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgYmFzZVBhdGg6IHN0cmluZyxcbik6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgZnNNYXAsXG4gICAgZXh0ZW5zaW9uczogW1wiLmpzXCIsIFwiLmpzeFwiLCBcIi50c1wiLCBcIi50c3hcIiwgXCIuanNvblwiXSxcbiAgICBiYXNlUGF0aCxcbiAgICBtb2R1bGVQYXRoLFxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvbihub2RlTW9kdWxlc1BhdGg6IHN0cmluZywgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQpIHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS9wYWNrYWdlLmpzb25gXG4gIGlmICghY3R4LmZzTWFwW3BhY2thZ2VKc29uUGF0aF0pIHJldHVybiBudWxsXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY3R4LmZzTWFwW3BhY2thZ2VKc29uUGF0aF0pIGFzIFBhY2thZ2VKc29uXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKFxuICBwYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChjdHguZnNNYXBbcGF0aF0pIHJldHVybiBwYXRoXG5cbiAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCBwYXRoV2l0aEV4dCA9IHBhdGgucmVwbGFjZSgvXFwuanMkfFxcLmpzeCQvLCBcIlwiKSArIGV4dFxuICAgIGlmIChjdHguZnNNYXBbcGF0aFdpdGhFeHRdKSByZXR1cm4gcGF0aFdpdGhFeHRcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlRXhwb3J0UGF0aChcbiAgbm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsXG4gIGV4cG9ydFBhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZnVsbEV4cG9ydFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7ZXhwb3J0UGF0aC5yZXBsYWNlKC9eXFwuXFwvLywgXCJcIil9YFxuICByZXR1cm4gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxFeHBvcnRQYXRoLCBjdHgpXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb25kaXRpb25hbEV4cG9ydChleHBvcnRWYWx1ZTogRXhwb3J0VmFsdWUpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRWYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBleHBvcnRWYWx1ZVxuICB9XG5cbiAgLy8gSGFuZGxlIGNvbmRpdGlvbmFsIGV4cG9ydHMgLSB0cnkgY29tbW9uIGNvbmRpdGlvbnMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZVxuICBjb25zdCBjb25kaXRpb25zID0gW1wiaW1wb3J0XCIsIFwiZGVmYXVsdFwiLCBcInJlcXVpcmVcIiwgXCJub2RlXCIsIFwiYnJvd3NlclwiXVxuICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG4gICAgaWYgKGV4cG9ydFZhbHVlW2NvbmRpdGlvbl0pIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvblZhbHVlID0gZXhwb3J0VmFsdWVbY29uZGl0aW9uXVxuICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb25WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gY29uZGl0aW9uVmFsdWVcbiAgICAgIH1cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGhhbmRsZSBuZXN0ZWQgY29uZGl0aW9uc1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlQ29uZGl0aW9uYWxFeHBvcnQoY29uZGl0aW9uVmFsdWUpXG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlRXhwb3J0cyhcbiAgbm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgcmVtYWluaW5nUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXBhY2thZ2VKc29uLmV4cG9ydHMpIHJldHVybiBudWxsXG5cbiAgLy8gSGFuZGxlIGRlZmF1bHQgZXhwb3J0IGNvbmRpdGlvbiAod2hlbiBubyBzdWJwYXRoKVxuICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0c1tcIi5cIl1cbiAgaWYgKHJlbWFpbmluZ1BhdGggPT09IFwiXCIgJiYgZGVmYXVsdEV4cG9ydCkge1xuICAgIGNvbnN0IGV4cG9ydFBhdGggPSByZXNvbHZlQ29uZGl0aW9uYWxFeHBvcnQoZGVmYXVsdEV4cG9ydClcbiAgICBpZiAoZXhwb3J0UGF0aCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGV4cG9ydFBhdGgsIGN0eClcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHN1YnBhdGggZXhwb3J0c1xuICBjb25zdCBzdWJwYXRoRXhwb3J0ID0gcmVtYWluaW5nUGF0aFxuICAgID8gcGFja2FnZUpzb24uZXhwb3J0c1tgLi8ke3JlbWFpbmluZ1BhdGh9YF1cbiAgICA6IG51bGxcbiAgaWYgKHN1YnBhdGhFeHBvcnQpIHtcbiAgICBjb25zdCBleHBvcnRQYXRoID0gcmVzb2x2ZUNvbmRpdGlvbmFsRXhwb3J0KHN1YnBhdGhFeHBvcnQpXG4gICAgaWYgKGV4cG9ydFBhdGgpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBleHBvcnRQYXRoLCBjdHgpXG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSB0b3AtbGV2ZWwgY29uZGl0aW9uYWwgZXhwb3J0cyAobGVnYWN5IGZvcm1hdClcbiAgY29uc3QgaW1wb3J0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0cy5pbXBvcnRcbiAgaWYgKHJlbWFpbmluZ1BhdGggPT09IFwiXCIgJiYgaW1wb3J0RXhwb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBleHBvcnRQYXRoID0gcmVzb2x2ZUNvbmRpdGlvbmFsRXhwb3J0KGltcG9ydEV4cG9ydClcbiAgICBpZiAoZXhwb3J0UGF0aCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGV4cG9ydFBhdGgsIGN0eClcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VFbnRyeVBvaW50KFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBlbnRyeVBvaW50ID0gcGFja2FnZUpzb24ubW9kdWxlIHx8IHBhY2thZ2VKc29uLm1haW4gfHwgXCJpbmRleC5qc1wiXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke2VudHJ5UG9pbnR9YFxuICByZXR1cm4gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxQYXRoLCBjdHgpXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVSZW1haW5pbmdQYXRoKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcmVtYWluaW5nUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXJlbWFpbmluZ1BhdGgpIHtcbiAgICAvLyBUcnkgaW5kZXggZmlsZXMgaW4gdGhlIG1vZHVsZSByb290XG4gICAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vaW5kZXgke2V4dH1gXG4gICAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke3JlbWFpbmluZ1BhdGh9YFxuICBjb25zdCBkaXJlY3RNYXRjaCA9IHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhmdWxsUGF0aCwgY3R4KVxuICBpZiAoZGlyZWN0TWF0Y2gpIHJldHVybiBkaXJlY3RNYXRjaFxuXG4gIC8vIFRyeSBpbmRleCBmaWxlc1xuICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke2Z1bGxQYXRofS9pbmRleCR7ZXh0fWBcbiAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChcbiAgc2VhcmNoUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBtb2R1bGVQYXJ0cyA9IGN0eC5tb2R1bGVQYXRoLnNwbGl0KFwiL1wiKVxuICBjb25zdCBzY29wZSA9IG1vZHVsZVBhcnRzWzBdLnN0YXJ0c1dpdGgoXCJAXCIpXG4gICAgPyBtb2R1bGVQYXJ0cy5zbGljZSgwLCAyKS5qb2luKFwiL1wiKVxuICAgIDogbW9kdWxlUGFydHNbMF1cbiAgY29uc3QgcmVtYWluaW5nUGF0aCA9IG1vZHVsZVBhcnRzLnNsaWNlKHNjb3BlLmluY2x1ZGVzKFwiL1wiKSA/IDIgOiAxKS5qb2luKFwiL1wiKVxuICBjb25zdCBub2RlTW9kdWxlc1BhdGggPSBgJHtzZWFyY2hQYXRoID09PSBcIi5cIiA/IFwiXCIgOiBgJHtzZWFyY2hQYXRofS9gfW5vZGVfbW9kdWxlcy8ke3Njb3BlfWBcblxuICAvLyBUcnkgdG8gZmluZCBwYWNrYWdlLmpzb25cbiAgY29uc3QgcGFja2FnZUpzb24gPSBmaW5kUGFja2FnZUpzb24obm9kZU1vZHVsZXNQYXRoLCBjdHgpXG4gIGlmIChwYWNrYWdlSnNvbikge1xuICAgIC8vIFRyeSByZXNvbHZpbmcgdGhyb3VnaCBleHBvcnRzIGZpZWxkXG4gICAgY29uc3QgZXhwb3J0c1Jlc29sdXRpb24gPSByZXNvbHZlUGFja2FnZUV4cG9ydHMoXG4gICAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHJlbWFpbmluZ1BhdGgsXG4gICAgICBjdHgsXG4gICAgKVxuICAgIGlmIChleHBvcnRzUmVzb2x1dGlvbikgcmV0dXJuIGV4cG9ydHNSZXNvbHV0aW9uXG5cbiAgICAvLyBUcnkgcmVzb2x2aW5nIHRocm91Z2ggbWFpbi9tb2R1bGUgZmllbGRzXG4gICAgY29uc3QgZW50cnlQb2ludFJlc29sdXRpb24gPSByZXNvbHZlUGFja2FnZUVudHJ5UG9pbnQoXG4gICAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIGN0eCxcbiAgICApXG4gICAgaWYgKGVudHJ5UG9pbnRSZXNvbHV0aW9uKSByZXR1cm4gZW50cnlQb2ludFJlc29sdXRpb25cbiAgfVxuXG4gIC8vIFRyeSByZXNvbHZpbmcgcmVtYWluaW5nIHBhdGhcbiAgY29uc3QgcmVtYWluaW5nUGF0aFJlc29sdXRpb24gPSByZXNvbHZlUmVtYWluaW5nUGF0aChcbiAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgcmVtYWluaW5nUGF0aCxcbiAgICBjdHgsXG4gIClcbiAgaWYgKHJlbWFpbmluZ1BhdGhSZXNvbHV0aW9uKSByZXR1cm4gcmVtYWluaW5nUGF0aFJlc29sdXRpb25cblxuICAvLyBJZiBub3QgZm91bmQgYW5kIHdlIGhhdmUgYSBwYXJlbnQgZGlyZWN0b3J5LCB0cnkgdGhlcmVcbiAgY29uc3QgcGFyZW50UGF0aCA9IGRpcm5hbWUoc2VhcmNoUGF0aClcbiAgaWYgKHBhcmVudFBhdGggJiYgcGFyZW50UGF0aCAhPT0gc2VhcmNoUGF0aCkge1xuICAgIHJldHVybiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChwYXJlbnRQYXRoLCBjdHgpXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU5vZGVNb2R1bGUoXG4gIG1vZHVsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgY3R4ID0gY3JlYXRlQ29udGV4dChtb2R1bGVQYXRoLCBmc01hcCwgYmFzZVBhdGgpXG4gIHJldHVybiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChjdHguYmFzZVBhdGgsIGN0eClcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlRmlsZVBhdGggfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgcmVzb2x2ZU5vZGVNb2R1bGUgfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGVcIlxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbENvbXBpbGVkSnMoXG4gIGNvbXBpbGVkQ29kZTogc3RyaW5nLFxuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGN3ZD86IHN0cmluZyxcbikge1xuICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9yZXF1aXJlID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGxldCByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKG5hbWUsIHByZVN1cHBsaWVkSW1wb3J0cywgY3dkKVxuXG4gICAgaWYgKCFyZXNvbHZlZEZpbGVQYXRoICYmICFuYW1lLnN0YXJ0c1dpdGgoXCIuXCIpICYmICFuYW1lLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUobmFtZSwgcHJlU3VwcGxpZWRJbXBvcnRzLCBjd2QgfHwgXCJcIilcbiAgICB9XG5cbiAgICBjb25zdCBoYXNSZXNvbHZlZEZpbGVQYXRoID1cbiAgICAgIHJlc29sdmVkRmlsZVBhdGggJiYgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGhdXG5cbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSAmJiAhaGFzUmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbXBvcnQgXCIke25hbWV9XCIgbm90IGZvdW5kICR7Y3dkID8gYGluIFwiJHtjd2R9XCJgIDogXCJcIn1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZCA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbbmFtZV0gfHwgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGghXVxuICAgIHJldHVybiBuZXcgUHJveHkobW9kLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICghKHByb3AgaW4gdGFyZ2V0KSkge1xuICAgICAgICAgIGlmIChwcm9wID09PSBcImRlZmF1bHRcIikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5kZWZhdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuX19lc01vZHVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJvcCA9PT0gXCJfX2VzTW9kdWxlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbXBvbmVudCBcIiR7U3RyaW5nKHByb3ApfVwiIGlzIG5vdCBleHBvcnRlZCBieSBcIiR7bmFtZX1cImAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wIGFzIGtleW9mIHR5cGVvZiB0YXJnZXRdXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBmdW5jdGlvbkJvZHkgPSBgXG4gIHZhciBleHBvcnRzID0ge307XG4gIHZhciByZXF1aXJlID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9yZXF1aXJlO1xuICB2YXIgbW9kdWxlID0geyBleHBvcnRzIH07XG4gIHZhciBjaXJjdWl0ID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9jaXJjdWl0O1xuICAke2NvbXBpbGVkQ29kZX07XG4gIHJldHVybiBtb2R1bGU7YC50cmltKClcbiAgcmV0dXJuIEZ1bmN0aW9uKGZ1bmN0aW9uQm9keSkuY2FsbChnbG9iYWxUaGlzKVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJsaWIvdXRpbHMvZGlybmFtZVwiXG5pbXBvcnQgeyBnZXRJbXBvcnRzRnJvbUNvZGUgfSBmcm9tIFwibGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZVwiXG5pbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwiLi9pbXBvcnQtZXZhbC1wYXRoXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgaXNTdGF0aWNBc3NldFBhdGggfSBmcm9tIFwibGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9uc1wiXG5pbXBvcnQgeyB0cmFuc2Zvcm1XaXRoU3VjcmFzZSB9IGZyb20gXCJsaWIvdHJhbnNwaWxlL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2VcIlxuaW1wb3J0IHsgS2ljYWRUb0NpcmN1aXRKc29uQ29udmVydGVyIH0gZnJvbSBcImtpY2FkLXRvLWNpcmN1aXQtanNvblwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LWxvY2FsLWZpbGVcIilcblxuZXhwb3J0IGNvbnN0IGltcG9ydExvY2FsRmlsZSA9IGFzeW5jIChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikgPT4ge1xuICBkZWJ1ZyhcImltcG9ydExvY2FsRmlsZSBjYWxsZWQgd2l0aDpcIiwge1xuICAgIGltcG9ydE5hbWUsXG4gIH0pXG5cbiAgY29uc3QgeyBmc01hcCwgcHJlU3VwcGxpZWRJbXBvcnRzLCBpbXBvcnRTdGFjaywgY3VycmVudGx5SW1wb3J0aW5nIH0gPSBjdHhcblxuICBjb25zdCBmc1BhdGggPSByZXNvbHZlRmlsZVBhdGhPclRocm93KGltcG9ydE5hbWUsIGZzTWFwLCB1bmRlZmluZWQsIHtcbiAgICB0c0NvbmZpZzogY3R4LnRzQ29uZmlnLFxuICB9KVxuICBkZWJ1ZyhcImZzUGF0aDpcIiwgZnNQYXRoKVxuICBpZiAoY3VycmVudGx5SW1wb3J0aW5nLmhhcyhmc1BhdGgpKSB7XG4gICAgY29uc3QgY3ljbGVTdGFydEluZGV4ID0gaW1wb3J0U3RhY2suaW5kZXhPZihmc1BhdGgpXG4gICAgY29uc3QgY3ljbGVQYXRoID1cbiAgICAgIGN5Y2xlU3RhcnRJbmRleCA+PSAwXG4gICAgICAgID8gaW1wb3J0U3RhY2suc2xpY2UoY3ljbGVTdGFydEluZGV4KS5jb25jYXQoZnNQYXRoKVxuICAgICAgICA6IFsuLi5pbXBvcnRTdGFjaywgZnNQYXRoXVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkIHdoaWxlIGltcG9ydGluZyBcIiR7ZnNQYXRofVwiLiBUaGUgZm9sbG93aW5nIGltcG9ydCBjaGFpbiBmb3JtcyBhIGN5Y2xlOlxcblxcbiR7Y3ljbGVQYXRoLmpvaW4oXG4gICAgICAgIFwiIC0+IFwiLFxuICAgICAgKX1gLFxuICAgIClcbiAgfVxuXG4gIGlmICghY3R4LmZzTWFwW2ZzUGF0aF0pIHtcbiAgICBkZWJ1ZyhcImZzUGF0aCBub3QgZm91bmQgaW4gZnNNYXA6XCIsIGZzUGF0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgXCIke2ZzUGF0aH1cIiBub3QgZm91bmRgKVxuICB9XG4gIGNvbnN0IGZpbGVDb250ZW50ID0gZnNNYXBbZnNQYXRoXVxuICBkZWJ1ZyhcImZpbGVDb250ZW50OlwiLCBmaWxlQ29udGVudD8uc2xpY2UoMCwgMTAwKSlcbiAgY3VycmVudGx5SW1wb3J0aW5nLmFkZChmc1BhdGgpXG4gIGltcG9ydFN0YWNrLnB1c2goZnNQYXRoKVxuICB0cnkge1xuICAgIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKGZpbGVDb250ZW50KVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGRlZmF1bHQ6IGpzb25EYXRhLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLmtpY2FkX3BjYlwiKSkge1xuICAgICAgY29uc3QgY29udmVydGVyID0gbmV3IEtpY2FkVG9DaXJjdWl0SnNvbkNvbnZlcnRlcigpXG4gICAgICBjb252ZXJ0ZXIuYWRkRmlsZShmc1BhdGgsIGZpbGVDb250ZW50KVxuICAgICAgY29udmVydGVyLnJ1blVudGlsRmluaXNoZWQoKVxuICAgICAgY29uc3QgY2lyY3VpdEpzb24gPSBjb252ZXJ0ZXIuZ2V0T3V0cHV0KClcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0ge1xuICAgICAgICBfX2VzTW9kdWxlOiB0cnVlLFxuICAgICAgICBjaXJjdWl0SnNvbjogY2lyY3VpdEpzb24sXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1N0YXRpY0Fzc2V0UGF0aChmc1BhdGgpKSB7XG4gICAgICBsZXQgc3RhdGljVXJsOiBzdHJpbmdcblxuICAgICAgaWYgKGZpbGVDb250ZW50ID09PSBcIl9fU1RBVElDX0FTU0VUX19cIikge1xuICAgICAgICAvLyBQbGFjZWhvbGRlcjogdXNlIHByb2plY3RCYXNlVXJsIGZvciBzdGF0aWMgZmlsZSBpbXBvcnRzXG4gICAgICAgIGNvbnN0IHBsYXRmb3JtQ29uZmlnID0gY3R4LmNpcmN1aXQucGxhdGZvcm1cbiAgICAgICAgc3RhdGljVXJsID0gYCR7cGxhdGZvcm1Db25maWc/LnByb2plY3RCYXNlVXJsID8/IFwiXCJ9LyR7XG4gICAgICAgICAgZnNQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSA/IGZzUGF0aC5zbGljZSgyKSA6IGZzUGF0aFxuICAgICAgICB9YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWN0dWFsIGZpbGUgY29udGVudDogY3JlYXRlIGEgYmxvYiBVUkxcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtmaWxlQ29udGVudF0sIHtcbiAgICAgICAgICB0eXBlOiBmc1BhdGguZW5kc1dpdGgoXCIua2ljYWRfbW9kXCIpXG4gICAgICAgICAgICA/IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICA6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIsXG4gICAgICAgIH0pXG4gICAgICAgIHN0YXRpY1VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICAgIH1cblxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGRlZmF1bHQ6IHN0YXRpY1VybCxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi50c3hcIikgfHwgZnNQYXRoLmVuZHNXaXRoKFwiLnRzXCIpKSB7XG4gICAgICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShmaWxlQ29udGVudClcblxuICAgICAgZm9yIChjb25zdCBpbXBvcnROYW1lIG9mIGltcG9ydE5hbWVzKSB7XG4gICAgICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgICAgIGN3ZDogZGlybmFtZShmc1BhdGgpLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRDb2RlID0gdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoZmlsZUNvbnRlbnQsIGZzUGF0aClcbiAgICAgICAgZGVidWcoXCJldmFsQ29tcGlsZWRKcyBjYWxsZWQgd2l0aDpcIiwge1xuICAgICAgICAgIGNvZGU6IHRyYW5zZm9ybWVkQ29kZS5zbGljZSgwLCAxMDApLFxuICAgICAgICAgIGRpcm5hbWU6IGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgaW1wb3J0UnVuUmVzdWx0ID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICAgICAgdHJhbnNmb3JtZWRDb2RlLFxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgICAgICBkaXJuYW1lKGZzUGF0aCksXG4gICAgICAgIClcbiAgICAgICAgZGVidWcoXCJpbXBvcnRSdW5SZXN1bHQ6XCIsIHtcbiAgICAgICAgICBmc1BhdGgsXG4gICAgICAgICAgaW1wb3J0UnVuUmVzdWx0LFxuICAgICAgICB9KVxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IGltcG9ydFJ1blJlc3VsdC5leHBvcnRzXG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXZhbCBjb21waWxlZCBqcyBlcnJvciBmb3IgXCIke2ltcG9ydE5hbWV9XCI6ICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNcIikgfHwgZnNQYXRoLmVuZHNXaXRoKFwiLm1qc1wiKSkge1xuICAgICAgLy8gRm9yIC5qcy8ubWpzIGZpbGVzLCBlc3BlY2lhbGx5IGZyb20gbm9kZV9tb2R1bGVzLCB3ZSBuZWVkIHRvIGV4dHJhY3QgYW5kIHJlc29sdmUgaW1wb3J0cyBmaXJzdFxuICAgICAgY29uc3QgaW1wb3J0TmFtZXMgPSBnZXRJbXBvcnRzRnJvbUNvZGUoZmlsZUNvbnRlbnQpXG5cbiAgICAgIGZvciAoY29uc3QgaW1wb3J0TmFtZSBvZiBpbXBvcnROYW1lcykge1xuICAgICAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgICAgICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKGltcG9ydE5hbWUsIGN0eCwgZGVwdGggKyAxLCB7XG4gICAgICAgICAgICBjd2Q6IGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZW4gdHJhbnNmb3JtIGFuZCBldmFsdWF0ZVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgICAgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoZmlsZUNvbnRlbnQsIGZzUGF0aCksXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgICAgZGlybmFtZShmc1BhdGgpLFxuICAgICAgKS5leHBvcnRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVuc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9uIFwiJHtmc1BhdGguc3BsaXQoXCIuXCIpLnBvcCgpfVwiIGZvciBcIiR7ZnNQYXRofVwiYCxcbiAgICAgIClcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgaW1wb3J0U3RhY2sucG9wKClcbiAgICBjdXJyZW50bHlJbXBvcnRpbmcuZGVsZXRlKGZzUGF0aClcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBTVEFUSUNfQVNTRVRfRVhURU5TSU9OUyA9IFtcbiAgXCIuZ2xiXCIsXG4gIFwiLmtpY2FkX21vZFwiLFxuICBcIi5nbHRmXCIsXG4gIFwiLm9ialwiLFxuICBcIi5zdGxcIixcbl1cblxuZXhwb3J0IGNvbnN0IGlzU3RhdGljQXNzZXRQYXRoID0gKHBhdGg6IHN0cmluZykgPT5cbiAgU1RBVElDX0FTU0VUX0VYVEVOU0lPTlMuc29tZSgoZXh0KSA9PiBwYXRoLmVuZHNXaXRoKGV4dCkpXG4iLCAiaW1wb3J0IHsgdHJhbnNmb3JtLCB0eXBlIFRyYW5zZm9ybSBhcyBTdWNyYXNlVHJhbnNmb3JtIH0gZnJvbSBcInN1Y3Jhc2VcIlxuXG5jb25zdCBUU19FWFRFTlNJT05TID0gbmV3IFNldChbXCIudHNcIiwgXCIudHN4XCIsIFwiLm10c1wiLCBcIi5jdHNcIl0pXG5jb25zdCBKU1hfRVhURU5TSU9OUyA9IG5ldyBTZXQoW1wiLnRzeFwiLCBcIi5qc3hcIiwgXCIudHNcIl0pXG5jb25zdCBUWVBFX1NUQVJfRVhQT1JUX1JFR0VYID1cbiAgL15cXHMqZXhwb3J0XFxzK3R5cGVcXHMrXFwqXFxzKyg/OmFzXFxzK1tcXHckXStcXHMrKT9mcm9tXFxzK1snXCJdW14nXCJdK1snXCJdXFxzKjs/XFxzKiQvZ2ltXG5cbmNvbnN0IHN0cmlwVHlwZVN0YXJFeHBvcnRzID0gKGNvZGU6IHN0cmluZykgPT5cbiAgY29kZS5yZXBsYWNlKFRZUEVfU1RBUl9FWFBPUlRfUkVHRVgsIFwiXCIpXG5cbmNvbnN0IHN0cmlwUXVlcnlBbmRIYXNoID0gKGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcXVlcnlJbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoXCI/XCIpXG4gIGNvbnN0IGhhc2hJbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoXCIjXCIpXG5cbiAgbGV0IGVuZEluZGV4ID0gZmlsZVBhdGgubGVuZ3RoXG5cbiAgaWYgKHF1ZXJ5SW5kZXggIT09IC0xICYmIGhhc2hJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IE1hdGgubWluKHF1ZXJ5SW5kZXgsIGhhc2hJbmRleClcbiAgfSBlbHNlIGlmIChxdWVyeUluZGV4ICE9PSAtMSkge1xuICAgIGVuZEluZGV4ID0gcXVlcnlJbmRleFxuICB9IGVsc2UgaWYgKGhhc2hJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IGhhc2hJbmRleFxuICB9XG5cbiAgcmV0dXJuIGZpbGVQYXRoLnNsaWNlKDAsIGVuZEluZGV4KVxufVxuXG5jb25zdCBnZXRFeHRlbnNpb24gPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHN0cmlwUXVlcnlBbmRIYXNoKGZpbGVQYXRoKVxuICBjb25zdCBsYXN0RG90SW5kZXggPSBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIi5cIilcblxuICBpZiAobGFzdERvdEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IE1hdGgubWF4KFxuICAgIG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSxcbiAgICBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIlxcXFxcIiksXG4gIClcblxuICBpZiAobGFzdFNsYXNoSW5kZXggPiBsYXN0RG90SW5kZXgpIHtcbiAgICByZXR1cm4gXCJcIlxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnNsaWNlKGxhc3REb3RJbmRleCkudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBnZXRUcmFuc2Zvcm1zRm9yRmlsZVBhdGggPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oZmlsZVBhdGgpXG5cbiAgY29uc3QgdHJhbnNmb3JtczogU3VjcmFzZVRyYW5zZm9ybVtdID0gW1wiaW1wb3J0c1wiXVxuXG4gIGlmIChUU19FWFRFTlNJT05TLmhhcyhleHRlbnNpb24pKSB7XG4gICAgdHJhbnNmb3Jtcy51bnNoaWZ0KFwidHlwZXNjcmlwdFwiKVxuICB9XG5cbiAgaWYgKEpTWF9FWFRFTlNJT05TLmhhcyhleHRlbnNpb24pKSB7XG4gICAgdHJhbnNmb3Jtcy5wdXNoKFwianN4XCIpXG4gIH1cblxuICByZXR1cm4gdHJhbnNmb3Jtc1xufVxuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UgPSAoY29kZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHRyYW5zZm9ybXMgPSBnZXRUcmFuc2Zvcm1zRm9yRmlsZVBhdGgoZmlsZVBhdGgpXG4gIGNvbnN0IHNhbml0aXplZENvZGUgPSBzdHJpcFR5cGVTdGFyRXhwb3J0cyhjb2RlKVxuICBjb25zdCB7IGNvZGU6IHRyYW5zZm9ybWVkQ29kZSB9ID0gdHJhbnNmb3JtKHNhbml0aXplZENvZGUsIHtcbiAgICBmaWxlUGF0aCxcbiAgICBwcm9kdWN0aW9uOiB0cnVlLFxuICAgIHRyYW5zZm9ybXMsXG4gIH0pXG5cbiAgcmV0dXJuIHRyYW5zZm9ybWVkQ29kZVxufVxuIiwgImltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRTbmlwcGV0KFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSB7XG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcbiAgY29uc3QgZnVsbFNuaXBwZXROYW1lID0gaW1wb3J0TmFtZS5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpLnJlcGxhY2UoXCIuXCIsIFwiL1wiKVxuXG4gIGNvbnN0IHsgY2pzLCBlcnJvciB9ID0gYXdhaXQgZ2xvYmFsVGhpc1xuICAgIC5mZXRjaChgJHtjdHguY2pzUmVnaXN0cnlVcmx9LyR7ZnVsbFNuaXBwZXROYW1lfWApXG4gICAgLnRoZW4oYXN5bmMgKHJlcykgPT4gKHsgY2pzOiBhd2FpdCByZXMudGV4dCgpLCBlcnJvcjogbnVsbCB9KSlcbiAgICAuY2F0Y2goKGUpID0+ICh7IGVycm9yOiBlLCBjanM6IG51bGwgfSkpXG5cbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIGltcG9ydFwiLCBpbXBvcnROYW1lLCBlcnJvcilcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICBjanMhLFxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICkuZXhwb3J0c1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGltcG9ydGluZyBzbmlwcGV0XCIsIGUpXG4gIH1cbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlTm9kZU1vZHVsZSB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBpbXBvcnRMb2NhbEZpbGUgfSBmcm9tIFwiLi9pbXBvcnQtbG9jYWwtZmlsZVwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IGlzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvbiB9IGZyb20gXCIuL2lzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvblwiXG5pbXBvcnQgeyBnZXROb2RlTW9kdWxlRGlyZWN0b3J5IH0gZnJvbSBcIi4vZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeVwiXG5pbXBvcnQgeyBnZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQgfSBmcm9tIFwiLi9nZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnRcIlxuaW1wb3J0IHsgaXNUeXBlU2NyaXB0RW50cnlwb2ludCB9IGZyb20gXCIuL2lzVHlwZVNjcmlwdEVudHJ5cG9pbnRcIlxuaW1wb3J0IHsgaXNEaXN0RGlyRW1wdHkgfSBmcm9tIFwiLi9pc0Rpc3REaXJFbXB0eVwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LW5vZGUtbW9kdWxlXCIpXG5cbmV4cG9ydCBjb25zdCBpbXBvcnROb2RlTW9kdWxlID0gYXN5bmMgKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSA9PiB7XG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzLCBmc01hcCB9ID0gY3R4XG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gT25seSBydW4gdmFsaWRhdGlvbiBpZiBwYWNrYWdlLmpzb24gZXhpc3RzIChjYW4ndCB2YWxpZGF0ZSB3aXRob3V0IGl0KVxuICBjb25zdCBoYXNQYWNrYWdlSnNvbiA9ICEhZnNNYXBbXCJwYWNrYWdlLmpzb25cIl1cblxuICBpZiAoaGFzUGFja2FnZUpzb24pIHtcbiAgICAvLyBTdGVwIDE6IENoZWNrIGlmIHRoZSBwYWNrYWdlIGlzIGRlY2xhcmVkIGluIHBhY2thZ2UuanNvblxuICAgIGlmICghaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uKGltcG9ydE5hbWUsIGZzTWFwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm9kZSBtb2R1bGUgaW1wb3J0ZWQgYnV0IG5vdCBpbiBwYWNrYWdlLmpzb24gXCIke2ltcG9ydE5hbWV9XCJcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCA9IHJlc29sdmVOb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eC5mc01hcCwgXCJcIilcblxuICAvLyBPbmx5IHJ1biBTdGVwcyAyLTQgaWYgcGFja2FnZSBleGlzdHMgaW4gbm9kZV9tb2R1bGVzIChhZnRlciByZXNvbHZlciBhdHRlbXB0cylcbiAgaWYgKGhhc1BhY2thZ2VKc29uICYmIHJlc29sdmVkTm9kZU1vZHVsZVBhdGgpIHtcbiAgICAvLyBTdGVwIDI6IENoZWNrIGlmIG5vZGVfbW9kdWxlcyBkaXJlY3RvcnkgZXhpc3RzIGZvciB0aGUgcGFja2FnZVxuICAgIGNvbnN0IG5vZGVNb2R1bGVEaXIgPSBnZXROb2RlTW9kdWxlRGlyZWN0b3J5KGltcG9ydE5hbWUsIGZzTWFwKVxuICAgIGlmICghbm9kZU1vZHVsZURpcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgaGFzIG5vIGZpbGVzIGluIHRoZSBub2RlX21vZHVsZXMgZGlyZWN0b3J5XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFN0ZXAgMzogQ2hlY2sgaWYgbWFpbiBlbnRyeXBvaW50IGlzIGEgVHlwZVNjcmlwdCBmaWxlXG4gICAgY29uc3QgZW50cnlwb2ludCA9IGdldFBhY2thZ2VKc29uRW50cnlwb2ludChpbXBvcnROYW1lLCBmc01hcClcbiAgICBpZiAoaXNUeXBlU2NyaXB0RW50cnlwb2ludChlbnRyeXBvaW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgaGFzIGEgdHlwZXNjcmlwdCBlbnRyeXBvaW50IHRoYXQgaXMgdW5zdXBwb3J0ZWRcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gU3RlcCA0OiBDaGVjayBpZiBkaXN0IGRpcmVjdG9yeSBpcyBlbXB0eSB3aGVuIG1haW4gcG9pbnRzIHRvIGRpc3RcbiAgICBpZiAoZW50cnlwb2ludCAmJiBlbnRyeXBvaW50LnN0YXJ0c1dpdGgoXCJkaXN0L1wiKSkge1xuICAgICAgaWYgKGlzRGlzdERpckVtcHR5KGltcG9ydE5hbWUsIGZzTWFwKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIGhhcyBubyBmaWxlcyBpbiBkaXN0LCBkaWQgeW91IGZvcmdldCB0byB0cmFuc3BpbGU/XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFyZXNvbHZlZE5vZGVNb2R1bGVQYXRoKSB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBjdHguY2lyY3VpdD8ucGxhdGZvcm1cbiAgICBpZiAocGxhdGZvcm0/Lm5vZGVNb2R1bGVzUmVzb2x2ZXIpIHtcbiAgICAgIGRlYnVnKGBBdHRlbXB0aW5nIHRvIHJlc29sdmUgXCIke2ltcG9ydE5hbWV9XCIgdXNpbmcgbm9kZU1vZHVsZXNSZXNvbHZlcmApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgcGxhdGZvcm0ubm9kZU1vZHVsZXNSZXNvbHZlcihpbXBvcnROYW1lKVxuXG4gICAgICAgIGlmIChmaWxlQ29udGVudCkge1xuICAgICAgICAgIGRlYnVnKGBTdWNjZXNzZnVsbHkgcmVzb2x2ZWQgXCIke2ltcG9ydE5hbWV9XCIgdmlhIG5vZGVNb2R1bGVzUmVzb2x2ZXJgKVxuXG4gICAgICAgICAgLy8gQWRkIHRoZSByZXNvbHZlZCBjb250ZW50IHRvIGZzTWFwIHdpdGggYSBzeW50aGV0aWMgcGF0aFxuICAgICAgICAgIC8vIEFkZCAudHMgZXh0ZW5zaW9uIHRvIGVuc3VyZSBpdCdzIHRyZWF0ZWQgYXMgYSBtb2R1bGUgZmlsZVxuICAgICAgICAgIGNvbnN0IHN5bnRoZXRpY1BhdGggPSBgbm9kZV9tb2R1bGVzLyR7aW1wb3J0TmFtZX0udHNgXG4gICAgICAgICAgY3R4LmZzTWFwW3N5bnRoZXRpY1BhdGhdID0gZmlsZUNvbnRlbnRcblxuICAgICAgICAgIC8vIEltcG9ydCB0aGUgZmlsZSB1c2luZyB0aGUgbm9ybWFsIGZsb3dcbiAgICAgICAgICBhd2FpdCBpbXBvcnRMb2NhbEZpbGUoc3ludGhldGljUGF0aCwgY3R4LCBkZXB0aClcblxuICAgICAgICAgIC8vIE1hcCB0aGUgaW1wb3J0IG5hbWUgdG8gdGhlIHJlc29sdmVkIG1vZHVsZVxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHByZVN1cHBsaWVkSW1wb3J0c1tzeW50aGV0aWNQYXRoXVxuXG4gICAgICAgICAgLy8gQWxzbyBtYXAgd2l0aG91dCBub2RlX21vZHVsZXMgcHJlZml4XG4gICAgICAgICAgY29uc3QgdW5wcmVmaXhlZFBhdGggPSBzeW50aGV0aWNQYXRoLnJlcGxhY2UoL15ub2RlX21vZHVsZXNcXC8vLCBcIlwiKVxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1t1bnByZWZpeGVkUGF0aF0gPSBwcmVTdXBwbGllZEltcG9ydHNbc3ludGhldGljUGF0aF1cblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZGVidWcoYG5vZGVNb2R1bGVzUmVzb2x2ZXIgcmV0dXJuZWQgbnVsbCBmb3IgXCIke2ltcG9ydE5hbWV9XCJgKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZGVidWcoYG5vZGVNb2R1bGVzUmVzb2x2ZXIgZmFpbGVkIGZvciBcIiR7aW1wb3J0TmFtZX1cIjpgLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIG5vdCBmb3VuZGApXG4gIH1cblxuICAvLyBVc2UgaW1wb3J0TG9jYWxGaWxlIHRvIGhhbmRsZSB0aGUgbm9kZSBtb2R1bGVcbiAgYXdhaXQgaW1wb3J0TG9jYWxGaWxlKHJlc29sdmVkTm9kZU1vZHVsZVBhdGgsIGN0eCwgZGVwdGgpXG5cbiAgLy8gTWFwIHRoZSBvcmlnaW5hbCBpbXBvcnQgbmFtZSB0byB0aGUgcmVzb2x2ZWQgbW9kdWxlJ3MgZXhwb3J0c1xuICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAvLyBNYXAgd2l0aG91dCBub2RlX21vZHVsZXMgcHJlZml4IGZvciBkaXJlY3QgaW1wb3J0c1xuICBjb25zdCB1bnByZWZpeGVkUGF0aCA9IHJlc29sdmVkTm9kZU1vZHVsZVBhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gIHByZVN1cHBsaWVkSW1wb3J0c1t1bnByZWZpeGVkUGF0aF0gPVxuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuXG4gIC8vIEhhbmRsZSBpbmRleCBmaWxlcyBzcGVjaWFsbHlcbiAgaWYgKFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXgudHN4XCIpIHx8XG4gICAgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5lbmRzV2l0aChcIi9pbmRleC50c1wiKSB8fFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXguanNcIilcbiAgKSB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHJlc29sdmVkTm9kZU1vZHVsZVBhdGgucmVwbGFjZSgvXFwvaW5kZXhcXC4odHN4P3xqcykkLywgXCJcIilcbiAgICBjb25zdCB1bnByZWZpeGVkRGlyUGF0aCA9IGRpclBhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW3VucHJlZml4ZWREaXJQYXRoXSA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAgIC8vIEhhbmRsZSBzY29wZWQgcGFja2FnZXNcbiAgICBpZiAodW5wcmVmaXhlZERpclBhdGguc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAgIGNvbnN0IHNjb3BlUGFydHMgPSB1bnByZWZpeGVkRGlyUGF0aC5zcGxpdChcIi9cIilcbiAgICAgIGlmIChzY29wZVBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlZE5hbWUgPSBgJHtzY29wZVBhcnRzWzBdfS8ke3Njb3BlUGFydHNbMV19YFxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbc2NvcGVkTmFtZV0gPVxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogRXh0cmFjdCB0aGUgYmFzZSBwYWNrYWdlIG5hbWUgZnJvbSBhbiBpbXBvcnQgbmFtZVxuICogSGFuZGxlcyBzY29wZWQgcGFja2FnZXMgYW5kIHN1YnBhdGhzXG4gKlxuICogRXhhbXBsZXM6XG4gKiAtIFwiQHNjb3BlL3BhY2thZ2Uvc3VicGF0aFwiIC0+IFwiQHNjb3BlL3BhY2thZ2VcIlxuICogLSBcImxvZGFzaC9nZXRcIiAtPiBcImxvZGFzaFwiXG4gKiAtIFwicmVhY3RcIiAtPiBcInJlYWN0XCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RCYXNlUGFja2FnZU5hbWUoaW1wb3J0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGJhc2VQYWNrYWdlTmFtZSA9IGltcG9ydE5hbWVcbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAvLyBTY29wZWQgcGFja2FnZTogQHNjb3BlL3BhY2thZ2Ugb3IgQHNjb3BlL3BhY2thZ2Uvc3VicGF0aFxuICAgIGNvbnN0IHBhcnRzID0gaW1wb3J0TmFtZS5zcGxpdChcIi9cIilcbiAgICBiYXNlUGFja2FnZU5hbWUgPSBwYXJ0cy5sZW5ndGggPj0gMiA/IGAke3BhcnRzWzBdfS8ke3BhcnRzWzFdfWAgOiBpbXBvcnROYW1lXG4gIH0gZWxzZSB7XG4gICAgLy8gUmVndWxhciBwYWNrYWdlOiBwYWNrYWdlIG9yIHBhY2thZ2Uvc3VicGF0aFxuICAgIGJhc2VQYWNrYWdlTmFtZSA9IGltcG9ydE5hbWUuc3BsaXQoXCIvXCIpWzBdXG4gIH1cbiAgcmV0dXJuIGJhc2VQYWNrYWdlTmFtZVxufVxuIiwgImltcG9ydCB7IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9leHRyYWN0QmFzZVBhY2thZ2VOYW1lXCJcblxuLyoqXG4gKiBDaGVjayBpZiBhIHBhY2thZ2UgaXMgZGVjbGFyZWQgaW4gcGFja2FnZS5qc29uIChkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgb3IgcGVlckRlcGVuZGVuY2llcylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvbihcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgcGFja2FnZUpzb25Db250ZW50ID0gZnNNYXBbXCJwYWNrYWdlLmpzb25cIl1cbiAgaWYgKCFwYWNrYWdlSnNvbkNvbnRlbnQpIHtcbiAgICAvLyBObyBwYWNrYWdlLmpzb24gbWVhbnMgd2UgY2FuJ3QgdmFsaWRhdGUgLSBhbGxvdyB0aGUgaW1wb3J0XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uQ29udGVudClcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge31cbiAgICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge31cbiAgICBjb25zdCBwZWVyRGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyB8fCB7fVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgYmFzZSBwYWNrYWdlIG5hbWUgKGhhbmRsZSBzY29wZWQgcGFja2FnZXMgYW5kIHN1YnBhdGhzKVxuICAgIGNvbnN0IGJhc2VQYWNrYWdlTmFtZSA9IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpXG5cbiAgICByZXR1cm4gKFxuICAgICAgYmFzZVBhY2thZ2VOYW1lIGluIGRlcGVuZGVuY2llcyB8fFxuICAgICAgYmFzZVBhY2thZ2VOYW1lIGluIGRldkRlcGVuZGVuY2llcyB8fFxuICAgICAgYmFzZVBhY2thZ2VOYW1lIGluIHBlZXJEZXBlbmRlbmNpZXNcbiAgICApXG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIHdlIGNhbid0IHBhcnNlIHBhY2thZ2UuanNvbiwgYWxsb3cgdGhlIGltcG9ydFxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBleHRyYWN0QmFzZVBhY2thZ2VOYW1lIH0gZnJvbSBcIi4vZXh0cmFjdEJhc2VQYWNrYWdlTmFtZVwiXG5cbi8qKlxuICogQ2hlY2sgaWYgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBleGlzdHMgZm9yIHRoZSBwYWNrYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROb2RlTW9kdWxlRGlyZWN0b3J5KFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBiYXNlUGFja2FnZU5hbWUgPSBleHRyYWN0QmFzZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKVxuICBjb25zdCBub2RlTW9kdWxlUGF0aCA9IGBub2RlX21vZHVsZXMvJHtiYXNlUGFja2FnZU5hbWV9YFxuXG4gIC8vIENoZWNrIGlmIGFueSBmaWxlcyBleGlzdCB1bmRlciB0aGlzIHBhdGggaW4gZnNNYXBcbiAgY29uc3QgaGFzRmlsZXMgPSBPYmplY3Qua2V5cyhmc01hcCkuc29tZShcbiAgICAocGF0aCkgPT4gcGF0aC5zdGFydHNXaXRoKG5vZGVNb2R1bGVQYXRoICsgXCIvXCIpIHx8IHBhdGggPT09IG5vZGVNb2R1bGVQYXRoLFxuICApXG5cbiAgcmV0dXJuIGhhc0ZpbGVzID8gbm9kZU1vZHVsZVBhdGggOiBudWxsXG59XG4iLCAiaW1wb3J0IHsgZXh0cmFjdEJhc2VQYWNrYWdlTmFtZSB9IGZyb20gXCIuL2V4dHJhY3RCYXNlUGFja2FnZU5hbWVcIlxuXG4vKipcbiAqIEdldCB0aGUgZW50cnlwb2ludCBmcm9tIHBhY2thZ2UuanNvbiAodGhlIFwibWFpblwiIG9yIFwibW9kdWxlXCIgZmllbGQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQoXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGJhc2VQYWNrYWdlTmFtZSA9IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGBub2RlX21vZHVsZXMvJHtiYXNlUGFja2FnZU5hbWV9L3BhY2thZ2UuanNvbmBcblxuICBjb25zdCBwYWNrYWdlSnNvbkNvbnRlbnQgPSBmc01hcFtwYWNrYWdlSnNvblBhdGhdXG4gIGlmICghcGFja2FnZUpzb25Db250ZW50KSByZXR1cm4gbnVsbFxuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uQ29udGVudClcbiAgICAvLyBUcnkgbWFpbiwgbW9kdWxlLCBvciBleHBvcnRzIGZpZWxkIChpbiBvcmRlciBvZiBwcmVmZXJlbmNlKVxuICAgIHJldHVybiBwYWNrYWdlSnNvbi5tYWluIHx8IHBhY2thZ2VKc29uLm1vZHVsZSB8fCBudWxsXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbiIsICIvKipcbiAqIENoZWNrIGlmIHRoZSBlbnRyeXBvaW50IGlzIGEgVHlwZVNjcmlwdCBmaWxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1R5cGVTY3JpcHRFbnRyeXBvaW50KGVudHJ5cG9pbnQ6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcbiAgaWYgKCFlbnRyeXBvaW50KSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGVudHJ5cG9pbnQuZW5kc1dpdGgoXCIudHNcIikgfHwgZW50cnlwb2ludC5lbmRzV2l0aChcIi50c3hcIilcbn1cbiIsICJpbXBvcnQgeyBleHRyYWN0QmFzZVBhY2thZ2VOYW1lIH0gZnJvbSBcIi4vZXh0cmFjdEJhc2VQYWNrYWdlTmFtZVwiXG5cbi8qKlxuICogQ2hlY2sgaWYgZGlzdCBkaXJlY3RvcnkgZXhpc3RzIGFuZCBoYXMgZmlsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGlzdERpckVtcHR5KFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlUGFja2FnZU5hbWUgPSBleHRyYWN0QmFzZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKVxuICBjb25zdCBkaXN0UGF0aCA9IGBub2RlX21vZHVsZXMvJHtiYXNlUGFja2FnZU5hbWV9L2Rpc3RgXG5cbiAgLy8gQ2hlY2sgaWYgYW55IGZpbGVzIGV4aXN0IHVuZGVyIGRpc3QvXG4gIGNvbnN0IGhhc0ZpbGVzID0gT2JqZWN0LmtleXMoZnNNYXApLnNvbWUoKHBhdGgpID0+XG4gICAgcGF0aC5zdGFydHNXaXRoKGRpc3RQYXRoICsgXCIvXCIpLFxuICApXG5cbiAgcmV0dXJuICFoYXNGaWxlc1xufVxuIiwgImltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcImxpYi91dGlscy9kaXJuYW1lXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgZ2V0SW1wb3J0c0Zyb21Db2RlIH0gZnJvbSBcImxpYi91dGlscy9nZXQtaW1wb3J0cy1mcm9tLWNvZGVcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwiLi9pbXBvcnQtZXZhbC1wYXRoXCJcbmltcG9ydCB7IHRyYW5zZm9ybVdpdGhTdWNyYXNlIH0gZnJvbSBcImxpYi90cmFuc3BpbGUvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZVwiXG5pbXBvcnQgeyBpc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24gfSBmcm9tIFwiLi9pc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb25cIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmltcG9ydC1ucG0tcGFja2FnZVwiKVxuXG5mdW5jdGlvbiBleHRyYWN0UGFja2FnZVBhdGhGcm9tSlNEZWxpdnIodXJsOiBzdHJpbmcpIHtcbiAgY29uc3QgcHJlZml4ID0gXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL1wiXG4gIGlmICh1cmwuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgcmV0dXJuIHVybC5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkucmVwbGFjZSgvXFwvXFwrZXNtJC8sIFwiXCIpXG4gIH1cbiAgcmV0dXJuIHVybFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0TnBtUGFja2FnZShcbiAge1xuICAgIGltcG9ydE5hbWUsXG4gICAgZGVwdGggPSAwLFxuICAgIGZyb21Kc0RlbGl2ciA9IGZhbHNlLFxuICB9OiB7IGltcG9ydE5hbWU6IHN0cmluZzsgZGVwdGg/OiBudW1iZXI7IGZyb21Kc0RlbGl2cj86IGJvb2xlYW4gfSxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuKSB7XG4gIGRlYnVnKGBpbXBvcnRpbmcgbnBtIHBhY2thZ2U6ICR7aW1wb3J0TmFtZX1gKVxuICBjb25zdCB7IHByZVN1cHBsaWVkSW1wb3J0cywgZnNNYXAgfSA9IGN0eFxuXG4gIGlmIChwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHJldHVyblxuXG4gIC8vIENoZWNrIGlmIHRoZSBwYWNrYWdlIGlzIGRlY2xhcmVkIGluIHBhY2thZ2UuanNvbiBiZWZvcmUgZmV0Y2hpbmcgZnJvbSBqc0RlbGl2clxuICAvLyBTa2lwIHRoaXMgY2hlY2sgZm9yIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIChzdWItaW1wb3J0cyBmcm9tIGpzRGVsaXZyIHBhY2thZ2VzKVxuICBpZiAoIWZyb21Kc0RlbGl2ciAmJiAhaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uKGltcG9ydE5hbWUsIGZzTWFwKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBQYWNrYWdlIFwiJHtpbXBvcnROYW1lfVwiIGlzIG5vdCBkZWNsYXJlZCBpbiBwYWNrYWdlLmpzb24uIGAgK1xuICAgICAgICBgQWRkIGl0IHRvIGRlcGVuZGVuY2llcyBvciBkZXZEZXBlbmRlbmNpZXMgYmVmb3JlIGltcG9ydGluZy5cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgbnBtQ2RuVXJsID0gYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vJHtpbXBvcnROYW1lfS8rZXNtYFxuXG4gIGxldCBmaW5hbFVybDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIGNvbnN0IHsgY29udGVudCwgZXJyb3IgfSA9IGF3YWl0IGdsb2JhbFRoaXNcbiAgICAuZmV0Y2gobnBtQ2RuVXJsKVxuICAgIC50aGVuKGFzeW5jIChyZXMpID0+IHtcbiAgICAgIGZpbmFsVXJsID0gcmVzLnVybFxuICAgICAgaWYgKCFyZXMub2spXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZldGNoIFwiJHtpbXBvcnROYW1lfVwiIGZyb20ganNkZWxpdnI6ICR7cmVzLnN0YXR1c1RleHR9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgICApXG4gICAgICByZXR1cm4geyBjb250ZW50OiBhd2FpdCByZXMudGV4dCgpLCBlcnJvcjogbnVsbCB9XG4gICAgfSlcbiAgICAuY2F0Y2goKGUpID0+ICh7IGVycm9yOiBlLCBjb250ZW50OiBudWxsIH0pKVxuXG4gIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBucG0gaW1wb3J0XCIsIGltcG9ydE5hbWUsIGVycm9yKVxuICAgIHRocm93IGVycm9yXG4gIH1cblxuICBjb25zdCBmaW5hbEltcG9ydE5hbWUgPSBleHRyYWN0UGFja2FnZVBhdGhGcm9tSlNEZWxpdnIoZmluYWxVcmwhKVxuICBjb25zdCBjd2QgPSBkaXJuYW1lKGZpbmFsSW1wb3J0TmFtZSlcblxuICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShjb250ZW50ISlcbiAgZm9yIChjb25zdCBzdWJJbXBvcnROYW1lIG9mIGltcG9ydE5hbWVzKSB7XG4gICAgaWYgKCFwcmVTdXBwbGllZEltcG9ydHNbc3ViSW1wb3J0TmFtZV0pIHtcbiAgICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKHN1YkltcG9ydE5hbWUsIGN0eCwgZGVwdGggKyAxLCB7XG4gICAgICAgIGN3ZCxcbiAgICAgICAgZnJvbUpzRGVsaXZyOiB0cnVlLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBjb25zdCB0cmFuc2Zvcm1lZENvZGUgPSB0cmFuc2Zvcm1XaXRoU3VjcmFzZShcbiAgICBjb250ZW50ISxcbiAgICBmaW5hbEltcG9ydE5hbWUgfHwgaW1wb3J0TmFtZSxcbiAgKVxuICB0cnkge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgIHRyYW5zZm9ybWVkQ29kZSxcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgIGN3ZCxcbiAgICApLmV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBleHBvcnRzXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZpbmFsSW1wb3J0TmFtZV0gPSBleHBvcnRzXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZpbmFsVXJsIV0gPSBleHBvcnRzXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBFdmFsIG5wbSBwYWNrYWdlIGVycm9yIGZvciBcIiR7aW1wb3J0TmFtZX1cIjogJHtlLm1lc3NhZ2V9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgIClcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGltcG9ydExvY2FsRmlsZSB9IGZyb20gXCIuL2ltcG9ydC1sb2NhbC1maWxlXCJcbmltcG9ydCB7IGltcG9ydFNuaXBwZXQgfSBmcm9tIFwiLi9pbXBvcnQtc25pcHBldFwiXG5pbXBvcnQgeyByZXNvbHZlRmlsZVBhdGggfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgcmVzb2x2ZU5vZGVNb2R1bGUgfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGVcIlxuaW1wb3J0IHsgaW1wb3J0Tm9kZU1vZHVsZSB9IGZyb20gXCIuL2ltcG9ydC1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgeyBpbXBvcnROcG1QYWNrYWdlIH0gZnJvbSBcIi4vaW1wb3J0LW5wbS1wYWNrYWdlXCJcbmltcG9ydCB7XG4gIGdldFRzQ29uZmlnLFxuICBtYXRjaGVzVHNjb25maWdQYXRoUGF0dGVybixcbn0gZnJvbSBcImxpYi9ydW5uZXIvdHNjb25maWdQYXRoc1wiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IGlzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvbiB9IGZyb20gXCIuL2lzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvblwiXG5pbXBvcnQgeyBnZXROb2RlTW9kdWxlRGlyZWN0b3J5IH0gZnJvbSBcIi4vZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeVwiXG5pbXBvcnQgeyBnZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQgfSBmcm9tIFwiLi9nZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnRcIlxuaW1wb3J0IHsgaXNUeXBlU2NyaXB0RW50cnlwb2ludCB9IGZyb20gXCIuL2lzVHlwZVNjcmlwdEVudHJ5cG9pbnRcIlxuaW1wb3J0IHsgaXNEaXN0RGlyRW1wdHkgfSBmcm9tIFwiLi9pc0Rpc3REaXJFbXB0eVwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LWV2YWwtcGF0aFwiKVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0RXZhbFBhdGgoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4gIG9wdHM6IHtcbiAgICBjd2Q/OiBzdHJpbmdcbiAgICBmcm9tSnNEZWxpdnI/OiBib29sZWFuXG4gIH0gPSB7fSxcbikge1xuICBkZWJ1ZyhcImltcG9ydEV2YWxQYXRoIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgaW1wb3J0TmFtZSxcbiAgICBkZXB0aCxcbiAgICBvcHRzLFxuICB9KVxuICBjdHgubG9nZ2VyLmluZm8oXG4gICAgYGltcG9ydEV2YWxQYXRoKFwiJHtpbXBvcnROYW1lfVwiLCB7Y3dkOiBcIiR7b3B0cy5jd2R9XCIsIGRlcHRoOiAke2RlcHRofX0pYCxcbiAgKVxuXG4gIGRlYnVnKGAke1wiICBcIi5yZXBlYXQoZGVwdGgpfVx1MjdBMVx1RkUwRmAsIGltcG9ydE5hbWUpXG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcbiAgY29uc3QgZGlzYWJsZUNkbkxvYWRpbmcgPVxuICAgIGN0eC5kaXNhYmxlQ2RuTG9hZGluZyB8fCAoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fRElTQUJMRV9DRE5fTE9BRElOR19fXG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIGluIHByZVN1cHBsaWVkSW1wb3J0c1sxXWApXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi4vXCIpICYmIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lLnNsaWNlKDIpXSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIGluIHByZVN1cHBsaWVkSW1wb3J0c1syXWApXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBIYW5kbGUgc3VicGF0aCBpbXBvcnRzIGZyb20gcHJlU3VwcGxpZWRJbXBvcnRzIChlLmcuLCBcInJlYWN0L2pzeC1ydW50aW1lXCIpXG4gIC8vIElmIHRoZSBiYXNlIHBhY2thZ2UgaXMgaW4gcHJlU3VwcGxpZWRJbXBvcnRzLCB0cnkgdG8gaW1wb3J0IGZyb20gdGhlIGFjdHVhbCBwYWNrYWdlXG4gIGlmIChcbiAgICBpbXBvcnROYW1lLmluY2x1ZGVzKFwiL1wiKSAmJlxuICAgICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIuXCIpICYmXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9cIilcbiAgKSB7XG4gICAgY29uc3QgYmFzZVBrZyA9IGltcG9ydE5hbWUuc3BsaXQoXCIvXCIpWzBdXG4gICAgY29uc3QgaXNTY29wZWQgPSBiYXNlUGtnLnN0YXJ0c1dpdGgoXCJAXCIpXG4gICAgY29uc3QgcGtnTmFtZSA9IGlzU2NvcGVkXG4gICAgICA/IGltcG9ydE5hbWUuc3BsaXQoXCIvXCIpLnNsaWNlKDAsIDIpLmpvaW4oXCIvXCIpXG4gICAgICA6IGJhc2VQa2dcbiAgICBjb25zdCBzdWJwYXRoID0gaXNTY29wZWRcbiAgICAgID8gaW1wb3J0TmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMikuam9pbihcIi9cIilcbiAgICAgIDogaW1wb3J0TmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMSkuam9pbihcIi9cIilcblxuICAgIGlmIChwcmVTdXBwbGllZEltcG9ydHNbcGtnTmFtZV0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRyeSB0byBpbXBvcnQgdGhlIHN1YnBhdGggZnJvbSB0aGUgYWN0dWFsIHBhY2thZ2VcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBpbXBvcnQoYCR7cGtnTmFtZX0vJHtzdWJwYXRofWApXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHJlc29sdmVkXG4gICAgICAgIGN0eC5sb2dnZXIuaW5mbyhcbiAgICAgICAgICBgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIHJlc29sdmVkIGZyb20gcHJlU3VwcGxpZWRJbXBvcnRzIGJhc2UgcGFja2FnZSBcIiR7cGtnTmFtZX1cImAsXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiB0aGUgZHluYW1pYyBpbXBvcnQgZmFpbHMsIGNvbnRpbnVlIHdpdGggbm9ybWFsIHJlc29sdXRpb25cbiAgICAgICAgY3R4LmxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBGYWlsZWQgdG8gcmVzb2x2ZSBcIiR7aW1wb3J0TmFtZX1cIiBmcm9tIHByZVN1cHBsaWVkSW1wb3J0cyBwYWNrYWdlIFwiJHtwa2dOYW1lfVwiLCBmYWxsaW5nIGJhY2sgdG8gbm9ybWFsIHJlc29sdXRpb25gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGRlcHRoID4gMzApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTWF4IGRlcHRoIGZvciBpbXBvcnRzIHJlYWNoZWQgKDMwKSBJbXBvcnQgUGF0aDogJHtjdHguaW1wb3J0U3RhY2suam9pbihcIiAtPiBcIil9YCxcbiAgICApXG4gIH1cblxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL25wbS9cIikpIHtcbiAgICBjb25zdCBwa2dOYW1lID0gaW1wb3J0TmFtZS5yZXBsYWNlKC9eXFwvbnBtXFwvLywgXCJcIikucmVwbGFjZSgvXFwvXFwrZXNtJC8sIFwiXCIpXG4gICAgaWYgKGRpc2FibGVDZG5Mb2FkaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgZmluZCBtb2R1bGUgXCIke3BrZ05hbWV9XCIuIFRoZSBwYWNrYWdlIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGxvY2FsIGVudmlyb25tZW50LlxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgIClcbiAgICB9XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnROcG1QYWNrYWdlKFwiJHtwa2dOYW1lfVwiKWApXG4gICAgLy8gL25wbS8gcGF0aHMgYXJlIGFsd2F5cyB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyBmcm9tIGpzRGVsaXZyXG4gICAgYXdhaXQgaW1wb3J0TnBtUGFja2FnZShcbiAgICAgIHsgaW1wb3J0TmFtZTogcGtnTmFtZSwgZGVwdGgsIGZyb21Kc0RlbGl2cjogdHJ1ZSB9LFxuICAgICAgY3R4LFxuICAgIClcbiAgICBjb25zdCBwa2cgPSBwcmVTdXBwbGllZEltcG9ydHNbcGtnTmFtZV1cbiAgICBpZiAocGtnKSB7XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBwa2dcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBEZXRlcm1pbmUgd2hlcmUgdHNjb25maWcuanNvbiBpcyBsb2NhdGVkXG4gIGxldCB0c2NvbmZpZ0RpciA9IFwiLlwiXG4gIGxldCB0c0NvbmZpZ1RvVXNlID0gY3R4LnRzQ29uZmlnXG4gIGlmIChjdHgudHNDb25maWcgJiYgb3B0cy5jd2QpIHtcbiAgICAvLyBJZiBjd2QgaXMgaW4gbm9kZV9tb2R1bGVzLCBmaW5kIHRoZSBwYWNrYWdlIHJvb3RcbiAgICAvLyBlLmcuLCBcIm5vZGVfbW9kdWxlcy9hZG9tLWxpYnJhcnkvbGliL2dlbmVyYXRlZFwiIC0+IFwibm9kZV9tb2R1bGVzL2Fkb20tbGlicmFyeVwiXG4gICAgY29uc3Qgbm9kZU1vZHVsZXNNYXRjaCA9IG9wdHMuY3dkLm1hdGNoKC9eKG5vZGVfbW9kdWxlc1xcL1teXFwvXSspLylcbiAgICBpZiAobm9kZU1vZHVsZXNNYXRjaCkge1xuICAgICAgdHNjb25maWdEaXIgPSBub2RlTW9kdWxlc01hdGNoWzFdXG4gICAgICB0c0NvbmZpZ1RvVXNlID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKFxuICAgIGltcG9ydE5hbWUsXG4gICAgY3R4LmZzTWFwLFxuICAgIG9wdHMuY3dkLFxuICAgIHsgdHNDb25maWc6IHRzQ29uZmlnVG9Vc2UsIHRzY29uZmlnRGlyIH0sXG4gIClcbiAgaWYgKHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnRMb2NhbEZpbGUoXCIke3Jlc29sdmVkTG9jYWxJbXBvcnRQYXRofVwiKWApXG4gICAgYXdhaXQgaW1wb3J0TG9jYWxGaWxlKHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoLCBjdHgsIGRlcHRoKVxuICAgIC8vIE1hcCB0aGUgb3JpZ2luYWwgaW1wb3J0IG5hbWUgKHdoaWNoIG1pZ2h0IGJlIGEgdHNjb25maWcgcGF0aCBhbGlhcykgdG8gdGhlIHJlc29sdmVkIG1vZHVsZVxuICAgIGlmIChpbXBvcnROYW1lICE9PSByZXNvbHZlZExvY2FsSW1wb3J0UGF0aCkge1xuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID1cbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTG9jYWxJbXBvcnRQYXRoXVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoaXMgbWF0Y2hlcyBhIHRzY29uZmlnIHBhdGggcGF0dGVybiBidXQgZmFpbGVkIHRvIHJlc29sdmVcbiAgLy8gSWYgc28sIHRocm93IGFuIGVycm9yIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIHRvIG5wbVxuICBjb25zdCB0c0NvbmZpZyA9IGN0eC50c0NvbmZpZyA/PyBnZXRUc0NvbmZpZyhjdHguZnNNYXApXG4gIGlmICghY3R4LnRzQ29uZmlnICYmIHRzQ29uZmlnKSB7XG4gICAgY3R4LnRzQ29uZmlnID0gdHNDb25maWdcbiAgfVxuICBpZiAobWF0Y2hlc1RzY29uZmlnUGF0aFBhdHRlcm4oaW1wb3J0TmFtZSwgdHNDb25maWcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiBtYXRjaGVzIGEgdHNjb25maWcgcGF0aCBhbGlhcyBidXQgY291bGQgbm90IGJlIHJlc29sdmVkIHRvIGFuIGV4aXN0aW5nIGZpbGUke29wdHMuY3dkID8gYCBmcm9tIGRpcmVjdG9yeSBcIiR7b3B0cy5jd2R9XCJgIDogXCJcIn1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgKVxuICB9XG5cbiAgLy8gVHJ5IHRvIHJlc29sdmUgZnJvbSBub2RlX21vZHVsZXNcbiAgY29uc3QgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCA9IHJlc29sdmVOb2RlTW9kdWxlKFxuICAgIGltcG9ydE5hbWUsXG4gICAgY3R4LmZzTWFwLFxuICAgIG9wdHMuY3dkIHx8IFwiXCIsXG4gIClcbiAgaWYgKHJlc29sdmVkTm9kZU1vZHVsZVBhdGgpIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYHJlc29sdmVkTm9kZU1vZHVsZVBhdGg9XCIke3Jlc29sdmVkTm9kZU1vZHVsZVBhdGh9XCJgKVxuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0Tm9kZU1vZHVsZShcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnROb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICAvLyBJZiBub3QgZm91bmQgaW4gZnNNYXAgYnV0IG1pZ2h0IGJlIGEgbm9kZSBtb2R1bGUsIHRyeSBpbXBvcnROb2RlTW9kdWxlXG4gIC8vIHdoaWNoIHdpbGwgYXR0ZW1wdCB0byB1c2Ugbm9kZU1vZHVsZXNSZXNvbHZlciBpZiBjb25maWd1cmVkXG4gIGlmIChcbiAgICAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLlwiKSAmJlxuICAgICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIvXCIpICYmXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIkB0c2NpL1wiKVxuICApIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGN0eC5jaXJjdWl0Py5wbGF0Zm9ybVxuICAgIGlmIChwbGF0Zm9ybT8ubm9kZU1vZHVsZXNSZXNvbHZlcikge1xuICAgICAgY3R4LmxvZ2dlci5pbmZvKFxuICAgICAgICBgaW1wb3J0Tm9kZU1vZHVsZShcIiR7aW1wb3J0TmFtZX1cIikgdmlhIG5vZGVNb2R1bGVzUmVzb2x2ZXJgLFxuICAgICAgKVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgaW1wb3J0Tm9kZU1vZHVsZShpbXBvcnROYW1lLCBjdHgsIGRlcHRoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGN0eC5sb2dnZXIuaW5mbyhcbiAgICAgICAgICBgbm9kZU1vZHVsZXNSZXNvbHZlciBmYWlsZWQgZm9yIFwiJHtpbXBvcnROYW1lfVwiLCBmYWxsaW5nIGJhY2sgdG8gbnBtIENETmAsXG4gICAgICAgIClcbiAgICAgICAgaWYgKGRpc2FibGVDZG5Mb2FkaW5nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBmaW5kIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIi4gVGhlIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbG9jYWwgZW52aXJvbm1lbnQgYW5kIGF1dG9tYXRpYyBucG0gcmVzb2x1dGlvbiBpcyBkaXNhYmxlZC5cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0U25pcHBldChcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnRTbmlwcGV0KGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICBpZiAoIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiYgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAvLyBWYWxpZGF0aW9uIHN0ZXBzIGZvciBub2RlIG1vZHVsZXMgKGJlZm9yZSBqc0RlbGl2ciBmYWxsYmFjaylcbiAgICBpZiAoIW9wdHMuZnJvbUpzRGVsaXZyKSB7XG4gICAgICAvLyBTdGVwIDE6IENoZWNrIGlmIHBhY2thZ2UgaXMgZGVjbGFyZWQgaW4gcGFja2FnZS5qc29uXG4gICAgICBpZiAoIWlzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvbihpbXBvcnROYW1lLCBjdHguZnNNYXApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm9kZSBtb2R1bGUgaW1wb3J0ZWQgYnV0IG5vdCBpbiBwYWNrYWdlLmpzb24gXCIke2ltcG9ydE5hbWV9XCJcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCAyOiBDaGVjayBpZiBub2RlX21vZHVsZXMgZGlyZWN0b3J5IGV4aXN0cyAob25seSBpZiBub3QgZm91bmQgbG9jYWxseSB5ZXQpXG4gICAgICAvLyBPbmx5IHZhbGlkYXRlIGlmIENETiBsb2FkaW5nIGlzIGRpc2FibGVkIChpLmUuLCBubyBmYWxsYmFjayB0byBqc0RlbGl2ciBhdmFpbGFibGUpXG4gICAgICBjb25zdCBub2RlTW9kdWxlRGlyID0gZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeShpbXBvcnROYW1lLCBjdHguZnNNYXApXG4gICAgICBpZiAoIW5vZGVNb2R1bGVEaXIgJiYgZGlzYWJsZUNkbkxvYWRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgbm8gZmlsZXMgaW4gdGhlIG5vZGVfbW9kdWxlcyBkaXJlY3RvcnlcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCAzOiBDaGVjayBpZiBtYWluIGVudHJ5cG9pbnQgaXMgYSBUeXBlU2NyaXB0IGZpbGUgKG9ubHkgaWYgZGlyIGV4aXN0cylcbiAgICAgIGlmIChub2RlTW9kdWxlRGlyKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5cG9pbnQgPSBnZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQoaW1wb3J0TmFtZSwgY3R4LmZzTWFwKVxuICAgICAgICBpZiAoaXNUeXBlU2NyaXB0RW50cnlwb2ludChlbnRyeXBvaW50KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgYSB0eXBlc2NyaXB0IGVudHJ5cG9pbnQgdGhhdCBpcyB1bnN1cHBvcnRlZFxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDQ6IENoZWNrIGlmIGRpc3QgZGlyZWN0b3J5IGlzIGVtcHR5IHdoZW4gbWFpbiBwb2ludHMgdG8gZGlzdFxuICAgICAgICBpZiAoZW50cnlwb2ludCAmJiBlbnRyeXBvaW50LnN0YXJ0c1dpdGgoXCJkaXN0L1wiKSkge1xuICAgICAgICAgIGlmIChpc0Rpc3REaXJFbXB0eShpbXBvcnROYW1lLCBjdHguZnNNYXApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgbm8gZmlsZXMgaW4gZGlzdCwgZGlkIHlvdSBmb3JnZXQgdG8gdHJhbnNwaWxlP1xcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZUNkbkxvYWRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBmaW5kIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIi4gVGhlIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbG9jYWwgZW52aXJvbm1lbnQuXFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgKVxuICAgIH1cbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydE5wbVBhY2thZ2UoXCIke2ltcG9ydE5hbWV9XCIpYClcbiAgICByZXR1cm4gaW1wb3J0TnBtUGFja2FnZShcbiAgICAgIHsgaW1wb3J0TmFtZSwgZGVwdGgsIGZyb21Kc0RlbGl2cjogb3B0cy5mcm9tSnNEZWxpdnIgfSxcbiAgICAgIGN0eCxcbiAgICApXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFVucmVzb2x2ZWQgaW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiICR7b3B0cy5jd2QgPyBgZnJvbSBkaXJlY3RvcnkgXCIke29wdHMuY3dkfVwiYCA6IFwiXCJ9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICApXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBbnlDaXJjdWl0RWxlbWVudCB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuaW1wb3J0IHR5cGUge1xuICBDaXJjdWl0UnVubmVyQXBpLFxuICBDaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbn0gZnJvbSBcImxpYi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJAdHNjaXJjdWl0L3Byb3BzXCJcbmltcG9ydCB7IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQsIGltcG9ydEV2YWxQYXRoIH0gZnJvbSBcImxpYi9ldmFsXCJcbmltcG9ydCB7IG5vcm1hbGl6ZUZzTWFwIH0gZnJvbSBcIi4vbm9ybWFsaXplRnNNYXBcIlxuaW1wb3J0IHsgZ2V0VHNDb25maWcgfSBmcm9tIFwiLi90c2NvbmZpZ1BhdGhzXCJcbmltcG9ydCB0eXBlIHsgUm9vdENpcmN1aXQgfSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQgfSBmcm9tIFwiLi9zZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWRcIlxuaW1wb3J0IHsgZW5oYW5jZVJvb3RDaXJjdWl0SGFzTm9DaGlsZHJlbkVycm9yIH0gZnJvbSBcImxpYi91dGlscy9lbmhhbmNlLXJvb3QtY2lyY3VpdC1lcnJvclwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IHNldFZhbHVlQXRQYXRoIH0gZnJvbSBcImxpYi9zaGFyZWQvb2JqLXBhdGhcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOkNpcmN1aXRSdW5uZXJcIilcblxuZXhwb3J0IGNsYXNzIENpcmN1aXRSdW5uZXIgaW1wbGVtZW50cyBDaXJjdWl0UnVubmVyQXBpIHtcbiAgX2V4ZWN1dGlvbkNvbnRleHQ6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQ+IHwgbnVsbCA9IG51bGxcbiAgX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uOiBDaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbiA9IHtcbiAgICBzbmlwcGV0c0FwaUJhc2VVcmw6IFwiaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbVwiLFxuICAgIGNqc1JlZ2lzdHJ5VXJsOiBcImh0dHBzOi8vY2pzLnRzY2lyY3VpdC5jb21cIixcbiAgICB2ZXJib3NlOiBmYWxzZSxcbiAgfVxuICBfZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsICgoLi4uYXJnczogYW55W10pID0+IHZvaWQpW10+ID0ge31cbiAgX2RlYnVnTmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICBjb25zdHJ1Y3Rvcihjb25maWd1cmF0aW9uOiBQYXJ0aWFsPENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uPiA9IHt9KSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbiwgY29uZmlndXJhdGlvbilcbiAgfVxuXG4gIGFzeW5jIHZlcnNpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gXCIwLjAuMFwiXG4gIH1cblxuICBhc3luYyBleGVjdXRlV2l0aEZzTWFwKG9nT3B0czoge1xuICAgIGVudHJ5cG9pbnQ/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50UGF0aD86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnROYW1lPzogc3RyaW5nXG4gICAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBuYW1lPzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb3B0cyA9IHsgLi4ub2dPcHRzIH1cblxuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBEZWJ1Zy5lbmFibGUoXCJ0c2NpOmV2YWw6KlwiKVxuICAgIH1cblxuICAgIGRlYnVnKFwiZXhlY3V0ZVdpdGhGc01hcCBjYWxsZWQgd2l0aDpcIiwge1xuICAgICAgZW50cnlwb2ludDogb3B0cy5lbnRyeXBvaW50LFxuICAgICAgZnNNYXBLZXlzOiBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKSxcbiAgICAgIG5hbWU6IG9wdHMubmFtZSxcbiAgICB9KVxuXG4gICAgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkKG9wdHMpXG5cbiAgICBkZWJ1ZyhcImVudHJ5cG9pbnQgYWZ0ZXIgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkOlwiLCB7XG4gICAgICBlbnRyeXBvaW50OiBvcHRzLmVudHJ5cG9pbnQsXG4gICAgfSlcblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IG9wdHMubmFtZSxcbiAgICAgICAgcGxhdGZvcm06IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLFxuICAgICAgICBwcm9qZWN0Q29uZmlnOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgICBkZWJ1Z05hbWVzcGFjZTogdGhpcy5fZGVidWdOYW1lc3BhY2UsXG4gICAgICB9LFxuICAgIClcbiAgICB0aGlzLl9iaW5kRXZlbnRMaXN0ZW5lcnModGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0KVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5lbnRyeXBvaW50ID0gb3B0cy5lbnRyeXBvaW50IVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXAgPSBub3JtYWxpemVGc01hcChvcHRzLmZzTWFwKVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBnZXRUc0NvbmZpZyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwKVxuICAgIGlmICghdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcFtvcHRzLmVudHJ5cG9pbnQhXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRyeXBvaW50IFwiJHtvcHRzLmVudHJ5cG9pbnR9XCIgbm90IGZvdW5kYClcbiAgICB9XG4gICAgOyhnbG9iYWxUaGlzIGFzIGFueSkuX190c2NpcmN1aXRfY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdFxuXG4gICAgY29uc3QgZW50cnlwb2ludCA9IG9wdHMuZW50cnlwb2ludCEuc3RhcnRzV2l0aChcIi4vXCIpXG4gICAgICA/IG9wdHMuZW50cnlwb2ludFxuICAgICAgOiBgLi8ke29wdHMuZW50cnlwb2ludH1gXG5cbiAgICBkZWJ1ZyhcImZpbmFsIGVudHJ5cG9pbnQ6XCIsIGVudHJ5cG9pbnQpXG4gICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoZW50cnlwb2ludCEsIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpXG4gIH1cblxuICBhc3luYyBleGVjdXRlKGNvZGU6IHN0cmluZywgb3B0czogeyBuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgXCJbQ2lyY3VpdFJ1bm5lcl0gZXhlY3V0ZSBjYWxsZWQgd2l0aCBjb2RlIGxlbmd0aDpcIixcbiAgICAgICAgY29kZS5sZW5ndGgsXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIHtcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgcGxhdGZvcm06IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLFxuICAgICAgICBwcm9qZWN0Q29uZmlnOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgICBkZWJ1Z05hbWVzcGFjZTogdGhpcy5fZGVidWdOYW1lc3BhY2UsXG4gICAgICB9LFxuICAgIClcbiAgICB0aGlzLl9iaW5kRXZlbnRMaXN0ZW5lcnModGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0KVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXBbXCJlbnRyeXBvaW50LnRzeFwiXSA9IGNvZGVcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LnRzQ29uZmlnID0gZ2V0VHNDb25maWcodGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcClcbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG5cbiAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChcIi4vZW50cnlwb2ludC50c3hcIiwgdGhpcy5fZXhlY3V0aW9uQ29udGV4dClcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVDb21wb25lbnQoY29tcG9uZW50OiBhbnksIG9wdHM6IHsgbmFtZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBpZiAodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coXCJbQ2lyY3VpdFJ1bm5lcl0gZXhlY3V0ZUNvbXBvbmVudCBjYWxsZWRcIilcbiAgICB9XG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxuICAgICAge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgOyhnbG9iYWxUaGlzIGFzIGFueSkuX190c2NpcmN1aXRfY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdFxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBudWxsXG5cbiAgICBjb25zdCBlbGVtZW50ID0gdHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiID8gY29tcG9uZW50KCkgOiBjb21wb25lbnRcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQuYWRkKGVsZW1lbnQgYXMgYW55KVxuICB9XG5cbiAgb24oZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSA/Pz0gW11cbiAgICB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0ucHVzaChjYWxsYmFjaylcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0Py5jaXJjdWl0Lm9uKGV2ZW50IGFzIGFueSwgY2FsbGJhY2spXG4gIH1cblxuICBhc3luYyByZW5kZXJVbnRpbFNldHRsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5yZW5kZXJVbnRpbFNldHRsZWQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0Q2lyY3VpdEpzb24oKTogUHJvbWlzZTxBbnlDaXJjdWl0RWxlbWVudFtdPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQuZ2V0Q2lyY3VpdEpzb24oKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY2xlYXJFdmVudExpc3RlbmVycygpIHtcbiAgICBpZiAodGhpcy5fZXhlY3V0aW9uQ29udGV4dD8uY2lyY3VpdCkge1xuICAgICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSkge1xuICAgICAgICAgIGNvbnN0IGNpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IDxleHBsYW5hdGlvbj5cbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyPzogKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBGdW5jdGlvbikgPT4gdm9pZFxuICAgICAgICAgIH1cbiAgICAgICAgICBjaXJjdWl0LnJlbW92ZUxpc3RlbmVyPy4oZXZlbnQsIGxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGtpbGwoKSB7XG4gICAgLy8gQ2xlYW51cCByZXNvdXJjZXNcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gbnVsbFxuICB9XG5cbiAgYXN5bmMgc2V0U25pcHBldHNBcGlCYXNlVXJsKGJhc2VVcmw6IHN0cmluZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybCA9IGJhc2VVcmxcbiAgfVxuXG4gIGFzeW5jIHNldERpc2FibGVDZG5Mb2FkaW5nKGRpc2FibGU6IGJvb2xlYW4pIHtcbiAgICA7KHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uIGFzIGFueSkuZGlzYWJsZUNkbkxvYWRpbmcgPSBkaXNhYmxlXG4gIH1cblxuICBhc3luYyBzZXRQbGF0Zm9ybUNvbmZpZyhwbGF0Zm9ybTogUGxhdGZvcm1Db25maWcpIHtcbiAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSA9IHBsYXRmb3JtXG4gIH1cblxuICBhc3luYyBzZXRQbGF0Zm9ybUNvbmZpZ1Byb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtKSB7XG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSA9IHt9XG4gICAgfVxuICAgIHNldFZhbHVlQXRQYXRoKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLCBwcm9wZXJ0eSwgdmFsdWUpXG4gIH1cblxuICBhc3luYyBzZXRQcm9qZWN0Q29uZmlnKHByb2plY3Q6IFBhcnRpYWw8UGxhdGZvcm1Db25maWc+KSB7XG4gICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyA9IHByb2plY3RcbiAgfVxuXG4gIGFzeW5jIHNldFByb2plY3RDb25maWdQcm9wZXJ0eShwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCF0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnKSB7XG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnID0ge31cbiAgICB9XG4gICAgc2V0VmFsdWVBdFBhdGgoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgcHJvcGVydHksXG4gICAgICB2YWx1ZSxcbiAgICApXG4gIH1cblxuICBhc3luYyBlbmFibGVEZWJ1ZyhuYW1lc3BhY2U6IHN0cmluZykge1xuICAgIHRoaXMuX2RlYnVnTmFtZXNwYWNlID0gbmFtZXNwYWNlXG4gICAgaWYgKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIGNvbnN0IGNpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQgYXMgYW55XG4gICAgICBjaXJjdWl0LmVuYWJsZURlYnVnPy4obmFtZXNwYWNlKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2JpbmRFdmVudExpc3RlbmVycyhjaXJjdWl0OiBSb290Q2lyY3VpdCkge1xuICAgIGZvciAoY29uc3QgZXZlbnQgaW4gdGhpcy5fZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgIGNpcmN1aXQub24oZXZlbnQgYXMgYW55LCBsaXN0ZW5lciBhcyBhbnkpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyB9IGZyb20gXCIuL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDpzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWRcIilcblxuZXhwb3J0IGNvbnN0IHNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZCA9IChvcHRzOiB7XG4gIGVudHJ5cG9pbnQ/OiBzdHJpbmdcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgbWFpbkNvbXBvbmVudFBhdGg/OiBzdHJpbmdcbiAgbWFpbkNvbXBvbmVudE5hbWU/OiBzdHJpbmdcbiAgbmFtZT86IHN0cmluZ1xuICBtYWluQ29tcG9uZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG59KSA9PiB7XG4gIGlmICghb3B0cy5lbnRyeXBvaW50ICYmICFvcHRzLm1haW5Db21wb25lbnRQYXRoKSB7XG4gICAgaWYgKFwiaW5kZXgudHN4XCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IFwiaW5kZXgudHN4XCJcbiAgICB9IGVsc2UgaWYgKFwiaW5kZXgudHNcIiBpbiBvcHRzLmZzTWFwKSB7XG4gICAgICBvcHRzLm1haW5Db21wb25lbnRQYXRoID0gXCJpbmRleC50c1wiXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIE9iamVjdC5rZXlzKG9wdHMuZnNNYXApLmZpbHRlcigoaykgPT4gay5lbmRzV2l0aChcIi50c3hcIikpLmxlbmd0aCA9PT0gMVxuICAgICkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IE9iamVjdC5rZXlzKG9wdHMuZnNNYXApWzBdXG4gICAgfSBlbHNlIGlmIChcInRzY2lyY3VpdC5jb25maWcuanNvblwiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIGNvbnN0IGNvbmZpZ0NvbnRlbnQgPSBvcHRzLmZzTWFwW1widHNjaXJjdWl0LmNvbmZpZy5qc29uXCJdXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKGNvbmZpZ0NvbnRlbnQpXG4gICAgICAgIGlmIChjb25maWcubWFpbkVudHJ5cG9pbnQpIHtcbiAgICAgICAgICBvcHRzLmVudHJ5cG9pbnQgPSBjb25maWcubWFpbkVudHJ5cG9pbnRcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gcGFyc2UgdHNjaXJjdWl0LmNvbmZpZy5qc29uOlwiLCBlKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRWl0aGVyIGVudHJ5cG9pbnQgb3IgbWFpbkNvbXBvbmVudFBhdGggbXVzdCBiZSBwcm92aWRlZCAobm8gaW5kZXggZmlsZSwgY291bGQgbm90IGluZmVyIGVudHJ5cG9pbnQpXCIsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgaWYgKCFvcHRzLmVudHJ5cG9pbnQgJiYgb3B0cy5tYWluQ29tcG9uZW50UGF0aCkge1xuICAgIG9wdHMuZW50cnlwb2ludCA9IFwiZW50cnlwb2ludC50c3hcIlxuICAgIGNvbnN0IG1haW5Db21wb25lbnRDb2RlID1cbiAgICAgIG9wdHMuZnNNYXBbcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyhvcHRzLm1haW5Db21wb25lbnRQYXRoLCBvcHRzLmZzTWFwKV1cbiAgICBpZiAoIW1haW5Db21wb25lbnRDb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNYWluIGNvbXBvbmVudCBwYXRoIFwiJHtvcHRzLm1haW5Db21wb25lbnRQYXRofVwiIG5vdCBmb3VuZCBpbiBmc01hcC4gQXZhaWxhYmxlIHBhdGhzOiAke09iamVjdC5rZXlzKG9wdHMuZnNNYXApLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgKVxuICAgIH1cbiAgICBvcHRzLmZzTWFwW29wdHMuZW50cnlwb2ludF0gPSBgXG4gICAgIGltcG9ydCAqIGFzIFVzZXJDb21wb25lbnRzIGZyb20gXCIuLyR7b3B0cy5tYWluQ29tcG9uZW50UGF0aH1cIjtcbiAgICAgICAgICBcbiAgICAgICR7XG4gICAgICAgIG9wdHMubWFpbkNvbXBvbmVudE5hbWVcbiAgICAgICAgICA/IGBcbiAgICAgICAgY29uc3QgQ29tcG9uZW50VG9SZW5kZXIgPSBVc2VyQ29tcG9uZW50c1tcIiR7b3B0cy5tYWluQ29tcG9uZW50TmFtZX1cIl1cbiAgICAgICAgYFxuICAgICAgICAgIDogYGNvbnN0IENvbXBvbmVudFRvUmVuZGVyID0gVXNlckNvbXBvbmVudHMuZGVmYXVsdCB8fCBcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhVc2VyQ29tcG9uZW50cylcbiAgICAgICAgICAuZmlsdGVyKChbbmFtZV0pID0+ICFuYW1lLnN0YXJ0c1dpdGgoXCJ1c2VcIikpXG4gICAgICAgICAgLm1hcCgoW18sIGNvbXBvbmVudF0pID0+IGNvbXBvbmVudClbMF0gfHwgKCgpID0+IG51bGwpO2BcbiAgICAgIH1cblxuICAgICAgICAgICAke1xuICAgICAgICAgICAgIGRlYnVnLmVuYWJsZWRcbiAgICAgICAgICAgICAgID8gYFxuICAgICBjb25zb2xlLmxvZyh7IFVzZXJDb21wb25lbnRzIH0pXG4gICAgIGNvbnNvbGUubG9nKFwiQ29tcG9uZW50VG9SZW5kZXIgXCIgKyBDb21wb25lbnRUb1JlbmRlci50b1N0cmluZygpLCAgeyBDb21wb25lbnRUb1JlbmRlciB9KVxuICAgICBgXG4gICAgICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICAgfVxuXG4gICAgICBjaXJjdWl0LmFkZCggICAgICAgXG4gICAgICAgICAgPENvbXBvbmVudFRvUmVuZGVyICR7b3B0cy5tYWluQ29tcG9uZW50UHJvcHMgPyBgey4uLiR7SlNPTi5zdHJpbmdpZnkob3B0cy5tYWluQ29tcG9uZW50UHJvcHMsIG51bGwsIDIpfX1gIDogXCJcIn0gLz4gXG4gICAgICApO1xuYFxuICB9XG5cbiAgaWYgKCFvcHRzLm5hbWUgJiYgb3B0cy5tYWluQ29tcG9uZW50TmFtZSkge1xuICAgIG9wdHMubmFtZSA9IG9wdHMubWFpbkNvbXBvbmVudE5hbWVcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IgPSAoXG4gIGVycm9yOiB1bmtub3duLFxuICBlbnRyeXBvaW50Pzogc3RyaW5nLFxuKSA9PiB7XG4gIGlmIChcbiAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgZW50cnlwb2ludCAmJlxuICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJSb290Q2lyY3VpdCBoYXMgbm8gY2hpbGRyZW5cIikgJiZcbiAgICAhZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnXCJlbnRyeXBvaW50XCI6JylcbiAgKSB7XG4gICAgY29uc3QgZW50cnlwb2ludE1lc3NhZ2UgPSBlbnRyeXBvaW50LnN0YXJ0c1dpdGgoXCIuL1wiKVxuICAgICAgPyBlbnRyeXBvaW50LnNsaWNlKDIpXG4gICAgICA6IGVudHJ5cG9pbnRcbiAgICBlcnJvci5tZXNzYWdlID0gYCR7ZXJyb3IubWVzc2FnZX0uIFwiZW50cnlwb2ludFwiOiBcIiR7ZW50cnlwb2ludE1lc3NhZ2V9XCIgaXMgc2V0IGluIHRoZSBydW5uZXIgY29uZmlndXJhdGlvbiwgZW50cnlwb2ludHMgbXVzdCBjb250YWluIFwiY2lyY3VpdC5hZGQoLi4uKVwiLCB5b3UgbWlnaHQgYmUgbG9va2luZyB0byB1c2UgbWFpbkNvbXBvbmVudFBhdGggaW5zdGVhZCBpZiB5b3VyIGZpbGUgZXhwb3J0cyBhIGNvbXBvbmVudC5gXG4gIH1cblxuICByZXR1cm4gZXJyb3Jcbn1cbiIsICIvKipcbiAqIEdldCBhbGwgcGF0aHMgb2YgYW4gb2JqZWN0XG4gKlxuICogZ2V0T2JqZWN0UGF0aHMoeyBhOiB7IGI6IDIsIGM6IHsgZDogMyB9IH0sIGU6IDUgfSlcbiAqXG4gKiAvLyBPdXRwdXQ6IFsnYS5iJywgJ2EuYy5kJywgJ2UnXVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JqZWN0UGF0aHMoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcHJlZml4ID0gXCJcIixcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW11cblxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XVxuICAgIGNvbnN0IHBhdGggPSBwcmVmaXggPyBgJHtwcmVmaXh9LiR7a2V5fWAgOiBrZXlcblxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjb25zdCBzdWJQYXRocyA9IGdldE9iamVjdFBhdGhzKHZhbHVlLCBwYXRoKVxuICAgICAgcGF0aHMucHVzaCguLi5zdWJQYXRocylcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aHMucHVzaChwYXRoKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXRoc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVBdFBhdGgob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChcIi5cIilcbiAgbGV0IGN1cnJlbnQgPSBvYmpcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV1cbiAgfVxuICByZXR1cm4gY3VycmVudFxufVxuLyoqXG4gKiBTZXQgYSB2YWx1ZSBhdCBhIHBhdGggaW4gYW4gb2JqZWN0XG4gKlxuICogc2V0VmFsdWVBdFBhdGgoeyBhOiB7IGI6IDIgfSB9LCBcImEuYy5kXCIsIDUpXG4gKlxuICogLy8gT3V0cHV0OiB7IGE6IHsgYjogMiwgYzogeyBkOiA1IH0gfSB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRWYWx1ZUF0UGF0aChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4pIHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoXCIuXCIpXG4gIGxldCBjdXJyZW50ID0gb2JqXG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IGtleXNbaV1cblxuICAgIC8vIElmIHdlJ3JlIGF0IHRoZSBsYXN0IGtleSwgc2V0IHRoZSB2YWx1ZS5cbiAgICBpZiAoaSA9PT0ga2V5cy5sZW5ndGggLSAxKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSB2YWx1ZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3Qgb3IgaXMgbm90IGFuIG9iamVjdCAoYXZvaWQgb3ZlcndyaXRpbmcgYXJyYXlzKSwgY3JlYXRlIGEgbmV3IG9iamVjdFxuICAgICAgaWYgKFxuICAgICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSkgfHxcbiAgICAgICAgdHlwZW9mIGN1cnJlbnRba2V5XSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgICBjdXJyZW50W2tleV0gPT09IG51bGwgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheShjdXJyZW50W2tleV0pXG4gICAgICApIHtcbiAgICAgICAgY3VycmVudFtrZXldID0ge31cbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDaXJjdWl0UnVubmVyIH0gZnJvbSBcIi4vQ2lyY3VpdFJ1bm5lclwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Uc2NpcmN1aXRDb2RlKFxuICBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nLFxuICBvcHRzPzogT21pdDxQYXJhbWV0ZXJzPENpcmN1aXRSdW5uZXJbXCJleGVjdXRlV2l0aEZzTWFwXCJdPlswXSwgXCJmc01hcFwiPixcbikge1xuICBpZiAoXG4gICAgdHlwZW9mIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmcgPT09IFwic3RyaW5nXCIgJiZcbiAgICAhZmlsZXN5c3RlbU9yQ29kZVN0cmluZy5pbmNsdWRlcyhcImV4cG9ydFwiKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIFwiZXhwb3J0XCIga2V5d29yZCB3YXNuJ3QgZm91bmQgaW4geW91ciBwcm92aWRlZCBjb2RlLiBZb3UgbmVlZCB0byBleHBvcnQgYSBjb21wb25lbnQgaW4geW91ciBjb2RlLCBlLmcuXFxuXFxuZXhwb3J0IGRlZmF1bHQgKCkgPT4gKFxcbiAgPHJlc2lzdG9yIG5hbWU9XCJSMVwiIHJlc2lzdGFuY2U9XCIxa1wiIC8+XFxuKWAsXG4gICAgKVxuICB9XG4gIGNvbnN0IGZpbGVzeXN0ZW0gPVxuICAgIHR5cGVvZiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nID09PSBcInN0cmluZ1wiXG4gICAgICA/IHsgXCJ1c2VyLWNvZGUudHN4XCI6IGZpbGVzeXN0ZW1PckNvZGVTdHJpbmcgfVxuICAgICAgOiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nXG5cbiAgY29uc3QgY2lyY3VpdFJ1bm5lciA9IG5ldyBDaXJjdWl0UnVubmVyKClcblxuICBhd2FpdCBjaXJjdWl0UnVubmVyLmV4ZWN1dGVXaXRoRnNNYXAoe1xuICAgIGZzTWFwOiBmaWxlc3lzdGVtLFxuICAgIC4uLm9wdHMsXG4gIH0pXG5cbiAgYXdhaXQgY2lyY3VpdFJ1bm5lci5yZW5kZXJVbnRpbFNldHRsZWQoKVxuXG4gIHJldHVybiBhd2FpdCBjaXJjdWl0UnVubmVyLmdldENpcmN1aXRKc29uKClcbn1cbiIsICJpbXBvcnQgeyBydW5Uc2NpcmN1aXRDb2RlIH0gZnJvbSBcIi4vcnVuVHNjaXJjdWl0Q29kZVwiXG5cbmV4cG9ydCBjb25zdCBydW5Uc2NpcmN1aXRNb2R1bGUgPSBhc3luYyAoXG4gIG1vZHVsZTogc3RyaW5nLFxuICBvcHRzOiB7IHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PjsgZXhwb3J0TmFtZT86IHN0cmluZyB9ID0ge30sXG4pID0+IHtcbiAgaWYgKCFtb2R1bGUuc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICBtb2R1bGUgPSBgQHRzY2kvJHttb2R1bGUucmVwbGFjZSgvXFwvLywgXCIuXCIpfWBcbiAgfVxuICBjb25zdCBjaXJjdWl0SnNvbiA9IGF3YWl0IHJ1blRzY2lyY3VpdENvZGUoXG4gICAge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgZXhwb3J0cyB0aGF0IGFyZSBub3QgdGhlIGRlZmF1bHQgZXhwb3J0IGJ5IHNjYW5uaW5nXG4gICAgICAvLyBvdGhlckV4cG9ydHMgZm9yIGNvbXBvbmVudHNcbiAgICAgIFwidXNlci1jb2RlLnRzeFwiOiBgXG4gICAgaW1wb3J0IE1vZHVsZSwgKiBhcyBvdGhlckV4cG9ydHMgZnJvbSBcIiR7bW9kdWxlfVwiO1xuXG4gICAgbGV0IGV4cG9ydE5hbWUgPSBcIiR7b3B0cy5leHBvcnROYW1lID8/IFwiXCJ9XCJcblxuICAgIGlmICgoIU1vZHVsZSB8fCB0eXBlb2YgTW9kdWxlICE9PSBcImZ1bmN0aW9uXCIpICYmICFCb29sZWFuKGV4cG9ydE5hbWUpKSB7XG4gICAgICBleHBvcnROYW1lID0gT2JqZWN0LmtleXMob3RoZXJFeHBvcnRzKS5maWx0ZXIoa2V5ID0+IGtleVswXSA9PT0ga2V5WzBdLnRvVXBwZXJDYXNlKCkgJiYgdHlwZW9mIG90aGVyRXhwb3J0c1trZXldID09PSBcImZ1bmN0aW9uXCIpWzBdXG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdEV4cG9ydCA9IGV4cG9ydE5hbWUgPyBvdGhlckV4cG9ydHNbZXhwb3J0TmFtZV0gOiBNb2R1bGVcblxuICAgIGlmICghZGVmYXVsdEV4cG9ydCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxcYE5vIGV4cG9ydCBmb3VuZCBmb3IgbW9kdWxlIFwiXFwke21vZHVsZX1cIiAodHJpZWQgXCJcXCR7ZXhwb3J0TmFtZSA/PyBcImRlZmF1bHRcIn1cIilcXGApXG4gICAgfVxuXG4gICAgZXhwb3J0IGRlZmF1bHQgZGVmYXVsdEV4cG9ydDtcbiAgICBgLFxuICAgIH0sXG4gICAge1xuICAgICAgbWFpbkNvbXBvbmVudFByb3BzOiBvcHRzLnByb3BzLFxuICAgIH0sXG4gIClcbiAgcmV0dXJuIGNpcmN1aXRKc29uXG59XG4iLCAiaW1wb3J0ICogYXMgQ29tbGluayBmcm9tIFwiY29tbGlua1wiXG5leHBvcnQgKiBmcm9tIFwiLi91dGlscy9pbmRleFwiXG5pbXBvcnQgdHlwZSB7XG4gIEludGVybmFsV2ViV29ya2VyQXBpLFxuICBXZWJXb3JrZXJDb25maWd1cmF0aW9uLFxuICBDaXJjdWl0V2ViV29ya2VyLFxufSBmcm9tIFwiLi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0IHR5cGUgeyBSb290Q2lyY3VpdEV2ZW50TmFtZSB9IGZyb20gXCIuL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgeyBnZXRPYmplY3RQYXRocywgZ2V0VmFsdWVBdFBhdGggfSBmcm9tIFwiLi9zaGFyZWQvb2JqLXBhdGhcIlxuXG5leHBvcnQgdHlwZSB7IENpcmN1aXRXZWJXb3JrZXIsIFdlYldvcmtlckNvbmZpZ3VyYXRpb24gfVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIFRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVI6IENpcmN1aXRXZWJXb3JrZXIgfCB1bmRlZmluZWRcbiAgfVxuICB2YXIgVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUjogQ2lyY3VpdFdlYldvcmtlciB8IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlQ2lyY3VpdFdlYldvcmtlciA9IGFzeW5jIChcbiAgY29uZmlndXJhdGlvbjogUGFydGlhbDxXZWJXb3JrZXJDb25maWd1cmF0aW9uPixcbik6IFByb21pc2U8Q2lyY3VpdFdlYldvcmtlcj4gPT4ge1xuICAvLyBLaWxsIGV4aXN0aW5nIGdsb2JhbCB3b3JrZXIgaW5zdGFuY2UgaWYgcHJlc2VudFxuICBjb25zdCBleGlzdGluZ1dvcmtlciA9IGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUlxuICBpZiAoZXhpc3RpbmdXb3JrZXIgJiYgdHlwZW9mIGV4aXN0aW5nV29ya2VyLmtpbGwgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW1dvcmtlcl0gS2lsbGluZyBwcmV2aW91cyBnbG9iYWwgd29ya2VyIGluc3RhbmNlLi4uXCIpXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGlzdGluZ1dvcmtlci5raWxsKClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoY29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcIltXb3JrZXJdIEVycm9yIGtpbGxpbmcgcHJldmlvdXMgZ2xvYmFsIHdvcmtlciBpbnN0YW5jZTpcIixcbiAgICAgICAgICBlLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICAvLyBFbnN1cmUgdGhlIGtleSBpcyBjbGVhcmVkIGV2ZW4gaWYga2lsbCB0aHJvd3MgYW4gZXJyb3JcbiAgICAgIGlmIChnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPT09IGV4aXN0aW5nV29ya2VyKSB7XG4gICAgICAgIGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIFwiW1dvcmtlcl0gQ3JlYXRpbmcgY2lyY3VpdCB3ZWIgd29ya2VyIHdpdGggY29uZmlnOlwiLFxuICAgICAgY29uZmlndXJhdGlvbixcbiAgICApXG4gIH1cblxuICBsZXQgd29ya2VyQmxvYlVybCA9XG4gICAgY29uZmlndXJhdGlvbi53ZWJXb3JrZXJCbG9iVXJsID8/IGNvbmZpZ3VyYXRpb24ud2ViV29ya2VyVXJsXG5cbiAgaWYgKCF3b3JrZXJCbG9iVXJsKSB7XG4gICAgY29uc3QgY2RuVXJsID0gYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ldmFsQCR7Y29uZmlndXJhdGlvbi5ldmFsVmVyc2lvbiA/PyBcImxhdGVzdFwifS9kaXN0L3dlYndvcmtlci9lbnRyeXBvaW50LmpzYFxuXG4gICAgY29uc3Qgd29ya2VyQmxvYiA9IGF3YWl0IGdsb2JhbFRoaXMuZmV0Y2goY2RuVXJsKS50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpXG4gICAgd29ya2VyQmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwod29ya2VyQmxvYilcbiAgfVxuXG4gIGNvbnN0IHJhd1dvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyQmxvYlVybCwgeyB0eXBlOiBcIm1vZHVsZVwiIH0pXG4gIGxldCB3b3JrZXJJbml0RXJyb3I6IGFueVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIChldmVudCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJbV29ya2VyXSBFcnJvciBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gICAgd29ya2VySW5pdEVycm9yID0gZXZlbnRcbiAgfSlcbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmhhbmRsZWRyZWplY3Rpb25cIiwgKGV2ZW50KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcIltXb3JrZXJdIFVuaGFuZGxlZCByZWplY3Rpb24gaW4gd29ya2VyXCIsIGV2ZW50KVxuICB9KVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VlcnJvclwiLCAoZXZlbnQpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiW1dvcmtlcl0gTWVzc2FnZSBlcnJvciBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gIH0pXG4gIGNvbnN0IGVhcmx5TWVzc2FnZUhhbmRsZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiW1dvcmtlcl0gTWVzc2FnZSBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gIH1cbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGVhcmx5TWVzc2FnZUhhbmRsZXIpXG5cbiAgLy8gSGFuZGxlIGZldGNoIHJlcXVlc3RzIGZyb20gdGhlIHdvcmtlclxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgYXN5bmMgKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICBjb25zdCBkYXRhID0gZXZlbnQuZGF0YVxuICAgIGlmIChkYXRhPy50eXBlICE9PSBcIndvcmtlcl9mZXRjaFwiKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdsb2JhbFRoaXMuZmV0Y2goZGF0YS5pbnB1dCwgZGF0YS5pbml0KVxuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuICAgICAgcmF3V29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgdHlwZTogXCJ3b3JrZXJfZmV0Y2hfcmVzdWx0XCIsXG4gICAgICAgIHJlcXVlc3RJZDogZGF0YS5yZXF1ZXN0SWQsXG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICAgIGhlYWRlcnM6ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgIG9ialtrZXldID0gdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gb2JqXG4gICAgICAgICAgfSkoKSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHJhd1dvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHR5cGU6IFwid29ya2VyX2ZldGNoX3Jlc3VsdFwiLFxuICAgICAgICByZXF1ZXN0SWQ6IGRhdGEucmVxdWVzdElkLFxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBuYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICBzdGFjazogZXJyLnN0YWNrLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH0pXG5cbiAgaWYgKHdvcmtlckluaXRFcnJvcikge1xuICAgIHRocm93IHdvcmtlckluaXRFcnJvclxuICB9XG5cbiAgY29uc3QgY29tbGlua1dvcmtlciA9IENvbWxpbmsud3JhcDxJbnRlcm5hbFdlYldvcmtlckFwaT4ocmF3V29ya2VyKVxuXG4gIHJhd1dvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBlYXJseU1lc3NhZ2VIYW5kbGVyKVxuXG4gIC8vIEhlbHBlciB0byBzZXJpYWxpemUgUmVhY3QgZWxlbWVudHMgZm9yIGNyb3NzLXdvcmtlciBjb21tdW5pY2F0aW9uXG4gIGZ1bmN0aW9uIHNlcmlhbGl6ZVJlYWN0RWxlbWVudChlbGVtZW50OiBhbnkpOiBhbnkge1xuICAgIGlmICghZWxlbWVudCB8fCB0eXBlb2YgZWxlbWVudCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGhpcyBpcyBhIFJlYWN0IGVsZW1lbnRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9faXNTZXJpYWxpemVkUmVhY3RFbGVtZW50OiB0cnVlLFxuICAgICAgICB0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgIHByb3BzOiBzZXJpYWxpemVQcm9wcyhlbGVtZW50LnByb3BzKSxcbiAgICAgICAga2V5OiBlbGVtZW50LmtleSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudFxuICB9XG5cbiAgZnVuY3Rpb24gc2VyaWFsaXplUHJvcHMocHJvcHM6IGFueSk6IGFueSB7XG4gICAgaWYgKCFwcm9wcyB8fCB0eXBlb2YgcHJvcHMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBwcm9wc1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWQ6IGFueSA9IHt9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMpKSB7XG4gICAgICBpZiAoa2V5ID09PSBcImNoaWxkcmVuXCIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgc2VyaWFsaXplZC5jaGlsZHJlbiA9IHZhbHVlLm1hcChzZXJpYWxpemVSZWFjdEVsZW1lbnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VyaWFsaXplZC5jaGlsZHJlbiA9IHNlcmlhbGl6ZVJlYWN0RWxlbWVudCh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VyaWFsaXplZFtrZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWRcbiAgfVxuXG4gIC8vIENvbmRpdGlvbmFsbHkgb3ZlcnJpZGUgZ2xvYmFsIGZldGNoIGluc2lkZSB0aGUgd29ya2VyIHRvIHJvdXRlIHRocm91Z2ggdGhlIHBhcmVudFxuICAvLyBPbmx5IGVuYWJsZSB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHZpYSBjb25maWd1cmF0aW9uXG4gIGlmIChjb25maWd1cmF0aW9uLmVuYWJsZUZldGNoUHJveHkpIHtcbiAgICByYXdXb3JrZXIucG9zdE1lc3NhZ2UoeyB0eXBlOiBcIm92ZXJyaWRlX2dsb2JhbF9mZXRjaFwiIH0pXG4gIH1cblxuICBpZiAoY29uZmlndXJhdGlvbi5kaXNhYmxlQ2RuTG9hZGluZykge1xuICAgIGF3YWl0IGNvbWxpbmtXb3JrZXIuc2V0RGlzYWJsZUNkbkxvYWRpbmcodHJ1ZSlcbiAgfVxuXG4gIGlmIChjb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybCkge1xuICAgIGF3YWl0IGNvbWxpbmtXb3JrZXIuc2V0U25pcHBldHNBcGlCYXNlVXJsKGNvbmZpZ3VyYXRpb24uc25pcHBldHNBcGlCYXNlVXJsKVxuICB9XG5cbiAgY29uc3QgbWF5YmVQcm94eSA9ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gQ29tbGluay5wcm94eSh2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbiAgaWYgKGNvbmZpZ3VyYXRpb24ucGxhdGZvcm0pIHtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZ2V0T2JqZWN0UGF0aHMoY29uZmlndXJhdGlvbi5wbGF0Zm9ybSkpIHtcbiAgICAgIGF3YWl0IGNvbWxpbmtXb3JrZXJcbiAgICAgICAgLnNldFBsYXRmb3JtQ29uZmlnUHJvcGVydHkoXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBtYXliZVByb3h5KGdldFZhbHVlQXRQYXRoKGNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sIHBhdGgpKSxcbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3Igc2V0dGluZyBwbGF0Zm9ybSBjb25maWcgcHJvcGVydHkgJHtwYXRofTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCxcbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgfVxuICB9XG4gIGlmIChjb25maWd1cmF0aW9uLnByb2plY3RDb25maWcpIHtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZ2V0T2JqZWN0UGF0aHMoY29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnKSkge1xuICAgICAgYXdhaXQgY29tbGlua1dvcmtlclxuICAgICAgICAuc2V0UHJvamVjdENvbmZpZ1Byb3BlcnR5KFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgbWF5YmVQcm94eShnZXRWYWx1ZUF0UGF0aChjb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsIHBhdGgpKSxcbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3Igc2V0dGluZyBwcm9qZWN0IGNvbmZpZyBwcm9wZXJ0eSAke3BhdGh9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gLFxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBsZXQgaXNUZXJtaW5hdGVkID0gZmFsc2VcblxuICAvLyBDcmVhdGUgYSB3cmFwcGVyIHRoYXQgaGFuZGxlcyBldmVudHMgZGlyZWN0bHkgdGhyb3VnaCBjaXJjdWl0IGluc3RhbmNlXG4gIGNvbnN0IHdyYXBwZXI6IENpcmN1aXRXZWJXb3JrZXIgPSB7XG4gICAgY2xlYXJFdmVudExpc3RlbmVyczogY29tbGlua1dvcmtlci5jbGVhckV2ZW50TGlzdGVuZXJzLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgZW5hYmxlRGVidWc6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGVuYWJsZURlYnVnXCIpXG4gICAgICB9XG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5lbmFibGVEZWJ1Zy5iaW5kKGNvbWxpbmtXb3JrZXIpKC4uLmFyZ3MpXG4gICAgfSxcbiAgICB2ZXJzaW9uOiBjb21saW5rV29ya2VyLnZlcnNpb24uYmluZChjb21saW5rV29ya2VyKSxcbiAgICBleGVjdXRlOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBleGVjdXRlXCIpXG4gICAgICB9XG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlLmJpbmQoY29tbGlua1dvcmtlcikoLi4uYXJncylcbiAgICB9LFxuICAgIGV4ZWN1dGVDb21wb25lbnQ6IGFzeW5jIChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBleGVjdXRlQ29tcG9uZW50XCIsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gSWYgaXQncyBhIGZ1bmN0aW9uLCBwYXNzIGl0IGFzLWlzICh3aWxsIGJlIHByb3hpZWQgYnkgQ29tbGluaylcbiAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZUNvbXBvbmVudC5iaW5kKGNvbWxpbmtXb3JrZXIpKGNvbXBvbmVudClcbiAgICAgIH1cblxuICAgICAgLy8gSWYgaXQncyBhIFJlYWN0IGVsZW1lbnQsIHNlcmlhbGl6ZSBpdCB0byBhIHJlY29uc3RydWN0YWJsZSBmb3JtYXRcbiAgICAgIGlmIChjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudCA9PT0gXCJvYmplY3RcIiAmJiBjb21wb25lbnQudHlwZSkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkRWxlbWVudCA9IHNlcmlhbGl6ZVJlYWN0RWxlbWVudChjb21wb25lbnQpXG4gICAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVDb21wb25lbnQuYmluZChjb21saW5rV29ya2VyKShcbiAgICAgICAgICBzZXJpYWxpemVkRWxlbWVudCxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlQ29tcG9uZW50LmJpbmQoY29tbGlua1dvcmtlcikoY29tcG9uZW50KVxuICAgIH0sXG4gICAgZXhlY3V0ZVdpdGhGc01hcDogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChpc1Rlcm1pbmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2lyY3VpdFdlYldvcmtlciB3YXMgdGVybWluYXRlZCwgY2FuJ3QgZXhlY3V0ZVdpdGhGc01hcFwiLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlV2l0aEZzTWFwLmJpbmQoY29tbGlua1dvcmtlcikoLi4uYXJncylcbiAgICB9LFxuICAgIHJlbmRlclVudGlsU2V0dGxlZDogY29tbGlua1dvcmtlci5yZW5kZXJVbnRpbFNldHRsZWQuYmluZChjb21saW5rV29ya2VyKSxcbiAgICBnZXRDaXJjdWl0SnNvbjogY29tbGlua1dvcmtlci5nZXRDaXJjdWl0SnNvbi5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIG9uOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkgPT4ge1xuICAgICAgY29uc3QgcHJveGllZENhbGxiYWNrID0gQ29tbGluay5wcm94eShjYWxsYmFjaylcbiAgICAgIGNvbWxpbmtXb3JrZXIub24oZXZlbnQgYXMgUm9vdENpcmN1aXRFdmVudE5hbWUsIHByb3hpZWRDYWxsYmFjaylcbiAgICB9LFxuICAgIGtpbGw6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbWxpbmtXb3JrZXJbQ29tbGluay5yZWxlYXNlUHJveHldKClcbiAgICAgIHJhd1dvcmtlci50ZXJtaW5hdGUoKVxuICAgICAgaXNUZXJtaW5hdGVkID0gdHJ1ZVxuICAgICAgaWYgKGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9PT0gd3JhcHBlcikge1xuICAgICAgICBnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9LFxuICB9XG4gIDsod3JhcHBlciBhcyBhbnkpLl9fcmF3V29ya2VyID0gcmF3V29ya2VyXG4gIGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9IHdyYXBwZXJcbiAgcmV0dXJuIHdyYXBwZXJcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL3J1bm5lci9ub3JtYWxpemVGc01hcFwiXG5cbmV4cG9ydCBjb25zdCBnZXRQb3NzaWJsZUVudHJ5cG9pbnRDb21wb25lbnRQYXRocyA9IChcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRGc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIGZvciAoY29uc3QgW3BhdGgsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGZzTWFwKSkge1xuICAgIG5vcm1hbGl6ZWRGc01hcFtub3JtYWxpemVGaWxlUGF0aChwYXRoKV0gPSBjb250ZW50XG4gIH1cblxuICBjb25zdCBwb3NzaWJsZSA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgaWYgKFwidHNjaXJjdWl0LmNvbmZpZy5qc29uXCIgaW4gbm9ybWFsaXplZEZzTWFwKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2Uobm9ybWFsaXplZEZzTWFwW1widHNjaXJjdWl0LmNvbmZpZy5qc29uXCJdKVxuICAgICAgaWYgKHR5cGVvZiBjb25maWcubWFpbkVudHJ5cG9pbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcG9zc2libGUuYWRkKG5vcm1hbGl6ZUZpbGVQYXRoKGNvbmZpZy5tYWluRW50cnlwb2ludCkpXG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBpZ25vcmUgKi9cbiAgICB9XG4gIH1cblxuICBpZiAobm9ybWFsaXplZEZzTWFwW1wiaW5kZXgudHN4XCJdKSBwb3NzaWJsZS5hZGQoXCJpbmRleC50c3hcIilcbiAgaWYgKG5vcm1hbGl6ZWRGc01hcFtcImluZGV4LnRzXCJdKSBwb3NzaWJsZS5hZGQoXCJpbmRleC50c1wiKVxuXG4gIGNvbnN0IGNpcmN1aXRGaWxlcyA9IE9iamVjdC5rZXlzKG5vcm1hbGl6ZWRGc01hcCkuZmlsdGVyKChrKSA9PlxuICAgIGsuZW5kc1dpdGgoXCIuY2lyY3VpdC50c3hcIiksXG4gIClcbiAgZm9yIChjb25zdCBmaWxlIG9mIGNpcmN1aXRGaWxlcykge1xuICAgIHBvc3NpYmxlLmFkZChmaWxlKVxuICB9XG5cbiAgY29uc3QgdHN4RmlsZXMgPSBPYmplY3Qua2V5cyhub3JtYWxpemVkRnNNYXApLmZpbHRlcigoaykgPT5cbiAgICBrLmVuZHNXaXRoKFwiLnRzeFwiKSxcbiAgKVxuICBpZiAodHN4RmlsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgcG9zc2libGUuYWRkKHRzeEZpbGVzWzBdKVxuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20ocG9zc2libGUpXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxtQkFBbUI7QUFFNUIsWUFBWSxtQkFBbUI7QUFDL0IsWUFBWSxXQUFXO0FBQ3ZCLFlBQVkscUJBQXFCO0FBQ2pDLFlBQVksd0JBQXdCOzs7QUNBN0IsSUFBTSxnQ0FBZ0MsQ0FDM0MsbUJBQ3VCO0FBRXZCLE1BQUksUUFBUSxlQUFlLE1BQU0sZ0JBQWdCO0FBQ2pELE1BQUksTUFBTyxRQUFPLE1BQU0sQ0FBQztBQUl6QixVQUFRLGVBQWU7QUFBQSxJQUNyQjtBQUFBLEVBQ0Y7QUFDQSxNQUFJLE1BQU8sUUFBTyxNQUFNLENBQUM7QUFFekIsU0FBTztBQUNUOzs7QUNoQk8sSUFBTSxxQ0FBcUMsQ0FDaEQsc0JBQ1c7QUFDWCxNQUFJLGtCQUFrQixTQUFTLEtBQUssR0FBRztBQUNyQyxXQUFPLGtCQUFrQixRQUFRLFFBQVEsRUFBRTtBQUFBLEVBQzdDO0FBQ0EsU0FBTztBQUNUOzs7QUNKTyxJQUFNLHVCQUF1QixDQUNsQyxjQUN1QjtBQUN2QixNQUFJLENBQUMsVUFBVyxRQUFPO0FBRXZCLE1BQUksVUFBVSxXQUFXLFFBQVEsR0FBRztBQUNsQyxVQUFNLG9CQUFvQiw4QkFBOEIsU0FBUztBQUNqRSxRQUFJLG1CQUFtQjtBQUNyQixhQUFPLG1DQUFtQyxpQkFBaUI7QUFBQSxJQUM3RDtBQUdBLFdBQU87QUFBQSxFQUNUO0FBR0EsU0FBTyxtQ0FBbUMsU0FBUztBQUNyRDs7O0FDckJPLElBQU0sUUFBUSxvQkFBSSxJQUFpQjtBQUUxQyxJQUFNLG9CQUFvQixPQUFPLE1BQVcsV0FBZ0I7QUFDMUQsUUFBTSxjQUFjLElBQUksZ0JBQWdCO0FBQUEsSUFDdEMsR0FBRztBQUFBLElBQ0gsTUFBTTtBQUFBLEVBQ1IsQ0FBQyxFQUFFLFNBQVM7QUFDWixNQUFJLE1BQU0s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LE9BQStCLGVBQWU7QUFBQSxJQUNqRTtBQUFBLElBQ0EsTUFBTSxZQUFZO0FBQ2hCLG9CQUFzQixvQkFBWSxFQUFFO0FBQ3BDLGdCQUFVLFVBQVU7QUFDcEIscUJBQWU7QUFDZixVQUFJLFdBQVcsb0NBQW9DLFNBQVM7QUFDMUQsbUJBQVcsa0NBQWtDO0FBQUEsTUFDL0M7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNDLEVBQUMsUUFBZ0IsY0FBYztBQUNoQyxhQUFXLGtDQUFrQztBQUM3QyxTQUFPO0FBQ1Q7OztBQ3JSTyxJQUFNLHNDQUFzQyxDQUNqRCxVQUNhO0FBQ2IsUUFBTSxrQkFBMEMsQ0FBQztBQUNqRCxhQUFXLENBQUMsTUFBTSxPQUFPLEtBQUssT0FBTyxRQUFRLEtBQUssR0FBRztBQUNuRCxvQkFBZ0Isa0JBQWtCLElBQUksQ0FBQyxJQUFJO0FBQUEsRUFDN0M7QUFFQSxRQUFNLFdBQVcsb0JBQUksSUFBWTtBQUVqQyxNQUFJLDJCQUEyQixpQkFBaUI7QUFDOUMsUUFBSTtBQUNGLFlBQU0sU0FBUyxLQUFLLE1BQU0sZ0JBQWdCLHVCQUF1QixDQUFDO0FBQ2xFLFVBQUksT0FBTyxPQUFPLG1CQUFtQixVQUFVO0FBQzdDLGlCQUFTLElBQUksa0JBQWtCLE9BQU8sY0FBYyxDQUFDO0FBQUEsTUFDdkQ7QUFBQSxJQUNGLFFBQVE7QUFBQSxJQUVSO0FBQUEsRUFDRjtBQUVBLE1BQUksZ0JBQWdCLFdBQVcsRUFBRyxVQUFTLElBQUksV0FBVztBQUMxRCxNQUFJLGdCQUFnQixVQUFVLEVBQUcsVUFBUyxJQUFJLFVBQVU7QUFFeEQsUUFBTSxlQUFlLE9BQU8sS0FBSyxlQUFlLEVBQUU7QUFBQSxJQUFPLENBQUMsTUFDeEQsRUFBRSxTQUFTLGNBQWM7QUFBQSxFQUMzQjtBQUNBLGFBQVcsUUFBUSxjQUFjO0FBQy9CLGFBQVMsSUFBSSxJQUFJO0FBQUEsRUFDbkI7QUFFQSxRQUFNLFdBQVcsT0FBTyxLQUFLLGVBQWUsRUFBRTtBQUFBLElBQU8sQ0FBQyxNQUNwRCxFQUFFLFNBQVMsTUFBTTtBQUFBLEVBQ25CO0FBQ0EsTUFBSSxTQUFTLFdBQVcsR0FBRztBQUN6QixhQUFTLElBQUksU0FBUyxDQUFDLENBQUM7QUFBQSxFQUMxQjtBQUVBLFNBQU8sTUFBTSxLQUFLLFFBQVE7QUFDNUI7IiwKICAibmFtZXMiOiBbIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgImltcG9ydE5hbWUiLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAidW5wcmVmaXhlZFBhdGgiLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciXQp9Cg==
2056
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbGliL2V2YWwvZXhlY3V0aW9uLWNvbnRleHQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9mb290cHJpbnQtdHJhbnNsYXRvcnMvZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvZm9vdHByaW50LXRyYW5zbGF0b3JzL2dldC1qbGMtcGFja2FnZS1mcm9tLWZvb3RwcmludGVyLXN0cmluZy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2Zvb3RwcmludC10cmFuc2xhdG9ycy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2psYy1wYXJ0cy1lbmdpbmUudHMiLCAiLi4vLi4vbGliL2dldFBsYXRmb3JtQ29uZmlnLnRzIiwgIi4uLy4uL2xpYi91dGlscy9keW5hbWljYWxseS1sb2FkLWRlcGVuZGVuY3ktd2l0aC1jZG4tYmFja3VwLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvbm9ybWFsaXplRnNNYXAudHMiLCAiLi4vLi4vbGliL3V0aWxzL2Rpcm5hbWUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci90c2NvbmZpZ1BhdGhzLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcmVzb2x2ZUZpbGVQYXRoLnRzIiwgIi4uLy4uL2xpYi91dGlscy9nZXQtaW1wb3J0cy1mcm9tLWNvZGUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vbGliL2V2YWwvZXZhbC1jb21waWxlZC1qcy50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtbG9jYWwtZmlsZS50cyIsICIuLi8uLi9saWIvc2hhcmVkL3N0YXRpYy1hc3NldC1leHRlbnNpb25zLnRzIiwgIi4uLy4uL2xpYi90cmFuc3BpbGUvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZS50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtc25pcHBldC50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vbGliL2V2YWwvZXh0cmFjdEJhc2VQYWNrYWdlTmFtZS50cyIsICIuLi8uLi9saWIvZXZhbC9pc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24udHMiLCAiLi4vLi4vbGliL2V2YWwvZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeS50cyIsICIuLi8uLi9saWIvZXZhbC9nZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQudHMiLCAiLi4vLi4vbGliL2V2YWwvaXNUeXBlU2NyaXB0RW50cnlwb2ludC50cyIsICIuLi8uLi9saWIvZXZhbC9pc0Rpc3REaXJFbXB0eS50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtbnBtLXBhY2thZ2UudHMiLCAiLi4vLi4vbGliL2V2YWwvaW1wb3J0LWV2YWwtcGF0aC50cyIsICIuLi8uLi9saWIvcnVubmVyL0NpcmN1aXRSdW5uZXIudHMiLCAiLi4vLi4vbGliL3J1bm5lci9zZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQudHMiLCAiLi4vLi4vbGliL3V0aWxzL2VuaGFuY2Utcm9vdC1jaXJjdWl0LWVycm9yLnRzIiwgIi4uLy4uL2xpYi9zaGFyZWQvb2JqLXBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci9ydW5Uc2NpcmN1aXRDb2RlLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcnVuVHNjaXJjdWl0TW9kdWxlLnRzIiwgIi4uLy4uL2xpYi93b3JrZXIudHMiLCAiLi4vLi4vbGliL2dldFBvc3NpYmxlRW50cnlwb2ludENvbXBvbmVudFBhdGhzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBSb290Q2lyY3VpdCB9IGZyb20gXCJAdHNjaXJjdWl0L2NvcmVcIlxuaW1wb3J0IHR5cGUgeyBXZWJXb3JrZXJDb25maWd1cmF0aW9uIH0gZnJvbSBcImxpYi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0ICogYXMgdHNjaXJjdWl0Q29yZSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgKiBhcyBSZWFjdEpzeFJ1bnRpbWUgZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdE1hdGhVdGlscyBmcm9tIFwiQHRzY2lyY3VpdC9tYXRoLXV0aWxzXCJcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBnZXRQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJsaWIvZ2V0UGxhdGZvcm1Db25maWdcIlxuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZyB9IGZyb20gXCJsaWIvcnVubmVyL3RzY29uZmlnUGF0aHNcIlxuaW1wb3J0ICogYXMgdHNsaWIgZnJvbSBcInRzbGliXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmV4ZWN1dGlvbi1jb250ZXh0XCIpXG5cbmludGVyZmFjZSBTdG9yZWRMb2dnZXIge1xuICBpbmZvOiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkXG4gIGdldExvZ3M6ICgpID0+IEFycmF5PHsgbXNnOiBzdHJpbmcgfT5cbiAgc3RyaW5naWZ5TG9nczogKCkgPT4gc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uQ29udGV4dCBleHRlbmRzIFdlYldvcmtlckNvbmZpZ3VyYXRpb24ge1xuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBlbnRyeXBvaW50OiBzdHJpbmdcbiAgcHJlU3VwcGxpZWRJbXBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIGNpcmN1aXQ6IFJvb3RDaXJjdWl0XG4gIGxvZ2dlcjogU3RvcmVkTG9nZ2VyXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbiAgaW1wb3J0U3RhY2s6IHN0cmluZ1tdXG4gIGN1cnJlbnRseUltcG9ydGluZzogU2V0PHN0cmluZz5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gIHdlYldvcmtlckNvbmZpZ3VyYXRpb246IFdlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIG9wdHM6IHtcbiAgICBuYW1lPzogc3RyaW5nXG4gICAgcGxhdGZvcm0/OiBQbGF0Zm9ybUNvbmZpZ1xuICAgIHByb2plY3RDb25maWc/OiBQYXJ0aWFsPFBsYXRmb3JtQ29uZmlnPlxuICAgIGRlYnVnTmFtZXNwYWNlPzogc3RyaW5nXG4gIH0gPSB7fSxcbik6IEV4ZWN1dGlvbkNvbnRleHQge1xuICBnbG9iYWxUaGlzLlJlYWN0ID0gUmVhY3RcblxuICBjb25zdCBiYXNlUGxhdGZvcm0gPSBvcHRzLnBsYXRmb3JtIHx8IGdldFBsYXRmb3JtQ29uZmlnKClcbiAgY29uc3QgcGxhdGZvcm0gPSBvcHRzLnByb2plY3RDb25maWdcbiAgICA/IHsgLi4uYmFzZVBsYXRmb3JtLCAuLi5vcHRzLnByb2plY3RDb25maWcgfVxuICAgIDogYmFzZVBsYXRmb3JtXG5cbiAgaWYgKHBsYXRmb3JtLnBhcnRzRW5naW5lRGlzYWJsZWQpIHtcbiAgICBwbGF0Zm9ybS5wYXJ0c0VuZ2luZSA9IHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgY2lyY3VpdCA9IG5ldyBSb290Q2lyY3VpdCh7XG4gICAgcGxhdGZvcm0sXG4gIH0pXG5cbiAgaWYgKG9wdHMubmFtZSkge1xuICAgIGNpcmN1aXQubmFtZSA9IG9wdHMubmFtZVxuICB9XG5cbiAgaWYgKG9wdHMuZGVidWdOYW1lc3BhY2UpIHtcbiAgICBjaXJjdWl0LmVuYWJsZURlYnVnKG9wdHMuZGVidWdOYW1lc3BhY2UpXG4gIH1cblxuICBjb25zdCBsb2dzOiBBcnJheTx7IG1zZzogc3RyaW5nIH0+ID0gW11cblxuICByZXR1cm4ge1xuICAgIGZzTWFwOiB7fSxcbiAgICBlbnRyeXBvaW50OiBcIlwiLFxuICAgIGxvZ2dlcjoge1xuICAgICAgaW5mbzogKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICAgICAgICBsb2dzLnB1c2goeyBtc2c6IG1lc3NhZ2UgfSlcbiAgICAgIH0sXG4gICAgICBnZXRMb2dzOiAoKSA9PiBsb2dzLFxuICAgICAgc3RyaW5naWZ5TG9nczogKCkgPT4gbG9ncy5tYXAoKGxvZykgPT4gbG9nLm1zZykuam9pbihcIlxcblwiKSxcbiAgICB9LFxuICAgIHByZVN1cHBsaWVkSW1wb3J0czoge1xuICAgICAgXCJAdHNjaXJjdWl0L2NvcmVcIjogdHNjaXJjdWl0Q29yZSxcbiAgICAgIHRzY2lyY3VpdDogdHNjaXJjdWl0Q29yZSxcbiAgICAgIFwiQHRzY2lyY3VpdC9tYXRoLXV0aWxzXCI6IHRzY2lyY3VpdE1hdGhVdGlscyxcbiAgICAgIHJlYWN0OiBSZWFjdCxcbiAgICAgIFwicmVhY3QvanN4LXJ1bnRpbWVcIjogUmVhY3RKc3hSdW50aW1lLFxuICAgICAgZGVidWc6IERlYnVnLFxuICAgICAgdHNsaWIsXG5cbiAgICAgIC8vIFRoaXMgaXMgdXN1YWxseSB1c2VkIGFzIGEgdHlwZSBpbXBvcnQsIHdlIGNhbiByZW1vdmUgdGhlIHNoaW0gd2hlbiB3ZVxuICAgICAgLy8gaWdub3JlIHR5cGUgaW1wb3J0cyBpbiBnZXRJbXBvcnRzRnJvbUNvZGVcbiAgICAgIFwiQHRzY2lyY3VpdC9wcm9wc1wiOiB7fSxcbiAgICB9LFxuICAgIGNpcmN1aXQsXG4gICAgdHNDb25maWc6IG51bGwsXG4gICAgaW1wb3J0U3RhY2s6IFtdLFxuICAgIGN1cnJlbnRseUltcG9ydGluZzogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgLi4ud2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgfVxufVxuIiwgIi8qKlxuICogVHJhbnNmb3JtcyBhIEtpQ2FkIGZvb3RwcmludCBzdHJpbmcgaW50byBhIGdlbmVyaWMgXCJmb290cHJpbnRlciBzdHJpbmdcIi5cbiAqIEZvciBub3csIHRoaXMgaXMgYSBzaW1wbGlmaWVkIGNvbnZlcnNpb24gdG8gYSBzdGFuZGFyZCBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwia2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljXCIgLT4gXCIwNjAzXCJcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkID0gKFxuICBraWNhZEZvb3RwcmludDogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgLy8ga2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljIC0+IDA2MDNcbiAgbGV0IG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goLzpbUkNdXyhcXGR7NH0pXy8pXG4gIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdXG5cbiAgLy8ga2ljYWQ6UGFja2FnZV9TTzpTT0lDLThfMy45eDQuOW1tX1AxLjI3bW0gLT4gU09JQy04XG4gIC8vIGtpY2FkOlBhY2thZ2VfVE9fU09UX1NNRDpTT1QtMjMgLT4gU09ULTIzXG4gIG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goXG4gICAgLzooU09JQy1cXGQrfFNPVC1cXGQrfFNPRC1cXGQrfFNTT1AtXFxkK3xUU1NPUC1cXGQrfFFGUC1cXGQrfFFGTi1cXGQrKS8sXG4gIClcbiAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG4iLCAiLyoqXG4gKiBUcmFuc2Zvcm1zIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiIGludG8gYSBKTEMtY29tcGF0aWJsZSBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwiY2FwMDYwM1wiIC0+IFwiMDYwM1wiXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nID0gKFxuICBmb290cHJpbnRlclN0cmluZzogc3RyaW5nLFxuKTogc3RyaW5nID0+IHtcbiAgaWYgKGZvb3RwcmludGVyU3RyaW5nLmluY2x1ZGVzKFwiY2FwXCIpKSB7XG4gICAgcmV0dXJuIGZvb3RwcmludGVyU3RyaW5nLnJlcGxhY2UoL2NhcC9nLCBcIlwiKVxuICB9XG4gIHJldHVybiBmb290cHJpbnRlclN0cmluZ1xufVxuIiwgImltcG9ydCB7IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkIH0gZnJvbSBcIi4vZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkXCJcbmltcG9ydCB7IGdldEpsY1BhY2thZ2VGcm9tRm9vdHByaW50ZXJTdHJpbmcgfSBmcm9tIFwiLi9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmdcIlxuXG4vKipcbiAqIEdldCBhIEpMQy1jb21wYXRpYmxlIHBhY2thZ2UgbmFtZSBmcm9tIGEgZm9vdHByaW50IHN0cmluZywgd2hpY2ggY291bGQgYmVcbiAqIGEgS2lDYWQgZm9vdHByaW50IG9yIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiLlxuICovXG5leHBvcnQgY29uc3QgZ2V0SmxjcGNiUGFja2FnZU5hbWUgPSAoXG4gIGZvb3RwcmludDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFmb290cHJpbnQpIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoZm9vdHByaW50LnN0YXJ0c1dpdGgoXCJraWNhZDpcIikpIHtcbiAgICBjb25zdCBmb290cHJpbnRlclN0cmluZyA9IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkKGZvb3RwcmludClcbiAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmcpIHtcbiAgICAgIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludGVyU3RyaW5nKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciB1bi1tYXRjaGVkIEtpQ2FkIHN0cmluZ3NcbiAgICByZXR1cm4gZm9vdHByaW50XG4gIH1cblxuICAvLyBOb3QgYSBLaUNhZCBzdHJpbmcsIGFzc3VtZSBpdCdzIGEgZm9vdHByaW50ZXIgc3RyaW5nXG4gIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBhcnRzRW5naW5lLCBTdXBwbGllclBhcnROdW1iZXJzIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgZ2V0SmxjcGNiUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYW55PigpXG5cbmNvbnN0IGdldEpsY1BhcnRzQ2FjaGVkID0gYXN5bmMgKG5hbWU6IGFueSwgcGFyYW1zOiBhbnkpID0+IHtcbiAgY29uc3QgcGFyYW1TdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAuLi5wYXJhbXMsXG4gICAganNvbjogXCJ0cnVlXCIsXG4gIH0pLnRvU3RyaW5nKClcbiAgaWYgKGNhY2hlLmhhcyhwYXJhbVN0cmluZykpIHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KHBhcmFtU3RyaW5nKVxuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgYGh0dHBzOi8vamxjc2VhcmNoLnRzY2lyY3VpdC5jb20vJHtuYW1lfS9saXN0PyR7cGFyYW1TdHJpbmd9YCxcbiAgKVxuICBjb25zdCByZXNwb25zZUpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgY2FjaGUuc2V0KHBhcmFtU3RyaW5nLCByZXNwb25zZUpzb24pXG4gIHJldHVybiByZXNwb25zZUpzb25cbn1cblxuY29uc3Qgd2l0aEJhc2ljUGFydFByZWZlcmVuY2UgPSAocGFydHM6IGFueVtdIHwgdW5kZWZpbmVkKSA9PiB7XG4gIGlmICghcGFydHMpIHJldHVybiBbXVxuICByZXR1cm4gWy4uLnBhcnRzXS5zb3J0KFxuICAgIChhLCBiKSA9PiBOdW1iZXIoYi5pc19iYXNpYyA/PyBmYWxzZSkgLSBOdW1iZXIoYS5pc19iYXNpYyA/PyBmYWxzZSksXG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IGpsY1BhcnRzRW5naW5lOiBQYXJ0c0VuZ2luZSA9IHtcbiAgZmluZFBhcnQ6IGFzeW5jICh7XG4gICAgc291cmNlQ29tcG9uZW50LFxuICAgIGZvb3RwcmludGVyU3RyaW5nLFxuICB9KTogUHJvbWlzZTxTdXBwbGllclBhcnROdW1iZXJzPiA9PiB7XG4gICAgY29uc3QgamxjcGNiUGFja2FnZSA9IGdldEpsY3BjYlBhY2thZ2VOYW1lKGZvb3RwcmludGVyU3RyaW5nKVxuXG4gICAgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Jlc2lzdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcmVzaXN0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc2lzdG9yc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5yZXNpc3RhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNpc3RvcnMpXG4gICAgICAgICAgLm1hcCgocjogYW55KSA9PiBgQyR7ci5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2FwYWNpdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY2FwYWNpdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjYXBhY2l0b3JzXCIsIHtcbiAgICAgICAgY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5jYXBhY2l0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY2FwYWNpdG9ycylcbiAgICAgICAgICAubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9waW5faGVhZGVyXCJcbiAgICApIHtcbiAgICAgIGxldCBwaXRjaDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmc/LmluY2x1ZGVzKFwiX3BcIikpIHtcbiAgICAgICAgcGl0Y2ggPSBOdW1iZXIoZm9vdHByaW50ZXJTdHJpbmcuc3BsaXQoXCJfcFwiKVsxXSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXG4gICAgICAgIFwiaGVhZGVyc1wiLFxuICAgICAgICBwaXRjaFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwaXRjaDogcGl0Y2gsXG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9LFxuICAgICAgKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShoZWFkZXJzKVxuICAgICAgICAgIC5tYXAoKGg6IGFueSkgPT4gYEMke2gubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3BvdGVudGlvbWV0ZXJcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBwb3RlbnRpb21ldGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJwb3RlbnRpb21ldGVyc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5tYXhfcmVzaXN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHBvdGVudGlvbWV0ZXJzKVxuICAgICAgICAgIC5tYXAoKHA6IGFueSkgPT4gYEMke3AubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2Rpb2RlXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgZGlvZGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImRpb2Rlc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShkaW9kZXMpXG4gICAgICAgICAgLm1hcCgoZDogYW55KSA9PiBgQyR7ZC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2hpcFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGNoaXBzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImNoaXBzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGNoaXBzKVxuICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gYEMke2MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3RyYW5zaXN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyB0cmFuc2lzdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJ0cmFuc2lzdG9yc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICAgIHRyYW5zaXN0b3JfdHlwZTogc291cmNlQ29tcG9uZW50LnRyYW5zaXN0b3JfdHlwZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHRyYW5zaXN0b3JzKVxuICAgICAgICAgIC5tYXAoKHQ6IGFueSkgPT4gYEMke3QubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Bvd2VyX3NvdXJjZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHBvd2VyX3NvdXJjZXMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicG93ZXJfc291cmNlc1wiLCB7XG4gICAgICAgIHZvbHRhZ2U6IHNvdXJjZUNvbXBvbmVudC52b2x0YWdlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocG93ZXJfc291cmNlcylcbiAgICAgICAgICAubWFwKChwOiBhbnkpID0+IGBDJHtwLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9pbmR1Y3RvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGluZHVjdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJpbmR1Y3RvcnNcIiwge1xuICAgICAgICBpbmR1Y3RhbmNlOiBzb3VyY2VDb21wb25lbnQuaW5kdWN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGluZHVjdG9ycylcbiAgICAgICAgICAubWFwKChpOiBhbnkpID0+IGBDJHtpLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9jcnlzdGFsXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY3J5c3RhbHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiY3J5c3RhbHNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIGxvYWRfY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5sb2FkX2NhcGFjaXRhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY3J5c3RhbHMpXG4gICAgICAgICAgLm1hcCgoYzogYW55KSA9PiBgQyR7Yy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbW9zZmV0XCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbW9zZmV0cyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJtb3NmZXRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgICAgbW9zZmV0X21vZGU6IHNvdXJjZUNvbXBvbmVudC5tb3NmZXRfbW9kZSxcbiAgICAgICAgY2hhbm5lbF90eXBlOiBzb3VyY2VDb21wb25lbnQuY2hhbm5lbF90eXBlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UobW9zZmV0cylcbiAgICAgICAgICAubWFwKChtOiBhbnkpID0+IGBDJHttLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9yZXNvbmF0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyByZXNvbmF0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc29uYXRvcnNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNvbmF0b3JzKVxuICAgICAgICAgIC5tYXAoKHI6IGFueSkgPT4gYEMke3IubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3N3aXRjaFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHN3aXRjaGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInN3aXRjaGVzXCIsIHtcbiAgICAgICAgc3dpdGNoX3R5cGU6IHNvdXJjZUNvbXBvbmVudC50eXBlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2Uoc3dpdGNoZXMpXG4gICAgICAgICAgLm1hcCgoczogYW55KSA9PiBgQyR7cy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbGVkXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbGVkcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJsZWRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGxlZHMpXG4gICAgICAgICAgLm1hcCgobDogYW55KSA9PiBgQyR7bC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfZnVzZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGZ1c2VzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImZ1c2VzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGZ1c2VzKVxuICAgICAgICAgIC5tYXAoKGw6IGFueSkgPT4gYEMke2wubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9XG4gIH0sXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZywgU3BpY2VFbmdpbmUgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBqbGNQYXJ0c0VuZ2luZSB9IGZyb20gXCJAdHNjaXJjdWl0L3BhcnRzLWVuZ2luZVwiXG5pbXBvcnQgeyBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbiB9IGZyb20gXCJraWNhZC1jb21wb25lbnQtY29udmVydGVyXCJcbmltcG9ydCB7IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwIH0gZnJvbSBcIi4vdXRpbHMvZHluYW1pY2FsbHktbG9hZC1kZXBlbmRlbmN5LXdpdGgtY2RuLWJhY2t1cFwiXG5jb25zdCBLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMID0gXCJodHRwczovL2tpY2FkLW1vZC1jYWNoZS50c2NpcmN1aXQuY29tXCJcblxubGV0IG5nc3BpY2VFbmdpbmVDYWNoZTogU3BpY2VFbmdpbmUgfCBudWxsID0gbnVsbFxuXG5leHBvcnQgY29uc3QgZ2V0UGxhdGZvcm1Db25maWcgPSAoKTogUGxhdGZvcm1Db25maWcgPT4gKHtcbiAgcGFydHNFbmdpbmU6IGpsY1BhcnRzRW5naW5lLFxuICBzcGljZUVuZ2luZU1hcDoge1xuICAgIG5nc3BpY2U6IHtcbiAgICAgIHNpbXVsYXRlOiBhc3luYyAoc3BpY2U6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIW5nc3BpY2VFbmdpbmVDYWNoZSkge1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSA9XG4gICAgICAgICAgICBhd2FpdCBkeW5hbWljYWxseUxvYWREZXBlbmRlbmN5V2l0aENkbkJhY2t1cChcbiAgICAgICAgICAgICAgXCJAdHNjaXJjdWl0L25nc3BpY2Utc3BpY2UtZW5naW5lXCIsXG4gICAgICAgICAgICApLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJDb3VsZCBub3QgbG9hZCBuZ3NwaWNlIGVuZ2luZSBmcm9tIGxvY2FsIG5vZGVfbW9kdWxlcyBvciBDRE4gZmFsbGJhY2suXCIsXG4gICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChjcmVhdGVOZ3NwaWNlU3BpY2VFbmdpbmUpIHtcbiAgICAgICAgICAgIG5nc3BpY2VFbmdpbmVDYWNoZSA9IGF3YWl0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZ3NwaWNlRW5naW5lQ2FjaGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkNvdWxkIG5vdCBsb2FkIG5nc3BpY2UgZW5naW5lIGZyb20gbG9jYWwgbm9kZV9tb2R1bGVzIG9yIENETiBmYWxsYmFjay5cIixcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmdzcGljZUVuZ2luZUNhY2hlLnNpbXVsYXRlKHNwaWNlKVxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRMaWJyYXJ5TWFwOiB7XG4gICAga2ljYWQ6IGFzeW5jIChmb290cHJpbnROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMfS8ke2Zvb3RwcmludE5hbWV9YFxuICAgICAgY29uc3QgY2lyY3VpdEpzb25VcmwgPSBgJHtiYXNlVXJsfS5jaXJjdWl0Lmpzb25gXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChjaXJjdWl0SnNvblVybClcbiAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlcy5qc29uKClcbiAgICAgIC8vIEZpbHRlciBwY2Jfc2lsa3NjcmVlbl90ZXh0IHRvIG9ubHkga2VlcCBlbnRyaWVzIHdpdGggdGV4dCA9PT0gXCJSRUYqKlwiXG4gICAgICAvLyBBcHBseSBmaWx0ZXJpbmcgb25seSB0byBlbGVtZW50cyBjb21pbmcgZnJvbSB0aGUga2ljYWRfbW9kX3NlcnZlciByZXNwb25zZVxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBBcnJheS5pc0FycmF5KHJhdylcbiAgICAgICAgPyByYXcuZmlsdGVyKChlbCkgPT5cbiAgICAgICAgICAgIGVsPy50eXBlID09PSBcInBjYl9zaWxrc2NyZWVuX3RleHRcIiA/IGVsPy50ZXh0ID09PSBcIlJFRioqXCIgOiB0cnVlLFxuICAgICAgICAgIClcbiAgICAgICAgOiByYXdcbiAgICAgIGNvbnN0IHdybFVybCA9IGAke2Jhc2VVcmx9LndybGBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvb3RwcmludENpcmN1aXRKc29uOiBmaWx0ZXJlZCxcbiAgICAgICAgY2FkTW9kZWw6IHsgd3JsVXJsLCBtb2RlbFVuaXRUb01tU2NhbGU6IDIuNTQgfSxcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRGaWxlUGFyc2VyTWFwOiB7XG4gICAga2ljYWRfbW9kOiB7XG4gICAgICBsb2FkRnJvbVVybDogYXN5bmMgKHVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGtpY2FkQ29udGVudCA9IGF3YWl0IGZldGNoKHVybCkudGhlbigocmVzKSA9PiByZXMudGV4dCgpKVxuICAgICAgICBjb25zdCBraWNhZEpzb24gPSBhd2FpdCBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbihraWNhZENvbnRlbnQpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9vdHByaW50Q2lyY3VpdEpzb246IEFycmF5LmlzQXJyYXkoa2ljYWRKc29uKVxuICAgICAgICAgICAgPyBraWNhZEpzb25cbiAgICAgICAgICAgIDogW2tpY2FkSnNvbl0sXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pXG4iLCAiZXhwb3J0IGNvbnN0IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwID0gYXN5bmMgKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBGaXJzdCwgdHJ5IHRvIGltcG9ydCB1c2luZyBOb2RlLmpzIHJlc29sdXRpb25cbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQocGFja2FnZU5hbWUpXG4gICAgcmV0dXJuIG1vZHVsZS5kZWZhdWx0XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGxvYWQgJHtwYWNrYWdlTmFtZX0gbG9jYWxseSwgdHJ5aW5nIENETiBmYWxsYmFjay4uLmApXG4gICAgLy8gRmFsbGJhY2sgdG8gSnNEZWxpdnIgQ0ROIGZvciBicm93c2VyIGVudmlyb25tZW50c1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vJHtwYWNrYWdlTmFtZX0vK2VzbWAsXG4gICAgICApXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCAke3BhY2thZ2VOYW1lfSBmcm9tIENETjogJHtyZXMuc3RhdHVzVGV4dH1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjb25zdCBjb2RlID0gYXdhaXQgcmVzLnRleHQoKVxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjb2RlXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiB9KVxuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0OiBsb2FkZWRNb2R1bGUgfSA9IGF3YWl0IGltcG9ydCh1cmwpXG4gICAgICAgIHJldHVybiBsb2FkZWRNb2R1bGVcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGNkbkVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBDRE4gZmFsbGJhY2sgZm9yICR7cGFja2FnZU5hbWV9IGFsc28gZmFpbGVkOmAsIGNkbkVycm9yKVxuICAgICAgdGhyb3cgY2RuRXJyb3JcbiAgICB9XG4gIH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZykge1xuICBsZXQgbm9ybUZpbGVQYXRoID0gZmlsZVBhdGhcbiAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpXG4gIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC50cmltKClcbiAgaWYgKG5vcm1GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikpIHtcbiAgICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGguc2xpY2UoMilcbiAgfVxuICBpZiAobm9ybUZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnNsaWNlKDEpXG4gIH1cbiAgcmV0dXJuIG5vcm1GaWxlUGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRnNNYXAoZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgY29uc3Qgbm9ybWFsaXplZEZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBbZnNQYXRoLCBmaWxlQ29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZnNNYXApKSB7XG4gICAgbm9ybWFsaXplZEZzTWFwW25vcm1hbGl6ZUZpbGVQYXRoKGZzUGF0aCldID0gZmlsZUNvbnRlbnRcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZEZzTWFwXG59XG4iLCAiLyoqXG4gKiBSZXR1cm5zIHRoZSBkaXJlY3RvcnkgbmFtZSBvZiBhIHBhdGgsIHNpbWlsYXIgdG8gTm9kZS5qcyBwYXRoLmRpcm5hbWVcbiAqIFdvcmtzIG9uIGJvdGggVW5peCBhbmQgV2luZG93cyBwYXRoc1xuICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gZXh0cmFjdCB0aGUgZGlyZWN0b3J5IGZyb21cbiAqIEByZXR1cm5zIFRoZSBkaXJlY3RvcnkgcGFydCBvZiB0aGUgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlybmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXBhdGgpIHJldHVybiBcIi5cIlxuXG4gIC8vIE5vcm1hbGl6ZSBwYXRoIHNlcGFyYXRvcnMgdG8gZm9yd2FyZCBzbGFzaGVzXG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKVxuXG4gIC8vIFJlbW92ZSB0cmFpbGluZyBzbGFzaGVzXG4gIGNvbnN0IGNsZWFuUGF0aCA9IG5vcm1hbGl6ZWRQYXRoLnJlcGxhY2UoL1xcLyskLywgXCJcIilcblxuICAvLyBJZiB0aGVyZSBhcmUgbm8gc2xhc2hlcywgcmV0dXJuIFwiLlwiXG4gIGlmIChjbGVhblBhdGguaW5kZXhPZihcIi9cIikgPT09IC0xKSByZXR1cm4gXCIuXCJcblxuICAvLyBSZXR1cm4gZXZlcnl0aGluZyB1cCB0byB0aGUgbGFzdCBzbGFzaFxuICByZXR1cm4gY2xlYW5QYXRoLnN1YnN0cmluZygwLCBjbGVhblBhdGgubGFzdEluZGV4T2YoXCIvXCIpKSB8fCBcIi9cIlxufVxuIiwgImltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwiLi9kaXJuYW1lXCJcblxuLyoqXG4gKiBSZXNvbHZlIGFuIGltcG9ydFBhdGggcmVsYXRpdmUgdG8gYSBjd2QsIHN1cHBvcnRpbmcgLi4vLCAuLyBhbmQgYWJzb2x1dGUgcGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGg6IHN0cmluZywgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uXG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICBjb25zdCBwYXJlbnREaXIgPSBkaXJuYW1lKGN3ZClcbiAgICByZXR1cm4gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoLnNsaWNlKDMpLCBwYXJlbnREaXIpXG4gIH1cbiAgLy8gSGFuZGxlIGN1cnJlbnQgZGlyZWN0b3J5XG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSkge1xuICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGguc2xpY2UoMiksIGN3ZClcbiAgfVxuICAvLyBIYW5kbGUgYWJzb2x1dGUgcGF0aFxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIHJldHVybiBpbXBvcnRQYXRoLnNsaWNlKDEpXG4gIH1cbiAgLy8gSGFuZGxlIHJlbGF0aXZlIHBhdGhcbiAgcmV0dXJuIGAke2N3ZH0vJHtpbXBvcnRQYXRofWBcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcblxuZXhwb3J0IHR5cGUgVHNDb25maWcgPSB7XG4gIGNvbXBpbGVyT3B0aW9ucz86IHtcbiAgICBiYXNlVXJsPzogc3RyaW5nXG4gICAgcGF0aHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duXG4gIH1cbiAgZXh0ZW5kcz86IHN0cmluZyB8IHN0cmluZ1tdXG4gIGZpbGVzPzogc3RyaW5nW11cbiAgcmVmZXJlbmNlcz86IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICBpbmNsdWRlPzogc3RyaW5nW11cbiAgZXhjbHVkZT86IHN0cmluZ1tdXG4gIFtrZXk6IHN0cmluZ106IHVua25vd25cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzQ29uZmlnKFxuICBmc01hcE9yQWxsRmlsZVBhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nW10sXG4pOiBUc0NvbmZpZyB8IG51bGwge1xuICBpZiAoQXJyYXkuaXNBcnJheShmc01hcE9yQWxsRmlsZVBhdGhzKSkgcmV0dXJuIG51bGxcbiAgY29uc3QgdHNjb25maWdDb250ZW50ID0gZnNNYXBPckFsbEZpbGVQYXRoc1tcInRzY29uZmlnLmpzb25cIl1cbiAgaWYgKCF0c2NvbmZpZ0NvbnRlbnQpIHJldHVybiBudWxsXG4gIHRyeSB7XG4gICAgY29uc3Qgc2FuaXRpemVkQ29udGVudCA9IHRzY29uZmlnQ29udGVudC5yZXBsYWNlKFxuICAgICAgL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98XFwvXFwvLiovZyxcbiAgICAgIFwiXCIsXG4gICAgKSAvLyByZW1vdmUgY29tbWVudHNcblxuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc2FuaXRpemVkQ29udGVudCkgYXMgVHNDb25maWdcbiAgICByZXR1cm4gcGFyc2VkXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIHRzY29uZmlnLmpzb246ICR7ZS5tZXNzYWdlfWApXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaXRoVHNjb25maWdQYXRocyhvcHRzOiB7XG4gIGltcG9ydFBhdGg6IHN0cmluZ1xuICBub3JtYWxpemVkRmlsZVBhdGhNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgZXh0ZW5zaW9uczogc3RyaW5nW11cbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbFxuICB0c2NvbmZpZ0Rpcj86IHN0cmluZ1xufSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgICB0c2NvbmZpZ0RpcixcbiAgfSA9IG9wdHNcbiAgY29uc3QgcGF0aHMgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5wYXRoc1xuICBpZiAoIXBhdGhzKSByZXR1cm4gbnVsbFxuICBjb25zdCBiYXNlVXJsID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybCB8fCBcIi5cIlxuXG4gIGNvbnN0IHRyeVJlc29sdmVDYW5kaWRhdGUgPSAoY2FuZGlkYXRlOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkQ2FuZGlkYXRlID0gbm9ybWFsaXplRmlsZVBhdGgoY2FuZGlkYXRlKVxuICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKG5vcm1hbGl6ZWRDYW5kaWRhdGUpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChub3JtYWxpemVkQ2FuZGlkYXRlKSFcbiAgICB9XG4gICAgZm9yIChjb25zdCBleHQgb2YgZXh0ZW5zaW9ucykge1xuICAgICAgY29uc3Qgd2l0aEV4dCA9IGAke25vcm1hbGl6ZWRDYW5kaWRhdGV9LiR7ZXh0fWBcbiAgICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHdpdGhFeHQpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHdpdGhFeHQpIVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgZm9yIChjb25zdCBbYWxpYXMsIHRhcmdldHNdIG9mIE9iamVjdC5lbnRyaWVzKHBhdGhzKSkge1xuICAgIC8vIFN1cHBvcnQgcGF0dGVybnMgbGlrZSBcIkBzcmMvKlwiIG9yIFwidXRpbHMvKlwiIGFuZCBhbHNvIGV4YWN0IG1hdGNoZXMgd2l0aG91dCBcIipcIlxuICAgIGNvbnN0IGhhc1dpbGRjYXJkID0gYWxpYXMuaW5jbHVkZXMoXCIqXCIpXG4gICAgaWYgKGhhc1dpbGRjYXJkKSB7XG4gICAgICBjb25zdCBbcHJlZml4LCBzdWZmaXhdID0gYWxpYXMuc3BsaXQoXCIqXCIpXG4gICAgICBpZiAoXG4gICAgICAgICFpbXBvcnRQYXRoLnN0YXJ0c1dpdGgocHJlZml4KSB8fFxuICAgICAgICAhaW1wb3J0UGF0aC5lbmRzV2l0aChzdWZmaXggfHwgXCJcIilcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3Qgc3Rhck1hdGNoID0gaW1wb3J0UGF0aC5zbGljZShcbiAgICAgICAgcHJlZml4Lmxlbmd0aCxcbiAgICAgICAgaW1wb3J0UGF0aC5sZW5ndGggLSAoc3VmZml4ID8gc3VmZml4Lmxlbmd0aCA6IDApLFxuICAgICAgKVxuICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICBjb25zdCByZXBsYWNlZCA9IHRhcmdldC5yZXBsYWNlKFwiKlwiLCBzdGFyTWF0Y2gpXG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9XG4gICAgICAgICAgYmFzZVVybCAmJiAhcmVwbGFjZWQuc3RhcnRzV2l0aChcIi4vXCIpICYmICFyZXBsYWNlZC5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgICAgICAgPyBgJHtiYXNlVXJsfS8ke3JlcGxhY2VkfWBcbiAgICAgICAgICAgIDogcmVwbGFjZWRcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cnlSZXNvbHZlQ2FuZGlkYXRlKGNhbmRpZGF0ZSlcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGltcG9ydFBhdGggIT09IGFsaWFzKSBjb250aW51ZVxuICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPVxuICAgICAgICAgIGJhc2VVcmwgJiYgIXRhcmdldC5zdGFydHNXaXRoKFwiLi9cIikgJiYgIXRhcmdldC5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgICAgICAgPyBgJHtiYXNlVXJsfS8ke3RhcmdldH1gXG4gICAgICAgICAgICA6IHRhcmdldFxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IHRyeVJlc29sdmVDYW5kaWRhdGUoY2FuZGlkYXRlKVxuICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkUGF0aEZyb21CYXNlVXJsID0gcmVzb2x2ZVdpdGhCYXNlVXJsKHtcbiAgICBpbXBvcnRQYXRoLFxuICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCxcbiAgICBleHRlbnNpb25zLFxuICAgIHRzQ29uZmlnLFxuICAgIHRzY29uZmlnRGlyLFxuICB9KVxuXG4gIGlmIChyZXNvbHZlZFBhdGhGcm9tQmFzZVVybCkgcmV0dXJuIHJlc29sdmVkUGF0aEZyb21CYXNlVXJsXG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaXRoQmFzZVVybChvcHRzOiB7XG4gIGltcG9ydFBhdGg6IHN0cmluZ1xuICBub3JtYWxpemVkRmlsZVBhdGhNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgZXh0ZW5zaW9uczogc3RyaW5nW11cbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbFxuICB0c2NvbmZpZ0Rpcj86IHN0cmluZ1xufSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgICB0c2NvbmZpZ0RpcixcbiAgfSA9IG9wdHNcbiAgY29uc3QgYmFzZVVybCA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmxcbiAgaWYgKCFiYXNlVXJsKSByZXR1cm4gbnVsbFxuXG4gIC8vIFJlc29sdmUgYmFzZVVybCByZWxhdGl2ZSB0byB0c2NvbmZpZyBsb2NhdGlvblxuICBjb25zdCBiYXNlRGlyID0gdHNjb25maWdEaXIgfHwgXCIuXCJcbiAgbGV0IGZpbGVQYXRoVG9SZXNvbHZlID0gYCR7YmFzZURpcn0vJHtiYXNlVXJsfS8ke2ltcG9ydFBhdGh9YFxuICAvLyBDbGVhbiB1cCBtdWx0aXBsZSBzbGFzaGVzIGFuZCBsZWFkaW5nIGRvdHNcbiAgZmlsZVBhdGhUb1Jlc29sdmUgPSBmaWxlUGF0aFRvUmVzb2x2ZS5yZXBsYWNlKC9cXC8rL2csIFwiL1wiKSAvLyBSZXBsYWNlIG11bHRpcGxlIHNsYXNoZXMgd2l0aCBzaW5nbGUgc2xhc2hcbiAgZmlsZVBhdGhUb1Jlc29sdmUgPSBmaWxlUGF0aFRvUmVzb2x2ZS5yZXBsYWNlKC9cXC9cXC5cXC8vZywgXCIvXCIpIC8vIFJlcGxhY2UgLy4vIHdpdGggL1xuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGggPSBub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aFRvUmVzb2x2ZSlcblxuICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkRmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZEZpbGVQYXRoKSFcbiAgfVxuXG4gIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCB3aXRoRXh0ID0gYCR7bm9ybWFsaXplZEZpbGVQYXRofS4ke2V4dH1gXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMod2l0aEV4dCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHdpdGhFeHQpIVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzVHNjb25maWdQYXRoUGF0dGVybihcbiAgaW1wb3J0UGF0aDogc3RyaW5nLFxuICB0c0NvbmZpZzogVHNDb25maWcgfCBudWxsLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhdGhzID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8ucGF0aHNcbiAgaWYgKCFwYXRocykgcmV0dXJuIGZhbHNlXG5cbiAgZm9yIChjb25zdCBbYWxpYXNdIG9mIE9iamVjdC5lbnRyaWVzKHBhdGhzKSkge1xuICAgIGNvbnN0IGhhc1dpbGRjYXJkID0gYWxpYXMuaW5jbHVkZXMoXCIqXCIpXG4gICAgaWYgKGhhc1dpbGRjYXJkKSB7XG4gICAgICBjb25zdCBbcHJlZml4LCBzdWZmaXhdID0gYWxpYXMuc3BsaXQoXCIqXCIpXG4gICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKHByZWZpeCkgJiYgaW1wb3J0UGF0aC5lbmRzV2l0aChzdWZmaXggfHwgXCJcIikpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGltcG9ydFBhdGggPT09IGFsaWFzKSByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuIiwgImltcG9ydCB7IG5vcm1hbGl6ZUZpbGVQYXRoIH0gZnJvbSBcIi4vbm9ybWFsaXplRnNNYXBcIlxuaW1wb3J0IHsgcmVzb2x2ZVJlbGF0aXZlUGF0aCB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZVJlbGF0aXZlUGF0aFwiXG5pbXBvcnQge1xuICByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMsXG4gIHR5cGUgVHNDb25maWcsXG4gIHJlc29sdmVXaXRoQmFzZVVybCxcbn0gZnJvbSBcIi4vdHNjb25maWdQYXRoc1wiXG5cbmNvbnN0IEZJTEVfRVhURU5TSU9OUyA9IFtcInRzeFwiLCBcInRzXCIsIFwianNvblwiLCBcImpzXCIsIFwianN4XCIsIFwib2JqXCIsIFwiZ2x0ZlwiLCBcImdsYlwiXVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpbGVQYXRoID0gKFxuICB1bmtub3duRmlsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuICBjd2Q/OiBzdHJpbmcsXG4gIG9wdHM6IHsgdHNDb25maWc/OiBUc0NvbmZpZyB8IG51bGw7IHRzY29uZmlnRGlyPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB0c0NvbmZpZyA9IG9wdHMudHNDb25maWcgPz8gbnVsbFxuICBjb25zdCBpc1JlbGF0aXZlSW1wb3J0ID1cbiAgICB1bmtub3duRmlsZVBhdGguc3RhcnRzV2l0aChcIi4vXCIpIHx8IHVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpXG4gIGNvbnN0IGhhc0Jhc2VVcmwgPSAhIXRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmxcblxuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uIHByb3Blcmx5XG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9XG4gICAgY3dkICYmIChpc1JlbGF0aXZlSW1wb3J0IHx8ICFoYXNCYXNlVXJsKVxuICAgICAgPyByZXNvbHZlUmVsYXRpdmVQYXRoKHVua25vd25GaWxlUGF0aCwgY3dkKVxuICAgICAgOiB1bmtub3duRmlsZVBhdGhcblxuICBjb25zdCBmaWxlUGF0aHMgPSBuZXcgU2V0KFxuICAgIEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocylcbiAgICAgID8gZnNNYXBPckFsbEZpbGVQYXRoc1xuICAgICAgOiBPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKSxcbiAgKVxuXG4gIGlmIChmaWxlUGF0aHMuaGFzKHJlc29sdmVkUGF0aCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZWRQYXRoXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGhNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLnNldChub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aCksIGZpbGVQYXRoKVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKHJlc29sdmVkUGF0aClcblxuICAvLyBXaGVuIGJhc2VVcmwgaXMgc2V0LCBub24tcmVsYXRpdmUgaW1wb3J0cyBzaG91bGQgZ28gdGhyb3VnaCBiYXNlVXJsIHJlc29sdXRpb25cbiAgaWYgKGlzUmVsYXRpdmVJbXBvcnQgfHwgIWhhc0Jhc2VVcmwpIHtcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkUmVzb2x2ZWRQYXRoKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZFJlc29sdmVkUGF0aCkhXG4gICAgfVxuXG4gICAgLy8gU2VhcmNoIGZvciBmaWxlIHdpdGggYSBzZXQgb2YgZGlmZmVyZW50IGV4dGVuc2lvbnNcbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBGSUxFX0VYVEVOU0lPTlMpIHtcbiAgICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkUmVzb2x2ZWRQYXRofS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhwb3NzaWJsZUZpbGVQYXRoKSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChwb3NzaWJsZUZpbGVQYXRoKSFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBUcnkgcmVzb2x2aW5nIHVzaW5nIHRzY29uZmlnIFwicGF0aHNcIiBtYXBwaW5nIHdoZW4gdGhlIGltcG9ydCBpcyBub24tcmVsYXRpdmVcbiAgaWYgKCFpc1JlbGF0aXZlSW1wb3J0KSB7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoRnJvbVBhdGhzID0gcmVzb2x2ZVdpdGhUc2NvbmZpZ1BhdGhzKHtcbiAgICAgIGltcG9ydFBhdGg6IHVua25vd25GaWxlUGF0aCxcbiAgICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCxcbiAgICAgIGV4dGVuc2lvbnM6IEZJTEVfRVhURU5TSU9OUyxcbiAgICAgIHRzQ29uZmlnLFxuICAgICAgdHNjb25maWdEaXI6IG9wdHMudHNjb25maWdEaXIsXG4gICAgfSlcbiAgICBpZiAocmVzb2x2ZWRQYXRoRnJvbVBhdGhzKSByZXR1cm4gcmVzb2x2ZWRQYXRoRnJvbVBhdGhzXG5cbiAgICBjb25zdCByZXNvbHZlZFBhdGhGcm9tQmFzZVVybCA9IHJlc29sdmVXaXRoQmFzZVVybCh7XG4gICAgICBpbXBvcnRQYXRoOiB1bmtub3duRmlsZVBhdGgsXG4gICAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgICBleHRlbnNpb25zOiBGSUxFX0VYVEVOU0lPTlMsXG4gICAgICB0c0NvbmZpZyxcbiAgICAgIHRzY29uZmlnRGlyOiBvcHRzLnRzY29uZmlnRGlyLFxuICAgIH0pXG4gICAgaWYgKHJlc29sdmVkUGF0aEZyb21CYXNlVXJsKSByZXR1cm4gcmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmxcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGl0J3MgYW4gYWJzb2x1dGUgaW1wb3J0IChvbmx5IGlmIG5vIGJhc2VVcmwgaXMgY29uZmlndXJlZCBpbiB0c2NvbmZpZylcbiAgLy8gV2hlbiBiYXNlVXJsIGlzIHNldCwgaW1wb3J0cyBzaG91bGQgcmVzb2x2ZSB2aWEgYmFzZVVybCBvciBmYWlsLCBub3QgZmFsbCBiYWNrIHRvIGFic29sdXRlIHBhdGhzXG4gIGlmICghaXNSZWxhdGl2ZUltcG9ydCAmJiAhaGFzQmFzZVVybCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGggPSBub3JtYWxpemVGaWxlUGF0aCh1bmtub3duRmlsZVBhdGgpXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZFVua25vd25GaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGgpIVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBGSUxFX0VYVEVOU0lPTlMpIHtcbiAgICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkVW5rbm93bkZpbGVQYXRofS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhwb3NzaWJsZUZpbGVQYXRoKSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChwb3NzaWJsZUZpbGVQYXRoKSFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyA9IChcbiAgdW5rbm93bkZpbGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwT3JBbGxGaWxlUGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmdbXSxcbiAgY3dkPzogc3RyaW5nLFxuICBvcHRzOiB7IHRzQ29uZmlnPzogVHNDb25maWcgfCBudWxsOyB0c2NvbmZpZ0Rpcj86IHN0cmluZyB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QgcmVzb2x2ZWRGaWxlUGF0aCA9IHJlc29sdmVGaWxlUGF0aChcbiAgICB1bmtub3duRmlsZVBhdGgsXG4gICAgZnNNYXBPckFsbEZpbGVQYXRocyxcbiAgICBjd2QsXG4gICAgb3B0cyxcbiAgKVxuICBpZiAoIXJlc29sdmVkRmlsZVBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmlsZSBub3QgZm91bmQgXCIke3Vua25vd25GaWxlUGF0aH1cIiwgYXZhaWxhYmxlIHBhdGhzOlxcblxcbiR7T2JqZWN0LmtleXMoZnNNYXBPckFsbEZpbGVQYXRocykuam9pbihcIiwgXCIpfWAsXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNvbHZlZEZpbGVQYXRoXG59XG4iLCAiZXhwb3J0IGNvbnN0IGdldEltcG9ydHNGcm9tQ29kZSA9IChjb2RlOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gIC8vIE1hdGNoIGJhc2ljIGltcG9ydCBwYXR0ZXJucyBpbmNsdWRpbmcgY29tYmluZWQgZGVmYXVsdCBhbmQgbmFtZXNwYWNlIGltcG9ydHNcbiAgY29uc3QgaW1wb3J0UmVnZXggPVxuICAgIC9eXFxzKmltcG9ydFxccysoPzooPzpbXFx3XFxzXSssXFxzKik/KD86XFwqXFxzK2FzXFxzK1tcXHdcXHNdK3xcXHtbXFxzXFx3LF0rXFx9fFxcdyspXFxzK2Zyb21cXHMqKT9bJ1wiXSguKz8pWydcIl0vZ21cbiAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXVxuICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXNzaWduSW5FeHByZXNzaW9uczogPGV4cGxhbmF0aW9uPlxuICB3aGlsZSAoKG1hdGNoID0gaW1wb3J0UmVnZXguZXhlYyhjb2RlKSkgIT09IG51bGwpIHtcbiAgICBjb25zdCBmdWxsTWF0Y2ggPSBtYXRjaFswXVxuICAgIGlmICgvXlxccyppbXBvcnRcXHMrdHlwZVxcYi8udGVzdChmdWxsTWF0Y2gpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpbXBvcnRzLnB1c2gobWF0Y2hbMV0pXG4gIH1cblxuICAvLyBNYXRjaCByZS1leHBvcnRzXG4gIGNvbnN0IHJlRXhwb3J0UmVnZXggPVxuICAgIC9eXFxzKmV4cG9ydFxccysoPzp0eXBlXFxzKyk/KD86XFwqXFxzK2FzXFxzK1tcXHckXSt8XFwqfFxce1tefV0rXFx9KVxccytmcm9tXFxzKlsnXCJdKC4rPylbJ1wiXS9nbVxuICBsZXQgcmVFeHBvcnRNYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXNzaWduSW5FeHByZXNzaW9uczogPGV4cGxhbmF0aW9uPlxuICB3aGlsZSAoKHJlRXhwb3J0TWF0Y2ggPSByZUV4cG9ydFJlZ2V4LmV4ZWMoY29kZSkpICE9PSBudWxsKSB7XG4gICAgY29uc3QgZnVsbE1hdGNoID0gcmVFeHBvcnRNYXRjaFswXVxuICAgIGlmICgvXlxccypleHBvcnRcXHMrdHlwZVxcYi8udGVzdChmdWxsTWF0Y2gpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpbXBvcnRzLnB1c2gocmVFeHBvcnRNYXRjaFsxXSlcbiAgfVxuXG4gIHJldHVybiBpbXBvcnRzXG59XG4iLCAiaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCIuL2Rpcm5hbWVcIlxuXG50eXBlIEV4cG9ydFZhbHVlID0gc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj5cblxuaW50ZXJmYWNlIFBhY2thZ2VKc29uIHtcbiAgbWFpbj86IHN0cmluZ1xuICBtb2R1bGU/OiBzdHJpbmdcbiAgZXhwb3J0cz86IFJlY29yZDxzdHJpbmcsIEV4cG9ydFZhbHVlPlxufVxuXG5pbnRlcmZhY2UgTm9kZVJlc29sdXRpb25Db250ZXh0IHtcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZXh0ZW5zaW9uczogc3RyaW5nW11cbiAgYmFzZVBhdGg6IHN0cmluZ1xuICBtb2R1bGVQYXRoOiBzdHJpbmdcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChcbiAgbW9kdWxlUGF0aDogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgYmFzZVBhdGg6IHN0cmluZyxcbik6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgZnNNYXAsXG4gICAgZXh0ZW5zaW9uczogW1wiLmpzXCIsIFwiLmpzeFwiLCBcIi50c1wiLCBcIi50c3hcIiwgXCIuanNvblwiXSxcbiAgICBiYXNlUGF0aCxcbiAgICBtb2R1bGVQYXRoLFxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvbihub2RlTW9kdWxlc1BhdGg6IHN0cmluZywgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQpIHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS9wYWNrYWdlLmpzb25gXG4gIGlmICghY3R4LmZzTWFwW3BhY2thZ2VKc29uUGF0aF0pIHJldHVybiBudWxsXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY3R4LmZzTWFwW3BhY2thZ2VKc29uUGF0aF0pIGFzIFBhY2thZ2VKc29uXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKFxuICBwYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChjdHguZnNNYXBbcGF0aF0pIHJldHVybiBwYXRoXG5cbiAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCBwYXRoV2l0aEV4dCA9IHBhdGgucmVwbGFjZSgvXFwuanMkfFxcLmpzeCQvLCBcIlwiKSArIGV4dFxuICAgIGlmIChjdHguZnNNYXBbcGF0aFdpdGhFeHRdKSByZXR1cm4gcGF0aFdpdGhFeHRcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlRXhwb3J0UGF0aChcbiAgbm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsXG4gIGV4cG9ydFBhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZnVsbEV4cG9ydFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7ZXhwb3J0UGF0aC5yZXBsYWNlKC9eXFwuXFwvLywgXCJcIil9YFxuICByZXR1cm4gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxFeHBvcnRQYXRoLCBjdHgpXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb25kaXRpb25hbEV4cG9ydChleHBvcnRWYWx1ZTogRXhwb3J0VmFsdWUpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRWYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBleHBvcnRWYWx1ZVxuICB9XG5cbiAgLy8gSGFuZGxlIGNvbmRpdGlvbmFsIGV4cG9ydHMgLSB0cnkgY29tbW9uIGNvbmRpdGlvbnMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZVxuICBjb25zdCBjb25kaXRpb25zID0gW1wiaW1wb3J0XCIsIFwiZGVmYXVsdFwiLCBcInJlcXVpcmVcIiwgXCJub2RlXCIsIFwiYnJvd3NlclwiXVxuICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG4gICAgaWYgKGV4cG9ydFZhbHVlW2NvbmRpdGlvbl0pIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvblZhbHVlID0gZXhwb3J0VmFsdWVbY29uZGl0aW9uXVxuICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb25WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gY29uZGl0aW9uVmFsdWVcbiAgICAgIH1cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGhhbmRsZSBuZXN0ZWQgY29uZGl0aW9uc1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlQ29uZGl0aW9uYWxFeHBvcnQoY29uZGl0aW9uVmFsdWUpXG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlRXhwb3J0cyhcbiAgbm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgcmVtYWluaW5nUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXBhY2thZ2VKc29uLmV4cG9ydHMpIHJldHVybiBudWxsXG5cbiAgLy8gSGFuZGxlIGRlZmF1bHQgZXhwb3J0IGNvbmRpdGlvbiAod2hlbiBubyBzdWJwYXRoKVxuICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0c1tcIi5cIl1cbiAgaWYgKHJlbWFpbmluZ1BhdGggPT09IFwiXCIgJiYgZGVmYXVsdEV4cG9ydCkge1xuICAgIGNvbnN0IGV4cG9ydFBhdGggPSByZXNvbHZlQ29uZGl0aW9uYWxFeHBvcnQoZGVmYXVsdEV4cG9ydClcbiAgICBpZiAoZXhwb3J0UGF0aCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGV4cG9ydFBhdGgsIGN0eClcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHN1YnBhdGggZXhwb3J0c1xuICBjb25zdCBzdWJwYXRoRXhwb3J0ID0gcmVtYWluaW5nUGF0aFxuICAgID8gcGFja2FnZUpzb24uZXhwb3J0c1tgLi8ke3JlbWFpbmluZ1BhdGh9YF1cbiAgICA6IG51bGxcbiAgaWYgKHN1YnBhdGhFeHBvcnQpIHtcbiAgICBjb25zdCBleHBvcnRQYXRoID0gcmVzb2x2ZUNvbmRpdGlvbmFsRXhwb3J0KHN1YnBhdGhFeHBvcnQpXG4gICAgaWYgKGV4cG9ydFBhdGgpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBleHBvcnRQYXRoLCBjdHgpXG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSB0b3AtbGV2ZWwgY29uZGl0aW9uYWwgZXhwb3J0cyAobGVnYWN5IGZvcm1hdClcbiAgY29uc3QgaW1wb3J0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0cy5pbXBvcnRcbiAgaWYgKHJlbWFpbmluZ1BhdGggPT09IFwiXCIgJiYgaW1wb3J0RXhwb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBleHBvcnRQYXRoID0gcmVzb2x2ZUNvbmRpdGlvbmFsRXhwb3J0KGltcG9ydEV4cG9ydClcbiAgICBpZiAoZXhwb3J0UGF0aCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGV4cG9ydFBhdGgsIGN0eClcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VFbnRyeVBvaW50KFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBlbnRyeVBvaW50ID0gcGFja2FnZUpzb24ubW9kdWxlIHx8IHBhY2thZ2VKc29uLm1haW4gfHwgXCJpbmRleC5qc1wiXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke2VudHJ5UG9pbnR9YFxuICByZXR1cm4gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxQYXRoLCBjdHgpXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVSZW1haW5pbmdQYXRoKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcmVtYWluaW5nUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXJlbWFpbmluZ1BhdGgpIHtcbiAgICAvLyBUcnkgaW5kZXggZmlsZXMgaW4gdGhlIG1vZHVsZSByb290XG4gICAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vaW5kZXgke2V4dH1gXG4gICAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke3JlbWFpbmluZ1BhdGh9YFxuICBjb25zdCBkaXJlY3RNYXRjaCA9IHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhmdWxsUGF0aCwgY3R4KVxuICBpZiAoZGlyZWN0TWF0Y2gpIHJldHVybiBkaXJlY3RNYXRjaFxuXG4gIC8vIFRyeSBpbmRleCBmaWxlc1xuICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke2Z1bGxQYXRofS9pbmRleCR7ZXh0fWBcbiAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChcbiAgc2VhcmNoUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBtb2R1bGVQYXJ0cyA9IGN0eC5tb2R1bGVQYXRoLnNwbGl0KFwiL1wiKVxuICBjb25zdCBzY29wZSA9IG1vZHVsZVBhcnRzWzBdLnN0YXJ0c1dpdGgoXCJAXCIpXG4gICAgPyBtb2R1bGVQYXJ0cy5zbGljZSgwLCAyKS5qb2luKFwiL1wiKVxuICAgIDogbW9kdWxlUGFydHNbMF1cbiAgY29uc3QgcmVtYWluaW5nUGF0aCA9IG1vZHVsZVBhcnRzLnNsaWNlKHNjb3BlLmluY2x1ZGVzKFwiL1wiKSA/IDIgOiAxKS5qb2luKFwiL1wiKVxuICBjb25zdCBub2RlTW9kdWxlc1BhdGggPSBgJHtzZWFyY2hQYXRoID09PSBcIi5cIiA/IFwiXCIgOiBgJHtzZWFyY2hQYXRofS9gfW5vZGVfbW9kdWxlcy8ke3Njb3BlfWBcblxuICAvLyBUcnkgdG8gZmluZCBwYWNrYWdlLmpzb25cbiAgY29uc3QgcGFja2FnZUpzb24gPSBmaW5kUGFja2FnZUpzb24obm9kZU1vZHVsZXNQYXRoLCBjdHgpXG4gIGlmIChwYWNrYWdlSnNvbikge1xuICAgIC8vIFRyeSByZXNvbHZpbmcgdGhyb3VnaCBleHBvcnRzIGZpZWxkXG4gICAgY29uc3QgZXhwb3J0c1Jlc29sdXRpb24gPSByZXNvbHZlUGFja2FnZUV4cG9ydHMoXG4gICAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHJlbWFpbmluZ1BhdGgsXG4gICAgICBjdHgsXG4gICAgKVxuICAgIGlmIChleHBvcnRzUmVzb2x1dGlvbikgcmV0dXJuIGV4cG9ydHNSZXNvbHV0aW9uXG5cbiAgICAvLyBUcnkgcmVzb2x2aW5nIHRocm91Z2ggbWFpbi9tb2R1bGUgZmllbGRzXG4gICAgY29uc3QgZW50cnlQb2ludFJlc29sdXRpb24gPSByZXNvbHZlUGFja2FnZUVudHJ5UG9pbnQoXG4gICAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIGN0eCxcbiAgICApXG4gICAgaWYgKGVudHJ5UG9pbnRSZXNvbHV0aW9uKSByZXR1cm4gZW50cnlQb2ludFJlc29sdXRpb25cbiAgfVxuXG4gIC8vIFRyeSByZXNvbHZpbmcgcmVtYWluaW5nIHBhdGhcbiAgY29uc3QgcmVtYWluaW5nUGF0aFJlc29sdXRpb24gPSByZXNvbHZlUmVtYWluaW5nUGF0aChcbiAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgcmVtYWluaW5nUGF0aCxcbiAgICBjdHgsXG4gIClcbiAgaWYgKHJlbWFpbmluZ1BhdGhSZXNvbHV0aW9uKSByZXR1cm4gcmVtYWluaW5nUGF0aFJlc29sdXRpb25cblxuICAvLyBJZiBub3QgZm91bmQgYW5kIHdlIGhhdmUgYSBwYXJlbnQgZGlyZWN0b3J5LCB0cnkgdGhlcmVcbiAgY29uc3QgcGFyZW50UGF0aCA9IGRpcm5hbWUoc2VhcmNoUGF0aClcbiAgaWYgKHBhcmVudFBhdGggJiYgcGFyZW50UGF0aCAhPT0gc2VhcmNoUGF0aCkge1xuICAgIHJldHVybiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChwYXJlbnRQYXRoLCBjdHgpXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU5vZGVNb2R1bGUoXG4gIG1vZHVsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgY3R4ID0gY3JlYXRlQ29udGV4dChtb2R1bGVQYXRoLCBmc01hcCwgYmFzZVBhdGgpXG4gIHJldHVybiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChjdHguYmFzZVBhdGgsIGN0eClcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlRmlsZVBhdGggfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgcmVzb2x2ZU5vZGVNb2R1bGUgfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGVcIlxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbENvbXBpbGVkSnMoXG4gIGNvbXBpbGVkQ29kZTogc3RyaW5nLFxuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGN3ZD86IHN0cmluZyxcbikge1xuICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9yZXF1aXJlID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGxldCByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKG5hbWUsIHByZVN1cHBsaWVkSW1wb3J0cywgY3dkKVxuXG4gICAgaWYgKCFyZXNvbHZlZEZpbGVQYXRoICYmICFuYW1lLnN0YXJ0c1dpdGgoXCIuXCIpICYmICFuYW1lLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUobmFtZSwgcHJlU3VwcGxpZWRJbXBvcnRzLCBjd2QgfHwgXCJcIilcbiAgICB9XG5cbiAgICBjb25zdCBoYXNSZXNvbHZlZEZpbGVQYXRoID1cbiAgICAgIHJlc29sdmVkRmlsZVBhdGggJiYgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGhdXG5cbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSAmJiAhaGFzUmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbXBvcnQgXCIke25hbWV9XCIgbm90IGZvdW5kICR7Y3dkID8gYGluIFwiJHtjd2R9XCJgIDogXCJcIn1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZCA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbbmFtZV0gfHwgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGghXVxuICAgIHJldHVybiBuZXcgUHJveHkobW9kLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICghKHByb3AgaW4gdGFyZ2V0KSkge1xuICAgICAgICAgIGlmIChwcm9wID09PSBcImRlZmF1bHRcIikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5kZWZhdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuX19lc01vZHVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJvcCA9PT0gXCJfX2VzTW9kdWxlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbXBvbmVudCBcIiR7U3RyaW5nKHByb3ApfVwiIGlzIG5vdCBleHBvcnRlZCBieSBcIiR7bmFtZX1cImAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wIGFzIGtleW9mIHR5cGVvZiB0YXJnZXRdXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBmdW5jdGlvbkJvZHkgPSBgXG4gIHZhciBleHBvcnRzID0ge307XG4gIHZhciByZXF1aXJlID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9yZXF1aXJlO1xuICB2YXIgbW9kdWxlID0geyBleHBvcnRzIH07XG4gIHZhciBjaXJjdWl0ID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9jaXJjdWl0O1xuICAke2NvbXBpbGVkQ29kZX07XG4gIHJldHVybiBtb2R1bGU7YC50cmltKClcbiAgcmV0dXJuIEZ1bmN0aW9uKGZ1bmN0aW9uQm9keSkuY2FsbChnbG9iYWxUaGlzKVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJsaWIvdXRpbHMvZGlybmFtZVwiXG5pbXBvcnQgeyBnZXRJbXBvcnRzRnJvbUNvZGUgfSBmcm9tIFwibGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZVwiXG5pbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwiLi9pbXBvcnQtZXZhbC1wYXRoXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgaXNTdGF0aWNBc3NldFBhdGggfSBmcm9tIFwibGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9uc1wiXG5pbXBvcnQgeyB0cmFuc2Zvcm1XaXRoU3VjcmFzZSB9IGZyb20gXCJsaWIvdHJhbnNwaWxlL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2VcIlxuaW1wb3J0IHsgS2ljYWRUb0NpcmN1aXRKc29uQ29udmVydGVyIH0gZnJvbSBcImtpY2FkLXRvLWNpcmN1aXQtanNvblwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LWxvY2FsLWZpbGVcIilcblxuZXhwb3J0IGNvbnN0IGltcG9ydExvY2FsRmlsZSA9IGFzeW5jIChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikgPT4ge1xuICBkZWJ1ZyhcImltcG9ydExvY2FsRmlsZSBjYWxsZWQgd2l0aDpcIiwge1xuICAgIGltcG9ydE5hbWUsXG4gIH0pXG5cbiAgY29uc3QgeyBmc01hcCwgcHJlU3VwcGxpZWRJbXBvcnRzLCBpbXBvcnRTdGFjaywgY3VycmVudGx5SW1wb3J0aW5nIH0gPSBjdHhcblxuICBjb25zdCBmc1BhdGggPSByZXNvbHZlRmlsZVBhdGhPclRocm93KGltcG9ydE5hbWUsIGZzTWFwLCB1bmRlZmluZWQsIHtcbiAgICB0c0NvbmZpZzogY3R4LnRzQ29uZmlnLFxuICB9KVxuICBkZWJ1ZyhcImZzUGF0aDpcIiwgZnNQYXRoKVxuICBpZiAoY3VycmVudGx5SW1wb3J0aW5nLmhhcyhmc1BhdGgpKSB7XG4gICAgY29uc3QgY3ljbGVTdGFydEluZGV4ID0gaW1wb3J0U3RhY2suaW5kZXhPZihmc1BhdGgpXG4gICAgY29uc3QgY3ljbGVQYXRoID1cbiAgICAgIGN5Y2xlU3RhcnRJbmRleCA+PSAwXG4gICAgICAgID8gaW1wb3J0U3RhY2suc2xpY2UoY3ljbGVTdGFydEluZGV4KS5jb25jYXQoZnNQYXRoKVxuICAgICAgICA6IFsuLi5pbXBvcnRTdGFjaywgZnNQYXRoXVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkIHdoaWxlIGltcG9ydGluZyBcIiR7ZnNQYXRofVwiLiBUaGUgZm9sbG93aW5nIGltcG9ydCBjaGFpbiBmb3JtcyBhIGN5Y2xlOlxcblxcbiR7Y3ljbGVQYXRoLmpvaW4oXG4gICAgICAgIFwiIC0+IFwiLFxuICAgICAgKX1gLFxuICAgIClcbiAgfVxuXG4gIGlmICghY3R4LmZzTWFwW2ZzUGF0aF0pIHtcbiAgICBkZWJ1ZyhcImZzUGF0aCBub3QgZm91bmQgaW4gZnNNYXA6XCIsIGZzUGF0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgXCIke2ZzUGF0aH1cIiBub3QgZm91bmRgKVxuICB9XG4gIGNvbnN0IGZpbGVDb250ZW50ID0gZnNNYXBbZnNQYXRoXVxuICBkZWJ1ZyhcImZpbGVDb250ZW50OlwiLCBmaWxlQ29udGVudD8uc2xpY2UoMCwgMTAwKSlcbiAgY3VycmVudGx5SW1wb3J0aW5nLmFkZChmc1BhdGgpXG4gIGltcG9ydFN0YWNrLnB1c2goZnNQYXRoKVxuICB0cnkge1xuICAgIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKGZpbGVDb250ZW50KVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGRlZmF1bHQ6IGpzb25EYXRhLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLmtpY2FkX3BjYlwiKSkge1xuICAgICAgY29uc3QgY29udmVydGVyID0gbmV3IEtpY2FkVG9DaXJjdWl0SnNvbkNvbnZlcnRlcigpXG4gICAgICBjb252ZXJ0ZXIuYWRkRmlsZShmc1BhdGgsIGZpbGVDb250ZW50KVxuICAgICAgY29udmVydGVyLnJ1blVudGlsRmluaXNoZWQoKVxuICAgICAgY29uc3QgY2lyY3VpdEpzb24gPSBjb252ZXJ0ZXIuZ2V0T3V0cHV0KClcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0ge1xuICAgICAgICBfX2VzTW9kdWxlOiB0cnVlLFxuICAgICAgICBjaXJjdWl0SnNvbjogY2lyY3VpdEpzb24sXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1N0YXRpY0Fzc2V0UGF0aChmc1BhdGgpKSB7XG4gICAgICBsZXQgc3RhdGljVXJsOiBzdHJpbmdcblxuICAgICAgaWYgKGZpbGVDb250ZW50ID09PSBcIl9fU1RBVElDX0FTU0VUX19cIikge1xuICAgICAgICAvLyBQbGFjZWhvbGRlcjogdXNlIHByb2plY3RCYXNlVXJsIGZvciBzdGF0aWMgZmlsZSBpbXBvcnRzXG4gICAgICAgIGNvbnN0IHBsYXRmb3JtQ29uZmlnID0gY3R4LmNpcmN1aXQucGxhdGZvcm1cbiAgICAgICAgc3RhdGljVXJsID0gYCR7cGxhdGZvcm1Db25maWc/LnByb2plY3RCYXNlVXJsID8/IFwiXCJ9LyR7XG4gICAgICAgICAgZnNQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSA/IGZzUGF0aC5zbGljZSgyKSA6IGZzUGF0aFxuICAgICAgICB9YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWN0dWFsIGZpbGUgY29udGVudDogY3JlYXRlIGEgYmxvYiBVUkxcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtmaWxlQ29udGVudF0sIHtcbiAgICAgICAgICB0eXBlOiBmc1BhdGguZW5kc1dpdGgoXCIua2ljYWRfbW9kXCIpXG4gICAgICAgICAgICA/IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICA6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIsXG4gICAgICAgIH0pXG4gICAgICAgIHN0YXRpY1VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICAgIH1cblxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGRlZmF1bHQ6IHN0YXRpY1VybCxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi50c3hcIikgfHwgZnNQYXRoLmVuZHNXaXRoKFwiLnRzXCIpKSB7XG4gICAgICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShmaWxlQ29udGVudClcblxuICAgICAgZm9yIChjb25zdCBpbXBvcnROYW1lIG9mIGltcG9ydE5hbWVzKSB7XG4gICAgICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgICAgIGN3ZDogZGlybmFtZShmc1BhdGgpLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRDb2RlID0gdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoZmlsZUNvbnRlbnQsIGZzUGF0aClcbiAgICAgICAgZGVidWcoXCJldmFsQ29tcGlsZWRKcyBjYWxsZWQgd2l0aDpcIiwge1xuICAgICAgICAgIGNvZGU6IHRyYW5zZm9ybWVkQ29kZS5zbGljZSgwLCAxMDApLFxuICAgICAgICAgIGRpcm5hbWU6IGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgaW1wb3J0UnVuUmVzdWx0ID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICAgICAgdHJhbnNmb3JtZWRDb2RlLFxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgICAgICBkaXJuYW1lKGZzUGF0aCksXG4gICAgICAgIClcbiAgICAgICAgZGVidWcoXCJpbXBvcnRSdW5SZXN1bHQ6XCIsIHtcbiAgICAgICAgICBmc1BhdGgsXG4gICAgICAgICAgaW1wb3J0UnVuUmVzdWx0LFxuICAgICAgICB9KVxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IGltcG9ydFJ1blJlc3VsdC5leHBvcnRzXG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXZhbCBjb21waWxlZCBqcyBlcnJvciBmb3IgXCIke2ltcG9ydE5hbWV9XCI6ICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNcIikgfHwgZnNQYXRoLmVuZHNXaXRoKFwiLm1qc1wiKSkge1xuICAgICAgLy8gRm9yIC5qcy8ubWpzIGZpbGVzLCBlc3BlY2lhbGx5IGZyb20gbm9kZV9tb2R1bGVzLCB3ZSBuZWVkIHRvIGV4dHJhY3QgYW5kIHJlc29sdmUgaW1wb3J0cyBmaXJzdFxuICAgICAgY29uc3QgaW1wb3J0TmFtZXMgPSBnZXRJbXBvcnRzRnJvbUNvZGUoZmlsZUNvbnRlbnQpXG5cbiAgICAgIGZvciAoY29uc3QgaW1wb3J0TmFtZSBvZiBpbXBvcnROYW1lcykge1xuICAgICAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgICAgICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKGltcG9ydE5hbWUsIGN0eCwgZGVwdGggKyAxLCB7XG4gICAgICAgICAgICBjd2Q6IGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZW4gdHJhbnNmb3JtIGFuZCBldmFsdWF0ZVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgICAgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoZmlsZUNvbnRlbnQsIGZzUGF0aCksXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgICAgZGlybmFtZShmc1BhdGgpLFxuICAgICAgKS5leHBvcnRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVuc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9uIFwiJHtmc1BhdGguc3BsaXQoXCIuXCIpLnBvcCgpfVwiIGZvciBcIiR7ZnNQYXRofVwiYCxcbiAgICAgIClcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgaW1wb3J0U3RhY2sucG9wKClcbiAgICBjdXJyZW50bHlJbXBvcnRpbmcuZGVsZXRlKGZzUGF0aClcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBTVEFUSUNfQVNTRVRfRVhURU5TSU9OUyA9IFtcbiAgXCIuZ2xiXCIsXG4gIFwiLmtpY2FkX21vZFwiLFxuICBcIi5nbHRmXCIsXG4gIFwiLm9ialwiLFxuICBcIi5zdGxcIixcbl1cblxuZXhwb3J0IGNvbnN0IGlzU3RhdGljQXNzZXRQYXRoID0gKHBhdGg6IHN0cmluZykgPT5cbiAgU1RBVElDX0FTU0VUX0VYVEVOU0lPTlMuc29tZSgoZXh0KSA9PiBwYXRoLmVuZHNXaXRoKGV4dCkpXG4iLCAiaW1wb3J0IHsgdHJhbnNmb3JtLCB0eXBlIFRyYW5zZm9ybSBhcyBTdWNyYXNlVHJhbnNmb3JtIH0gZnJvbSBcInN1Y3Jhc2VcIlxuXG5jb25zdCBUU19FWFRFTlNJT05TID0gbmV3IFNldChbXCIudHNcIiwgXCIudHN4XCIsIFwiLm10c1wiLCBcIi5jdHNcIl0pXG5jb25zdCBKU1hfRVhURU5TSU9OUyA9IG5ldyBTZXQoW1wiLnRzeFwiLCBcIi5qc3hcIiwgXCIudHNcIl0pXG5jb25zdCBUWVBFX1NUQVJfRVhQT1JUX1JFR0VYID1cbiAgL15cXHMqZXhwb3J0XFxzK3R5cGVcXHMrXFwqXFxzKyg/OmFzXFxzK1tcXHckXStcXHMrKT9mcm9tXFxzK1snXCJdW14nXCJdK1snXCJdXFxzKjs/XFxzKiQvZ2ltXG5cbmNvbnN0IHN0cmlwVHlwZVN0YXJFeHBvcnRzID0gKGNvZGU6IHN0cmluZykgPT5cbiAgY29kZS5yZXBsYWNlKFRZUEVfU1RBUl9FWFBPUlRfUkVHRVgsIFwiXCIpXG5cbmNvbnN0IHN0cmlwUXVlcnlBbmRIYXNoID0gKGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcXVlcnlJbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoXCI/XCIpXG4gIGNvbnN0IGhhc2hJbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoXCIjXCIpXG5cbiAgbGV0IGVuZEluZGV4ID0gZmlsZVBhdGgubGVuZ3RoXG5cbiAgaWYgKHF1ZXJ5SW5kZXggIT09IC0xICYmIGhhc2hJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IE1hdGgubWluKHF1ZXJ5SW5kZXgsIGhhc2hJbmRleClcbiAgfSBlbHNlIGlmIChxdWVyeUluZGV4ICE9PSAtMSkge1xuICAgIGVuZEluZGV4ID0gcXVlcnlJbmRleFxuICB9IGVsc2UgaWYgKGhhc2hJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IGhhc2hJbmRleFxuICB9XG5cbiAgcmV0dXJuIGZpbGVQYXRoLnNsaWNlKDAsIGVuZEluZGV4KVxufVxuXG5jb25zdCBnZXRFeHRlbnNpb24gPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHN0cmlwUXVlcnlBbmRIYXNoKGZpbGVQYXRoKVxuICBjb25zdCBsYXN0RG90SW5kZXggPSBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIi5cIilcblxuICBpZiAobGFzdERvdEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IE1hdGgubWF4KFxuICAgIG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSxcbiAgICBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIlxcXFxcIiksXG4gIClcblxuICBpZiAobGFzdFNsYXNoSW5kZXggPiBsYXN0RG90SW5kZXgpIHtcbiAgICByZXR1cm4gXCJcIlxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnNsaWNlKGxhc3REb3RJbmRleCkudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBnZXRUcmFuc2Zvcm1zRm9yRmlsZVBhdGggPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oZmlsZVBhdGgpXG5cbiAgY29uc3QgdHJhbnNmb3JtczogU3VjcmFzZVRyYW5zZm9ybVtdID0gW1wiaW1wb3J0c1wiXVxuXG4gIGlmIChUU19FWFRFTlNJT05TLmhhcyhleHRlbnNpb24pKSB7XG4gICAgdHJhbnNmb3Jtcy51bnNoaWZ0KFwidHlwZXNjcmlwdFwiKVxuICB9XG5cbiAgaWYgKEpTWF9FWFRFTlNJT05TLmhhcyhleHRlbnNpb24pKSB7XG4gICAgdHJhbnNmb3Jtcy5wdXNoKFwianN4XCIpXG4gIH1cblxuICByZXR1cm4gdHJhbnNmb3Jtc1xufVxuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UgPSAoY29kZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHRyYW5zZm9ybXMgPSBnZXRUcmFuc2Zvcm1zRm9yRmlsZVBhdGgoZmlsZVBhdGgpXG4gIGNvbnN0IHNhbml0aXplZENvZGUgPSBzdHJpcFR5cGVTdGFyRXhwb3J0cyhjb2RlKVxuICBjb25zdCB7IGNvZGU6IHRyYW5zZm9ybWVkQ29kZSB9ID0gdHJhbnNmb3JtKHNhbml0aXplZENvZGUsIHtcbiAgICBmaWxlUGF0aCxcbiAgICBwcm9kdWN0aW9uOiB0cnVlLFxuICAgIHRyYW5zZm9ybXMsXG4gIH0pXG5cbiAgcmV0dXJuIHRyYW5zZm9ybWVkQ29kZVxufVxuIiwgImltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRTbmlwcGV0KFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSB7XG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcbiAgY29uc3QgZnVsbFNuaXBwZXROYW1lID0gaW1wb3J0TmFtZS5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpLnJlcGxhY2UoXCIuXCIsIFwiL1wiKVxuXG4gIGNvbnN0IHsgY2pzLCBlcnJvciB9ID0gYXdhaXQgZ2xvYmFsVGhpc1xuICAgIC5mZXRjaChgJHtjdHguY2pzUmVnaXN0cnlVcmx9LyR7ZnVsbFNuaXBwZXROYW1lfWApXG4gICAgLnRoZW4oYXN5bmMgKHJlcykgPT4gKHsgY2pzOiBhd2FpdCByZXMudGV4dCgpLCBlcnJvcjogbnVsbCB9KSlcbiAgICAuY2F0Y2goKGUpID0+ICh7IGVycm9yOiBlLCBjanM6IG51bGwgfSkpXG5cbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIGltcG9ydFwiLCBpbXBvcnROYW1lLCBlcnJvcilcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICBjanMhLFxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICkuZXhwb3J0c1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGltcG9ydGluZyBzbmlwcGV0XCIsIGUpXG4gIH1cbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlTm9kZU1vZHVsZSB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBpbXBvcnRMb2NhbEZpbGUgfSBmcm9tIFwiLi9pbXBvcnQtbG9jYWwtZmlsZVwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IGlzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvbiB9IGZyb20gXCIuL2lzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvblwiXG5pbXBvcnQgeyBnZXROb2RlTW9kdWxlRGlyZWN0b3J5IH0gZnJvbSBcIi4vZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeVwiXG5pbXBvcnQgeyBnZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQgfSBmcm9tIFwiLi9nZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnRcIlxuaW1wb3J0IHsgaXNUeXBlU2NyaXB0RW50cnlwb2ludCB9IGZyb20gXCIuL2lzVHlwZVNjcmlwdEVudHJ5cG9pbnRcIlxuaW1wb3J0IHsgaXNEaXN0RGlyRW1wdHkgfSBmcm9tIFwiLi9pc0Rpc3REaXJFbXB0eVwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LW5vZGUtbW9kdWxlXCIpXG5cbmV4cG9ydCBjb25zdCBpbXBvcnROb2RlTW9kdWxlID0gYXN5bmMgKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSA9PiB7XG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzLCBmc01hcCB9ID0gY3R4XG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gT25seSBydW4gdmFsaWRhdGlvbiBpZiBwYWNrYWdlLmpzb24gZXhpc3RzIChjYW4ndCB2YWxpZGF0ZSB3aXRob3V0IGl0KVxuICBjb25zdCBoYXNQYWNrYWdlSnNvbiA9ICEhZnNNYXBbXCJwYWNrYWdlLmpzb25cIl1cblxuICBpZiAoaGFzUGFja2FnZUpzb24pIHtcbiAgICAvLyBTdGVwIDE6IENoZWNrIGlmIHRoZSBwYWNrYWdlIGlzIGRlY2xhcmVkIGluIHBhY2thZ2UuanNvblxuICAgIGlmICghaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uKGltcG9ydE5hbWUsIGZzTWFwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm9kZSBtb2R1bGUgaW1wb3J0ZWQgYnV0IG5vdCBpbiBwYWNrYWdlLmpzb24gXCIke2ltcG9ydE5hbWV9XCJcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCA9IHJlc29sdmVOb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eC5mc01hcCwgXCJcIilcblxuICAvLyBPbmx5IHJ1biBTdGVwcyAyLTQgaWYgcGFja2FnZSBleGlzdHMgaW4gbm9kZV9tb2R1bGVzIChhZnRlciByZXNvbHZlciBhdHRlbXB0cylcbiAgaWYgKGhhc1BhY2thZ2VKc29uICYmIHJlc29sdmVkTm9kZU1vZHVsZVBhdGgpIHtcbiAgICAvLyBTdGVwIDI6IENoZWNrIGlmIG5vZGVfbW9kdWxlcyBkaXJlY3RvcnkgZXhpc3RzIGZvciB0aGUgcGFja2FnZVxuICAgIGNvbnN0IG5vZGVNb2R1bGVEaXIgPSBnZXROb2RlTW9kdWxlRGlyZWN0b3J5KGltcG9ydE5hbWUsIGZzTWFwKVxuICAgIGlmICghbm9kZU1vZHVsZURpcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgaGFzIG5vIGZpbGVzIGluIHRoZSBub2RlX21vZHVsZXMgZGlyZWN0b3J5XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFN0ZXAgMzogQ2hlY2sgaWYgbWFpbiBlbnRyeXBvaW50IGlzIGEgVHlwZVNjcmlwdCBmaWxlXG4gICAgY29uc3QgZW50cnlwb2ludCA9IGdldFBhY2thZ2VKc29uRW50cnlwb2ludChpbXBvcnROYW1lLCBmc01hcClcbiAgICBpZiAoaXNUeXBlU2NyaXB0RW50cnlwb2ludChlbnRyeXBvaW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgaGFzIGEgdHlwZXNjcmlwdCBlbnRyeXBvaW50IHRoYXQgaXMgdW5zdXBwb3J0ZWRcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gU3RlcCA0OiBDaGVjayBpZiBkaXN0IGRpcmVjdG9yeSBpcyBlbXB0eSB3aGVuIG1haW4gcG9pbnRzIHRvIGRpc3RcbiAgICBpZiAoZW50cnlwb2ludCAmJiBlbnRyeXBvaW50LnN0YXJ0c1dpdGgoXCJkaXN0L1wiKSkge1xuICAgICAgaWYgKGlzRGlzdERpckVtcHR5KGltcG9ydE5hbWUsIGZzTWFwKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIGhhcyBubyBmaWxlcyBpbiBkaXN0LCBkaWQgeW91IGZvcmdldCB0byB0cmFuc3BpbGU/XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFyZXNvbHZlZE5vZGVNb2R1bGVQYXRoKSB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBjdHguY2lyY3VpdD8ucGxhdGZvcm1cbiAgICBpZiAocGxhdGZvcm0/Lm5vZGVNb2R1bGVzUmVzb2x2ZXIpIHtcbiAgICAgIGRlYnVnKGBBdHRlbXB0aW5nIHRvIHJlc29sdmUgXCIke2ltcG9ydE5hbWV9XCIgdXNpbmcgbm9kZU1vZHVsZXNSZXNvbHZlcmApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgcGxhdGZvcm0ubm9kZU1vZHVsZXNSZXNvbHZlcihpbXBvcnROYW1lKVxuXG4gICAgICAgIGlmIChmaWxlQ29udGVudCkge1xuICAgICAgICAgIGRlYnVnKGBTdWNjZXNzZnVsbHkgcmVzb2x2ZWQgXCIke2ltcG9ydE5hbWV9XCIgdmlhIG5vZGVNb2R1bGVzUmVzb2x2ZXJgKVxuXG4gICAgICAgICAgLy8gQWRkIHRoZSByZXNvbHZlZCBjb250ZW50IHRvIGZzTWFwIHdpdGggYSBzeW50aGV0aWMgcGF0aFxuICAgICAgICAgIC8vIEFkZCAudHMgZXh0ZW5zaW9uIHRvIGVuc3VyZSBpdCdzIHRyZWF0ZWQgYXMgYSBtb2R1bGUgZmlsZVxuICAgICAgICAgIGNvbnN0IHN5bnRoZXRpY1BhdGggPSBgbm9kZV9tb2R1bGVzLyR7aW1wb3J0TmFtZX0udHNgXG4gICAgICAgICAgY3R4LmZzTWFwW3N5bnRoZXRpY1BhdGhdID0gZmlsZUNvbnRlbnRcblxuICAgICAgICAgIC8vIEltcG9ydCB0aGUgZmlsZSB1c2luZyB0aGUgbm9ybWFsIGZsb3dcbiAgICAgICAgICBhd2FpdCBpbXBvcnRMb2NhbEZpbGUoc3ludGhldGljUGF0aCwgY3R4LCBkZXB0aClcblxuICAgICAgICAgIC8vIE1hcCB0aGUgaW1wb3J0IG5hbWUgdG8gdGhlIHJlc29sdmVkIG1vZHVsZVxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHByZVN1cHBsaWVkSW1wb3J0c1tzeW50aGV0aWNQYXRoXVxuXG4gICAgICAgICAgLy8gQWxzbyBtYXAgd2l0aG91dCBub2RlX21vZHVsZXMgcHJlZml4XG4gICAgICAgICAgY29uc3QgdW5wcmVmaXhlZFBhdGggPSBzeW50aGV0aWNQYXRoLnJlcGxhY2UoL15ub2RlX21vZHVsZXNcXC8vLCBcIlwiKVxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1t1bnByZWZpeGVkUGF0aF0gPSBwcmVTdXBwbGllZEltcG9ydHNbc3ludGhldGljUGF0aF1cblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZGVidWcoYG5vZGVNb2R1bGVzUmVzb2x2ZXIgcmV0dXJuZWQgbnVsbCBmb3IgXCIke2ltcG9ydE5hbWV9XCJgKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZGVidWcoYG5vZGVNb2R1bGVzUmVzb2x2ZXIgZmFpbGVkIGZvciBcIiR7aW1wb3J0TmFtZX1cIjpgLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIG5vdCBmb3VuZGApXG4gIH1cblxuICAvLyBVc2UgaW1wb3J0TG9jYWxGaWxlIHRvIGhhbmRsZSB0aGUgbm9kZSBtb2R1bGVcbiAgYXdhaXQgaW1wb3J0TG9jYWxGaWxlKHJlc29sdmVkTm9kZU1vZHVsZVBhdGgsIGN0eCwgZGVwdGgpXG5cbiAgLy8gTWFwIHRoZSBvcmlnaW5hbCBpbXBvcnQgbmFtZSB0byB0aGUgcmVzb2x2ZWQgbW9kdWxlJ3MgZXhwb3J0c1xuICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAvLyBNYXAgd2l0aG91dCBub2RlX21vZHVsZXMgcHJlZml4IGZvciBkaXJlY3QgaW1wb3J0c1xuICBjb25zdCB1bnByZWZpeGVkUGF0aCA9IHJlc29sdmVkTm9kZU1vZHVsZVBhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gIHByZVN1cHBsaWVkSW1wb3J0c1t1bnByZWZpeGVkUGF0aF0gPVxuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuXG4gIC8vIEhhbmRsZSBpbmRleCBmaWxlcyBzcGVjaWFsbHlcbiAgaWYgKFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXgudHN4XCIpIHx8XG4gICAgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5lbmRzV2l0aChcIi9pbmRleC50c1wiKSB8fFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXguanNcIilcbiAgKSB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHJlc29sdmVkTm9kZU1vZHVsZVBhdGgucmVwbGFjZSgvXFwvaW5kZXhcXC4odHN4P3xqcykkLywgXCJcIilcbiAgICBjb25zdCB1bnByZWZpeGVkRGlyUGF0aCA9IGRpclBhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW3VucHJlZml4ZWREaXJQYXRoXSA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAgIC8vIEhhbmRsZSBzY29wZWQgcGFja2FnZXNcbiAgICBpZiAodW5wcmVmaXhlZERpclBhdGguc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAgIGNvbnN0IHNjb3BlUGFydHMgPSB1bnByZWZpeGVkRGlyUGF0aC5zcGxpdChcIi9cIilcbiAgICAgIGlmIChzY29wZVBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlZE5hbWUgPSBgJHtzY29wZVBhcnRzWzBdfS8ke3Njb3BlUGFydHNbMV19YFxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbc2NvcGVkTmFtZV0gPVxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogRXh0cmFjdCB0aGUgYmFzZSBwYWNrYWdlIG5hbWUgZnJvbSBhbiBpbXBvcnQgbmFtZVxuICogSGFuZGxlcyBzY29wZWQgcGFja2FnZXMgYW5kIHN1YnBhdGhzXG4gKlxuICogRXhhbXBsZXM6XG4gKiAtIFwiQHNjb3BlL3BhY2thZ2Uvc3VicGF0aFwiIC0+IFwiQHNjb3BlL3BhY2thZ2VcIlxuICogLSBcImxvZGFzaC9nZXRcIiAtPiBcImxvZGFzaFwiXG4gKiAtIFwicmVhY3RcIiAtPiBcInJlYWN0XCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RCYXNlUGFja2FnZU5hbWUoaW1wb3J0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGJhc2VQYWNrYWdlTmFtZSA9IGltcG9ydE5hbWVcbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAvLyBTY29wZWQgcGFja2FnZTogQHNjb3BlL3BhY2thZ2Ugb3IgQHNjb3BlL3BhY2thZ2Uvc3VicGF0aFxuICAgIGNvbnN0IHBhcnRzID0gaW1wb3J0TmFtZS5zcGxpdChcIi9cIilcbiAgICBiYXNlUGFja2FnZU5hbWUgPSBwYXJ0cy5sZW5ndGggPj0gMiA/IGAke3BhcnRzWzBdfS8ke3BhcnRzWzFdfWAgOiBpbXBvcnROYW1lXG4gIH0gZWxzZSB7XG4gICAgLy8gUmVndWxhciBwYWNrYWdlOiBwYWNrYWdlIG9yIHBhY2thZ2Uvc3VicGF0aFxuICAgIGJhc2VQYWNrYWdlTmFtZSA9IGltcG9ydE5hbWUuc3BsaXQoXCIvXCIpWzBdXG4gIH1cbiAgcmV0dXJuIGJhc2VQYWNrYWdlTmFtZVxufVxuIiwgImltcG9ydCB7IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9leHRyYWN0QmFzZVBhY2thZ2VOYW1lXCJcblxuLyoqXG4gKiBDaGVjayBpZiBhIHBhY2thZ2UgaXMgZGVjbGFyZWQgaW4gcGFja2FnZS5qc29uIChkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgb3IgcGVlckRlcGVuZGVuY2llcylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvbihcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgcGFja2FnZUpzb25Db250ZW50ID0gZnNNYXBbXCJwYWNrYWdlLmpzb25cIl1cbiAgaWYgKCFwYWNrYWdlSnNvbkNvbnRlbnQpIHtcbiAgICAvLyBObyBwYWNrYWdlLmpzb24gbWVhbnMgd2UgY2FuJ3QgdmFsaWRhdGUgLSBhbGxvdyB0aGUgaW1wb3J0XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uQ29udGVudClcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge31cbiAgICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge31cbiAgICBjb25zdCBwZWVyRGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyB8fCB7fVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgYmFzZSBwYWNrYWdlIG5hbWUgKGhhbmRsZSBzY29wZWQgcGFja2FnZXMgYW5kIHN1YnBhdGhzKVxuICAgIGNvbnN0IGJhc2VQYWNrYWdlTmFtZSA9IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpXG5cbiAgICByZXR1cm4gKFxuICAgICAgYmFzZVBhY2thZ2VOYW1lIGluIGRlcGVuZGVuY2llcyB8fFxuICAgICAgYmFzZVBhY2thZ2VOYW1lIGluIGRldkRlcGVuZGVuY2llcyB8fFxuICAgICAgYmFzZVBhY2thZ2VOYW1lIGluIHBlZXJEZXBlbmRlbmNpZXNcbiAgICApXG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIHdlIGNhbid0IHBhcnNlIHBhY2thZ2UuanNvbiwgYWxsb3cgdGhlIGltcG9ydFxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBleHRyYWN0QmFzZVBhY2thZ2VOYW1lIH0gZnJvbSBcIi4vZXh0cmFjdEJhc2VQYWNrYWdlTmFtZVwiXG5cbi8qKlxuICogQ2hlY2sgaWYgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBleGlzdHMgZm9yIHRoZSBwYWNrYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROb2RlTW9kdWxlRGlyZWN0b3J5KFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBiYXNlUGFja2FnZU5hbWUgPSBleHRyYWN0QmFzZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKVxuICBjb25zdCBub2RlTW9kdWxlUGF0aCA9IGBub2RlX21vZHVsZXMvJHtiYXNlUGFja2FnZU5hbWV9YFxuXG4gIC8vIENoZWNrIGlmIGFueSBmaWxlcyBleGlzdCB1bmRlciB0aGlzIHBhdGggaW4gZnNNYXBcbiAgY29uc3QgaGFzRmlsZXMgPSBPYmplY3Qua2V5cyhmc01hcCkuc29tZShcbiAgICAocGF0aCkgPT4gcGF0aC5zdGFydHNXaXRoKG5vZGVNb2R1bGVQYXRoICsgXCIvXCIpIHx8IHBhdGggPT09IG5vZGVNb2R1bGVQYXRoLFxuICApXG5cbiAgcmV0dXJuIGhhc0ZpbGVzID8gbm9kZU1vZHVsZVBhdGggOiBudWxsXG59XG4iLCAiaW1wb3J0IHsgZXh0cmFjdEJhc2VQYWNrYWdlTmFtZSB9IGZyb20gXCIuL2V4dHJhY3RCYXNlUGFja2FnZU5hbWVcIlxuXG4vKipcbiAqIEdldCB0aGUgZW50cnlwb2ludCBmcm9tIHBhY2thZ2UuanNvbiAodGhlIFwibWFpblwiIG9yIFwibW9kdWxlXCIgZmllbGQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQoXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGJhc2VQYWNrYWdlTmFtZSA9IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGBub2RlX21vZHVsZXMvJHtiYXNlUGFja2FnZU5hbWV9L3BhY2thZ2UuanNvbmBcblxuICBjb25zdCBwYWNrYWdlSnNvbkNvbnRlbnQgPSBmc01hcFtwYWNrYWdlSnNvblBhdGhdXG4gIGlmICghcGFja2FnZUpzb25Db250ZW50KSByZXR1cm4gbnVsbFxuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uQ29udGVudClcbiAgICAvLyBUcnkgbWFpbiwgbW9kdWxlLCBvciBleHBvcnRzIGZpZWxkIChpbiBvcmRlciBvZiBwcmVmZXJlbmNlKVxuICAgIHJldHVybiBwYWNrYWdlSnNvbi5tYWluIHx8IHBhY2thZ2VKc29uLm1vZHVsZSB8fCBudWxsXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbiIsICIvKipcbiAqIENoZWNrIGlmIHRoZSBlbnRyeXBvaW50IGlzIGEgVHlwZVNjcmlwdCBmaWxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1R5cGVTY3JpcHRFbnRyeXBvaW50KGVudHJ5cG9pbnQ6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcbiAgaWYgKCFlbnRyeXBvaW50KSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGVudHJ5cG9pbnQuZW5kc1dpdGgoXCIudHNcIikgfHwgZW50cnlwb2ludC5lbmRzV2l0aChcIi50c3hcIilcbn1cbiIsICJpbXBvcnQgeyBleHRyYWN0QmFzZVBhY2thZ2VOYW1lIH0gZnJvbSBcIi4vZXh0cmFjdEJhc2VQYWNrYWdlTmFtZVwiXG5cbi8qKlxuICogQ2hlY2sgaWYgZGlzdCBkaXJlY3RvcnkgZXhpc3RzIGFuZCBoYXMgZmlsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGlzdERpckVtcHR5KFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlUGFja2FnZU5hbWUgPSBleHRyYWN0QmFzZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKVxuICBjb25zdCBkaXN0UGF0aCA9IGBub2RlX21vZHVsZXMvJHtiYXNlUGFja2FnZU5hbWV9L2Rpc3RgXG5cbiAgLy8gQ2hlY2sgaWYgYW55IGZpbGVzIGV4aXN0IHVuZGVyIGRpc3QvXG4gIGNvbnN0IGhhc0ZpbGVzID0gT2JqZWN0LmtleXMoZnNNYXApLnNvbWUoKHBhdGgpID0+XG4gICAgcGF0aC5zdGFydHNXaXRoKGRpc3RQYXRoICsgXCIvXCIpLFxuICApXG5cbiAgcmV0dXJuICFoYXNGaWxlc1xufVxuIiwgImltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcImxpYi91dGlscy9kaXJuYW1lXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgZ2V0SW1wb3J0c0Zyb21Db2RlIH0gZnJvbSBcImxpYi91dGlscy9nZXQtaW1wb3J0cy1mcm9tLWNvZGVcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwiLi9pbXBvcnQtZXZhbC1wYXRoXCJcbmltcG9ydCB7IHRyYW5zZm9ybVdpdGhTdWNyYXNlIH0gZnJvbSBcImxpYi90cmFuc3BpbGUvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZVwiXG5pbXBvcnQgeyBpc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24gfSBmcm9tIFwiLi9pc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb25cIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmltcG9ydC1ucG0tcGFja2FnZVwiKVxuXG5mdW5jdGlvbiBleHRyYWN0UGFja2FnZVBhdGhGcm9tSlNEZWxpdnIodXJsOiBzdHJpbmcpIHtcbiAgY29uc3QgcHJlZml4ID0gXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL1wiXG4gIGlmICh1cmwuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgcmV0dXJuIHVybC5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkucmVwbGFjZSgvXFwvXFwrZXNtJC8sIFwiXCIpXG4gIH1cbiAgcmV0dXJuIHVybFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0TnBtUGFja2FnZShcbiAge1xuICAgIGltcG9ydE5hbWUsXG4gICAgZGVwdGggPSAwLFxuICAgIGZyb21Kc0RlbGl2ciA9IGZhbHNlLFxuICB9OiB7IGltcG9ydE5hbWU6IHN0cmluZzsgZGVwdGg/OiBudW1iZXI7IGZyb21Kc0RlbGl2cj86IGJvb2xlYW4gfSxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuKSB7XG4gIGRlYnVnKGBpbXBvcnRpbmcgbnBtIHBhY2thZ2U6ICR7aW1wb3J0TmFtZX1gKVxuICBjb25zdCB7IHByZVN1cHBsaWVkSW1wb3J0cywgZnNNYXAgfSA9IGN0eFxuXG4gIGlmIChwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHJldHVyblxuXG4gIC8vIENoZWNrIGlmIHRoZSBwYWNrYWdlIGlzIGRlY2xhcmVkIGluIHBhY2thZ2UuanNvbiBiZWZvcmUgZmV0Y2hpbmcgZnJvbSBqc0RlbGl2clxuICAvLyBTa2lwIHRoaXMgY2hlY2sgZm9yIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIChzdWItaW1wb3J0cyBmcm9tIGpzRGVsaXZyIHBhY2thZ2VzKVxuICBpZiAoIWZyb21Kc0RlbGl2ciAmJiAhaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uKGltcG9ydE5hbWUsIGZzTWFwKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBQYWNrYWdlIFwiJHtpbXBvcnROYW1lfVwiIGlzIG5vdCBkZWNsYXJlZCBpbiBwYWNrYWdlLmpzb24uIGAgK1xuICAgICAgICBgQWRkIGl0IHRvIGRlcGVuZGVuY2llcyBvciBkZXZEZXBlbmRlbmNpZXMgYmVmb3JlIGltcG9ydGluZy5cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgbnBtQ2RuVXJsID0gYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vJHtpbXBvcnROYW1lfS8rZXNtYFxuXG4gIGxldCBmaW5hbFVybDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIGNvbnN0IHsgY29udGVudCwgZXJyb3IgfSA9IGF3YWl0IGdsb2JhbFRoaXNcbiAgICAuZmV0Y2gobnBtQ2RuVXJsKVxuICAgIC50aGVuKGFzeW5jIChyZXMpID0+IHtcbiAgICAgIGZpbmFsVXJsID0gcmVzLnVybFxuICAgICAgaWYgKCFyZXMub2spXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZldGNoIFwiJHtpbXBvcnROYW1lfVwiIGZyb20ganNkZWxpdnI6ICR7cmVzLnN0YXR1c1RleHR9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgICApXG4gICAgICByZXR1cm4geyBjb250ZW50OiBhd2FpdCByZXMudGV4dCgpLCBlcnJvcjogbnVsbCB9XG4gICAgfSlcbiAgICAuY2F0Y2goKGUpID0+ICh7IGVycm9yOiBlLCBjb250ZW50OiBudWxsIH0pKVxuXG4gIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBucG0gaW1wb3J0XCIsIGltcG9ydE5hbWUsIGVycm9yKVxuICAgIHRocm93IGVycm9yXG4gIH1cblxuICBjb25zdCBmaW5hbEltcG9ydE5hbWUgPSBleHRyYWN0UGFja2FnZVBhdGhGcm9tSlNEZWxpdnIoZmluYWxVcmwhKVxuICBjb25zdCBjd2QgPSBkaXJuYW1lKGZpbmFsSW1wb3J0TmFtZSlcblxuICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShjb250ZW50ISlcbiAgZm9yIChjb25zdCBzdWJJbXBvcnROYW1lIG9mIGltcG9ydE5hbWVzKSB7XG4gICAgaWYgKCFwcmVTdXBwbGllZEltcG9ydHNbc3ViSW1wb3J0TmFtZV0pIHtcbiAgICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKHN1YkltcG9ydE5hbWUsIGN0eCwgZGVwdGggKyAxLCB7XG4gICAgICAgIGN3ZCxcbiAgICAgICAgZnJvbUpzRGVsaXZyOiB0cnVlLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBjb25zdCB0cmFuc2Zvcm1lZENvZGUgPSB0cmFuc2Zvcm1XaXRoU3VjcmFzZShcbiAgICBjb250ZW50ISxcbiAgICBmaW5hbEltcG9ydE5hbWUgfHwgaW1wb3J0TmFtZSxcbiAgKVxuICB0cnkge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgIHRyYW5zZm9ybWVkQ29kZSxcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgIGN3ZCxcbiAgICApLmV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBleHBvcnRzXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZpbmFsSW1wb3J0TmFtZV0gPSBleHBvcnRzXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZpbmFsVXJsIV0gPSBleHBvcnRzXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBFdmFsIG5wbSBwYWNrYWdlIGVycm9yIGZvciBcIiR7aW1wb3J0TmFtZX1cIjogJHtlLm1lc3NhZ2V9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgIClcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGltcG9ydExvY2FsRmlsZSB9IGZyb20gXCIuL2ltcG9ydC1sb2NhbC1maWxlXCJcbmltcG9ydCB7IGltcG9ydFNuaXBwZXQgfSBmcm9tIFwiLi9pbXBvcnQtc25pcHBldFwiXG5pbXBvcnQgeyByZXNvbHZlRmlsZVBhdGggfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgcmVzb2x2ZU5vZGVNb2R1bGUgfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGVcIlxuaW1wb3J0IHsgaW1wb3J0Tm9kZU1vZHVsZSB9IGZyb20gXCIuL2ltcG9ydC1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgeyBpbXBvcnROcG1QYWNrYWdlIH0gZnJvbSBcIi4vaW1wb3J0LW5wbS1wYWNrYWdlXCJcbmltcG9ydCB7XG4gIGdldFRzQ29uZmlnLFxuICBtYXRjaGVzVHNjb25maWdQYXRoUGF0dGVybixcbn0gZnJvbSBcImxpYi9ydW5uZXIvdHNjb25maWdQYXRoc1wiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IGlzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvbiB9IGZyb20gXCIuL2lzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvblwiXG5pbXBvcnQgeyBnZXROb2RlTW9kdWxlRGlyZWN0b3J5IH0gZnJvbSBcIi4vZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeVwiXG5pbXBvcnQgeyBnZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQgfSBmcm9tIFwiLi9nZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnRcIlxuaW1wb3J0IHsgaXNUeXBlU2NyaXB0RW50cnlwb2ludCB9IGZyb20gXCIuL2lzVHlwZVNjcmlwdEVudHJ5cG9pbnRcIlxuaW1wb3J0IHsgaXNEaXN0RGlyRW1wdHkgfSBmcm9tIFwiLi9pc0Rpc3REaXJFbXB0eVwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LWV2YWwtcGF0aFwiKVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0RXZhbFBhdGgoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4gIG9wdHM6IHtcbiAgICBjd2Q/OiBzdHJpbmdcbiAgICBmcm9tSnNEZWxpdnI/OiBib29sZWFuXG4gIH0gPSB7fSxcbikge1xuICBkZWJ1ZyhcImltcG9ydEV2YWxQYXRoIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgaW1wb3J0TmFtZSxcbiAgICBkZXB0aCxcbiAgICBvcHRzLFxuICB9KVxuICBjdHgubG9nZ2VyLmluZm8oXG4gICAgYGltcG9ydEV2YWxQYXRoKFwiJHtpbXBvcnROYW1lfVwiLCB7Y3dkOiBcIiR7b3B0cy5jd2R9XCIsIGRlcHRoOiAke2RlcHRofX0pYCxcbiAgKVxuXG4gIGRlYnVnKGAke1wiICBcIi5yZXBlYXQoZGVwdGgpfVx1MjdBMVx1RkUwRmAsIGltcG9ydE5hbWUpXG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcbiAgY29uc3QgZGlzYWJsZUNkbkxvYWRpbmcgPVxuICAgIGN0eC5kaXNhYmxlQ2RuTG9hZGluZyB8fCAoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fRElTQUJMRV9DRE5fTE9BRElOR19fXG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIGluIHByZVN1cHBsaWVkSW1wb3J0c1sxXWApXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi4vXCIpICYmIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lLnNsaWNlKDIpXSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIGluIHByZVN1cHBsaWVkSW1wb3J0c1syXWApXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBIYW5kbGUgc3VicGF0aCBpbXBvcnRzIGZyb20gcHJlU3VwcGxpZWRJbXBvcnRzIChlLmcuLCBcInJlYWN0L2pzeC1ydW50aW1lXCIpXG4gIC8vIElmIHRoZSBiYXNlIHBhY2thZ2UgaXMgaW4gcHJlU3VwcGxpZWRJbXBvcnRzLCB0cnkgdG8gaW1wb3J0IGZyb20gdGhlIGFjdHVhbCBwYWNrYWdlXG4gIGlmIChcbiAgICBpbXBvcnROYW1lLmluY2x1ZGVzKFwiL1wiKSAmJlxuICAgICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIuXCIpICYmXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9cIilcbiAgKSB7XG4gICAgY29uc3QgYmFzZVBrZyA9IGltcG9ydE5hbWUuc3BsaXQoXCIvXCIpWzBdXG4gICAgY29uc3QgaXNTY29wZWQgPSBiYXNlUGtnLnN0YXJ0c1dpdGgoXCJAXCIpXG4gICAgY29uc3QgcGtnTmFtZSA9IGlzU2NvcGVkXG4gICAgICA/IGltcG9ydE5hbWUuc3BsaXQoXCIvXCIpLnNsaWNlKDAsIDIpLmpvaW4oXCIvXCIpXG4gICAgICA6IGJhc2VQa2dcbiAgICBjb25zdCBzdWJwYXRoID0gaXNTY29wZWRcbiAgICAgID8gaW1wb3J0TmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMikuam9pbihcIi9cIilcbiAgICAgIDogaW1wb3J0TmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMSkuam9pbihcIi9cIilcblxuICAgIGlmIChwcmVTdXBwbGllZEltcG9ydHNbcGtnTmFtZV0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRyeSB0byBpbXBvcnQgdGhlIHN1YnBhdGggZnJvbSB0aGUgYWN0dWFsIHBhY2thZ2VcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBpbXBvcnQoYCR7cGtnTmFtZX0vJHtzdWJwYXRofWApXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHJlc29sdmVkXG4gICAgICAgIGN0eC5sb2dnZXIuaW5mbyhcbiAgICAgICAgICBgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIHJlc29sdmVkIGZyb20gcHJlU3VwcGxpZWRJbXBvcnRzIGJhc2UgcGFja2FnZSBcIiR7cGtnTmFtZX1cImAsXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiB0aGUgZHluYW1pYyBpbXBvcnQgZmFpbHMsIGNvbnRpbnVlIHdpdGggbm9ybWFsIHJlc29sdXRpb25cbiAgICAgICAgY3R4LmxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBGYWlsZWQgdG8gcmVzb2x2ZSBcIiR7aW1wb3J0TmFtZX1cIiBmcm9tIHByZVN1cHBsaWVkSW1wb3J0cyBwYWNrYWdlIFwiJHtwa2dOYW1lfVwiLCBmYWxsaW5nIGJhY2sgdG8gbm9ybWFsIHJlc29sdXRpb25gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGRlcHRoID4gMzApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTWF4IGRlcHRoIGZvciBpbXBvcnRzIHJlYWNoZWQgKDMwKSBJbXBvcnQgUGF0aDogJHtjdHguaW1wb3J0U3RhY2suam9pbihcIiAtPiBcIil9YCxcbiAgICApXG4gIH1cblxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL25wbS9cIikpIHtcbiAgICBjb25zdCBwa2dOYW1lID0gaW1wb3J0TmFtZS5yZXBsYWNlKC9eXFwvbnBtXFwvLywgXCJcIikucmVwbGFjZSgvXFwvXFwrZXNtJC8sIFwiXCIpXG4gICAgaWYgKGRpc2FibGVDZG5Mb2FkaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgZmluZCBtb2R1bGUgXCIke3BrZ05hbWV9XCIuIFRoZSBwYWNrYWdlIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGxvY2FsIGVudmlyb25tZW50LlxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgIClcbiAgICB9XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnROcG1QYWNrYWdlKFwiJHtwa2dOYW1lfVwiKWApXG4gICAgLy8gL25wbS8gcGF0aHMgYXJlIGFsd2F5cyB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyBmcm9tIGpzRGVsaXZyXG4gICAgYXdhaXQgaW1wb3J0TnBtUGFja2FnZShcbiAgICAgIHsgaW1wb3J0TmFtZTogcGtnTmFtZSwgZGVwdGgsIGZyb21Kc0RlbGl2cjogdHJ1ZSB9LFxuICAgICAgY3R4LFxuICAgIClcbiAgICBjb25zdCBwa2cgPSBwcmVTdXBwbGllZEltcG9ydHNbcGtnTmFtZV1cbiAgICBpZiAocGtnKSB7XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBwa2dcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBEZXRlcm1pbmUgd2hlcmUgdHNjb25maWcuanNvbiBpcyBsb2NhdGVkXG4gIGxldCB0c2NvbmZpZ0RpciA9IFwiLlwiXG4gIGxldCB0c0NvbmZpZ1RvVXNlID0gY3R4LnRzQ29uZmlnXG4gIGlmIChjdHgudHNDb25maWcgJiYgb3B0cy5jd2QpIHtcbiAgICAvLyBJZiBjd2QgaXMgaW4gbm9kZV9tb2R1bGVzLCBmaW5kIHRoZSBwYWNrYWdlIHJvb3RcbiAgICAvLyBlLmcuLCBcIm5vZGVfbW9kdWxlcy9hZG9tLWxpYnJhcnkvbGliL2dlbmVyYXRlZFwiIC0+IFwibm9kZV9tb2R1bGVzL2Fkb20tbGlicmFyeVwiXG4gICAgY29uc3Qgbm9kZU1vZHVsZXNNYXRjaCA9IG9wdHMuY3dkLm1hdGNoKC9eKG5vZGVfbW9kdWxlc1xcL1teXFwvXSspLylcbiAgICBpZiAobm9kZU1vZHVsZXNNYXRjaCkge1xuICAgICAgdHNjb25maWdEaXIgPSBub2RlTW9kdWxlc01hdGNoWzFdXG4gICAgICB0c0NvbmZpZ1RvVXNlID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKFxuICAgIGltcG9ydE5hbWUsXG4gICAgY3R4LmZzTWFwLFxuICAgIG9wdHMuY3dkLFxuICAgIHsgdHNDb25maWc6IHRzQ29uZmlnVG9Vc2UsIHRzY29uZmlnRGlyIH0sXG4gIClcbiAgaWYgKHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnRMb2NhbEZpbGUoXCIke3Jlc29sdmVkTG9jYWxJbXBvcnRQYXRofVwiKWApXG4gICAgYXdhaXQgaW1wb3J0TG9jYWxGaWxlKHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoLCBjdHgsIGRlcHRoKVxuICAgIC8vIE1hcCB0aGUgb3JpZ2luYWwgaW1wb3J0IG5hbWUgKHdoaWNoIG1pZ2h0IGJlIGEgdHNjb25maWcgcGF0aCBhbGlhcykgdG8gdGhlIHJlc29sdmVkIG1vZHVsZVxuICAgIGlmIChpbXBvcnROYW1lICE9PSByZXNvbHZlZExvY2FsSW1wb3J0UGF0aCkge1xuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID1cbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTG9jYWxJbXBvcnRQYXRoXVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoaXMgbWF0Y2hlcyBhIHRzY29uZmlnIHBhdGggcGF0dGVybiBidXQgZmFpbGVkIHRvIHJlc29sdmVcbiAgLy8gSWYgc28sIHRocm93IGFuIGVycm9yIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIHRvIG5wbVxuICBjb25zdCB0c0NvbmZpZyA9IGN0eC50c0NvbmZpZyA/PyBnZXRUc0NvbmZpZyhjdHguZnNNYXApXG4gIGlmICghY3R4LnRzQ29uZmlnICYmIHRzQ29uZmlnKSB7XG4gICAgY3R4LnRzQ29uZmlnID0gdHNDb25maWdcbiAgfVxuICBpZiAobWF0Y2hlc1RzY29uZmlnUGF0aFBhdHRlcm4oaW1wb3J0TmFtZSwgdHNDb25maWcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiBtYXRjaGVzIGEgdHNjb25maWcgcGF0aCBhbGlhcyBidXQgY291bGQgbm90IGJlIHJlc29sdmVkIHRvIGFuIGV4aXN0aW5nIGZpbGUke29wdHMuY3dkID8gYCBmcm9tIGRpcmVjdG9yeSBcIiR7b3B0cy5jd2R9XCJgIDogXCJcIn1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgKVxuICB9XG5cbiAgLy8gVHJ5IHRvIHJlc29sdmUgZnJvbSBub2RlX21vZHVsZXNcbiAgY29uc3QgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCA9IHJlc29sdmVOb2RlTW9kdWxlKFxuICAgIGltcG9ydE5hbWUsXG4gICAgY3R4LmZzTWFwLFxuICAgIG9wdHMuY3dkIHx8IFwiXCIsXG4gIClcbiAgaWYgKHJlc29sdmVkTm9kZU1vZHVsZVBhdGgpIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYHJlc29sdmVkTm9kZU1vZHVsZVBhdGg9XCIke3Jlc29sdmVkTm9kZU1vZHVsZVBhdGh9XCJgKVxuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0Tm9kZU1vZHVsZShcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnROb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICAvLyBJZiBub3QgZm91bmQgaW4gZnNNYXAgYnV0IG1pZ2h0IGJlIGEgbm9kZSBtb2R1bGUsIHRyeSBpbXBvcnROb2RlTW9kdWxlXG4gIC8vIHdoaWNoIHdpbGwgYXR0ZW1wdCB0byB1c2Ugbm9kZU1vZHVsZXNSZXNvbHZlciBpZiBjb25maWd1cmVkXG4gIGlmIChcbiAgICAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLlwiKSAmJlxuICAgICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIvXCIpICYmXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIkB0c2NpL1wiKVxuICApIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGN0eC5jaXJjdWl0Py5wbGF0Zm9ybVxuICAgIGlmIChwbGF0Zm9ybT8ubm9kZU1vZHVsZXNSZXNvbHZlcikge1xuICAgICAgY3R4LmxvZ2dlci5pbmZvKFxuICAgICAgICBgaW1wb3J0Tm9kZU1vZHVsZShcIiR7aW1wb3J0TmFtZX1cIikgdmlhIG5vZGVNb2R1bGVzUmVzb2x2ZXJgLFxuICAgICAgKVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgaW1wb3J0Tm9kZU1vZHVsZShpbXBvcnROYW1lLCBjdHgsIGRlcHRoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGN0eC5sb2dnZXIuaW5mbyhcbiAgICAgICAgICBgbm9kZU1vZHVsZXNSZXNvbHZlciBmYWlsZWQgZm9yIFwiJHtpbXBvcnROYW1lfVwiLCBmYWxsaW5nIGJhY2sgdG8gbnBtIENETmAsXG4gICAgICAgIClcbiAgICAgICAgaWYgKGRpc2FibGVDZG5Mb2FkaW5nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBmaW5kIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIi4gVGhlIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbG9jYWwgZW52aXJvbm1lbnQgYW5kIGF1dG9tYXRpYyBucG0gcmVzb2x1dGlvbiBpcyBkaXNhYmxlZC5cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0U25pcHBldChcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnRTbmlwcGV0KGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICBpZiAoIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiYgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAvLyBWYWxpZGF0aW9uIHN0ZXBzIGZvciBub2RlIG1vZHVsZXMgKGJlZm9yZSBqc0RlbGl2ciBmYWxsYmFjaylcbiAgICBpZiAoIW9wdHMuZnJvbUpzRGVsaXZyKSB7XG4gICAgICAvLyBTdGVwIDE6IENoZWNrIGlmIHBhY2thZ2UgaXMgZGVjbGFyZWQgaW4gcGFja2FnZS5qc29uXG4gICAgICBpZiAoIWlzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvbihpbXBvcnROYW1lLCBjdHguZnNNYXApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm9kZSBtb2R1bGUgaW1wb3J0ZWQgYnV0IG5vdCBpbiBwYWNrYWdlLmpzb24gXCIke2ltcG9ydE5hbWV9XCJcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCAyOiBDaGVjayBpZiBub2RlX21vZHVsZXMgZGlyZWN0b3J5IGV4aXN0cyAob25seSBpZiBub3QgZm91bmQgbG9jYWxseSB5ZXQpXG4gICAgICAvLyBPbmx5IHZhbGlkYXRlIGlmIENETiBsb2FkaW5nIGlzIGRpc2FibGVkIChpLmUuLCBubyBmYWxsYmFjayB0byBqc0RlbGl2ciBhdmFpbGFibGUpXG4gICAgICBjb25zdCBub2RlTW9kdWxlRGlyID0gZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeShpbXBvcnROYW1lLCBjdHguZnNNYXApXG4gICAgICBpZiAoIW5vZGVNb2R1bGVEaXIgJiYgZGlzYWJsZUNkbkxvYWRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgbm8gZmlsZXMgaW4gdGhlIG5vZGVfbW9kdWxlcyBkaXJlY3RvcnlcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCAzOiBDaGVjayBpZiBtYWluIGVudHJ5cG9pbnQgaXMgYSBUeXBlU2NyaXB0IGZpbGUgKG9ubHkgaWYgZGlyIGV4aXN0cylcbiAgICAgIGlmIChub2RlTW9kdWxlRGlyKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5cG9pbnQgPSBnZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQoaW1wb3J0TmFtZSwgY3R4LmZzTWFwKVxuICAgICAgICBpZiAoaXNUeXBlU2NyaXB0RW50cnlwb2ludChlbnRyeXBvaW50KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgYSB0eXBlc2NyaXB0IGVudHJ5cG9pbnQgdGhhdCBpcyB1bnN1cHBvcnRlZFxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDQ6IENoZWNrIGlmIGRpc3QgZGlyZWN0b3J5IGlzIGVtcHR5IHdoZW4gbWFpbiBwb2ludHMgdG8gZGlzdFxuICAgICAgICBpZiAoZW50cnlwb2ludCAmJiBlbnRyeXBvaW50LnN0YXJ0c1dpdGgoXCJkaXN0L1wiKSkge1xuICAgICAgICAgIGlmIChpc0Rpc3REaXJFbXB0eShpbXBvcnROYW1lLCBjdHguZnNNYXApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgbm8gZmlsZXMgaW4gZGlzdCwgZGlkIHlvdSBmb3JnZXQgdG8gdHJhbnNwaWxlP1xcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZUNkbkxvYWRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBmaW5kIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIi4gVGhlIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbG9jYWwgZW52aXJvbm1lbnQuXFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgKVxuICAgIH1cbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydE5wbVBhY2thZ2UoXCIke2ltcG9ydE5hbWV9XCIpYClcbiAgICByZXR1cm4gaW1wb3J0TnBtUGFja2FnZShcbiAgICAgIHsgaW1wb3J0TmFtZSwgZGVwdGgsIGZyb21Kc0RlbGl2cjogb3B0cy5mcm9tSnNEZWxpdnIgfSxcbiAgICAgIGN0eCxcbiAgICApXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFVucmVzb2x2ZWQgaW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiICR7b3B0cy5jd2QgPyBgZnJvbSBkaXJlY3RvcnkgXCIke29wdHMuY3dkfVwiYCA6IFwiXCJ9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICApXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBbnlDaXJjdWl0RWxlbWVudCB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuaW1wb3J0IHR5cGUge1xuICBDaXJjdWl0UnVubmVyQXBpLFxuICBDaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbn0gZnJvbSBcImxpYi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJAdHNjaXJjdWl0L3Byb3BzXCJcbmltcG9ydCB7IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQsIGltcG9ydEV2YWxQYXRoIH0gZnJvbSBcImxpYi9ldmFsXCJcbmltcG9ydCB7IG5vcm1hbGl6ZUZzTWFwIH0gZnJvbSBcIi4vbm9ybWFsaXplRnNNYXBcIlxuaW1wb3J0IHsgZ2V0VHNDb25maWcgfSBmcm9tIFwiLi90c2NvbmZpZ1BhdGhzXCJcbmltcG9ydCB0eXBlIHsgUm9vdENpcmN1aXQgfSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQgfSBmcm9tIFwiLi9zZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWRcIlxuaW1wb3J0IHsgZW5oYW5jZVJvb3RDaXJjdWl0SGFzTm9DaGlsZHJlbkVycm9yIH0gZnJvbSBcImxpYi91dGlscy9lbmhhbmNlLXJvb3QtY2lyY3VpdC1lcnJvclwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IHNldFZhbHVlQXRQYXRoIH0gZnJvbSBcImxpYi9zaGFyZWQvb2JqLXBhdGhcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOkNpcmN1aXRSdW5uZXJcIilcblxuZXhwb3J0IGNsYXNzIENpcmN1aXRSdW5uZXIgaW1wbGVtZW50cyBDaXJjdWl0UnVubmVyQXBpIHtcbiAgX2V4ZWN1dGlvbkNvbnRleHQ6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQ+IHwgbnVsbCA9IG51bGxcbiAgX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uOiBDaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbiA9IHtcbiAgICBzbmlwcGV0c0FwaUJhc2VVcmw6IFwiaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbVwiLFxuICAgIGNqc1JlZ2lzdHJ5VXJsOiBcImh0dHBzOi8vY2pzLnRzY2lyY3VpdC5jb21cIixcbiAgICB2ZXJib3NlOiBmYWxzZSxcbiAgfVxuICBfZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsICgoLi4uYXJnczogYW55W10pID0+IHZvaWQpW10+ID0ge31cbiAgX2RlYnVnTmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICBjb25zdHJ1Y3Rvcihjb25maWd1cmF0aW9uOiBQYXJ0aWFsPENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uPiA9IHt9KSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbiwgY29uZmlndXJhdGlvbilcbiAgfVxuXG4gIGFzeW5jIHZlcnNpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gXCIwLjAuMFwiXG4gIH1cblxuICBhc3luYyBleGVjdXRlV2l0aEZzTWFwKG9nT3B0czoge1xuICAgIGVudHJ5cG9pbnQ/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50UGF0aD86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnROYW1lPzogc3RyaW5nXG4gICAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBuYW1lPzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb3B0cyA9IHsgLi4ub2dPcHRzIH1cblxuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBEZWJ1Zy5lbmFibGUoXCJ0c2NpOmV2YWw6KlwiKVxuICAgIH1cblxuICAgIGRlYnVnKFwiZXhlY3V0ZVdpdGhGc01hcCBjYWxsZWQgd2l0aDpcIiwge1xuICAgICAgZW50cnlwb2ludDogb3B0cy5lbnRyeXBvaW50LFxuICAgICAgZnNNYXBLZXlzOiBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKSxcbiAgICAgIG5hbWU6IG9wdHMubmFtZSxcbiAgICB9KVxuXG4gICAgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkKG9wdHMpXG5cbiAgICBkZWJ1ZyhcImVudHJ5cG9pbnQgYWZ0ZXIgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkOlwiLCB7XG4gICAgICBlbnRyeXBvaW50OiBvcHRzLmVudHJ5cG9pbnQsXG4gICAgfSlcblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IG9wdHMubmFtZSxcbiAgICAgICAgcGxhdGZvcm06IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLFxuICAgICAgICBwcm9qZWN0Q29uZmlnOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgICBkZWJ1Z05hbWVzcGFjZTogdGhpcy5fZGVidWdOYW1lc3BhY2UsXG4gICAgICB9LFxuICAgIClcbiAgICB0aGlzLl9iaW5kRXZlbnRMaXN0ZW5lcnModGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0KVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5lbnRyeXBvaW50ID0gb3B0cy5lbnRyeXBvaW50IVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXAgPSBub3JtYWxpemVGc01hcChvcHRzLmZzTWFwKVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBnZXRUc0NvbmZpZyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwKVxuICAgIGlmICghdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcFtvcHRzLmVudHJ5cG9pbnQhXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRyeXBvaW50IFwiJHtvcHRzLmVudHJ5cG9pbnR9XCIgbm90IGZvdW5kYClcbiAgICB9XG4gICAgOyhnbG9iYWxUaGlzIGFzIGFueSkuX190c2NpcmN1aXRfY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdFxuXG4gICAgY29uc3QgZW50cnlwb2ludCA9IG9wdHMuZW50cnlwb2ludCEuc3RhcnRzV2l0aChcIi4vXCIpXG4gICAgICA/IG9wdHMuZW50cnlwb2ludFxuICAgICAgOiBgLi8ke29wdHMuZW50cnlwb2ludH1gXG5cbiAgICBkZWJ1ZyhcImZpbmFsIGVudHJ5cG9pbnQ6XCIsIGVudHJ5cG9pbnQpXG4gICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoZW50cnlwb2ludCEsIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpXG4gIH1cblxuICBhc3luYyBleGVjdXRlKGNvZGU6IHN0cmluZywgb3B0czogeyBuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgXCJbQ2lyY3VpdFJ1bm5lcl0gZXhlY3V0ZSBjYWxsZWQgd2l0aCBjb2RlIGxlbmd0aDpcIixcbiAgICAgICAgY29kZS5sZW5ndGgsXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIHtcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgcGxhdGZvcm06IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLFxuICAgICAgICBwcm9qZWN0Q29uZmlnOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgICBkZWJ1Z05hbWVzcGFjZTogdGhpcy5fZGVidWdOYW1lc3BhY2UsXG4gICAgICB9LFxuICAgIClcbiAgICB0aGlzLl9iaW5kRXZlbnRMaXN0ZW5lcnModGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0KVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXBbXCJlbnRyeXBvaW50LnRzeFwiXSA9IGNvZGVcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LnRzQ29uZmlnID0gZ2V0VHNDb25maWcodGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcClcbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG5cbiAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChcIi4vZW50cnlwb2ludC50c3hcIiwgdGhpcy5fZXhlY3V0aW9uQ29udGV4dClcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVDb21wb25lbnQoY29tcG9uZW50OiBhbnksIG9wdHM6IHsgbmFtZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBpZiAodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coXCJbQ2lyY3VpdFJ1bm5lcl0gZXhlY3V0ZUNvbXBvbmVudCBjYWxsZWRcIilcbiAgICB9XG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxuICAgICAge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgOyhnbG9iYWxUaGlzIGFzIGFueSkuX190c2NpcmN1aXRfY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdFxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBudWxsXG5cbiAgICBjb25zdCBlbGVtZW50ID0gdHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiID8gY29tcG9uZW50KCkgOiBjb21wb25lbnRcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQuYWRkKGVsZW1lbnQgYXMgYW55KVxuICB9XG5cbiAgb24oZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSA/Pz0gW11cbiAgICB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0ucHVzaChjYWxsYmFjaylcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0Py5jaXJjdWl0Lm9uKGV2ZW50IGFzIGFueSwgY2FsbGJhY2spXG4gIH1cblxuICBhc3luYyByZW5kZXJVbnRpbFNldHRsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5yZW5kZXJVbnRpbFNldHRsZWQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0Q2lyY3VpdEpzb24oKTogUHJvbWlzZTxBbnlDaXJjdWl0RWxlbWVudFtdPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQuZ2V0Q2lyY3VpdEpzb24oKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY2xlYXJFdmVudExpc3RlbmVycygpIHtcbiAgICBpZiAodGhpcy5fZXhlY3V0aW9uQ29udGV4dD8uY2lyY3VpdCkge1xuICAgICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSkge1xuICAgICAgICAgIGNvbnN0IGNpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IDxleHBsYW5hdGlvbj5cbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyPzogKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBGdW5jdGlvbikgPT4gdm9pZFxuICAgICAgICAgIH1cbiAgICAgICAgICBjaXJjdWl0LnJlbW92ZUxpc3RlbmVyPy4oZXZlbnQsIGxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGtpbGwoKSB7XG4gICAgLy8gQ2xlYW51cCByZXNvdXJjZXNcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gbnVsbFxuICB9XG5cbiAgYXN5bmMgc2V0U25pcHBldHNBcGlCYXNlVXJsKGJhc2VVcmw6IHN0cmluZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybCA9IGJhc2VVcmxcbiAgfVxuXG4gIGFzeW5jIHNldERpc2FibGVDZG5Mb2FkaW5nKGRpc2FibGU6IGJvb2xlYW4pIHtcbiAgICA7KHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uIGFzIGFueSkuZGlzYWJsZUNkbkxvYWRpbmcgPSBkaXNhYmxlXG4gIH1cblxuICBhc3luYyBzZXRQbGF0Zm9ybUNvbmZpZyhwbGF0Zm9ybTogUGxhdGZvcm1Db25maWcpIHtcbiAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSA9IHBsYXRmb3JtXG4gIH1cblxuICBhc3luYyBzZXRQbGF0Zm9ybUNvbmZpZ1Byb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtKSB7XG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSA9IHt9XG4gICAgfVxuICAgIHNldFZhbHVlQXRQYXRoKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLCBwcm9wZXJ0eSwgdmFsdWUpXG4gIH1cblxuICBhc3luYyBzZXRQcm9qZWN0Q29uZmlnKHByb2plY3Q6IFBhcnRpYWw8UGxhdGZvcm1Db25maWc+KSB7XG4gICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyA9IHByb2plY3RcbiAgfVxuXG4gIGFzeW5jIHNldFByb2plY3RDb25maWdQcm9wZXJ0eShwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCF0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnKSB7XG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnID0ge31cbiAgICB9XG4gICAgc2V0VmFsdWVBdFBhdGgoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgcHJvcGVydHksXG4gICAgICB2YWx1ZSxcbiAgICApXG4gIH1cblxuICBhc3luYyBlbmFibGVEZWJ1ZyhuYW1lc3BhY2U6IHN0cmluZykge1xuICAgIHRoaXMuX2RlYnVnTmFtZXNwYWNlID0gbmFtZXNwYWNlXG4gICAgaWYgKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIGNvbnN0IGNpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQgYXMgYW55XG4gICAgICBjaXJjdWl0LmVuYWJsZURlYnVnPy4obmFtZXNwYWNlKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2JpbmRFdmVudExpc3RlbmVycyhjaXJjdWl0OiBSb290Q2lyY3VpdCkge1xuICAgIGZvciAoY29uc3QgZXZlbnQgaW4gdGhpcy5fZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgIGNpcmN1aXQub24oZXZlbnQgYXMgYW55LCBsaXN0ZW5lciBhcyBhbnkpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyB9IGZyb20gXCIuL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDpzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWRcIilcblxuZXhwb3J0IGNvbnN0IHNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZCA9IChvcHRzOiB7XG4gIGVudHJ5cG9pbnQ/OiBzdHJpbmdcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgbWFpbkNvbXBvbmVudFBhdGg/OiBzdHJpbmdcbiAgbWFpbkNvbXBvbmVudE5hbWU/OiBzdHJpbmdcbiAgbmFtZT86IHN0cmluZ1xuICBtYWluQ29tcG9uZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG59KSA9PiB7XG4gIGlmICghb3B0cy5lbnRyeXBvaW50ICYmICFvcHRzLm1haW5Db21wb25lbnRQYXRoKSB7XG4gICAgaWYgKFwiaW5kZXgudHN4XCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IFwiaW5kZXgudHN4XCJcbiAgICB9IGVsc2UgaWYgKFwiaW5kZXgudHNcIiBpbiBvcHRzLmZzTWFwKSB7XG4gICAgICBvcHRzLm1haW5Db21wb25lbnRQYXRoID0gXCJpbmRleC50c1wiXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIE9iamVjdC5rZXlzKG9wdHMuZnNNYXApLmZpbHRlcigoaykgPT4gay5lbmRzV2l0aChcIi50c3hcIikpLmxlbmd0aCA9PT0gMVxuICAgICkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IE9iamVjdC5rZXlzKG9wdHMuZnNNYXApWzBdXG4gICAgfSBlbHNlIGlmIChcInRzY2lyY3VpdC5jb25maWcuanNvblwiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIGNvbnN0IGNvbmZpZ0NvbnRlbnQgPSBvcHRzLmZzTWFwW1widHNjaXJjdWl0LmNvbmZpZy5qc29uXCJdXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKGNvbmZpZ0NvbnRlbnQpXG4gICAgICAgIGlmIChjb25maWcubWFpbkVudHJ5cG9pbnQpIHtcbiAgICAgICAgICBvcHRzLmVudHJ5cG9pbnQgPSBjb25maWcubWFpbkVudHJ5cG9pbnRcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gcGFyc2UgdHNjaXJjdWl0LmNvbmZpZy5qc29uOlwiLCBlKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRWl0aGVyIGVudHJ5cG9pbnQgb3IgbWFpbkNvbXBvbmVudFBhdGggbXVzdCBiZSBwcm92aWRlZCAobm8gaW5kZXggZmlsZSwgY291bGQgbm90IGluZmVyIGVudHJ5cG9pbnQpXCIsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgaWYgKCFvcHRzLmVudHJ5cG9pbnQgJiYgb3B0cy5tYWluQ29tcG9uZW50UGF0aCkge1xuICAgIG9wdHMuZW50cnlwb2ludCA9IFwiZW50cnlwb2ludC50c3hcIlxuICAgIGNvbnN0IG1haW5Db21wb25lbnRDb2RlID1cbiAgICAgIG9wdHMuZnNNYXBbcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyhvcHRzLm1haW5Db21wb25lbnRQYXRoLCBvcHRzLmZzTWFwKV1cbiAgICBpZiAoIW1haW5Db21wb25lbnRDb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNYWluIGNvbXBvbmVudCBwYXRoIFwiJHtvcHRzLm1haW5Db21wb25lbnRQYXRofVwiIG5vdCBmb3VuZCBpbiBmc01hcC4gQXZhaWxhYmxlIHBhdGhzOiAke09iamVjdC5rZXlzKG9wdHMuZnNNYXApLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgKVxuICAgIH1cbiAgICBvcHRzLmZzTWFwW29wdHMuZW50cnlwb2ludF0gPSBgXG4gICAgIGltcG9ydCAqIGFzIFVzZXJDb21wb25lbnRzIGZyb20gXCIuLyR7b3B0cy5tYWluQ29tcG9uZW50UGF0aH1cIjtcbiAgICAgICAgICBcbiAgICAgICR7XG4gICAgICAgIG9wdHMubWFpbkNvbXBvbmVudE5hbWVcbiAgICAgICAgICA/IGBcbiAgICAgICAgY29uc3QgQ29tcG9uZW50VG9SZW5kZXIgPSBVc2VyQ29tcG9uZW50c1tcIiR7b3B0cy5tYWluQ29tcG9uZW50TmFtZX1cIl1cbiAgICAgICAgYFxuICAgICAgICAgIDogYGNvbnN0IENvbXBvbmVudFRvUmVuZGVyID0gVXNlckNvbXBvbmVudHMuZGVmYXVsdCB8fCBcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhVc2VyQ29tcG9uZW50cylcbiAgICAgICAgICAuZmlsdGVyKChbbmFtZV0pID0+ICFuYW1lLnN0YXJ0c1dpdGgoXCJ1c2VcIikpXG4gICAgICAgICAgLm1hcCgoW18sIGNvbXBvbmVudF0pID0+IGNvbXBvbmVudClbMF0gfHwgKCgpID0+IG51bGwpO2BcbiAgICAgIH1cblxuICAgICAgICAgICAke1xuICAgICAgICAgICAgIGRlYnVnLmVuYWJsZWRcbiAgICAgICAgICAgICAgID8gYFxuICAgICBjb25zb2xlLmxvZyh7IFVzZXJDb21wb25lbnRzIH0pXG4gICAgIGNvbnNvbGUubG9nKFwiQ29tcG9uZW50VG9SZW5kZXIgXCIgKyBDb21wb25lbnRUb1JlbmRlci50b1N0cmluZygpLCAgeyBDb21wb25lbnRUb1JlbmRlciB9KVxuICAgICBgXG4gICAgICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICAgfVxuXG4gICAgICBjaXJjdWl0LmFkZCggICAgICAgXG4gICAgICAgICAgPENvbXBvbmVudFRvUmVuZGVyICR7b3B0cy5tYWluQ29tcG9uZW50UHJvcHMgPyBgey4uLiR7SlNPTi5zdHJpbmdpZnkob3B0cy5tYWluQ29tcG9uZW50UHJvcHMsIG51bGwsIDIpfX1gIDogXCJcIn0gLz4gXG4gICAgICApO1xuYFxuICB9XG5cbiAgaWYgKCFvcHRzLm5hbWUgJiYgb3B0cy5tYWluQ29tcG9uZW50TmFtZSkge1xuICAgIG9wdHMubmFtZSA9IG9wdHMubWFpbkNvbXBvbmVudE5hbWVcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IgPSAoXG4gIGVycm9yOiB1bmtub3duLFxuICBlbnRyeXBvaW50Pzogc3RyaW5nLFxuKSA9PiB7XG4gIGlmIChcbiAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgZW50cnlwb2ludCAmJlxuICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJSb290Q2lyY3VpdCBoYXMgbm8gY2hpbGRyZW5cIikgJiZcbiAgICAhZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnXCJlbnRyeXBvaW50XCI6JylcbiAgKSB7XG4gICAgY29uc3QgZW50cnlwb2ludE1lc3NhZ2UgPSBlbnRyeXBvaW50LnN0YXJ0c1dpdGgoXCIuL1wiKVxuICAgICAgPyBlbnRyeXBvaW50LnNsaWNlKDIpXG4gICAgICA6IGVudHJ5cG9pbnRcbiAgICBlcnJvci5tZXNzYWdlID0gYCR7ZXJyb3IubWVzc2FnZX0uIFwiZW50cnlwb2ludFwiOiBcIiR7ZW50cnlwb2ludE1lc3NhZ2V9XCIgaXMgc2V0IGluIHRoZSBydW5uZXIgY29uZmlndXJhdGlvbiwgZW50cnlwb2ludHMgbXVzdCBjb250YWluIFwiY2lyY3VpdC5hZGQoLi4uKVwiLCB5b3UgbWlnaHQgYmUgbG9va2luZyB0byB1c2UgbWFpbkNvbXBvbmVudFBhdGggaW5zdGVhZCBpZiB5b3VyIGZpbGUgZXhwb3J0cyBhIGNvbXBvbmVudC5gXG4gIH1cblxuICByZXR1cm4gZXJyb3Jcbn1cbiIsICIvKipcbiAqIEdldCBhbGwgcGF0aHMgb2YgYW4gb2JqZWN0XG4gKlxuICogZ2V0T2JqZWN0UGF0aHMoeyBhOiB7IGI6IDIsIGM6IHsgZDogMyB9IH0sIGU6IDUgfSlcbiAqXG4gKiAvLyBPdXRwdXQ6IFsnYS5iJywgJ2EuYy5kJywgJ2UnXVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JqZWN0UGF0aHMoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcHJlZml4ID0gXCJcIixcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW11cblxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XVxuICAgIGNvbnN0IHBhdGggPSBwcmVmaXggPyBgJHtwcmVmaXh9LiR7a2V5fWAgOiBrZXlcblxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjb25zdCBzdWJQYXRocyA9IGdldE9iamVjdFBhdGhzKHZhbHVlLCBwYXRoKVxuICAgICAgcGF0aHMucHVzaCguLi5zdWJQYXRocylcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aHMucHVzaChwYXRoKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXRoc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVBdFBhdGgob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChcIi5cIilcbiAgbGV0IGN1cnJlbnQgPSBvYmpcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV1cbiAgfVxuICByZXR1cm4gY3VycmVudFxufVxuLyoqXG4gKiBTZXQgYSB2YWx1ZSBhdCBhIHBhdGggaW4gYW4gb2JqZWN0XG4gKlxuICogc2V0VmFsdWVBdFBhdGgoeyBhOiB7IGI6IDIgfSB9LCBcImEuYy5kXCIsIDUpXG4gKlxuICogLy8gT3V0cHV0OiB7IGE6IHsgYjogMiwgYzogeyBkOiA1IH0gfSB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRWYWx1ZUF0UGF0aChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4pIHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoXCIuXCIpXG4gIGxldCBjdXJyZW50ID0gb2JqXG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IGtleXNbaV1cblxuICAgIC8vIElmIHdlJ3JlIGF0IHRoZSBsYXN0IGtleSwgc2V0IHRoZSB2YWx1ZS5cbiAgICBpZiAoaSA9PT0ga2V5cy5sZW5ndGggLSAxKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSB2YWx1ZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3Qgb3IgaXMgbm90IGFuIG9iamVjdCAoYXZvaWQgb3ZlcndyaXRpbmcgYXJyYXlzKSwgY3JlYXRlIGEgbmV3IG9iamVjdFxuICAgICAgaWYgKFxuICAgICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSkgfHxcbiAgICAgICAgdHlwZW9mIGN1cnJlbnRba2V5XSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgICBjdXJyZW50W2tleV0gPT09IG51bGwgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheShjdXJyZW50W2tleV0pXG4gICAgICApIHtcbiAgICAgICAgY3VycmVudFtrZXldID0ge31cbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDaXJjdWl0UnVubmVyIH0gZnJvbSBcIi4vQ2lyY3VpdFJ1bm5lclwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Uc2NpcmN1aXRDb2RlKFxuICBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nLFxuICBvcHRzPzogT21pdDxQYXJhbWV0ZXJzPENpcmN1aXRSdW5uZXJbXCJleGVjdXRlV2l0aEZzTWFwXCJdPlswXSwgXCJmc01hcFwiPixcbikge1xuICBpZiAoXG4gICAgdHlwZW9mIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmcgPT09IFwic3RyaW5nXCIgJiZcbiAgICAhZmlsZXN5c3RlbU9yQ29kZVN0cmluZy5pbmNsdWRlcyhcImV4cG9ydFwiKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIFwiZXhwb3J0XCIga2V5d29yZCB3YXNuJ3QgZm91bmQgaW4geW91ciBwcm92aWRlZCBjb2RlLiBZb3UgbmVlZCB0byBleHBvcnQgYSBjb21wb25lbnQgaW4geW91ciBjb2RlLCBlLmcuXFxuXFxuZXhwb3J0IGRlZmF1bHQgKCkgPT4gKFxcbiAgPHJlc2lzdG9yIG5hbWU9XCJSMVwiIHJlc2lzdGFuY2U9XCIxa1wiIC8+XFxuKWAsXG4gICAgKVxuICB9XG4gIGNvbnN0IGZpbGVzeXN0ZW0gPVxuICAgIHR5cGVvZiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nID09PSBcInN0cmluZ1wiXG4gICAgICA/IHsgXCJ1c2VyLWNvZGUudHN4XCI6IGZpbGVzeXN0ZW1PckNvZGVTdHJpbmcgfVxuICAgICAgOiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nXG5cbiAgY29uc3QgY2lyY3VpdFJ1bm5lciA9IG5ldyBDaXJjdWl0UnVubmVyKClcblxuICBhd2FpdCBjaXJjdWl0UnVubmVyLmV4ZWN1dGVXaXRoRnNNYXAoe1xuICAgIGZzTWFwOiBmaWxlc3lzdGVtLFxuICAgIC4uLm9wdHMsXG4gIH0pXG5cbiAgYXdhaXQgY2lyY3VpdFJ1bm5lci5yZW5kZXJVbnRpbFNldHRsZWQoKVxuXG4gIHJldHVybiBhd2FpdCBjaXJjdWl0UnVubmVyLmdldENpcmN1aXRKc29uKClcbn1cbiIsICJpbXBvcnQgeyBydW5Uc2NpcmN1aXRDb2RlIH0gZnJvbSBcIi4vcnVuVHNjaXJjdWl0Q29kZVwiXG5cbmV4cG9ydCBjb25zdCBydW5Uc2NpcmN1aXRNb2R1bGUgPSBhc3luYyAoXG4gIG1vZHVsZTogc3RyaW5nLFxuICBvcHRzOiB7IHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PjsgZXhwb3J0TmFtZT86IHN0cmluZyB9ID0ge30sXG4pID0+IHtcbiAgaWYgKCFtb2R1bGUuc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICBtb2R1bGUgPSBgQHRzY2kvJHttb2R1bGUucmVwbGFjZSgvXFwvLywgXCIuXCIpfWBcbiAgfVxuICBjb25zdCBjaXJjdWl0SnNvbiA9IGF3YWl0IHJ1blRzY2lyY3VpdENvZGUoXG4gICAge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgZXhwb3J0cyB0aGF0IGFyZSBub3QgdGhlIGRlZmF1bHQgZXhwb3J0IGJ5IHNjYW5uaW5nXG4gICAgICAvLyBvdGhlckV4cG9ydHMgZm9yIGNvbXBvbmVudHNcbiAgICAgIFwidXNlci1jb2RlLnRzeFwiOiBgXG4gICAgaW1wb3J0IE1vZHVsZSwgKiBhcyBvdGhlckV4cG9ydHMgZnJvbSBcIiR7bW9kdWxlfVwiO1xuXG4gICAgbGV0IGV4cG9ydE5hbWUgPSBcIiR7b3B0cy5leHBvcnROYW1lID8/IFwiXCJ9XCJcblxuICAgIGlmICgoIU1vZHVsZSB8fCB0eXBlb2YgTW9kdWxlICE9PSBcImZ1bmN0aW9uXCIpICYmICFCb29sZWFuKGV4cG9ydE5hbWUpKSB7XG4gICAgICBleHBvcnROYW1lID0gT2JqZWN0LmtleXMob3RoZXJFeHBvcnRzKS5maWx0ZXIoa2V5ID0+IGtleVswXSA9PT0ga2V5WzBdLnRvVXBwZXJDYXNlKCkgJiYgdHlwZW9mIG90aGVyRXhwb3J0c1trZXldID09PSBcImZ1bmN0aW9uXCIpWzBdXG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdEV4cG9ydCA9IGV4cG9ydE5hbWUgPyBvdGhlckV4cG9ydHNbZXhwb3J0TmFtZV0gOiBNb2R1bGVcblxuICAgIGlmICghZGVmYXVsdEV4cG9ydCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxcYE5vIGV4cG9ydCBmb3VuZCBmb3IgbW9kdWxlIFwiXFwke21vZHVsZX1cIiAodHJpZWQgXCJcXCR7ZXhwb3J0TmFtZSA/PyBcImRlZmF1bHRcIn1cIilcXGApXG4gICAgfVxuXG4gICAgZXhwb3J0IGRlZmF1bHQgZGVmYXVsdEV4cG9ydDtcbiAgICBgLFxuICAgIH0sXG4gICAge1xuICAgICAgbWFpbkNvbXBvbmVudFByb3BzOiBvcHRzLnByb3BzLFxuICAgIH0sXG4gIClcbiAgcmV0dXJuIGNpcmN1aXRKc29uXG59XG4iLCAiaW1wb3J0ICogYXMgQ29tbGluayBmcm9tIFwiY29tbGlua1wiXG5leHBvcnQgKiBmcm9tIFwiLi91dGlscy9pbmRleFwiXG5pbXBvcnQgdHlwZSB7XG4gIEludGVybmFsV2ViV29ya2VyQXBpLFxuICBXZWJXb3JrZXJDb25maWd1cmF0aW9uLFxuICBDaXJjdWl0V2ViV29ya2VyLFxufSBmcm9tIFwiLi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0IHR5cGUgeyBSb290Q2lyY3VpdEV2ZW50TmFtZSB9IGZyb20gXCIuL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgeyBnZXRPYmplY3RQYXRocywgZ2V0VmFsdWVBdFBhdGggfSBmcm9tIFwiLi9zaGFyZWQvb2JqLXBhdGhcIlxuXG5leHBvcnQgdHlwZSB7IENpcmN1aXRXZWJXb3JrZXIsIFdlYldvcmtlckNvbmZpZ3VyYXRpb24gfVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIFRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVI6IENpcmN1aXRXZWJXb3JrZXIgfCB1bmRlZmluZWRcbiAgfVxuICB2YXIgVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUjogQ2lyY3VpdFdlYldvcmtlciB8IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlQ2lyY3VpdFdlYldvcmtlciA9IGFzeW5jIChcbiAgY29uZmlndXJhdGlvbjogUGFydGlhbDxXZWJXb3JrZXJDb25maWd1cmF0aW9uPixcbik6IFByb21pc2U8Q2lyY3VpdFdlYldvcmtlcj4gPT4ge1xuICAvLyBLaWxsIGV4aXN0aW5nIGdsb2JhbCB3b3JrZXIgaW5zdGFuY2UgaWYgcHJlc2VudFxuICBjb25zdCBleGlzdGluZ1dvcmtlciA9IGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUlxuICBpZiAoZXhpc3RpbmdXb3JrZXIgJiYgdHlwZW9mIGV4aXN0aW5nV29ya2VyLmtpbGwgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW1dvcmtlcl0gS2lsbGluZyBwcmV2aW91cyBnbG9iYWwgd29ya2VyIGluc3RhbmNlLi4uXCIpXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGlzdGluZ1dvcmtlci5raWxsKClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoY29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcIltXb3JrZXJdIEVycm9yIGtpbGxpbmcgcHJldmlvdXMgZ2xvYmFsIHdvcmtlciBpbnN0YW5jZTpcIixcbiAgICAgICAgICBlLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICAvLyBFbnN1cmUgdGhlIGtleSBpcyBjbGVhcmVkIGV2ZW4gaWYga2lsbCB0aHJvd3MgYW4gZXJyb3JcbiAgICAgIGlmIChnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPT09IGV4aXN0aW5nV29ya2VyKSB7XG4gICAgICAgIGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIFwiW1dvcmtlcl0gQ3JlYXRpbmcgY2lyY3VpdCB3ZWIgd29ya2VyIHdpdGggY29uZmlnOlwiLFxuICAgICAgY29uZmlndXJhdGlvbixcbiAgICApXG4gIH1cblxuICBsZXQgd29ya2VyQmxvYlVybCA9XG4gICAgY29uZmlndXJhdGlvbi53ZWJXb3JrZXJCbG9iVXJsID8/IGNvbmZpZ3VyYXRpb24ud2ViV29ya2VyVXJsXG5cbiAgaWYgKCF3b3JrZXJCbG9iVXJsKSB7XG4gICAgY29uc3QgY2RuVXJsID0gYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ldmFsQCR7Y29uZmlndXJhdGlvbi5ldmFsVmVyc2lvbiA/PyBcImxhdGVzdFwifS9kaXN0L3dlYndvcmtlci9lbnRyeXBvaW50LmpzYFxuXG4gICAgY29uc3Qgd29ya2VyQmxvYiA9IGF3YWl0IGdsb2JhbFRoaXMuZmV0Y2goY2RuVXJsKS50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpXG4gICAgd29ya2VyQmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwod29ya2VyQmxvYilcbiAgfVxuXG4gIGNvbnN0IHJhd1dvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyQmxvYlVybCwgeyB0eXBlOiBcIm1vZHVsZVwiIH0pXG4gIGxldCB3b3JrZXJJbml0RXJyb3I6IGFueVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIChldmVudCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJbV29ya2VyXSBFcnJvciBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gICAgd29ya2VySW5pdEVycm9yID0gZXZlbnRcbiAgfSlcbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmhhbmRsZWRyZWplY3Rpb25cIiwgKGV2ZW50KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcIltXb3JrZXJdIFVuaGFuZGxlZCByZWplY3Rpb24gaW4gd29ya2VyXCIsIGV2ZW50KVxuICB9KVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VlcnJvclwiLCAoZXZlbnQpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiW1dvcmtlcl0gTWVzc2FnZSBlcnJvciBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gIH0pXG4gIGNvbnN0IGVhcmx5TWVzc2FnZUhhbmRsZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiW1dvcmtlcl0gTWVzc2FnZSBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gIH1cbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGVhcmx5TWVzc2FnZUhhbmRsZXIpXG5cbiAgLy8gSGFuZGxlIGZldGNoIHJlcXVlc3RzIGZyb20gdGhlIHdvcmtlclxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgYXN5bmMgKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICBjb25zdCBkYXRhID0gZXZlbnQuZGF0YVxuICAgIGlmIChkYXRhPy50eXBlICE9PSBcIndvcmtlcl9mZXRjaFwiKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdsb2JhbFRoaXMuZmV0Y2goZGF0YS5pbnB1dCwgZGF0YS5pbml0KVxuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuICAgICAgcmF3V29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgdHlwZTogXCJ3b3JrZXJfZmV0Y2hfcmVzdWx0XCIsXG4gICAgICAgIHJlcXVlc3RJZDogZGF0YS5yZXF1ZXN0SWQsXG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICAgIGhlYWRlcnM6ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgIG9ialtrZXldID0gdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gb2JqXG4gICAgICAgICAgfSkoKSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHJhd1dvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHR5cGU6IFwid29ya2VyX2ZldGNoX3Jlc3VsdFwiLFxuICAgICAgICByZXF1ZXN0SWQ6IGRhdGEucmVxdWVzdElkLFxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBuYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICBzdGFjazogZXJyLnN0YWNrLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH0pXG5cbiAgaWYgKHdvcmtlckluaXRFcnJvcikge1xuICAgIHRocm93IHdvcmtlckluaXRFcnJvclxuICB9XG5cbiAgY29uc3QgY29tbGlua1dvcmtlciA9IENvbWxpbmsud3JhcDxJbnRlcm5hbFdlYldvcmtlckFwaT4ocmF3V29ya2VyKVxuXG4gIHJhd1dvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBlYXJseU1lc3NhZ2VIYW5kbGVyKVxuXG4gIC8vIEhlbHBlciB0byBzZXJpYWxpemUgUmVhY3QgZWxlbWVudHMgZm9yIGNyb3NzLXdvcmtlciBjb21tdW5pY2F0aW9uXG4gIGZ1bmN0aW9uIHNlcmlhbGl6ZVJlYWN0RWxlbWVudChlbGVtZW50OiBhbnkpOiBhbnkge1xuICAgIGlmICghZWxlbWVudCB8fCB0eXBlb2YgZWxlbWVudCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGhpcyBpcyBhIFJlYWN0IGVsZW1lbnRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9faXNTZXJpYWxpemVkUmVhY3RFbGVtZW50OiB0cnVlLFxuICAgICAgICB0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgIHByb3BzOiBzZXJpYWxpemVQcm9wcyhlbGVtZW50LnByb3BzKSxcbiAgICAgICAga2V5OiBlbGVtZW50LmtleSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudFxuICB9XG5cbiAgZnVuY3Rpb24gc2VyaWFsaXplUHJvcHMocHJvcHM6IGFueSk6IGFueSB7XG4gICAgaWYgKCFwcm9wcyB8fCB0eXBlb2YgcHJvcHMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBwcm9wc1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWQ6IGFueSA9IHt9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMpKSB7XG4gICAgICBpZiAoa2V5ID09PSBcImNoaWxkcmVuXCIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgc2VyaWFsaXplZC5jaGlsZHJlbiA9IHZhbHVlLm1hcChzZXJpYWxpemVSZWFjdEVsZW1lbnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VyaWFsaXplZC5jaGlsZHJlbiA9IHNlcmlhbGl6ZVJlYWN0RWxlbWVudCh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VyaWFsaXplZFtrZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWRcbiAgfVxuXG4gIC8vIENvbmRpdGlvbmFsbHkgb3ZlcnJpZGUgZ2xvYmFsIGZldGNoIGluc2lkZSB0aGUgd29ya2VyIHRvIHJvdXRlIHRocm91Z2ggdGhlIHBhcmVudFxuICAvLyBPbmx5IGVuYWJsZSB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHZpYSBjb25maWd1cmF0aW9uXG4gIGlmIChjb25maWd1cmF0aW9uLmVuYWJsZUZldGNoUHJveHkpIHtcbiAgICByYXdXb3JrZXIucG9zdE1lc3NhZ2UoeyB0eXBlOiBcIm92ZXJyaWRlX2dsb2JhbF9mZXRjaFwiIH0pXG4gIH1cblxuICBpZiAoY29uZmlndXJhdGlvbi5kaXNhYmxlQ2RuTG9hZGluZykge1xuICAgIGF3YWl0IGNvbWxpbmtXb3JrZXIuc2V0RGlzYWJsZUNkbkxvYWRpbmcodHJ1ZSlcbiAgfVxuXG4gIGlmIChjb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybCkge1xuICAgIGF3YWl0IGNvbWxpbmtXb3JrZXIuc2V0U25pcHBldHNBcGlCYXNlVXJsKGNvbmZpZ3VyYXRpb24uc25pcHBldHNBcGlCYXNlVXJsKVxuICB9XG5cbiAgY29uc3QgbWF5YmVQcm94eSA9ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gQ29tbGluay5wcm94eSh2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbiAgaWYgKGNvbmZpZ3VyYXRpb24ucGxhdGZvcm0pIHtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZ2V0T2JqZWN0UGF0aHMoY29uZmlndXJhdGlvbi5wbGF0Zm9ybSkpIHtcbiAgICAgIGF3YWl0IGNvbWxpbmtXb3JrZXJcbiAgICAgICAgLnNldFBsYXRmb3JtQ29uZmlnUHJvcGVydHkoXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBtYXliZVByb3h5KGdldFZhbHVlQXRQYXRoKGNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sIHBhdGgpKSxcbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3Igc2V0dGluZyBwbGF0Zm9ybSBjb25maWcgcHJvcGVydHkgJHtwYXRofTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCxcbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgfVxuICB9XG4gIGlmIChjb25maWd1cmF0aW9uLnByb2plY3RDb25maWcpIHtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZ2V0T2JqZWN0UGF0aHMoY29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnKSkge1xuICAgICAgYXdhaXQgY29tbGlua1dvcmtlclxuICAgICAgICAuc2V0UHJvamVjdENvbmZpZ1Byb3BlcnR5KFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgbWF5YmVQcm94eShnZXRWYWx1ZUF0UGF0aChjb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsIHBhdGgpKSxcbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3Igc2V0dGluZyBwcm9qZWN0IGNvbmZpZyBwcm9wZXJ0eSAke3BhdGh9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gLFxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBsZXQgaXNUZXJtaW5hdGVkID0gZmFsc2VcblxuICAvLyBDcmVhdGUgYSB3cmFwcGVyIHRoYXQgaGFuZGxlcyBldmVudHMgZGlyZWN0bHkgdGhyb3VnaCBjaXJjdWl0IGluc3RhbmNlXG4gIGNvbnN0IHdyYXBwZXI6IENpcmN1aXRXZWJXb3JrZXIgPSB7XG4gICAgY2xlYXJFdmVudExpc3RlbmVyczogY29tbGlua1dvcmtlci5jbGVhckV2ZW50TGlzdGVuZXJzLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgZW5hYmxlRGVidWc6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGVuYWJsZURlYnVnXCIpXG4gICAgICB9XG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5lbmFibGVEZWJ1Zy5iaW5kKGNvbWxpbmtXb3JrZXIpKC4uLmFyZ3MpXG4gICAgfSxcbiAgICB2ZXJzaW9uOiBjb21saW5rV29ya2VyLnZlcnNpb24uYmluZChjb21saW5rV29ya2VyKSxcbiAgICBleGVjdXRlOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBleGVjdXRlXCIpXG4gICAgICB9XG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlLmJpbmQoY29tbGlua1dvcmtlcikoLi4uYXJncylcbiAgICB9LFxuICAgIGV4ZWN1dGVDb21wb25lbnQ6IGFzeW5jIChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBleGVjdXRlQ29tcG9uZW50XCIsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gSWYgaXQncyBhIGZ1bmN0aW9uLCBwYXNzIGl0IGFzLWlzICh3aWxsIGJlIHByb3hpZWQgYnkgQ29tbGluaylcbiAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZUNvbXBvbmVudC5iaW5kKGNvbWxpbmtXb3JrZXIpKGNvbXBvbmVudClcbiAgICAgIH1cblxuICAgICAgLy8gSWYgaXQncyBhIFJlYWN0IGVsZW1lbnQsIHNlcmlhbGl6ZSBpdCB0byBhIHJlY29uc3RydWN0YWJsZSBmb3JtYXRcbiAgICAgIGlmIChjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudCA9PT0gXCJvYmplY3RcIiAmJiBjb21wb25lbnQudHlwZSkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkRWxlbWVudCA9IHNlcmlhbGl6ZVJlYWN0RWxlbWVudChjb21wb25lbnQpXG4gICAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVDb21wb25lbnQuYmluZChjb21saW5rV29ya2VyKShcbiAgICAgICAgICBzZXJpYWxpemVkRWxlbWVudCxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlQ29tcG9uZW50LmJpbmQoY29tbGlua1dvcmtlcikoY29tcG9uZW50KVxuICAgIH0sXG4gICAgZXhlY3V0ZVdpdGhGc01hcDogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChpc1Rlcm1pbmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2lyY3VpdFdlYldvcmtlciB3YXMgdGVybWluYXRlZCwgY2FuJ3QgZXhlY3V0ZVdpdGhGc01hcFwiLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlV2l0aEZzTWFwLmJpbmQoY29tbGlua1dvcmtlcikoLi4uYXJncylcbiAgICB9LFxuICAgIHJlbmRlclVudGlsU2V0dGxlZDogY29tbGlua1dvcmtlci5yZW5kZXJVbnRpbFNldHRsZWQuYmluZChjb21saW5rV29ya2VyKSxcbiAgICBnZXRDaXJjdWl0SnNvbjogY29tbGlua1dvcmtlci5nZXRDaXJjdWl0SnNvbi5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIG9uOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkgPT4ge1xuICAgICAgY29uc3QgcHJveGllZENhbGxiYWNrID0gQ29tbGluay5wcm94eShjYWxsYmFjaylcbiAgICAgIGNvbWxpbmtXb3JrZXIub24oZXZlbnQgYXMgUm9vdENpcmN1aXRFdmVudE5hbWUsIHByb3hpZWRDYWxsYmFjaylcbiAgICB9LFxuICAgIGtpbGw6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbWxpbmtXb3JrZXJbQ29tbGluay5yZWxlYXNlUHJveHldKClcbiAgICAgIHJhd1dvcmtlci50ZXJtaW5hdGUoKVxuICAgICAgaXNUZXJtaW5hdGVkID0gdHJ1ZVxuICAgICAgaWYgKGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9PT0gd3JhcHBlcikge1xuICAgICAgICBnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9LFxuICB9XG4gIDsod3JhcHBlciBhcyBhbnkpLl9fcmF3V29ya2VyID0gcmF3V29ya2VyXG4gIGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9IHdyYXBwZXJcbiAgcmV0dXJuIHdyYXBwZXJcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL3J1bm5lci9ub3JtYWxpemVGc01hcFwiXG5cbmV4cG9ydCBjb25zdCBnZXRQb3NzaWJsZUVudHJ5cG9pbnRDb21wb25lbnRQYXRocyA9IChcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRGc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIGZvciAoY29uc3QgW3BhdGgsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGZzTWFwKSkge1xuICAgIG5vcm1hbGl6ZWRGc01hcFtub3JtYWxpemVGaWxlUGF0aChwYXRoKV0gPSBjb250ZW50XG4gIH1cblxuICBjb25zdCBwb3NzaWJsZSA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgaWYgKFwidHNjaXJjdWl0LmNvbmZpZy5qc29uXCIgaW4gbm9ybWFsaXplZEZzTWFwKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2Uobm9ybWFsaXplZEZzTWFwW1widHNjaXJjdWl0LmNvbmZpZy5qc29uXCJdKVxuICAgICAgaWYgKHR5cGVvZiBjb25maWcubWFpbkVudHJ5cG9pbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcG9zc2libGUuYWRkKG5vcm1hbGl6ZUZpbGVQYXRoKGNvbmZpZy5tYWluRW50cnlwb2ludCkpXG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBpZ25vcmUgKi9cbiAgICB9XG4gIH1cblxuICBpZiAobm9ybWFsaXplZEZzTWFwW1wiaW5kZXgudHN4XCJdKSBwb3NzaWJsZS5hZGQoXCJpbmRleC50c3hcIilcbiAgaWYgKG5vcm1hbGl6ZWRGc01hcFtcImluZGV4LnRzXCJdKSBwb3NzaWJsZS5hZGQoXCJpbmRleC50c1wiKVxuXG4gIGNvbnN0IGNpcmN1aXRGaWxlcyA9IE9iamVjdC5rZXlzKG5vcm1hbGl6ZWRGc01hcCkuZmlsdGVyKChrKSA9PlxuICAgIGsuZW5kc1dpdGgoXCIuY2lyY3VpdC50c3hcIiksXG4gIClcbiAgZm9yIChjb25zdCBmaWxlIG9mIGNpcmN1aXRGaWxlcykge1xuICAgIHBvc3NpYmxlLmFkZChmaWxlKVxuICB9XG5cbiAgY29uc3QgdHN4RmlsZXMgPSBPYmplY3Qua2V5cyhub3JtYWxpemVkRnNNYXApLmZpbHRlcigoaykgPT5cbiAgICBrLmVuZHNXaXRoKFwiLnRzeFwiKSxcbiAgKVxuICBpZiAodHN4RmlsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgcG9zc2libGUuYWRkKHRzeEZpbGVzWzBdKVxuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20ocG9zc2libGUpXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxtQkFBbUI7QUFFNUIsWUFBWSxtQkFBbUI7QUFDL0IsWUFBWSxXQUFXO0FBQ3ZCLFlBQVkscUJBQXFCO0FBQ2pDLFlBQVksd0JBQXdCOzs7QUNBN0IsSUFBTSxnQ0FBZ0MsQ0FDM0MsbUJBQ3VCO0FBRXZCLE1BQUksUUFBUSxlQUFlLE1BQU0sZ0JBQWdCO0FBQ2pELE1BQUksTUFBTyxRQUFPLE1BQU0sQ0FBQztBQUl6QixVQUFRLGVBQWU7QUFBQSxJQUNyQjtBQUFBLEVBQ0Y7QUFDQSxNQUFJLE1BQU8sUUFBTyxNQUFNLENBQUM7QUFFekIsU0FBTztBQUNUOzs7QUNoQk8sSUFBTSxxQ0FBcUMsQ0FDaEQsc0JBQ1c7QUFDWCxNQUFJLGtCQUFrQixTQUFTLEtBQUssR0FBRztBQUNyQyxXQUFPLGtCQUFrQixRQUFRLFFBQVEsRUFBRTtBQUFBLEVBQzdDO0FBQ0EsU0FBTztBQUNUOzs7QUNKTyxJQUFNLHVCQUF1QixDQUNsQyxjQUN1QjtBQUN2QixNQUFJLENBQUMsVUFBVyxRQUFPO0FBRXZCLE1BQUksVUFBVSxXQUFXLFFBQVEsR0FBRztBQUNsQyxVQUFNLG9CQUFvQiw4QkFBOEIsU0FBUztBQUNqRSxRQUFJLG1CQUFtQjtBQUNyQixhQUFPLG1DQUFtQyxpQkFBaUI7QUFBQSxJQUM3RDtBQUdBLFdBQU87QUFBQSxFQUNUO0FBR0EsU0FBTyxtQ0FBbUMsU0FBUztBQUNyRDs7O0FDckJPLElBQU0sUUFBUSxvQkFBSSxJQUFpQjtBQUUxQyxJQUFNLG9CQUFvQixPQUFPLE1BQVcsV0FBZ0I7QUFDMUQsUUFBTSxjQUFjLElBQUksZ0JBQWdCO0FBQUEsSUFDdEMsR0FBRztBQUFBLElB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QUEsSUFDL0QsSUFBSSxDQUFDLE9BQWUsYUFBdUM7QUFDekQsWUFBTSxrQkFBMEIsY0FBTSxRQUFRO0FBQzlDLG9CQUFjLEdBQUcsT0FBK0IsZUFBZTtBQUFBLElBQ2pFO0FBQUEsSUFDQSxNQUFNLFlBQVk7QUFDaEIsb0JBQXNCLG9CQUFZLEVBQUU7QUFDcEMsZ0JBQVUsVUFBVTtBQUNwQixxQkFBZTtBQUNmLFVBQUksV0FBVyxvQ0FBb0MsU0FBUztBQUMxRCxtQkFBVyxrQ0FBa0M7QUFBQSxNQUMvQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0MsRUFBQyxRQUFnQixjQUFjO0FBQ2hDLGFBQVcsa0NBQWtDO0FBQzdDLFNBQU87QUFDVDs7O0FDclJPLElBQU0sc0NBQXNDLENBQ2pELFVBQ2E7QUFDYixRQUFNLGtCQUEwQyxDQUFDO0FBQ2pELGFBQVcsQ0FBQyxNQUFNLE9BQU8sS0FBSyxPQUFPLFFBQVEsS0FBSyxHQUFHO0FBQ25ELG9CQUFnQixrQkFBa0IsSUFBSSxDQUFDLElBQUk7QUFBQSxFQUM3QztBQUVBLFFBQU0sV0FBVyxvQkFBSSxJQUFZO0FBRWpDLE1BQUksMkJBQTJCLGlCQUFpQjtBQUM5QyxRQUFJO0FBQ0YsWUFBTSxTQUFTLEtBQUssTUFBTSxnQkFBZ0IsdUJBQXVCLENBQUM7QUFDbEUsVUFBSSxPQUFPLE9BQU8sbUJBQW1CLFVBQVU7QUFDN0MsaUJBQVMsSUFBSSxrQkFBa0IsT0FBTyxjQUFjLENBQUM7QUFBQSxNQUN2RDtBQUFBLElBQ0YsUUFBUTtBQUFBLElBRVI7QUFBQSxFQUNGO0FBRUEsTUFBSSxnQkFBZ0IsV0FBVyxFQUFHLFVBQVMsSUFBSSxXQUFXO0FBQzFELE1BQUksZ0JBQWdCLFVBQVUsRUFBRyxVQUFTLElBQUksVUFBVTtBQUV4RCxRQUFNLGVBQWUsT0FBTyxLQUFLLGVBQWUsRUFBRTtBQUFBLElBQU8sQ0FBQyxNQUN4RCxFQUFFLFNBQVMsY0FBYztBQUFBLEVBQzNCO0FBQ0EsYUFBVyxRQUFRLGNBQWM7QUFDL0IsYUFBUyxJQUFJLElBQUk7QUFBQSxFQUNuQjtBQUVBLFFBQU0sV0FBVyxPQUFPLEtBQUssZUFBZSxFQUFFO0FBQUEsSUFBTyxDQUFDLE1BQ3BELEVBQUUsU0FBUyxNQUFNO0FBQUEsRUFDbkI7QUFDQSxNQUFJLFNBQVMsV0FBVyxHQUFHO0FBQ3pCLGFBQVMsSUFBSSxTQUFTLENBQUMsQ0FBQztBQUFBLEVBQzFCO0FBRUEsU0FBTyxNQUFNLEtBQUssUUFBUTtBQUM1QjsiLAogICJuYW1lcyI6IFsiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiaW1wb3J0TmFtZSIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJ1bnByZWZpeGVkUGF0aCIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyJdCn0K