sliftutils 1.7.55 → 1.7.57

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.
@@ -1,4 +1,4 @@
1
- "use strict";
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
4
  };
@@ -280,9 +280,10 @@ class ArchivesBackblaze {
280
280
  }
281
281
  return true;
282
282
  }
283
- if (!orderIndependentEqualArray(bucket.corsRules, desiredCorsRules)
284
- || !orderIndependentEqual(bucket.bucketInfo, bucketInfo)) {
285
- console.log((0, logColors_1.magenta)(`Updating CORS rules for ${this.bucketName}`), bucket.corsRules, desiredCorsRules);
283
+ let corsChanged = !orderIndependentEqualArray(bucket.corsRules, desiredCorsRules);
284
+ let infoChanged = !orderIndependentEqual(bucket.bucketInfo, bucketInfo);
285
+ if (corsChanged || infoChanged) {
286
+ console.log((0, logColors_1.magenta)(`Updating bucket settings for ${this.bucketName} (corsRules ${corsChanged && "changed" || "unchanged"}, bucketInfo ${infoChanged && "changed" || "unchanged"}): corsRules ${JSON.stringify(bucket.corsRules)} -> ${JSON.stringify(desiredCorsRules)}, bucketInfo ${JSON.stringify(bucket.bucketInfo)} -> ${JSON.stringify(bucketInfo)}`));
286
287
  await api.updateBucket({
287
288
  accountId: bucket.accountId,
288
289
  bucketId: bucket.bucketId,
@@ -388,6 +389,7 @@ class ArchivesBackblaze {
388
389
  return result && result.data || undefined;
389
390
  }
390
391
  async get2(fileName, config) {
392
+ var _a;
391
393
  let downloading = true;
392
394
  try {
393
395
  let time = Date.now();
@@ -436,8 +438,13 @@ class ArchivesBackblaze {
436
438
  return result;
437
439
  }
438
440
  catch (e) {
439
- this.log(`backblaze file does not exist ${fileName}`);
440
- return undefined;
441
+ // Only genuine absence may become undefined: callers treat undefined as authoritative "the bucket does not hold this file" (BlobStore even deletes index entries over it), so a transient failure (503, auth, timeout) must throw instead of masquerading as a missing file
442
+ let message = String((_a = e.stack) !== null && _a !== void 0 ? _a : e);
443
+ if (message.includes(`"not_found"`) || message.includes(`file_not_found`) || message.includes(`not found`)) {
444
+ this.log(`backblaze file does not exist ${fileName}`);
445
+ return undefined;
446
+ }
447
+ throw e;
441
448
  }
442
449
  finally {
443
450
  downloading = false;
@@ -818,5 +825,5 @@ exports.getArchivesBackblazePublic = (0, caching_1.cache)((domain) => {
818
825
  allowedOrigins: [`https://${domain}`, `https://127-0-0-1.${domain}:7007`],
819
826
  });
820
827
  });
821
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2JsYXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmFja2JsYXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlEQUEwRDtBQUcxRCxtREFBa0Y7QUFDbEYsMkRBQXFEO0FBQ3JELGtFQUFpRjtBQUNqRix3RUFBZ0Y7QUFFaEYsOENBQXNCO0FBQ3RCLGlEQUE4QztBQUM5QyxxREFBNEU7QUFDNUUsMkNBQWtLO0FBQ2xLLCtEQUE2RDtBQU83RCxJQUFJLGNBQWMsR0FBRyxJQUFBLGNBQUksRUFBQyxLQUFLLElBQTZCLEVBQUU7SUFDMUQsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFBLHFCQUFTLEVBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUMvRCxJQUFJLEdBQUcsR0FBRyxNQUFNLElBQUEscUJBQVMsRUFBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQzNELE9BQU87UUFDSCxnQkFBZ0IsRUFBRSxLQUFLO1FBQ3ZCLGNBQWMsRUFBRSxHQUFHO0tBQ3RCLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQztBQUNILCtLQUErSztBQUMvSyxTQUFTLHdCQUF3QixDQUFDLFFBQTJCO0lBQ3pELElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDM0QsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNyRCxJQUFJLEtBQUssR0FBRyxZQUFZLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEMsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzdGLENBQUM7QUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFBLGNBQUksRUFBQyxLQUFLLElBQUksRUFBRTtJQUMzQixJQUFJLEtBQUssR0FBRyxNQUFNLGNBQWMsRUFBRSxDQUFDO0lBRW5DLDRGQUE0RjtJQUM1RixvRUFBb0U7SUFDcEUsSUFBSSxZQUFZLEdBQUcsTUFBTSxJQUFBLG9CQUFZLEVBQUMsMkRBQTJELEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7UUFDNUgsT0FBTyxFQUFFO1lBQ0wsYUFBYSxFQUFFLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7U0FDaEg7S0FDSixDQUFDLENBQUM7SUFFSCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FXNUMsQ0FBQztJQUVGLFNBQVMsZ0JBQWdCLENBQWMsSUFBWSxFQUFFLElBQW9CLEVBQUUsV0FBMkI7UUFDbEcsT0FBTyxLQUFLLEVBQUUsR0FBUSxFQUFFLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNmLEdBQUcsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDaEQsQ0FBQztZQUNELElBQUksQ0FBQztnQkFDRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQzVDLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBQSxvQkFBWSxFQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO29CQUNwRixPQUFPLEVBQUU7d0JBQ0wsYUFBYSxFQUFFLElBQUksQ0FBQyxrQkFBa0I7cUJBQ3pDO2lCQUNKLENBQUMsQ0FBQztnQkFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDekMsQ0FBQztZQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLElBQUksU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDL0YsQ0FBQztRQUNMLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FtQmxDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRS9CLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQW9CbEMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFL0IscURBQXFEO0lBQ3JELHNEQUFzRDtJQUV0RCxNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FlakMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFOUIsU0FBUyxVQUFVLENBQUMsSUFBWTtRQUM1QiwrQ0FBK0M7UUFDL0MsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7WUFBRSxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUFFLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN6RCwrRUFBK0U7UUFDL0UsNkJBQTZCO1FBQzdCLHdHQUF3RztRQUN4RyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN6QixJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxLQUFLLFVBQVUsa0JBQWtCLENBQUMsTUFNakM7UUFDRyxJQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTNDLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBQSxvQkFBWSxFQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsR0FBRyxHQUFHLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDcEgsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLFlBQVksRUFBRSxhQUFhO1NBQzlCLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDbkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztnQkFDdkMsYUFBYSxFQUFFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQ3RDLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO2FBQzFGLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7WUFDbkMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1NBQ2xDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxvUkFBb1I7SUFDcFIsS0FBSyxVQUFVLGNBQWMsQ0FBQyxNQUFnRDs7UUFDMUUsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxJQUFJLFFBQVEsR0FBc0IsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDO1lBQ0QsTUFBTSxJQUFBLG9CQUFZLEVBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRyxHQUFHLEdBQUcsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO2dCQUMxRyxPQUFPLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUNuRCxXQUFXLEVBQUUsUUFBUTthQUN4QixDQUFDLENBQUM7UUFDUCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNULElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxHQUFHO2dCQUFFLE9BQU8sU0FBUyxDQUFDO1lBQ2xELG1LQUFtSztZQUNuSyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFFBQVEsZUFBZSxNQUFDLENBQVcsQ0FBQyxLQUFLLG1DQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0gsQ0FBQztZQUNELE1BQU0sQ0FBQyxDQUFDO1FBQ1osQ0FBQztRQUNELE9BQU8sd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELGlEQUFpRDtJQUNqRCxNQUFNLFlBQVksR0FBRyxDQUFDLEtBQUssRUFBRSxRQUFnQixFQUFFLEVBQUU7UUFDN0Msa0VBQWtFO1FBQ2xFLElBQUksZUFBZSxHQUFHLE1BQU0sSUFBQSxvQkFBWSxFQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsdUNBQXVDLEdBQUcsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1lBQ3BJLE9BQU8sRUFBRTtnQkFDTCxhQUFhLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjthQUN6QztTQUNKLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBSTNDLENBQUM7SUFDTixDQUFDLENBQUMsQ0FBQztJQUVILEtBQUssVUFBVSxVQUFVLENBQUMsTUFJekI7UUFDRyxJQUFJLFlBQVksR0FBRyxNQUFNLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFdkQsTUFBTSxJQUFBLG9CQUFZLEVBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7WUFDdkUsT0FBTyxFQUFFO2dCQUNMLGFBQWEsRUFBRSxZQUFZLENBQUMsa0JBQWtCO2dCQUM5QyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztnQkFDN0MsY0FBYyxFQUFFLFdBQVc7Z0JBQzNCLG1CQUFtQixFQUFFLGVBQWU7Z0JBQ3BDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUU7YUFDNUM7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBRzFCLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFFOUMsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBZ0JqQyxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFFOUMsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBc0JuQyxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFFaEQsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBSTFCLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFFOUMsTUFBTSxjQUFjLEdBQUcsZ0JBQWdCLENBYXBDLHFCQUFxQixFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUVqRCxtQ0FBbUM7SUFDbkMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFjLEVBQUUsRUFBRTtRQUMvQyxJQUFJLGFBQWEsR0FBRyxNQUFNLElBQUEsb0JBQVksRUFBQyxJQUFJLENBQUMsTUFBTSxHQUFHLDBDQUEwQyxHQUFHLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtZQUNuSSxPQUFPLEVBQUU7Z0JBQ0wsYUFBYSxFQUFFLElBQUksQ0FBQyxrQkFBa0I7YUFDekM7U0FDSixDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUt6QyxDQUFDO0lBQ04sQ0FBQyxDQUFDLENBQUM7SUFDSCxLQUFLLFVBQVUsVUFBVSxDQUFDLE1BS3pCO1FBTUcsSUFBSSxVQUFVLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdkQsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFBLG9CQUFZLEVBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7WUFDbEYsT0FBTyxFQUFFO2dCQUNMLGFBQWEsRUFBRSxVQUFVLENBQUMsa0JBQWtCO2dCQUM1QyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsVUFBVSxHQUFHLEVBQUU7Z0JBQzFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxJQUFJO2dCQUNoQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFO2FBRTVDO1NBQ0osQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FhckMsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRWxELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUVqQyxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFFdEQsTUFBTSx3QkFBd0IsR0FBRyxnQkFBZ0IsQ0FjOUMsK0JBQStCLEVBQUUsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRTNELEtBQUssVUFBVSxjQUFjLENBQUMsSUFBWTtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFHRCxPQUFPO1FBQ0gsWUFBWTtRQUNaLFlBQVk7UUFDWixXQUFXO1FBQ1gsa0JBQWtCO1FBQ2xCLGNBQWM7UUFDZCxVQUFVO1FBQ1YsUUFBUTtRQUNSLFdBQVc7UUFDWCxhQUFhO1FBQ2IsUUFBUTtRQUNSLGNBQWM7UUFDZCxVQUFVO1FBQ1YsZUFBZTtRQUNmLGVBQWU7UUFDZix3QkFBd0I7UUFDeEIsY0FBYztRQUNkLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtRQUNuQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87S0FDeEIsQ0FBQztBQUNOLENBQUMsQ0FBQyxDQUFDO0FBS0gsTUFBYSxpQkFBaUI7SUFDMUIsWUFBMkIsTUFNMUI7UUFOMEIsV0FBTSxHQUFOLE1BQU0sQ0FNaEM7UUFLTyxlQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRSxhQUFRLEdBQUcsRUFBRSxDQUFDO1FBRWQsWUFBTyxHQUFHLEtBQUssQ0FBQztRQWFoQixpQkFBWSxHQUFHLElBQUEsY0FBSSxFQUFDLEtBQUssSUFBSSxFQUFFOztZQUNuQyxJQUFJLEdBQUcsR0FBRyxNQUFNLE1BQU0sRUFBRSxDQUFDO1lBRXpCLElBQUksU0FBUyxHQUFHLE1BQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLG1DQUFJLENBQUMsQ0FBQztZQUMzQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3hCLFNBQVMsR0FBRyxnQ0FBb0IsQ0FBQztZQUNyQyxDQUFDO1lBRUQsbUdBQW1HO1lBQ25HLElBQUksZ0JBQWdCLEdBQUcsQ0FBQztvQkFDcEIsWUFBWSxFQUFFLFVBQVU7b0JBQ3hCLGNBQWMsRUFBRSxNQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxtQ0FBSSxDQUFDLE9BQU8sQ0FBQztvQkFDdkQsaUJBQWlCLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSwwQkFBMEIsQ0FBQztvQkFDekUsY0FBYyxFQUFFLENBQUMsT0FBTyxDQUFDO29CQUN6QixhQUFhLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztvQkFDcEMsb0dBQW9HO29CQUNwRyxhQUFhLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsU0FBUyxHQUFHLElBQUksQ0FBQztpQkFDaEQsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxVQUFVLEdBQTRCLEVBQUUsQ0FBQztZQUM3QyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNaLFVBQVUsQ0FBQyxlQUFlLENBQUMsR0FBRyxXQUFXLFNBQVMsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUNoRSxDQUFDO1lBR0QsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ25CLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNoQixPQUFPLElBQUksRUFBRSxDQUFDO2dCQUNWLElBQUksQ0FBQztvQkFDRCxNQUFNLEdBQUcsQ0FBQyxZQUFZLENBQUM7d0JBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTt3QkFDM0IsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFlBQVk7d0JBQzNELGNBQWMsRUFBRSxDQUFDO2dDQUNiLDJCQUEyQixFQUFFLElBQUk7Z0NBQ2pDLG1GQUFtRjtnQ0FDbkYsMEJBQTBCLEVBQUUsQ0FBQztnQ0FDN0IsZ0JBQWdCLEVBQUUsRUFBRTs2QkFDdkIsQ0FBQzt3QkFDRixTQUFTLEVBQUUsZ0JBQWdCO3dCQUMzQixVQUFVO3FCQUNiLENBQUMsQ0FBQztnQkFDUCxDQUFDO2dCQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7b0JBQ2QsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFDLEVBQUUsQ0FBQzt3QkFDL0MsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7NEJBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7NEJBQzVFLE1BQU0sSUFBQSxnQkFBSyxFQUFDLElBQUksQ0FBQyxDQUFDOzRCQUNsQixPQUFPLEVBQUUsQ0FBQzs0QkFDVixTQUFTO3dCQUNiLENBQUM7d0JBQ0QsTUFBTSxDQUFDLENBQUM7b0JBQ1osQ0FBQztvQkFDRCxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNsQixDQUFDO2dCQUNELE1BQU07WUFDVixDQUFDO1lBRUQsSUFBSSxVQUFVLEdBQUcsTUFBTSxHQUFHLENBQUMsV0FBVyxDQUFDO2dCQUNuQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7YUFDOUIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLFVBQVUsMkhBQTJILENBQUMsQ0FBQztZQUNoTCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUUvQyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNULElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLFNBQVMsU0FBUyxDQUFDLEdBQTRCO29CQUMzQyxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUMvQixJQUFBLFdBQUksRUFBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdEIsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwQyxDQUFDO2dCQUNELFNBQVMscUJBQXFCLENBQUMsR0FBNEIsRUFBRSxHQUE0QjtvQkFDckYsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzdFLENBQUM7Z0JBQ0QsU0FBUywwQkFBMEIsQ0FBQyxHQUFjLEVBQUUsR0FBYztvQkFDOUQsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNO3dCQUFFLE9BQU8sS0FBSyxDQUFDO29CQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO3dCQUNsQyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBNEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUE0QixDQUFDOzRCQUFFLE9BQU8sS0FBSyxDQUFDO29CQUNuSCxDQUFDO29CQUNELE9BQU8sSUFBSSxDQUFDO2dCQUNoQixDQUFDO2dCQUNELElBQ0ksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDO3VCQUM1RCxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEVBQzFELENBQUM7b0JBQ0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFBLG1CQUFPLEVBQUMsMkJBQTJCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztvQkFDdkcsTUFBTSxHQUFHLENBQUMsWUFBWSxDQUFDO3dCQUNuQixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7d0JBQzNCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTt3QkFDekIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO3dCQUM3QixjQUFjLEVBQUUsTUFBTSxDQUFDLGNBQWM7d0JBQ3JDLFNBQVMsRUFBRSxnQkFBZ0I7d0JBQzNCLFVBQVUsRUFBRSxVQUFVO3FCQUN6QixDQUFDLENBQUM7Z0JBQ1AsQ0FBQztZQUNMLENBQUM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO1FBSUgsb0RBQW9EO1FBQzVDLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBekhyQiw2QkFBNkI7UUFDN0IsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQU1NLGFBQWE7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUNPLEdBQUcsQ0FBQyxJQUFZO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRU0sWUFBWTtRQUNmLE9BQU8sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQ2pELENBQUM7SUF3R0Qsb1JBQW9SO0lBQzVRLEtBQUssQ0FBQyxhQUFhLENBQ3ZCLE9BQWUsRUFDZixHQUErQixFQUMvQixPQUFPLEdBQUcsQ0FBQztRQUVYLElBQUksR0FBc0IsQ0FBQztRQUMzQixJQUFJLENBQUM7WUFDRCxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDaEMsT0FBTyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQUMsT0FBTyxHQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLE9BQU8sSUFBSSxDQUFDO2dCQUFFLE1BQU0sR0FBRyxDQUFDO1lBRTVCLGlGQUFpRjtZQUNqRixJQUNJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO21CQUM3QixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQzttQkFDM0MsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUM7bUJBQ3RDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUNuQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsNERBQTREO2dCQUM1RCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksT0FBTyw2Q0FBNkMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3BGLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLDZDQUE2QyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDaEYsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQ2pELE1BQU0sSUFBQSxnQkFBSyxFQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztvQkFDdkIsc0hBQXNIO29CQUN0SCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQzt3QkFDN0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sd0NBQXdDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO3dCQUMzRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDL0IsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQzlCLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQztnQkFDbEQsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUN4QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDekQsQ0FBQztZQUVELHlKQUF5SjtZQUN6SixJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sK0JBQStCLENBQUMsQ0FBQztnQkFDckQsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzFCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN6RCxDQUFDO1lBRUQsSUFDSSxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQzttQkFDckMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO21CQUMvQixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDdkMsd0hBQXdIO21CQUNySCxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQzttQkFDckMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUM7bUJBQzNDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQzttQkFDaEMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO21CQUNsQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFDbEMsQ0FBQztnQkFDQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksT0FBTyxxQkFBcUIsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQzVELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLEtBQUssR0FBRyxDQUFDLE9BQU8saUJBQWlCLENBQUMsQ0FBQztnQkFDdkQsTUFBTSxJQUFBLGdCQUFLLEVBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN6RCxDQUFDO1lBRUQsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7Z0JBQzlDLElBQUksR0FBRyxFQUFFLENBQUM7b0JBQ04sSUFBSSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNqQyxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO29CQUMvQixJQUFJLGVBQWUsR0FBRyxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO3dCQUM5QyxhQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsRUFBRTs0QkFDcEMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUN2QixDQUFDLENBQUMsQ0FBQztvQkFDUCxDQUFDLENBQUMsQ0FBQztvQkFDSCxJQUFJLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7d0JBQy9DLGFBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFOzRCQUN0QyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7d0JBQ3ZCLENBQUMsQ0FBQyxDQUFDO29CQUNQLENBQUMsQ0FBQyxDQUFDO29CQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLDJCQUEyQixRQUFRLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3JKLENBQUM7WUFDTCxDQUFDO1lBRUQsTUFBTSxHQUFHLENBQUM7UUFDZCxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBZ0IsRUFBRSxNQUFrQjtRQUNqRCxJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDO0lBQzlDLENBQUM7SUFDTSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQWdCLEVBQUUsTUFBa0I7UUFDbEQsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQztZQUNELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN0QixNQUFNLFlBQVksR0FBRyxHQUFHLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxXQUFXO29CQUFFLE9BQU87Z0JBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsa0NBQWtDLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZELFVBQVUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkMsQ0FBQyxDQUFDO1lBQ0YsVUFBVSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMvQixJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUE4RCxFQUFFO2dCQUMvSCxJQUFJLEtBQUssR0FBRyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSyxDQUFDO2dCQUMxQixJQUFJLEtBQUssRUFBRSxDQUFDO29CQUNSLHVFQUF1RTtvQkFDdkUsSUFBSSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUM1QyxJQUFJLENBQUMsUUFBUTt3QkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsUUFBUSxZQUFZLENBQUMsQ0FBQztvQkFDN0QsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztvQkFDN0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDbEQsb0dBQW9HO29CQUNwRyxJQUFJLFFBQVEsSUFBSSxVQUFVO3dCQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNqSCxJQUFJLElBQUksR0FBRyxNQUFNLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQzt3QkFDcEMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO3dCQUMzQixRQUFRO3dCQUNSLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRTtxQkFDOUMsQ0FBQyxDQUFDO29CQUNILElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLEdBQUcsVUFBVSxFQUFFLENBQUM7d0JBQ3hDLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkVBQTZFLFVBQVUsSUFBSSxRQUFRLGtCQUFrQixVQUFVLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLGVBQWUsUUFBUSxFQUFFLENBQUMsQ0FBQztvQkFDeE0sQ0FBQztvQkFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3hFLENBQUM7Z0JBQ0QsOEZBQThGO2dCQUM5RixJQUFJLFFBQVEsR0FBc0IsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7Z0JBQ2xELElBQUksSUFBSSxHQUFHLE1BQU0sR0FBRyxDQUFDLGtCQUFrQixDQUFDO29CQUNwQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7b0JBQzNCLFFBQVE7b0JBQ1IsV0FBVyxFQUFFLFFBQVE7aUJBQ3hCLENBQUMsQ0FBQztnQkFDSCxJQUFJLElBQUksR0FBRyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDOUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hFLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxPQUFPLEdBQUcsSUFBQSxtQkFBVSxFQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUM1QyxJQUFJLE9BQU8sR0FBRyxJQUFBLHFCQUFZLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ3BGLElBQUksQ0FBQyxHQUFHLENBQUMsdUJBQXVCLElBQUEscUJBQVksRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLEtBQUssS0FBSSxLQUFLLElBQUEscUJBQVksRUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUEscUJBQVksRUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLE9BQU8sS0FBSyxPQUFPLEtBQUssUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNuTixPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxHQUFHLENBQUMsaUNBQWlDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDdEQsT0FBTyxTQUFTLENBQUM7UUFDckIsQ0FBQztnQkFBUyxDQUFDO1lBQ1AsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN4QixDQUFDO0lBQ0wsQ0FBQztJQUNNLEtBQUssQ0FBQyxTQUFTO1FBQ2xCLE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUNNLEtBQUssQ0FBQyxjQUFjOztRQUN2QixJQUFJLENBQUM7WUFDRCxJQUFJLEdBQUcsR0FBRyxNQUFNLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLGlGQUFpRjtZQUNqRixJQUFJLFVBQVUsR0FBRyxHQUFHLENBQUMsT0FBa0IsQ0FBQztZQUN4QyxJQUFJLFdBQVcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQXVCLENBQUM7WUFDbEcsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQzlCLE9BQU8sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQzttQkFDeEMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3JFLENBQUM7UUFDTixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNULDJCQUEyQjtZQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxNQUFDLENBQVcsQ0FBQyxLQUFLLG1DQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDOUUsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztJQUNMLENBQUM7SUFDTSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQWdCLEVBQUUsSUFBWSxFQUFFLE1BQWtCO1FBQy9ELElBQUksQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsaUJBQWlCLEtBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyw2R0FBNkcsUUFBUSxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkssQ0FBQztRQUNELElBQUksTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLElBQUEsbUNBQXVCLEVBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ25CLElBQUksUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDNUMsaUtBQWlLO2dCQUNqSyxJQUFJLFFBQVEsSUFBSSxNQUFNLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxTQUFTO29CQUFFLE9BQU8sUUFBUSxDQUFDO2dCQUMxRSx1SUFBdUk7Z0JBQ3ZJLElBQUksUUFBUSxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVM7b0JBQUUsT0FBTyxRQUFRLENBQUM7WUFDdkYsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLHFCQUFxQixJQUFBLHFCQUFZLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUM3RCxNQUFNLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUM7UUFDN0UsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsUUFBUSxDQUFBLEVBQUUsQ0FBQztZQUNwQixJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDdEIsT0FBTyxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxNQUFNO29CQUFFLE1BQU07Z0JBQ2xCLE1BQU0sSUFBQSxnQkFBSyxFQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQixZQUFZLEVBQUUsQ0FBQztZQUNuQixDQUFDO1lBQ0QsSUFBSSxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDMUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLFFBQVEsSUFBSSxDQUFDLG1OQUFtTixDQUFDLENBQUM7WUFDM1AsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBQ00sS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFnQjtRQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQztZQUNELE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnQkFDM0QsTUFBTSxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDeEUsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxHQUFHLENBQUMsb0RBQW9ELFFBQVEsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6RixDQUFDO1FBRUQsdWRBQXVkO0lBQzNkLENBQUM7SUFFRCxrSkFBa0o7SUFDM0ksS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUE0RjtRQUVsSCxJQUFJLE9BQU8sR0FBNEIsRUFBRSxDQUFDO1FBQzFDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUM7WUFDRCxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDO1lBQ3RCLHVFQUF1RTtZQUN2RSxNQUFNLGNBQWMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztZQUN4QyxJQUFJLFNBQVMsR0FBYSxFQUFFLENBQUM7WUFDN0IsS0FBSyxVQUFVLFdBQVc7Z0JBQ3RCLElBQUksU0FBUyxDQUFDLE1BQU07b0JBQUUsT0FBTyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQy9DLGtGQUFrRjtnQkFDbEYsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQixJQUFJLE9BQU8sR0FBYSxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sVUFBVSxHQUFHLGNBQWMsRUFBRSxDQUFDO29CQUNqQyxJQUFJLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLElBQUk7d0JBQUUsTUFBTTtvQkFDakIsVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7b0JBQzFCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZCLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNO29CQUFFLE9BQU8sU0FBUyxDQUFDO2dCQUN0QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEMsQ0FBQztZQUVELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLElBQUksR0FBRyxNQUFNLFdBQVcsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxDQUFBLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxNQUFNLENBQUE7Z0JBQUUsT0FBTztZQUMxQix5Q0FBeUM7WUFDekMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLGNBQWMsRUFBRSxDQUFDO2dCQUMvQixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMvQixPQUFPO1lBQ1gsQ0FBQztZQUNELHlDQUF5QztZQUN6QyxJQUFJLFVBQVUsR0FBRyxNQUFNLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxDQUFBLFVBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxNQUFNLENBQUEsRUFBRSxDQUFDO2dCQUN0QixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMvQixPQUFPO1lBQ1gsQ0FBQztZQUNELGdIQUFnSDtZQUNoSCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsY0FBYyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVELE9BQU87WUFDWCxDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDaEQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFHcEMsSUFBSSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQ2xGLE9BQU8sTUFBTSxHQUFHLENBQUMsY0FBYyxDQUFDO29CQUM1QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7b0JBQ3ZCLFFBQVEsRUFBRSxRQUFRO29CQUNsQixXQUFXLEVBQUUsV0FBVztvQkFDeEIsUUFBUSxFQUFFLEVBQUU7aUJBQ2YsQ0FBQyxDQUFDO1lBQ1AsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUNwQixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtvQkFDbEUsTUFBTSxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RCxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1lBRUgsTUFBTSxZQUFZLEdBQUcsbUJBQVksQ0FBQztZQUNsQyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsWUFBWSxDQUFDO1lBRTVDLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztZQUNuQixJQUFJLGFBQWEsR0FBYSxFQUFFLENBQUM7WUFDakMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLE9BQU8sSUFBSSxFQUFFLENBQUM7Z0JBQ1YsSUFBSSxHQUFHLE1BQU0sV0FBVyxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxJQUFJO29CQUFFLE1BQU07Z0JBQ2pCLGthQUFrYTtnQkFDbGEsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUMzQixJQUFJLGFBQWEsR0FBRyxNQUFNLFdBQVcsRUFBRSxDQUFDO29CQUN4QyxJQUFJLGFBQWEsRUFBRSxDQUFDO3dCQUNoQixJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsY0FBYyxFQUFFLENBQUM7NEJBQ3hDLHVDQUF1Qzs0QkFDdkMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQzt3QkFDaEQsQ0FBQzs2QkFBTSxDQUFDOzRCQUNKLG1KQUFtSjs0QkFDbkosU0FBUyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQzt3QkFDckMsQ0FBQztvQkFDTCxDQUFDO2dCQUNMLENBQUM7Z0JBQ0QsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDakMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDNUIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsVUFBVSxJQUFJLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtvQkFDM0UsSUFBSSxDQUFDLElBQUk7d0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO29CQUU1RCxJQUFJLE9BQU8sR0FBRyxJQUFBLG1CQUFVLEVBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO29CQUM1QyxJQUFJLE9BQU8sR0FBRyxJQUFBLHFCQUFZLEVBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDNUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsVUFBVSxjQUFjLElBQUEsZ0JBQUksRUFBQyxJQUFBLHFCQUFZLEVBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sSUFBQSxnQkFBSSxFQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUEsZ0JBQUksRUFBQyxPQUFPLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDN0osVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7b0JBRTFCLE1BQU0sR0FBRyxDQUFDLFVBQVUsQ0FBQzt3QkFDakIsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO3dCQUN6QixVQUFVLEVBQUUsVUFBVTt3QkFDdEIsSUFBSSxFQUFFLElBQUk7d0JBQ1YsSUFBSSxFQUFFLE9BQU87cUJBQ2hCLENBQUMsQ0FBQztnQkFDUCxDQUFDLENBQUMsQ0FBQztnQkFDSCxVQUFVLEVBQUUsQ0FBQztnQkFFYixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxXQUFXLEVBQUUsQ0FBQztvQkFDM0IsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxZQUFZLENBQUM7b0JBQ3hDLElBQUksT0FBTyxHQUFHLElBQUEsbUJBQVUsRUFBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7b0JBQzVDLElBQUksT0FBTyxHQUFHLElBQUEscUJBQVksRUFBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO29CQUM1RSxPQUFPLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxJQUFJLENBQUMsR0FBRyxFQUFFLGNBQWMsSUFBQSxxQkFBWSxFQUFDLFVBQVUsQ0FBQyxRQUFRLE9BQU8sS0FBSyxPQUFPLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ2pKLENBQUM7WUFDTCxDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQywwQ0FBMEMsSUFBQSxpQkFBSyxFQUFDLElBQUEscUJBQVksRUFBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV2RixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtnQkFDbEUsTUFBTSxHQUFHLENBQUMsZUFBZSxDQUFDO29CQUN0QixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07b0JBQ3pCLGFBQWEsRUFBRSxhQUFhO2lCQUMvQixDQUFDLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1lBQ2QsS0FBSyxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDO29CQUNELE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ2QsQ0FBQztnQkFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0ZBQWdGLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDcEgsQ0FBQztZQUNMLENBQUM7WUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFnQjtRQUNqQyxPQUFPLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNqRSxJQUFJLENBQUM7Z0JBQ0QsSUFBSSxJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDL0UsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNSLElBQUksQ0FBQyxHQUFHLENBQUMsNkJBQTZCLFFBQVEsRUFBRSxDQUFDLENBQUM7b0JBQ2xELE9BQU8sU0FBUyxDQUFDO2dCQUNyQixDQUFDO2dCQUNELElBQUksQ0FBQyxHQUFHLENBQUMseUJBQXlCLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQzlDLE9BQU87b0JBQ0gsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlO29CQUMvQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7aUJBQ2xCLENBQUM7WUFDTixDQUFDO1lBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztvQkFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsUUFBUSxFQUFFLENBQUMsQ0FBQztvQkFDbEQsT0FBTyxTQUFTLENBQUM7Z0JBQ3JCLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLENBQUM7WUFDWixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsb0NBQW9DO0lBQzdCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBYyxFQUFFLE1BQXlEO1FBQ3ZGLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDTSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBMEI7UUFDcEQsMkdBQTJHO1FBQzNHLE9BQU8sSUFBQSw0QkFBYSxFQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFjLEVBQUUsTUFBeUQ7UUFDM0YsT0FBTyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDaEUsSUFBSSxDQUFDLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLE9BQU8sQ0FBQSxJQUFJLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLElBQUksTUFBSyxTQUFTLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBOEQsQ0FBQztnQkFDdkYsS0FBSyxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDOUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNwRCxJQUFJLENBQUMsTUFBTTt3QkFBRSxTQUFTO29CQUN0QixVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQy9ELENBQUM7Z0JBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLENBQUM7WUFDRCxJQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBK0QsQ0FBQztZQUNuRixJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDdkIsT0FBTyxJQUFJLEVBQUUsQ0FBQztnQkFDVixJQUFJLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxhQUFhLENBQUM7b0JBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtvQkFDdkIsTUFBTSxFQUFFLE1BQU07b0JBQ2QsYUFBYTtvQkFDYixZQUFZLEVBQUUsSUFBSTtvQkFDbEIsU0FBUyxFQUFFLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLE9BQU8sRUFBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTO2lCQUMvQyxDQUFDLENBQUM7Z0JBQ0gsS0FBSyxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQzVCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLElBQUksQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsSUFBSSxNQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUN6RCxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7b0JBQ2xILENBQUM7eUJBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsSUFBSSxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxJQUFJLE1BQUssU0FBUyxFQUFFLENBQUM7d0JBQ2hFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7d0JBQzNCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUN2QixNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDakMsQ0FBQzt3QkFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO29CQUNwRyxDQUFDO2dCQUVMLENBQUM7Z0JBQ0QsYUFBYSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxhQUFhO29CQUFFLE1BQU07WUFDOUIsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZSxDQUFDLElBQVk7UUFDckMsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLElBQUksQ0FBQyxNQUFNLHdDQUF3QyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pHLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUtqQjtRQUNHLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUMxQyw2RUFBNkU7UUFDN0UsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDLDRFQUE0RSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzdGLE9BQU87UUFDWCxDQUFDO1FBQ0QsSUFBSSxNQUFNLFlBQVksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QyxJQUFJLGNBQWMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQ3JDLElBQUksY0FBYyxLQUFLLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxLQUFLLFVBQVU7Z0JBQUUsT0FBTztZQUNwRSxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxJQUFJLE9BQU8sVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUNwRSwwSEFBMEg7Z0JBQzFILElBQUksSUFBSSxHQUFHLE1BQU0sR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2hHLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDckQsSUFBSSxDQUFDLElBQUk7b0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDOUQsTUFBTSxHQUFHLENBQUMsUUFBUSxDQUFDO29CQUNmLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDekIsUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLG1CQUFtQixFQUFFLGNBQWM7aUJBQ3RDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLElBQUk7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM5RCxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxrREFBa0QsVUFBVSxvQ0FBb0MsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMxSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFJakI7UUFDRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFZO1FBQzVCLE9BQU8sTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2QixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixDQUFDO1lBQ0QsT0FBTyxNQUFNLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxNQVNyQzs7UUFLRyxPQUFPLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsTUFBQSxNQUFNLENBQUMsY0FBYyxtQ0FBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7O1lBQ3JHLE9BQU8sTUFBTSxHQUFHLENBQUMsd0JBQXdCLENBQUM7Z0JBQ3RDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsY0FBYyxFQUFFLE1BQUEsTUFBTSxDQUFDLGNBQWMsbUNBQUksRUFBRTtnQkFDM0MsR0FBRyxNQUFNO2FBQ1osQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUF0bkJELDhDQXNuQkM7QUFFRDs7Ozs7O0VBTUU7QUFHVyxRQUFBLG9CQUFvQixHQUFHLElBQUEsZUFBSyxFQUFDLENBQUMsTUFBYyxFQUFFLEVBQUU7SUFDekQsT0FBTyxJQUFJLGlCQUFpQixDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDekQsQ0FBQyxDQUFDLENBQUM7QUFDVSxRQUFBLG9DQUFvQyxHQUFHLElBQUEsZUFBSyxFQUFDLENBQUMsTUFBYyxFQUFFLEVBQUU7SUFDekUsT0FBTyxJQUFJLGlCQUFpQixDQUFDO1FBQ3pCLFVBQVUsRUFBRSxNQUFNLEdBQUcsb0JBQW9CO1FBQ3pDLFNBQVMsRUFBRSxJQUFJO0tBQ2xCLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDO0FBQ1UsUUFBQSxtQ0FBbUMsR0FBRyxJQUFBLGVBQUssRUFBQyxDQUFDLE1BQWMsRUFBRSxFQUFFO0lBQ3hFLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQztRQUN6QixVQUFVLEVBQUUsTUFBTSxHQUFHLG1CQUFtQjtRQUN4QyxNQUFNLEVBQUUsSUFBSTtRQUNaLFNBQVMsRUFBRSxJQUFJO1FBQ2YsY0FBYyxFQUFFLENBQUMsV0FBVyxNQUFNLEVBQUUsRUFBRSxxQkFBcUIsTUFBTSxPQUFPLENBQUM7S0FDNUUsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDLENBQUM7QUFFSCwyUUFBMlE7QUFDOVAsUUFBQSwwQkFBMEIsR0FBRyxJQUFBLGVBQUssRUFBQyxDQUFDLE1BQWMsRUFBRSxFQUFFO0lBQy9ELE9BQU8sSUFBSSxpQkFBaUIsQ0FBQztRQUN6QixVQUFVLEVBQUUsTUFBTSxHQUFHLFNBQVM7UUFDOUIsTUFBTSxFQUFFLElBQUk7UUFDWixTQUFTLEVBQUUsbUJBQVk7UUFDdkIsY0FBYyxFQUFFLENBQUMsV0FBVyxNQUFNLEVBQUUsRUFBRSxxQkFBcUIsTUFBTSxPQUFPLENBQUM7S0FDNUUsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjYWNoZSwgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCB7IGlzTm9kZSwgc29ydCwgdGltZUluSG91ciwgdGltZUluTWludXRlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgZm9ybWF0TnVtYmVyLCBmb3JtYXRUaW1lIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcbmltcG9ydCB7IGJsdWUsIGdyZWVuLCBtYWdlbnRhIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9sb2dDb2xvcnNcIjtcbmltcG9ydCBkZWJ1Z2JyZWFrIGZyb20gXCJkZWJ1Z2JyZWFrXCI7XG5pbXBvcnQgZG5zIGZyb20gXCJkbnNcIjtcbmltcG9ydCB7IGdldFNlY3JldCB9IGZyb20gXCIuLi9taXNjL2dldFNlY3JldFwiO1xuaW1wb3J0IHsgaHR0cHNSZXF1ZXN0LCBIdHRwc1Jlc3BvbnNlSW5mbyB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2h0dHBzXCI7XG5pbXBvcnQgeyBJQXJjaGl2ZXMsIEFyY2hpdmVzQ29uZmlnLCBDaGFuZ2VzQWZ0ZXJDb25maWcsIEFyY2hpdmVGaWxlSW5mbywgR2V0Q29uZmlnLCBTZXRDb25maWcsIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkLCBJTU1VVEFCTEVfQ0FDSEVfVElNRSB9IGZyb20gXCIuL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgZmlsdGVyQ2hhbmdlcyB9IGZyb20gXCIuL3JlbW90ZVN0b3JhZ2UvcmVtb3RlQ29uZmlnXCI7XG5cbnR5cGUgQmFja2JsYXplQ3JlZHMgPSB7XG4gICAgYXBwbGljYXRpb25LZXlJZDogc3RyaW5nO1xuICAgIGFwcGxpY2F0aW9uS2V5OiBzdHJpbmc7XG59O1xuXG5sZXQgYmFja2JsYXplQ3JlZHMgPSBsYXp5KGFzeW5jICgpOiBQcm9taXNlPEJhY2tibGF6ZUNyZWRzPiA9PiB7XG4gICAgbGV0IGtleUlkID0gYXdhaXQgZ2V0U2VjcmV0KFwiYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlJZFwiKTtcbiAgICBsZXQga2V5ID0gYXdhaXQgZ2V0U2VjcmV0KFwiYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXBwbGljYXRpb25LZXlJZDoga2V5SWQsXG4gICAgICAgIGFwcGxpY2F0aW9uS2V5OiBrZXksXG4gICAgfTtcbn0pO1xuLy8gQSBCMiBkb3dubG9hZC9IRUFEIHJlc3BvbnNlJ3MgaGVhZGVycyBjYXJyeSB0aGUgZmlsZSdzIG1ldGFkYXRhLiBjb250ZW50LXJhbmdlJ3MgdG90YWwgd2lucyBvdmVyIGNvbnRlbnQtbGVuZ3RoIGZvciByYW5nZWQgcmVzcG9uc2VzICh3aGljaCBvbmx5IHJlcG9ydCB0aGUgc2xpY2UncyBsZW5ndGgpLlxuZnVuY3Rpb24gcGFyc2VGaWxlTWV0YWRhdGFIZWFkZXJzKHJlc3BvbnNlOiBIdHRwc1Jlc3BvbnNlSW5mbyk6IHsgc2l6ZTogbnVtYmVyOyB1cGxvYWRUaW1lc3RhbXA6IG51bWJlciB9IHtcbiAgICBsZXQgc2l6ZSA9IE51bWJlcihyZXNwb25zZS5oZWFkZXJzW1wiY29udGVudC1sZW5ndGhcIl0gfHwgMCk7XG4gICAgbGV0IGNvbnRlbnRSYW5nZSA9IHJlc3BvbnNlLmhlYWRlcnNbXCJjb250ZW50LXJhbmdlXCJdO1xuICAgIGxldCB0b3RhbCA9IGNvbnRlbnRSYW5nZSAmJiBOdW1iZXIoY29udGVudFJhbmdlLnNwbGl0KFwiL1wiKVsxXSk7XG4gICAgaWYgKHRvdGFsICYmIE51bWJlci5pc0Zpbml0ZSh0b3RhbCkpIHtcbiAgICAgICAgc2l6ZSA9IHRvdGFsO1xuICAgIH1cbiAgICByZXR1cm4geyBzaXplLCB1cGxvYWRUaW1lc3RhbXA6IE51bWJlcihyZXNwb25zZS5oZWFkZXJzW1wieC1iei11cGxvYWQtdGltZXN0YW1wXCJdIHx8IDApIH07XG59XG5cbmNvbnN0IGdldEFQSSA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgIGxldCBjcmVkcyA9IGF3YWl0IGJhY2tibGF6ZUNyZWRzKCk7XG5cbiAgICAvLyBOT1RFOiBPbiBlcnJvcnMsIG91ciByZXRyeSBjb2RlIHJlc2V0cyB0aGlzIGxhenksIHNvIHdlIERPIGdldCBuZXcgYXV0aG9yaXplIHdoZW4gbmVlZGVkLlxuICAgIC8vIFRPRE86IE1heWJlIHdlIHNob3VsZCBnZXQgbmV3IGF1dGhvcml6YXRpb24gcGVyaW9kaWNhbGx5IGF0IHdlbGw/XG4gICAgbGV0IGF1dGhvcml6ZVJhdyA9IGF3YWl0IGh0dHBzUmVxdWVzdChcImh0dHBzOi8vYXBpLmJhY2tibGF6ZWIyLmNvbS9iMmFwaS92Mi9iMl9hdXRob3JpemVfYWNjb3VudFwiLCB1bmRlZmluZWQsIFwiR0VUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBcIkJhc2ljIFwiICsgQnVmZmVyLmZyb20oY3JlZHMuYXBwbGljYXRpb25LZXlJZCArIFwiOlwiICsgY3JlZHMuYXBwbGljYXRpb25LZXkpLnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgYXV0aCA9IEpTT04ucGFyc2UoYXV0aG9yaXplUmF3LnRvU3RyaW5nKCkpIGFzIHtcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGF1dGhvcml6YXRpb25Ub2tlbjogc3RyaW5nO1xuICAgICAgICBhcGlVcmw6IHN0cmluZztcbiAgICAgICAgZG93bmxvYWRVcmw6IHN0cmluZztcbiAgICAgICAgYWxsb3dlZDoge1xuICAgICAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogc3RyaW5nW107XG4gICAgICAgICAgICBuYW1lUHJlZml4OiBzdHJpbmc7XG4gICAgICAgIH1bXTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlQjJGdW5jdGlvbjxBcmcsIFJlc3VsdD4obmFtZTogc3RyaW5nLCB0eXBlOiBcIlBPU1RcIiB8IFwiR0VUXCIsIG5vQWNjb3VudElkPzogXCJub0FjY291bnRJZFwiKTogKGFyZzogQXJnKSA9PiBQcm9taXNlPFJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gYXN5bmMgKGFyZzogQXJnKSA9PiB7XG4gICAgICAgICAgICBpZiAoIW5vQWNjb3VudElkKSB7XG4gICAgICAgICAgICAgICAgYXJnID0geyBhY2NvdW50SWQ6IGF1dGguYWNjb3VudElkLCAuLi5hcmcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGF1dGguYXBpVXJsICsgXCIvYjJhcGkvdjIvXCIgKyBuYW1lO1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QodXJsLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShhcmcpKSwgdHlwZSwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiAke25hbWV9LCBhcmcgJHtKU09OLnN0cmluZ2lmeShhcmcpLnNsaWNlKDAsIDEwMDApfTogJHtlLnN0YWNrfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNyZWF0ZUJ1Y2tldCA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM/OiBhbnlbXTtcbiAgICAgICAgY29yc1J1bGVzPzogdW5rbm93bltdO1xuICAgICAgICBidWNrZXRJbmZvPzoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICB9LCB7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICB9O1xuICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICBsaWZlY3ljbGVSdWxlczogYW55W107XG4gICAgICAgIHJldmlzaW9uOiBudW1iZXI7XG4gICAgfT4oXCJiMl9jcmVhdGVfYnVja2V0XCIsIFwiUE9TVFwiKTtcblxuICAgIGNvbnN0IHVwZGF0ZUJ1Y2tldCA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0VHlwZT86IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM/OiBhbnlbXTtcbiAgICAgICAgYnVja2V0SW5mbz86IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICAgIH07XG4gICAgICAgIGNvcnNSdWxlcz86IHVua25vd25bXTtcbiAgICB9LCB7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICB9O1xuICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICBsaWZlY3ljbGVSdWxlczogYW55W107XG4gICAgICAgIHJldmlzaW9uOiBudW1iZXI7XG4gICAgfT4oXCJiMl91cGRhdGVfYnVja2V0XCIsIFwiUE9TVFwiKTtcblxuICAgIC8vIGh0dHBzOi8vd3d3LmJhY2tibGF6ZS5jb20vYXBpZG9jcy9iMi11cGRhdGUtYnVja2V0XG4gICAgLy8gIFRPRE86IGIyX3VwZGF0ZV9idWNrZXQsIHNvIHdlIGNhbiB1cGRhdGUgQ09SUywgZXRjXG5cbiAgICBjb25zdCBsaXN0QnVja2V0cyA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXROYW1lPzogc3RyaW5nO1xuICAgIH0sIHtcbiAgICAgICAgYnVja2V0czoge1xuICAgICAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgYnVja2V0VHlwZTogXCJhbGxQcml2YXRlXCIgfCBcImFsbFB1YmxpY1wiO1xuICAgICAgICAgICAgYnVja2V0SW5mbzoge1xuICAgICAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBhbnlbXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb3JzUnVsZXM6IGFueVtdO1xuICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICAgICAgcmV2aXNpb246IG51bWJlcjtcbiAgICAgICAgfVtdO1xuICAgIH0+KFwiYjJfbGlzdF9idWNrZXRzXCIsIFwiUE9TVFwiKTtcblxuICAgIGZ1bmN0aW9uIGVuY29kZVBhdGgocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIC8vIFByZXNlcnZlIHNsYXNoZXMsIGJ1dCBlbmNvZGUgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgIHBhdGggPSBwYXRoLnNwbGl0KFwiL1wiKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiL1wiKTtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHBhdGggPSBcIiUyRlwiICsgcGF0aC5zbGljZSgxKTtcbiAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoXCIvXCIpKSBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSkgKyBcIiUyRlwiO1xuICAgICAgICAvLyBOT1RFOiBGb3Igc29tZSByZWFzb24sIHRoaXMgd29uJ3QgcmVuZGVyIGluIHRoZSB3ZWIgVUkgY29ycmVjdGx5LiBCVVQsIGl0J2xsXG4gICAgICAgIC8vICB3b3JrIGdldCBnZXQvc2V0IGFuZCBmaW5kXG4gICAgICAgIC8vICAtIEFMU08sIGl0IHNlZW1zIHRvIGFkZCBkdXBsaWNhdGUgZmlsZXM/IFRoaXMgbWlnaHQgYWxzbyBiZSBhIHdlYiBVSSB0aGluZy4gSXQgc2VlbXMgdG8gd29yayB0aG91Z2guXG4gICAgICAgIHdoaWxlIChwYXRoLmluY2x1ZGVzKFwiLy9cIikpIHtcbiAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2VBbGwoXCIvL1wiLCBcIi8lMkZcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZG93bmxvYWRGaWxlQnlOYW1lKGNvbmZpZzoge1xuICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcjsgfTtcbiAgICAgICAgLy8gQ2FwdHVyZXMgdGhlIHJlc3BvbnNlIGhlYWRlcnMsIHdoaWNoIGNhcnJ5IHRoZSBmaWxlJ3MgbWV0YWRhdGEgKHgtYnotdXBsb2FkLXRpbWVzdGFtcCwgY29udGVudC1sZW5ndGggLyBjb250ZW50LXJhbmdlKSAtIHNvIGNhbGxlcnMgdGhhdCBuZWVkIGl0IGRvbid0IHBheSBhIHNlY29uZCBBUEkgY2FsbFxuICAgICAgICBvdXRSZXNwb25zZT86IEh0dHBzUmVzcG9uc2VJbmZvO1xuICAgIH0pIHtcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gZW5jb2RlUGF0aChjb25maWcuZmlsZU5hbWUpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9maWxlL1wiICsgY29uZmlnLmJ1Y2tldE5hbWUgKyBcIi9cIiArIGZpbGVOYW1lLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBhY2NvdW50SWQ6IGF1dGguYWNjb3VudElkLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImFycmF5YnVmZmVyXCIsXG4gICAgICAgIH0pKSwgXCJHRVRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoe1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFJhbmdlOiBjb25maWcucmFuZ2UgPyBgYnl0ZXM9JHtjb25maWcucmFuZ2Uuc3RhcnR9LSR7Y29uZmlnLnJhbmdlLmVuZCAtIDF9YCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pLmZpbHRlcih4ID0+IHhbMV0gIT09IHVuZGVmaW5lZCkpLFxuICAgICAgICAgICAgb3V0UmVzcG9uc2U6IGNvbmZpZy5vdXRSZXNwb25zZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqIEEgZmlsZSdzIG1ldGFkYXRhIGJ5IG5hbWUsIHdpdGhvdXQgdGhlIGJvZHk6IEhFQUQgb24gdGhlIGRvd25sb2FkIFVSTCwgd2hpY2ggaXMgYSBjbGFzcyBCIChkb3dubG9hZC1wcmljZWQpIHRyYW5zYWN0aW9uIC0gYjJfbGlzdF9maWxlX25hbWVzIGlzIGNsYXNzIEMgYXQgMTB4IHRoZSBwcmljZSwgYW5kIGIyX2dldF9maWxlX2luZm8gbmVlZHMgYSBmaWxlSWQgd2UgZG9uJ3QgaGF2ZS4gUmV0dXJucyB1bmRlZmluZWQgZm9yIG1pc3NpbmcgKG9yIGhpZGRlbikgZmlsZXMuICovXG4gICAgYXN5bmMgZnVuY3Rpb24gaGVhZEZpbGVCeU5hbWUoY29uZmlnOiB7IGJ1Y2tldE5hbWU6IHN0cmluZzsgZmlsZU5hbWU6IHN0cmluZyB9KTogUHJvbWlzZTx7IHNpemU6IG51bWJlcjsgdXBsb2FkVGltZXN0YW1wOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgZmlsZU5hbWUgPSBlbmNvZGVQYXRoKGNvbmZpZy5maWxlTmFtZSk7XG4gICAgICAgIGxldCByZXNwb25zZTogSHR0cHNSZXNwb25zZUluZm8gPSB7IGhlYWRlcnM6IHt9IH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9maWxlL1wiICsgY29uZmlnLmJ1Y2tldE5hbWUgKyBcIi9cIiArIGZpbGVOYW1lLCB1bmRlZmluZWQsIFwiSEVBRFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuIH0sXG4gICAgICAgICAgICAgICAgb3V0UmVzcG9uc2U6IHJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MDQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBIRUFEIHJlc3BvbnNlcyBoYXZlIG5vIGJvZHksIHNvIHRoZSBleHBpcmVkX2F1dGhfdG9rZW4gbWFya2VyIGFwaVJldHJ5TG9naWMgbWF0Y2hlcyBvbiBuZXZlciBhcHBlYXJzIC0gcmUtYWRkIGl0IHNvIGFuIGV4cGlyZWQgdG9rZW4gc3RpbGwgcmVmcmVzaGVzIGFuZCByZXRyaWVzXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcImV4cGlyZWRfYXV0aF90b2tlblwiIEhFQUQgJHtjb25maWcuYnVja2V0TmFtZX0vJHtjb25maWcuZmlsZU5hbWV9IGdvdCBhIDQwMTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlRmlsZU1ldGFkYXRhSGVhZGVycyhyZXNwb25zZSk7XG4gICAgfVxuXG4gICAgLy8gT2guLi4gYXBwYXJlbnRseSwgd2UgY2FuJ3QgcmV1c2UgdGhlc2U/IEh1aC4uLlxuICAgIGNvbnN0IGdldFVwbG9hZFVSTCA9IChhc3luYyAoYnVja2V0SWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IGdldFVwbG9hZFVSTC5jbGVhcihidWNrZXRJZCksIHRpbWVJbkhvdXIgKiAxKTtcbiAgICAgICAgbGV0IGdldFVwbG9hZFVybFJhdyA9IGF3YWl0IGh0dHBzUmVxdWVzdChhdXRoLmFwaVVybCArIFwiL2IyYXBpL3YyL2IyX2dldF91cGxvYWRfdXJsP2J1Y2tldElkPVwiICsgYnVja2V0SWQsIHVuZGVmaW5lZCwgXCJHRVRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYXV0aC5hdXRob3JpemF0aW9uVG9rZW4sXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGdldFVwbG9hZFVybFJhdy50b1N0cmluZygpKSBhcyB7XG4gICAgICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICAgICAgdXBsb2FkVXJsOiBzdHJpbmc7XG4gICAgICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIHVwbG9hZEZpbGUoY29uZmlnOiB7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGRhdGE6IEJ1ZmZlcjtcbiAgICB9KSB7XG4gICAgICAgIGxldCBnZXRVcGxvYWRVcmwgPSBhd2FpdCBnZXRVcGxvYWRVUkwoY29uZmlnLmJ1Y2tldElkKTtcblxuICAgICAgICBhd2FpdCBodHRwc1JlcXVlc3QoZ2V0VXBsb2FkVXJsLnVwbG9hZFVybCwgY29uZmlnLmRhdGEsIFwiUE9TVFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBnZXRVcGxvYWRVcmwuYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgIFwiWC1Cei1GaWxlLU5hbWVcIjogZW5jb2RlUGF0aChjb25maWcuZmlsZU5hbWUpLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYjIveC1hdXRvXCIsXG4gICAgICAgICAgICAgICAgXCJYLUJ6LUNvbnRlbnQtU2hhMVwiOiBcImRvX25vdF92ZXJpZnlcIixcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtTGVuZ3RoXCI6IGNvbmZpZy5kYXRhLmxlbmd0aCArIFwiXCIsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGhpZGVGaWxlID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgfSwge30+KFwiYjJfaGlkZV9maWxlXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgY29uc3QgZ2V0RmlsZUluZm8gPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICB9LCB7XG4gICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgY29udGVudExlbmd0aDogbnVtYmVyO1xuICAgICAgICBjb250ZW50U2hhMTogc3RyaW5nO1xuICAgICAgICBjb250ZW50VHlwZTogc3RyaW5nO1xuICAgICAgICBmaWxlSW5mbzoge1xuICAgICAgICAgICAgc3JjX2xhc3RfbW9kaWZpZWRfbWlsbGlzOiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgICAgIGFjdGlvbjogc3RyaW5nO1xuICAgICAgICB1cGxvYWRUaW1lc3RhbXA6IG51bWJlcjtcbiAgICB9PihcImIyX2dldF9maWxlX2luZm9cIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBsaXN0RmlsZU5hbWVzID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIHByZWZpeDogc3RyaW5nO1xuICAgICAgICBzdGFydEZpbGVOYW1lPzogc3RyaW5nO1xuICAgICAgICBtYXhGaWxlQ291bnQ/OiBudW1iZXI7XG4gICAgICAgIGRlbGltaXRlcj86IHN0cmluZztcbiAgICB9LCB7XG4gICAgICAgIGZpbGVzOiB7XG4gICAgICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiBudW1iZXI7XG4gICAgICAgICAgICBjb250ZW50U2hhMTogc3RyaW5nO1xuICAgICAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgICAgIGZpbGVJbmZvOiB7XG4gICAgICAgICAgICAgICAgc3JjX2xhc3RfbW9kaWZpZWRfbWlsbGlzOiBudW1iZXI7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYWN0aW9uOiBzdHJpbmc7XG4gICAgICAgICAgICB1cGxvYWRUaW1lc3RhbXA6IG51bWJlcjtcbiAgICAgICAgfVtdO1xuICAgICAgICBuZXh0RmlsZU5hbWU6IHN0cmluZztcbiAgICB9PihcImIyX2xpc3RfZmlsZV9uYW1lc1wiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGNvcHlGaWxlID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIHNvdXJjZUZpbGVJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldElkOiBzdHJpbmc7XG4gICAgfSwge30+KFwiYjJfY29weV9maWxlXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgY29uc3Qgc3RhcnRMYXJnZUZpbGUgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgZmlsZUluZm86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gICAgfSwge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgIGZpbGVJbmZvOiBhbnk7XG4gICAgICAgIHVwbG9hZFRpbWVzdGFtcDogbnVtYmVyO1xuICAgIH0+KFwiYjJfc3RhcnRfbGFyZ2VfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIC8vIEFwcGFyZW50bHkgd2UgY2FuJ3QgcmV1c2UgdGhlc2U/XG4gICAgY29uc3QgZ2V0VXBsb2FkUGFydFVSTCA9IChhc3luYyAoZmlsZUlkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IHVwbG9hZFBhcnRSYXcgPSBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9iMmFwaS92Mi9iMl9nZXRfdXBsb2FkX3BhcnRfdXJsP2ZpbGVJZD1cIiArIGZpbGVJZCwgdW5kZWZpbmVkLCBcIkdFVFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBhdXRoLmF1dGhvcml6YXRpb25Ub2tlbixcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHVwbG9hZFBhcnRSYXcudG9TdHJpbmcoKSkgYXMge1xuICAgICAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgICAgICBwYXJ0TnVtYmVyOiBudW1iZXI7XG4gICAgICAgICAgICB1cGxvYWRVcmw6IHN0cmluZztcbiAgICAgICAgICAgIGF1dGhvcml6YXRpb25Ub2tlbjogc3RyaW5nO1xuICAgICAgICB9O1xuICAgIH0pO1xuICAgIGFzeW5jIGZ1bmN0aW9uIHVwbG9hZFBhcnQoY29uZmlnOiB7XG4gICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICBwYXJ0TnVtYmVyOiBudW1iZXI7XG4gICAgICAgIGRhdGE6IEJ1ZmZlcjtcbiAgICAgICAgc2hhMTogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIHBhcnROdW1iZXI6IG51bWJlcjtcbiAgICAgICAgY29udGVudExlbmd0aDogbnVtYmVyO1xuICAgICAgICBjb250ZW50U2hhMTogc3RyaW5nO1xuICAgIH0+IHtcbiAgICAgICAgbGV0IHVwbG9hZFBhcnQgPSBhd2FpdCBnZXRVcGxvYWRQYXJ0VVJMKGNvbmZpZy5maWxlSWQpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QodXBsb2FkUGFydC51cGxvYWRVcmwsIGNvbmZpZy5kYXRhLCBcIlBPU1RcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogdXBsb2FkUGFydC5hdXRob3JpemF0aW9uVG9rZW4sXG4gICAgICAgICAgICAgICAgXCJYLUJ6LVBhcnQtTnVtYmVyXCI6IGNvbmZpZy5wYXJ0TnVtYmVyICsgXCJcIixcbiAgICAgICAgICAgICAgICBcIlgtQnotQ29udGVudC1TaGExXCI6IGNvbmZpZy5zaGExLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1MZW5ndGhcIjogY29uZmlnLmRhdGEubGVuZ3RoICsgXCJcIixcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0LnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmlzaExhcmdlRmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgcGFydFNoYTFBcnJheTogc3RyaW5nW107XG4gICAgfSwge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRMZW5ndGg6IG51bWJlcjtcbiAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgZmlsZUluZm86IGFueTtcbiAgICAgICAgdXBsb2FkVGltZXN0YW1wOiBudW1iZXI7XG4gICAgfT4oXCJiMl9maW5pc2hfbGFyZ2VfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGNhbmNlbExhcmdlRmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICB9LCB7fT4oXCJiMl9jYW5jZWxfbGFyZ2VfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGdldERvd25sb2FkQXV0aG9yaXphdGlvbiA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZVByZWZpeDogc3RyaW5nO1xuICAgICAgICB2YWxpZER1cmF0aW9uSW5TZWNvbmRzOiBudW1iZXI7XG4gICAgICAgIGIyQ29udGVudERpc3Bvc2l0aW9uPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRMYW5ndWFnZT86IHN0cmluZztcbiAgICAgICAgYjJFeHBpcmVzPzogc3RyaW5nO1xuICAgICAgICBiMkNhY2hlQ29udHJvbD86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50RW5jb2Rpbmc/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudFR5cGU/OiBzdHJpbmc7XG4gICAgfSwge1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZVByZWZpeDogc3RyaW5nO1xuICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICB9PihcImIyX2dldF9kb3dubG9hZF9hdXRob3JpemF0aW9uXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZ2V0RG93bmxvYWRVUkwocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcGF0aCA9IFwiL1wiICsgcGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXV0aC5kb3dubG9hZFVybCArIHBhdGg7XG4gICAgfVxuXG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjcmVhdGVCdWNrZXQsXG4gICAgICAgIHVwZGF0ZUJ1Y2tldCxcbiAgICAgICAgbGlzdEJ1Y2tldHMsXG4gICAgICAgIGRvd25sb2FkRmlsZUJ5TmFtZSxcbiAgICAgICAgaGVhZEZpbGVCeU5hbWUsXG4gICAgICAgIHVwbG9hZEZpbGUsXG4gICAgICAgIGhpZGVGaWxlLFxuICAgICAgICBnZXRGaWxlSW5mbyxcbiAgICAgICAgbGlzdEZpbGVOYW1lcyxcbiAgICAgICAgY29weUZpbGUsXG4gICAgICAgIHN0YXJ0TGFyZ2VGaWxlLFxuICAgICAgICB1cGxvYWRQYXJ0LFxuICAgICAgICBmaW5pc2hMYXJnZUZpbGUsXG4gICAgICAgIGNhbmNlbExhcmdlRmlsZSxcbiAgICAgICAgZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uLFxuICAgICAgICBnZXREb3dubG9hZFVSTCxcbiAgICAgICAgYXBpVXJsOiBhdXRoLmFwaVVybCxcbiAgICAgICAgYWxsb3dlZDogYXV0aC5hbGxvd2VkLFxuICAgIH07XG59KTtcblxudHlwZSBCMkFwaSA9ICh0eXBlb2YgZ2V0QVBJKSBleHRlbmRzICgpID0+IFByb21pc2U8aW5mZXIgVD4gPyBUIDogbmV2ZXI7XG5cblxuZXhwb3J0IGNsYXNzIEFyY2hpdmVzQmFja2JsYXplIGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IHtcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBwdWJsaWM/OiBib29sZWFuO1xuICAgICAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgICAgICBjYWNoZVRpbWU/OiBudW1iZXI7XG4gICAgICAgIGFsbG93ZWRPcmlnaW5zPzogc3RyaW5nW107XG4gICAgfSkge1xuICAgICAgICAvLyBHZXQgdGhlIGFwaSwgdG8gc2V0dXAgY29yc1xuICAgICAgICB2b2lkIHRoaXMuZ2V0QnVja2V0QVBJKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWNrZXROYW1lID0gdGhpcy5jb25maWcuYnVja2V0TmFtZS5yZXBsYWNlQWxsKC9bXlxcd1xcZF0vZywgXCItXCIpO1xuICAgIHByaXZhdGUgYnVja2V0SWQgPSBcIlwiO1xuXG4gICAgcHJpdmF0ZSBsb2dnaW5nID0gZmFsc2U7XG4gICAgcHVibGljIGVuYWJsZUxvZ2dpbmcoKSB7XG4gICAgICAgIHRoaXMubG9nZ2luZyA9IHRydWU7XG4gICAgfVxuICAgIHByaXZhdGUgbG9nKHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMubG9nZ2luZykgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gXCJiYWNrYmxhemUgXCIgKyB0aGlzLmNvbmZpZy5idWNrZXROYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QnVja2V0QVBJID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBhcGkgPSBhd2FpdCBnZXRBUEkoKTtcblxuICAgICAgICBsZXQgY2FjaGVUaW1lID0gdGhpcy5jb25maWcuY2FjaGVUaW1lID8/IDA7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pbW11dGFibGUpIHtcbiAgICAgICAgICAgIGNhY2hlVGltZSA9IElNTVVUQUJMRV9DQUNIRV9USU1FO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQUxXQVlTIHNldCBhY2Nlc3MgY29udHJvbCwgYXMgd2UgY2FuIG1ha2UgdXJscyBmb3IgcHJpdmF0ZSBidWNrZXRzIHdpdGggZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uXG4gICAgICAgIGxldCBkZXNpcmVkQ29yc1J1bGVzID0gW3tcbiAgICAgICAgICAgIGNvcnNSdWxlTmFtZTogXCJhbGxvd0FsbFwiLFxuICAgICAgICAgICAgYWxsb3dlZE9yaWdpbnM6IHRoaXMuY29uZmlnLmFsbG93ZWRPcmlnaW5zID8/IFtcImh0dHBzXCJdLFxuICAgICAgICAgICAgYWxsb3dlZE9wZXJhdGlvbnM6IFtcImIyX2Rvd25sb2FkX2ZpbGVfYnlfaWRcIiwgXCJiMl9kb3dubG9hZF9maWxlX2J5X25hbWVcIl0sXG4gICAgICAgICAgICBhbGxvd2VkSGVhZGVyczogW1wicmFuZ2VcIl0sXG4gICAgICAgICAgICBleHBvc2VIZWFkZXJzOiBbXCJ4LWJ6LWNvbnRlbnQtc2hhMVwiXSxcbiAgICAgICAgICAgIC8vIDYwIGlzIHRoZSBhYnNvbHV0ZSBtaW5pbXVtLiBJZiB3ZSB0cnkgdG8gc2V0IGEgdmFsdWUgbG93ZXIgdGhhbiB0aGlzLCBpdCdsbCBiZSB1cGRhdGVkIHRvIGJlIDYwLiBcbiAgICAgICAgICAgIG1heEFnZVNlY29uZHM6IE1hdGgubWF4KDYwLCBjYWNoZVRpbWUgLyAxMDAwKSxcbiAgICAgICAgfV07XG4gICAgICAgIGxldCBidWNrZXRJbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICBpZiAoY2FjaGVUaW1lKSB7XG4gICAgICAgICAgICBidWNrZXRJbmZvW1wiY2FjaGUtY29udHJvbFwiXSA9IGBtYXgtYWdlPSR7Y2FjaGVUaW1lIC8gMTAwMH1gO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgZXhpc3RzID0gZmFsc2U7XG4gICAgICAgIGxldCByZXRyaWVzID0gMDtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLmNyZWF0ZUJ1Y2tldCh7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0VHlwZTogdGhpcy5jb25maWcucHVibGljID8gXCJhbGxQdWJsaWNcIiA6IFwiYWxsUHJpdmF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGVSdWxlczogW3tcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF5c0Zyb21VcGxvYWRpbmdUb0hpZGluZ1wiOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2VlcCBmaWxlcyBmb3IgNyBkYXlzLCB3aGljaCBzaG91bGQgYmUgZW5vdWdoIHRpbWUgdG8gcmVjb3ZlciBhY2NpZGVudGFsIGhpZGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF5c0Zyb21IaWRpbmdUb0RlbGV0aW5nXCI6IDcsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZpbGVOYW1lUHJlZml4XCI6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICAgICAgICAgIGNvcnNSdWxlczogZGVzaXJlZENvcnNSdWxlcyxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SW5mb1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlLnN0YWNrLmluY2x1ZGVzKGBcImR1cGxpY2F0ZV9idWNrZXRfbmFtZVwiYCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJpZXMgPCAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBCYWNrYmxhemUgY3JlYXRlIGJ1Y2tldCBmYWlsZWQsIHJldHJ5aW5nIGluIDVzOiAke2Uuc3RhY2t9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheSg1MDAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV4aXN0cyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBidWNrZXRMaXN0ID0gYXdhaXQgYXBpLmxpc3RCdWNrZXRzKHtcbiAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChidWNrZXRMaXN0LmJ1Y2tldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCBuYW1lIFwiJHt0aGlzLmJ1Y2tldE5hbWV9XCIgaXMgYmVpbmcgdXNlZCBieSBzb21lb25lIGVsc2UuIEJ1Y2tldCBuYW1lcyBoYXZlIHRvIGJlIGdsb2JhbGx5IHVuaXF1ZS4gVHJ5IGEgZGlmZmVyZW50IG5hbWUgdW50aWwgeW91IGZpbmQgYSBmcmVlIG9uZS5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1Y2tldElkID0gYnVja2V0TGlzdC5idWNrZXRzWzBdLmJ1Y2tldElkO1xuXG4gICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICAgIGxldCBidWNrZXQgPSBidWNrZXRMaXN0LmJ1Y2tldHNbMF07XG4gICAgICAgICAgICBmdW5jdGlvbiBub3JtYWxpemUob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgICAgICAgICAgICAgIGxldCBrdnBzID0gT2JqZWN0LmVudHJpZXMob2JqKTtcbiAgICAgICAgICAgICAgICBzb3J0KGt2cHMsIHggPT4geFswXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhrdnBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIG9yZGVySW5kZXBlbmRlbnRFcXVhbChsaHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByaHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZShsaHMpKSA9PT0gSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplKHJocykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gb3JkZXJJbmRlcGVuZGVudEVxdWFsQXJyYXkobGhzOiB1bmtub3duW10sIHJoczogdW5rbm93bltdKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxocy5sZW5ndGggIT09IHJocy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxocy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVySW5kZXBlbmRlbnRFcXVhbChsaHNbaV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHJoc1tpXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIW9yZGVySW5kZXBlbmRlbnRFcXVhbEFycmF5KGJ1Y2tldC5jb3JzUnVsZXMsIGRlc2lyZWRDb3JzUnVsZXMpXG4gICAgICAgICAgICAgICAgfHwgIW9yZGVySW5kZXBlbmRlbnRFcXVhbChidWNrZXQuYnVja2V0SW5mbywgYnVja2V0SW5mbylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG1hZ2VudGEoYFVwZGF0aW5nIENPUlMgcnVsZXMgZm9yICR7dGhpcy5idWNrZXROYW1lfWApLCBidWNrZXQuY29yc1J1bGVzLCBkZXNpcmVkQ29yc1J1bGVzKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBhcGkudXBkYXRlQnVja2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudElkOiBidWNrZXQuYWNjb3VudElkLFxuICAgICAgICAgICAgICAgICAgICBidWNrZXRJZDogYnVja2V0LmJ1Y2tldElkLFxuICAgICAgICAgICAgICAgICAgICBidWNrZXRUeXBlOiBidWNrZXQuYnVja2V0VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGJ1Y2tldC5saWZlY3ljbGVSdWxlcyxcbiAgICAgICAgICAgICAgICAgICAgY29yc1J1bGVzOiBkZXNpcmVkQ29yc1J1bGVzLFxuICAgICAgICAgICAgICAgICAgICBidWNrZXRJbmZvOiBidWNrZXRJbmZvLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgfSk7XG5cbiAgICBwcml2YXRlIGN1cnJlbnRSZXNldDogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcblxuICAgIC8vIEtlZXAgdHJhY2sgb2Ygd2hlbiB3ZSBsYXN0IHJlc2V0IGJlY2F1c2Ugb2YgYSA1MDNcbiAgICBwcml2YXRlIGxhc3Q1MDNSZXNldCA9IDA7XG4gICAgLy8gSU1QT1JUQU5UISBXZSBtdXN0IGFsd2F5cyBDQVRDSCBBUk9VTkQgdGhlIGFwaVJldHJ5TG9naWMsIE5FVkVSIGluc2lkZSBvZiBmbmMuIE90aGVyd2lzZSB3ZSB3b24ndCBiZSBhYmxlIHRvIHJlY3JlYXRlIHRoZSBhdXRoIHRva2VuLiBgY29udGV4dGAgaXMgYSBzaG9ydCBsYWJlbCAodmVyYiArIGZpbGUgcGF0aCkgaW5jbHVkZWQgaW4gZXZlcnkgcmV0cnkvZXJyb3IgbG9nIHNvIGEgc3R1Y2sgc2lsZW50LXJldHJ5IGxvb3AgaXMgaWRlbnRpZmlhYmxlIGZyb20gdGhlIGxvZ3MuXG4gICAgcHJpdmF0ZSBhc3luYyBhcGlSZXRyeUxvZ2ljPFQ+KFxuICAgICAgICBjb250ZXh0OiBzdHJpbmcsXG4gICAgICAgIGZuYzogKGFwaTogQjJBcGkpID0+IFByb21pc2U8VD4sXG4gICAgICAgIHJldHJpZXMgPSAzXG4gICAgKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCBhcGk6IEIyQXBpIHwgdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXBpID0gYXdhaXQgdGhpcy5nZXRCdWNrZXRBUEkoKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbmMoYXBpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChyZXRyaWVzIDw9IDApIHRocm93IGVycjtcblxuICAgICAgICAgICAgLy8gSWYgaXQncyBhIDUwMyBhbmQgaXQncyBiZWVuIGEgbWludXRlIHNpbmNlIHdlIGxhc3QgcmVzZXQsIHRoZW4gV2FpdCBhbmQgcmVzZXQuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKGVyci5zdGFjay5pbmNsdWRlcyhgXCJzdGF0dXNcIjogNTAzYClcbiAgICAgICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBcInNlcnZpY2VfdW5hdmFpbGFibGVcImApXG4gICAgICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgXCJpbnRlcm5hbF9lcnJvclwiYClcbiAgICAgICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBFTk9CVUZTYClcbiAgICAgICAgICAgICAgICApICYmIERhdGUubm93KCkgLSB0aGlzLmxhc3Q1MDNSZXNldCA+IDYwICogMTAwMCkge1xuICAgICAgICAgICAgICAgIC8vIEJhY2tibGF6ZSBpcyBzbyBmbGFreSB0aGF0IHdlJ3JlIGp1c3QgZ29pbmcgdG8gd2FybiBoZXJlLlxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgWyR7Y29udGV4dH1dIEJhY2tibGF6ZSBlcnJvciwgd2FpdGluZyBhbmQgcmVzZXR0aW5nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBbJHtjb250ZXh0fV0gQmFja2JsYXplIGVycm9yLCB3YWl0aW5nIGFuZCByZXNldHRpbmc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UmVzZXQgPSB0aGlzLmN1cnJlbnRSZXNldCB8fCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheSgxMCAqIDEwMDApO1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBjaGVjayBhZ2FpbiBpbiBjYXNlLCBhbmQgaW4gdGhlIHZlcnkgbGlrZWx5IGNhc2UgdGhhdCB0aGlzIGlzIGJlaW5nIHJ1biBpbiBwYXJhbGxlbCwgd2Ugb25seSB3YW50IHRvIHJlc2V0IG9uY2UuXG4gICAgICAgICAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5sYXN0NTAzUmVzZXQgPiA2MCAqIDEwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKGBbJHtjb250ZXh0fV0gUmVzZXR0aW5nIGdldEFQSSBhbmQgZ2V0QnVja2V0QVBJOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0NTAzUmVzZXQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QVBJLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEJ1Y2tldEFQSS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkoKS5maW5hbGx5KCgpID0+IHRoaXMuY3VycmVudFJlc2V0ID0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmN1cnJlbnRSZXNldDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlSZXRyeUxvZ2ljKGNvbnRleHQsIGZuYywgcmV0cmllcyAtIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGUgZXJyb3IgaXMgdGhhdCB0aGUgYXV0aG9yaXphdGlvbiB0b2tlbiBpcyBpbnZhbGlkLCByZXNldCBnZXRCdWNrZXRBUEkgYW5kIGdldEFQSSBJZiB0aGUgZXJyb3IgaXMgdGhhdCB0aGUgYnVja2V0IGlzbid0IGZvdW5kLCByZXNldCBnZXRCdWNrZXRBUElcbiAgICAgICAgICAgIGlmIChlcnIuc3RhY2suaW5jbHVkZXMoYFwiZXhwaXJlZF9hdXRoX3Rva2VuXCJgKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBbJHtjb250ZXh0fV0gQXV0aG9yaXphdGlvbiB0b2tlbiBleHBpcmVkYCk7XG4gICAgICAgICAgICAgICAgZ2V0QVBJLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRCdWNrZXRBUEkucmVzZXQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlSZXRyeUxvZ2ljKGNvbnRleHQsIGZuYywgcmV0cmllcyAtIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXJyLnN0YWNrLmluY2x1ZGVzKGBubyB0b21lcyBhdmFpbGFibGVgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRVRJTUVET1VUYClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYHNvY2tldCBoYW5nIHVwYClcbiAgICAgICAgICAgICAgICAvLyBFaC4uLiB0aGlzIG1pZ2h0IGJlIGJhZCwgYnV0Li4uIEkgdGhpbmsgd2UganVzdCBnZXQgcmFuZG9tIDQwMCBlcnJvcnMuIElmIHRoaXMgc3BhbXMgZXJyb3JzLCB3ZSBjYW4gcmVtb3ZlIHRoaXMgbGluZS5cbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYDQwMCBCYWQgUmVxdWVzdGApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBnZXRhZGRyaW5mbyBFTk9URk9VTkRgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRUNPTk5SRVNFVGApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBFQ09OTlJFRlVTRURgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRU5PQlVGU2ApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFske2NvbnRleHR9XSBSZXRyeWluZyBpbiA1czogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgWyR7Y29udGV4dH1dICR7ZXJyLm1lc3NhZ2V9IHJldHJ5aW5nIGluIDVzYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoNTAwMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpUmV0cnlMb2dpYyhjb250ZXh0LCBmbmMsIHJldHJpZXMgLSAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVyci5zdGFjay5pbmNsdWRlcyhgZ2V0YWRkcmluZm8gRU5PVEZPVU5EYCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXBpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmxPYmogPSBuZXcgVVJMKGFwaS5hcGlVcmwpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdG5hbWUgPSB1cmxPYmouaG9zdG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsb29rdXBBZGRyZXNzZXMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRucy5sb29rdXAoaG9zdG5hbWUsIChlcnIsIGFkZHJlc3NlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYWRkcmVzc2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc29sdmVBZGRyZXNzZXMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRucy5yZXNvbHZlNChob3N0bmFtZSwgKGVyciwgYWRkcmVzc2VzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhZGRyZXNzZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbJHtjb250ZXh0fV0gZ2V0YWRkcmluZm8gRU5PVEZPVU5EICR7aG9zdG5hbWV9YCwgeyBsb29rdXBBZGRyZXNzZXMsIHJlc29sdmVBZGRyZXNzZXMsIGFwaVVybDogYXBpLmFwaVVybCwgZnVsbEVycm9yOiBlcnIuc3RhY2sgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0LmRhdGEgfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0MihmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGRvd25sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGNvbnN0IGRvd25sb2FkUG9sbCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWRvd25sb2FkaW5nKSByZXR1cm47XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coYEJhY2tibGF6ZSBkb3dubG9hZCBpbiBwcm9ncmVzcyAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZG93bmxvYWRQb2xsLCA1MDAwKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGRvd25sb2FkUG9sbCwgNTAwMCk7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBnZXQgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9PiA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlID0gY29uZmlnPy5yYW5nZTtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNsYW1wIG5lZWRzIHRoZSBmaWxlJ3Mgc2l6ZSAoYW5kIGdpdmVzIHVzIGl0cyBtZXRhZGF0YSBmb3IgZnJlZSlcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVJbmZvID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlSW5mbykgdGhyb3cgbmV3IEVycm9yKGBGaWxlICR7ZmlsZU5hbWV9IG5vdCBmb3VuZGApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2VTdGFydCA9IHJhbmdlLnN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2VFbmQgPSBNYXRoLm1pbihyYW5nZS5lbmQsIGZpbGVJbmZvLnNpemUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBJIHRoaW5rIGlmIHdlIHJlcXVlc3Qgbm90aGluZywgaXQgY29uZnVzZXMgQmFja2JsYXplIGFuZCBlbmRzIHVwIGdpdmluZyB1cyB0aGUgZW50aXJlIGZpbGUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZUVuZCA8PSByYW5nZVN0YXJ0KSByZXR1cm4geyBkYXRhOiBCdWZmZXIuYWxsb2MoMCksIHdyaXRlVGltZTogZmlsZUluZm8ud3JpdGVUaW1lLCBzaXplOiBmaWxlSW5mby5zaXplIH07XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgYXBpLmRvd25sb2FkRmlsZUJ5TmFtZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlOiB7IHN0YXJ0OiByYW5nZVN0YXJ0LCBlbmQ6IHJhbmdlRW5kIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggIT09IHJhbmdlRW5kIC0gcmFuZ2VTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQmFja2JsYXplIHJhbmdlIGRvd25sb2FkIHJldHVybmVkIHRoZSB3cm9uZyBudW1iZXIgb2YgYnl0ZXMuIFRyaWVkIHRvIGdldCAke3JhbmdlU3RhcnR9LSR7cmFuZ2VFbmR9LCBidXQgcmVjZWl2ZWQgJHtyYW5nZVN0YXJ0fS0ke3JhbmdlU3RhcnQgKyBkYXRhLmxlbmd0aH0uIEZvciBmaWxlOiAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGEsIHdyaXRlVGltZTogZmlsZUluZm8ud3JpdGVUaW1lLCBzaXplOiBmaWxlSW5mby5zaXplIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRoZSBkb3dubG9hZCdzIG93biByZXNwb25zZSBoZWFkZXJzIGNhcnJ5IHRoZSBtZXRhZGF0YSwgc28gYSBmdWxsIHJlYWQgaXMgYSBzaW5nbGUgQVBJIGNhbGxcbiAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U6IEh0dHBzUmVzcG9uc2VJbmZvID0geyBoZWFkZXJzOiB7fSB9O1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgYXBpLmRvd25sb2FkRmlsZUJ5TmFtZSh7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG91dFJlc3BvbnNlOiByZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsZXQgbWV0YSA9IHBhcnNlRmlsZU1ldGFkYXRhSGVhZGVycyhyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgd3JpdGVUaW1lOiBtZXRhLnVwbG9hZFRpbWVzdGFtcCwgc2l6ZTogZGF0YS5sZW5ndGggfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IHRpbWVTdHIgPSBmb3JtYXRUaW1lKERhdGUubm93KCkgLSB0aW1lKTtcbiAgICAgICAgICAgIGxldCByYXRlU3RyID0gZm9ybWF0TnVtYmVyKHJlc3VsdC5kYXRhLmxlbmd0aCAvIChEYXRlLm5vdygpIC0gdGltZSkgKiAxMDAwKSArIFwiQi9zXCI7XG4gICAgICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIGRvd25sb2FkICgke2Zvcm1hdE51bWJlcihyZXN1bHQuZGF0YS5sZW5ndGgpfUIke2NvbmZpZz8ucmFuZ2UgJiYgYCwgJHtmb3JtYXROdW1iZXIoY29uZmlnLnJhbmdlLnN0YXJ0KX0gLSAke2Zvcm1hdE51bWJlcihjb25maWcucmFuZ2UuZW5kKX1gIHx8IFwiXCJ9KSBpbiAke3RpbWVTdHJ9ICgke3JhdGVTdHJ9LCAke2ZpbGVOYW1lfSlgKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgZmlsZSBkb2VzIG5vdCBleGlzdCAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGRvd25sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGFwaSA9IGF3YWl0IGdldEFQSSgpO1xuICAgICAgICAgICAgLy8gQjIgdjIgZG9jdW1lbnRzIGFsbG93ZWQgYXMgYSBzaW5nbGUgb2JqZWN0OyBvdXIgdHlwZSBzYXlzIGEgbGlzdCAtIGhhbmRsZSBib3RoXG4gICAgICAgICAgICBsZXQgYWxsb3dlZFJhdyA9IGFwaS5hbGxvd2VkIGFzIHVua25vd247XG4gICAgICAgICAgICBsZXQgYWxsb3dlZExpc3QgPSAoQXJyYXkuaXNBcnJheShhbGxvd2VkUmF3KSAmJiBhbGxvd2VkUmF3IHx8IFthbGxvd2VkUmF3XSkgYXMgdHlwZW9mIGFwaS5hbGxvd2VkO1xuICAgICAgICAgICAgcmV0dXJuIGFsbG93ZWRMaXN0LnNvbWUoYWxsb3dlZCA9PlxuICAgICAgICAgICAgICAgIGFsbG93ZWQuY2FwYWJpbGl0aWVzLmluY2x1ZGVzKFwid3JpdGVGaWxlc1wiKVxuICAgICAgICAgICAgICAgICYmICghYWxsb3dlZC5idWNrZXROYW1lIHx8IGFsbG93ZWQuYnVja2V0TmFtZSA9PT0gdGhpcy5idWNrZXROYW1lKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gTm8gLyBpbnZhbGlkIGNyZWRlbnRpYWxzXG4gICAgICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIGhhc1dyaXRlQWNjZXNzIGNoZWNrIGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGZpbGVOYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogU2V0Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKGNvbmZpZz8uZm9yY2VTZXRJbW11dGFibGUgJiYgIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZm9yY2VTZXRJbW11dGFibGUgcmVxdWlyZXMgbGFzdE1vZGlmaWVkIChzeW5jaHJvbml6YXRpb24gd3JpdGVzIGFyZSBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCB3cml0aW5nICR7ZmlsZU5hbWV9IHRvICR7dGhpcy5nZXREZWJ1Z05hbWUoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnPy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgaWYgKCFjb25maWcubm9DaGVja3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIC8vIEFuIG9sZGVyIHdyaXRlIG5ldmVyIG92ZXJ3cml0ZXMgYSBuZXdlciBvbmUgKHNlZSBJQXJjaGl2ZXMuc2V0KS4gQjIgc3RhbXBzIGl0cyBvd24gdXBsb2FkIHRpbWUsIHNvIHRoZSBleGFjdCBsYXN0TW9kaWZpZWQgaXMgbm90IHByZXNlcnZlZCBvbiB0aGUgc3RvcmVkIGZpbGUuXG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nICYmIGNvbmZpZy5sYXN0TW9kaWZpZWQgPCBleGlzdGluZy53cml0ZVRpbWUpIHJldHVybiBmaWxlTmFtZTtcbiAgICAgICAgICAgICAgICAvLyBJbW11dGFiaWxpdHkgd2luczogYSBzeW5jaHJvbml6YXRpb24gcHVzaCBuZXZlciBvdmVyd3JpdGVzIGFuIGV4aXN0aW5nIHBhdGggb24gYW4gaW1tdXRhYmxlIGJ1Y2tldCAoc2VlIFNldENvbmZpZy5mb3JjZVNldEltbXV0YWJsZSlcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgY29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlICYmIHRoaXMuY29uZmlnLmltbXV0YWJsZSkgcmV0dXJuIGZpbGVOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgdXBsb2FkICgke2Zvcm1hdE51bWJlcihkYXRhLmxlbmd0aCl9QikgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgbGV0IGYgPSBmaWxlTmFtZTtcbiAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGB1cGxvYWRGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgYXBpLnVwbG9hZEZpbGUoeyBidWNrZXRJZDogdGhpcy5idWNrZXRJZCwgZmlsZU5hbWUsIGRhdGE6IGRhdGEsIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFjb25maWc/Lm5vQ2hlY2tzKSB7XG4gICAgICAgICAgICBsZXQgZXhpc3RzQ2hlY2tzID0gMzA7XG4gICAgICAgICAgICB3aGlsZSAoZXhpc3RzQ2hlY2tzID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdHMgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdHMpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KDEwMDApO1xuICAgICAgICAgICAgICAgIGV4aXN0c0NoZWNrcy0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4aXN0c0NoZWNrcyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdHMgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmlsZSAke2ZpbGVOYW1lfS8ke2Z9IHdhcyB1cGxvYWRlZCwgYnV0IGNvdWxkIG5vdCBiZSBmb3VuZCBhZnRlcndhcmRzLiBIb3BlZnVsbHkgaXQgd2FzIGp1c3QgZGVsZXRlZCwgdmVyeSBxdWlja2x5PyBJZiBiYWNrYmxhemUgaXMgdGFraW5nIHRvbyBsb25nIGZvciBmaWxlcyB0byBwcm9wYWdhdGUsIHRoZW4gd2UgbWlnaHQgcnVuIGludG8gaXNzdWVzIHdpdGggdGhlIGRhdGFiYXNlIGF0b21pY2l0eS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsZU5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBkZWwoZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIGRlbGV0ZSAke2ZpbGVOYW1lfWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBoaWRlRmlsZSAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBhcGkuaGlkZUZpbGUoeyBidWNrZXRJZDogdGhpcy5idWNrZXRJZCwgZmlsZU5hbWU6IGZpbGVOYW1lIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSBlcnJvciBpbiBoaWRlLCBwb3NzaWJseSBhbHJlYWR5IGhpZGRlbiAke2ZpbGVOYW1lfVxcbiR7ZS5zdGFja31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5PVEU6IERlbGV0aW9uIFNFRU1TIHRvIHdvcmsuIFRoaXMgRE9FUyBicmVhayBpZiB3ZSBkZWxldGUgYSBmaWxlIHdoaWNoIGtlZXBzIGJlaW5nIHJlY3JlYXRlZCwgZXgsIHRoZSBoZWFydGJlYXQuIGxldCBleGlzdHNDaGVja3MgPSAxMDsgd2hpbGUgKGV4aXN0c0NoZWNrcyA+IDApIHsgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7IGlmICghZXhpc3RzKSBicmVhazsgYXdhaXQgZGVsYXkoMTAwMCk7IGV4aXN0c0NoZWNrcy0tOyB9IGlmIChleGlzdHNDaGVja3MgPT09IDApIHsgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7IGRldkRlYnVnYnJlYWsoKTsgY29uc29sZS53YXJuKGBGaWxlICR7ZmlsZU5hbWV9IHdhcyBkZWxldGVkLCBidXQgd2FzIHN0aWxsIGZvdW5kIGFmdGVyd2FyZHNgKTsgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTsgfVxuICAgIH1cblxuICAgIC8vIGxhc3RNb2RpZmllZCBpcyBhY2NlcHRlZCBidXQgY2Fubm90IGJlIGhvbm9yZWQgLSBiMiBzdGFtcHMgaXRzIG93biB1cGxvYWRUaW1lc3RhbXAsIHdoaWNoIGlzIHdoYXQgb3VyIGdldEluZm8vZmluZEluZm8gcmVwb3J0IGFzIHRoZSB3cml0ZSB0aW1lXG4gICAgcHVibGljIGFzeW5jIHNldExhcmdlRmlsZShjb25maWc6IHsgcGF0aDogc3RyaW5nOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPjsgfSk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgICAgIGxldCBvbkVycm9yOiAoKCkgPT4gUHJvbWlzZTx2b2lkPilbXSA9IFtdO1xuICAgICAgICBsZXQgdGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgeyBwYXRoIH0gPSBjb25maWc7XG4gICAgICAgICAgICAvLyBCYWNrYmxhemUgcmVxdWlyZXMgNU1CIGNodW5rcy4gQnV0LCBsYXJnZXIgaXMgbW9yZSBlZmZpY2llbnQgZm9yIHVzLlxuICAgICAgICAgICAgY29uc3QgTUlOX0NIVU5LX1NJWkUgPSAzMiAqIDEwMjQgKiAxMDI0O1xuICAgICAgICAgICAgbGV0IGRhdGFRdWV1ZTogQnVmZmVyW10gPSBbXTtcbiAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFRdWV1ZS5sZW5ndGgpIHJldHVybiBkYXRhUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAvLyBHZXQgYnVmZmVycyB1bnRpbCB3ZSBnZXQgNU1CLCBPUiwgZW5kLiBCYWNrYmxhemUgcmVxdWlyZXMgdGhpcyBmb3IgbGFyZ2UgZmlsZXMuXG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBidWZmZXJzOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0b3RhbEJ5dGVzIDwgTUlOX0NIVU5LX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb25maWcuZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgdG90YWxCeXRlcyArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVycy5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlcnMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZmlsZU5hbWUgPSBwYXRoO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBnZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgaWYgKCFkYXRhPy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgIC8vIEJhY2tibGF6ZSBkaXNhbGxvd3Mgb3Zlcmx5IHNtYWxsIGZpbGVzXG4gICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPCBNSU5fQ0hVTktfU0laRSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0KGZpbGVOYW1lLCBkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBCYWNrYmxhemUgZGlzYWxsb3dzIGxlc3MgdGhhbiAyIGNodW5rc1xuICAgICAgICAgICAgbGV0IHNlY29uZERhdGEgPSBhd2FpdCBnZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgaWYgKCFzZWNvbmREYXRhPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldChmaWxlTmFtZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQUxTTywgaWYgdGhlcmUgYXJlIHR3byBjaHVua3MsIGJ1dCBvbmUgaXMgdG9vIHNtYWxsLCBjb21iaW5lIGl0LiBUaGlzIGhlbHBzIGFsbG93IHVzIG5ldmVyIHNlbmQgc21hbGwgY2h1bmtzLlxuICAgICAgICAgICAgaWYgKHNlY29uZERhdGEubGVuZ3RoIDwgTUlOX0NIVU5LX1NJWkUpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldChmaWxlTmFtZSwgQnVmZmVyLmNvbmNhdChbZGF0YSwgc2Vjb25kRGF0YV0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvZyhgVXBsb2FkaW5nIGxhcmdlIGZpbGUgJHtjb25maWcucGF0aH1gKTtcbiAgICAgICAgICAgIGRhdGFRdWV1ZS51bnNoaWZ0KGRhdGEsIHNlY29uZERhdGEpO1xuXG5cbiAgICAgICAgICAgIGxldCB1cGxvYWRJbmZvID0gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBzdGFydExhcmdlRmlsZSAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgYXBpLnN0YXJ0TGFyZ2VGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6IFwiYjIveC1hdXRvXCIsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVJbmZvOiB7fSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb25FcnJvci5wdXNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGNhbmNlbExhcmdlRmlsZSAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBpLmNhbmNlbExhcmdlRmlsZSh7IGZpbGVJZDogdXBsb2FkSW5mby5maWxlSWQgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgTE9HX0lOVEVSVkFMID0gdGltZUluTWludXRlO1xuICAgICAgICAgICAgbGV0IG5leHRMb2dUaW1lID0gRGF0ZS5ub3coKSArIExPR19JTlRFUlZBTDtcblxuICAgICAgICAgICAgbGV0IHBhcnROdW1iZXIgPSAxO1xuICAgICAgICAgICAgbGV0IHBhcnRTaGExQXJyYXk6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBhd2FpdCBnZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgICAgIGlmICghZGF0YSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgLy8gU28uLi4gaWYgdGhlIG5leHQgY2h1bmsgaXMgdGhlIGxhc3Qgb25lLCBjb21iaW5lIGl0IHdpdGggdGhlIGN1cnJlbnQgb25lLiBUaGlzIHByZXZlbnRzIEFOWSB1cGxvYWRzIGZyb20gYmVpbmcgPCB0aGUgdGhyZXNob2xkLCBhcyBhcHBhcmVudGx5IHRoZSBcImxhc3QgcGFydFwiIGNoZWNrIGluIGJhY2tibGF6ZSBmYWlscyB3aGVuIHdlIGhhdmUgdG8gcmV0cnkgYW4gdXBsb2FkIChkdWUgdG8gXCJubyB0b21lcyBhdmFpbGFibGVcIikuIFdlbGwgaXQgY2FuJ3QgZmFpbCBpZiBldmVuIHRoZSBsYXN0IHBhcnQgaXMgPiA1TUIsIG5vdyBjYW4gaXQhIEJVVCwgb25seSBpZiB0aGlzIGlzbid0IHRoZSBmaXJzdCBjaHVuaywgb3RoZXJ3aXNlIHdlIG1pZ2h0IHRyeSB0byBzZW5kIGEgc2luZ2xlIGNodW5rLCB3aGljaCB3ZSBjYW4ndCBkby5cbiAgICAgICAgICAgICAgICBpZiAocGFydFNoYTFBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXliZUxhc3REYXRhID0gYXdhaXQgZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1heWJlTGFzdERhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXliZUxhc3REYXRhLmxlbmd0aCA8IE1JTl9DSFVOS19TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQncyB0aGUgbGFzdCBvbmUsIHNvIGNvbnN1bWUgaXQgbm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEJ1ZmZlci5jb25jYXQoW2RhdGEsIG1heWJlTGFzdERhdGFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQncyBub3QgdGhlIGxhc3Qgb25lLiBQdXQgaXQgYmFjaywgaW4gY2FzZSB0aGUgb25lIEFGVEVSIGlzIHRoZSBsYXN0IG9uZSwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIG1lcmdlIG1heWJlTGFzdERhdGEgd2l0aCB0aGUgbmV4dCBuZXh0IGRhdGEuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVF1ZXVlLnVuc2hpZnQobWF5YmVMYXN0RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHNoYTEgPSByZXF1aXJlKFwiY3J5cHRvXCIpLmNyZWF0ZUhhc2goXCJzaGExXCIpO1xuICAgICAgICAgICAgICAgIHNoYTEudXBkYXRlKGRhdGEpO1xuICAgICAgICAgICAgICAgIGxldCBzaGExSGV4ID0gc2hhMS5kaWdlc3QoXCJoZXhcIik7XG4gICAgICAgICAgICAgICAgcGFydFNoYTFBcnJheS5wdXNoKHNoYTFIZXgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgdXBsb2FkUGFydCMke3BhcnROdW1iZXJ9ICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcihcIkltcG9zc2libGUsIGRhdGEgaXMgdW5kZWZpbmVkXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB0aW1lU3RyID0gZm9ybWF0VGltZShEYXRlLm5vdygpIC0gdGltZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYXRlU3RyID0gZm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMgLyAoRGF0ZS5ub3coKSAtIHRpbWUpICogMTAwMCkgKyBcIkIvc1wiO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyhgVXBsb2FkaW5nIGxhcmdlIGZpbGUgcGFydCAke3BhcnROdW1iZXJ9LCB1cGxvYWRlZCAke2JsdWUoZm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpICsgXCJCXCIpfSBpbiAke2JsdWUodGltZVN0cil9ICgke2JsdWUocmF0ZVN0cil9KS4gJHtjb25maWcucGF0aH1gKTtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxCeXRlcyArPSBkYXRhLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhcGkudXBsb2FkUGFydCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IHVwbG9hZEluZm8uZmlsZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFydE51bWJlcjogcGFydE51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGExOiBzaGExSGV4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBwYXJ0TnVtYmVyKys7XG5cbiAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IG5leHRMb2dUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRMb2dUaW1lID0gRGF0ZS5ub3coKSArIExPR19JTlRFUlZBTDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVTdHIgPSBmb3JtYXRUaW1lKERhdGUubm93KCkgLSB0aW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhdGVTdHIgPSBmb3JtYXROdW1iZXIodG90YWxCeXRlcyAvIChEYXRlLm5vdygpIC0gdGltZSkgKiAxMDAwKSArIFwiQi9zXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTdGlsbCB1cGxvYWRpbmcgbGFyZ2UgZmlsZSBhdCAke0RhdGUubm93KCl9LiBVcGxvYWRlZCAke2Zvcm1hdE51bWJlcih0b3RhbEJ5dGVzKX1CIGluICR7dGltZVN0cn0gKCR7cmF0ZVN0cn0pLiAke2NvbmZpZy5wYXRofWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9nKGBGaW5pc2hlZCB1cGxvYWRpbmcgbGFyZ2UgZmlsZSB1cGxvYWRlZCAke2dyZWVuKGZvcm1hdE51bWJlcih0b3RhbEJ5dGVzKSl9QmApO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGZpbmlzaExhcmdlRmlsZSAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBhcGkuZmluaXNoTGFyZ2VGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiB1cGxvYWRJbmZvLmZpbGVJZCxcbiAgICAgICAgICAgICAgICAgICAgcGFydFNoYTFBcnJheTogcGFydFNoYTFBcnJheSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGMgb2Ygb25FcnJvcikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGMoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGR1cmluZyBlcnJvciBjbGVhbi4gSWdub3JpbmcsIHdlIHdpbGwgcmV0aHJvdyB0aGUgb3JpZ2luYWwgZXJyb3IsIHBhdGggJHtjb25maWcucGF0aH1gLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gc2V0TGFyZ2VGaWxlIGZvciAke2NvbmZpZy5wYXRofTogJHtlLnN0YWNrfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGdldEluZm8gJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBmaWxlID0gYXdhaXQgYXBpLmhlYWRGaWxlQnlOYW1lKHsgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coYEJhY2tibGF6ZSBmaWxlIG5vdCBleGlzdHMgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coYEJhY2tibGF6ZSBmaWxlIGV4aXN0cyAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlVGltZTogZmlsZS51cGxvYWRUaW1lc3RhbXAsXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuc3RhY2suaW5jbHVkZXMoYGZpbGVfbm90X2ZvdW5kYCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coYEJhY2tibGF6ZSBmaWxlIG5vdCBleGlzdHMgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRm9yIGV4YW1wbGUgZmluZEZpbGVOYW1lcyhcImlwcy9cIilcbiAgICBwdWJsaWMgYXN5bmMgZmluZChwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcCh4ID0+IHgucGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogQ2hhbmdlc0FmdGVyQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICAvLyBObyBuYXRpdmUgY2hhbmdlIGZlZWQgKGIyIHN1cHBvcnRzIG5laXRoZXIgdGltZSBub3Igcm91dGUgZmlsdGVyaW5nKSAtIGEgZnVsbCBsaXN0aW5nIGZpbHRlcmVkIGluIG1lbW9yeVxuICAgICAgICByZXR1cm4gZmlsdGVyQ2hhbmdlcyhhd2FpdCB0aGlzLmZpbmRJbmZvKFwiXCIpLCBjb25maWcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kSW5mbyhwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8eyBwYXRoOiBzdHJpbmc7IGNyZWF0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB9W10+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgZmluZEluZm8gJHtwcmVmaXh9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjb25maWc/LnNoYWxsb3cgJiYgY29uZmlnPy50eXBlID09PSBcImZvbGRlcnNcIikge1xuICAgICAgICAgICAgICAgIGxldCBhbGxGaWxlcyA9IGF3YWl0IHRoaXMuZmluZEluZm8ocHJlZml4KTtcbiAgICAgICAgICAgICAgICBsZXQgYWxsRm9sZGVycyA9IG5ldyBNYXA8c3RyaW5nLCB7IHBhdGg6IHN0cmluZzsgY3JlYXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfT4oKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB7IHBhdGgsIGNyZWF0ZVRpbWUsIHNpemUgfSBvZiBhbGxGaWxlcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm9sZGVyID0gcGF0aC5zcGxpdChcIi9cIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIvXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvbGRlcikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGFsbEZvbGRlcnMuc2V0KGZvbGRlciwgeyBwYXRoOiBmb2xkZXIsIGNyZWF0ZVRpbWUsIHNpemUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGFsbEZvbGRlcnMudmFsdWVzKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIHsgcGF0aDogc3RyaW5nOyBjcmVhdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgfT4oKTtcbiAgICAgICAgICAgIGxldCBzdGFydEZpbGVOYW1lID0gXCJcIjtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFwaS5saXN0RmlsZU5hbWVzKHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsXG4gICAgICAgICAgICAgICAgICAgIHByZWZpeDogcHJlZml4LFxuICAgICAgICAgICAgICAgICAgICBzdGFydEZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBtYXhGaWxlQ291bnQ6IDEwMDAsXG4gICAgICAgICAgICAgICAgICAgIGRlbGltaXRlcjogY29uZmlnPy5zaGFsbG93ID8gXCIvXCIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZmlsZSBvZiByZXN1bHQuZmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuYWN0aW9uID09PSBcInVwbG9hZFwiICYmIGNvbmZpZz8udHlwZSAhPT0gXCJmb2xkZXJzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLnNldChmaWxlLmZpbGVOYW1lLCB7IHBhdGg6IGZpbGUuZmlsZU5hbWUsIGNyZWF0ZVRpbWU6IGZpbGUudXBsb2FkVGltZXN0YW1wLCBzaXplOiBmaWxlLmNvbnRlbnRMZW5ndGggfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZS5hY3Rpb24gPT09IFwiZm9sZGVyXCIgJiYgY29uZmlnPy50eXBlID09PSBcImZvbGRlcnNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbGRlciA9IGZpbGUuZmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9sZGVyLmVuZHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlciA9IGZvbGRlci5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlcy5zZXQoZm9sZGVyLCB7IHBhdGg6IGZvbGRlciwgY3JlYXRlVGltZTogZmlsZS51cGxvYWRUaW1lc3RhbXAsIHNpemU6IGZpbGUuY29udGVudExlbmd0aCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0YXJ0RmlsZU5hbWUgPSByZXN1bHQubmV4dEZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIGlmICghc3RhcnRGaWxlTmFtZSkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShmaWxlcy52YWx1ZXMoKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhc3NlcnRQYXRoVmFsaWQocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGxldCBieXRlcyA9IEJ1ZmZlci5mcm9tKHBhdGgsIFwidXRmOFwiKTtcbiAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCA+IDEwMDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCB0b28gbG9uZzogJHtwYXRoLmxlbmd0aH0gY2hhcmFjdGVycyA+IDEwMDAgY2hhcmFjdGVycy4gUGF0aDogJHtwYXRofWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG1vdmUoY29uZmlnOiB7XG4gICAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgICAgdGFyZ2V0OiBJQXJjaGl2ZXM7XG4gICAgICAgIHRhcmdldFBhdGg6IHN0cmluZztcbiAgICAgICAgY29weUluc3RlYWQ/OiBib29sZWFuO1xuICAgIH0pIHtcbiAgICAgICAgbGV0IHsgcGF0aCwgdGFyZ2V0LCB0YXJnZXRQYXRoIH0gPSBjb25maWc7XG4gICAgICAgIC8vIEEgc2VsZiBtb3ZlIHNob3VsZCBOT09QIChhbmQgZGVmaW5pdGVseSBub3QgY29weSwgYW5kIHRoZW4gZGVsZXRlIGl0c2VsZiEpXG4gICAgICAgIGlmICh0YXJnZXQgPT09IHRoaXMgJiYgcGF0aCA9PT0gdGFyZ2V0UGF0aCkge1xuICAgICAgICAgICAgdGhpcy5sb2coYEJhY2tibGF6ZSBtb3ZlIHBhdGggdG8gaXRzZWxmLiBTa2lwcGluZyBtb3ZlLCBhcyB0aGVyZSBpcyBubyB3b3JrIHRvIGRvLiAke3BhdGh9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEFyY2hpdmVzQmFja2JsYXplKSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0QnVja2V0SWQgPSB0YXJnZXQuYnVja2V0SWQ7XG4gICAgICAgICAgICBpZiAodGFyZ2V0QnVja2V0SWQgPT09IHRoaXMuYnVja2V0SWQgJiYgcGF0aCA9PT0gdGFyZ2V0UGF0aCkgcmV0dXJuO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBtb3ZlICR7cGF0aH0gLT4gJHt0YXJnZXRQYXRofWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBVZ2guLi4gbGlzdGluZyB0aGUgZmlsZSBuYW1lIHN1Y2tzLCBidXQuLi4gSSBndWVzcyBpdCdzIHN0aWxsIGJldHRlciB0aGFuIGRvd25sb2FkaW5nIGFuZCByZS11cGxvYWRpbmcgdGhlIGVudGlyZSBmaWxlLlxuICAgICAgICAgICAgICAgIGxldCBpbmZvID0gYXdhaXQgYXBpLmxpc3RGaWxlTmFtZXMoeyBidWNrZXRJZDogdGhpcy5idWNrZXRJZCwgcHJlZml4OiBwYXRoLCBtYXhGaWxlQ291bnQ6IDEwIH0pO1xuICAgICAgICAgICAgICAgIGxldCBmaWxlID0gaW5mby5maWxlcy5maW5kKHggPT4geC5maWxlTmFtZSA9PT0gcGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWxlKSB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kIHRvIG1vdmU6ICR7cGF0aH1gKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBhcGkuY29weUZpbGUoe1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlSWQ6IGZpbGUuZmlsZUlkLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogdGFyZ2V0UGF0aCxcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25CdWNrZXRJZDogdGFyZ2V0QnVja2V0SWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5nZXQocGF0aCk7XG4gICAgICAgICAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQgdG8gbW92ZTogJHtwYXRofWApO1xuICAgICAgICAgICAgYXdhaXQgdGFyZ2V0LnNldCh0YXJnZXRQYXRoLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29uZmlnLmNvcHlJbnN0ZWFkKSB7XG4gICAgICAgICAgICBsZXQgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKHRhcmdldFBhdGgpO1xuICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGaWxlIG5vdCBmb3VuZCBhZnRlciBtb3ZlLiBMZWF2aW5nIEJPVEggZmlsZXMuICR7dGFyZ2V0UGF0aH0gd2FzIG5vdCBmb3VuZC4gQmVpbmcgbW92ZWQgZnJvbSAke3BhdGh9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsKHBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNvcHkoY29uZmlnOiB7XG4gICAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgICAgdGFyZ2V0OiBJQXJjaGl2ZXM7XG4gICAgICAgIHRhcmdldFBhdGg6IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vdmUoeyAuLi5jb25maWcsIGNvcHlJbnN0ZWFkOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRVUkwocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGdldFVSTCAke3BhdGh9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcGkuZ2V0RG93bmxvYWRVUkwoXCJmaWxlL1wiICsgdGhpcy5idWNrZXROYW1lICsgXCIvXCIgKyBwYXRoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldERvd25sb2FkQXV0aG9yaXphdGlvbihjb25maWc6IHtcbiAgICAgICAgZmlsZU5hbWVQcmVmaXg/OiBzdHJpbmc7XG4gICAgICAgIHZhbGlkRHVyYXRpb25JblNlY29uZHM6IG51bWJlcjtcbiAgICAgICAgYjJDb250ZW50RGlzcG9zaXRpb24/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudExhbmd1YWdlPzogc3RyaW5nO1xuICAgICAgICBiMkV4cGlyZXM/OiBzdHJpbmc7XG4gICAgICAgIGIyQ2FjaGVDb250cm9sPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRFbmNvZGluZz86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50VHlwZT86IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lUHJlZml4OiBzdHJpbmc7XG4gICAgICAgIGF1dGhvcml6YXRpb25Ub2tlbjogc3RyaW5nO1xuICAgIH0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uICR7Y29uZmlnLmZpbGVOYW1lUHJlZml4ID8/IFwiXCJ9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGFwaS5nZXREb3dubG9hZEF1dGhvcml6YXRpb24oe1xuICAgICAgICAgICAgICAgIGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLFxuICAgICAgICAgICAgICAgIGZpbGVOYW1lUHJlZml4OiBjb25maWcuZmlsZU5hbWVQcmVmaXggPz8gXCJcIixcbiAgICAgICAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKlxuTmFtZXMgc2hvdWxkIGJlIGEgVVRGLTggc3RyaW5nIHVwIHRvIDEwMjQgYnl0ZXMgd2l0aCB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbnM6XG4gICAgQ2hhcmFjdGVyIGNvZGVzIGJlbG93IDMyIGFyZSBub3QgYWxsb3dlZC5cbiAgICBERUwgY2hhcmFjdGVycyAoMTI3KSBhcmUgbm90IGFsbG93ZWQuXG4gICAgQmFja3NsYXNoZXMgYXJlIG5vdCBhbGxvd2VkLlxuICAgIEZpbGUgbmFtZXMgY2Fubm90IHN0YXJ0IHdpdGggLywgZW5kIHdpdGggLywgb3IgY29udGFpbiAvLy5cbiovXG5cblxuZXhwb3J0IGNvbnN0IGdldEFyY2hpdmVzQmFja2JsYXplID0gY2FjaGUoKGRvbWFpbjogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBBcmNoaXZlc0JhY2tibGF6ZSh7IGJ1Y2tldE5hbWU6IGRvbWFpbiB9KTtcbn0pO1xuZXhwb3J0IGNvbnN0IGdldEFyY2hpdmVzQmFja2JsYXplUHJpdmF0ZUltbXV0YWJsZSA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoe1xuICAgICAgICBidWNrZXROYW1lOiBkb21haW4gKyBcIi1wcml2YXRlLWltbXV0YWJsZVwiLFxuICAgICAgICBpbW11dGFibGU6IHRydWVcbiAgICB9KTtcbn0pO1xuZXhwb3J0IGNvbnN0IGdldEFyY2hpdmVzQmFja2JsYXplUHVibGljSW1tdXRhYmxlID0gY2FjaGUoKGRvbWFpbjogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBBcmNoaXZlc0JhY2tibGF6ZSh7XG4gICAgICAgIGJ1Y2tldE5hbWU6IGRvbWFpbiArIFwiLXB1YmxpYy1pbW11dGFibGVcIixcbiAgICAgICAgcHVibGljOiB0cnVlLFxuICAgICAgICBpbW11dGFibGU6IHRydWUsXG4gICAgICAgIGFsbG93ZWRPcmlnaW5zOiBbYGh0dHBzOi8vJHtkb21haW59YCwgYGh0dHBzOi8vMTI3LTAtMC0xLiR7ZG9tYWlufTo3MDA3YF0sXG4gICAgfSk7XG59KTtcblxuLy8gTk9URTogQ2FjaGUgYnkgYSBtaW51dGUuIFRoaXMgbWlnaHQgYmUgYSBiYWQgaWRlYSwgYnV0Li4uIHVzdWFsbHkgd2hvbGUgcmVhc29uIGZvciBwdWJsaWMgaXMgZm9yIGNsb3VkZmxhcmUgY2FjaGluZyAoYXMgb3RoZXJ3aXNlIHdlIGNhbiBqdXN0IGFjY2VzcyBpdCB0aHJvdWdoIGEgc2VydmVyKSwgb3IgZm9yIGxhcmdlIGZpbGVzICh3aGljaCBzaG91bGQgYmUgY2FjaGVkIGFueXdheXMsIGFuZCBwcm9iYWJseSBldmVuIHVzZSBpbW11dGFibGUgY2FjaGluZykuXG5leHBvcnQgY29uc3QgZ2V0QXJjaGl2ZXNCYWNrYmxhemVQdWJsaWMgPSBjYWNoZSgoZG9tYWluOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQmFja2JsYXplKHtcbiAgICAgICAgYnVja2V0TmFtZTogZG9tYWluICsgXCItcHVibGljXCIsXG4gICAgICAgIHB1YmxpYzogdHJ1ZSxcbiAgICAgICAgY2FjaGVUaW1lOiB0aW1lSW5NaW51dGUsXG4gICAgICAgIGFsbG93ZWRPcmlnaW5zOiBbYGh0dHBzOi8vJHtkb21haW59YCwgYGh0dHBzOi8vMTI3LTAtMC0xLiR7ZG9tYWlufTo3MDA3YF0sXG4gICAgfSk7XG59KTsiXX0=
822
- /* _JS_SOURCE_HASH = "80f340783acd094a35fcccc5770252ecc0248baf7684770d44ec314ad837b5a2"; */
828
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2JsYXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmFja2JsYXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlEQUEwRDtBQUcxRCxtREFBa0Y7QUFDbEYsMkRBQXFEO0FBQ3JELGtFQUFpRjtBQUNqRix3RUFBZ0Y7QUFFaEYsOENBQXNCO0FBQ3RCLGlEQUE4QztBQUM5QyxxREFBNEU7QUFDNUUsMkNBQWtLO0FBQ2xLLCtEQUE2RDtBQU83RCxJQUFJLGNBQWMsR0FBRyxJQUFBLGNBQUksRUFBQyxLQUFLLElBQTZCLEVBQUU7SUFDMUQsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFBLHFCQUFTLEVBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUMvRCxJQUFJLEdBQUcsR0FBRyxNQUFNLElBQUEscUJBQVMsRUFBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQzNELE9BQU87UUFDSCxnQkFBZ0IsRUFBRSxLQUFLO1FBQ3ZCLGNBQWMsRUFBRSxHQUFHO0tBQ3RCLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQztBQUNILCtLQUErSztBQUMvSyxTQUFTLHdCQUF3QixDQUFDLFFBQTJCO0lBQ3pELElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDM0QsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNyRCxJQUFJLEtBQUssR0FBRyxZQUFZLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEMsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUs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QUFjLEVBQUUsRUFBRTtJQUMvRCxPQUFPLElBQUksaUJBQWlCLENBQUM7UUFDekIsVUFBVSxFQUFFLE1BQU0sR0FBRyxTQUFTO1FBQzlCLE1BQU0sRUFBRSxJQUFJO1FBQ1osU0FBUyxFQUFFLG1CQUFZO1FBQ3ZCLGNBQWMsRUFBRSxDQUFDLFdBQVcsTUFBTSxFQUFFLEVBQUUscUJBQXFCLE1BQU0sT0FBTyxDQUFDO0tBQzVFLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2FjaGUsIGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBpc05vZGUsIHNvcnQsIHRpbWVJbkhvdXIsIHRpbWVJbk1pbnV0ZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0VGltZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQgeyBibHVlLCBncmVlbiwgbWFnZW50YSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvbG9nQ29sb3JzXCI7XG5pbXBvcnQgZGVidWdicmVhayBmcm9tIFwiZGVidWdicmVha1wiO1xuaW1wb3J0IGRucyBmcm9tIFwiZG5zXCI7XG5pbXBvcnQgeyBnZXRTZWNyZXQgfSBmcm9tIFwiLi4vbWlzYy9nZXRTZWNyZXRcIjtcbmltcG9ydCB7IGh0dHBzUmVxdWVzdCwgSHR0cHNSZXNwb25zZUluZm8gfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9odHRwc1wiO1xuaW1wb3J0IHsgSUFyY2hpdmVzLCBBcmNoaXZlc0NvbmZpZywgQ2hhbmdlc0FmdGVyQ29uZmlnLCBBcmNoaXZlRmlsZUluZm8sIEdldENvbmZpZywgU2V0Q29uZmlnLCBhc3NlcnRWYWxpZExhc3RNb2RpZmllZCwgSU1NVVRBQkxFX0NBQ0hFX1RJTUUgfSBmcm9tIFwiLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IGZpbHRlckNoYW5nZXMgfSBmcm9tIFwiLi9yZW1vdGVTdG9yYWdlL3JlbW90ZUNvbmZpZ1wiO1xuXG50eXBlIEJhY2tibGF6ZUNyZWRzID0ge1xuICAgIGFwcGxpY2F0aW9uS2V5SWQ6IHN0cmluZztcbiAgICBhcHBsaWNhdGlvbktleTogc3RyaW5nO1xufTtcblxubGV0IGJhY2tibGF6ZUNyZWRzID0gbGF6eShhc3luYyAoKTogUHJvbWlzZTxCYWNrYmxhemVDcmVkcz4gPT4ge1xuICAgIGxldCBrZXlJZCA9IGF3YWl0IGdldFNlY3JldChcImJhY2tibGF6ZS5qc29uLmFwcGxpY2F0aW9uS2V5SWRcIik7XG4gICAgbGV0IGtleSA9IGF3YWl0IGdldFNlY3JldChcImJhY2tibGF6ZS5qc29uLmFwcGxpY2F0aW9uS2V5XCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFwcGxpY2F0aW9uS2V5SWQ6IGtleUlkLFxuICAgICAgICBhcHBsaWNhdGlvbktleToga2V5LFxuICAgIH07XG59KTtcbi8vIEEgQjIgZG93bmxvYWQvSEVBRCByZXNwb25zZSdzIGhlYWRlcnMgY2FycnkgdGhlIGZpbGUncyBtZXRhZGF0YS4gY29udGVudC1yYW5nZSdzIHRvdGFsIHdpbnMgb3ZlciBjb250ZW50LWxlbmd0aCBmb3IgcmFuZ2VkIHJlc3BvbnNlcyAod2hpY2ggb25seSByZXBvcnQgdGhlIHNsaWNlJ3MgbGVuZ3RoKS5cbmZ1bmN0aW9uIHBhcnNlRmlsZU1ldGFkYXRhSGVhZGVycyhyZXNwb25zZTogSHR0cHNSZXNwb25zZUluZm8pOiB7IHNpemU6IG51bWJlcjsgdXBsb2FkVGltZXN0YW1wOiBudW1iZXIgfSB7XG4gICAgbGV0IHNpemUgPSBOdW1iZXIocmVzcG9uc2UuaGVhZGVyc1tcImNvbnRlbnQtbGVuZ3RoXCJdIHx8IDApO1xuICAgIGxldCBjb250ZW50UmFuZ2UgPSByZXNwb25zZS5oZWFkZXJzW1wiY29udGVudC1yYW5nZVwiXTtcbiAgICBsZXQgdG90YWwgPSBjb250ZW50UmFuZ2UgJiYgTnVtYmVyKGNvbnRlbnRSYW5nZS5zcGxpdChcIi9cIilbMV0pO1xuICAgIGlmICh0b3RhbCAmJiBOdW1iZXIuaXNGaW5pdGUodG90YWwpKSB7XG4gICAgICAgIHNpemUgPSB0b3RhbDtcbiAgICB9XG4gICAgcmV0dXJuIHsgc2l6ZSwgdXBsb2FkVGltZXN0YW1wOiBOdW1iZXIocmVzcG9uc2UuaGVhZGVyc1tcIngtYnotdXBsb2FkLXRpbWVzdGFtcFwiXSB8fCAwKSB9O1xufVxuXG5jb25zdCBnZXRBUEkgPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICBsZXQgY3JlZHMgPSBhd2FpdCBiYWNrYmxhemVDcmVkcygpO1xuXG4gICAgLy8gTk9URTogT24gZXJyb3JzLCBvdXIgcmV0cnkgY29kZSByZXNldHMgdGhpcyBsYXp5LCBzbyB3ZSBETyBnZXQgbmV3IGF1dGhvcml6ZSB3aGVuIG5lZWRlZC5cbiAgICAvLyBUT0RPOiBNYXliZSB3ZSBzaG91bGQgZ2V0IG5ldyBhdXRob3JpemF0aW9uIHBlcmlvZGljYWxseSBhdCB3ZWxsP1xuICAgIGxldCBhdXRob3JpemVSYXcgPSBhd2FpdCBodHRwc1JlcXVlc3QoXCJodHRwczovL2FwaS5iYWNrYmxhemViMi5jb20vYjJhcGkvdjIvYjJfYXV0aG9yaXplX2FjY291bnRcIiwgdW5kZWZpbmVkLCBcIkdFVFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogXCJCYXNpYyBcIiArIEJ1ZmZlci5mcm9tKGNyZWRzLmFwcGxpY2F0aW9uS2V5SWQgKyBcIjpcIiArIGNyZWRzLmFwcGxpY2F0aW9uS2V5KS50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IGF1dGggPSBKU09OLnBhcnNlKGF1dGhvcml6ZVJhdy50b1N0cmluZygpKSBhcyB7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICAgICAgYXBpVXJsOiBzdHJpbmc7XG4gICAgICAgIGRvd25sb2FkVXJsOiBzdHJpbmc7XG4gICAgICAgIGFsbG93ZWQ6IHtcbiAgICAgICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgICAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBjYXBhYmlsaXRpZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgbmFtZVByZWZpeDogc3RyaW5nO1xuICAgICAgICB9W107XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUIyRnVuY3Rpb248QXJnLCBSZXN1bHQ+KG5hbWU6IHN0cmluZywgdHlwZTogXCJQT1NUXCIgfCBcIkdFVFwiLCBub0FjY291bnRJZD86IFwibm9BY2NvdW50SWRcIik6IChhcmc6IEFyZykgPT4gUHJvbWlzZTxSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIGFzeW5jIChhcmc6IEFyZykgPT4ge1xuICAgICAgICAgICAgaWYgKCFub0FjY291bnRJZCkge1xuICAgICAgICAgICAgICAgIGFyZyA9IHsgYWNjb3VudElkOiBhdXRoLmFjY291bnRJZCwgLi4uYXJnIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCB1cmwgPSBhdXRoLmFwaVVybCArIFwiL2IyYXBpL3YyL1wiICsgbmFtZTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KHVybCwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoYXJnKSksIHR5cGUsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBhdXRoLmF1dGhvcml6YXRpb25Ub2tlbixcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gJHtuYW1lfSwgYXJnICR7SlNPTi5zdHJpbmdpZnkoYXJnKS5zbGljZSgwLCAxMDAwKX06ICR7ZS5zdGFja31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVCdWNrZXQgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBidWNrZXRUeXBlOiBcImFsbFByaXZhdGVcIiB8IFwiYWxsUHVibGljXCI7XG4gICAgICAgIGxpZmVjeWNsZVJ1bGVzPzogYW55W107XG4gICAgICAgIGNvcnNSdWxlcz86IHVua25vd25bXTtcbiAgICAgICAgYnVja2V0SW5mbz86IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICAgIH07XG4gICAgfSwge1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBidWNrZXRUeXBlOiBcImFsbFByaXZhdGVcIiB8IFwiYWxsUHVibGljXCI7XG4gICAgICAgIGJ1Y2tldEluZm86IHtcbiAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBhbnlbXTtcbiAgICAgICAgfTtcbiAgICAgICAgY29yc1J1bGVzOiBhbnlbXTtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICByZXZpc2lvbjogbnVtYmVyO1xuICAgIH0+KFwiYjJfY3JlYXRlX2J1Y2tldFwiLCBcIlBPU1RcIik7XG5cbiAgICBjb25zdCB1cGRhdGVCdWNrZXQgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldFR5cGU/OiBcImFsbFByaXZhdGVcIiB8IFwiYWxsUHVibGljXCI7XG4gICAgICAgIGxpZmVjeWNsZVJ1bGVzPzogYW55W107XG4gICAgICAgIGJ1Y2tldEluZm8/OiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICAgICAgICB9O1xuICAgICAgICBjb3JzUnVsZXM/OiB1bmtub3duW107XG4gICAgfSwge1xuICAgICAgICBhY2NvdW50SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBidWNrZXRUeXBlOiBcImFsbFByaXZhdGVcIiB8IFwiYWxsUHVibGljXCI7XG4gICAgICAgIGJ1Y2tldEluZm86IHtcbiAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBhbnlbXTtcbiAgICAgICAgfTtcbiAgICAgICAgY29yc1J1bGVzOiBhbnlbXTtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IGFueVtdO1xuICAgICAgICByZXZpc2lvbjogbnVtYmVyO1xuICAgIH0+KFwiYjJfdXBkYXRlX2J1Y2tldFwiLCBcIlBPU1RcIik7XG5cbiAgICAvLyBodHRwczovL3d3dy5iYWNrYmxhemUuY29tL2FwaWRvY3MvYjItdXBkYXRlLWJ1Y2tldFxuICAgIC8vICBUT0RPOiBiMl91cGRhdGVfYnVja2V0LCBzbyB3ZSBjYW4gdXBkYXRlIENPUlMsIGV0Y1xuXG4gICAgY29uc3QgbGlzdEJ1Y2tldHMgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0TmFtZT86IHN0cmluZztcbiAgICB9LCB7XG4gICAgICAgIGJ1Y2tldHM6IHtcbiAgICAgICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGJ1Y2tldFR5cGU6IFwiYWxsUHJpdmF0ZVwiIHwgXCJhbGxQdWJsaWNcIjtcbiAgICAgICAgICAgIGJ1Y2tldEluZm86IHtcbiAgICAgICAgICAgICAgICBsaWZlY3ljbGVSdWxlczogYW55W107XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29yc1J1bGVzOiBhbnlbXTtcbiAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBhbnlbXTtcbiAgICAgICAgICAgIHJldmlzaW9uOiBudW1iZXI7XG4gICAgICAgIH1bXTtcbiAgICB9PihcImIyX2xpc3RfYnVja2V0c1wiLCBcIlBPU1RcIik7XG5cbiAgICBmdW5jdGlvbiBlbmNvZGVQYXRoKHBhdGg6IHN0cmluZykge1xuICAgICAgICAvLyBQcmVzZXJ2ZSBzbGFzaGVzLCBidXQgZW5jb2RlIGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICBwYXRoID0gcGF0aC5zcGxpdChcIi9cIikubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbihcIi9cIik7XG4gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSBwYXRoID0gXCIlMkZcIiArIHBhdGguc2xpY2UoMSk7XG4gICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKFwiL1wiKSkgcGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpICsgXCIlMkZcIjtcbiAgICAgICAgLy8gTk9URTogRm9yIHNvbWUgcmVhc29uLCB0aGlzIHdvbid0IHJlbmRlciBpbiB0aGUgd2ViIFVJIGNvcnJlY3RseS4gQlVULCBpdCdsbFxuICAgICAgICAvLyAgd29yayBnZXQgZ2V0L3NldCBhbmQgZmluZFxuICAgICAgICAvLyAgLSBBTFNPLCBpdCBzZWVtcyB0byBhZGQgZHVwbGljYXRlIGZpbGVzPyBUaGlzIG1pZ2h0IGFsc28gYmUgYSB3ZWIgVUkgdGhpbmcuIEl0IHNlZW1zIHRvIHdvcmsgdGhvdWdoLlxuICAgICAgICB3aGlsZSAocGF0aC5pbmNsdWRlcyhcIi8vXCIpKSB7XG4gICAgICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlQWxsKFwiLy9cIiwgXCIvJTJGXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkRmlsZUJ5TmFtZShjb25maWc6IHtcbiAgICAgICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXI7IH07XG4gICAgICAgIC8vIENhcHR1cmVzIHRoZSByZXNwb25zZSBoZWFkZXJzLCB3aGljaCBjYXJyeSB0aGUgZmlsZSdzIG1ldGFkYXRhICh4LWJ6LXVwbG9hZC10aW1lc3RhbXAsIGNvbnRlbnQtbGVuZ3RoIC8gY29udGVudC1yYW5nZSkgLSBzbyBjYWxsZXJzIHRoYXQgbmVlZCBpdCBkb24ndCBwYXkgYSBzZWNvbmQgQVBJIGNhbGxcbiAgICAgICAgb3V0UmVzcG9uc2U/OiBIdHRwc1Jlc3BvbnNlSW5mbztcbiAgICB9KSB7XG4gICAgICAgIGxldCBmaWxlTmFtZSA9IGVuY29kZVBhdGgoY29uZmlnLmZpbGVOYW1lKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KGF1dGguYXBpVXJsICsgXCIvZmlsZS9cIiArIGNvbmZpZy5idWNrZXROYW1lICsgXCIvXCIgKyBmaWxlTmFtZSwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgYWNjb3VudElkOiBhdXRoLmFjY291bnRJZCxcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJhcnJheWJ1ZmZlclwiLFxuICAgICAgICB9KSksIFwiR0VUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgaGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBhdXRoLmF1dGhvcml6YXRpb25Ub2tlbixcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICBSYW5nZTogY29uZmlnLnJhbmdlID8gYGJ5dGVzPSR7Y29uZmlnLnJhbmdlLnN0YXJ0fS0ke2NvbmZpZy5yYW5nZS5lbmQgLSAxfWAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KS5maWx0ZXIoeCA9PiB4WzFdICE9PSB1bmRlZmluZWQpKSxcbiAgICAgICAgICAgIG91dFJlc3BvbnNlOiBjb25maWcub3V0UmVzcG9uc2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKiBBIGZpbGUncyBtZXRhZGF0YSBieSBuYW1lLCB3aXRob3V0IHRoZSBib2R5OiBIRUFEIG9uIHRoZSBkb3dubG9hZCBVUkwsIHdoaWNoIGlzIGEgY2xhc3MgQiAoZG93bmxvYWQtcHJpY2VkKSB0cmFuc2FjdGlvbiAtIGIyX2xpc3RfZmlsZV9uYW1lcyBpcyBjbGFzcyBDIGF0IDEweCB0aGUgcHJpY2UsIGFuZCBiMl9nZXRfZmlsZV9pbmZvIG5lZWRzIGEgZmlsZUlkIHdlIGRvbid0IGhhdmUuIFJldHVybnMgdW5kZWZpbmVkIGZvciBtaXNzaW5nIChvciBoaWRkZW4pIGZpbGVzLiAqL1xuICAgIGFzeW5jIGZ1bmN0aW9uIGhlYWRGaWxlQnlOYW1lKGNvbmZpZzogeyBidWNrZXROYW1lOiBzdHJpbmc7IGZpbGVOYW1lOiBzdHJpbmcgfSk6IFByb21pc2U8eyBzaXplOiBudW1iZXI7IHVwbG9hZFRpbWVzdGFtcDogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gZW5jb2RlUGF0aChjb25maWcuZmlsZU5hbWUpO1xuICAgICAgICBsZXQgcmVzcG9uc2U6IEh0dHBzUmVzcG9uc2VJbmZvID0geyBoZWFkZXJzOiB7fSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgaHR0cHNSZXF1ZXN0KGF1dGguYXBpVXJsICsgXCIvZmlsZS9cIiArIGNvbmZpZy5idWNrZXROYW1lICsgXCIvXCIgKyBmaWxlTmFtZSwgdW5kZWZpbmVkLCBcIkhFQURcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogeyBBdXRob3JpemF0aW9uOiBhdXRoLmF1dGhvcml6YXRpb25Ub2tlbiB9LFxuICAgICAgICAgICAgICAgIG91dFJlc3BvbnNlOiByZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDA0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8gSEVBRCByZXNwb25zZXMgaGF2ZSBubyBib2R5LCBzbyB0aGUgZXhwaXJlZF9hdXRoX3Rva2VuIG1hcmtlciBhcGlSZXRyeUxvZ2ljIG1hdGNoZXMgb24gbmV2ZXIgYXBwZWFycyAtIHJlLWFkZCBpdCBzbyBhbiBleHBpcmVkIHRva2VuIHN0aWxsIHJlZnJlc2hlcyBhbmQgcmV0cmllc1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJleHBpcmVkX2F1dGhfdG9rZW5cIiBIRUFEICR7Y29uZmlnLmJ1Y2tldE5hbWV9LyR7Y29uZmlnLmZpbGVOYW1lfSBnb3QgYSA0MDE6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZUZpbGVNZXRhZGF0YUhlYWRlcnMocmVzcG9uc2UpO1xuICAgIH1cblxuICAgIC8vIE9oLi4uIGFwcGFyZW50bHksIHdlIGNhbid0IHJldXNlIHRoZXNlPyBIdWguLi5cbiAgICBjb25zdCBnZXRVcGxvYWRVUkwgPSAoYXN5bmMgKGJ1Y2tldElkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiBnZXRVcGxvYWRVUkwuY2xlYXIoYnVja2V0SWQpLCB0aW1lSW5Ib3VyICogMSk7XG4gICAgICAgIGxldCBnZXRVcGxvYWRVcmxSYXcgPSBhd2FpdCBodHRwc1JlcXVlc3QoYXV0aC5hcGlVcmwgKyBcIi9iMmFwaS92Mi9iMl9nZXRfdXBsb2FkX3VybD9idWNrZXRJZD1cIiArIGJ1Y2tldElkLCB1bmRlZmluZWQsIFwiR0VUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGF1dGguYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShnZXRVcGxvYWRVcmxSYXcudG9TdHJpbmcoKSkgYXMge1xuICAgICAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgICAgIHVwbG9hZFVybDogc3RyaW5nO1xuICAgICAgICAgICAgYXV0aG9yaXphdGlvblRva2VuOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiB1cGxvYWRGaWxlKGNvbmZpZzoge1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICBkYXRhOiBCdWZmZXI7XG4gICAgfSkge1xuICAgICAgICBsZXQgZ2V0VXBsb2FkVXJsID0gYXdhaXQgZ2V0VXBsb2FkVVJMKGNvbmZpZy5idWNrZXRJZCk7XG5cbiAgICAgICAgYXdhaXQgaHR0cHNSZXF1ZXN0KGdldFVwbG9hZFVybC51cGxvYWRVcmwsIGNvbmZpZy5kYXRhLCBcIlBPU1RcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogZ2V0VXBsb2FkVXJsLmF1dGhvcml6YXRpb25Ub2tlbixcbiAgICAgICAgICAgICAgICBcIlgtQnotRmlsZS1OYW1lXCI6IGVuY29kZVBhdGgoY29uZmlnLmZpbGVOYW1lKSxcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImIyL3gtYXV0b1wiLFxuICAgICAgICAgICAgICAgIFwiWC1Cei1Db250ZW50LVNoYTFcIjogXCJkb19ub3RfdmVyaWZ5XCIsXG4gICAgICAgICAgICAgICAgXCJDb250ZW50LUxlbmd0aFwiOiBjb25maWcuZGF0YS5sZW5ndGggKyBcIlwiLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBoaWRlRmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgIH0sIHt9PihcImIyX2hpZGVfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IGdldEZpbGVJbmZvID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgfSwge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRMZW5ndGg6IG51bWJlcjtcbiAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICAgICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgICAgICAgZmlsZUluZm86IHtcbiAgICAgICAgICAgIHNyY19sYXN0X21vZGlmaWVkX21pbGxpczogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgICBhY3Rpb246IHN0cmluZztcbiAgICAgICAgdXBsb2FkVGltZXN0YW1wOiBudW1iZXI7XG4gICAgfT4oXCJiMl9nZXRfZmlsZV9pbmZvXCIsIFwiUE9TVFwiLCBcIm5vQWNjb3VudElkXCIpO1xuXG4gICAgY29uc3QgbGlzdEZpbGVOYW1lcyA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBwcmVmaXg6IHN0cmluZztcbiAgICAgICAgc3RhcnRGaWxlTmFtZT86IHN0cmluZztcbiAgICAgICAgbWF4RmlsZUNvdW50PzogbnVtYmVyO1xuICAgICAgICBkZWxpbWl0ZXI/OiBzdHJpbmc7XG4gICAgfSwge1xuICAgICAgICBmaWxlczoge1xuICAgICAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgICAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgYWNjb3VudElkOiBzdHJpbmc7XG4gICAgICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICAgICAgY29udGVudExlbmd0aDogbnVtYmVyO1xuICAgICAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgICAgICBmaWxlSW5mbzoge1xuICAgICAgICAgICAgICAgIHNyY19sYXN0X21vZGlmaWVkX21pbGxpczogbnVtYmVyO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFjdGlvbjogc3RyaW5nO1xuICAgICAgICAgICAgdXBsb2FkVGltZXN0YW1wOiBudW1iZXI7XG4gICAgICAgIH1bXTtcbiAgICAgICAgbmV4dEZpbGVOYW1lOiBzdHJpbmc7XG4gICAgfT4oXCJiMl9saXN0X2ZpbGVfbmFtZXNcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBjb3B5RmlsZSA9IGNyZWF0ZUIyRnVuY3Rpb248e1xuICAgICAgICBzb3VyY2VGaWxlSWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICAgICAgZGVzdGluYXRpb25CdWNrZXRJZDogc3RyaW5nO1xuICAgIH0sIHt9PihcImIyX2NvcHlfZmlsZVwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGNvbnN0IHN0YXJ0TGFyZ2VGaWxlID0gY3JlYXRlQjJGdW5jdGlvbjx7XG4gICAgICAgIGJ1Y2tldElkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgIGZpbGVJbmZvOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAgIH0sIHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBjb250ZW50VHlwZTogc3RyaW5nO1xuICAgICAgICBmaWxlSW5mbzogYW55O1xuICAgICAgICB1cGxvYWRUaW1lc3RhbXA6IG51bWJlcjtcbiAgICB9PihcImIyX3N0YXJ0X2xhcmdlX2ZpbGVcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICAvLyBBcHBhcmVudGx5IHdlIGNhbid0IHJldXNlIHRoZXNlP1xuICAgIGNvbnN0IGdldFVwbG9hZFBhcnRVUkwgPSAoYXN5bmMgKGZpbGVJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxldCB1cGxvYWRQYXJ0UmF3ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KGF1dGguYXBpVXJsICsgXCIvYjJhcGkvdjIvYjJfZ2V0X3VwbG9hZF9wYXJ0X3VybD9maWxlSWQ9XCIgKyBmaWxlSWQsIHVuZGVmaW5lZCwgXCJHRVRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYXV0aC5hdXRob3JpemF0aW9uVG9rZW4sXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh1cGxvYWRQYXJ0UmF3LnRvU3RyaW5nKCkpIGFzIHtcbiAgICAgICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICAgICAgcGFydE51bWJlcjogbnVtYmVyO1xuICAgICAgICAgICAgdXBsb2FkVXJsOiBzdHJpbmc7XG4gICAgICAgICAgICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZztcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBhc3luYyBmdW5jdGlvbiB1cGxvYWRQYXJ0KGNvbmZpZzoge1xuICAgICAgICBmaWxlSWQ6IHN0cmluZztcbiAgICAgICAgcGFydE51bWJlcjogbnVtYmVyO1xuICAgICAgICBkYXRhOiBCdWZmZXI7XG4gICAgICAgIHNoYTE6IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTx7XG4gICAgICAgIGZpbGVJZDogc3RyaW5nO1xuICAgICAgICBwYXJ0TnVtYmVyOiBudW1iZXI7XG4gICAgICAgIGNvbnRlbnRMZW5ndGg6IG51bWJlcjtcbiAgICAgICAgY29udGVudFNoYTE6IHN0cmluZztcbiAgICB9PiB7XG4gICAgICAgIGxldCB1cGxvYWRQYXJ0ID0gYXdhaXQgZ2V0VXBsb2FkUGFydFVSTChjb25maWcuZmlsZUlkKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KHVwbG9hZFBhcnQudXBsb2FkVXJsLCBjb25maWcuZGF0YSwgXCJQT1NUXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IHVwbG9hZFBhcnQuYXV0aG9yaXphdGlvblRva2VuLFxuICAgICAgICAgICAgICAgIFwiWC1Cei1QYXJ0LU51bWJlclwiOiBjb25maWcucGFydE51bWJlciArIFwiXCIsXG4gICAgICAgICAgICAgICAgXCJYLUJ6LUNvbnRlbnQtU2hhMVwiOiBjb25maWcuc2hhMSxcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtTGVuZ3RoXCI6IGNvbmZpZy5kYXRhLmxlbmd0aCArIFwiXCIsXG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdC50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5pc2hMYXJnZUZpbGUgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIHBhcnRTaGExQXJyYXk6IHN0cmluZ1tdO1xuICAgIH0sIHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmc7XG4gICAgICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgICAgICBidWNrZXRJZDogc3RyaW5nO1xuICAgICAgICBjb250ZW50TGVuZ3RoOiBudW1iZXI7XG4gICAgICAgIGNvbnRlbnRTaGExOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgICAgIGZpbGVJbmZvOiBhbnk7XG4gICAgICAgIHVwbG9hZFRpbWVzdGFtcDogbnVtYmVyO1xuICAgIH0+KFwiYjJfZmluaXNoX2xhcmdlX2ZpbGVcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBjYW5jZWxMYXJnZUZpbGUgPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgZmlsZUlkOiBzdHJpbmc7XG4gICAgfSwge30+KFwiYjJfY2FuY2VsX2xhcmdlX2ZpbGVcIiwgXCJQT1NUXCIsIFwibm9BY2NvdW50SWRcIik7XG5cbiAgICBjb25zdCBnZXREb3dubG9hZEF1dGhvcml6YXRpb24gPSBjcmVhdGVCMkZ1bmN0aW9uPHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWVQcmVmaXg6IHN0cmluZztcbiAgICAgICAgdmFsaWREdXJhdGlvbkluU2Vjb25kczogbnVtYmVyO1xuICAgICAgICBiMkNvbnRlbnREaXNwb3NpdGlvbj86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50TGFuZ3VhZ2U/OiBzdHJpbmc7XG4gICAgICAgIGIyRXhwaXJlcz86IHN0cmluZztcbiAgICAgICAgYjJDYWNoZUNvbnRyb2w/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudEVuY29kaW5nPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRUeXBlPzogc3RyaW5nO1xuICAgIH0sIHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWVQcmVmaXg6IHN0cmluZztcbiAgICAgICAgYXV0aG9yaXphdGlvblRva2VuOiBzdHJpbmc7XG4gICAgfT4oXCJiMl9nZXRfZG93bmxvYWRfYXV0aG9yaXphdGlvblwiLCBcIlBPU1RcIiwgXCJub0FjY291bnRJZFwiKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGdldERvd25sb2FkVVJMKHBhdGg6IHN0cmluZykge1xuICAgICAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHBhdGggPSBcIi9cIiArIHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF1dGguZG93bmxvYWRVcmwgKyBwYXRoO1xuICAgIH1cblxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlQnVja2V0LFxuICAgICAgICB1cGRhdGVCdWNrZXQsXG4gICAgICAgIGxpc3RCdWNrZXRzLFxuICAgICAgICBkb3dubG9hZEZpbGVCeU5hbWUsXG4gICAgICAgIGhlYWRGaWxlQnlOYW1lLFxuICAgICAgICB1cGxvYWRGaWxlLFxuICAgICAgICBoaWRlRmlsZSxcbiAgICAgICAgZ2V0RmlsZUluZm8sXG4gICAgICAgIGxpc3RGaWxlTmFtZXMsXG4gICAgICAgIGNvcHlGaWxlLFxuICAgICAgICBzdGFydExhcmdlRmlsZSxcbiAgICAgICAgdXBsb2FkUGFydCxcbiAgICAgICAgZmluaXNoTGFyZ2VGaWxlLFxuICAgICAgICBjYW5jZWxMYXJnZUZpbGUsXG4gICAgICAgIGdldERvd25sb2FkQXV0aG9yaXphdGlvbixcbiAgICAgICAgZ2V0RG93bmxvYWRVUkwsXG4gICAgICAgIGFwaVVybDogYXV0aC5hcGlVcmwsXG4gICAgICAgIGFsbG93ZWQ6IGF1dGguYWxsb3dlZCxcbiAgICB9O1xufSk7XG5cbnR5cGUgQjJBcGkgPSAodHlwZW9mIGdldEFQSSkgZXh0ZW5kcyAoKSA9PiBQcm9taXNlPGluZmVyIFQ+ID8gVCA6IG5ldmVyO1xuXG5cbmV4cG9ydCBjbGFzcyBBcmNoaXZlc0JhY2tibGF6ZSBpbXBsZW1lbnRzIElBcmNoaXZlcyB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiB7XG4gICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICAgICAgcHVibGljPzogYm9vbGVhbjtcbiAgICAgICAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgICAgICAgY2FjaGVUaW1lPzogbnVtYmVyO1xuICAgICAgICBhbGxvd2VkT3JpZ2lucz86IHN0cmluZ1tdO1xuICAgIH0pIHtcbiAgICAgICAgLy8gR2V0IHRoZSBhcGksIHRvIHNldHVwIGNvcnNcbiAgICAgICAgdm9pZCB0aGlzLmdldEJ1Y2tldEFQSSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYnVja2V0TmFtZSA9IHRoaXMuY29uZmlnLmJ1Y2tldE5hbWUucmVwbGFjZUFsbCgvW15cXHdcXGRdL2csIFwiLVwiKTtcbiAgICBwcml2YXRlIGJ1Y2tldElkID0gXCJcIjtcblxuICAgIHByaXZhdGUgbG9nZ2luZyA9IGZhbHNlO1xuICAgIHB1YmxpYyBlbmFibGVMb2dnaW5nKCkge1xuICAgICAgICB0aGlzLmxvZ2dpbmcgPSB0cnVlO1xuICAgIH1cbiAgICBwcml2YXRlIGxvZyh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvZ2dpbmcpIHJldHVybjtcbiAgICAgICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERlYnVnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIFwiYmFja2JsYXplIFwiICsgdGhpcy5jb25maWcuYnVja2V0TmFtZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEJ1Y2tldEFQSSA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgYXBpID0gYXdhaXQgZ2V0QVBJKCk7XG5cbiAgICAgICAgbGV0IGNhY2hlVGltZSA9IHRoaXMuY29uZmlnLmNhY2hlVGltZSA/PyAwO1xuICAgICAgICBpZiAodGhpcy5jb25maWcuaW1tdXRhYmxlKSB7XG4gICAgICAgICAgICBjYWNoZVRpbWUgPSBJTU1VVEFCTEVfQ0FDSEVfVElNRTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFMV0FZUyBzZXQgYWNjZXNzIGNvbnRyb2wsIGFzIHdlIGNhbiBtYWtlIHVybHMgZm9yIHByaXZhdGUgYnVja2V0cyB3aXRoIGdldERvd25sb2FkQXV0aG9yaXphdGlvblxuICAgICAgICBsZXQgZGVzaXJlZENvcnNSdWxlcyA9IFt7XG4gICAgICAgICAgICBjb3JzUnVsZU5hbWU6IFwiYWxsb3dBbGxcIixcbiAgICAgICAgICAgIGFsbG93ZWRPcmlnaW5zOiB0aGlzLmNvbmZpZy5hbGxvd2VkT3JpZ2lucyA/PyBbXCJodHRwc1wiXSxcbiAgICAgICAgICAgIGFsbG93ZWRPcGVyYXRpb25zOiBbXCJiMl9kb3dubG9hZF9maWxlX2J5X2lkXCIsIFwiYjJfZG93bmxvYWRfZmlsZV9ieV9uYW1lXCJdLFxuICAgICAgICAgICAgYWxsb3dlZEhlYWRlcnM6IFtcInJhbmdlXCJdLFxuICAgICAgICAgICAgZXhwb3NlSGVhZGVyczogW1wieC1iei1jb250ZW50LXNoYTFcIl0sXG4gICAgICAgICAgICAvLyA2MCBpcyB0aGUgYWJzb2x1dGUgbWluaW11bS4gSWYgd2UgdHJ5IHRvIHNldCBhIHZhbHVlIGxvd2VyIHRoYW4gdGhpcywgaXQnbGwgYmUgdXBkYXRlZCB0byBiZSA2MC4gXG4gICAgICAgICAgICBtYXhBZ2VTZWNvbmRzOiBNYXRoLm1heCg2MCwgY2FjaGVUaW1lIC8gMTAwMCksXG4gICAgICAgIH1dO1xuICAgICAgICBsZXQgYnVja2V0SW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgICAgaWYgKGNhY2hlVGltZSkge1xuICAgICAgICAgICAgYnVja2V0SW5mb1tcImNhY2hlLWNvbnRyb2xcIl0gPSBgbWF4LWFnZT0ke2NhY2hlVGltZSAvIDEwMDB9YDtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IGV4aXN0cyA9IGZhbHNlO1xuICAgICAgICBsZXQgcmV0cmllcyA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5jcmVhdGVCdWNrZXQoe1xuICAgICAgICAgICAgICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldFR5cGU6IHRoaXMuY29uZmlnLnB1YmxpYyA/IFwiYWxsUHVibGljXCIgOiBcImFsbFByaXZhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImRheXNGcm9tVXBsb2FkaW5nVG9IaWRpbmdcIjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZmlsZXMgZm9yIDcgZGF5cywgd2hpY2ggc2hvdWxkIGJlIGVub3VnaCB0aW1lIHRvIHJlY292ZXIgYWNjaWRlbnRhbCBoaWRpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRheXNGcm9tSGlkaW5nVG9EZWxldGluZ1wiOiA3LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJmaWxlTmFtZVByZWZpeFwiOiBcIlwiXG4gICAgICAgICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgICAgICAgICBjb3JzUnVsZXM6IGRlc2lyZWRDb3JzUnVsZXMsXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldEluZm9cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgIGlmICghZS5zdGFjay5pbmNsdWRlcyhgXCJkdXBsaWNhdGVfYnVja2V0X25hbWVcImApKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXRyaWVzIDwgMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQmFja2JsYXplIGNyZWF0ZSBidWNrZXQgZmFpbGVkLCByZXRyeWluZyBpbiA1czogJHtlLnN0YWNrfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoNTAwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYnVja2V0TGlzdCA9IGF3YWl0IGFwaS5saXN0QnVja2V0cyh7XG4gICAgICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYnVja2V0TGlzdC5idWNrZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgbmFtZSBcIiR7dGhpcy5idWNrZXROYW1lfVwiIGlzIGJlaW5nIHVzZWQgYnkgc29tZW9uZSBlbHNlLiBCdWNrZXQgbmFtZXMgaGF2ZSB0byBiZSBnbG9iYWxseSB1bmlxdWUuIFRyeSBhIGRpZmZlcmVudCBuYW1lIHVudGlsIHlvdSBmaW5kIGEgZnJlZSBvbmUuYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWNrZXRJZCA9IGJ1Y2tldExpc3QuYnVja2V0c1swXS5idWNrZXRJZDtcblxuICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICBsZXQgYnVja2V0ID0gYnVja2V0TGlzdC5idWNrZXRzWzBdO1xuICAgICAgICAgICAgZnVuY3Rpb24gbm9ybWFsaXplKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICAgICAgICAgICAgICBsZXQga3ZwcyA9IE9iamVjdC5lbnRyaWVzKG9iaik7XG4gICAgICAgICAgICAgICAgc29ydChrdnBzLCB4ID0+IHhbMF0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoa3Zwcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBvcmRlckluZGVwZW5kZW50RXF1YWwobGhzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcmhzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShub3JtYWxpemUobGhzKSkgPT09IEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZShyaHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIG9yZGVySW5kZXBlbmRlbnRFcXVhbEFycmF5KGxoczogdW5rbm93bltdLCByaHM6IHVua25vd25bXSkge1xuICAgICAgICAgICAgICAgIGlmIChsaHMubGVuZ3RoICE9PSByaHMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckluZGVwZW5kZW50RXF1YWwobGhzW2ldIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByaHNbaV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNvcnNDaGFuZ2VkID0gIW9yZGVySW5kZXBlbmRlbnRFcXVhbEFycmF5KGJ1Y2tldC5jb3JzUnVsZXMsIGRlc2lyZWRDb3JzUnVsZXMpO1xuICAgICAgICAgICAgbGV0IGluZm9DaGFuZ2VkID0gIW9yZGVySW5kZXBlbmRlbnRFcXVhbChidWNrZXQuYnVja2V0SW5mbywgYnVja2V0SW5mbyk7XG4gICAgICAgICAgICBpZiAoY29yc0NoYW5nZWQgfHwgaW5mb0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBVcGRhdGluZyBidWNrZXQgc2V0dGluZ3MgZm9yICR7dGhpcy5idWNrZXROYW1lfSAoY29yc1J1bGVzICR7Y29yc0NoYW5nZWQgJiYgXCJjaGFuZ2VkXCIgfHwgXCJ1bmNoYW5nZWRcIn0sIGJ1Y2tldEluZm8gJHtpbmZvQ2hhbmdlZCAmJiBcImNoYW5nZWRcIiB8fCBcInVuY2hhbmdlZFwifSk6IGNvcnNSdWxlcyAke0pTT04uc3RyaW5naWZ5KGJ1Y2tldC5jb3JzUnVsZXMpfSAtPiAke0pTT04uc3RyaW5naWZ5KGRlc2lyZWRDb3JzUnVsZXMpfSwgYnVja2V0SW5mbyAke0pTT04uc3RyaW5naWZ5KGJ1Y2tldC5idWNrZXRJbmZvKX0gLT4gJHtKU09OLnN0cmluZ2lmeShidWNrZXRJbmZvKX1gKSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBpLnVwZGF0ZUJ1Y2tldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRJZDogYnVja2V0LmFjY291bnRJZCxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SWQ6IGJ1Y2tldC5idWNrZXRJZCxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0VHlwZTogYnVja2V0LmJ1Y2tldFR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBidWNrZXQubGlmZWN5Y2xlUnVsZXMsXG4gICAgICAgICAgICAgICAgICAgIGNvcnNSdWxlczogZGVzaXJlZENvcnNSdWxlcyxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SW5mbzogYnVja2V0SW5mbyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBpO1xuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBjdXJyZW50UmVzZXQ6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBLZWVwIHRyYWNrIG9mIHdoZW4gd2UgbGFzdCByZXNldCBiZWNhdXNlIG9mIGEgNTAzXG4gICAgcHJpdmF0ZSBsYXN0NTAzUmVzZXQgPSAwO1xuICAgIC8vIElNUE9SVEFOVCEgV2UgbXVzdCBhbHdheXMgQ0FUQ0ggQVJPVU5EIHRoZSBhcGlSZXRyeUxvZ2ljLCBORVZFUiBpbnNpZGUgb2YgZm5jLiBPdGhlcndpc2Ugd2Ugd29uJ3QgYmUgYWJsZSB0byByZWNyZWF0ZSB0aGUgYXV0aCB0b2tlbi4gYGNvbnRleHRgIGlzIGEgc2hvcnQgbGFiZWwgKHZlcmIgKyBmaWxlIHBhdGgpIGluY2x1ZGVkIGluIGV2ZXJ5IHJldHJ5L2Vycm9yIGxvZyBzbyBhIHN0dWNrIHNpbGVudC1yZXRyeSBsb29wIGlzIGlkZW50aWZpYWJsZSBmcm9tIHRoZSBsb2dzLlxuICAgIHByaXZhdGUgYXN5bmMgYXBpUmV0cnlMb2dpYzxUPihcbiAgICAgICAgY29udGV4dDogc3RyaW5nLFxuICAgICAgICBmbmM6IChhcGk6IEIyQXBpKSA9PiBQcm9taXNlPFQ+LFxuICAgICAgICByZXRyaWVzID0gM1xuICAgICk6IFByb21pc2U8VD4ge1xuICAgICAgICBsZXQgYXBpOiBCMkFwaSB8IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGFwaSA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0QVBJKCk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZm5jKGFwaSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICBpZiAocmV0cmllcyA8PSAwKSB0aHJvdyBlcnI7XG5cbiAgICAgICAgICAgIC8vIElmIGl0J3MgYSA1MDMgYW5kIGl0J3MgYmVlbiBhIG1pbnV0ZSBzaW5jZSB3ZSBsYXN0IHJlc2V0LCB0aGVuIFdhaXQgYW5kIHJlc2V0LlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChlcnIuc3RhY2suaW5jbHVkZXMoYFwic3RhdHVzXCI6IDUwM2ApXG4gICAgICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgXCJzZXJ2aWNlX3VuYXZhaWxhYmxlXCJgKVxuICAgICAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYFwiaW50ZXJuYWxfZXJyb3JcImApXG4gICAgICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRU5PQlVGU2ApXG4gICAgICAgICAgICAgICAgKSAmJiBEYXRlLm5vdygpIC0gdGhpcy5sYXN0NTAzUmVzZXQgPiA2MCAqIDEwMDApIHtcbiAgICAgICAgICAgICAgICAvLyBCYWNrYmxhemUgaXMgc28gZmxha3kgdGhhdCB3ZSdyZSBqdXN0IGdvaW5nIHRvIHdhcm4gaGVyZS5cbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFske2NvbnRleHR9XSBCYWNrYmxhemUgZXJyb3IsIHdhaXRpbmcgYW5kIHJlc2V0dGluZzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgWyR7Y29udGV4dH1dIEJhY2tibGF6ZSBlcnJvciwgd2FpdGluZyBhbmQgcmVzZXR0aW5nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFJlc2V0ID0gdGhpcy5jdXJyZW50UmVzZXQgfHwgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoMTAgKiAxMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2hlY2sgYWdhaW4gaW4gY2FzZSwgYW5kIGluIHRoZSB2ZXJ5IGxpa2VseSBjYXNlIHRoYXQgdGhpcyBpcyBiZWluZyBydW4gaW4gcGFyYWxsZWwsIHdlIG9ubHkgd2FudCB0byByZXNldCBvbmNlLlxuICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMubGFzdDUwM1Jlc2V0ID4gNjAgKiAxMDAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyhgWyR7Y29udGV4dH1dIFJlc2V0dGluZyBnZXRBUEkgYW5kIGdldEJ1Y2tldEFQSTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdDUwM1Jlc2V0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldEFQSS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRCdWNrZXRBUEkucmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKCkuZmluYWxseSgoKSA9PiB0aGlzLmN1cnJlbnRSZXNldCA9IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jdXJyZW50UmVzZXQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpUmV0cnlMb2dpYyhjb250ZXh0LCBmbmMsIHJldHJpZXMgLSAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgdGhlIGVycm9yIGlzIHRoYXQgdGhlIGF1dGhvcml6YXRpb24gdG9rZW4gaXMgaW52YWxpZCwgcmVzZXQgZ2V0QnVja2V0QVBJIGFuZCBnZXRBUEkgSWYgdGhlIGVycm9yIGlzIHRoYXQgdGhlIGJ1Y2tldCBpc24ndCBmb3VuZCwgcmVzZXQgZ2V0QnVja2V0QVBJXG4gICAgICAgICAgICBpZiAoZXJyLnN0YWNrLmluY2x1ZGVzKGBcImV4cGlyZWRfYXV0aF90b2tlblwiYCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgWyR7Y29udGV4dH1dIEF1dGhvcml6YXRpb24gdG9rZW4gZXhwaXJlZGApO1xuICAgICAgICAgICAgICAgIGdldEFQSS5yZXNldCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QnVja2V0QVBJLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpUmV0cnlMb2dpYyhjb250ZXh0LCBmbmMsIHJldHJpZXMgLSAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGVyci5zdGFjay5pbmNsdWRlcyhgbm8gdG9tZXMgYXZhaWxhYmxlYClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYEVUSU1FRE9VVGApXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGBzb2NrZXQgaGFuZyB1cGApXG4gICAgICAgICAgICAgICAgLy8gRWguLi4gdGhpcyBtaWdodCBiZSBiYWQsIGJ1dC4uLiBJIHRoaW5rIHdlIGp1c3QgZ2V0IHJhbmRvbSA0MDAgZXJyb3JzLiBJZiB0aGlzIHNwYW1zIGVycm9ycywgd2UgY2FuIHJlbW92ZSB0aGlzIGxpbmUuXG4gICAgICAgICAgICAgICAgfHwgZXJyLnN0YWNrLmluY2x1ZGVzKGA0MDAgQmFkIFJlcXVlc3RgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgZ2V0YWRkcmluZm8gRU5PVEZPVU5EYClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYEVDT05OUkVTRVRgKVxuICAgICAgICAgICAgICAgIHx8IGVyci5zdGFjay5pbmNsdWRlcyhgRUNPTk5SRUZVU0VEYClcbiAgICAgICAgICAgICAgICB8fCBlcnIuc3RhY2suaW5jbHVkZXMoYEVOT0JVRlNgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBbJHtjb250ZXh0fV0gUmV0cnlpbmcgaW4gNXM6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coYFske2NvbnRleHR9XSAke2Vyci5tZXNzYWdlfSByZXRyeWluZyBpbiA1c2ApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KDUwMDApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaVJldHJ5TG9naWMoY29udGV4dCwgZm5jLCByZXRyaWVzIC0gMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlcnIuc3RhY2suaW5jbHVkZXMoYGdldGFkZHJpbmZvIEVOT1RGT1VORGApKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFwaSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsT2JqID0gbmV3IFVSTChhcGkuYXBpVXJsKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhvc3RuYW1lID0gdXJsT2JqLmhvc3RuYW1lO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbG9va3VwQWRkcmVzc2VzID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkbnMubG9va3VwKGhvc3RuYW1lLCAoZXJyLCBhZGRyZXNzZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGFkZHJlc3Nlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNvbHZlQWRkcmVzc2VzID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkbnMucmVzb2x2ZTQoaG9zdG5hbWUsIChlcnIsIGFkZHJlc3NlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYWRkcmVzc2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgWyR7Y29udGV4dH1dIGdldGFkZHJpbmZvIEVOT1RGT1VORCAke2hvc3RuYW1lfWAsIHsgbG9va3VwQWRkcmVzc2VzLCByZXNvbHZlQWRkcmVzc2VzLCBhcGlVcmw6IGFwaS5hcGlVcmwsIGZ1bGxFcnJvcjogZXJyLnN0YWNrIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC5kYXRhIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldDIoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBkb3dubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgdGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBjb25zdCBkb3dubG9hZFBvbGwgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFkb3dubG9hZGluZykgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBCYWNrYmxhemUgZG93bmxvYWQgaW4gcHJvZ3Jlc3MgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGRvd25sb2FkUG9sbCwgNTAwMCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc2V0VGltZW91dChkb3dubG9hZFBvbGwsIDUwMDApO1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgZ2V0ICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfT4gPT4ge1xuICAgICAgICAgICAgICAgIGxldCByYW5nZSA9IGNvbmZpZz8ucmFuZ2U7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjbGFtcCBuZWVkcyB0aGUgZmlsZSdzIHNpemUgKGFuZCBnaXZlcyB1cyBpdHMgbWV0YWRhdGEgZm9yIGZyZWUpXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaWxlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmlsZUluZm8pIHRocm93IG5ldyBFcnJvcihgRmlsZSAke2ZpbGVOYW1lfSBub3QgZm91bmRgKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlU3RhcnQgPSByYW5nZS5zdGFydDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlRW5kID0gTWF0aC5taW4ocmFuZ2UuZW5kLCBmaWxlSW5mby5zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogSSB0aGluayBpZiB3ZSByZXF1ZXN0IG5vdGhpbmcsIGl0IGNvbmZ1c2VzIEJhY2tibGF6ZSBhbmQgZW5kcyB1cCBnaXZpbmcgdXMgdGhlIGVudGlyZSBmaWxlLlxuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VFbmQgPD0gcmFuZ2VTdGFydCkgcmV0dXJuIHsgZGF0YTogQnVmZmVyLmFsbG9jKDApLCB3cml0ZVRpbWU6IGZpbGVJbmZvLndyaXRlVGltZSwgc2l6ZTogZmlsZUluZm8uc2l6ZSB9O1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGFwaS5kb3dubG9hZEZpbGVCeU5hbWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0TmFtZTogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZTogeyBzdGFydDogcmFuZ2VTdGFydCwgZW5kOiByYW5nZUVuZCB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoICE9PSByYW5nZUVuZCAtIHJhbmdlU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEJhY2tibGF6ZSByYW5nZSBkb3dubG9hZCByZXR1cm5lZCB0aGUgd3JvbmcgbnVtYmVyIG9mIGJ5dGVzLiBUcmllZCB0byBnZXQgJHtyYW5nZVN0YXJ0fS0ke3JhbmdlRW5kfSwgYnV0IHJlY2VpdmVkICR7cmFuZ2VTdGFydH0tJHtyYW5nZVN0YXJ0ICsgZGF0YS5sZW5ndGh9LiBGb3IgZmlsZTogJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IGZpbGVJbmZvLndyaXRlVGltZSwgc2l6ZTogZmlsZUluZm8uc2l6ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUaGUgZG93bmxvYWQncyBvd24gcmVzcG9uc2UgaGVhZGVycyBjYXJyeSB0aGUgbWV0YWRhdGEsIHNvIGEgZnVsbCByZWFkIGlzIGEgc2luZ2xlIEFQSSBjYWxsXG4gICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlOiBIdHRwc1Jlc3BvbnNlSW5mbyA9IHsgaGVhZGVyczoge30gfTtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGFwaS5kb3dubG9hZEZpbGVCeU5hbWUoe1xuICAgICAgICAgICAgICAgICAgICBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBvdXRSZXNwb25zZTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IG1ldGEgPSBwYXJzZUZpbGVNZXRhZGF0YUhlYWRlcnMocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGEsIHdyaXRlVGltZTogbWV0YS51cGxvYWRUaW1lc3RhbXAsIHNpemU6IGRhdGEubGVuZ3RoIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCB0aW1lU3RyID0gZm9ybWF0VGltZShEYXRlLm5vdygpIC0gdGltZSk7XG4gICAgICAgICAgICBsZXQgcmF0ZVN0ciA9IGZvcm1hdE51bWJlcihyZXN1bHQuZGF0YS5sZW5ndGggLyAoRGF0ZS5ub3coKSAtIHRpbWUpICogMTAwMCkgKyBcIkIvc1wiO1xuICAgICAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSBkb3dubG9hZCAoJHtmb3JtYXROdW1iZXIocmVzdWx0LmRhdGEubGVuZ3RoKX1CJHtjb25maWc/LnJhbmdlICYmIGAsICR7Zm9ybWF0TnVtYmVyKGNvbmZpZy5yYW5nZS5zdGFydCl9IC0gJHtmb3JtYXROdW1iZXIoY29uZmlnLnJhbmdlLmVuZCl9YCB8fCBcIlwifSkgaW4gJHt0aW1lU3RyfSAoJHtyYXRlU3RyfSwgJHtmaWxlTmFtZX0pYCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBPbmx5IGdlbnVpbmUgYWJzZW5jZSBtYXkgYmVjb21lIHVuZGVmaW5lZDogY2FsbGVycyB0cmVhdCB1bmRlZmluZWQgYXMgYXV0aG9yaXRhdGl2ZSBcInRoZSBidWNrZXQgZG9lcyBub3QgaG9sZCB0aGlzIGZpbGVcIiAoQmxvYlN0b3JlIGV2ZW4gZGVsZXRlcyBpbmRleCBlbnRyaWVzIG92ZXIgaXQpLCBzbyBhIHRyYW5zaWVudCBmYWlsdXJlICg1MDMsIGF1dGgsIHRpbWVvdXQpIG11c3QgdGhyb3cgaW5zdGVhZCBvZiBtYXNxdWVyYWRpbmcgYXMgYSBtaXNzaW5nIGZpbGVcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKTtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKGBcIm5vdF9mb3VuZFwiYCkgfHwgbWVzc2FnZS5pbmNsdWRlcyhgZmlsZV9ub3RfZm91bmRgKSB8fCBtZXNzYWdlLmluY2x1ZGVzKGBub3QgZm91bmRgKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgZmlsZSBkb2VzIG5vdCBleGlzdCAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgZG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYXBpID0gYXdhaXQgZ2V0QVBJKCk7XG4gICAgICAgICAgICAvLyBCMiB2MiBkb2N1bWVudHMgYWxsb3dlZCBhcyBhIHNpbmdsZSBvYmplY3Q7IG91ciB0eXBlIHNheXMgYSBsaXN0IC0gaGFuZGxlIGJvdGhcbiAgICAgICAgICAgIGxldCBhbGxvd2VkUmF3ID0gYXBpLmFsbG93ZWQgYXMgdW5rbm93bjtcbiAgICAgICAgICAgIGxldCBhbGxvd2VkTGlzdCA9IChBcnJheS5pc0FycmF5KGFsbG93ZWRSYXcpICYmIGFsbG93ZWRSYXcgfHwgW2FsbG93ZWRSYXddKSBhcyB0eXBlb2YgYXBpLmFsbG93ZWQ7XG4gICAgICAgICAgICByZXR1cm4gYWxsb3dlZExpc3Quc29tZShhbGxvd2VkID0+XG4gICAgICAgICAgICAgICAgYWxsb3dlZC5jYXBhYmlsaXRpZXMuaW5jbHVkZXMoXCJ3cml0ZUZpbGVzXCIpXG4gICAgICAgICAgICAgICAgJiYgKCFhbGxvd2VkLmJ1Y2tldE5hbWUgfHwgYWxsb3dlZC5idWNrZXROYW1lID09PSB0aGlzLmJ1Y2tldE5hbWUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBObyAvIGludmFsaWQgY3JlZGVudGlhbHNcbiAgICAgICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgaGFzV3JpdGVBY2Nlc3MgY2hlY2sgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoY29uZmlnPy5mb3JjZVNldEltbXV0YWJsZSAmJiAhY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JjZVNldEltbXV0YWJsZSByZXF1aXJlcyBsYXN0TW9kaWZpZWQgKHN5bmNocm9uaXphdGlvbiB3cml0ZXMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHdyaXRpbmcgJHtmaWxlTmFtZX0gdG8gJHt0aGlzLmdldERlYnVnTmFtZSgpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWc/Lmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQoY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5ub0NoZWNrcykge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpLiBCMiBzdGFtcHMgaXRzIG93biB1cGxvYWQgdGltZSwgc28gdGhlIGV4YWN0IGxhc3RNb2RpZmllZCBpcyBub3QgcHJlc2VydmVkIG9uIHRoZSBzdG9yZWQgZmlsZS5cbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgJiYgY29uZmlnLmxhc3RNb2RpZmllZCA8IGV4aXN0aW5nLndyaXRlVGltZSkgcmV0dXJuIGZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIC8vIEltbXV0YWJpbGl0eSB3aW5zOiBhIHN5bmNocm9uaXphdGlvbiBwdXNoIG5ldmVyIG92ZXJ3cml0ZXMgYW4gZXhpc3RpbmcgcGF0aCBvbiBhbiBpbW11dGFibGUgYnVja2V0IChzZWUgU2V0Q29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlKVxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBjb25maWcuZm9yY2VTZXRJbW11dGFibGUgJiYgdGhpcy5jb25maWcuaW1tdXRhYmxlKSByZXR1cm4gZmlsZU5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2coYGJhY2tibGF6ZSB1cGxvYWQgKCR7Zm9ybWF0TnVtYmVyKGRhdGEubGVuZ3RoKX1CKSAke2ZpbGVOYW1lfWApO1xuICAgICAgICBsZXQgZiA9IGZpbGVOYW1lO1xuICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYHVwbG9hZEZpbGUgJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBhcGkudXBsb2FkRmlsZSh7IGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLCBmaWxlTmFtZSwgZGF0YTogZGF0YSwgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWNvbmZpZz8ubm9DaGVja3MpIHtcbiAgICAgICAgICAgIGxldCBleGlzdHNDaGVja3MgPSAzMDtcbiAgICAgICAgICAgIHdoaWxlIChleGlzdHNDaGVja3MgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0cykgYnJlYWs7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoMTAwMCk7XG4gICAgICAgICAgICAgICAgZXhpc3RzQ2hlY2tzLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhpc3RzQ2hlY2tzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBGaWxlICR7ZmlsZU5hbWV9LyR7Zn0gd2FzIHVwbG9hZGVkLCBidXQgY291bGQgbm90IGJlIGZvdW5kIGFmdGVyd2FyZHMuIEhvcGVmdWxseSBpdCB3YXMganVzdCBkZWxldGVkLCB2ZXJ5IHF1aWNrbHk/IElmIGJhY2tibGF6ZSBpcyB0YWtpbmcgdG9vIGxvbmcgZm9yIGZpbGVzIHRvIHByb3BhZ2F0ZSwgdGhlbiB3ZSBtaWdodCBydW4gaW50byBpc3N1ZXMgd2l0aCB0aGUgZGF0YWJhc2UgYXRvbWljaXR5LmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGRlbChmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMubG9nKGBiYWNrYmxhemUgZGVsZXRlICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYGhpZGVGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5oaWRlRmlsZSh7IGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLCBmaWxlTmFtZTogZmlsZU5hbWUgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICB0aGlzLmxvZyhgYmFja2JsYXplIGVycm9yIGluIGhpZGUsIHBvc3NpYmx5IGFscmVhZHkgaGlkZGVuICR7ZmlsZU5hbWV9XFxuJHtlLnN0YWNrfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogRGVsZXRpb24gU0VFTVMgdG8gd29yay4gVGhpcyBET0VTIGJyZWFrIGlmIHdlIGRlbGV0ZSBhIGZpbGUgd2hpY2gga2VlcHMgYmVpbmcgcmVjcmVhdGVkLCBleCwgdGhlIGhlYXJ0YmVhdC4gbGV0IGV4aXN0c0NoZWNrcyA9IDEwOyB3aGlsZSAoZXhpc3RzQ2hlY2tzID4gMCkgeyBsZXQgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTsgaWYgKCFleGlzdHMpIGJyZWFrOyBhd2FpdCBkZWxheSgxMDAwKTsgZXhpc3RzQ2hlY2tzLS07IH0gaWYgKGV4aXN0c0NoZWNrcyA9PT0gMCkgeyBsZXQgZXhpc3RzID0gYXdhaXQgdGhpcy5nZXRJbmZvKGZpbGVOYW1lKTsgZGV2RGVidWdicmVhaygpOyBjb25zb2xlLndhcm4oYEZpbGUgJHtmaWxlTmFtZX0gd2FzIGRlbGV0ZWQsIGJ1dCB3YXMgc3RpbGwgZm91bmQgYWZ0ZXJ3YXJkc2ApOyBleGlzdHMgPSBhd2FpdCB0aGlzLmdldEluZm8oZmlsZU5hbWUpOyB9XG4gICAgfVxuXG4gICAgLy8gbGFzdE1vZGlmaWVkIGlzIGFjY2VwdGVkIGJ1dCBjYW5ub3QgYmUgaG9ub3JlZCAtIGIyIHN0YW1wcyBpdHMgb3duIHVwbG9hZFRpbWVzdGFtcCwgd2hpY2ggaXMgd2hhdCBvdXIgZ2V0SW5mby9maW5kSW5mbyByZXBvcnQgYXMgdGhlIHdyaXRlIHRpbWVcbiAgICBwdWJsaWMgYXN5bmMgc2V0TGFyZ2VGaWxlKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+OyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgICAgICAgbGV0IG9uRXJyb3I6ICgoKSA9PiBQcm9taXNlPHZvaWQ+KVtdID0gW107XG4gICAgICAgIGxldCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCB7IHBhdGggfSA9IGNvbmZpZztcbiAgICAgICAgICAgIC8vIEJhY2tibGF6ZSByZXF1aXJlcyA1TUIgY2h1bmtzLiBCdXQsIGxhcmdlciBpcyBtb3JlIGVmZmljaWVudCBmb3IgdXMuXG4gICAgICAgICAgICBjb25zdCBNSU5fQ0hVTktfU0laRSA9IDMyICogMTAyNCAqIDEwMjQ7XG4gICAgICAgICAgICBsZXQgZGF0YVF1ZXVlOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YVF1ZXVlLmxlbmd0aCkgcmV0dXJuIGRhdGFRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIC8vIEdldCBidWZmZXJzIHVudGlsIHdlIGdldCA1TUIsIE9SLCBlbmQuIEJhY2tibGF6ZSByZXF1aXJlcyB0aGlzIGZvciBsYXJnZSBmaWxlcy5cbiAgICAgICAgICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGJ1ZmZlcnM6IEJ1ZmZlcltdID0gW107XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRvdGFsQnl0ZXMgPCBNSU5fQ0hVTktfU0laRSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGNvbmZpZy5nZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBidWZmZXJzLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghYnVmZmVycy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYnVmZmVycyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBmaWxlTmFtZSA9IHBhdGg7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGdldE5leHREYXRhKCk7XG4gICAgICAgICAgICBpZiAoIWRhdGE/Lmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICAgICAgLy8gQmFja2JsYXplIGRpc2FsbG93cyBvdmVybHkgc21hbGwgZmlsZXNcbiAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA8IE1JTl9DSFVOS19TSVpFKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXQoZmlsZU5hbWUsIGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEJhY2tibGF6ZSBkaXNhbGxvd3MgbGVzcyB0aGFuIDIgY2h1bmtzXG4gICAgICAgICAgICBsZXQgc2Vjb25kRGF0YSA9IGF3YWl0IGdldE5leHREYXRhKCk7XG4gICAgICAgICAgICBpZiAoIXNlY29uZERhdGE/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0KGZpbGVOYW1lLCBkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBTFNPLCBpZiB0aGVyZSBhcmUgdHdvIGNodW5rcywgYnV0IG9uZSBpcyB0b28gc21hbGwsIGNvbWJpbmUgaXQuIFRoaXMgaGVscHMgYWxsb3cgdXMgbmV2ZXIgc2VuZCBzbWFsbCBjaHVua3MuXG4gICAgICAgICAgICBpZiAoc2Vjb25kRGF0YS5sZW5ndGggPCBNSU5fQ0hVTktfU0laRSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0KGZpbGVOYW1lLCBCdWZmZXIuY29uY2F0KFtkYXRhLCBzZWNvbmREYXRhXSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9nKGBVcGxvYWRpbmcgbGFyZ2UgZmlsZSAke2NvbmZpZy5wYXRofWApO1xuICAgICAgICAgICAgZGF0YVF1ZXVlLnVuc2hpZnQoZGF0YSwgc2Vjb25kRGF0YSk7XG5cblxuICAgICAgICAgICAgbGV0IHVwbG9hZEluZm8gPSBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYHN0YXJ0TGFyZ2VGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcGkuc3RhcnRMYXJnZUZpbGUoe1xuICAgICAgICAgICAgICAgICAgICBidWNrZXRJZDogdGhpcy5idWNrZXRJZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogXCJiMi94LWF1dG9cIixcbiAgICAgICAgICAgICAgICAgICAgZmlsZUluZm86IHt9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvbkVycm9yLnB1c2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgY2FuY2VsTGFyZ2VGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhcGkuY2FuY2VsTGFyZ2VGaWxlKHsgZmlsZUlkOiB1cGxvYWRJbmZvLmZpbGVJZCB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBMT0dfSU5URVJWQUwgPSB0aW1lSW5NaW51dGU7XG4gICAgICAgICAgICBsZXQgbmV4dExvZ1RpbWUgPSBEYXRlLm5vdygpICsgTE9HX0lOVEVSVkFMO1xuXG4gICAgICAgICAgICBsZXQgcGFydE51bWJlciA9IDE7XG4gICAgICAgICAgICBsZXQgcGFydFNoYTFBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGxldCB0b3RhbEJ5dGVzID0gMDtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGF3YWl0IGdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICAvLyBTby4uLiBpZiB0aGUgbmV4dCBjaHVuayBpcyB0aGUgbGFzdCBvbmUsIGNvbWJpbmUgaXQgd2l0aCB0aGUgY3VycmVudCBvbmUuIFRoaXMgcHJldmVudHMgQU5ZIHVwbG9hZHMgZnJvbSBiZWluZyA8IHRoZSB0aHJlc2hvbGQsIGFzIGFwcGFyZW50bHkgdGhlIFwibGFzdCBwYXJ0XCIgY2hlY2sgaW4gYmFja2JsYXplIGZhaWxzIHdoZW4gd2UgaGF2ZSB0byByZXRyeSBhbiB1cGxvYWQgKGR1ZSB0byBcIm5vIHRvbWVzIGF2YWlsYWJsZVwiKS4gV2VsbCBpdCBjYW4ndCBmYWlsIGlmIGV2ZW4gdGhlIGxhc3QgcGFydCBpcyA+IDVNQiwgbm93IGNhbiBpdCEgQlVULCBvbmx5IGlmIHRoaXMgaXNuJ3QgdGhlIGZpcnN0IGNodW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgdHJ5IHRvIHNlbmQgYSBzaW5nbGUgY2h1bmssIHdoaWNoIHdlIGNhbid0IGRvLlxuICAgICAgICAgICAgICAgIGlmIChwYXJ0U2hhMUFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1heWJlTGFzdERhdGEgPSBhd2FpdCBnZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF5YmVMYXN0RGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heWJlTGFzdERhdGEubGVuZ3RoIDwgTUlOX0NIVU5LX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIHRoZSBsYXN0IG9uZSwgc28gY29uc3VtZSBpdCBub3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gQnVmZmVyLmNvbmNhdChbZGF0YSwgbWF5YmVMYXN0RGF0YV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIG5vdCB0aGUgbGFzdCBvbmUuIFB1dCBpdCBiYWNrLCBpbiBjYXNlIHRoZSBvbmUgQUZURVIgaXMgdGhlIGxhc3Qgb25lLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gbWVyZ2UgbWF5YmVMYXN0RGF0YSB3aXRoIHRoZSBuZXh0IG5leHQgZGF0YS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUXVldWUudW5zaGlmdChtYXliZUxhc3REYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgc2hhMSA9IHJlcXVpcmUoXCJjcnlwdG9cIikuY3JlYXRlSGFzaChcInNoYTFcIik7XG4gICAgICAgICAgICAgICAgc2hhMS51cGRhdGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgbGV0IHNoYTFIZXggPSBzaGExLmRpZ2VzdChcImhleFwiKTtcbiAgICAgICAgICAgICAgICBwYXJ0U2hhMUFycmF5LnB1c2goc2hhMUhleCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGB1cGxvYWRQYXJ0IyR7cGFydE51bWJlcn0gJHtmaWxlTmFtZX1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YSkgdGhyb3cgbmV3IEVycm9yKFwiSW1wb3NzaWJsZSwgZGF0YSBpcyB1bmRlZmluZWRcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVTdHIgPSBmb3JtYXRUaW1lKERhdGUubm93KCkgLSB0aW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhdGVTdHIgPSBmb3JtYXROdW1iZXIodG90YWxCeXRlcyAvIChEYXRlLm5vdygpIC0gdGltZSkgKiAxMDAwKSArIFwiQi9zXCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKGBVcGxvYWRpbmcgbGFyZ2UgZmlsZSBwYXJ0ICR7cGFydE51bWJlcn0sIHVwbG9hZGVkICR7Ymx1ZShmb3JtYXROdW1iZXIodG90YWxCeXRlcykgKyBcIkJcIil9IGluICR7Ymx1ZSh0aW1lU3RyKX0gKCR7Ymx1ZShyYXRlU3RyKX0pLiAke2NvbmZpZy5wYXRofWApO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGRhdGEubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwaS51cGxvYWRQYXJ0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVJZDogdXBsb2FkSW5mby5maWxlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TnVtYmVyOiBwYXJ0TnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYTE6IHNoYTFIZXgsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHBhcnROdW1iZXIrKztcblxuICAgICAgICAgICAgICAgIGlmIChEYXRlLm5vdygpID4gbmV4dExvZ1RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dExvZ1RpbWUgPSBEYXRlLm5vdygpICsgTE9HX0lOVEVSVkFMO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGltZVN0ciA9IGZvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHRpbWUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmF0ZVN0ciA9IGZvcm1hdE51bWJlcih0b3RhbEJ5dGVzIC8gKERhdGUubm93KCkgLSB0aW1lKSAqIDEwMDApICsgXCJCL3NcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFN0aWxsIHVwbG9hZGluZyBsYXJnZSBmaWxlIGF0ICR7RGF0ZS5ub3coKX0uIFVwbG9hZGVkICR7Zm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpfUIgaW4gJHt0aW1lU3RyfSAoJHtyYXRlU3RyfSkuICR7Y29uZmlnLnBhdGh9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2coYEZpbmlzaGVkIHVwbG9hZGluZyBsYXJnZSBmaWxlIHVwbG9hZGVkICR7Z3JlZW4oZm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpKX1CYCk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgZmluaXNoTGFyZ2VGaWxlICR7ZmlsZU5hbWV9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5maW5pc2hMYXJnZUZpbGUoe1xuICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IHVwbG9hZEluZm8uZmlsZUlkLFxuICAgICAgICAgICAgICAgICAgICBwYXJ0U2hhMUFycmF5OiBwYXJ0U2hhMUFycmF5LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgZm9yIChsZXQgYyBvZiBvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYygpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgZHVyaW5nIGVycm9yIGNsZWFuLiBJZ25vcmluZywgd2Ugd2lsbCByZXRocm93IHRoZSBvcmlnaW5hbCBlcnJvciwgcGF0aCAke2NvbmZpZy5wYXRofWAsIGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBzZXRMYXJnZUZpbGUgZm9yICR7Y29uZmlnLnBhdGh9OiAke2Uuc3RhY2t9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgZ2V0SW5mbyAke2ZpbGVOYW1lfWAsIGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBhd2FpdCBhcGkuaGVhZEZpbGVCeU5hbWUoeyBidWNrZXROYW1lOiB0aGlzLmJ1Y2tldE5hbWUsIGZpbGVOYW1lIH0pO1xuICAgICAgICAgICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyhgQmFja2JsYXplIGZpbGUgbm90IGV4aXN0cyAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmxvZyhgQmFja2JsYXplIGZpbGUgZXhpc3RzICR7ZmlsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVUaW1lOiBmaWxlLnVwbG9hZFRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogZmlsZS5zaXplLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5zdGFjay5pbmNsdWRlcyhgZmlsZV9ub3RfZm91bmRgKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyhgQmFja2JsYXplIGZpbGUgbm90IGV4aXN0cyAke2ZpbGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBGb3IgZXhhbXBsZSBmaW5kRmlsZU5hbWVzKFwiaXBzL1wiKVxuICAgIHB1YmxpYyBhc3luYyBmaW5kKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlOiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXN1bHQubWFwKHggPT4geC5wYXRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENoYW5nZXNBZnRlcjIoY29uZmlnOiBDaGFuZ2VzQWZ0ZXJDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIC8vIE5vIG5hdGl2ZSBjaGFuZ2UgZmVlZCAoYjIgc3VwcG9ydHMgbmVpdGhlciB0aW1lIG5vciByb3V0ZSBmaWx0ZXJpbmcpIC0gYSBmdWxsIGxpc3RpbmcgZmlsdGVyZWQgaW4gbWVtb3J5XG4gICAgICAgIHJldHVybiBmaWx0ZXJDaGFuZ2VzKGF3YWl0IHRoaXMuZmluZEluZm8oXCJcIiksIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlOiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTx7IHBhdGg6IHN0cmluZzsgY3JlYXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IH1bXT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBmaW5kSW5mbyAke3ByZWZpeH1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZz8uc2hhbGxvdyAmJiBjb25maWc/LnR5cGUgPT09IFwiZm9sZGVyc1wiKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFsbEZpbGVzID0gYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgpO1xuICAgICAgICAgICAgICAgIGxldCBhbGxGb2xkZXJzID0gbmV3IE1hcDxzdHJpbmcsIHsgcGF0aDogc3RyaW5nOyBjcmVhdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9PigpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHsgcGF0aCwgY3JlYXRlVGltZSwgc2l6ZSB9IG9mIGFsbEZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2xkZXIgPSBwYXRoLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSkuam9pbihcIi9cIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZm9sZGVyKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgYWxsRm9sZGVycy5zZXQoZm9sZGVyLCB7IHBhdGg6IGZvbGRlciwgY3JlYXRlVGltZSwgc2l6ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oYWxsRm9sZGVycy52YWx1ZXMoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZmlsZXMgPSBuZXcgTWFwPHN0cmluZywgeyBwYXRoOiBzdHJpbmc7IGNyZWF0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB9PigpO1xuICAgICAgICAgICAgbGV0IHN0YXJ0RmlsZU5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXBpLmxpc3RGaWxlTmFtZXMoe1xuICAgICAgICAgICAgICAgICAgICBidWNrZXRJZDogdGhpcy5idWNrZXRJZCxcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiBwcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1heEZpbGVDb3VudDogMTAwMCxcbiAgICAgICAgICAgICAgICAgICAgZGVsaW1pdGVyOiBjb25maWc/LnNoYWxsb3cgPyBcIi9cIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBmaWxlIG9mIHJlc3VsdC5maWxlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5hY3Rpb24gPT09IFwidXBsb2FkXCIgJiYgY29uZmlnPy50eXBlICE9PSBcImZvbGRlcnNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMuc2V0KGZpbGUuZmlsZU5hbWUsIHsgcGF0aDogZmlsZS5maWxlTmFtZSwgY3JlYXRlVGltZTogZmlsZS51cGxvYWRUaW1lc3RhbXAsIHNpemU6IGZpbGUuY29udGVudExlbmd0aCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlLmFjdGlvbiA9PT0gXCJmb2xkZXJcIiAmJiBjb25maWc/LnR5cGUgPT09IFwiZm9sZGVyc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9sZGVyID0gZmlsZS5maWxlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb2xkZXIuZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyID0gZm9sZGVyLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLnNldChmb2xkZXIsIHsgcGF0aDogZm9sZGVyLCBjcmVhdGVUaW1lOiBmaWxlLnVwbG9hZFRpbWVzdGFtcCwgc2l6ZTogZmlsZS5jb250ZW50TGVuZ3RoIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RhcnRGaWxlTmFtZSA9IHJlc3VsdC5uZXh0RmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKCFzdGFydEZpbGVOYW1lKSBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGZpbGVzLnZhbHVlcygpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFzc2VydFBhdGhWYWxpZChwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGJ5dGVzID0gQnVmZmVyLmZyb20ocGF0aCwgXCJ1dGY4XCIpO1xuICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoID4gMTAwMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoIHRvbyBsb25nOiAke3BhdGgubGVuZ3RofSBjaGFyYWN0ZXJzID4gMTAwMCBjaGFyYWN0ZXJzLiBQYXRoOiAke3BhdGh9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbW92ZShjb25maWc6IHtcbiAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICB0YXJnZXQ6IElBcmNoaXZlcztcbiAgICAgICAgdGFyZ2V0UGF0aDogc3RyaW5nO1xuICAgICAgICBjb3B5SW5zdGVhZD86IGJvb2xlYW47XG4gICAgfSkge1xuICAgICAgICBsZXQgeyBwYXRoLCB0YXJnZXQsIHRhcmdldFBhdGggfSA9IGNvbmZpZztcbiAgICAgICAgLy8gQSBzZWxmIG1vdmUgc2hvdWxkIE5PT1AgKGFuZCBkZWZpbml0ZWx5IG5vdCBjb3B5LCBhbmQgdGhlbiBkZWxldGUgaXRzZWxmISlcbiAgICAgICAgaWYgKHRhcmdldCA9PT0gdGhpcyAmJiBwYXRoID09PSB0YXJnZXRQYXRoKSB7XG4gICAgICAgICAgICB0aGlzLmxvZyhgQmFja2JsYXplIG1vdmUgcGF0aCB0byBpdHNlbGYuIFNraXBwaW5nIG1vdmUsIGFzIHRoZXJlIGlzIG5vIHdvcmsgdG8gZG8uICR7cGF0aH1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQXJjaGl2ZXNCYWNrYmxhemUpIHtcbiAgICAgICAgICAgIGxldCB0YXJnZXRCdWNrZXRJZCA9IHRhcmdldC5idWNrZXRJZDtcbiAgICAgICAgICAgIGlmICh0YXJnZXRCdWNrZXRJZCA9PT0gdGhpcy5idWNrZXRJZCAmJiBwYXRoID09PSB0YXJnZXRQYXRoKSByZXR1cm47XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwaVJldHJ5TG9naWMoYG1vdmUgJHtwYXRofSAtPiAke3RhcmdldFBhdGh9YCwgYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFVnaC4uLiBsaXN0aW5nIHRoZSBmaWxlIG5hbWUgc3Vja3MsIGJ1dC4uLiBJIGd1ZXNzIGl0J3Mgc3RpbGwgYmV0dGVyIHRoYW4gZG93bmxvYWRpbmcgYW5kIHJlLXVwbG9hZGluZyB0aGUgZW50aXJlIGZpbGUuXG4gICAgICAgICAgICAgICAgbGV0IGluZm8gPSBhd2FpdCBhcGkubGlzdEZpbGVOYW1lcyh7IGJ1Y2tldElkOiB0aGlzLmJ1Y2tldElkLCBwcmVmaXg6IHBhdGgsIG1heEZpbGVDb3VudDogMTAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBpbmZvLmZpbGVzLmZpbmQoeCA9PiB4LmZpbGVOYW1lID09PSBwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZpbGUpIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQgdG8gbW92ZTogJHtwYXRofWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5jb3B5RmlsZSh7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVJZDogZmlsZS5maWxlSWQsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiB0YXJnZXRQYXRoLFxuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldElkOiB0YXJnZXRCdWNrZXRJZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmdldChwYXRoKTtcbiAgICAgICAgICAgIGlmICghZGF0YSkgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZCB0byBtb3ZlOiAke3BhdGh9YCk7XG4gICAgICAgICAgICBhd2FpdCB0YXJnZXQuc2V0KHRhcmdldFBhdGgsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb25maWcuY29weUluc3RlYWQpIHtcbiAgICAgICAgICAgIGxldCBleGlzdHMgPSBhd2FpdCB0aGlzLmdldEluZm8odGFyZ2V0UGF0aCk7XG4gICAgICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZpbGUgbm90IGZvdW5kIGFmdGVyIG1vdmUuIExlYXZpbmcgQk9USCBmaWxlcy4gJHt0YXJnZXRQYXRofSB3YXMgbm90IGZvdW5kLiBCZWluZyBtb3ZlZCBmcm9tICR7cGF0aH1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWwocGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY29weShjb25maWc6IHtcbiAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICB0YXJnZXQ6IElBcmNoaXZlcztcbiAgICAgICAgdGFyZ2V0UGF0aDogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW92ZSh7IC4uLmNvbmZpZywgY29weUluc3RlYWQ6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFVSTChwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpUmV0cnlMb2dpYyhgZ2V0VVJMICR7cGF0aH1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGFwaS5nZXREb3dubG9hZFVSTChcImZpbGUvXCIgKyB0aGlzLmJ1Y2tldE5hbWUgKyBcIi9cIiArIHBhdGgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RG93bmxvYWRBdXRob3JpemF0aW9uKGNvbmZpZzoge1xuICAgICAgICBmaWxlTmFtZVByZWZpeD86IHN0cmluZztcbiAgICAgICAgdmFsaWREdXJhdGlvbkluU2Vjb25kczogbnVtYmVyO1xuICAgICAgICBiMkNvbnRlbnREaXNwb3NpdGlvbj86IHN0cmluZztcbiAgICAgICAgYjJDb250ZW50TGFuZ3VhZ2U/OiBzdHJpbmc7XG4gICAgICAgIGIyRXhwaXJlcz86IHN0cmluZztcbiAgICAgICAgYjJDYWNoZUNvbnRyb2w/OiBzdHJpbmc7XG4gICAgICAgIGIyQ29udGVudEVuY29kaW5nPzogc3RyaW5nO1xuICAgICAgICBiMkNvbnRlbnRUeXBlPzogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPHtcbiAgICAgICAgYnVja2V0SWQ6IHN0cmluZztcbiAgICAgICAgZmlsZU5hbWVQcmVmaXg6IHN0cmluZztcbiAgICAgICAgYXV0aG9yaXphdGlvblRva2VuOiBzdHJpbmc7XG4gICAgfT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGlSZXRyeUxvZ2ljKGBnZXREb3dubG9hZEF1dGhvcml6YXRpb24gJHtjb25maWcuZmlsZU5hbWVQcmVmaXggPz8gXCJcIn1gLCBhc3luYyAoYXBpKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXBpLmdldERvd25sb2FkQXV0aG9yaXphdGlvbih7XG4gICAgICAgICAgICAgICAgYnVja2V0SWQ6IHRoaXMuYnVja2V0SWQsXG4gICAgICAgICAgICAgICAgZmlsZU5hbWVQcmVmaXg6IGNvbmZpZy5maWxlTmFtZVByZWZpeCA/PyBcIlwiLFxuICAgICAgICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qXG5OYW1lcyBzaG91bGQgYmUgYSBVVEYtOCBzdHJpbmcgdXAgdG8gMTAyNCBieXRlcyB3aXRoIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczpcbiAgICBDaGFyYWN0ZXIgY29kZXMgYmVsb3cgMzIgYXJlIG5vdCBhbGxvd2VkLlxuICAgIERFTCBjaGFyYWN0ZXJzICgxMjcpIGFyZSBub3QgYWxsb3dlZC5cbiAgICBCYWNrc2xhc2hlcyBhcmUgbm90IGFsbG93ZWQuXG4gICAgRmlsZSBuYW1lcyBjYW5ub3Qgc3RhcnQgd2l0aCAvLCBlbmQgd2l0aCAvLCBvciBjb250YWluIC8vLlxuKi9cblxuXG5leHBvcnQgY29uc3QgZ2V0QXJjaGl2ZXNCYWNrYmxhemUgPSBjYWNoZSgoZG9tYWluOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQmFja2JsYXplKHsgYnVja2V0TmFtZTogZG9tYWluIH0pO1xufSk7XG5leHBvcnQgY29uc3QgZ2V0QXJjaGl2ZXNCYWNrYmxhemVQcml2YXRlSW1tdXRhYmxlID0gY2FjaGUoKGRvbWFpbjogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBBcmNoaXZlc0JhY2tibGF6ZSh7XG4gICAgICAgIGJ1Y2tldE5hbWU6IGRvbWFpbiArIFwiLXByaXZhdGUtaW1tdXRhYmxlXCIsXG4gICAgICAgIGltbXV0YWJsZTogdHJ1ZVxuICAgIH0pO1xufSk7XG5leHBvcnQgY29uc3QgZ2V0QXJjaGl2ZXNCYWNrYmxhemVQdWJsaWNJbW11dGFibGUgPSBjYWNoZSgoZG9tYWluOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQmFja2JsYXplKHtcbiAgICAgICAgYnVja2V0TmFtZTogZG9tYWluICsgXCItcHVibGljLWltbXV0YWJsZVwiLFxuICAgICAgICBwdWJsaWM6IHRydWUsXG4gICAgICAgIGltbXV0YWJsZTogdHJ1ZSxcbiAgICAgICAgYWxsb3dlZE9yaWdpbnM6IFtgaHR0cHM6Ly8ke2RvbWFpbn1gLCBgaHR0cHM6Ly8xMjctMC0wLTEuJHtkb21haW59OjcwMDdgXSxcbiAgICB9KTtcbn0pO1xuXG4vLyBOT1RFOiBDYWNoZSBieSBhIG1pbnV0ZS4gVGhpcyBtaWdodCBiZSBhIGJhZCBpZGVhLCBidXQuLi4gdXN1YWxseSB3aG9sZSByZWFzb24gZm9yIHB1YmxpYyBpcyBmb3IgY2xvdWRmbGFyZSBjYWNoaW5nIChhcyBvdGhlcndpc2Ugd2UgY2FuIGp1c3QgYWNjZXNzIGl0IHRocm91Z2ggYSBzZXJ2ZXIpLCBvciBmb3IgbGFyZ2UgZmlsZXMgKHdoaWNoIHNob3VsZCBiZSBjYWNoZWQgYW55d2F5cywgYW5kIHByb2JhYmx5IGV2ZW4gdXNlIGltbXV0YWJsZSBjYWNoaW5nKS5cbmV4cG9ydCBjb25zdCBnZXRBcmNoaXZlc0JhY2tibGF6ZVB1YmxpYyA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoe1xuICAgICAgICBidWNrZXROYW1lOiBkb21haW4gKyBcIi1wdWJsaWNcIixcbiAgICAgICAgcHVibGljOiB0cnVlLFxuICAgICAgICBjYWNoZVRpbWU6IHRpbWVJbk1pbnV0ZSxcbiAgICAgICAgYWxsb3dlZE9yaWdpbnM6IFtgaHR0cHM6Ly8ke2RvbWFpbn1gLCBgaHR0cHM6Ly8xMjctMC0wLTEuJHtkb21haW59OjcwMDdgXSxcbiAgICB9KTtcbn0pOyJdfQ==
829
+ /* _JS_SOURCE_HASH = "d293add89335f85036be1ab5c2aa679947c1c0ccef123ffc57374201ae07a6db"; */
@@ -60,6 +60,7 @@ export type BlobSourceSpec = {
60
60
  validWindow: [number, number];
61
61
  route?: [number, number];
62
62
  noFullSync?: boolean;
63
+ intermediate?: boolean;
63
64
  create: () => IArchives;
64
65
  };
65
66
  export declare class BlobStore implements IBucketStore {
@@ -138,6 +139,7 @@ export declare class BlobStore implements IBucketStore {
138
139
  }>;
139
140
  private flushIndex;
140
141
  private runSourceSync;
142
+ private isDeadIntermediate;
141
143
  private scanSource;
142
144
  private reconcileSource;
143
145
  private updateScanIndex;