@workflow/world-local 5.0.0-beta.24 → 5.0.0-beta.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/fs.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"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"}
package/dist/fs.js CHANGED
@@ -474,30 +474,35 @@ export async function paginatedFileSystemQuery(config) {
474
474
  return true;
475
475
  });
476
476
  }
477
- // 4. Load files individually and collect valid items
477
+ // 4. Load files with bounded concurrency and collect valid items.
478
+ // Reads are independent; ordering is restored by the sort below.
479
+ const readConcurrency = 32;
478
480
  const validItems = [];
479
- for (const fileId of candidateFileIds) {
480
- const filePath = path.join(resolvedDirectory, `${fileId}.json`);
481
- let item = null;
482
- try {
483
- const cachedItem = cachedItems?.get(filePath);
484
- item =
485
- cachedItem === undefined
481
+ for (let batchStart = 0; batchStart < candidateFileIds.length; batchStart += readConcurrency) {
482
+ const batch = candidateFileIds.slice(batchStart, batchStart + readConcurrency);
483
+ const loadedBatch = await Promise.all(batch.map(async (fileId) => {
484
+ const filePath = path.join(resolvedDirectory, `${fileId}.json`);
485
+ try {
486
+ const cachedItem = cachedItems?.get(filePath);
487
+ return cachedItem === undefined
486
488
  ? await readJSON(filePath, schema)
487
489
  : structuredClone(cachedItem);
488
- }
489
- catch (error) {
490
- // We don't expect zod errors to happen, but if the JSON does get malformed,
491
- // we skip the item. Preferably, we'd have a way to mark items as malformed,
492
- // so that the UI can display them as such, with richer messaging. In the meantime,
493
- // we just log a warning and skip the item.
494
- if (error instanceof z.ZodError) {
495
- console.warn(`Skipping item ${fileId} due to malformed JSON: ${error.message}`);
496
- continue;
497
490
  }
498
- throw error;
499
- }
500
- if (item) {
491
+ catch (error) {
492
+ // We don't expect zod errors to happen, but if the JSON does get malformed,
493
+ // we skip the item. Preferably, we'd have a way to mark items as malformed,
494
+ // so that the UI can display them as such, with richer messaging. In the meantime,
495
+ // we just log a warning and skip the item.
496
+ if (error instanceof z.ZodError) {
497
+ console.warn(`Skipping item ${fileId} due to malformed JSON: ${error.message}`);
498
+ return null;
499
+ }
500
+ throw error;
501
+ }
502
+ }));
503
+ for (const item of loadedBatch) {
504
+ if (!item)
505
+ continue;
501
506
  // Apply custom filter early if provided
502
507
  if (filter && !filter(item))
503
508
  continue;
@@ -559,4 +564,4 @@ export async function paginatedFileSystemQuery(config) {
559
564
  hasMore,
560
565
  };
561
566
  }
562
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRW5EOzs7OztHQUtHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFjO0lBQ3RDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2YsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGtCQUFrQjtJQUN6RCxZQUFZLElBQVksRUFBRSxLQUFhO1FBQ3JDLEtBQUssQ0FDSCxVQUFVLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsNkRBQTZELENBQ3hHLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDO0lBQ3BDLENBQUM7SUFF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UUFFRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FBQztJQUVILHNCQUFzQjtJQUN0QixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUMxQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDaEUsTUFBTSxVQUFVLEdBQ2QsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ2QsQ0FBQyxDQUFDLFlBQVksQ0FDVixLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQ2pDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQ2pDO1FBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUVYLE9BQU87UUFDTCxJQUFJLEVBQUUsS0FBSztRQUNYLE1BQU0sRUFBRSxVQUFVO1FBQ2xCLE9BQU87S0FDUixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgRW50aXR5Q29uZmxpY3RFcnJvciwgV29ya2Zsb3dXb3JsZEVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFBhZ2luYXRlZFJlc3BvbnNlIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5jb25zdCB1bGlkID0gbW9ub3RvbmljRmFjdG9yeSgoKSA9PiBNYXRoLnJhbmRvbSgpKTtcblxuLyoqXG4gKiBUcnVuY2F0ZSBhIHBvc3NpYmx5LXVudHJ1c3RlZCB2YWx1ZSBmb3IgaW5jbHVzaW9uIGluIGFuIGVycm9yIG1lc3NhZ2UuXG4gKiBLZWVwcyBlcnJvciBvdXRwdXQgYWN0aW9uYWJsZSBmb3IgZGV2ZWxvcGVycyBpbiBkZXYgbW9kZSB3aGlsZSBsaW1pdGluZ1xuICogdGhlIGFtb3VudCBvZiBhdHRhY2tlci1jb250cm9sbGVkIGRhdGEgcmVmbGVjdGVkIGJhY2sgaWYgYSBgd29ybGQtbG9jYWxgXG4gKiBiYWNrZW5kIGlzIGV2ZXIgcnVuIGluIGEgY29udGV4dCB0aGF0IHN1cmZhY2VzIHRoZXNlIG1lc3NhZ2VzIHRvIGNsaWVudHMuXG4gKi9cbmZ1bmN0aW9uIHRydW5jYXRlRm9yRXJyb3IodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBzID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogU3RyaW5nKHZhbHVlKTtcbiAgY29uc3QgTUFYID0gNDg7XG4gIHJldHVybiBzLmxlbmd0aCA+IE1BWCA/IGAke3Muc2xpY2UoMCwgTUFYKX3igKZgIDogcztcbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIGNhbGxlci1zdXBwbGllZCBlbnRpdHkgSUQgY29udGFpbnMgY2hhcmFjdGVycyB0aGF0IHdvdWxkXG4gKiBlc2NhcGUgdGhlIHN0b3JhZ2Ugcm9vdCAocGF0aCB0cmF2ZXJzYWwpIG9yIG90aGVyd2lzZSBwcm9kdWNlIGFuIHVuc2FmZVxuICogZmlsZW5hbWUuIEV4dGVuZHMge0BsaW5rIFdvcmtmbG93V29ybGRFcnJvcn0gc28gdGhlIHBsYXRmb3JtJ3Mgc3RhbmRhcmRcbiAqIGVycm9yLXRvLUhUVFAgbWFwcGluZyBoYW5kbGVzIGl0IGFsb25nc2lkZSBvdGhlciB3b3JsZC1sYXllciBlcnJvcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbnNhZmVFbnRpdHlJZEVycm9yIGV4dGVuZHMgV29ya2Zsb3dXb3JsZEVycm9yIHtcbiAgY29uc3RydWN0b3Ioa2luZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBgVW5zYWZlICR7a2luZH0gXCIke3RydW5jYXRlRm9yRXJyb3IodmFsdWUpfVwiOiBtdXN0IG5vdCBiZSBlbXB0eSwgY29udGFpbiBcIi5cIiwgXCIvXCIsIFwiXFxcXFwiLCBvciBudWxsIGJ5dGVzYFxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ1Vuc2FmZUVudGl0eUlkRXJyb3InO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVW5zYWZlRW50aXR5SWRFcnJvciB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3IgJiYgdmFsdWUubmFtZSA9PT0gJ1Vuc2FmZUVudGl0eUlkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgdGhhdCBhIHN0cmluZyBpcyBzYWZlIHRvIGVtYmVkIGluIGEgZmlsZXN5c3RlbSBwYXRoIGFzIGEgc2luZ2xlXG4gKiBwYXRoIGNvbXBvbmVudC4gUmVqZWN0cyB2YWx1ZXMgdGhhdCBhcmU6XG4gKiAgIC0gZW1wdHlcbiAqICAgLSBzdGFydGluZyB3aXRoIGAuYCAoYmxvY2tzIGAuYCwgYC4uYCwgYC5sb2Nrc2AsIGAudG1wYCwgYW5kIG90aGVyXG4gKiAgICAgaGlkZGVuIG9yIHJlc2VydmVkIGZpbGVuYW1lcylcbiAqICAgLSBjb250YWluaW5nIGAuYCAod291bGQgY29sbGlkZSB3aXRoIHRoZSBgLnRhZ2AgLyBgLmpzb25gIHN1ZmZpeCB0aGVcbiAqICAgICB0YWdnaW5nIGxvZ2ljIHN0cmlwcyBmcm9tIGZpbGVuYW1lczsgc2VlIHtAbGluayBzdHJpcFRhZ30gL1xuICogICAgIHtAbGluayBnZXRPYmplY3RDcmVhdGVkQXR9KVxuICogICAtIGNvbnRhaW5pbmcgYC9gLCBgXFxgLCBvciBhIE5VTCBieXRlXG4gKlxuICogVGhpcyBpcyB0aGUgcHJpbWFyeSBkZWZlbnNlIGFnYWluc3QgcGF0aC10cmF2ZXJzYWwgYXR0YWNrcyB3aGVyZSBhXG4gKiByZXF1ZXN0IGJvZHkgc3VwcGxpZXMgYSBgcnVuSWRgIC8gYHN0ZXBJZGAgLyBgY29ycmVsYXRpb25JZGAgY29udGFpbmluZ1xuICogYC4uL2Agc2VxdWVuY2VzIHRvIHJlYWQgb3Igd3JpdGUgZmlsZXMgb3V0c2lkZSB0aGUgc3RvcmFnZSByb290LlxuICoge0BsaW5rIHJlc29sdmVXaXRoaW5CYXNlfSBwcm92aWRlcyBhIGJlbHQtYW5kLXN1c3BlbmRlcnMgY29udGFpbm1lbnRcbiAqIGNoZWNrIGF0IHRoZSBwb2ludCBvZiBgcGF0aC5qb2luYCBmb3IgZGVmZW5zZSBpbiBkZXB0aC5cbiAqXG4gKiBAcGFyYW0ga2luZCAtIEh1bWFuLXJlYWRhYmxlIGxhYmVsIHVzZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UgKGUuZy4gXCJydW5JZFwiKVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlOyB0aHJvd3Mge0BsaW5rIFVuc2FmZUVudGl0eUlkRXJyb3J9XG4gKiAgIGlmIHRoZSB2YWx1ZSBpcyBub3Qgc2FmZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNhZmVFbnRpdHlJZChraW5kOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKFxuICAgIHZhbHVlLmxlbmd0aCA9PT0gMCB8fFxuICAgIHZhbHVlLnN0YXJ0c1dpdGgoJy4nKSB8fFxuICAgIHZhbHVlLmluY2x1ZGVzKCcvJykgfHxcbiAgICB2YWx1ZS5pbmNsdWRlcygnXFxcXCcpIHx8XG4gICAgdmFsdWUuaW5jbHVkZXMoJ1xcMCcpIHx8XG4gICAgdmFsdWUuaW5jbHVkZXMoJy4nKVxuICApIHtcbiAgICB0aHJvdyBuZXcgVW5zYWZlRW50aXR5SWRFcnJvcihraW5kLCB2YWx1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBKb2luIGBiYXNlZGlyYCB3aXRoIGFuIGVudGl0eS1yZWxhdGl2ZSBwYXRoIGFuZCBhc3NlcnQgdGhlIHJlc3VsdCBzdGF5c1xuICogaW5zaWRlIGBiYXNlZGlyYC4gQ29tcGxlbWVudHMge0BsaW5rIGFzc2VydFNhZmVFbnRpdHlJZH06IHBlci1lbnRyeS1wb2ludFxuICogdmFsaWRhdGlvbiBpcyB0aGUgcHJpbWFyeSBkZWZlbnNlLCBhbmQgdGhpcyBmaW5hbCBjaGVjayBjYXRjaGVzIGFueSBwYXRoXG4gKiBlc2NhcGUgdGhhdCBzbGlwcGVkIHBhc3QgKGUuZy4gYSBuZXcgY2FsbCBzaXRlIHRoYXQgZm9yZ290IHRvIHZhbGlkYXRlLFxuICogb3IgYW4gdW51c3VhbCBjaGFyYWN0ZXIgY29tYmluYXRpb24gb24gYSBmdXR1cmUgZmlsZXN5c3RlbSkuIFRocm93c1xuICoge0BsaW5rIFVuc2FmZUVudGl0eUlkRXJyb3J9IGlmIHRoZSBqb2luZWQgcGF0aCBlc2NhcGVzIGBiYXNlZGlyYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaXRoaW5CYXNlKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIC4uLnNlZ21lbnRzOiBzdHJpbmdbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzb2x2ZWRCYXNlID0gcGF0aC5yZXNvbHZlKGJhc2VkaXIpO1xuICBjb25zdCBqb2luZWQgPSBwYXRoLnJlc29sdmUoYmFzZWRpciwgLi4uc2VnbWVudHMpO1xuICBpZiAoam9pbmVkICE9PSByZXNvbHZlZEJhc2UgJiYgIWpvaW5lZC5zdGFydHNXaXRoKHJlc29sdmVkQmFzZSArIHBhdGguc2VwKSkge1xuICAgIHRocm93IG5ldyBVbnNhZmVFbnRpdHlJZEVycm9yKCdwYXRoJywgc2VnbWVudHMuam9pbignLycpKTtcbiAgfVxuICByZXR1cm4gam9pbmVkO1xufVxuXG5jb25zdCBpc1dpbmRvd3MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuXG4vKipcbiAqIEV4ZWN1dGUgYSBmaWxlc3lzdGVtIG9wZXJhdGlvbiB3aXRoIHJldHJ5IGxvZ2ljIG9uIFdpbmRvd3MuXG4gKiBPbiBXaW5kb3dzLCBmaWxlIG9wZXJhdGlvbnMgY2FuIGZhaWwgd2l0aCBFUEVSTS9FQlVTWS9FQUNDRVMgd2hlbiBmaWxlc1xuICogYXJlIGJyaWVmbHkgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2VzcyBvciBhbnRpdmlydXMuIFRoaXMgd3JhcHBlciBhZGRzXG4gKiBleHBvbmVudGlhbCBiYWNrb2ZmIHJldHJ5IGxvZ2ljLiBPbiBub24tV2luZG93cyBwbGF0Zm9ybXMsIGV4ZWN1dGVzIGRpcmVjdGx5LlxuICovXG5hc3luYyBmdW5jdGlvbiB3aXRoV2luZG93c1JldHJ5PFQ+KFxuICBmbjogKCkgPT4gUHJvbWlzZTxUPixcbiAgbWF4UmV0cmllcyA9IDVcbik6IFByb21pc2U8VD4ge1xuICBpZiAoIWlzV2luZG93cykgcmV0dXJuIGZuKCk7XG5cbiAgY29uc3QgcmV0cnlhYmxlRXJyb3JzID0gWydFUEVSTScsICdFQlVTWScsICdFQUNDRVMnXTtcbiAgY29uc3QgYmFzZURlbGF5TXMgPSAxMDtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSBtYXhSZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc3QgaXNSZXRyeWFibGUgPVxuICAgICAgICBhdHRlbXB0IDwgbWF4UmV0cmllcyAmJiByZXRyeWFibGVFcnJvcnMuaW5jbHVkZXMoZXJyb3IuY29kZSk7XG4gICAgICBpZiAoIWlzUmV0cnlhYmxlKSB0aHJvdyBlcnJvcjtcbiAgICAgIC8vIEV4cG9uZW50aWFsIGJhY2tvZmYgd2l0aCBqaXR0ZXJcbiAgICAgIGNvbnN0IGRlbGF5ID0gYmFzZURlbGF5TXMgKiAyICoqIGF0dGVtcHQgKyBNYXRoLnJhbmRvbSgpICogYmFzZURlbGF5TXM7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSkpO1xuICAgIH1cbiAgfVxuICAvLyBUeXBlU2NyaXB0OiB1bnJlYWNoYWJsZSwgYnV0IHNhdGlzZmllcyByZXR1cm4gdHlwZVxuICB0aHJvdyBuZXcgRXJyb3IoJ1JldHJ5IGxvb3AgZXhpdGVkIHVuZXhwZWN0ZWRseScpO1xufVxuXG4vLyBJbi1tZW1vcnkgY2FjaGUgb2YgY3JlYXRlZCBmaWxlcyB0byBhdm9pZCBleHBlbnNpdmUgZnMuYWNjZXNzKCkgY2FsbHNcbi8vIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHdlIG9ubHkgd3JpdGUgb25jZSBwZXIgZmlsZSBwYXRoIChubyBvdmVyd3JpdGVzIHdpdGhvdXQgZXhwbGljaXQgZmxhZylcbmNvbnN0IGNyZWF0ZWRGaWxlc0NhY2hlID0gbmV3IFNldDxzdHJpbmc+KCk7XG4vLyBXcml0ZXMgcmVwZWF0ZWRseSB0YXJnZXQgYSBzbWFsbCBmaXhlZCBzZXQgb2YgZW50aXR5IGRpcmVjdG9yaWVzLiBPbmNlIG9uZVxuLy8gZXhpc3RzIGluIHRoaXMgcHJvY2VzcywgYXZvaWQgYW5vdGhlciByZWN1cnNpdmUgbWtkaXIgc3lzY2FsbCBwZXIgZXZlbnQuXG5jb25zdCBjcmVhdGVkRGlyZWN0b3JpZXNDYWNoZSA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4vKipcbiAqIENsZWFyIHdyaXRlLXBhdGggY2FjaGVzLiBVc2VmdWwgZm9yIHRlc3Rpbmcgb3Igd2hlbiBmaWxlcyBhcmUgZGVsZXRlZCBleHRlcm5hbGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDcmVhdGVkRmlsZXNDYWNoZSgpOiB2b2lkIHtcbiAgY3JlYXRlZEZpbGVzQ2FjaGUuY2xlYXIoKTtcbiAgY3JlYXRlZERpcmVjdG9yaWVzQ2FjaGUuY2xlYXIoKTtcbn1cblxuZXhwb3J0IHsgdWxpZFRvRGF0ZSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5cbi8qKlxuICogUmVnZXggbWF0Y2hpbmcgYSB0YWcgc3VmZml4IG9uIGEgZmlsZUlkIChhZnRlciBgLmpzb25gIGhhcyBiZWVuIHN0cmlwcGVkKS5cbiAqIEUuZy4sIGB3cnVuX0FCQy52aXRlc3QtMGAg4oaSIHRoZSBgLnZpdGVzdC0wYCBwYXJ0LlxuICogVGFncyBzdGFydCB3aXRoIGEgbGV0dGVyIGFuZCBjb250YWluIGFscGhhbnVtZXJpYyBjaGFycyBhbmQgaHlwaGVucy5cbiAqIEVudGl0eSBJRHMgKFVMSURzLCBzdGVwX04sIGV0Yy4pIG5ldmVyIGNvbnRhaW4gZG90cywgc28gdGhlIGZpcnN0IGRvdFxuICogYWx3YXlzIG1hcmtzIHRoZSB0YWcgYm91bmRhcnkuXG4gKi9cbmNvbnN0IFRBR19QQVRURVJOID0gL1xcLlthLXpBLVpdW2EtekEtWjAtOS1dKiQvO1xuXG4vKipcbiAqIFN0cmlwIGEgdGFnIHN1ZmZpeCBmcm9tIGEgZmlsZUlkLlxuICogYHdydW5fQUJDLnZpdGVzdC0wYCDihpIgYHdydW5fQUJDYFxuICogYHdydW5fQUJDYCDihpIgYHdydW5fQUJDYCAobm8tb3AgaWYgbm8gdGFnKVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBUYWcoZmlsZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZmlsZUlkLnJlcGxhY2UoVEFHX1BBVFRFUk4sICcnKTtcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGEgZmlsZUlkIGJlbG9uZ3MgdG8gYSBzcGVjaWZpYyB0YWcuXG4gKiBgd3J1bl9BQkMudml0ZXN0LTBgIGJlbG9uZ3MgdG8gYHZpdGVzdC0wYC5cbiAqIFVudGFnZ2VkIGZpbGVJZHMgbmV2ZXIgbWF0Y2ggYSB0YWctc2NvcGVkIGxvb2t1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1RhZyhmaWxlSWQ6IHN0cmluZywgdGFnOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbGVJZC5lbmRzV2l0aChgLiR7dGFnfWApO1xufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYSBmaWxlSWQgY2FycmllcyBubyB0YWcgc3VmZml4IGF0IGFsbC5cbiAqIGB3cnVuX0FCQ2Ag4oaSIHRydWUsIGB3cnVuX0FCQy52aXRlc3QtMGAg4oaSIGZhbHNlLlxuICpcbiAqIEFuIHVudGFnZ2VkIHdvcmxkJ3MgcmVhZHMgKGByZWFkSlNPTldpdGhGYWxsYmFja2ApIGNhbiBvbmx5IHJlc29sdmUgdW50YWdnZWRcbiAqIGZpbGVzLCBzbyB3aGVuIGl0IGxpc3RzIGVudGl0aWVzIGZvciByZWNvdmVyeSBpdCBtdXN0IHNraXAgZmlsZXMgdGFnZ2VkIGJ5XG4gKiBvdGhlciB3b3JsZHMgKGUuZy4gdGhlIHZpdGVzdCBoYXJuZXNzKSBzaGFyaW5nIHRoZSBzYW1lIGRhdGEgZGlyZWN0b3J5IOKAlFxuICogb3RoZXJ3aXNlIGl0IHdvdWxkIHJlLWVucXVldWUgcnVucyBpdCBjYW5ub3Qgc3Vic2VxdWVudGx5IHJlYWQgYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVW50YWdnZWQoZmlsZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICFUQUdfUEFUVEVSTi50ZXN0KGZpbGVJZCk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGZpbGUgcGF0aCBmb3IgYW4gZW50aXR5LCB3aXRoIG9wdGlvbmFsIHRhZyBlbWJlZGRlZCBpbiB0aGUgZmlsZW5hbWUuXG4gKiBgdGFnZ2VkUGF0aCgnL2RhdGEnLCAncnVucycsICd3cnVuX0FCQycsICd2aXRlc3QtMCcpYCDihpIgYC9kYXRhL3J1bnMvd3J1bl9BQkMudml0ZXN0LTAuanNvbmBcbiAqIGB0YWdnZWRQYXRoKCcvZGF0YScsICdydW5zJywgJ3dydW5fQUJDJylgIOKGkiBgL2RhdGEvcnVucy93cnVuX0FCQy5qc29uYFxuICpcbiAqIFRoZSBgZmlsZUlkYCBhbmQgYHRhZ2AgYXJlIHZhbGlkYXRlZCB3aXRoIHtAbGluayBhc3NlcnRTYWZlRW50aXR5SWR9IGFuZFxuICogdGhlIHJlc3VsdCBpcyBjb250YWlubWVudC1jaGVja2VkIHdpdGgge0BsaW5rIHJlc29sdmVXaXRoaW5CYXNlfSB0b1xuICogcHJldmVudCBwYXRoLXRyYXZlcnNhbCBhdHRhY2tzIHdoZW4gdmFsdWVzIGFyZSBkZXJpdmVkIGZyb20gdW50cnVzdGVkXG4gKiByZXF1ZXN0IGlucHV0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFnZ2VkUGF0aChcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBlbnRpdHlEaXI6IHN0cmluZyxcbiAgZmlsZUlkOiBzdHJpbmcsXG4gIHRhZz86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgYXNzZXJ0U2FmZUVudGl0eUlkKCdmaWxlSWQnLCBmaWxlSWQpO1xuICBpZiAodGFnICE9PSB1bmRlZmluZWQpIGFzc2VydFNhZmVFbnRpdHlJZCgndGFnJywgdGFnKTtcbiAgY29uc3QgZmlsZW5hbWUgPSB0YWcgPyBgJHtmaWxlSWR9LiR7dGFnfS5qc29uYCA6IGAke2ZpbGVJZH0uanNvbmA7XG4gIHJldHVybiByZXNvbHZlV2l0aGluQmFzZShiYXNlZGlyLCBlbnRpdHlEaXIsIGZpbGVuYW1lKTtcbn1cblxuLyoqXG4gKiBSZWFkIGEgSlNPTiBlbnRpdHkgd2l0aCB0YWdnZWQgZmFsbGJhY2suXG4gKiBXaGVuIGEgdGFnIGlzIHNldCwgdHJpZXMgdGhlIHRhZ2dlZCBwYXRoIGZpcnN0LCB0aGVuIGZhbGxzIGJhY2sgdG8gdGhlXG4gKiB1bnRhZ2dlZCBwYXRoIChzbyBhIHRhZ2dlZCB3b3JsZCBjYW4gcmVhZCBlbnRpdGllcyB3cml0dGVuIHdpdGhvdXQgYSB0YWcpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEpTT05XaXRoRmFsbGJhY2s8VD4oXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgZW50aXR5RGlyOiBzdHJpbmcsXG4gIGZpbGVJZDogc3RyaW5nLFxuICBzY2hlbWE6IHouWm9kVHlwZTxUPixcbiAgdGFnPzogc3RyaW5nXG4pOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCgnZmlsZUlkJywgZmlsZUlkKTtcbiAgaWYgKHRhZyAhPT0gdW5kZWZpbmVkKSBhc3NlcnRTYWZlRW50aXR5SWQoJ3RhZycsIHRhZyk7XG4gIGlmICh0YWcpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkSlNPTihcbiAgICAgIHJlc29sdmVXaXRoaW5CYXNlKGJhc2VkaXIsIGVudGl0eURpciwgYCR7ZmlsZUlkfS4ke3RhZ30uanNvbmApLFxuICAgICAgc2NoZW1hXG4gICAgKTtcbiAgICBpZiAocmVzdWx0ICE9PSBudWxsKSByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHJldHVybiByZWFkSlNPTihcbiAgICByZXNvbHZlV2l0aGluQmFzZShiYXNlZGlyLCBlbnRpdHlEaXIsIGAke2ZpbGVJZH0uanNvbmApLFxuICAgIHNjaGVtYVxuICApO1xufVxuXG4vKipcbiAqIExpc3QgYWxsIGZpbGVuYW1lcyBpbiBhIGRpcmVjdG9yeSB0aGF0IGhhdmUgYSBzcGVjaWZpYyB0YWcuXG4gKiBSZXR1cm5zIGZ1bGwgZmlsZW5hbWVzIChlLmcuLCBgd3J1bl9BQkMudml0ZXN0LTAuanNvbmApLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFRhZ2dlZEZpbGVzKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHRhZzogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHN1ZmZpeCA9IGAuJHt0YWd9Lmpzb25gO1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gZmlsZXMuZmlsdGVyKChmKSA9PiBmLmVuZHNXaXRoKHN1ZmZpeCkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogTGlzdCBhbGwgZmlsZW5hbWVzIGluIGEgZGlyZWN0b3J5IHRoYXQgaGF2ZSBhIHNwZWNpZmljIHRhZyBhbmQgZXh0ZW5zaW9uLlxuICogUmV0dXJucyBmdWxsIGZpbGVuYW1lcyAoZS5nLiwgYHN0cmVhbS1jaG5rX0FCQy52aXRlc3QtMC5iaW5gKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RUYWdnZWRGaWxlc0J5RXh0ZW5zaW9uKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHRhZzogc3RyaW5nLFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBzdWZmaXggPSBgLiR7dGFnfSR7ZXh0ZW5zaW9ufWA7XG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpclBhdGgpO1xuICAgIHJldHVybiBmaWxlcy5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoc3VmZml4KSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gW107XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZURpcihkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICBpZiAoY3JlYXRlZERpcmVjdG9yaWVzQ2FjaGUuaGFzKHJlc29sdmVkUGF0aCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5ta2RpcihyZXNvbHZlZFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNyZWF0ZWREaXJlY3Rvcmllc0NhY2hlLmFkZChyZXNvbHZlZFBhdGgpO1xuICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAvLyBJZ25vcmUgaWYgYWxyZWFkeSBleGlzdHNcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB3aXRoRW5zdXJlZERpcmVjdG9yeTxUPihcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBvcGVyYXRpb246ICgpID0+IFByb21pc2U8VD5cbik6IFByb21pc2U8VD4ge1xuICBhd2FpdCBlbnN1cmVEaXIoZGlyUGF0aCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IG9wZXJhdGlvbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgLy8gQSBkZXYgc2VydmVyIG1heSBvdXRsaXZlIGFuIGV4dGVybmFsIGNsZWFudXAgb2YgaXRzIGRhdGEgZGlyZWN0b3J5LlxuICAgIC8vIEZvcmdldCB0aGUgY2FjaGVkIGRpcmVjdG9yeSBhbmQgcmV0cnkgb25jZSBhZnRlciByZWNyZWF0aW5nIGl0LlxuICAgIGNyZWF0ZWREaXJlY3Rvcmllc0NhY2hlLmRlbGV0ZShwYXRoLnJlc29sdmUoZGlyUGF0aCkpO1xuICAgIGF3YWl0IGVuc3VyZURpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gb3BlcmF0aW9uKCk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIFdyaXRlT3B0aW9ucyB7XG4gIG92ZXJ3cml0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ3VzdG9tIEpTT04gcmVwbGFjZXIgdGhhdCBlbmNvZGVzIFVpbnQ4QXJyYXkgYXMgYmFzZTY0IHN0cmluZ3MuXG4gKiBGb3JtYXQ6IHsgX190eXBlOiAnVWludDhBcnJheScsIGRhdGE6ICc8YmFzZTY0PicgfVxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvblJlcGxhY2VyKF9rZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdVaW50OEFycmF5JyxcbiAgICAgIGRhdGE6IEJ1ZmZlci5mcm9tKHZhbHVlKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogQ3VzdG9tIEpTT04gcmV2aXZlciB0aGF0IGRlY29kZXMgYmFzZTY0IHN0cmluZ3MgYmFjayB0byBVaW50OEFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvblJldml2ZXIoX2tleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgKHZhbHVlIGFzIGFueSkuX190eXBlID09PSAnVWludDhBcnJheScgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIGFueSkuZGF0YSA9PT0gJ3N0cmluZydcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKCh2YWx1ZSBhcyBhbnkpLmRhdGEsICdiYXNlNjQnKSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVKU09OKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBkYXRhOiBhbnksXG4gIG9wdHM/OiBXcml0ZU9wdGlvbnNcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gd3JpdGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGEsIGpzb25SZXBsYWNlciwgMiksIG9wdHMpO1xufVxuXG4vKipcbiAqIFdyaXRlcyBkYXRhIHRvIGEgZmlsZSB1c2luZyBhdG9taWMgd3JpdGUtcmVuYW1lIHBhdHRlcm4uXG4gKlxuICogTm90ZTogV2hpbGUgdGhpcyBmdW5jdGlvbiB1c2VzIHRlbXAgZmlsZXMgdG8gYXZvaWQgcGFydGlhbCB3cml0ZXMsXG4gKiBpdCBkb2VzIG5vdCBwcm92aWRlIHByb3RlY3Rpb24gYWdhaW5zdCBjb25jdXJyZW50IHdyaXRlcyBmcm9tIG11bHRpcGxlXG4gKiBwcm9jZXNzZXMuIEluIGEgbXVsdGktd3JpdGVyIHNjZW5hcmlvLCB0aGUgbGFzdCB3cml0ZXIgd2lucy5cbiAqIEZvciBwcm9kdWN0aW9uIHVzZSB3aXRoIG11bHRpcGxlIHdyaXRlcnMsIGNvbnNpZGVyIHVzaW5nIGEgcHJvcGVyXG4gKiBkYXRhYmFzZSBvciBsb2NraW5nIG1lY2hhbmlzbS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBkYXRhOiBzdHJpbmcgfCBCdWZmZXIsXG4gIG9wdHM/OiBXcml0ZU9wdGlvbnNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW9wdHM/Lm92ZXJ3cml0ZSkge1xuICAgIC8vIEZhc3QgcGF0aDogY2hlY2sgaW4tbWVtb3J5IGNhY2hlIGZpcnN0IHRvIGF2b2lkIGV4cGVuc2l2ZSBmcy5hY2Nlc3MoKSBjYWxsc1xuICAgIC8vIFRoaXMgcHJvdmlkZXMgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgd2hlbiBjcmVhdGluZyBtYW55IGZpbGVzXG4gICAgaWYgKGNyZWF0ZWRGaWxlc0NhY2hlLmhhcyhmaWxlUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICBgRmlsZSAke2ZpbGVQYXRofSBhbHJlYWR5IGV4aXN0cyBhbmQgJ292ZXJ3cml0ZScgaXMgZmFsc2VgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNsb3cgcGF0aDogY2hlY2sgZmlsZXN5c3RlbSBmb3IgZmlsZXMgY3JlYXRlZCBiZWZvcmUgdGhpcyBwcm9jZXNzIHN0YXJ0ZWRcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKTtcbiAgICAgIC8vIEZpbGUgZXhpc3RzIG9uIGRpc2ssIGFkZCB0byBjYWNoZSBmb3IgZnV0dXJlIGNoZWNrc1xuICAgICAgY3JlYXRlZEZpbGVzQ2FjaGUuYWRkKGZpbGVQYXRoKTtcbiAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICBgRmlsZSAke2ZpbGVQYXRofSBhbHJlYWR5IGV4aXN0cyBhbmQgJ292ZXJ3cml0ZScgaXMgZmFsc2VgXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIElmIGZpbGUgZG9lc24ndCBleGlzdCAoRU5PRU5UKSwgY29udGludWUgd2l0aCB3cml0ZVxuICAgICAgaWYgKGVycm9yLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRlbXBQYXRoID0gYCR7ZmlsZVBhdGh9LnRtcC4ke3VsaWQoKX1gO1xuICBsZXQgdGVtcEZpbGVDcmVhdGVkID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgYXdhaXQgd2l0aEVuc3VyZWREaXJlY3RvcnkocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHRlbXBQYXRoLCBkYXRhKTtcbiAgICAgIHRlbXBGaWxlQ3JlYXRlZCA9IHRydWU7XG4gICAgICBhd2FpdCB3aXRoV2luZG93c1JldHJ5KCgpID0+IGZzLnJlbmFtZSh0ZW1wUGF0aCwgZmlsZVBhdGgpKTtcbiAgICB9KTtcbiAgICAvLyBUcmFjayB0aGlzIGZpbGUgaW4gY2FjaGUgc28gZnV0dXJlIHdyaXRlcyBrbm93IGl0IGV4aXN0c1xuICAgIGNyZWF0ZWRGaWxlc0NhY2hlLmFkZChmaWxlUGF0aCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gT25seSB0cnkgdG8gY2xlYW4gdXAgdGVtcCBmaWxlIGlmIGl0IHdhcyBhY3R1YWxseSBjcmVhdGVkXG4gICAgaWYgKHRlbXBGaWxlQ3JlYXRlZCkge1xuICAgICAgYXdhaXQgd2l0aFdpbmRvd3NSZXRyeSgoKSA9PiBmcy51bmxpbmsodGVtcFBhdGgpLCAzKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkSlNPTjxUPihcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZGVjb2Rlcjogei5ab2RUeXBlPFQ+XG4pOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICByZXR1cm4gZGVjb2Rlci5wYXJzZShKU09OLnBhcnNlKGNvbnRlbnQsIGpzb25SZXZpdmVyKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gbnVsbDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEJ1ZmZlcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkRmlyc3RCeXRlKFxuICBmaWxlUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBmaWxlID0gYXdhaXQgZnMub3BlbihmaWxlUGF0aCwgJ3InKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBieXRlID0gQnVmZmVyLmFsbG9jVW5zYWZlKDEpO1xuICAgIGNvbnN0IHsgYnl0ZXNSZWFkIH0gPSBhd2FpdCBmaWxlLnJlYWQoYnl0ZSwgMCwgMSwgMCk7XG4gICAgcmV0dXJuIGJ5dGVzUmVhZCA9PT0gMCA/IHVuZGVmaW5lZCA6IGJ5dGVbMF07XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZmlsZS5jbG9zZSgpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVKU09OKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy51bmxpbmsoZmlsZVBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlICE9PSAnRU5PRU5UJykgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBBdG9taWNhbGx5IHB1Ymxpc2ggYSBmdWxseS13cml0dGVuIGZpbGUgd2l0aG91dCBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBvbmUuXG4gKlxuICogV3JpdGluZyBkaXJlY3RseSB3aXRoIE9fQ1JFQVQgfCBPX0VYQ0wgbWFrZXMgdGhlIGRlc3RpbmF0aW9uIHZpc2libGUgYmVmb3JlXG4gKiBpdHMgY29udGVudHMgYXJlIGNvbXBsZXRlLCBzbyBjb25jdXJyZW50IHJlYWRlcnMgY2FuIG9ic2VydmUgYSBwYXJ0aWFsIGZpbGUuXG4gKiBJbnN0ZWFkLCB3cml0ZSB0byBhIHVuaXF1ZSBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSwgdGhlbiBoYXJkLWxpbmsgaXQgaW50b1xuICogcGxhY2UuIENyZWF0aW5nIHRoZSBsaW5rIGlzIGF0b21pYyBhbmQgZmFpbHMgd2l0aCBFRVhJU1QgaWYgYW5vdGhlciB3cml0ZXJcbiAqIHB1Ymxpc2hlZCB0aGUgZGVzdGluYXRpb24gZmlyc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUV4Y2x1c2l2ZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZGF0YTogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgdGVtcFBhdGggPSBgJHtmaWxlUGF0aH0udG1wLiR7dWxpZCgpfWA7XG4gIGxldCB0ZW1wRmlsZUNyZWF0ZWQgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB3aXRoRW5zdXJlZERpcmVjdG9yeShwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGVtcFBhdGgsIGRhdGEsIHsgZmxhZzogJ3d4JyB9KTtcbiAgICAgIHRlbXBGaWxlQ3JlYXRlZCA9IHRydWU7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdpdGhXaW5kb3dzUmV0cnkoKCkgPT4gZnMubGluayh0ZW1wUGF0aCwgZmlsZVBhdGgpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAnRUVYSVNUJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodGVtcEZpbGVDcmVhdGVkKSB7XG4gICAgICBhd2FpdCB3aXRoV2luZG93c1JldHJ5KCgpID0+IGZzLnVubGluayh0ZW1wUGF0aCksIDMpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RKU09ORmlsZXMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICByZXR1cm4gbGlzdEZpbGVzQnlFeHRlbnNpb24oZGlyUGF0aCwgJy5qc29uJyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0RmlsZXNCeUV4dGVuc2lvbihcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gZmlsZXNcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoZXh0ZW5zaW9uKSlcbiAgICAgIC5tYXAoKGYpID0+IGYuc2xpY2UoMCwgLWV4dGVuc2lvbi5sZW5ndGgpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBbXTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5pbnRlcmZhY2UgUGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5Q29uZmlnPFQ+IHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIHNjaGVtYTogei5ab2RUeXBlPFQ+O1xuICAvKipcbiAgICogT3B0aW9uYWwgaW1tdXRhYmxlLWl0ZW0gY2FjaGUsIGtleWVkIGJ5IGFic29sdXRlIGZpbGUgcGF0aC4gRXZlbnQgZmlsZXNcbiAgICogYXJlIGFwcGVuZC1vbmx5LCBzbyB3b3JsZC1sb2NhbCBjYW4gcmVwbGF5IGV2ZW50cyBpdCBqdXN0IHBlcnNpc3RlZFxuICAgKiB3aXRob3V0IHJlcmVhZGluZyBhbmQgcmVwYXJzaW5nIHRoZW0gZnJvbSBkaXNrLlxuICAgKi9cbiAgY2FjaGVkSXRlbXM/OiBSZWFkb25seU1hcDxzdHJpbmcsIFQ+O1xuICBmaWxlUHJlZml4Pzogc3RyaW5nO1xuICBmaWxlSWRGaWx0ZXI/OiAoZmlsZUlkOiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIGZpbHRlcj86IChpdGVtOiBUKSA9PiBib29sZWFuO1xuICBzb3J0T3JkZXI/OiAnYXNjJyB8ICdkZXNjJztcbiAgbGltaXQ/OiBudW1iZXI7XG4gIGN1cnNvcj86IHN0cmluZztcbiAgZ2V0Q3JlYXRlZEF0KGZpbGVuYW1lOiBzdHJpbmcpOiBEYXRlIHwgbnVsbDtcbiAgZ2V0SWQ/KGl0ZW06IFQpOiBzdHJpbmc7XG59XG4vLyBDdXJzb3IgZm9ybWF0OiBcInRpbWVzdGFtcHxpZFwiIGZvciB0aWUtYnJlYWtpbmdcbmludGVyZmFjZSBQYXJzZWRDdXJzb3Ige1xuICB0aW1lc3RhbXA6IERhdGU7XG4gIGlkOiBzdHJpbmcgfCBudWxsO1xufVxuXG5mdW5jdGlvbiBwYXJzZUN1cnNvcihjdXJzb3I6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFBhcnNlZEN1cnNvciB8IG51bGwge1xuICBpZiAoIWN1cnNvcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcGFydHMgPSBjdXJzb3Iuc3BsaXQoJ3wnKTtcbiAgcmV0dXJuIHtcbiAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKHBhcnRzWzBdKSxcbiAgICBpZDogcGFydHNbMV0gfHwgbnVsbCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ3Vyc29yKHRpbWVzdGFtcDogRGF0ZSwgaWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBpZCA/IGAke3RpbWVzdGFtcC50b0lTT1N0cmluZygpfXwke2lkfWAgOiB0aW1lc3RhbXAudG9JU09TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeTxUIGV4dGVuZHMgeyBjcmVhdGVkQXQ6IERhdGUgfT4oXG4gIGNvbmZpZzogUGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5Q29uZmlnPFQ+XG4pOiBQcm9taXNlPFBhZ2luYXRlZFJlc3BvbnNlPFQ+PiB7XG4gIGNvbnN0IHtcbiAgICBkaXJlY3RvcnksXG4gICAgc2NoZW1hLFxuICAgIGNhY2hlZEl0ZW1zLFxuICAgIGZpbGVQcmVmaXgsXG4gICAgZmlsZUlkRmlsdGVyLFxuICAgIGZpbHRlcixcbiAgICBzb3J0T3JkZXIgPSAnZGVzYycsXG4gICAgbGltaXQgPSAyMCxcbiAgICBjdXJzb3IsXG4gICAgZ2V0Q3JlYXRlZEF0LFxuICAgIGdldElkLFxuICB9ID0gY29uZmlnO1xuXG4gIC8vIFZhbGlkYXRlIGZpbGVQcmVmaXggKHR5cGljYWxseSBgJHtydW5JZH0tYCkgc28gcmVxdWVzdC1kZXJpdmVkIHByZWZpeGVzXG4gIC8vIGNvbnNpc3RlbnRseSByZWplY3QgdW5zYWZlIGNoYXJhY3RlcnMuIGZpbGVQcmVmaXggaXMgb25seSB1c2VkIGJlbG93IHRvXG4gIC8vIGZpbHRlciByZWFkZGlyKCkgcmVzdWx0cyBieSBwcmVmaXgg4oCUIGl0IGRvZXNuJ3QgcGFydGljaXBhdGUgaW4gcGF0aFxuICAvLyBjb25zdHJ1Y3Rpb24g4oCUIGJ1dCBrZWVwaW5nIHRoZSB2YWxpZGF0aW9uIHJ1bGUgdW5pZm9ybSBhY3Jvc3MgdGhlXG4gIC8vIHN0b3JhZ2UgbGF5ZXIgYXZvaWRzIHNwZWNpYWwgY2FzZXMgYW5kIGNhdGNoZXMgYmFkIHZhbHVlcyBlYXJsaWVyLlxuICBpZiAoZmlsZVByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdmaWxlUHJlZml4JywgZmlsZVByZWZpeCk7XG4gIH1cblxuICBjb25zdCByZXNvbHZlZERpcmVjdG9yeSA9IHBhdGgucmVzb2x2ZShkaXJlY3RvcnkpO1xuXG4gIC8vIDEuIEdldCBhbGwgSlNPTiBmaWxlcyBpbiBkaXJlY3RvcnlcbiAgY29uc3QgZmlsZUlkcyA9IGF3YWl0IGxpc3RKU09ORmlsZXMocmVzb2x2ZWREaXJlY3RvcnkpO1xuXG4gIC8vIDIuIEZpbHRlciBieSBwcmVmaXggaWYgcHJvdmlkZWRcbiAgY29uc3QgcmVsZXZhbnRGaWxlSWRzID0gZmlsZVByZWZpeFxuICAgID8gZmlsZUlkcy5maWx0ZXIoKGZpbGVJZCkgPT4gZmlsZUlkLnN0YXJ0c1dpdGgoZmlsZVByZWZpeCkpXG4gICAgOiBmaWxlSWRzO1xuICBjb25zdCBmaWx0ZXJlZEZpbGVJZHMgPSBmaWxlSWRGaWx0ZXJcbiAgICA/IHJlbGV2YW50RmlsZUlkcy5maWx0ZXIoZmlsZUlkRmlsdGVyKVxuICAgIDogcmVsZXZhbnRGaWxlSWRzO1xuXG4gIC8vIDMuIFVMSUQgT3B0aW1pemF0aW9uOiBGaWx0ZXIgYnkgY3Vyc29yIHVzaW5nIGZpbGVuYW1lIHRpbWVzdGFtcHMgYmVmb3JlIGxvYWRpbmcgSlNPTlxuICBjb25zdCBwYXJzZWRDdXJzb3IgPSBwYXJzZUN1cnNvcihjdXJzb3IpO1xuICBsZXQgY2FuZGlkYXRlRmlsZUlkcyA9IGZpbHRlcmVkRmlsZUlkcztcblxuICBpZiAocGFyc2VkQ3Vyc29yKSB7XG4gICAgY2FuZGlkYXRlRmlsZUlkcyA9IGZpbHRlcmVkRmlsZUlkcy5maWx0ZXIoKGZpbGVJZCkgPT4ge1xuICAgICAgY29uc3QgZmlsZW5hbWVEYXRlID0gZ2V0Q3JlYXRlZEF0KGAke2ZpbGVJZH0uanNvbmApO1xuICAgICAgaWYgKGZpbGVuYW1lRGF0ZSkge1xuICAgICAgICAvLyBVc2UgZmlsZW5hbWUgdGltZXN0YW1wIGZvciBjdXJzb3IgZmlsdGVyaW5nXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBoZXJlOiBpZiBwYXJzZWRDdXJzb3IgaGFzIGFuIElEIChmb3IgdGllLWJyZWFraW5nKSxcbiAgICAgICAgLy8gd2UgbmVlZCB0byBpbmNsdWRlIGl0ZW1zIHdpdGggdGhlIHNhbWUgdGltZXN0YW1wIGZvciBsYXRlciBJRC1iYXNlZCBmaWx0ZXJpbmcuXG4gICAgICAgIC8vIElmIG5vIElELCB3ZSBjYW4gdXNlIHN0cmljdCBpbmVxdWFsaXR5IGZvciBvcHRpbWl6YXRpb24uXG4gICAgICAgIGNvbnN0IGN1cnNvclRpbWUgPSBwYXJzZWRDdXJzb3IudGltZXN0YW1wLmdldFRpbWUoKTtcbiAgICAgICAgY29uc3QgZmlsZVRpbWUgPSBmaWxlbmFtZURhdGUuZ2V0VGltZSgpO1xuXG4gICAgICAgIGlmIChwYXJzZWRDdXJzb3IuaWQpIHtcbiAgICAgICAgICAvLyBUaWUtYnJlYWtpbmcgbW9kZTogaW5jbHVkZSBpdGVtcyBhdCBvciBuZWFyIGN1cnNvciB0aW1lc3RhbXBcbiAgICAgICAgICByZXR1cm4gc29ydE9yZGVyID09PSAnZGVzYydcbiAgICAgICAgICAgID8gZmlsZVRpbWUgPD0gY3Vyc29yVGltZVxuICAgICAgICAgICAgOiBmaWxlVGltZSA+PSBjdXJzb3JUaW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHRpZS1icmVha2luZzogc3RyaWN0IGluZXF1YWxpdHlcbiAgICAgICAgICByZXR1cm4gc29ydE9yZGVyID09PSAnZGVzYydcbiAgICAgICAgICAgID8gZmlsZVRpbWUgPCBjdXJzb3JUaW1lXG4gICAgICAgICAgICA6IGZpbGVUaW1lID4gY3Vyc29yVGltZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQ2FuJ3QgZXh0cmFjdCB0aW1lc3RhbXAgZnJvbSBmaWxlbmFtZSAoZS5nLiwgc3RlcHMgdXNlIHNlcXVlbnRpYWwgSURzKS5cbiAgICAgIC8vIEluY2x1ZGUgdGhlIGZpbGUgYW5kIGRlZmVyIHRvIEpTT04tYmFzZWQgZmlsdGVyaW5nIGJlbG93LlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICAvLyA0LiBMb2FkIGZpbGVzIGluZGl2aWR1YWxseSBhbmQgY29sbGVjdCB2YWxpZCBpdGVtc1xuICBjb25zdCB2YWxpZEl0ZW1zOiBUW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGZpbGVJZCBvZiBjYW5kaWRhdGVGaWxlSWRzKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWREaXJlY3RvcnksIGAke2ZpbGVJZH0uanNvbmApO1xuICAgIGxldCBpdGVtOiBUIHwgbnVsbCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhY2hlZEl0ZW0gPSBjYWNoZWRJdGVtcz8uZ2V0KGZpbGVQYXRoKTtcbiAgICAgIGl0ZW0gPVxuICAgICAgICBjYWNoZWRJdGVtID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IGF3YWl0IHJlYWRKU09OKGZpbGVQYXRoLCBzY2hlbWEpXG4gICAgICAgICAgOiBzdHJ1Y3R1cmVkQ2xvbmUoY2FjaGVkSXRlbSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIFdlIGRvbid0IGV4cGVjdCB6b2QgZXJyb3JzIHRvIGhhcHBlbiwgYnV0IGlmIHRoZSBKU09OIGRvZXMgZ2V0IG1hbGZvcm1lZCxcbiAgICAgIC8vIHdlIHNraXAgdGhlIGl0ZW0uIFByZWZlcmFibHksIHdlJ2QgaGF2ZSBhIHdheSB0byBtYXJrIGl0ZW1zIGFzIG1hbGZvcm1lZCxcbiAgICAgIC8vIHNvIHRoYXQgdGhlIFVJIGNhbiBkaXNwbGF5IHRoZW0gYXMgc3VjaCwgd2l0aCByaWNoZXIgbWVzc2FnaW5nLiBJbiB0aGUgbWVhbnRpbWUsXG4gICAgICAvLyB3ZSBqdXN0IGxvZyBhIHdhcm5pbmcgYW5kIHNraXAgdGhlIGl0ZW0uXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiB6LlpvZEVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgU2tpcHBpbmcgaXRlbSAke2ZpbGVJZH0gZHVlIHRvIG1hbGZvcm1lZCBKU09OOiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChpdGVtKSB7XG4gICAgICAvLyBBcHBseSBjdXN0b20gZmlsdGVyIGVhcmx5IGlmIHByb3ZpZGVkXG4gICAgICBpZiAoZmlsdGVyICYmICFmaWx0ZXIoaXRlbSkpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBEb3VibGUtY2hlY2sgY3Vyc29yIGZpbHRlcmluZyB3aXRoIGFjdHVhbCBjcmVhdGVkQXQgZnJvbSBKU09OXG4gICAgICAvLyAoaW4gY2FzZSBVTElEIHRpbWVzdGFtcCBkaWZmZXJzIGZyb20gc3RvcmVkIGNyZWF0ZWRBdClcbiAgICAgIGlmIChwYXJzZWRDdXJzb3IpIHtcbiAgICAgICAgY29uc3QgaXRlbVRpbWUgPSBpdGVtLmNyZWF0ZWRBdC5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IGN1cnNvclRpbWUgPSBwYXJzZWRDdXJzb3IudGltZXN0YW1wLmdldFRpbWUoKTtcblxuICAgICAgICBpZiAoc29ydE9yZGVyID09PSAnZGVzYycpIHtcbiAgICAgICAgICAvLyBGb3IgZGVzY2VuZGluZyBvcmRlciwgc2tpcCBpdGVtcyA+PSBjdXJzb3JcbiAgICAgICAgICBpZiAoaXRlbVRpbWUgPiBjdXJzb3JUaW1lKSBjb250aW51ZTtcbiAgICAgICAgICAvLyBJZiB0aW1lc3RhbXBzIGFyZSBlcXVhbCwgdXNlIElEIGZvciB0aWUtYnJlYWtpbmcgKHNraXAgaWYgSUQgPj0gY3Vyc29ySWQpXG4gICAgICAgICAgaWYgKGl0ZW1UaW1lID09PSBjdXJzb3JUaW1lICYmIHBhcnNlZEN1cnNvci5pZCAmJiBnZXRJZCkge1xuICAgICAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SWQoaXRlbSk7XG4gICAgICAgICAgICBpZiAoaXRlbUlkID49IHBhcnNlZEN1cnNvci5pZCkgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZvciBhc2NlbmRpbmcgb3JkZXIsIHNraXAgaXRlbXMgPD0gY3Vyc29yXG4gICAgICAgICAgaWYgKGl0ZW1UaW1lIDwgY3Vyc29yVGltZSkgY29udGludWU7XG4gICAgICAgICAgLy8gSWYgdGltZXN0YW1wcyBhcmUgZXF1YWwsIHVzZSBJRCBmb3IgdGllLWJyZWFraW5nIChza2lwIGlmIElEIDw9IGN1cnNvcklkKVxuICAgICAgICAgIGlmIChpdGVtVGltZSA9PT0gY3Vyc29yVGltZSAmJiBwYXJzZWRDdXJzb3IuaWQgJiYgZ2V0SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldElkKGl0ZW0pO1xuICAgICAgICAgICAgaWYgKGl0ZW1JZCA8PSBwYXJzZWRDdXJzb3IuaWQpIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YWxpZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgLy8gNS4gU29ydCBieSBjcmVhdGVkQXQgKGFuZCBieSBJRCBmb3IgdGllLWJyZWFraW5nIGlmIGdldElkIGlzIHByb3ZpZGVkKVxuICB2YWxpZEl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBhVGltZSA9IGEuY3JlYXRlZEF0LmdldFRpbWUoKTtcbiAgICBjb25zdCBiVGltZSA9IGIuY3JlYXRlZEF0LmdldFRpbWUoKTtcbiAgICBjb25zdCB0aW1lQ29tcGFyaXNvbiA9IHNvcnRPcmRlciA9PT0gJ2FzYycgPyBhVGltZSAtIGJUaW1lIDogYlRpbWUgLSBhVGltZTtcblxuICAgIC8vIElmIHRpbWVzdGFtcHMgYXJlIGVxdWFsIGFuZCB3ZSBoYXZlIGdldElkLCB1c2UgSUQgZm9yIHN0YWJsZSBzb3J0aW5nXG4gICAgaWYgKHRpbWVDb21wYXJpc29uID09PSAwICYmIGdldElkKSB7XG4gICAgICBjb25zdCBhSWQgPSBnZXRJZChhKTtcbiAgICAgIGNvbnN0IGJJZCA9IGdldElkKGIpO1xuICAgICAgcmV0dXJuIHNvcnRPcmRlciA9PT0gJ2FzYydcbiAgICAgICAgPyBhSWQubG9jYWxlQ29tcGFyZShiSWQpXG4gICAgICAgIDogYklkLmxvY2FsZUNvbXBhcmUoYUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGltZUNvbXBhcmlzb247XG4gIH0pO1xuXG4gIC8vIDYuIEFwcGx5IHBhZ2luYXRpb25cbiAgY29uc3QgaGFzTW9yZSA9IHZhbGlkSXRlbXMubGVuZ3RoID4gbGltaXQ7XG4gIGNvbnN0IGl0ZW1zID0gaGFzTW9yZSA/IHZhbGlkSXRlbXMuc2xpY2UoMCwgbGltaXQpIDogdmFsaWRJdGVtcztcbiAgY29uc3QgbmV4dEN1cnNvciA9XG4gICAgaXRlbXMubGVuZ3RoID4gMFxuICAgICAgPyBjcmVhdGVDdXJzb3IoXG4gICAgICAgICAgaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV0uY3JlYXRlZEF0LFxuICAgICAgICAgIGdldElkPy4oaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV0pXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcblxuICByZXR1cm4ge1xuICAgIGRhdGE6IGl0ZW1zLFxuICAgIGN1cnNvcjogbmV4dEN1cnNvcixcbiAgICBoYXNNb3JlLFxuICB9O1xufVxuIl19
567
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRW5EOzs7OztHQUtHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFjO0lBQ3RDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2YsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGtCQUFrQjtJQUN6RCxZQUFZLElBQVksRUFBRSxLQUFhO1FBQ3JDLEtBQUssQ0FDSCxVQUFVLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsNkRBQTZELENBQ3hHLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDO0lBQ3BDLENBQUM7SUFF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dCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBFbnRpdHlDb25mbGljdEVycm9yLCBXb3JrZmxvd1dvcmxkRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGFnaW5hdGVkUmVzcG9uc2UgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmNvbnN0IHVsaWQgPSBtb25vdG9uaWNGYWN0b3J5KCgpID0+IE1hdGgucmFuZG9tKCkpO1xuXG4vKipcbiAqIFRydW5jYXRlIGEgcG9zc2libHktdW50cnVzdGVkIHZhbHVlIGZvciBpbmNsdXNpb24gaW4gYW4gZXJyb3IgbWVzc2FnZS5cbiAqIEtlZXBzIGVycm9yIG91dHB1dCBhY3Rpb25hYmxlIGZvciBkZXZlbG9wZXJzIGluIGRldiBtb2RlIHdoaWxlIGxpbWl0aW5nXG4gKiB0aGUgYW1vdW50IG9mIGF0dGFja2VyLWNvbnRyb2xsZWQgZGF0YSByZWZsZWN0ZWQgYmFjayBpZiBhIGB3b3JsZC1sb2NhbGBcbiAqIGJhY2tlbmQgaXMgZXZlciBydW4gaW4gYSBjb250ZXh0IHRoYXQgc3VyZmFjZXMgdGhlc2UgbWVzc2FnZXMgdG8gY2xpZW50cy5cbiAqL1xuZnVuY3Rpb24gdHJ1bmNhdGVGb3JFcnJvcih2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGNvbnN0IHMgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBTdHJpbmcodmFsdWUpO1xuICBjb25zdCBNQVggPSA0ODtcbiAgcmV0dXJuIHMubGVuZ3RoID4gTUFYID8gYCR7cy5zbGljZSgwLCBNQVgpfeKApmAgOiBzO1xufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgY2FsbGVyLXN1cHBsaWVkIGVudGl0eSBJRCBjb250YWlucyBjaGFyYWN0ZXJzIHRoYXQgd291bGRcbiAqIGVzY2FwZSB0aGUgc3RvcmFnZSByb290IChwYXRoIHRyYXZlcnNhbCkgb3Igb3RoZXJ3aXNlIHByb2R1Y2UgYW4gdW5zYWZlXG4gKiBmaWxlbmFtZS4gRXh0ZW5kcyB7QGxpbmsgV29ya2Zsb3dXb3JsZEVycm9yfSBzbyB0aGUgcGxhdGZvcm0ncyBzdGFuZGFyZFxuICogZXJyb3ItdG8tSFRUUCBtYXBwaW5nIGhhbmRsZXMgaXQgYWxvbmdzaWRlIG90aGVyIHdvcmxkLWxheWVyIGVycm9ycy5cbiAqL1xuZXhwb3J0IGNsYXNzIFVuc2FmZUVudGl0eUlkRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd1dvcmxkRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihraW5kOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIGBVbnNhZmUgJHtraW5kfSBcIiR7dHJ1bmNhdGVGb3JFcnJvcih2YWx1ZSl9XCI6IG11c3Qgbm90IGJlIGVtcHR5LCBjb250YWluIFwiLlwiLCBcIi9cIiwgXCJcXFxcXCIsIG9yIG51bGwgYnl0ZXNgXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnVW5zYWZlRW50aXR5SWRFcnJvcic7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBVbnNhZmVFbnRpdHlJZEVycm9yIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBFcnJvciAmJiB2YWx1ZS5uYW1lID09PSAnVW5zYWZlRW50aXR5SWRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGEgc3RyaW5nIGlzIHNhZmUgdG8gZW1iZWQgaW4gYSBmaWxlc3lzdGVtIHBhdGggYXMgYSBzaW5nbGVcbiAqIHBhdGggY29tcG9uZW50LiBSZWplY3RzIHZhbHVlcyB0aGF0IGFyZTpcbiAqICAgLSBlbXB0eVxuICogICAtIHN0YXJ0aW5nIHdpdGggYC5gIChibG9ja3MgYC5gLCBgLi5gLCBgLmxvY2tzYCwgYC50bXBgLCBhbmQgb3RoZXJcbiAqICAgICBoaWRkZW4gb3IgcmVzZXJ2ZWQgZmlsZW5hbWVzKVxuICogICAtIGNvbnRhaW5pbmcgYC5gICh3b3VsZCBjb2xsaWRlIHdpdGggdGhlIGAudGFnYCAvIGAuanNvbmAgc3VmZml4IHRoZVxuICogICAgIHRhZ2dpbmcgbG9naWMgc3RyaXBzIGZyb20gZmlsZW5hbWVzOyBzZWUge0BsaW5rIHN0cmlwVGFnfSAvXG4gKiAgICAge0BsaW5rIGdldE9iamVjdENyZWF0ZWRBdH0pXG4gKiAgIC0gY29udGFpbmluZyBgL2AsIGBcXGAsIG9yIGEgTlVMIGJ5dGVcbiAqXG4gKiBUaGlzIGlzIHRoZSBwcmltYXJ5IGRlZmVuc2UgYWdhaW5zdCBwYXRoLXRyYXZlcnNhbCBhdHRhY2tzIHdoZXJlIGFcbiAqIHJlcXVlc3QgYm9keSBzdXBwbGllcyBhIGBydW5JZGAgLyBgc3RlcElkYCAvIGBjb3JyZWxhdGlvbklkYCBjb250YWluaW5nXG4gKiBgLi4vYCBzZXF1ZW5jZXMgdG8gcmVhZCBvciB3cml0ZSBmaWxlcyBvdXRzaWRlIHRoZSBzdG9yYWdlIHJvb3QuXG4gKiB7QGxpbmsgcmVzb2x2ZVdpdGhpbkJhc2V9IHByb3ZpZGVzIGEgYmVsdC1hbmQtc3VzcGVuZGVycyBjb250YWlubWVudFxuICogY2hlY2sgYXQgdGhlIHBvaW50IG9mIGBwYXRoLmpvaW5gIGZvciBkZWZlbnNlIGluIGRlcHRoLlxuICpcbiAqIEBwYXJhbSBraW5kIC0gSHVtYW4tcmVhZGFibGUgbGFiZWwgdXNlZCBpbiB0aGUgZXJyb3IgbWVzc2FnZSAoZS5nLiBcInJ1bklkXCIpXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGU7IHRocm93cyB7QGxpbmsgVW5zYWZlRW50aXR5SWRFcnJvcn1cbiAqICAgaWYgdGhlIHZhbHVlIGlzIG5vdCBzYWZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U2FmZUVudGl0eUlkKGtpbmQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoXG4gICAgdmFsdWUubGVuZ3RoID09PSAwIHx8XG4gICAgdmFsdWUuc3RhcnRzV2l0aCgnLicpIHx8XG4gICAgdmFsdWUuaW5jbHVkZXMoJy8nKSB8fFxuICAgIHZhbHVlLmluY2x1ZGVzKCdcXFxcJykgfHxcbiAgICB2YWx1ZS5pbmNsdWRlcygnXFwwJykgfHxcbiAgICB2YWx1ZS5pbmNsdWRlcygnLicpXG4gICkge1xuICAgIHRocm93IG5ldyBVbnNhZmVFbnRpdHlJZEVycm9yKGtpbmQsIHZhbHVlKTtcbiAgfVxufVxuXG4vKipcbiAqIEpvaW4gYGJhc2VkaXJgIHdpdGggYW4gZW50aXR5LXJlbGF0aXZlIHBhdGggYW5kIGFzc2VydCB0aGUgcmVzdWx0IHN0YXlzXG4gKiBpbnNpZGUgYGJhc2VkaXJgLiBDb21wbGVtZW50cyB7QGxpbmsgYXNzZXJ0U2FmZUVudGl0eUlkfTogcGVyLWVudHJ5LXBvaW50XG4gKiB2YWxpZGF0aW9uIGlzIHRoZSBwcmltYXJ5IGRlZmVuc2UsIGFuZCB0aGlzIGZpbmFsIGNoZWNrIGNhdGNoZXMgYW55IHBhdGhcbiAqIGVzY2FwZSB0aGF0IHNsaXBwZWQgcGFzdCAoZS5nLiBhIG5ldyBjYWxsIHNpdGUgdGhhdCBmb3Jnb3QgdG8gdmFsaWRhdGUsXG4gKiBvciBhbiB1bnVzdWFsIGNoYXJhY3RlciBjb21iaW5hdGlvbiBvbiBhIGZ1dHVyZSBmaWxlc3lzdGVtKS4gVGhyb3dzXG4gKiB7QGxpbmsgVW5zYWZlRW50aXR5SWRFcnJvcn0gaWYgdGhlIGpvaW5lZCBwYXRoIGVzY2FwZXMgYGJhc2VkaXJgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgLi4uc2VnbWVudHM6IHN0cmluZ1tdXG4pOiBzdHJpbmcge1xuICBjb25zdCByZXNvbHZlZEJhc2UgPSBwYXRoLnJlc29sdmUoYmFzZWRpcik7XG4gIGNvbnN0IGpvaW5lZCA9IHBhdGgucmVzb2x2ZShiYXNlZGlyLCAuLi5zZWdtZW50cyk7XG4gIGlmIChqb2luZWQgIT09IHJlc29sdmVkQmFzZSAmJiAham9pbmVkLnN0YXJ0c1dpdGgocmVzb2x2ZWRCYXNlICsgcGF0aC5zZXApKSB7XG4gICAgdGhyb3cgbmV3IFVuc2FmZUVudGl0eUlkRXJyb3IoJ3BhdGgnLCBzZWdtZW50cy5qb2luKCcvJykpO1xuICB9XG4gIHJldHVybiBqb2luZWQ7XG59XG5cbmNvbnN0IGlzV2luZG93cyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG5cbi8qKlxuICogRXhlY3V0ZSBhIGZpbGVzeXN0ZW0gb3BlcmF0aW9uIHdpdGggcmV0cnkgbG9naWMgb24gV2luZG93cy5cbiAqIE9uIFdpbmRvd3MsIGZpbGUgb3BlcmF0aW9ucyBjYW4gZmFpbCB3aXRoIEVQRVJNL0VCVVNZL0VBQ0NFUyB3aGVuIGZpbGVzXG4gKiBhcmUgYnJpZWZseSBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzIG9yIGFudGl2aXJ1cy4gVGhpcyB3cmFwcGVyIGFkZHNcbiAqIGV4cG9uZW50aWFsIGJhY2tvZmYgcmV0cnkgbG9naWMuIE9uIG5vbi1XaW5kb3dzIHBsYXRmb3JtcywgZXhlY3V0ZXMgZGlyZWN0bHkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdpdGhXaW5kb3dzUmV0cnk8VD4oXG4gIGZuOiAoKSA9PiBQcm9taXNlPFQ+LFxuICBtYXhSZXRyaWVzID0gNVxuKTogUHJvbWlzZTxUPiB7XG4gIGlmICghaXNXaW5kb3dzKSByZXR1cm4gZm4oKTtcblxuICBjb25zdCByZXRyeWFibGVFcnJvcnMgPSBbJ0VQRVJNJywgJ0VCVVNZJywgJ0VBQ0NFUyddO1xuICBjb25zdCBiYXNlRGVsYXlNcyA9IDEwO1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IG1heFJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zdCBpc1JldHJ5YWJsZSA9XG4gICAgICAgIGF0dGVtcHQgPCBtYXhSZXRyaWVzICYmIHJldHJ5YWJsZUVycm9ycy5pbmNsdWRlcyhlcnJvci5jb2RlKTtcbiAgICAgIGlmICghaXNSZXRyeWFibGUpIHRocm93IGVycm9yO1xuICAgICAgLy8gRXhwb25lbnRpYWwgYmFja29mZiB3aXRoIGppdHRlclxuICAgICAgY29uc3QgZGVsYXkgPSBiYXNlRGVsYXlNcyAqIDIgKiogYXR0ZW1wdCArIE1hdGgucmFuZG9tKCkgKiBiYXNlRGVsYXlNcztcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgfVxuICB9XG4gIC8vIFR5cGVTY3JpcHQ6IHVucmVhY2hhYmxlLCBidXQgc2F0aXNmaWVzIHJldHVybiB0eXBlXG4gIHRocm93IG5ldyBFcnJvcignUmV0cnkgbG9vcCBleGl0ZWQgdW5leHBlY3RlZGx5Jyk7XG59XG5cbi8vIEluLW1lbW9yeSBjYWNoZSBvZiBjcmVhdGVkIGZpbGVzIHRvIGF2b2lkIGV4cGVuc2l2ZSBmcy5hY2Nlc3MoKSBjYWxsc1xuLy8gVGhpcyBpcyBzYWZlIGJlY2F1c2Ugd2Ugb25seSB3cml0ZSBvbmNlIHBlciBmaWxlIHBhdGggKG5vIG92ZXJ3cml0ZXMgd2l0aG91dCBleHBsaWNpdCBmbGFnKVxuY29uc3QgY3JlYXRlZEZpbGVzQ2FjaGUgPSBuZXcgU2V0PHN0cmluZz4oKTtcbi8vIFdyaXRlcyByZXBlYXRlZGx5IHRhcmdldCBhIHNtYWxsIGZpeGVkIHNldCBvZiBlbnRpdHkgZGlyZWN0b3JpZXMuIE9uY2Ugb25lXG4vLyBleGlzdHMgaW4gdGhpcyBwcm9jZXNzLCBhdm9pZCBhbm90aGVyIHJlY3Vyc2l2ZSBta2RpciBzeXNjYWxsIHBlciBldmVudC5cbmNvbnN0IGNyZWF0ZWREaXJlY3Rvcmllc0NhY2hlID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbi8qKlxuICogQ2xlYXIgd3JpdGUtcGF0aCBjYWNoZXMuIFVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIGZpbGVzIGFyZSBkZWxldGVkIGV4dGVybmFsbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNyZWF0ZWRGaWxlc0NhY2hlKCk6IHZvaWQge1xuICBjcmVhdGVkRmlsZXNDYWNoZS5jbGVhcigpO1xuICBjcmVhdGVkRGlyZWN0b3JpZXNDYWNoZS5jbGVhcigpO1xufVxuXG5leHBvcnQgeyB1bGlkVG9EYXRlIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuLyoqXG4gKiBSZWdleCBtYXRjaGluZyBhIHRhZyBzdWZmaXggb24gYSBmaWxlSWQgKGFmdGVyIGAuanNvbmAgaGFzIGJlZW4gc3RyaXBwZWQpLlxuICogRS5nLiwgYHdydW5fQUJDLnZpdGVzdC0wYCDihpIgdGhlIGAudml0ZXN0LTBgIHBhcnQuXG4gKiBUYWdzIHN0YXJ0IHdpdGggYSBsZXR0ZXIgYW5kIGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJzIGFuZCBoeXBoZW5zLlxuICogRW50aXR5IElEcyAoVUxJRHMsIHN0ZXBfTiwgZXRjLikgbmV2ZXIgY29udGFpbiBkb3RzLCBzbyB0aGUgZmlyc3QgZG90XG4gKiBhbHdheXMgbWFya3MgdGhlIHRhZyBib3VuZGFyeS5cbiAqL1xuY29uc3QgVEFHX1BBVFRFUk4gPSAvXFwuW2EtekEtWl1bYS16QS1aMC05LV0qJC87XG5cbi8qKlxuICogU3RyaXAgYSB0YWcgc3VmZml4IGZyb20gYSBmaWxlSWQuXG4gKiBgd3J1bl9BQkMudml0ZXN0LTBgIOKGkiBgd3J1bl9BQkNgXG4gKiBgd3J1bl9BQkNgIOKGkiBgd3J1bl9BQkNgIChuby1vcCBpZiBubyB0YWcpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFRhZyhmaWxlSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBmaWxlSWQucmVwbGFjZShUQUdfUEFUVEVSTiwgJycpO1xufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYSBmaWxlSWQgYmVsb25ncyB0byBhIHNwZWNpZmljIHRhZy5cbiAqIGB3cnVuX0FCQy52aXRlc3QtMGAgYmVsb25ncyB0byBgdml0ZXN0LTBgLlxuICogVW50YWdnZWQgZmlsZUlkcyBuZXZlciBtYXRjaCBhIHRhZy1zY29wZWQgbG9va3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzVGFnKGZpbGVJZDogc3RyaW5nLCB0YWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZUlkLmVuZHNXaXRoKGAuJHt0YWd9YCk7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhIGZpbGVJZCBjYXJyaWVzIG5vIHRhZyBzdWZmaXggYXQgYWxsLlxuICogYHdydW5fQUJDYCDihpIgdHJ1ZSwgYHdydW5fQUJDLnZpdGVzdC0wYCDihpIgZmFsc2UuXG4gKlxuICogQW4gdW50YWdnZWQgd29ybGQncyByZWFkcyAoYHJlYWRKU09OV2l0aEZhbGxiYWNrYCkgY2FuIG9ubHkgcmVzb2x2ZSB1bnRhZ2dlZFxuICogZmlsZXMsIHNvIHdoZW4gaXQgbGlzdHMgZW50aXRpZXMgZm9yIHJlY292ZXJ5IGl0IG11c3Qgc2tpcCBmaWxlcyB0YWdnZWQgYnlcbiAqIG90aGVyIHdvcmxkcyAoZS5nLiB0aGUgdml0ZXN0IGhhcm5lc3MpIHNoYXJpbmcgdGhlIHNhbWUgZGF0YSBkaXJlY3Rvcnkg4oCUXG4gKiBvdGhlcndpc2UgaXQgd291bGQgcmUtZW5xdWV1ZSBydW5zIGl0IGNhbm5vdCBzdWJzZXF1ZW50bHkgcmVhZCBiYWNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNVbnRhZ2dlZChmaWxlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gIVRBR19QQVRURVJOLnRlc3QoZmlsZUlkKTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgZmlsZSBwYXRoIGZvciBhbiBlbnRpdHksIHdpdGggb3B0aW9uYWwgdGFnIGVtYmVkZGVkIGluIHRoZSBmaWxlbmFtZS5cbiAqIGB0YWdnZWRQYXRoKCcvZGF0YScsICdydW5zJywgJ3dydW5fQUJDJywgJ3ZpdGVzdC0wJylgIOKGkiBgL2RhdGEvcnVucy93cnVuX0FCQy52aXRlc3QtMC5qc29uYFxuICogYHRhZ2dlZFBhdGgoJy9kYXRhJywgJ3J1bnMnLCAnd3J1bl9BQkMnKWAg4oaSIGAvZGF0YS9ydW5zL3dydW5fQUJDLmpzb25gXG4gKlxuICogVGhlIGBmaWxlSWRgIGFuZCBgdGFnYCBhcmUgdmFsaWRhdGVkIHdpdGgge0BsaW5rIGFzc2VydFNhZmVFbnRpdHlJZH0gYW5kXG4gKiB0aGUgcmVzdWx0IGlzIGNvbnRhaW5tZW50LWNoZWNrZWQgd2l0aCB7QGxpbmsgcmVzb2x2ZVdpdGhpbkJhc2V9IHRvXG4gKiBwcmV2ZW50IHBhdGgtdHJhdmVyc2FsIGF0dGFja3Mgd2hlbiB2YWx1ZXMgYXJlIGRlcml2ZWQgZnJvbSB1bnRydXN0ZWRcbiAqIHJlcXVlc3QgaW5wdXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWdnZWRQYXRoKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIGVudGl0eURpcjogc3RyaW5nLFxuICBmaWxlSWQ6IHN0cmluZyxcbiAgdGFnPzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBhc3NlcnRTYWZlRW50aXR5SWQoJ2ZpbGVJZCcsIGZpbGVJZCk7XG4gIGlmICh0YWcgIT09IHVuZGVmaW5lZCkgYXNzZXJ0U2FmZUVudGl0eUlkKCd0YWcnLCB0YWcpO1xuICBjb25zdCBmaWxlbmFtZSA9IHRhZyA/IGAke2ZpbGVJZH0uJHt0YWd9Lmpzb25gIDogYCR7ZmlsZUlkfS5qc29uYDtcbiAgcmV0dXJuIHJlc29sdmVXaXRoaW5CYXNlKGJhc2VkaXIsIGVudGl0eURpciwgZmlsZW5hbWUpO1xufVxuXG4vKipcbiAqIFJlYWQgYSBKU09OIGVudGl0eSB3aXRoIHRhZ2dlZCBmYWxsYmFjay5cbiAqIFdoZW4gYSB0YWcgaXMgc2V0LCB0cmllcyB0aGUgdGFnZ2VkIHBhdGggZmlyc3QsIHRoZW4gZmFsbHMgYmFjayB0byB0aGVcbiAqIHVudGFnZ2VkIHBhdGggKHNvIGEgdGFnZ2VkIHdvcmxkIGNhbiByZWFkIGVudGl0aWVzIHdyaXR0ZW4gd2l0aG91dCBhIHRhZykuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkSlNPTldpdGhGYWxsYmFjazxUPihcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBlbnRpdHlEaXI6IHN0cmluZyxcbiAgZmlsZUlkOiBzdHJpbmcsXG4gIHNjaGVtYTogei5ab2RUeXBlPFQ+LFxuICB0YWc/OiBzdHJpbmdcbik6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgYXNzZXJ0U2FmZUVudGl0eUlkKCdmaWxlSWQnLCBmaWxlSWQpO1xuICBpZiAodGFnICE9PSB1bmRlZmluZWQpIGFzc2VydFNhZmVFbnRpdHlJZCgndGFnJywgdGFnKTtcbiAgaWYgKHRhZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRKU09OKFxuICAgICAgcmVzb2x2ZVdpdGhpbkJhc2UoYmFzZWRpciwgZW50aXR5RGlyLCBgJHtmaWxlSWR9LiR7dGFnfS5qc29uYCksXG4gICAgICBzY2hlbWFcbiAgICApO1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIHJlYWRKU09OKFxuICAgIHJlc29sdmVXaXRoaW5CYXNlKGJhc2VkaXIsIGVudGl0eURpciwgYCR7ZmlsZUlkfS5qc29uYCksXG4gICAgc2NoZW1hXG4gICk7XG59XG5cbi8qKlxuICogTGlzdCBhbGwgZmlsZW5hbWVzIGluIGEgZGlyZWN0b3J5IHRoYXQgaGF2ZSBhIHNwZWNpZmljIHRhZy5cbiAqIFJldHVybnMgZnVsbCBmaWxlbmFtZXMgKGUuZy4sIGB3cnVuX0FCQy52aXRlc3QtMC5qc29uYCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0VGFnZ2VkRmlsZXMoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgdGFnOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgc3VmZml4ID0gYC4ke3RhZ30uanNvbmA7XG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpclBhdGgpO1xuICAgIHJldHVybiBmaWxlcy5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoc3VmZml4KSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gW107XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0IGFsbCBmaWxlbmFtZXMgaW4gYSBkaXJlY3RvcnkgdGhhdCBoYXZlIGEgc3BlY2lmaWMgdGFnIGFuZCBleHRlbnNpb24uXG4gKiBSZXR1cm5zIGZ1bGwgZmlsZW5hbWVzIChlLmcuLCBgc3RyZWFtLWNobmtfQUJDLnZpdGVzdC0wLmJpbmApLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFRhZ2dlZEZpbGVzQnlFeHRlbnNpb24oXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgdGFnOiBzdHJpbmcsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHN1ZmZpeCA9IGAuJHt0YWd9JHtleHRlbnNpb259YDtcbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVzLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aChzdWZmaXgpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBbXTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlRGlyKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXNvbHZlZFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIGlmIChjcmVhdGVkRGlyZWN0b3JpZXNDYWNoZS5oYXMocmVzb2x2ZWRQYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGZzLm1rZGlyKHJlc29sdmVkUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgY3JlYXRlZERpcmVjdG9yaWVzQ2FjaGUuYWRkKHJlc29sdmVkUGF0aCk7XG4gIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgIC8vIElnbm9yZSBpZiBhbHJlYWR5IGV4aXN0c1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdpdGhFbnN1cmVkRGlyZWN0b3J5PFQ+KFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIG9wZXJhdGlvbjogKCkgPT4gUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIGF3YWl0IGVuc3VyZURpcihkaXJQYXRoKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgb3BlcmF0aW9uKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICAvLyBBIGRldiBzZXJ2ZXIgbWF5IG91dGxpdmUgYW4gZXh0ZXJuYWwgY2xlYW51cCBvZiBpdHMgZGF0YSBkaXJlY3RvcnkuXG4gICAgLy8gRm9yZ2V0IHRoZSBjYWNoZWQgZGlyZWN0b3J5IGFuZCByZXRyeSBvbmNlIGFmdGVyIHJlY3JlYXRpbmcgaXQuXG4gICAgY3JlYXRlZERpcmVjdG9yaWVzQ2FjaGUuZGVsZXRlKHBhdGgucmVzb2x2ZShkaXJQYXRoKSk7XG4gICAgYXdhaXQgZW5zdXJlRGlyKGRpclBhdGgpO1xuICAgIHJldHVybiBvcGVyYXRpb24oKTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgV3JpdGVPcHRpb25zIHtcbiAgb3ZlcndyaXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDdXN0b20gSlNPTiByZXBsYWNlciB0aGF0IGVuY29kZXMgVWludDhBcnJheSBhcyBiYXNlNjQgc3RyaW5ncy5cbiAqIEZvcm1hdDogeyBfX3R5cGU6ICdVaW50OEFycmF5JywgZGF0YTogJzxiYXNlNjQ+JyB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uUmVwbGFjZXIoX2tleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogJ1VpbnQ4QXJyYXknLFxuICAgICAgZGF0YTogQnVmZmVyLmZyb20odmFsdWUpLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBDdXN0b20gSlNPTiByZXZpdmVyIHRoYXQgZGVjb2RlcyBiYXNlNjQgc3RyaW5ncyBiYWNrIHRvIFVpbnQ4QXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uUmV2aXZlcihfa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAodmFsdWUgYXMgYW55KS5fX3R5cGUgPT09ICdVaW50OEFycmF5JyAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgYW55KS5kYXRhID09PSAnc3RyaW5nJ1xuICApIHtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oKHZhbHVlIGFzIGFueSkuZGF0YSwgJ2Jhc2U2NCcpKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUpTT04oXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGRhdGE6IGFueSxcbiAgb3B0cz86IFdyaXRlT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiB3cml0ZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoZGF0YSwganNvblJlcGxhY2VyLCAyKSwgb3B0cyk7XG59XG5cbi8qKlxuICogV3JpdGVzIGRhdGEgdG8gYSBmaWxlIHVzaW5nIGF0b21pYyB3cml0ZS1yZW5hbWUgcGF0dGVybi5cbiAqXG4gKiBOb3RlOiBXaGlsZSB0aGlzIGZ1bmN0aW9uIHVzZXMgdGVtcCBmaWxlcyB0byBhdm9pZCBwYXJ0aWFsIHdyaXRlcyxcbiAqIGl0IGRvZXMgbm90IHByb3ZpZGUgcHJvdGVjdGlvbiBhZ2FpbnN0IGNvbmN1cnJlbnQgd3JpdGVzIGZyb20gbXVsdGlwbGVcbiAqIHByb2Nlc3Nlcy4gSW4gYSBtdWx0aS13cml0ZXIgc2NlbmFyaW8sIHRoZSBsYXN0IHdyaXRlciB3aW5zLlxuICogRm9yIHByb2R1Y3Rpb24gdXNlIHdpdGggbXVsdGlwbGUgd3JpdGVycywgY29uc2lkZXIgdXNpbmcgYSBwcm9wZXJcbiAqIGRhdGFiYXNlIG9yIGxvY2tpbmcgbWVjaGFuaXNtLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGRhdGE6IHN0cmluZyB8IEJ1ZmZlcixcbiAgb3B0cz86IFdyaXRlT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghb3B0cz8ub3ZlcndyaXRlKSB7XG4gICAgLy8gRmFzdCBwYXRoOiBjaGVjayBpbi1tZW1vcnkgY2FjaGUgZmlyc3QgdG8gYXZvaWQgZXhwZW5zaXZlIGZzLmFjY2VzcygpIGNhbGxzXG4gICAgLy8gVGhpcyBwcm92aWRlcyBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCB3aGVuIGNyZWF0aW5nIG1hbnkgZmlsZXNcbiAgICBpZiAoY3JlYXRlZEZpbGVzQ2FjaGUuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgIGBGaWxlICR7ZmlsZVBhdGh9IGFscmVhZHkgZXhpc3RzIGFuZCAnb3ZlcndyaXRlJyBpcyBmYWxzZWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU2xvdyBwYXRoOiBjaGVjayBmaWxlc3lzdGVtIGZvciBmaWxlcyBjcmVhdGVkIGJlZm9yZSB0aGlzIHByb2Nlc3Mgc3RhcnRlZFxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZVBhdGgpO1xuICAgICAgLy8gRmlsZSBleGlzdHMgb24gZGlzaywgYWRkIHRvIGNhY2hlIGZvciBmdXR1cmUgY2hlY2tzXG4gICAgICBjcmVhdGVkRmlsZXNDYWNoZS5hZGQoZmlsZVBhdGgpO1xuICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgIGBGaWxlICR7ZmlsZVBhdGh9IGFscmVhZHkgZXhpc3RzIGFuZCAnb3ZlcndyaXRlJyBpcyBmYWxzZWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gSWYgZmlsZSBkb2Vzbid0IGV4aXN0IChFTk9FTlQpLCBjb250aW51ZSB3aXRoIHdyaXRlXG4gICAgICBpZiAoZXJyb3IuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdGVtcFBhdGggPSBgJHtmaWxlUGF0aH0udG1wLiR7dWxpZCgpfWA7XG4gIGxldCB0ZW1wRmlsZUNyZWF0ZWQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3aXRoRW5zdXJlZERpcmVjdG9yeShwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGVtcFBhdGgsIGRhdGEpO1xuICAgICAgdGVtcEZpbGVDcmVhdGVkID0gdHJ1ZTtcbiAgICAgIGF3YWl0IHdpdGhXaW5kb3dzUmV0cnkoKCkgPT4gZnMucmVuYW1lKHRlbXBQYXRoLCBmaWxlUGF0aCkpO1xuICAgIH0pO1xuICAgIC8vIFRyYWNrIHRoaXMgZmlsZSBpbiBjYWNoZSBzbyBmdXR1cmUgd3JpdGVzIGtub3cgaXQgZXhpc3RzXG4gICAgY3JlYXRlZEZpbGVzQ2FjaGUuYWRkKGZpbGVQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBPbmx5IHRyeSB0byBjbGVhbiB1cCB0ZW1wIGZpbGUgaWYgaXQgd2FzIGFjdHVhbGx5IGNyZWF0ZWRcbiAgICBpZiAodGVtcEZpbGVDcmVhdGVkKSB7XG4gICAgICBhd2FpdCB3aXRoV2luZG93c1JldHJ5KCgpID0+IGZzLnVubGluayh0ZW1wUGF0aCksIDMpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRKU09OPFQ+KFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBkZWNvZGVyOiB6LlpvZFR5cGU8VD5cbik6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpO1xuICAgIHJldHVybiBkZWNvZGVyLnBhcnNlKEpTT04ucGFyc2UoY29udGVudCwganNvblJldml2ZXIpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBudWxsO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkQnVmZmVyKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICByZXR1cm4gY29udGVudDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRGaXJzdEJ5dGUoXG4gIGZpbGVQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGZpbGUgPSBhd2FpdCBmcy5vcGVuKGZpbGVQYXRoLCAncicpO1xuICB0cnkge1xuICAgIGNvbnN0IGJ5dGUgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMSk7XG4gICAgY29uc3QgeyBieXRlc1JlYWQgfSA9IGF3YWl0IGZpbGUucmVhZChieXRlLCAwLCAxLCAwKTtcbiAgICByZXR1cm4gYnl0ZXNSZWFkID09PSAwID8gdW5kZWZpbmVkIDogYnl0ZVswXTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmaWxlLmNsb3NlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUpTT04oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGZzLnVubGluayhmaWxlUGF0aCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgIT09ICdFTk9FTlQnKSB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIEF0b21pY2FsbHkgcHVibGlzaCBhIGZ1bGx5LXdyaXR0ZW4gZmlsZSB3aXRob3V0IG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIG9uZS5cbiAqXG4gKiBXcml0aW5nIGRpcmVjdGx5IHdpdGggT19DUkVBVCB8IE9fRVhDTCBtYWtlcyB0aGUgZGVzdGluYXRpb24gdmlzaWJsZSBiZWZvcmVcbiAqIGl0cyBjb250ZW50cyBhcmUgY29tcGxldGUsIHNvIGNvbmN1cnJlbnQgcmVhZGVycyBjYW4gb2JzZXJ2ZSBhIHBhcnRpYWwgZmlsZS5cbiAqIEluc3RlYWQsIHdyaXRlIHRvIGEgdW5pcXVlIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LCB0aGVuIGhhcmQtbGluayBpdCBpbnRvXG4gKiBwbGFjZS4gQ3JlYXRpbmcgdGhlIGxpbmsgaXMgYXRvbWljIGFuZCBmYWlscyB3aXRoIEVFWElTVCBpZiBhbm90aGVyIHdyaXRlclxuICogcHVibGlzaGVkIHRoZSBkZXN0aW5hdGlvbiBmaXJzdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlRXhjbHVzaXZlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBkYXRhOiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB0ZW1wUGF0aCA9IGAke2ZpbGVQYXRofS50bXAuJHt1bGlkKCl9YDtcbiAgbGV0IHRlbXBGaWxlQ3JlYXRlZCA9IGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHdpdGhFbnN1cmVkRGlyZWN0b3J5KHBhdGguZGlybmFtZShmaWxlUGF0aCksIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0ZW1wUGF0aCwgZGF0YSwgeyBmbGFnOiAnd3gnIH0pO1xuICAgICAgdGVtcEZpbGVDcmVhdGVkID0gdHJ1ZTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd2l0aFdpbmRvd3NSZXRyeSgoKSA9PiBmcy5saW5rKHRlbXBQYXRoLCBmaWxlUGF0aCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFRVhJU1QnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGlmICh0ZW1wRmlsZUNyZWF0ZWQpIHtcbiAgICAgIGF3YWl0IHdpdGhXaW5kb3dzUmV0cnkoKCkgPT4gZnMudW5saW5rKHRlbXBQYXRoKSwgMykuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdEpTT05GaWxlcyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIHJldHVybiBsaXN0RmlsZXNCeUV4dGVuc2lvbihkaXJQYXRoLCAnLmpzb24nKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RGaWxlc0J5RXh0ZW5zaW9uKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpclBhdGgpO1xuICAgIHJldHVybiBmaWxlc1xuICAgICAgLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aChleHRlbnNpb24pKVxuICAgICAgLm1hcCgoZikgPT4gZi5zbGljZSgwLCAtZXh0ZW5zaW9uLmxlbmd0aCkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmludGVyZmFjZSBQYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnlDb25maWc8VD4ge1xuICBkaXJlY3Rvcnk6IHN0cmluZztcbiAgc2NoZW1hOiB6LlpvZFR5cGU8VD47XG4gIC8qKlxuICAgKiBPcHRpb25hbCBpbW11dGFibGUtaXRlbSBjYWNoZSwga2V5ZWQgYnkgYWJzb2x1dGUgZmlsZSBwYXRoLiBFdmVudCBmaWxlc1xuICAgKiBhcmUgYXBwZW5kLW9ubHksIHNvIHdvcmxkLWxvY2FsIGNhbiByZXBsYXkgZXZlbnRzIGl0IGp1c3QgcGVyc2lzdGVkXG4gICAqIHdpdGhvdXQgcmVyZWFkaW5nIGFuZCByZXBhcnNpbmcgdGhlbSBmcm9tIGRpc2suXG4gICAqL1xuICBjYWNoZWRJdGVtcz86IFJlYWRvbmx5TWFwPHN0cmluZywgVD47XG4gIGZpbGVQcmVmaXg/OiBzdHJpbmc7XG4gIGZpbGVJZEZpbHRlcj86IChmaWxlSWQ6IHN0cmluZykgPT4gYm9vbGVhbjtcbiAgZmlsdGVyPzogKGl0ZW06IFQpID0+IGJvb2xlYW47XG4gIHNvcnRPcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xuICBsaW1pdD86IG51bWJlcjtcbiAgY3Vyc29yPzogc3RyaW5nO1xuICBnZXRDcmVhdGVkQXQoZmlsZW5hbWU6IHN0cmluZyk6IERhdGUgfCBudWxsO1xuICBnZXRJZD8oaXRlbTogVCk6IHN0cmluZztcbn1cbi8vIEN1cnNvciBmb3JtYXQ6IFwidGltZXN0YW1wfGlkXCIgZm9yIHRpZS1icmVha2luZ1xuaW50ZXJmYWNlIFBhcnNlZEN1cnNvciB7XG4gIHRpbWVzdGFtcDogRGF0ZTtcbiAgaWQ6IHN0cmluZyB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ3Vyc29yKGN1cnNvcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogUGFyc2VkQ3Vyc29yIHwgbnVsbCB7XG4gIGlmICghY3Vyc29yKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBwYXJ0cyA9IGN1cnNvci5zcGxpdCgnfCcpO1xuICByZXR1cm4ge1xuICAgIHRpbWVzdGFtcDogbmV3IERhdGUocGFydHNbMF0pLFxuICAgIGlkOiBwYXJ0c1sxXSB8fCBudWxsLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDdXJzb3IodGltZXN0YW1wOiBEYXRlLCBpZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlkID8gYCR7dGltZXN0YW1wLnRvSVNPU3RyaW5nKCl9fCR7aWR9YCA6IHRpbWVzdGFtcC50b0lTT1N0cmluZygpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5PFQgZXh0ZW5kcyB7IGNyZWF0ZWRBdDogRGF0ZSB9PihcbiAgY29uZmlnOiBQYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnlDb25maWc8VD5cbik6IFByb21pc2U8UGFnaW5hdGVkUmVzcG9uc2U8VD4+IHtcbiAgY29uc3Qge1xuICAgIGRpcmVjdG9yeSxcbiAgICBzY2hlbWEsXG4gICAgY2FjaGVkSXRlbXMsXG4gICAgZmlsZVByZWZpeCxcbiAgICBmaWxlSWRGaWx0ZXIsXG4gICAgZmlsdGVyLFxuICAgIHNvcnRPcmRlciA9ICdkZXNjJyxcbiAgICBsaW1pdCA9IDIwLFxuICAgIGN1cnNvcixcbiAgICBnZXRDcmVhdGVkQXQsXG4gICAgZ2V0SWQsXG4gIH0gPSBjb25maWc7XG5cbiAgLy8gVmFsaWRhdGUgZmlsZVByZWZpeCAodHlwaWNhbGx5IGAke3J1bklkfS1gKSBzbyByZXF1ZXN0LWRlcml2ZWQgcHJlZml4ZXNcbiAgLy8gY29uc2lzdGVudGx5IHJlamVjdCB1bnNhZmUgY2hhcmFjdGVycy4gZmlsZVByZWZpeCBpcyBvbmx5IHVzZWQgYmVsb3cgdG9cbiAgLy8gZmlsdGVyIHJlYWRkaXIoKSByZXN1bHRzIGJ5IHByZWZpeCDigJQgaXQgZG9lc24ndCBwYXJ0aWNpcGF0ZSBpbiBwYXRoXG4gIC8vIGNvbnN0cnVjdGlvbiDigJQgYnV0IGtlZXBpbmcgdGhlIHZhbGlkYXRpb24gcnVsZSB1bmlmb3JtIGFjcm9zcyB0aGVcbiAgLy8gc3RvcmFnZSBsYXllciBhdm9pZHMgc3BlY2lhbCBjYXNlcyBhbmQgY2F0Y2hlcyBiYWQgdmFsdWVzIGVhcmxpZXIuXG4gIGlmIChmaWxlUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ2ZpbGVQcmVmaXgnLCBmaWxlUHJlZml4KTtcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkRGlyZWN0b3J5ID0gcGF0aC5yZXNvbHZlKGRpcmVjdG9yeSk7XG5cbiAgLy8gMS4gR2V0IGFsbCBKU09OIGZpbGVzIGluIGRpcmVjdG9yeVxuICBjb25zdCBmaWxlSWRzID0gYXdhaXQgbGlzdEpTT05GaWxlcyhyZXNvbHZlZERpcmVjdG9yeSk7XG5cbiAgLy8gMi4gRmlsdGVyIGJ5IHByZWZpeCBpZiBwcm92aWRlZFxuICBjb25zdCByZWxldmFudEZpbGVJZHMgPSBmaWxlUHJlZml4XG4gICAgPyBmaWxlSWRzLmZpbHRlcigoZmlsZUlkKSA9PiBmaWxlSWQuc3RhcnRzV2l0aChmaWxlUHJlZml4KSlcbiAgICA6IGZpbGVJZHM7XG4gIGNvbnN0IGZpbHRlcmVkRmlsZUlkcyA9IGZpbGVJZEZpbHRlclxuICAgID8gcmVsZXZhbnRGaWxlSWRzLmZpbHRlcihmaWxlSWRGaWx0ZXIpXG4gICAgOiByZWxldmFudEZpbGVJZHM7XG5cbiAgLy8gMy4gVUxJRCBPcHRpbWl6YXRpb246IEZpbHRlciBieSBjdXJzb3IgdXNpbmcgZmlsZW5hbWUgdGltZXN0YW1wcyBiZWZvcmUgbG9hZGluZyBKU09OXG4gIGNvbnN0IHBhcnNlZEN1cnNvciA9IHBhcnNlQ3Vyc29yKGN1cnNvcik7XG4gIGxldCBjYW5kaWRhdGVGaWxlSWRzID0gZmlsdGVyZWRGaWxlSWRzO1xuXG4gIGlmIChwYXJzZWRDdXJzb3IpIHtcbiAgICBjYW5kaWRhdGVGaWxlSWRzID0gZmlsdGVyZWRGaWxlSWRzLmZpbHRlcigoZmlsZUlkKSA9PiB7XG4gICAgICBjb25zdCBmaWxlbmFtZURhdGUgPSBnZXRDcmVhdGVkQXQoYCR7ZmlsZUlkfS5qc29uYCk7XG4gICAgICBpZiAoZmlsZW5hbWVEYXRlKSB7XG4gICAgICAgIC8vIFVzZSBmaWxlbmFtZSB0aW1lc3RhbXAgZm9yIGN1cnNvciBmaWx0ZXJpbmdcbiAgICAgICAgLy8gV2UgbmVlZCB0byBiZSBjYXJlZnVsIGhlcmU6IGlmIHBhcnNlZEN1cnNvciBoYXMgYW4gSUQgKGZvciB0aWUtYnJlYWtpbmcpLFxuICAgICAgICAvLyB3ZSBuZWVkIHRvIGluY2x1ZGUgaXRlbXMgd2l0aCB0aGUgc2FtZSB0aW1lc3RhbXAgZm9yIGxhdGVyIElELWJhc2VkIGZpbHRlcmluZy5cbiAgICAgICAgLy8gSWYgbm8gSUQsIHdlIGNhbiB1c2Ugc3RyaWN0IGluZXF1YWxpdHkgZm9yIG9wdGltaXphdGlvbi5cbiAgICAgICAgY29uc3QgY3Vyc29yVGltZSA9IHBhcnNlZEN1cnNvci50aW1lc3RhbXAuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBmaWxlVGltZSA9IGZpbGVuYW1lRGF0ZS5nZXRUaW1lKCk7XG5cbiAgICAgICAgaWYgKHBhcnNlZEN1cnNvci5pZCkge1xuICAgICAgICAgIC8vIFRpZS1icmVha2luZyBtb2RlOiBpbmNsdWRlIGl0ZW1zIGF0IG9yIG5lYXIgY3Vyc29yIHRpbWVzdGFtcFxuICAgICAgICAgIHJldHVybiBzb3J0T3JkZXIgPT09ICdkZXNjJ1xuICAgICAgICAgICAgPyBmaWxlVGltZSA8PSBjdXJzb3JUaW1lXG4gICAgICAgICAgICA6IGZpbGVUaW1lID49IGN1cnNvclRpbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gdGllLWJyZWFraW5nOiBzdHJpY3QgaW5lcXVhbGl0eVxuICAgICAgICAgIHJldHVybiBzb3J0T3JkZXIgPT09ICdkZXNjJ1xuICAgICAgICAgICAgPyBmaWxlVGltZSA8IGN1cnNvclRpbWVcbiAgICAgICAgICAgIDogZmlsZVRpbWUgPiBjdXJzb3JUaW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDYW4ndCBleHRyYWN0IHRpbWVzdGFtcCBmcm9tIGZpbGVuYW1lIChlLmcuLCBzdGVwcyB1c2Ugc2VxdWVudGlhbCBJRHMpLlxuICAgICAgLy8gSW5jbHVkZSB0aGUgZmlsZSBhbmQgZGVmZXIgdG8gSlNPTi1iYXNlZCBmaWx0ZXJpbmcgYmVsb3cuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIDQuIExvYWQgZmlsZXMgd2l0aCBib3VuZGVkIGNvbmN1cnJlbmN5IGFuZCBjb2xsZWN0IHZhbGlkIGl0ZW1zLlxuICAvLyBSZWFkcyBhcmUgaW5kZXBlbmRlbnQ7IG9yZGVyaW5nIGlzIHJlc3RvcmVkIGJ5IHRoZSBzb3J0IGJlbG93LlxuICBjb25zdCByZWFkQ29uY3VycmVuY3kgPSAzMjtcbiAgY29uc3QgdmFsaWRJdGVtczogVFtdID0gW107XG5cbiAgZm9yIChcbiAgICBsZXQgYmF0Y2hTdGFydCA9IDA7XG4gICAgYmF0Y2hTdGFydCA8IGNhbmRpZGF0ZUZpbGVJZHMubGVuZ3RoO1xuICAgIGJhdGNoU3RhcnQgKz0gcmVhZENvbmN1cnJlbmN5XG4gICkge1xuICAgIGNvbnN0IGJhdGNoID0gY2FuZGlkYXRlRmlsZUlkcy5zbGljZShcbiAgICAgIGJhdGNoU3RhcnQsXG4gICAgICBiYXRjaFN0YXJ0ICsgcmVhZENvbmN1cnJlbmN5XG4gICAgKTtcbiAgICBjb25zdCBsb2FkZWRCYXRjaCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYmF0Y2gubWFwKGFzeW5jIChmaWxlSWQpOiBQcm9taXNlPFQgfCBudWxsPiA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkRGlyZWN0b3J5LCBgJHtmaWxlSWR9Lmpzb25gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBjYWNoZWRJdGVtID0gY2FjaGVkSXRlbXM/LmdldChmaWxlUGF0aCk7XG4gICAgICAgICAgcmV0dXJuIGNhY2hlZEl0ZW0gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBhd2FpdCByZWFkSlNPTihmaWxlUGF0aCwgc2NoZW1hKVxuICAgICAgICAgICAgOiBzdHJ1Y3R1cmVkQ2xvbmUoY2FjaGVkSXRlbSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgLy8gV2UgZG9uJ3QgZXhwZWN0IHpvZCBlcnJvcnMgdG8gaGFwcGVuLCBidXQgaWYgdGhlIEpTT04gZG9lcyBnZXQgbWFsZm9ybWVkLFxuICAgICAgICAgIC8vIHdlIHNraXAgdGhlIGl0ZW0uIFByZWZlcmFibHksIHdlJ2QgaGF2ZSBhIHdheSB0byBtYXJrIGl0ZW1zIGFzIG1hbGZvcm1lZCxcbiAgICAgICAgICAvLyBzbyB0aGF0IHRoZSBVSSBjYW4gZGlzcGxheSB0aGVtIGFzIHN1Y2gsIHdpdGggcmljaGVyIG1lc3NhZ2luZy4gSW4gdGhlIG1lYW50aW1lLFxuICAgICAgICAgIC8vIHdlIGp1c3QgbG9nIGEgd2FybmluZyBhbmQgc2tpcCB0aGUgaXRlbS5cbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiB6LlpvZEVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBTa2lwcGluZyBpdGVtICR7ZmlsZUlkfSBkdWUgdG8gbWFsZm9ybWVkIEpTT046ICR7ZXJyb3IubWVzc2FnZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbG9hZGVkQmF0Y2gpIHtcbiAgICAgIGlmICghaXRlbSkgY29udGludWU7XG4gICAgICAvLyBBcHBseSBjdXN0b20gZmlsdGVyIGVhcmx5IGlmIHByb3ZpZGVkXG4gICAgICBpZiAoZmlsdGVyICYmICFmaWx0ZXIoaXRlbSkpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBEb3VibGUtY2hlY2sgY3Vyc29yIGZpbHRlcmluZyB3aXRoIGFjdHVhbCBjcmVhdGVkQXQgZnJvbSBKU09OXG4gICAgICAvLyAoaW4gY2FzZSBVTElEIHRpbWVzdGFtcCBkaWZmZXJzIGZyb20gc3RvcmVkIGNyZWF0ZWRBdClcbiAgICAgIGlmIChwYXJzZWRDdXJzb3IpIHtcbiAgICAgICAgY29uc3QgaXRlbVRpbWUgPSBpdGVtLmNyZWF0ZWRBdC5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IGN1cnNvclRpbWUgPSBwYXJzZWRDdXJzb3IudGltZXN0YW1wLmdldFRpbWUoKTtcblxuICAgICAgICBpZiAoc29ydE9yZGVyID09PSAnZGVzYycpIHtcbiAgICAgICAgICAvLyBGb3IgZGVzY2VuZGluZyBvcmRlciwgc2tpcCBpdGVtcyA+PSBjdXJzb3JcbiAgICAgICAgICBpZiAoaXRlbVRpbWUgPiBjdXJzb3JUaW1lKSBjb250aW51ZTtcbiAgICAgICAgICAvLyBJZiB0aW1lc3RhbXBzIGFyZSBlcXVhbCwgdXNlIElEIGZvciB0aWUtYnJlYWtpbmcgKHNraXAgaWYgSUQgPj0gY3Vyc29ySWQpXG4gICAgICAgICAgaWYgKGl0ZW1UaW1lID09PSBjdXJzb3JUaW1lICYmIHBhcnNlZEN1cnNvci5pZCAmJiBnZXRJZCkge1xuICAgICAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SWQoaXRlbSk7XG4gICAgICAgICAgICBpZiAoaXRlbUlkID49IHBhcnNlZEN1cnNvci5pZCkgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZvciBhc2NlbmRpbmcgb3JkZXIsIHNraXAgaXRlbXMgPD0gY3Vyc29yXG4gICAgICAgICAgaWYgKGl0ZW1UaW1lIDwgY3Vyc29yVGltZSkgY29udGludWU7XG4gICAgICAgICAgLy8gSWYgdGltZXN0YW1wcyBhcmUgZXF1YWwsIHVzZSBJRCBmb3IgdGllLWJyZWFraW5nIChza2lwIGlmIElEIDw9IGN1cnNvcklkKVxuICAgICAgICAgIGlmIChpdGVtVGltZSA9PT0gY3Vyc29yVGltZSAmJiBwYXJzZWRDdXJzb3IuaWQgJiYgZ2V0SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldElkKGl0ZW0pO1xuICAgICAgICAgICAgaWYgKGl0ZW1JZCA8PSBwYXJzZWRDdXJzb3IuaWQpIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YWxpZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgLy8gNS4gU29ydCBieSBjcmVhdGVkQXQgKGFuZCBieSBJRCBmb3IgdGllLWJyZWFraW5nIGlmIGdldElkIGlzIHByb3ZpZGVkKVxuICB2YWxpZEl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBhVGltZSA9IGEuY3JlYXRlZEF0LmdldFRpbWUoKTtcbiAgICBjb25zdCBiVGltZSA9IGIuY3JlYXRlZEF0LmdldFRpbWUoKTtcbiAgICBjb25zdCB0aW1lQ29tcGFyaXNvbiA9IHNvcnRPcmRlciA9PT0gJ2FzYycgPyBhVGltZSAtIGJUaW1lIDogYlRpbWUgLSBhVGltZTtcblxuICAgIC8vIElmIHRpbWVzdGFtcHMgYXJlIGVxdWFsIGFuZCB3ZSBoYXZlIGdldElkLCB1c2UgSUQgZm9yIHN0YWJsZSBzb3J0aW5nXG4gICAgaWYgKHRpbWVDb21wYXJpc29uID09PSAwICYmIGdldElkKSB7XG4gICAgICBjb25zdCBhSWQgPSBnZXRJZChhKTtcbiAgICAgIGNvbnN0IGJJZCA9IGdldElkKGIpO1xuICAgICAgcmV0dXJuIHNvcnRPcmRlciA9PT0gJ2FzYydcbiAgICAgICAgPyBhSWQubG9jYWxlQ29tcGFyZShiSWQpXG4gICAgICAgIDogYklkLmxvY2FsZUNvbXBhcmUoYUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGltZUNvbXBhcmlzb247XG4gIH0pO1xuXG4gIC8vIDYuIEFwcGx5IHBhZ2luYXRpb25cbiAgY29uc3QgaGFzTW9yZSA9IHZhbGlkSXRlbXMubGVuZ3RoID4gbGltaXQ7XG4gIGNvbnN0IGl0ZW1zID0gaGFzTW9yZSA/IHZhbGlkSXRlbXMuc2xpY2UoMCwgbGltaXQpIDogdmFsaWRJdGVtcztcbiAgY29uc3QgbmV4dEN1cnNvciA9XG4gICAgaXRlbXMubGVuZ3RoID4gMFxuICAgICAgPyBjcmVhdGVDdXJzb3IoXG4gICAgICAgICAgaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV0uY3JlYXRlZEF0LFxuICAgICAgICAgIGdldElkPy4oaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV0pXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcblxuICByZXR1cm4ge1xuICAgIGRhdGE6IGl0ZW1zLFxuICAgIGN1cnNvcjogbmV4dEN1cnNvcixcbiAgICBoYXNNb3JlLFxuICB9O1xufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAa1C,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAM7D,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,KAAK,aAAa,EAClB,YAAY,GACb,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG;IAC/B,+EAA+E;IAC/E,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACnE,qEAAqE;IACrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,UAAU,CAyJ9D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,UAAU,CAEnE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAa1C,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAO7D,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,KAAK,aAAa,EAClB,YAAY,GACb,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG;IAC/B,+EAA+E;IAC/E,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACnE,qEAAqE;IACrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,UAAU,CAkL9D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,UAAU,CAEnE"}
package/dist/index.js CHANGED
@@ -8,6 +8,7 @@ import { initDataDir } from './init.js';
8
8
  import { instrumentObject } from './instrumentObject.js';
9
9
  import { createQueue } from './queue.js';
10
10
  import { hashToken, hookRecoveryMarkerPath } from './storage/helpers.js';
11
+ import { resetHookIndexEnsureCache } from './storage/hook-index.js';
11
12
  import { createStorage } from './storage.js';
12
13
  import { createStreamer } from './streamer.js';
13
14
  // Re-export init types and utilities for consumers
@@ -99,6 +100,7 @@ export function createWorld(args) {
99
100
  'steps',
100
101
  'events',
101
102
  'hooks',
103
+ 'hooks/by-run',
102
104
  'waits',
103
105
  'streams/runs',
104
106
  ];
@@ -107,6 +109,26 @@ export function createWorld(args) {
107
109
  const files = await listTaggedFiles(fullDir, tag);
108
110
  await Promise.all(files.map((f) => deleteJSON(path.join(fullDir, f))));
109
111
  }));
112
+ // Delete tagged hook-index entries (nested per-key directories)
113
+ for (const indexDir of ['token-index', 'id-index']) {
114
+ const fullIndexDir = path.join(basedir, 'hooks', indexDir);
115
+ let keyDirEntries;
116
+ try {
117
+ keyDirEntries = await fs.readdir(fullIndexDir, {
118
+ withFileTypes: true,
119
+ });
120
+ }
121
+ catch {
122
+ keyDirEntries = [];
123
+ }
124
+ await Promise.all(keyDirEntries
125
+ .filter((entry) => entry.isDirectory())
126
+ .map(async (entry) => {
127
+ const keyDir = path.join(fullIndexDir, entry.name);
128
+ const taggedEntryFiles = await listTaggedFiles(keyDir, tag);
129
+ await Promise.all(taggedEntryFiles.map((f) => deleteJSON(path.join(keyDir, f))));
130
+ }));
131
+ }
110
132
  // Clean up lock files used for atomic terminal-state guards
111
133
  await fs
112
134
  .rm(path.join(basedir, '.locks'), { recursive: true, force: true })
@@ -139,6 +161,7 @@ export function createWorld(args) {
139
161
  else {
140
162
  // `rm()` removes directories that the write path may have cached.
141
163
  clearCreatedFilesCache();
164
+ resetHookIndexEnsureCache();
142
165
  await rm(mergedConfig.dataDir, { recursive: true, force: true });
143
166
  await initDataDir(mergedConfig.dataDir);
144
167
  }
@@ -151,4 +174,4 @@ export function createWorld(args) {
151
174
  export function createLocalWorld(args) {
152
175
  return createWorld(args);
153
176
  }
154
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUU3QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLE1BQU0sRUFDTixVQUFVLEVBQ1YsZUFBZSxFQUNmLDBCQUEwQixFQUMxQixRQUFRLEdBQ1QsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFzQixNQUFNLFlBQVksQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9DLG1EQUFtRDtBQUNuRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsV0FBVyxFQUVYLFlBQVksR0FDYixNQUFNLFdBQVcsQ0FBQztBQVduQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQXNCO0lBQ2hELE1BQU0sV0FBVyxHQUFHLElBQUk7UUFDdEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxX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QztvQkFDRixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3ZCLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQ3hELENBQ0YsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FDTCxDQUFDO2dCQUNGLGlFQUFpRTtnQkFDakUsc0JBQXNCLEVBQUUsQ0FBQztZQUMzQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sa0VBQWtFO2dCQUNsRSxzQkFBc0IsRUFBRSxDQUFDO2dCQUN6QixNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDakUsTUFBTSxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFDLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxJQUFzQjtJQUNyRCxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHJtIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHR5cGUgeyBRdWV1ZVByZWZpeCwgV29ybGQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgcmVlbnF1ZXVlQWN0aXZlUnVucywgU1BFQ19WRVJTSU9OX0NVUlJFTlQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5pbXBvcnQge1xuICBjbGVhckNyZWF0ZWRGaWxlc0NhY2hlLFxuICBkZWxldGVKU09OLFxuICBoYXNUYWcsXG4gIGlzVW50YWdnZWQsXG4gIGxpc3RUYWdnZWRGaWxlcyxcbiAgbGlzdFRhZ2dlZEZpbGVzQnlFeHRlbnNpb24sXG4gIHJlYWRKU09OLFxufSBmcm9tICcuL2ZzLmpzJztcbmltcG9ydCB7IGluaXREYXRhRGlyIH0gZnJvbSAnLi9pbml0LmpzJztcbmltcG9ydCB7IGluc3RydW1lbnRPYmplY3QgfSBmcm9tICcuL2luc3RydW1lbnRPYmplY3QuanMnO1xuaW1wb3J0IHsgY3JlYXRlUXVldWUsIHR5cGUgRGlyZWN0SGFuZGxlciB9IGZyb20gJy4vcXVldWUuanMnO1xuaW1wb3J0IHsgaGFzaFRva2VuLCBob29rUmVjb3ZlcnlNYXJrZXJQYXRoIH0gZnJvbSAnLi9zdG9yYWdlL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgY3JlYXRlU3RvcmFnZSB9IGZyb20gJy4vc3RvcmFnZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTdHJlYW1lciB9IGZyb20gJy4vc3RyZWFtZXIuanMnO1xuXG4vLyBSZS1leHBvcnQgaW5pdCB0eXBlcyBhbmQgdXRpbGl0aWVzIGZvciBjb25zdW1lcnNcbmV4cG9ydCB7XG4gIERhdGFEaXJBY2Nlc3NFcnJvcixcbiAgRGF0YURpclZlcnNpb25FcnJvcixcbiAgZW5zdXJlRGF0YURpcixcbiAgaW5pdERhdGFEaXIsXG4gIHR5cGUgUGFyc2VkVmVyc2lvbixcbiAgcGFyc2VWZXJzaW9uLFxufSBmcm9tICcuL2luaXQuanMnO1xuXG5leHBvcnQgdHlwZSB7IERpcmVjdEhhbmRsZXIgfSBmcm9tICcuL3F1ZXVlLmpzJztcblxuZXhwb3J0IHR5cGUgTG9jYWxXb3JsZCA9IFdvcmxkICYge1xuICAvKiogUmVnaXN0ZXIgYSBkaXJlY3QgaW4tcHJvY2VzcyBoYW5kbGVyIGZvciBhIHF1ZXVlIHByZWZpeCwgYnlwYXNzaW5nIEhUVFAuICovXG4gIHJlZ2lzdGVySGFuZGxlcihwcmVmaXg6IFF1ZXVlUHJlZml4LCBoYW5kbGVyOiBEaXJlY3RIYW5kbGVyKTogdm9pZDtcbiAgLyoqIENsZWFyIGFsbCB3b3JrZmxvdyBkYXRhIChydW5zLCBzdGVwcywgZXZlbnRzLCBob29rcywgc3RyZWFtcykuICovXG4gIGNsZWFyKCk6IFByb21pc2U8dm9pZD47XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBsb2NhbCB3b3JsZCBpbnN0YW5jZSB0aGF0IGNvbWJpbmVzIHF1ZXVlLCBzdG9yYWdlLCBhbmQgc3RyZWFtZXIgZnVuY3Rpb25hbGl0aWVzLlxuICpcbiAqIEBwYXJhbSBhcmdzIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEBwYXJhbSBhcmdzLmRhdGFEaXIgLSBEaXJlY3RvcnkgZm9yIHN0b3Jpbmcgd29ya2Zsb3cgZGF0YSAoZGVmYXVsdDogYC53b3JrZmxvdy1kYXRhL2ApXG4gKiBAcGFyYW0gYXJncy5wb3J0IC0gUG9ydCBvdmVycmlkZSBmb3IgcXVldWUgdHJhbnNwb3J0IChkZWZhdWx0OiBhdXRvLWRldGVjdGVkKVxuICogQHBhcmFtIGFyZ3MuYmFzZVVybCAtIEZ1bGwgYmFzZSBVUkwgb3ZlcnJpZGUgZm9yIHF1ZXVlIHRyYW5zcG9ydCAoZGVmYXVsdDogYGh0dHA6Ly9sb2NhbGhvc3Q6e3BvcnR9YClcbiAqIEBwYXJhbSBhcmdzLnJlY292ZXJBY3RpdmVSdW5zIC0gV2hldGhlciBgc3RhcnQoKWAgc2hvdWxkIHJlLWVucXVldWUgcGVuZGluZy9ydW5uaW5nIHJ1bnMgZnJvbSBzdG9yYWdlIChkZWZhdWx0OiBgdHJ1ZWApXG4gKiBAcGFyYW0gYXJncy50YWcgLSBPcHRpb25hbCB0YWcgdG8gc2NvcGUgZmlsZXMgKGUuZy4sIGB2aXRlc3QtMGApLiBXaGVuIHNldCwgZmlsZXMgYXJlIHdyaXR0ZW5cbiAqICAgYXMgYHtpZH0ue3RhZ30uanNvbmAgYW5kIGBjbGVhcigpYCBvbmx5IGRlbGV0ZXMgZmlsZXMgbWF0Y2hpbmcgdGhpcyB0YWcuXG4gKiBAdGhyb3dzIHtEYXRhRGlyQWNjZXNzRXJyb3J9IElmIHRoZSBkYXRhIGRpcmVjdG9yeSBjYW5ub3QgYmUgY3JlYXRlZCBvciBhY2Nlc3NlZFxuICogQHRocm93cyB7RGF0YURpclZlcnNpb25FcnJvcn0gSWYgdGhlIGRhdGEgZGlyZWN0b3J5IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXb3JsZChhcmdzPzogUGFydGlhbDxDb25maWc+KTogTG9jYWxXb3JsZCB7XG4gIGNvbnN0IGRlZmluZWRBcmdzID0gYXJnc1xuICAgID8gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhhcmdzKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgIClcbiAgICA6IHt9O1xuICBjb25zdCBtZXJnZWRDb25maWcgPSB7IC4uLmNvbmZpZy52YWx1ZSwgLi4uZGVmaW5lZEFyZ3MgfTtcbiAgY29uc3QgdGFnID0gbWVyZ2VkQ29uZmlnLnRhZztcbiAgY29uc3QgcXVldWUgPSBjcmVhdGVRdWV1ZShtZXJnZWRDb25maWcpO1xuICBjb25zdCB7IGNsZWFyQ2FjaGU6IGNsZWFyU3RvcmFnZUNhY2hlLCAuLi5zdG9yYWdlIH0gPSBjcmVhdGVTdG9yYWdlKFxuICAgIG1lcmdlZENvbmZpZy5kYXRhRGlyLFxuICAgIHRhZ1xuICApO1xuICBjb25zdCByZWNvdmVyQWN0aXZlUnVucyA9IG1lcmdlZENvbmZpZy5yZWNvdmVyQWN0aXZlUnVucyA/PyB0cnVlO1xuICByZXR1cm4ge1xuICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAuLi5xdWV1ZSxcbiAgICAuLi5zdG9yYWdlLFxuICAgIC4uLmluc3RydW1lbnRPYmplY3QoJ3dvcmxkLnN0cmVhbXMnLCB7XG4gICAgICAuLi5jcmVhdGVTdHJlYW1lcihtZXJnZWRDb25maWcuZGF0YURpciwgdGFnKSxcbiAgICAgIC4uLihtZXJnZWRDb25maWcuc3RyZWFtRmx1c2hJbnRlcnZhbE1zICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICBzdHJlYW1GbHVzaEludGVydmFsTXM6IG1lcmdlZENvbmZpZy5zdHJlYW1GbHVzaEludGVydmFsTXMsXG4gICAgICB9KSxcbiAgICB9KSxcbiAgICBhc3luYyBzdGFydCgpIHtcbiAgICAgIGF3YWl0IGluaXREYXRhRGlyKG1lcmdlZENvbmZpZy5kYXRhRGlyKTtcbiAgICAgIGlmICghcmVjb3ZlckFjdGl2ZVJ1bnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU2NvcGUgcmVjb3ZlcnkgdG8gdGhpcyB3b3JsZCdzIG93biBmaWxlcy4gQSB0YWdnZWQgd29ybGQgcmVjb3ZlcnMgb25seVxuICAgICAgLy8gaXRzIHRhZzsgYW4gdW50YWdnZWQgd29ybGQgcmVjb3ZlcnMgb25seSB1bnRhZ2dlZCBmaWxlcy4gV2l0aG91dCB0aGVcbiAgICAgIC8vIHVudGFnZ2VkIGZpbHRlciwgYW4gdW50YWdnZWQgZGV2IHNlcnZlciBzaGFyaW5nIHRoZSBkYXRhIGRpcmVjdG9yeSB3aXRoXG4gICAgICAvLyB0aGUgdml0ZXN0IGhhcm5lc3Mgd291bGQgbGlzdCB0YWdnZWQgcnVucyAobGlzdCBlbnVtZXJhdGVzIGV2ZXJ5IGZpbGUpXG4gICAgICAvLyBhbmQgcmUtZW5xdWV1ZSB0aGVtLCBidXQgcnVuX3N0YXJ0ZWQncyB0YWdnZWQtb3ItdW50YWdnZWQgcmVhZCBjYW4ndFxuICAgICAgLy8gcmVzb2x2ZSBhIGZvcmVpZ24gdGFnIOKAlCB5aWVsZGluZyBcImRpZCBub3QgcmV0dXJuIHRoZSBydW4gZW50aXR5XCIgNTAwc1xuICAgICAgLy8gb24gc3RhcnR1cCB1bnRpbCB0aGUgbWVzc2FnZSBleGhhdXN0cyBpdHMgZGVsaXZlcmllcy5cbiAgICAgIGNvbnN0IGZpbGVJZEZpbHRlciA9IHRhZ1xuICAgICAgICA/IChmaWxlSWQ6IHN0cmluZykgPT4gaGFzVGFnKGZpbGVJZCwgdGFnKVxuICAgICAgICA6IGlzVW50YWdnZWQ7XG4gICAgICBjb25zdCByZWNvdmVyeVJ1bnMgPSB7XG4gICAgICAgIC4uLnN0b3JhZ2UucnVucyxcbiAgICAgICAgbGlzdDogKChwYXJhbXMpID0+XG4gICAgICAgICAgc3RvcmFnZS5ydW5zLmxpc3Qoe1xuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgZmlsZUlkRmlsdGVyLFxuICAgICAgICAgIH0pKSBhcyB0eXBlb2Ygc3RvcmFnZS5ydW5zLmxpc3QsXG4gICAgICB9O1xuICAgICAgYXdhaXQgcmVlbnF1ZXVlQWN0aXZlUnVucyhyZWNvdmVyeVJ1bnMsIHF1ZXVlLnF1ZXVlLCAnd29ybGQtbG9jYWwnKTtcbiAgICB9LFxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgY2xlYXJTdG9yYWdlQ2FjaGUoKTtcbiAgICAgIGF3YWl0IHF1ZXVlLmNsb3NlKCk7XG4gICAgfSxcbiAgICBhc3luYyBjbGVhcigpIHtcbiAgICAgIGNsZWFyU3RvcmFnZUNhY2hlKCk7XG4gICAgICBpZiAodGFnKSB7XG4gICAgICAgIC8vIFNlbGVjdGl2ZWx5IGRlbGV0ZSBvbmx5IGZpbGVzIG1hdGNoaW5nIHRoaXMgdGFnXG4gICAgICAgIGNvbnN0IGJhc2VkaXIgPSBtZXJnZWRDb25maWcuZGF0YURpcjtcblxuICAgICAgICAvLyBEZWxldGUgaG9vayB0b2tlbiBjb25zdHJhaW50IGZpbGVzIChhbmQgcmVjb3ZlcnkgbWFya2VycyxcbiAgICAgICAgLy8gZm9yIGRpc2sgaHlnaWVuZSkgQkVGT1JFIGRlbGV0aW5nIHRoZSBob29rcywgc2luY2Ugd2UgbmVlZFxuICAgICAgICAvLyB0byByZWFkIGVhY2ggaG9vayB0byBleHRyYWN0IGl0cyB0b2tlbiBoYXNoLiBDb25zdHJhaW50XG4gICAgICAgIC8vIGZpbGVzIGFuZCBtYXJrZXJzIGFyZSB1bnRhZ2dlZCAoYHtzaGEyNTZ9Lmpzb25gIGFuZFxuICAgICAgICAvLyBge3NoYTI1Nn0ucmVjb3ZlcnkuanNvbmApIHNvIGxpc3RUYWdnZWRGaWxlcyB3b24ndCBmaW5kXG4gICAgICAgIC8vIHRoZW0g4oCUIHdlIG11c3QgcmVzb2x2ZSB0aGVtIHZpYSB0aGUgaG9vayBkYXRhLlxuICAgICAgICBjb25zdCBob29rc0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnaG9va3MnKTtcbiAgICAgICAgY29uc3QgdGFnZ2VkSG9va0ZpbGVzID0gYXdhaXQgbGlzdFRhZ2dlZEZpbGVzKGhvb2tzRGlyLCB0YWcpO1xuICAgICAgICBjb25zdCB7IEhvb2tTY2hlbWEgfSA9IGF3YWl0IGltcG9ydCgnQHdvcmtmbG93L3dvcmxkJyk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHRhZ2dlZEhvb2tGaWxlcy5tYXAoYXN5bmMgKGhvb2tGaWxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBob29rID0gYXdhaXQgcmVhZEpTT04oXG4gICAgICAgICAgICAgIHBhdGguam9pbihob29rc0RpciwgaG9va0ZpbGUpLFxuICAgICAgICAgICAgICBIb29rU2NoZW1hXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGhvb2s/LnRva2VuKSB7XG4gICAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKGhvb2tzRGlyLCAndG9rZW5zJywgYCR7aGFzaFRva2VuKGhvb2sudG9rZW4pfS5qc29uYClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYXdhaXQgZGVsZXRlSlNPTihcbiAgICAgICAgICAgICAgICBob29rUmVjb3ZlcnlNYXJrZXJQYXRoKFxuICAgICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAgIGhvb2sudG9rZW4sXG4gICAgICAgICAgICAgICAgICBob29rLnJ1bklkLFxuICAgICAgICAgICAgICAgICAgaG9vay5ob29rSWRcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBEZWxldGUgdGFnZ2VkIGVudGl0eSBmaWxlcyBhY3Jvc3MgYWxsIGRpcmVjdG9yaWVzXG4gICAgICAgIGNvbnN0IGVudGl0eURpcnMgPSBbXG4gICAgICAgICAgJ3J1bnMnLFxuICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgJ2V2ZW50cycsXG4gICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICdzdHJlYW1zL3J1bnMnLFxuICAgICAgICBdO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBlbnRpdHlEaXJzLm1hcChhc3luYyAoZGlyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmdWxsRGlyID0gcGF0aC5qb2luKGJhc2VkaXIsIGRpcik7XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGxpc3RUYWdnZWRGaWxlcyhmdWxsRGlyLCB0YWcpO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIGZpbGVzLm1hcCgoZikgPT4gZGVsZXRlSlNPTihwYXRoLmpvaW4oZnVsbERpciwgZikpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICAvLyBDbGVhbiB1cCBsb2NrIGZpbGVzIHVzZWQgZm9yIGF0b21pYyB0ZXJtaW5hbC1zdGF0ZSBndWFyZHNcbiAgICAgICAgYXdhaXQgZnNcbiAgICAgICAgICAucm0ocGF0aC5qb2luKGJhc2VkaXIsICcubG9ja3MnKSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gICAgICAgICAgLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgLy8gRGVsZXRlIHRhZ2dlZCBzdHJlYW0gY2h1bmtzICgue3RhZ30uYmluIGZpbGVzKS4gQ2h1bmtzIGFyZSBzaGFyZGVkXG4gICAgICAgIC8vIG9uZSBkaXJlY3RvcnkgcGVyIHN0cmVhbSAoc3RyZWFtcy9jaHVua3MvPHN0cmVhbU5hbWU+LzxjaHVua0lkPi57dGFnfS5iaW4pLFxuICAgICAgICAvLyBzbyBpdGVyYXRlIGVhY2ggcGVyLXN0cmVhbSBkaXJlY3Rvcnkg4oCUIHRoZSB0b3AtbGV2ZWwgY2h1bmtzIGRpciBub3dcbiAgICAgICAgLy8gaG9sZHMgb25seSBzdWJkaXJlY3Rvcmllcywgc28gbGlzdGluZyBpdCBkaXJlY3RseSB3b3VsZCBtYXRjaCBub3RoaW5nXG4gICAgICAgIC8vIGFuZCBzaWxlbnRseSBsZWFrIHRhZ2dlZCBjaHVuayBmaWxlcyBhY3Jvc3MgdGVzdCBzZXNzaW9ucy5cbiAgICAgICAgY29uc3QgY2h1bmtzRGlyID0gcGF0aC5qb2luKGJhc2VkaXIsICdzdHJlYW1zJywgJ2NodW5rcycpO1xuICAgICAgICBsZXQgc3RyZWFtRGlyRW50cmllczogaW1wb3J0KCdub2RlOmZzJykuRGlyZW50W107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3RyZWFtRGlyRW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIoY2h1bmtzRGlyLCB7XG4gICAgICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBzdHJlYW1EaXJFbnRyaWVzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgc3RyZWFtRGlyRW50cmllc1xuICAgICAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmlzRGlyZWN0b3J5KCkpXG4gICAgICAgICAgICAubWFwKGFzeW5jIChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzdHJlYW1DaHVua0RpciA9IHBhdGguam9pbihjaHVua3NEaXIsIGVudHJ5Lm5hbWUpO1xuICAgICAgICAgICAgICBjb25zdCB0YWdnZWRCaW5GaWxlcyA9IGF3YWl0IGxpc3RUYWdnZWRGaWxlc0J5RXh0ZW5zaW9uKFxuICAgICAgICAgICAgICAgIHN0cmVhbUNodW5rRGlyLFxuICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICAnLmJpbidcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgdGFnZ2VkQmluRmlsZXMubWFwKChmKSA9PlxuICAgICAgICAgICAgICAgICAgZnMudW5saW5rKHBhdGguam9pbihzdHJlYW1DaHVua0RpciwgZikpLmNhdGNoKCgpID0+IHt9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIC8vIENsZWFyIHRoZSBpbi1tZW1vcnkgd3JpdGUgY2FjaGUgc28gZGVsZXRlZCBwYXRocyBhcmUgZm9yZ290dGVuXG4gICAgICAgIGNsZWFyQ3JlYXRlZEZpbGVzQ2FjaGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGBybSgpYCByZW1vdmVzIGRpcmVjdG9yaWVzIHRoYXQgdGhlIHdyaXRlIHBhdGggbWF5IGhhdmUgY2FjaGVkLlxuICAgICAgICBjbGVhckNyZWF0ZWRGaWxlc0NhY2hlKCk7XG4gICAgICAgIGF3YWl0IHJtKG1lcmdlZENvbmZpZy5kYXRhRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IGluaXREYXRhRGlyKG1lcmdlZENvbmZpZy5kYXRhRGlyKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgY3JlYXRlV29ybGQoKWAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvY2FsV29ybGQoYXJncz86IFBhcnRpYWw8Q29uZmlnPik6IExvY2FsV29ybGQge1xuICByZXR1cm4gY3JlYXRlV29ybGQoYXJncyk7XG59XG4iXX0=
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUU3QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLE1BQU0sRUFDTixVQUFVLEVBQ1YsZUFBZSxFQUNmLDBCQUEwQixFQUMxQixRQUFRLEdBQ1QsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFzQixNQUFNLFlBQVksQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9DLG1EQUFtRDtBQUNuRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsV0FBVyxFQUVYLFlBQVksR0FDYixNQUFNLFdBQVcsQ0FBQztBQVduQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQXNCO0lBQ2hELE1B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QUcsQ0FDZixjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDdkIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FDeEQsQ0FDRixDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUNMLENBQUM7Z0JBQ0YsaUVBQWlFO2dCQUNqRSxzQkFBc0IsRUFBRSxDQUFDO1lBQzNCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixrRUFBa0U7Z0JBQ2xFLHNCQUFzQixFQUFFLENBQUM7Z0JBQ3pCLHlCQUF5QixFQUFFLENBQUM7Z0JBQzVCLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQXNCO0lBQ3JELE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgcm0gfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgdHlwZSB7IFF1ZXVlUHJlZml4LCBXb3JsZCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyByZWVucXVldWVBY3RpdmVSdW5zLCBTUEVDX1ZFUlNJT05fQ1VSUkVOVCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IENvbmZpZyB9IGZyb20gJy4vY29uZmlnLmpzJztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4vY29uZmlnLmpzJztcbmltcG9ydCB7XG4gIGNsZWFyQ3JlYXRlZEZpbGVzQ2FjaGUsXG4gIGRlbGV0ZUpTT04sXG4gIGhhc1RhZyxcbiAgaXNVbnRhZ2dlZCxcbiAgbGlzdFRhZ2dlZEZpbGVzLFxuICBsaXN0VGFnZ2VkRmlsZXNCeUV4dGVuc2lvbixcbiAgcmVhZEpTT04sXG59IGZyb20gJy4vZnMuanMnO1xuaW1wb3J0IHsgaW5pdERhdGFEaXIgfSBmcm9tICcuL2luaXQuanMnO1xuaW1wb3J0IHsgaW5zdHJ1bWVudE9iamVjdCB9IGZyb20gJy4vaW5zdHJ1bWVudE9iamVjdC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVRdWV1ZSwgdHlwZSBEaXJlY3RIYW5kbGVyIH0gZnJvbSAnLi9xdWV1ZS5qcyc7XG5pbXBvcnQgeyBoYXNoVG9rZW4sIGhvb2tSZWNvdmVyeU1hcmtlclBhdGggfSBmcm9tICcuL3N0b3JhZ2UvaGVscGVycy5qcyc7XG5pbXBvcnQgeyByZXNldEhvb2tJbmRleEVuc3VyZUNhY2hlIH0gZnJvbSAnLi9zdG9yYWdlL2hvb2staW5kZXguanMnO1xuaW1wb3J0IHsgY3JlYXRlU3RvcmFnZSB9IGZyb20gJy4vc3RvcmFnZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTdHJlYW1lciB9IGZyb20gJy4vc3RyZWFtZXIuanMnO1xuXG4vLyBSZS1leHBvcnQgaW5pdCB0eXBlcyBhbmQgdXRpbGl0aWVzIGZvciBjb25zdW1lcnNcbmV4cG9ydCB7XG4gIERhdGFEaXJBY2Nlc3NFcnJvcixcbiAgRGF0YURpclZlcnNpb25FcnJvcixcbiAgZW5zdXJlRGF0YURpcixcbiAgaW5pdERhdGFEaXIsXG4gIHR5cGUgUGFyc2VkVmVyc2lvbixcbiAgcGFyc2VWZXJzaW9uLFxufSBmcm9tICcuL2luaXQuanMnO1xuXG5leHBvcnQgdHlwZSB7IERpcmVjdEhhbmRsZXIgfSBmcm9tICcuL3F1ZXVlLmpzJztcblxuZXhwb3J0IHR5cGUgTG9jYWxXb3JsZCA9IFdvcmxkICYge1xuICAvKiogUmVnaXN0ZXIgYSBkaXJlY3QgaW4tcHJvY2VzcyBoYW5kbGVyIGZvciBhIHF1ZXVlIHByZWZpeCwgYnlwYXNzaW5nIEhUVFAuICovXG4gIHJlZ2lzdGVySGFuZGxlcihwcmVmaXg6IFF1ZXVlUHJlZml4LCBoYW5kbGVyOiBEaXJlY3RIYW5kbGVyKTogdm9pZDtcbiAgLyoqIENsZWFyIGFsbCB3b3JrZmxvdyBkYXRhIChydW5zLCBzdGVwcywgZXZlbnRzLCBob29rcywgc3RyZWFtcykuICovXG4gIGNsZWFyKCk6IFByb21pc2U8dm9pZD47XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBsb2NhbCB3b3JsZCBpbnN0YW5jZSB0aGF0IGNvbWJpbmVzIHF1ZXVlLCBzdG9yYWdlLCBhbmQgc3RyZWFtZXIgZnVuY3Rpb25hbGl0aWVzLlxuICpcbiAqIEBwYXJhbSBhcmdzIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEBwYXJhbSBhcmdzLmRhdGFEaXIgLSBEaXJlY3RvcnkgZm9yIHN0b3Jpbmcgd29ya2Zsb3cgZGF0YSAoZGVmYXVsdDogYC53b3JrZmxvdy1kYXRhL2ApXG4gKiBAcGFyYW0gYXJncy5wb3J0IC0gUG9ydCBvdmVycmlkZSBmb3IgcXVldWUgdHJhbnNwb3J0IChkZWZhdWx0OiBhdXRvLWRldGVjdGVkKVxuICogQHBhcmFtIGFyZ3MuYmFzZVVybCAtIEZ1bGwgYmFzZSBVUkwgb3ZlcnJpZGUgZm9yIHF1ZXVlIHRyYW5zcG9ydCAoZGVmYXVsdDogYGh0dHA6Ly9sb2NhbGhvc3Q6e3BvcnR9YClcbiAqIEBwYXJhbSBhcmdzLnJlY292ZXJBY3RpdmVSdW5zIC0gV2hldGhlciBgc3RhcnQoKWAgc2hvdWxkIHJlLWVucXVldWUgcGVuZGluZy9ydW5uaW5nIHJ1bnMgZnJvbSBzdG9yYWdlIChkZWZhdWx0OiBgdHJ1ZWApXG4gKiBAcGFyYW0gYXJncy50YWcgLSBPcHRpb25hbCB0YWcgdG8gc2NvcGUgZmlsZXMgKGUuZy4sIGB2aXRlc3QtMGApLiBXaGVuIHNldCwgZmlsZXMgYXJlIHdyaXR0ZW5cbiAqICAgYXMgYHtpZH0ue3RhZ30uanNvbmAgYW5kIGBjbGVhcigpYCBvbmx5IGRlbGV0ZXMgZmlsZXMgbWF0Y2hpbmcgdGhpcyB0YWcuXG4gKiBAdGhyb3dzIHtEYXRhRGlyQWNjZXNzRXJyb3J9IElmIHRoZSBkYXRhIGRpcmVjdG9yeSBjYW5ub3QgYmUgY3JlYXRlZCBvciBhY2Nlc3NlZFxuICogQHRocm93cyB7RGF0YURpclZlcnNpb25FcnJvcn0gSWYgdGhlIGRhdGEgZGlyZWN0b3J5IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXb3JsZChhcmdzPzogUGFydGlhbDxDb25maWc+KTogTG9jYWxXb3JsZCB7XG4gIGNvbnN0IGRlZmluZWRBcmdzID0gYXJnc1xuICAgID8gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhhcmdzKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgIClcbiAgICA6IHt9O1xuICBjb25zdCBtZXJnZWRDb25maWcgPSB7IC4uLmNvbmZpZy52YWx1ZSwgLi4uZGVmaW5lZEFyZ3MgfTtcbiAgY29uc3QgdGFnID0gbWVyZ2VkQ29uZmlnLnRhZztcbiAgY29uc3QgcXVldWUgPSBjcmVhdGVRdWV1ZShtZXJnZWRDb25maWcpO1xuICBjb25zdCB7IGNsZWFyQ2FjaGU6IGNsZWFyU3RvcmFnZUNhY2hlLCAuLi5zdG9yYWdlIH0gPSBjcmVhdGVTdG9yYWdlKFxuICAgIG1lcmdlZENvbmZpZy5kYXRhRGlyLFxuICAgIHRhZ1xuICApO1xuICBjb25zdCByZWNvdmVyQWN0aXZlUnVucyA9IG1lcmdlZENvbmZpZy5yZWNvdmVyQWN0aXZlUnVucyA/PyB0cnVlO1xuICByZXR1cm4ge1xuICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAuLi5xdWV1ZSxcbiAgICAuLi5zdG9yYWdlLFxuICAgIC4uLmluc3RydW1lbnRPYmplY3QoJ3dvcmxkLnN0cmVhbXMnLCB7XG4gICAgICAuLi5jcmVhdGVTdHJlYW1lcihtZXJnZWRDb25maWcuZGF0YURpciwgdGFnKSxcbiAgICAgIC4uLihtZXJnZWRDb25maWcuc3RyZWFtRmx1c2hJbnRlcnZhbE1zICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICBzdHJlYW1GbHVzaEludGVydmFsTXM6IG1lcmdlZENvbmZpZy5zdHJlYW1GbHVzaEludGVydmFsTXMsXG4gICAgICB9KSxcbiAgICB9KSxcbiAgICBhc3luYyBzdGFydCgpIHtcbiAgICAgIGF3YWl0IGluaXREYXRhRGlyKG1lcmdlZENvbmZpZy5kYXRhRGlyKTtcbiAgICAgIGlmICghcmVjb3ZlckFjdGl2ZVJ1bnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU2NvcGUgcmVjb3ZlcnkgdG8gdGhpcyB3b3JsZCdzIG93biBmaWxlcy4gQSB0YWdnZWQgd29ybGQgcmVjb3ZlcnMgb25seVxuICAgICAgLy8gaXRzIHRhZzsgYW4gdW50YWdnZWQgd29ybGQgcmVjb3ZlcnMgb25seSB1bnRhZ2dlZCBmaWxlcy4gV2l0aG91dCB0aGVcbiAgICAgIC8vIHVudGFnZ2VkIGZpbHRlciwgYW4gdW50YWdnZWQgZGV2IHNlcnZlciBzaGFyaW5nIHRoZSBkYXRhIGRpcmVjdG9yeSB3aXRoXG4gICAgICAvLyB0aGUgdml0ZXN0IGhhcm5lc3Mgd291bGQgbGlzdCB0YWdnZWQgcnVucyAobGlzdCBlbnVtZXJhdGVzIGV2ZXJ5IGZpbGUpXG4gICAgICAvLyBhbmQgcmUtZW5xdWV1ZSB0aGVtLCBidXQgcnVuX3N0YXJ0ZWQncyB0YWdnZWQtb3ItdW50YWdnZWQgcmVhZCBjYW4ndFxuICAgICAgLy8gcmVzb2x2ZSBhIGZvcmVpZ24gdGFnIOKAlCB5aWVsZGluZyBcImRpZCBub3QgcmV0dXJuIHRoZSBydW4gZW50aXR5XCIgNTAwc1xuICAgICAgLy8gb24gc3RhcnR1cCB1bnRpbCB0aGUgbWVzc2FnZSBleGhhdXN0cyBpdHMgZGVsaXZlcmllcy5cbiAgICAgIGNvbnN0IGZpbGVJZEZpbHRlciA9IHRhZ1xuICAgICAgICA/IChmaWxlSWQ6IHN0cmluZykgPT4gaGFzVGFnKGZpbGVJZCwgdGFnKVxuICAgICAgICA6IGlzVW50YWdnZWQ7XG4gICAgICBjb25zdCByZWNvdmVyeVJ1bnMgPSB7XG4gICAgICAgIC4uLnN0b3JhZ2UucnVucyxcbiAgICAgICAgbGlzdDogKChwYXJhbXMpID0+XG4gICAgICAgICAgc3RvcmFnZS5ydW5zLmxpc3Qoe1xuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgZmlsZUlkRmlsdGVyLFxuICAgICAgICAgIH0pKSBhcyB0eXBlb2Ygc3RvcmFnZS5ydW5zLmxpc3QsXG4gICAgICB9O1xuICAgICAgYXdhaXQgcmVlbnF1ZXVlQWN0aXZlUnVucyhyZWNvdmVyeVJ1bnMsIHF1ZXVlLnF1ZXVlLCAnd29ybGQtbG9jYWwnKTtcbiAgICB9LFxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgY2xlYXJTdG9yYWdlQ2FjaGUoKTtcbiAgICAgIGF3YWl0IHF1ZXVlLmNsb3NlKCk7XG4gICAgfSxcbiAgICBhc3luYyBjbGVhcigpIHtcbiAgICAgIGNsZWFyU3RvcmFnZUNhY2hlKCk7XG4gICAgICBpZiAodGFnKSB7XG4gICAgICAgIC8vIFNlbGVjdGl2ZWx5IGRlbGV0ZSBvbmx5IGZpbGVzIG1hdGNoaW5nIHRoaXMgdGFnXG4gICAgICAgIGNvbnN0IGJhc2VkaXIgPSBtZXJnZWRDb25maWcuZGF0YURpcjtcblxuICAgICAgICAvLyBEZWxldGUgaG9vayB0b2tlbiBjb25zdHJhaW50IGZpbGVzIChhbmQgcmVjb3ZlcnkgbWFya2VycyxcbiAgICAgICAgLy8gZm9yIGRpc2sgaHlnaWVuZSkgQkVGT1JFIGRlbGV0aW5nIHRoZSBob29rcywgc2luY2Ugd2UgbmVlZFxuICAgICAgICAvLyB0byByZWFkIGVhY2ggaG9vayB0byBleHRyYWN0IGl0cyB0b2tlbiBoYXNoLiBDb25zdHJhaW50XG4gICAgICAgIC8vIGZpbGVzIGFuZCBtYXJrZXJzIGFyZSB1bnRhZ2dlZCAoYHtzaGEyNTZ9Lmpzb25gIGFuZFxuICAgICAgICAvLyBge3NoYTI1Nn0ucmVjb3ZlcnkuanNvbmApIHNvIGxpc3RUYWdnZWRGaWxlcyB3b24ndCBmaW5kXG4gICAgICAgIC8vIHRoZW0g4oCUIHdlIG11c3QgcmVzb2x2ZSB0aGVtIHZpYSB0aGUgaG9vayBkYXRhLlxuICAgICAgICBjb25zdCBob29rc0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnaG9va3MnKTtcbiAgICAgICAgY29uc3QgdGFnZ2VkSG9va0ZpbGVzID0gYXdhaXQgbGlzdFRhZ2dlZEZpbGVzKGhvb2tzRGlyLCB0YWcpO1xuICAgICAgICBjb25zdCB7IEhvb2tTY2hlbWEgfSA9IGF3YWl0IGltcG9ydCgnQHdvcmtmbG93L3dvcmxkJyk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHRhZ2dlZEhvb2tGaWxlcy5tYXAoYXN5bmMgKGhvb2tGaWxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBob29rID0gYXdhaXQgcmVhZEpTT04oXG4gICAgICAgICAgICAgIHBhdGguam9pbihob29rc0RpciwgaG9va0ZpbGUpLFxuICAgICAgICAgICAgICBIb29rU2NoZW1hXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGhvb2s/LnRva2VuKSB7XG4gICAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKGhvb2tzRGlyLCAndG9rZW5zJywgYCR7aGFzaFRva2VuKGhvb2sudG9rZW4pfS5qc29uYClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYXdhaXQgZGVsZXRlSlNPTihcbiAgICAgICAgICAgICAgICBob29rUmVjb3ZlcnlNYXJrZXJQYXRoKFxuICAgICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAgIGhvb2sudG9rZW4sXG4gICAgICAgICAgICAgICAgICBob29rLnJ1bklkLFxuICAgICAgICAgICAgICAgICAgaG9vay5ob29rSWRcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBEZWxldGUgdGFnZ2VkIGVudGl0eSBmaWxlcyBhY3Jvc3MgYWxsIGRpcmVjdG9yaWVzXG4gICAgICAgIGNvbnN0IGVudGl0eURpcnMgPSBbXG4gICAgICAgICAgJ3J1bnMnLFxuICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgJ2V2ZW50cycsXG4gICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAnaG9va3MvYnktcnVuJyxcbiAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICdzdHJlYW1zL3J1bnMnLFxuICAgICAgICBdO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBlbnRpdHlEaXJzLm1hcChhc3luYyAoZGlyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmdWxsRGlyID0gcGF0aC5qb2luKGJhc2VkaXIsIGRpcik7XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGxpc3RUYWdnZWRGaWxlcyhmdWxsRGlyLCB0YWcpO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIGZpbGVzLm1hcCgoZikgPT4gZGVsZXRlSlNPTihwYXRoLmpvaW4oZnVsbERpciwgZikpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICAvLyBEZWxldGUgdGFnZ2VkIGhvb2staW5kZXggZW50cmllcyAobmVzdGVkIHBlci1rZXkgZGlyZWN0b3JpZXMpXG4gICAgICAgIGZvciAoY29uc3QgaW5kZXhEaXIgb2YgWyd0b2tlbi1pbmRleCcsICdpZC1pbmRleCddKSB7XG4gICAgICAgICAgY29uc3QgZnVsbEluZGV4RGlyID0gcGF0aC5qb2luKGJhc2VkaXIsICdob29rcycsIGluZGV4RGlyKTtcbiAgICAgICAgICBsZXQga2V5RGlyRW50cmllczogaW1wb3J0KCdub2RlOmZzJykuRGlyZW50W107XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGtleURpckVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGZ1bGxJbmRleERpciwge1xuICAgICAgICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBrZXlEaXJFbnRyaWVzID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAga2V5RGlyRW50cmllc1xuICAgICAgICAgICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgICAgICAgLm1hcChhc3luYyAoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlEaXIgPSBwYXRoLmpvaW4oZnVsbEluZGV4RGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWdnZWRFbnRyeUZpbGVzID0gYXdhaXQgbGlzdFRhZ2dlZEZpbGVzKGtleURpciwgdGFnKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgIHRhZ2dlZEVudHJ5RmlsZXMubWFwKChmKSA9PiBkZWxldGVKU09OKHBhdGguam9pbihrZXlEaXIsIGYpKSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYW4gdXAgbG9jayBmaWxlcyB1c2VkIGZvciBhdG9taWMgdGVybWluYWwtc3RhdGUgZ3VhcmRzXG4gICAgICAgIGF3YWl0IGZzXG4gICAgICAgICAgLnJtKHBhdGguam9pbihiYXNlZGlyLCAnLmxvY2tzJyksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgIC8vIERlbGV0ZSB0YWdnZWQgc3RyZWFtIGNodW5rcyAoLnt0YWd9LmJpbiBmaWxlcykuIENodW5rcyBhcmUgc2hhcmRlZFxuICAgICAgICAvLyBvbmUgZGlyZWN0b3J5IHBlciBzdHJlYW0gKHN0cmVhbXMvY2h1bmtzLzxzdHJlYW1OYW1lPi88Y2h1bmtJZD4ue3RhZ30uYmluKSxcbiAgICAgICAgLy8gc28gaXRlcmF0ZSBlYWNoIHBlci1zdHJlYW0gZGlyZWN0b3J5IOKAlCB0aGUgdG9wLWxldmVsIGNodW5rcyBkaXIgbm93XG4gICAgICAgIC8vIGhvbGRzIG9ubHkgc3ViZGlyZWN0b3JpZXMsIHNvIGxpc3RpbmcgaXQgZGlyZWN0bHkgd291bGQgbWF0Y2ggbm90aGluZ1xuICAgICAgICAvLyBhbmQgc2lsZW50bHkgbGVhayB0YWdnZWQgY2h1bmsgZmlsZXMgYWNyb3NzIHRlc3Qgc2Vzc2lvbnMuXG4gICAgICAgIGNvbnN0IGNodW5rc0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnc3RyZWFtcycsICdjaHVua3MnKTtcbiAgICAgICAgbGV0IHN0cmVhbURpckVudHJpZXM6IGltcG9ydCgnbm9kZTpmcycpLkRpcmVudFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN0cmVhbURpckVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGNodW5rc0Rpciwge1xuICAgICAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgc3RyZWFtRGlyRW50cmllcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHN0cmVhbURpckVudHJpZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0RpcmVjdG9yeSgpKVxuICAgICAgICAgICAgLm1hcChhc3luYyAoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtQ2h1bmtEaXIgPSBwYXRoLmpvaW4oY2h1bmtzRGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgICAgICAgICAgY29uc3QgdGFnZ2VkQmluRmlsZXMgPSBhd2FpdCBsaXN0VGFnZ2VkRmlsZXNCeUV4dGVuc2lvbihcbiAgICAgICAgICAgICAgICBzdHJlYW1DaHVua0RpcixcbiAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgJy5iaW4nXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgIHRhZ2dlZEJpbkZpbGVzLm1hcCgoZikgPT5cbiAgICAgICAgICAgICAgICAgIGZzLnVubGluayhwYXRoLmpvaW4oc3RyZWFtQ2h1bmtEaXIsIGYpKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICAvLyBDbGVhciB0aGUgaW4tbWVtb3J5IHdyaXRlIGNhY2hlIHNvIGRlbGV0ZWQgcGF0aHMgYXJlIGZvcmdvdHRlblxuICAgICAgICBjbGVhckNyZWF0ZWRGaWxlc0NhY2hlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBgcm0oKWAgcmVtb3ZlcyBkaXJlY3RvcmllcyB0aGF0IHRoZSB3cml0ZSBwYXRoIG1heSBoYXZlIGNhY2hlZC5cbiAgICAgICAgY2xlYXJDcmVhdGVkRmlsZXNDYWNoZSgpO1xuICAgICAgICByZXNldEhvb2tJbmRleEVuc3VyZUNhY2hlKCk7XG4gICAgICAgIGF3YWl0IHJtKG1lcmdlZENvbmZpZy5kYXRhRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IGluaXREYXRhRGlyKG1lcmdlZENvbmZpZy5kYXRhRGlyKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgY3JlYXRlV29ybGQoKWAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvY2FsV29ybGQoYXJncz86IFBhcnRpYWw8Q29uZmlnPik6IExvY2FsV29ybGQge1xuICByZXR1cm4gY3JlYXRlV29ybGQoYXJncyk7XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"events-storage.d.ts","sourceRoot":"","sources":["../../src/storage/events-storage.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAMV,OAAO,EAGR,MAAM,iBAAiB,CAAC;AAyazB;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG;IACnD,UAAU,IAAI,IAAI,CAAC;CACpB,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,GACX,kBAAkB,CA23DpB"}
1
+ {"version":3,"file":"events-storage.d.ts","sourceRoot":"","sources":["../../src/storage/events-storage.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAMV,OAAO,EAGR,MAAM,iBAAiB,CAAC;AA8bzB;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG;IACnD,UAAU,IAAI,IAAI,CAAC;CACpB,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,GACX,kBAAkB,CA82DpB"}