@mnaoumov/obsidian-lib 10.5.0 → 10.6.0

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.
Files changed (160) hide show
  1. package/README.md +6 -0
  2. package/codemirror/inline-token-widgets/package.json +6 -0
  3. package/codemirror/settings-facet/package.json +6 -0
  4. package/components/settings-facet-component/package.json +6 -0
  5. package/dist/lib/cjs/__merged.cjs +104 -1
  6. package/dist/lib/cjs/__merged.d.cts +20 -3
  7. package/dist/lib/cjs/anchored-suggest.cjs +232 -0
  8. package/dist/lib/cjs/anchored-suggest.d.cts +116 -0
  9. package/dist/lib/cjs/backlink-index.cjs +44 -8
  10. package/dist/lib/cjs/backlink-index.d.cts +23 -0
  11. package/dist/lib/cjs/bug-report.cjs +4 -2
  12. package/dist/lib/cjs/bug-report.d.cts +1 -1
  13. package/dist/lib/cjs/bulk-operation-progress.cjs +16 -1
  14. package/dist/lib/cjs/bulk-operation-progress.d.cts +22 -0
  15. package/dist/lib/cjs/case-insensitive-file-index.cjs +9 -1
  16. package/dist/lib/cjs/code-block-render-handoff.cjs +272 -0
  17. package/dist/lib/cjs/code-block-render-handoff.d.cts +131 -0
  18. package/dist/lib/cjs/codemirror/index.cjs +7 -1
  19. package/dist/lib/cjs/codemirror/index.d.cts +2 -0
  20. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +250 -0
  21. package/dist/lib/cjs/codemirror/inline-token-widgets.d.cts +109 -0
  22. package/dist/lib/cjs/codemirror/settings-facet.cjs +132 -0
  23. package/dist/lib/cjs/codemirror/settings-facet.d.cts +19 -0
  24. package/dist/lib/cjs/community-plugins.cjs +19 -2
  25. package/dist/lib/cjs/community-plugins.d.cts +14 -0
  26. package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +5 -2
  27. package/dist/lib/cjs/components/index.cjs +4 -1
  28. package/dist/lib/cjs/components/index.d.cts +1 -0
  29. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +105 -2
  30. package/dist/lib/cjs/components/settings-facet-component.cjs +136 -0
  31. package/dist/lib/cjs/components/settings-facet-component.d.cts +68 -0
  32. package/dist/lib/cjs/css-class.cjs +8 -1
  33. package/dist/lib/cjs/css-class.d.cts +28 -0
  34. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +38 -13
  35. package/dist/lib/cjs/desktop-bulk-operation-git.d.cts +21 -1
  36. package/dist/lib/cjs/desktop-request-url-stream.cjs +258 -0
  37. package/dist/lib/cjs/desktop-request-url-stream.d.cts +22 -0
  38. package/dist/lib/cjs/editor-suggest-registrar.cjs +8 -2
  39. package/dist/lib/cjs/editor-suggest-registrar.d.cts +14 -2
  40. package/dist/lib/cjs/editor-suggest.cjs +198 -0
  41. package/dist/lib/cjs/editor-suggest.d.cts +103 -0
  42. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  43. package/dist/lib/cjs/hotkey.cjs +185 -0
  44. package/dist/lib/cjs/hotkey.d.cts +59 -0
  45. package/dist/lib/cjs/i18n/locales/en.cjs +14 -1
  46. package/dist/lib/cjs/i18n/locales/en.d.cts +13 -0
  47. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +13 -0
  48. package/dist/lib/cjs/index.cjs +31 -1
  49. package/dist/lib/cjs/index.d.cts +10 -0
  50. package/dist/lib/cjs/inline-token-renderer.cjs +145 -0
  51. package/dist/lib/cjs/inline-token-renderer.d.cts +88 -0
  52. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +325 -0
  53. package/dist/lib/cjs/link-and-tag-input-suggest.d.cts +229 -0
  54. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -1
  55. package/dist/lib/cjs/markdown-code-block-processor.d.cts +18 -0
  56. package/dist/lib/cjs/markdown.cjs +6 -1
  57. package/dist/lib/cjs/markdown.d.cts +10 -1
  58. package/dist/lib/cjs/modals/modal.cjs +8 -5
  59. package/dist/lib/cjs/modals/modal.d.cts +4 -0
  60. package/dist/lib/cjs/plugin/plugin.cjs +5 -2
  61. package/dist/lib/cjs/plugin/plugin.d.cts +2 -0
  62. package/dist/lib/cjs/rendered-markdown.cjs +306 -0
  63. package/dist/lib/cjs/rendered-markdown.d.cts +77 -0
  64. package/dist/lib/cjs/request-url.cjs +523 -0
  65. package/dist/lib/cjs/request-url.d.cts +233 -0
  66. package/dist/lib/cjs/setting-components/folder-list-component.cjs +216 -0
  67. package/dist/lib/cjs/setting-components/folder-list-component.d.cts +73 -0
  68. package/dist/lib/cjs/setting-components/hotkey-component.cjs +260 -0
  69. package/dist/lib/cjs/setting-components/hotkey-component.d.cts +85 -0
  70. package/dist/lib/cjs/setting-components/index.cjs +13 -1
  71. package/dist/lib/cjs/setting-components/index.d.cts +4 -0
  72. package/dist/lib/cjs/setting-components/list-component.cjs +291 -0
  73. package/dist/lib/cjs/setting-components/list-component.d.cts +106 -0
  74. package/dist/lib/cjs/setting-components/tag-list-component.cjs +220 -0
  75. package/dist/lib/cjs/setting-components/tag-list-component.d.cts +82 -0
  76. package/dist/lib/cjs/setting-ex.cjs +51 -1
  77. package/dist/lib/cjs/setting-ex.d.cts +35 -1
  78. package/dist/lib/cjs/settings-tabs.cjs +258 -0
  79. package/dist/lib/cjs/settings-tabs.d.cts +101 -0
  80. package/dist/lib/esm/__merged.d.mts +20 -3
  81. package/dist/lib/esm/__merged.mjs +110 -2
  82. package/dist/lib/esm/anchored-suggest.d.mts +116 -0
  83. package/dist/lib/esm/anchored-suggest.mjs +144 -0
  84. package/dist/lib/esm/backlink-index.d.mts +23 -0
  85. package/dist/lib/esm/backlink-index.mjs +42 -7
  86. package/dist/lib/esm/bug-report.d.mts +1 -1
  87. package/dist/lib/esm/bug-report.mjs +4 -2
  88. package/dist/lib/esm/bulk-operation-progress.d.mts +22 -0
  89. package/dist/lib/esm/bulk-operation-progress.mjs +14 -1
  90. package/dist/lib/esm/case-insensitive-file-index.mjs +9 -1
  91. package/dist/lib/esm/code-block-render-handoff.d.mts +131 -0
  92. package/dist/lib/esm/code-block-render-handoff.mjs +183 -0
  93. package/dist/lib/esm/codemirror/index.d.mts +2 -0
  94. package/dist/lib/esm/codemirror/index.mjs +5 -1
  95. package/dist/lib/esm/codemirror/inline-token-widgets.d.mts +109 -0
  96. package/dist/lib/esm/codemirror/inline-token-widgets.mjs +167 -0
  97. package/dist/lib/esm/codemirror/settings-facet.d.mts +19 -0
  98. package/dist/lib/esm/codemirror/settings-facet.mjs +44 -0
  99. package/dist/lib/esm/community-plugins.d.mts +14 -0
  100. package/dist/lib/esm/community-plugins.mjs +18 -2
  101. package/dist/lib/esm/components/bulk-operation-commit-component.mjs +5 -2
  102. package/dist/lib/esm/components/index.d.mts +1 -0
  103. package/dist/lib/esm/components/index.mjs +3 -1
  104. package/dist/lib/esm/components/rename-delete-handler-component.mjs +105 -2
  105. package/dist/lib/esm/components/settings-facet-component.d.mts +68 -0
  106. package/dist/lib/esm/components/settings-facet-component.mjs +48 -0
  107. package/dist/lib/esm/css-class.d.mts +28 -0
  108. package/dist/lib/esm/css-class.mjs +8 -1
  109. package/dist/lib/esm/desktop-bulk-operation-git.d.mts +21 -1
  110. package/dist/lib/esm/desktop-bulk-operation-git.mjs +38 -13
  111. package/dist/lib/esm/desktop-request-url-stream.d.mts +22 -0
  112. package/dist/lib/esm/desktop-request-url-stream.mjs +170 -0
  113. package/dist/lib/esm/editor-suggest-registrar.d.mts +14 -2
  114. package/dist/lib/esm/editor-suggest-registrar.mjs +8 -2
  115. package/dist/lib/esm/editor-suggest.d.mts +103 -0
  116. package/dist/lib/esm/editor-suggest.mjs +109 -0
  117. package/dist/lib/esm/generated-during-build.mjs +2 -2
  118. package/dist/lib/esm/hotkey.d.mts +59 -0
  119. package/dist/lib/esm/hotkey.mjs +95 -0
  120. package/dist/lib/esm/i18n/locales/en.d.mts +13 -0
  121. package/dist/lib/esm/i18n/locales/en.mjs +14 -1
  122. package/dist/lib/esm/i18n/locales/translations-map.d.mts +13 -0
  123. package/dist/lib/esm/index.d.mts +10 -0
  124. package/dist/lib/esm/index.mjs +21 -1
  125. package/dist/lib/esm/inline-token-renderer.d.mts +88 -0
  126. package/dist/lib/esm/inline-token-renderer.mjs +59 -0
  127. package/dist/lib/esm/link-and-tag-input-suggest.d.mts +229 -0
  128. package/dist/lib/esm/link-and-tag-input-suggest.mjs +239 -0
  129. package/dist/lib/esm/markdown-code-block-processor.d.mts +18 -0
  130. package/dist/lib/esm/markdown-code-block-processor.mjs +16 -1
  131. package/dist/lib/esm/markdown.d.mts +10 -1
  132. package/dist/lib/esm/markdown.mjs +9 -1
  133. package/dist/lib/esm/modals/modal.d.mts +4 -0
  134. package/dist/lib/esm/modals/modal.mjs +8 -5
  135. package/dist/lib/esm/plugin/plugin.d.mts +2 -0
  136. package/dist/lib/esm/plugin/plugin.mjs +5 -2
  137. package/dist/lib/esm/rendered-markdown.d.mts +77 -0
  138. package/dist/lib/esm/rendered-markdown.mjs +219 -0
  139. package/dist/lib/esm/request-url.d.mts +233 -0
  140. package/dist/lib/esm/request-url.mjs +428 -0
  141. package/dist/lib/esm/setting-components/folder-list-component.d.mts +73 -0
  142. package/dist/lib/esm/setting-components/folder-list-component.mjs +131 -0
  143. package/dist/lib/esm/setting-components/hotkey-component.d.mts +85 -0
  144. package/dist/lib/esm/setting-components/hotkey-component.mjs +178 -0
  145. package/dist/lib/esm/setting-components/index.d.mts +4 -0
  146. package/dist/lib/esm/setting-components/index.mjs +9 -1
  147. package/dist/lib/esm/setting-components/list-component.d.mts +106 -0
  148. package/dist/lib/esm/setting-components/list-component.mjs +206 -0
  149. package/dist/lib/esm/setting-components/tag-list-component.d.mts +82 -0
  150. package/dist/lib/esm/setting-components/tag-list-component.mjs +131 -0
  151. package/dist/lib/esm/setting-ex.d.mts +35 -1
  152. package/dist/lib/esm/setting-ex.mjs +51 -1
  153. package/dist/lib/esm/settings-tabs.d.mts +101 -0
  154. package/dist/lib/esm/settings-tabs.mjs +170 -0
  155. package/dist/styles.css +83 -1
  156. package/package.json +3 -3
  157. package/setting-components/folder-list-component/package.json +6 -0
  158. package/setting-components/hotkey-component/package.json +6 -0
  159. package/setting-components/list-component/package.json +6 -0
  160. package/setting-components/tag-list-component/package.json +6 -0
@@ -258,30 +258,36 @@ class BulkOperationGitRepo {
258
258
  * follow-ups to settle, commits the result as `OP<n>: <summary>` and releases the lock. An operation that throws
259
259
  * still gets its partial changes committed, as `OP<n> interrupted`, before the error is rethrown.
260
260
  *
261
+ * When the lock was recovered under the operation (it went stale, and another operation, the scheduled autocommit or
262
+ * a reload committed `OP<n> interrupted` and removed it), the rest is never committed under the recovered id: the
263
+ * lock is taken again and the rest is committed as a fresh `OP<m>` whose summary names `OP<n>`.
264
+ *
261
265
  * @typeParam T - The type of the operation's result.
262
266
  * @param params - The parameters.
263
- * @returns The operation's result, its id and the hash of its commit.
267
+ * @returns The operation's result, its id, the hash of its commit and the id it lost to a recovery, if any.
264
268
  */
265
269
  async runBulkOperation(params) {
266
270
  await this.assertCanCommitLargeFiles();
267
271
  await this.acquireLock();
268
272
  let unregisterProgressListener = null;
269
273
  try {
270
- const operationId = await this.allocateOperationId(params.pluginId);
271
- await this.commitPending({ body: "", subject: (0, import_bulk_operation.buildBeforeOperationCommitSubject)(operationId) });
274
+ const startOperationId = await this.allocateOperationId(params.pluginId);
275
+ await this.commitPending({ body: "", subject: (0, import_bulk_operation.buildBeforeOperationCommitSubject)(startOperationId) });
272
276
  unregisterProgressListener = (0, import_bulk_operation_progress.registerBulkOperationProgressListener)(this.createThrottledHeartbeat());
273
277
  let result;
274
278
  try {
275
279
  result = await params.operation();
276
280
  await params.settle();
277
281
  } catch (error) {
278
- await this.heartbeat();
279
- await this.commitOperation({ isInterrupted: true, operationId, pluginId: params.pluginId });
282
+ const operationId2 = await this.reclaimLockIfRecovered(startOperationId, params.pluginId) ?? startOperationId;
283
+ await this.commitOperation({ isInterrupted: true, operationId: operationId2, pluginId: params.pluginId });
280
284
  throw error;
281
285
  }
282
- await this.heartbeat();
283
- const commitSha = await this.commitOperation({ operationId, pluginId: params.pluginId, summary: params.summary });
284
- return { commitSha, operationId, result };
286
+ const resumedOperationId = await this.reclaimLockIfRecovered(startOperationId, params.pluginId);
287
+ const operationId = resumedOperationId ?? startOperationId;
288
+ const summary = resumedOperationId === null ? params.summary : `${params.summary} (resumed after ${startOperationId} was recovered)`;
289
+ const commitSha = await this.commitOperation({ operationId, pluginId: params.pluginId, summary });
290
+ return { commitSha, operationId, recoveredOperationId: resumedOperationId === null ? null : startOperationId, result };
285
291
  } finally {
286
292
  unregisterProgressListener?.();
287
293
  await this.releaseLock();
@@ -309,8 +315,8 @@ class BulkOperationGitRepo {
309
315
  await (0, import_async.setTimeoutAsync)(LOCK_POLL_INTERVAL_IN_MILLISECONDS);
310
316
  }
311
317
  }
312
- async allocateOperationId(pluginId) {
313
- const operationId = await this.findNextOperationId();
318
+ async allocateOperationId(pluginId, usedOperationId) {
319
+ const operationId = await this.findNextOperationId(usedOperationId);
314
320
  const ownLock = (0, import_type_guards.ensureNonNullable)(this.ownLock);
315
321
  this.ownLock = { ...ownLock, heartbeatAt: Date.now(), operationId, pluginId };
316
322
  await this.writeLock(this.ownLock);
@@ -354,11 +360,11 @@ class BulkOperationGitRepo {
354
360
  });
355
361
  };
356
362
  }
357
- async findNextOperationId() {
363
+ async findNextOperationId(usedOperationId) {
358
364
  const result = await this.runGit({
359
365
  gitArguments: ["log", "--all", "--format=%s", "--extended-regexp", "--grep=^(chore: before )?OP[0-9]+"]
360
366
  });
361
- return (0, import_bulk_operation.getNextOperationId)(result.stdout.split(/\r?\n/));
367
+ return (0, import_bulk_operation.getNextOperationId)([...result.stdout.split(/\r?\n/), usedOperationId ?? ""]);
362
368
  }
363
369
  async heartbeat() {
364
370
  const lock = await this.readLock();
@@ -406,6 +412,25 @@ class BulkOperationGitRepo {
406
412
  startedAt: 0
407
413
  };
408
414
  }
415
+ /**
416
+ * Refreshes the operation's lock before its commit, or takes the lock again when it was recovered under the
417
+ * operation.
418
+ *
419
+ * @param operationId - The id the operation started under.
420
+ * @param pluginId - The id of the plugin running the operation.
421
+ * @returns `null` when the lock is still the operation's own, otherwise the fresh id the rest is committed under.
422
+ */
423
+ async reclaimLockIfRecovered(operationId, pluginId) {
424
+ const lock = await this.readLock();
425
+ if (lock !== null && this.isOwnLock(lock)) {
426
+ await this.writeLock({ ...lock, heartbeatAt: Date.now() });
427
+ return null;
428
+ }
429
+ console.warn(`The bulk operation lock of ${operationId} was recovered while it ran; committing the rest under a fresh operation id.`);
430
+ this.ownLock = null;
431
+ await this.acquireLock();
432
+ return await this.allocateOperationId(pluginId, operationId);
433
+ }
409
434
  async recover(lock) {
410
435
  const operationId = lock.operationId || await this.findNextOperationId();
411
436
  await this.commitOperation({ isInterrupted: true, operationId, pluginId: lock.pluginId || "unknown" });
@@ -531,4 +556,4 @@ function isProcessAlive(processId) {
531
556
  BulkOperationGitRepo,
532
557
  GitCommandError
533
558
  });
534
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZXNrdG9wLWJ1bGstb3BlcmF0aW9uLWdpdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGRlc2t0b3AgaGFsZiBvZiBidWxrLW9wZXJhdGlvbiBnaXQgY29tbWl0czogZHJpdmVzIHRoZSBzeXN0ZW0gYGdpdGAgQ0xJIHRvIHdyYXAgYSBidWxrIG9wZXJhdGlvbiBpbiBjb21taXRzLFxuICogZ3VhcmRlZCBieSBhIGxlYXNlIGxvY2sgaW4gdGhlIHJlcG8ncyBnaXQgZGlyZWN0b3J5LlxuICpcbiAqIFRoZSBzeXN0ZW0gQ0xJIGlzIHVzZWQgcmF0aGVyIHRoYW4gYSBidW5kbGVkIGltcGxlbWVudGF0aW9uIGJlY2F1c2UgaXQgaG9ub3JzIHRoZSByZXBvJ3Mgb3duIGNvbmZpZywgaG9va3NcbiAqIGFuZCBjbGVhbi9zbXVkZ2UgZmlsdGVycywgZ2l0LWFubmV4J3MgYW1vbmcgdGhlbSwgYW5kIGJlY2F1c2UgYGdpdCByZXZlcnRgIGlzIHRoZSB3aG9sZSB1bmRvIHN0b3J5LlxuICpcbiAqIEV2ZXJ5IGNvbW1hbmQgcnVucyB3aXRoIHRoZSB2YXVsdCBmb2xkZXIgYXMgaXRzIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBgLmAgYXMgaXRzIHBhdGhzcGVjLCBzbyB3aGVuIHRoZSB2YXVsdCBpcyBhXG4gKiBzdWJmb2xkZXIgb2YgYSBsYXJnZXIgcmVwbyBvbmx5IHRoZSB2YXVsdCdzIGNoYW5nZXMgYXJlIGNvbW1pdHRlZC5cbiAqXG4gKiBEZXNrdG9wLW9ubHkgKGBub2RlOmNoaWxkX3Byb2Nlc3NgLCBgbm9kZTpmc2AsIGBub2RlOm9zYCksIGJ1dCBpbmVydCB0byBpbXBvcnQgb24gbW9iaWxlOiBub3RoaW5nIGhlcmUgdG91Y2hlcyBhXG4gKiBOb2RlIGJ1aWx0aW4gdW50aWwgYSBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gKi9cblxuaW1wb3J0IHsgc2V0VGltZW91dEFzeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IG5vb3BBc3luYyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9mdW5jdGlvbic7XG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcmVnLWV4cCc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICByZWFkRmlsZSxcbiAgcmVuYW1lLFxuICBzdGF0LFxuICB1bmxpbmssXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7XG4gIGhvc3RuYW1lLFxuICB1cHRpbWVcbn0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUge1xuICBCdWxrT3BlcmF0aW9uQ29tbWl0LFxuICBCdWxrT3BlcmF0aW9uTG9ja1xufSBmcm9tICcuL2J1bGstb3BlcmF0aW9uLnRzJztcblxuaW1wb3J0IHsgcmVnaXN0ZXJCdWxrT3BlcmF0aW9uUHJvZ3Jlc3NMaXN0ZW5lciB9IGZyb20gJy4vYnVsay1vcGVyYXRpb24tcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHtcbiAgYnVpbGRCZWZvcmVPcGVyYXRpb25Db21taXRTdWJqZWN0LFxuICBidWlsZE9wZXJhdGlvbkNvbW1pdE1lc3NhZ2UsXG4gIEJVTEtfT1BFUkFUSU9OX0xPQ0tfRklMRV9OQU1FLFxuICBnZXROZXh0T3BlcmF0aW9uSWQsXG4gIGlzQnVsa09wZXJhdGlvbkxvY2ssXG4gIGlzQnVsa09wZXJhdGlvbkxvY2tTdGFsZSxcbiAgcGFyc2VCdWxrT3BlcmF0aW9uQ29tbWl0LFxuICBQTFVHSU5fVFJBSUxFUl9LRVlcbn0gZnJvbSAnLi9idWxrLW9wZXJhdGlvbi50cyc7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIEJ1bGtPcGVyYXRpb25HaXRSZXBvfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb0NvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXBvJ3MgZ2l0IGRpcmVjdG9yeSwgd2hlcmUgdGhlIGxlYXNlIGxvY2sgbGl2ZXMuXG4gICAqL1xuICByZWFkb25seSBnaXREaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBmb3IgYW5vdGhlciBvcGVyYXRpb24ncyBsb2NrIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2MDBfMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmb2xkZXIgd2hvc2UgY2hhbmdlcyBhcmUgY29tbWl0dGVkOiB0aGUgdmF1bHQgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucnVuQnVsa09wZXJhdGlvbn0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb1J1bkJ1bGtPcGVyYXRpb25QYXJhbXM8VD4ge1xuICAvKipcbiAgICogUnVucyB0aGUgYnVsayBvcGVyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246ICgpID0+IFByb21pc2U8VD47XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgZm9sbG93LXVwcyB0aGUgb3BlcmF0aW9uIHNldCBvZmYgKHJlbmFtZSBoYW5kbGVycywgbGluayB1cGRhdGVzLCB0aGUgbWV0YWRhdGEgY2FjaGUpIHRvIGZpbmlzaCwgc29cbiAgICogdGhlaXIgY2hhbmdlcyBsYW5kIGluIHRoZSBvcGVyYXRpb24ncyBjb21taXQuXG4gICAqL1xuICByZWFkb25seSBzZXR0bGU6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIG9wZXJhdGlvbiwgdXNlZCBpbiB0aGUgY29tbWl0IHN1YmplY3QuXG4gICAqL1xuICByZWFkb25seSBzdW1tYXJ5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucnVuQnVsa09wZXJhdGlvbn0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRCdWxrT3BlcmF0aW9uUmVzdWx0PFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBoYXNoIG9mIHRoZSBjb21taXQgcmVjb3JkaW5nIHRoZSBvcGVyYXRpb24sIG9yIGBudWxsYCB3aGVuIHRoZSBvcGVyYXRpb24gY2hhbmdlZCBub3RoaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWl0U2hhOiBudWxsIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW9uIGlkLCBzdWNoIGFzIGBPUDEyYC5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSByZXN1bHQ6IFQ7XG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucmV2ZXJ0QnVsa09wZXJhdGlvbkNvbW1pdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2l0UmV2ZXJ0UmVzdWx0IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHJldmVydCBzdG9wcGVkIG9uIGEgY29uZmxpY3QsIGxlYXZpbmcgdGhlIHJlcG8gbWlkLXJldmVydCBmb3IgdGhlIHVzZXIgdG8gcmVzb2x2ZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ29uZmxpY3Q6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoYXQgZ2l0IHByaW50ZWQuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEJ1bGtPcGVyYXRpb25HaXRSZXBvUnVuR2l0UGFyYW1zIHtcbiAgcmVhZG9ubHkgYWxsb3dlZEV4aXRDb2Rlcz86IHJlYWRvbmx5IG51bWJlcltdO1xuICByZWFkb25seSBnaXRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgR2l0Q29tbWFuZFJlc3VsdCB7XG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudW1iZXI7XG4gIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nO1xuICByZWFkb25seSBzdGRvdXQ6IHN0cmluZztcbn1cblxuY29uc3QgREVGQVVMVF9MT0NLX1dBSVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA2MDBfMDAwO1xuY29uc3QgSEVBUlRCRUFUX1RIUk9UVExFX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBJTkRFWF9MT0NLX1JFVFJZX0NPVU5UID0gMjA7XG5jb25zdCBJTkRFWF9MT0NLX1JFVFJZX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IExPQ0tfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwO1xuY29uc3QgTUFYX0JVRkZFUl9JTl9CWVRFUyA9IDI2OF80MzVfNDU2O1xuY29uc3QgTUlMTElTRUNPTkRTX0lOX1NFQ09ORCA9IDEwMDA7XG5jb25zdCBHSVRfRkFUQUxfRVhJVF9DT0RFID0gMTI4O1xuY29uc3QgUkVWX1BBUlNFX09VVFBVVF9MSU5FX0NPVU5UID0gMjtcbmNvbnN0IFVOSVRfU0VQQVJBVE9SID0gJ1xcdXsxRn0nO1xuXG5pbnRlcmZhY2UgQnVsa09wZXJhdGlvbkdpdFJlcG9Db21taXRPcGVyYXRpb25QYXJhbXMge1xuICByZWFkb25seSBpc0ludGVycnVwdGVkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc3VtbWFyeT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENvbW1pdE1lc3NhZ2Uge1xuICByZWFkb25seSBib2R5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN1YmplY3Q6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEV4ZWNHaXRQYXJhbXMge1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcbiAgcmVhZG9ubHkgZ2l0QXJndW1lbnRzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIGdpdCByZXBvIGhvbGRpbmcgYSB2YXVsdCwgZHJpdmVuIHRvIHdyYXAgYnVsayBvcGVyYXRpb25zIGluIGNvbW1pdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCdWxrT3BlcmF0aW9uR2l0UmVwbyB7XG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcmVwbydzIGdpdCBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ2l0RGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmb2xkZXIgd2hvc2UgY2hhbmdlcyBhcmUgY29tbWl0dGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGxvY2tGaWxlUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2tXYWl0VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgb3duTG9jazogQnVsa09wZXJhdGlvbkxvY2sgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4gVXNlIHtAbGluayBCdWxrT3BlcmF0aW9uR2l0UmVwby5vcGVufSB0byBmaW5kIHRoZSByZXBvIG9mIGEgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBCdWxrT3BlcmF0aW9uR2l0UmVwb0NvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5naXREaXJlY3RvcnkgPSBwYXJhbXMuZ2l0RGlyZWN0b3J5O1xuICAgIHRoaXMud29ya2luZ0RpcmVjdG9yeSA9IHBhcmFtcy53b3JraW5nRGlyZWN0b3J5O1xuICAgIHRoaXMubG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBwYXJhbXMubG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9MT0NLX1dBSVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgdGhpcy5sb2NrRmlsZVBhdGggPSBqb2luKHRoaXMuZ2l0RGlyZWN0b3J5LCBCVUxLX09QRVJBVElPTl9MT0NLX0ZJTEVfTkFNRSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGdpdCByZXBvIGEgZm9sZGVyIGJlbG9uZ3MgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB3b3JraW5nRGlyZWN0b3J5IC0gVGhlIGZvbGRlciwgbm9ybWFsbHkgdGhlIHZhdWx0IHJvb3QuXG4gICAqIEByZXR1cm5zIFRoZSByZXBvLCBvciBgbnVsbGAgd2hlbiB0aGUgZm9sZGVyIGlzIG5vdCBpbnNpZGUgYSBnaXQgd29yayB0cmVlIG9yIGBnaXRgIGNhbm5vdCBiZSBydW4uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIG9wZW4od29ya2luZ0RpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxCdWxrT3BlcmF0aW9uR2l0UmVwbyB8IG51bGw+IHtcbiAgICBsZXQgcmVzdWx0OiBHaXRDb21tYW5kUmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBleGVjR2l0KHsgY3dkOiB3b3JraW5nRGlyZWN0b3J5LCBnaXRBcmd1bWVudHM6IFsncmV2LXBhcnNlJywgJy0taXMtaW5zaWRlLXdvcmstdHJlZScsICctLWFic29sdXRlLWdpdC1kaXInXSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBbaXNJbnNpZGVXb3JrVHJlZSwgZ2l0RGlyZWN0b3J5XSA9IHJlc3VsdC5zdGRvdXQuc3BsaXQoL1xccj9cXG4vLCBSRVZfUEFSU0VfT1VUUFVUX0xJTkVfQ09VTlQpO1xuICAgIHJldHVybiByZXN1bHQuZXhpdENvZGUgIT09IDAgfHwgaXNJbnNpZGVXb3JrVHJlZSAhPT0gJ3RydWUnIHx8ICFnaXREaXJlY3RvcnkgPyBudWxsIDogbmV3IEJ1bGtPcGVyYXRpb25HaXRSZXBvKHsgZ2l0RGlyZWN0b3J5LCB3b3JraW5nRGlyZWN0b3J5IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnVzZXMgdG8gZ28gb24gd2hlbiB0aGUgcmVwbyByb3V0ZXMgZmlsZXMgdGhyb3VnaCBnaXQtYW5uZXggYnV0IGBnaXQtYW5uZXhgIGNhbm5vdCBiZSBydW4sIHNpbmNlIGFcbiAgICogcGxhaW4gYGdpdCBhZGRgIHdvdWxkIHRoZW4gcHV0IHRoZSBsYXJnZSBmaWxlcyBpbnRvIGdpdCBpdHNlbGYuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYXNzZXJ0Q2FuQ29tbWl0TGFyZ2VGaWxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhbm5leEZpbHRlcnMgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGFsbG93ZWRFeGl0Q29kZXM6IFswLCAxXSwgZ2l0QXJndW1lbnRzOiBbJ2NvbmZpZycsICctLWdldC1yZWdleHAnLCBTdHJpbmcucmF3YF5maWx0ZXJcXC5hbm5leFxcLmBdIH0pO1xuICAgIGlmICghYW5uZXhGaWx0ZXJzLnN0ZG91dC50cmltKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYW5uZXhWZXJzaW9uID0gYXdhaXQgdGhpcy5ydW5HaXQoeyBnaXRBcmd1bWVudHM6IFsnYW5uZXgnLCAndmVyc2lvbicsICctLXJhdyddIH0pLmNhdGNoKCgpID0+IG51bGwpO1xuICAgIGlmIChhbm5leFZlcnNpb24gPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSB2YXVsdCByZXBvc2l0b3J5IHJvdXRlcyBmaWxlcyB0aHJvdWdoIGdpdC1hbm5leCwgYnV0IGdpdC1hbm5leCBpcyBub3Qgb24gUEFUSC4gQnVsayBvcGVyYXRpb24gY29tbWl0cyBhcmUgcmVmdXNlZCwgYmVjYXVzZSB0aGV5IHdvdWxkIGFkZCBsYXJnZSBmaWxlcyB0byBnaXQgaXRzZWxmLidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIHRoZSBidWxrLW9wZXJhdGlvbiBjb21taXRzIGEgcGx1Z2luIG1hZGUgb24gdGhlIGN1cnJlbnQgYnJhbmNoLCBuZXdlc3QgZmlyc3QuXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBwbHVnaW4gaWQuXG4gICAqIEByZXR1cm5zIFRoZSBjb21taXRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxpc3RCdWxrT3BlcmF0aW9uQ29tbWl0cyhwbHVnaW5JZDogc3RyaW5nKTogUHJvbWlzZTxCdWxrT3BlcmF0aW9uQ29tbWl0W10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7XG4gICAgICBhbGxvd2VkRXhpdENvZGVzOiBbMCwgR0lUX0ZBVEFMX0VYSVRfQ09ERV0sXG4gICAgICBnaXRBcmd1bWVudHM6IFtcbiAgICAgICAgJ2xvZycsXG4gICAgICAgIGAtLWZvcm1hdD0lSCR7VU5JVF9TRVBBUkFUT1J9JWFJJHtVTklUX1NFUEFSQVRPUn0lc2AsXG4gICAgICAgICctLWV4dGVuZGVkLXJlZ2V4cCcsXG4gICAgICAgIGAtLWdyZXA9XiR7UExVR0lOX1RSQUlMRVJfS0VZfTogJHtlc2NhcGVSZWdFeHAocGx1Z2luSWQpfSRgXG4gICAgICBdXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBjb21taXRzOiBCdWxrT3BlcmF0aW9uQ29tbWl0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcmVzdWx0LnN0ZG91dC5zcGxpdCgvXFxyP1xcbi8pKSB7XG4gICAgICBjb25zdCBbc2hhID0gJycsIGRhdGUgPSAnJywgLi4uc3ViamVjdFBhcnRzXSA9IGxpbmUuc3BsaXQoVU5JVF9TRVBBUkFUT1IpO1xuICAgICAgY29uc3QgY29tbWl0ID0gcGFyc2VCdWxrT3BlcmF0aW9uQ29tbWl0KHsgZGF0ZSwgc2hhLCBzdWJqZWN0OiBzdWJqZWN0UGFydHMuam9pbihVTklUX1NFUEFSQVRPUikgfSk7XG4gICAgICBpZiAoY29tbWl0KSB7XG4gICAgICAgIGNvbW1pdHMucHVzaChjb21taXQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29tbWl0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21taXRzIHdoYXRldmVyIGEgc3RhbGUgbG9jaydzIG9wZXJhdGlvbiBsZWZ0IGJlaGluZCBhcyBgT1A8bj4gaW50ZXJydXB0ZWRgIGFuZCByZW1vdmVzIHRoZSBsb2NrLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgaWQgb2YgdGhlIHJlY292ZXJlZCBvcGVyYXRpb24sIG9yIGBudWxsYCB3aGVuIHRoZXJlIHdhcyBubyBzdGFsZSBsb2NrLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlY292ZXJTdGFsZUxvY2soKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gICAgY29uc3QgbG9jayA9IGF3YWl0IHRoaXMucmVhZExvY2soKTtcbiAgICByZXR1cm4gIWxvY2sgfHwgIXRoaXMuaXNTdGFsZShsb2NrKSA/IG51bGwgOiAoYXdhaXQgdGhpcy5yZWNvdmVyKGxvY2spKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcnRzIGEgYnVsay1vcGVyYXRpb24gY29tbWl0IHdpdGggYGdpdCByZXZlcnQgLS1uby1lZGl0YC5cbiAgICpcbiAgICogV2hhdGV2ZXIgaXMgcGVuZGluZyBpcyBjb21taXR0ZWQgZmlyc3QsIHNvIHRoZSByZXZlcnQgc3RhcnRzIGZyb20gYSBjbGVhbiB0cmVlLiBBIGNvbmZsaWN0IGlzIE5PVCBhYm9ydGVkOiB0aGVcbiAgICogcmVwbyBpcyBsZWZ0IG1pZC1yZXZlcnQgZm9yIHRoZSB1c2VyIHRvIHJlc29sdmUuXG4gICAqXG4gICAqIEBwYXJhbSBjb21taXQgLSBUaGUgY29tbWl0IHRvIHJldmVydC5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgcmV2ZXJ0IHN0b3BwZWQgb24gYSBjb25mbGljdCwgYW5kIHdoYXQgZ2l0IHByaW50ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmV2ZXJ0QnVsa09wZXJhdGlvbkNvbW1pdChjb21taXQ6IEJ1bGtPcGVyYXRpb25Db21taXQpOiBQcm9taXNlPEdpdFJldmVydFJlc3VsdD4ge1xuICAgIGF3YWl0IHRoaXMuYXNzZXJ0Q2FuQ29tbWl0TGFyZ2VGaWxlcygpO1xuICAgIGF3YWl0IHRoaXMuYWNxdWlyZUxvY2soKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jb21taXRQZW5kaW5nKHsgYm9keTogJycsIHN1YmplY3Q6IGBjaG9yZTogYmVmb3JlIHJldmVydCBvZiAke2NvbW1pdC5vcGVyYXRpb25JZH1gIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5HaXQoeyBhbGxvd2VkRXhpdENvZGVzOiBbMCwgMV0sIGdpdEFyZ3VtZW50czogWydyZXZlcnQnLCAnLS1uby1lZGl0JywgY29tbWl0LnNoYV0gfSk7XG4gICAgICByZXR1cm4geyBpc0NvbmZsaWN0OiByZXN1bHQuZXhpdENvZGUgIT09IDAsIG91dHB1dDogYCR7cmVzdWx0LnN0ZG91dH0ke3Jlc3VsdC5zdGRlcnJ9YC50cmltKCkgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5yZWxlYXNlTG9jaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgYnVsayBvcGVyYXRpb24gYmV0d2VlbiB0d28gY29tbWl0cy5cbiAgICpcbiAgICogVGFrZXMgdGhlIGxlYXNlIGxvY2ssIGNvbW1pdHMgd2hhdGV2ZXIgaXMgcGVuZGluZyBhcyBgY2hvcmU6IGJlZm9yZSBPUDxuPmAsIHJ1bnMgdGhlIG9wZXJhdGlvbiwgd2FpdHMgZm9yIGl0c1xuICAgKiBmb2xsb3ctdXBzIHRvIHNldHRsZSwgY29tbWl0cyB0aGUgcmVzdWx0IGFzIGBPUDxuPjogPHN1bW1hcnk+YCBhbmQgcmVsZWFzZXMgdGhlIGxvY2suIEFuIG9wZXJhdGlvbiB0aGF0IHRocm93c1xuICAgKiBzdGlsbCBnZXRzIGl0cyBwYXJ0aWFsIGNoYW5nZXMgY29tbWl0dGVkLCBhcyBgT1A8bj4gaW50ZXJydXB0ZWRgLCBiZWZvcmUgdGhlIGVycm9yIGlzIHJldGhyb3duLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgb3BlcmF0aW9uJ3MgcmVzdWx0LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSBvcGVyYXRpb24ncyByZXN1bHQsIGl0cyBpZCBhbmQgdGhlIGhhc2ggb2YgaXRzIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW5CdWxrT3BlcmF0aW9uPFQ+KHBhcmFtczogQnVsa09wZXJhdGlvbkdpdFJlcG9SdW5CdWxrT3BlcmF0aW9uUGFyYW1zPFQ+KTogUHJvbWlzZTxHaXRCdWxrT3BlcmF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgYXdhaXQgdGhpcy5hc3NlcnRDYW5Db21taXRMYXJnZUZpbGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hY3F1aXJlTG9jaygpO1xuICAgIGxldCB1bnJlZ2lzdGVyUHJvZ3Jlc3NMaXN0ZW5lcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gYXdhaXQgdGhpcy5hbGxvY2F0ZU9wZXJhdGlvbklkKHBhcmFtcy5wbHVnaW5JZCk7XG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdFBlbmRpbmcoeyBib2R5OiAnJywgc3ViamVjdDogYnVpbGRCZWZvcmVPcGVyYXRpb25Db21taXRTdWJqZWN0KG9wZXJhdGlvbklkKSB9KTtcblxuICAgICAgdW5yZWdpc3RlclByb2dyZXNzTGlzdGVuZXIgPSByZWdpc3RlckJ1bGtPcGVyYXRpb25Qcm9ncmVzc0xpc3RlbmVyKHRoaXMuY3JlYXRlVGhyb3R0bGVkSGVhcnRiZWF0KCkpO1xuXG4gICAgICBsZXQgcmVzdWx0OiBUO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgcGFyYW1zLm9wZXJhdGlvbigpO1xuICAgICAgICBhd2FpdCBwYXJhbXMuc2V0dGxlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBhd2FpdCB0aGlzLmhlYXJ0YmVhdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbW1pdE9wZXJhdGlvbih7IGlzSW50ZXJydXB0ZWQ6IHRydWUsIG9wZXJhdGlvbklkLCBwbHVnaW5JZDogcGFyYW1zLnBsdWdpbklkIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5oZWFydGJlYXQoKTtcbiAgICAgIGNvbnN0IGNvbW1pdFNoYSA9IGF3YWl0IHRoaXMuY29tbWl0T3BlcmF0aW9uKHsgb3BlcmF0aW9uSWQsIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsIHN1bW1hcnk6IHBhcmFtcy5zdW1tYXJ5IH0pO1xuICAgICAgcmV0dXJuIHsgY29tbWl0U2hhLCBvcGVyYXRpb25JZCwgcmVzdWx0IH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHVucmVnaXN0ZXJQcm9ncmVzc0xpc3RlbmVyPy4oKTtcbiAgICAgIGF3YWl0IHRoaXMucmVsZWFzZUxvY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFjcXVpcmVMb2NrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRoaXMubG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgZm9yICg7Oykge1xuICAgICAgaWYgKGF3YWl0IHRoaXMudHJ5Q3JlYXRlTG9jaygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9jayA9IGF3YWl0IHRoaXMucmVhZExvY2soKTtcbiAgICAgIGlmICghbG9jaykge1xuICAgICAgICAvLyBSZWxlYXNlZCBiZXR3ZWVuIHRoZSB0d28gY2FsbHM6IHRyeSB0byB0YWtlIGl0IGFnYWluIGF0IG9uY2UuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc1N0YWxlKGxvY2spKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVjb3Zlcihsb2NrKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGltZWQgb3V0IHdhaXRpbmcgZm9yICR7bG9jay5vcGVyYXRpb25JZCB8fCAnYW4gb3BlcmF0aW9uJ30gb2YgJHtsb2NrLnBsdWdpbklkfSBvbiAke2xvY2suaG9zdH0gdG8gcmVsZWFzZSB0aGUgYnVsayBvcGVyYXRpb24gbG9jayAke3RoaXMubG9ja0ZpbGVQYXRofS5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHNldFRpbWVvdXRBc3luYyhMT0NLX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFsbG9jYXRlT3BlcmF0aW9uSWQocGx1Z2luSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBhd2FpdCB0aGlzLmZpbmROZXh0T3BlcmF0aW9uSWQoKTtcbiAgICBjb25zdCBvd25Mb2NrID0gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5vd25Mb2NrKTtcbiAgICB0aGlzLm93bkxvY2sgPSB7IC4uLm93bkxvY2ssIGhlYXJ0YmVhdEF0OiBEYXRlLm5vdygpLCBvcGVyYXRpb25JZCwgcGx1Z2luSWQgfTtcbiAgICBhd2FpdCB0aGlzLndyaXRlTG9jayh0aGlzLm93bkxvY2spO1xuICAgIHJldHVybiBvcGVyYXRpb25JZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29tbWl0T3BlcmF0aW9uKHBhcmFtczogQnVsa09wZXJhdGlvbkdpdFJlcG9Db21taXRPcGVyYXRpb25QYXJhbXMpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBjaGFuZ2VkRmlsZUNvdW50ID0gYXdhaXQgdGhpcy5zdGFnZUFsbCgpO1xuICAgIGlmIChjaGFuZ2VkRmlsZUNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZSA9IGJ1aWxkT3BlcmF0aW9uQ29tbWl0TWVzc2FnZSh7IC4uLnBhcmFtcywgY2hhbmdlZEZpbGVDb3VudCwgdGltZXN0YW1wOiBuZXcgRGF0ZSgpIH0pO1xuICAgIGF3YWl0IHRoaXMuY29tbWl0U3RhZ2VkKG1lc3NhZ2UpO1xuICAgIGNvbnN0IGhlYWRSZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50czogWydyZXYtcGFyc2UnLCAnSEVBRCddIH0pO1xuICAgIHJldHVybiBoZWFkUmVzdWx0LnN0ZG91dC50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFBlbmRpbmcobWVzc2FnZTogQ29tbWl0TWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChhd2FpdCB0aGlzLnN0YWdlQWxsKCkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jb21taXRTdGFnZWQobWVzc2FnZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFN0YWdlZChtZXNzYWdlOiBDb21taXRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ2l0QXJndW1lbnRzID0gWydjb21taXQnLCAnLS1xdWlldCcsICctbScsIG1lc3NhZ2Uuc3ViamVjdF07XG4gICAgaWYgKG1lc3NhZ2UuYm9keSkge1xuICAgICAgZ2l0QXJndW1lbnRzLnB1c2goJy1tJywgbWVzc2FnZS5ib2R5KTtcbiAgICB9XG4gICAgZ2l0QXJndW1lbnRzLnB1c2goJy0tJywgJy4nKTtcbiAgICBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50cyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGhyb3R0bGVkSGVhcnRiZWF0KCk6ICgpID0+IHZvaWQge1xuICAgIGxldCBsYXN0SGVhcnRiZWF0QXQgPSBEYXRlLm5vdygpO1xuICAgIGxldCBwZW5kaW5nSGVhcnRiZWF0OiBQcm9taXNlPHZvaWQ+ID0gbm9vcEFzeW5jKCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBpZiAobm93IC0gbGFzdEhlYXJ0YmVhdEF0IDwgSEVBUlRCRUFUX1RIUk9UVExFX0lOX01JTExJU0VDT05EUykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsYXN0SGVhcnRiZWF0QXQgPSBub3c7XG4gICAgICBwZW5kaW5nSGVhcnRiZWF0ID0gcGVuZGluZ0hlYXJ0YmVhdC50aGVuKCgpID0+IHRoaXMuaGVhcnRiZWF0KCkpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCB0aGUgYnVsayBvcGVyYXRpb24gbG9jayBoZWFydGJlYXQnLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kTmV4dE9wZXJhdGlvbklkKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gYC0tYWxsYCBhbHNvIHJlYWRzIGEgcmVwb3NpdG9yeSB3aXRoIG5vIGNvbW1pdCB5ZXQsIHdoZXJlIGEgcGxhaW4gYGdpdCBsb2dgIGZhaWxzLlxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuR2l0KHtcbiAgICAgIGdpdEFyZ3VtZW50czogWydsb2cnLCAnLS1hbGwnLCAnLS1mb3JtYXQ9JXMnLCAnLS1leHRlbmRlZC1yZWdleHAnLCAnLS1ncmVwPV4oY2hvcmU6IGJlZm9yZSApP09QWzAtOV0rJ11cbiAgICB9KTtcbiAgICByZXR1cm4gZ2V0TmV4dE9wZXJhdGlvbklkKHJlc3VsdC5zdGRvdXQuc3BsaXQoL1xccj9cXG4vKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhlYXJ0YmVhdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy5yZWFkTG9jaygpO1xuICAgIGlmICghbG9jayB8fCAhdGhpcy5pc093bkxvY2sobG9jaykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53cml0ZUxvY2soeyAuLi5sb2NrLCBoZWFydGJlYXRBdDogRGF0ZS5ub3coKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNPd25Mb2NrKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3duTG9jayAhPT0gbnVsbFxuICAgICAgJiYgbG9jay5ob3N0ID09PSB0aGlzLm93bkxvY2suaG9zdFxuICAgICAgJiYgbG9jay5wcm9jZXNzSWQgPT09IHRoaXMub3duTG9jay5wcm9jZXNzSWRcbiAgICAgICYmIGxvY2suc3RhcnRlZEF0ID09PSB0aGlzLm93bkxvY2suc3RhcnRlZEF0O1xuICB9XG5cbiAgcHJpdmF0ZSBpc1N0YWxlKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzQnVsa09wZXJhdGlvbkxvY2tTdGFsZShsb2NrLCB7XG4gICAgICBib290ZWRBdDogRGF0ZS5ub3coKSAtIHVwdGltZSgpICogTUlMTElTRUNPTkRTX0lOX1NFQ09ORCxcbiAgICAgIGhvc3Q6IGhvc3RuYW1lKCksXG4gICAgICBpc1Byb2Nlc3NBbGl2ZSxcbiAgICAgIG5vdzogRGF0ZS5ub3coKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkTG9jaygpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25Mb2NrIHwgbnVsbD4ge1xuICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHRleHQgPSBhd2FpdCByZWFkRmlsZSh0aGlzLmxvY2tGaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0Vycm9yV2l0aENvZGUoZXJyb3IsICdFTk9FTlQnKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICBpZiAoaXNCdWxrT3BlcmF0aW9uTG9jayh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVXBkYXRlcyBhcmUgYXRvbWljLCBidXQgYSBsb2NrIGJlaW5nIGNyZWF0ZWQgY2FuIGJlIHJlYWQgYmVmb3JlIGl0cyBjb250ZW50IGlzIHdyaXR0ZW4uIFRoZSBmaWxlJ3MgYWdlXG4gICAgICAvLyBzdGFuZHMgaW4gZm9yIHRoZSBoZWFydGJlYXQsIHNvIHN1Y2ggYSBsb2NrIHJlYWRzIGFzIGZyZXNoIGFuZCBhIGNvcnJ1cHQgb25lIGdvZXMgc3RhbGUgbGlrZSBhbnkgb3RoZXIuXG4gICAgfVxuICAgIGNvbnN0IGZpbGVTdGF0cyA9IGF3YWl0IHN0YXQodGhpcy5sb2NrRmlsZVBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICBoZWFydGJlYXRBdDogZmlsZVN0YXRzLm10aW1lTXMsXG4gICAgICBob3N0OiAnJyxcbiAgICAgIG9wZXJhdGlvbklkOiAnJyxcbiAgICAgIHBsdWdpbklkOiAnJyxcbiAgICAgIHByb2Nlc3NJZDogMCxcbiAgICAgIHByb2Nlc3NTdGFydGVkQXQ6IDAsXG4gICAgICBzdGFydGVkQXQ6IDBcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWNvdmVyKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBvcGVyYXRpb25JZCA9IGxvY2sub3BlcmF0aW9uSWQgfHwgYXdhaXQgdGhpcy5maW5kTmV4dE9wZXJhdGlvbklkKCk7XG4gICAgYXdhaXQgdGhpcy5jb21taXRPcGVyYXRpb24oeyBpc0ludGVycnVwdGVkOiB0cnVlLCBvcGVyYXRpb25JZCwgcGx1Z2luSWQ6IGxvY2sucGx1Z2luSWQgfHwgJ3Vua25vd24nIH0pO1xuICAgIGF3YWl0IHVubGluayh0aGlzLmxvY2tGaWxlUGF0aCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICBpZiAoIWlzRXJyb3JXaXRoQ29kZShlcnJvciwgJ0VOT0VOVCcpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBvcGVyYXRpb25JZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVsZWFzZUxvY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9jayA9IGF3YWl0IHRoaXMucmVhZExvY2soKTtcbiAgICBjb25zdCBpc093bkxvY2sgPSBsb2NrICE9PSBudWxsICYmIHRoaXMuaXNPd25Mb2NrKGxvY2spO1xuICAgIHRoaXMub3duTG9jayA9IG51bGw7XG4gICAgaWYgKCFpc093bkxvY2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdW5saW5rKHRoaXMubG9ja0ZpbGVQYXRoKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGlmICghaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRU5PRU5UJykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bkdpdChwYXJhbXM6IEJ1bGtPcGVyYXRpb25HaXRSZXBvUnVuR2l0UGFyYW1zKTogUHJvbWlzZTxHaXRDb21tYW5kUmVzdWx0PiB7XG4gICAgY29uc3QgYWxsb3dlZEV4aXRDb2RlcyA9IHBhcmFtcy5hbGxvd2VkRXhpdENvZGVzID8/IFswXTtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTs7IGF0dGVtcHQrKykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY0dpdCh7IGN3ZDogdGhpcy53b3JraW5nRGlyZWN0b3J5LCBnaXRBcmd1bWVudHM6IHBhcmFtcy5naXRBcmd1bWVudHMgfSk7XG4gICAgICBpZiAoYWxsb3dlZEV4aXRDb2Rlcy5pbmNsdWRlcyhyZXN1bHQuZXhpdENvZGUpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoYXR0ZW1wdCA8IElOREVYX0xPQ0tfUkVUUllfQ09VTlQgJiYgcmVzdWx0LnN0ZGVyci5pbmNsdWRlcygnaW5kZXgubG9jaycpKSB7XG4gICAgICAgIGF3YWl0IHNldFRpbWVvdXRBc3luYyhJTkRFWF9MT0NLX1JFVFJZX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEdpdENvbW1hbmRFcnJvcihwYXJhbXMuZ2l0QXJndW1lbnRzLCByZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5zdGRlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3RhZ2VBbGwoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50czogWydhZGQnLCAnLS1hbGwnLCAnLS0nLCAnLiddIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuR2l0KHsgZ2l0QXJndW1lbnRzOiBbJ2RpZmYnLCAnLS1jYWNoZWQnLCAnLS1uYW1lLW9ubHknLCAnLXonLCAnLS0nLCAnLiddIH0pO1xuICAgIHJldHVybiByZXN1bHQuc3Rkb3V0LnNwbGl0KCdcXDAnKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB0cnlDcmVhdGVMb2NrKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGxvY2sgPSBjcmVhdGVMb2NrUmVjb3JkKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZSh0aGlzLmxvY2tGaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkobG9jayksIHsgZmxhZzogJ3d4JyB9KTtcbiAgICAgIHRoaXMub3duTG9jayA9IGxvY2s7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzRXJyb3JXaXRoQ29kZShlcnJvciwgJ0VFWElTVCcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVMb2NrKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gV3JpdHRlbiBiZXNpZGUgdGhlIGxvY2sgYW5kIHJlbmFtZWQgb3ZlciBpdCwgc28gYSByZWFkZXIgbmV2ZXIgc2VlcyBhIGhhbGYtd3JpdHRlbiBoZWFydGJlYXQuXG4gICAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGAke3RoaXMubG9ja0ZpbGVQYXRofS4ke1N0cmluZyhsb2NrLnByb2Nlc3NJZCl9LnRtcGA7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHRlbXBvcmFyeVBhdGgsIEpTT04uc3RyaW5naWZ5KGxvY2spKTtcbiAgICBhd2FpdCByZW5hbWUodGVtcG9yYXJ5UGF0aCwgdGhpcy5sb2NrRmlsZVBhdGgpO1xuICB9XG59XG5cbi8qKlxuICogQW4gZXJyb3IgdGhyb3duIHdoZW4gYSBgZ2l0YCBjb21tYW5kIGZhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgR2l0Q29tbWFuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGdpdEFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudHMgYGdpdGAgd2FzIHJ1biB3aXRoLlxuICAgKiBAcGFyYW0gZXhpdENvZGUgLSBUaGUgZXhpdCBjb2RlLlxuICAgKiBAcGFyYW0gc3RkZXJyIC0gV2hhdCBgZ2l0YCBwcmludGVkIHRvIHN0ZGVyci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZ2l0QXJndW1lbnRzOiByZWFkb25seSBzdHJpbmdbXSwgcHVibGljIHJlYWRvbmx5IGV4aXRDb2RlOiBudW1iZXIsIHB1YmxpYyByZWFkb25seSBzdGRlcnI6IHN0cmluZykge1xuICAgIHN1cGVyKGBnaXQgJHtnaXRBcmd1bWVudHMuam9pbignICcpfSBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJHtTdHJpbmcoZXhpdENvZGUpfTogJHtzdGRlcnIudHJpbSgpfWApO1xuICAgIHRoaXMubmFtZSA9ICdHaXRDb21tYW5kRXJyb3InO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvY2tSZWNvcmQoKTogQnVsa09wZXJhdGlvbkxvY2sge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICByZXR1cm4ge1xuICAgIGhlYXJ0YmVhdEF0OiBub3csXG4gICAgaG9zdDogaG9zdG5hbWUoKSxcbiAgICBvcGVyYXRpb25JZDogJycsXG4gICAgcGx1Z2luSWQ6ICcnLFxuICAgIHByb2Nlc3NJZDogcHJvY2Vzcy5waWQsXG4gICAgcHJvY2Vzc1N0YXJ0ZWRBdDogZ2V0UHJvY2Vzc1N0YXJ0ZWRBdCgpLFxuICAgIHN0YXJ0ZWRBdDogbm93XG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWNHaXQocGFyYW1zOiBFeGVjR2l0UGFyYW1zKTogUHJvbWlzZTxHaXRDb21tYW5kUmVzdWx0PiB7XG4gIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZXhlY0ZpbGUoJ2dpdCcsIFsuLi5wYXJhbXMuZ2l0QXJndW1lbnRzXSwgeyBjd2Q6IHBhcmFtcy5jd2QsIG1heEJ1ZmZlcjogTUFYX0JVRkZFUl9JTl9CWVRFUywgd2luZG93c0hpZGU6IHRydWUgfSwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvci5jb2RlICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuIGdpdCAke3BhcmFtcy5naXRBcmd1bWVudHMuam9pbignICcpfWAsIHsgY2F1c2U6IGVycm9yIH0pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZSh7IGV4aXRDb2RlOiB0eXBlb2YgZXJyb3I/LmNvZGUgPT09ICdudW1iZXInID8gZXJyb3IuY29kZSA6IDAsIHN0ZGVyciwgc3Rkb3V0IH0pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJvY2Vzc1N0YXJ0ZWRBdCgpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5yb3VuZChwZXJmb3JtYW5jZS50aW1lT3JpZ2luKTtcbn1cblxuZnVuY3Rpb24gaXNFcnJvcldpdGhDb2RlKGVycm9yOiB1bmtub3duLCBjb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09IGNvZGU7XG59XG5cbmZ1bmN0aW9uIGlzUHJvY2Vzc0FsaXZlKHByb2Nlc3NJZDogbnVtYmVyKTogYm9vbGVhbiB8IG51bGwge1xuICBpZiAocHJvY2Vzc0lkIDw9IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocHJvY2Vzc0lkLCAwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gIWlzRXJyb3JXaXRoQ29kZShlcnJvciwgJ0VTUkNIJykgJiYgKGlzRXJyb3JXaXRoQ29kZShlcnJvciwgJ0VQRVJNJykgfHwgbnVsbCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0JBLG1CQUFnQztBQUNoQyxzQkFBMEI7QUFDMUIscUJBQTZCO0FBQzdCLHlCQUFrQztBQUNsQyxnQ0FBeUI7QUFDekIsc0JBTU87QUFDUCxxQkFHTztBQUNQLHVCQUFxQjtBQU9yQixxQ0FBc0Q7QUFDdEQsNEJBU087QUFzR1AsTUFBTSw0Q0FBNEM7QUFDbEQsTUFBTSxxQ0FBcUM7QUFDM0MsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSx5Q0FBeUM7QUFDL0MsTUFBTSxxQ0FBcUM7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
559
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZXNrdG9wLWJ1bGstb3BlcmF0aW9uLWdpdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGRlc2t0b3AgaGFsZiBvZiBidWxrLW9wZXJhdGlvbiBnaXQgY29tbWl0czogZHJpdmVzIHRoZSBzeXN0ZW0gYGdpdGAgQ0xJIHRvIHdyYXAgYSBidWxrIG9wZXJhdGlvbiBpbiBjb21taXRzLFxuICogZ3VhcmRlZCBieSBhIGxlYXNlIGxvY2sgaW4gdGhlIHJlcG8ncyBnaXQgZGlyZWN0b3J5LlxuICpcbiAqIFRoZSBzeXN0ZW0gQ0xJIGlzIHVzZWQgcmF0aGVyIHRoYW4gYSBidW5kbGVkIGltcGxlbWVudGF0aW9uIGJlY2F1c2UgaXQgaG9ub3JzIHRoZSByZXBvJ3Mgb3duIGNvbmZpZywgaG9va3NcbiAqIGFuZCBjbGVhbi9zbXVkZ2UgZmlsdGVycywgZ2l0LWFubmV4J3MgYW1vbmcgdGhlbSwgYW5kIGJlY2F1c2UgYGdpdCByZXZlcnRgIGlzIHRoZSB3aG9sZSB1bmRvIHN0b3J5LlxuICpcbiAqIEV2ZXJ5IGNvbW1hbmQgcnVucyB3aXRoIHRoZSB2YXVsdCBmb2xkZXIgYXMgaXRzIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBgLmAgYXMgaXRzIHBhdGhzcGVjLCBzbyB3aGVuIHRoZSB2YXVsdCBpcyBhXG4gKiBzdWJmb2xkZXIgb2YgYSBsYXJnZXIgcmVwbyBvbmx5IHRoZSB2YXVsdCdzIGNoYW5nZXMgYXJlIGNvbW1pdHRlZC5cbiAqXG4gKiBEZXNrdG9wLW9ubHkgKGBub2RlOmNoaWxkX3Byb2Nlc3NgLCBgbm9kZTpmc2AsIGBub2RlOm9zYCksIGJ1dCBpbmVydCB0byBpbXBvcnQgb24gbW9iaWxlOiBub3RoaW5nIGhlcmUgdG91Y2hlcyBhXG4gKiBOb2RlIGJ1aWx0aW4gdW50aWwgYSBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gKi9cblxuaW1wb3J0IHsgc2V0VGltZW91dEFzeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IG5vb3BBc3luYyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9mdW5jdGlvbic7XG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcmVnLWV4cCc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICByZWFkRmlsZSxcbiAgcmVuYW1lLFxuICBzdGF0LFxuICB1bmxpbmssXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7XG4gIGhvc3RuYW1lLFxuICB1cHRpbWVcbn0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUge1xuICBCdWxrT3BlcmF0aW9uQ29tbWl0LFxuICBCdWxrT3BlcmF0aW9uTG9ja1xufSBmcm9tICcuL2J1bGstb3BlcmF0aW9uLnRzJztcblxuaW1wb3J0IHsgcmVnaXN0ZXJCdWxrT3BlcmF0aW9uUHJvZ3Jlc3NMaXN0ZW5lciB9IGZyb20gJy4vYnVsay1vcGVyYXRpb24tcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHtcbiAgYnVpbGRCZWZvcmVPcGVyYXRpb25Db21taXRTdWJqZWN0LFxuICBidWlsZE9wZXJhdGlvbkNvbW1pdE1lc3NhZ2UsXG4gIEJVTEtfT1BFUkFUSU9OX0xPQ0tfRklMRV9OQU1FLFxuICBnZXROZXh0T3BlcmF0aW9uSWQsXG4gIGlzQnVsa09wZXJhdGlvbkxvY2ssXG4gIGlzQnVsa09wZXJhdGlvbkxvY2tTdGFsZSxcbiAgcGFyc2VCdWxrT3BlcmF0aW9uQ29tbWl0LFxuICBQTFVHSU5fVFJBSUxFUl9LRVlcbn0gZnJvbSAnLi9idWxrLW9wZXJhdGlvbi50cyc7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIEJ1bGtPcGVyYXRpb25HaXRSZXBvfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb0NvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXBvJ3MgZ2l0IGRpcmVjdG9yeSwgd2hlcmUgdGhlIGxlYXNlIGxvY2sgbGl2ZXMuXG4gICAqL1xuICByZWFkb25seSBnaXREaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBmb3IgYW5vdGhlciBvcGVyYXRpb24ncyBsb2NrIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2MDBfMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmb2xkZXIgd2hvc2UgY2hhbmdlcyBhcmUgY29tbWl0dGVkOiB0aGUgdmF1bHQgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucnVuQnVsa09wZXJhdGlvbn0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb1J1bkJ1bGtPcGVyYXRpb25QYXJhbXM8VD4ge1xuICAvKipcbiAgICogUnVucyB0aGUgYnVsayBvcGVyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246ICgpID0+IFByb21pc2U8VD47XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgZm9sbG93LXVwcyB0aGUgb3BlcmF0aW9uIHNldCBvZmYgKHJlbmFtZSBoYW5kbGVycywgbGluayB1cGRhdGVzLCB0aGUgbWV0YWRhdGEgY2FjaGUpIHRvIGZpbmlzaCwgc29cbiAgICogdGhlaXIgY2hhbmdlcyBsYW5kIGluIHRoZSBvcGVyYXRpb24ncyBjb21taXQuXG4gICAqL1xuICByZWFkb25seSBzZXR0bGU6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIG9wZXJhdGlvbiwgdXNlZCBpbiB0aGUgY29tbWl0IHN1YmplY3QuXG4gICAqL1xuICByZWFkb25seSBzdW1tYXJ5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucnVuQnVsa09wZXJhdGlvbn0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRCdWxrT3BlcmF0aW9uUmVzdWx0PFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBoYXNoIG9mIHRoZSBjb21taXQgcmVjb3JkaW5nIHRoZSBvcGVyYXRpb24sIG9yIGBudWxsYCB3aGVuIHRoZSBvcGVyYXRpb24gY2hhbmdlZCBub3RoaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWl0U2hhOiBudWxsIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW9uIGlkLCBzdWNoIGFzIGBPUDEyYC5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCB0aGUgb3BlcmF0aW9uIHN0YXJ0ZWQgdW5kZXIsIHdoZW4gaXRzIGxvY2sgd2FzIHJlY292ZXJlZCBhcyBzdGFsZSB3aGlsZSBpdCByYW4sIG9yIGBudWxsYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIFRoZSBjaGFuZ2VzIG1hZGUgYmVmb3JlIHRoZSByZWNvdmVyeSBhcmUgaW4gdGhlIGA8cmVjb3ZlcmVkT3BlcmF0aW9uSWQ+IGludGVycnVwdGVkYCBjb21taXQsIGFuZCB0aGUgcmVzdCB3ZW50IGludG9cbiAgICogYSBmcmVzaCB7QGxpbmsgb3BlcmF0aW9uSWR9LCBzbyB1bmRvaW5nIHRoZSB3aG9sZSBvcGVyYXRpb24gdGFrZXMgcmV2ZXJ0aW5nIGJvdGguXG4gICAqL1xuICByZWFkb25seSByZWNvdmVyZWRPcGVyYXRpb25JZDogbnVsbCB8IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc3VsdDogVDtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHtAbGluayBCdWxrT3BlcmF0aW9uR2l0UmVwby5yZXZlcnRCdWxrT3BlcmF0aW9uQ29tbWl0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRSZXZlcnRSZXN1bHQge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcmV2ZXJ0IHN0b3BwZWQgb24gYSBjb25mbGljdCwgbGVhdmluZyB0aGUgcmVwbyBtaWQtcmV2ZXJ0IGZvciB0aGUgdXNlciB0byByZXNvbHZlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDb25mbGljdDogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hhdCBnaXQgcHJpbnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQnVsa09wZXJhdGlvbkdpdFJlcG9SdW5HaXRQYXJhbXMge1xuICByZWFkb25seSBhbGxvd2VkRXhpdENvZGVzPzogcmVhZG9ubHkgbnVtYmVyW107XG4gIHJlYWRvbmx5IGdpdEFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBHaXRDb21tYW5kUmVzdWx0IHtcbiAgcmVhZG9ubHkgZXhpdENvZGU6IG51bWJlcjtcbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0ZG91dDogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX0xPQ0tfV0FJVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMF8wMDA7XG5jb25zdCBIRUFSVEJFQVRfVEhST1RUTEVfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IElOREVYX0xPQ0tfUkVUUllfQ09VTlQgPSAyMDtcbmNvbnN0IElOREVYX0xPQ0tfUkVUUllfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgTE9DS19QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDEwMDA7XG5jb25zdCBNQVhfQlVGRkVSX0lOX0JZVEVTID0gMjY4XzQzNV80NTY7XG5jb25zdCBNSUxMSVNFQ09ORFNfSU5fU0VDT05EID0gMTAwMDtcbmNvbnN0IEdJVF9GQVRBTF9FWElUX0NPREUgPSAxMjg7XG5jb25zdCBSRVZfUEFSU0VfT1VUUFVUX0xJTkVfQ09VTlQgPSAyO1xuY29uc3QgVU5JVF9TRVBBUkFUT1IgPSAnXFx1ezFGfSc7XG5cbmludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb0NvbW1pdE9wZXJhdGlvblBhcmFtcyB7XG4gIHJlYWRvbmx5IGlzSW50ZXJydXB0ZWQ/OiBib29sZWFuO1xuICByZWFkb25seSBvcGVyYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzdW1tYXJ5Pzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ29tbWl0TWVzc2FnZSB7XG4gIHJlYWRvbmx5IGJvZHk6IHN0cmluZztcbiAgcmVhZG9ubHkgc3ViamVjdDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgRXhlY0dpdFBhcmFtcyB7XG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuICByZWFkb25seSBnaXRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgZ2l0IHJlcG8gaG9sZGluZyBhIHZhdWx0LCBkcml2ZW4gdG8gd3JhcCBidWxrIG9wZXJhdGlvbnMgaW4gY29tbWl0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1bGtPcGVyYXRpb25HaXRSZXBvIHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXBvJ3MgZ2l0IGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBnaXREaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZvbGRlciB3aG9zZSBjaGFuZ2VzIGFyZSBjb21taXR0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9ja0ZpbGVQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBvd25Mb2NrOiBCdWxrT3BlcmF0aW9uTG9jayB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLiBVc2Uge0BsaW5rIEJ1bGtPcGVyYXRpb25HaXRSZXBvLm9wZW59IHRvIGZpbmQgdGhlIHJlcG8gb2YgYSBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEJ1bGtPcGVyYXRpb25HaXRSZXBvQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmdpdERpcmVjdG9yeSA9IHBhcmFtcy5naXREaXJlY3Rvcnk7XG4gICAgdGhpcy53b3JraW5nRGlyZWN0b3J5ID0gcGFyYW1zLndvcmtpbmdEaXJlY3Rvcnk7XG4gICAgdGhpcy5sb2NrV2FpdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IHBhcmFtcy5sb2NrV2FpdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0xPQ0tfV0FJVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLmxvY2tGaWxlUGF0aCA9IGpvaW4odGhpcy5naXREaXJlY3RvcnksIEJVTEtfT1BFUkFUSU9OX0xPQ0tfRklMRV9OQU1FKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgZ2l0IHJlcG8gYSBmb2xkZXIgYmVsb25ncyB0by5cbiAgICpcbiAgICogQHBhcmFtIHdvcmtpbmdEaXJlY3RvcnkgLSBUaGUgZm9sZGVyLCBub3JtYWxseSB0aGUgdmF1bHQgcm9vdC5cbiAgICogQHJldHVybnMgVGhlIHJlcG8sIG9yIGBudWxsYCB3aGVuIHRoZSBmb2xkZXIgaXMgbm90IGluc2lkZSBhIGdpdCB3b3JrIHRyZWUgb3IgYGdpdGAgY2Fubm90IGJlIHJ1bi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgb3Blbih3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25HaXRSZXBvIHwgbnVsbD4ge1xuICAgIGxldCByZXN1bHQ6IEdpdENvbW1hbmRSZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGV4ZWNHaXQoeyBjd2Q6IHdvcmtpbmdEaXJlY3RvcnksIGdpdEFyZ3VtZW50czogWydyZXYtcGFyc2UnLCAnLS1pcy1pbnNpZGUtd29yay10cmVlJywgJy0tYWJzb2x1dGUtZ2l0LWRpciddIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IFtpc0luc2lkZVdvcmtUcmVlLCBnaXREaXJlY3RvcnldID0gcmVzdWx0LnN0ZG91dC5zcGxpdCgvXFxyP1xcbi8sIFJFVl9QQVJTRV9PVVRQVVRfTElORV9DT1VOVCk7XG4gICAgcmV0dXJuIHJlc3VsdC5leGl0Q29kZSAhPT0gMCB8fCBpc0luc2lkZVdvcmtUcmVlICE9PSAndHJ1ZScgfHwgIWdpdERpcmVjdG9yeSA/IG51bGwgOiBuZXcgQnVsa09wZXJhdGlvbkdpdFJlcG8oeyBnaXREaXJlY3RvcnksIHdvcmtpbmdEaXJlY3RvcnkgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVmdXNlcyB0byBnbyBvbiB3aGVuIHRoZSByZXBvIHJvdXRlcyBmaWxlcyB0aHJvdWdoIGdpdC1hbm5leCBidXQgYGdpdC1hbm5leGAgY2Fubm90IGJlIHJ1biwgc2luY2UgYVxuICAgKiBwbGFpbiBgZ2l0IGFkZGAgd291bGQgdGhlbiBwdXQgdGhlIGxhcmdlIGZpbGVzIGludG8gZ2l0IGl0c2VsZi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBhc3NlcnRDYW5Db21taXRMYXJnZUZpbGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFubmV4RmlsdGVycyA9IGF3YWl0IHRoaXMucnVuR2l0KHsgYWxsb3dlZEV4aXRDb2RlczogWzAsIDFdLCBnaXRBcmd1bWVudHM6IFsnY29uZmlnJywgJy0tZ2V0LXJlZ2V4cCcsIFN0cmluZy5yYXdgXmZpbHRlclxcLmFubmV4XFwuYF0gfSk7XG4gICAgaWYgKCFhbm5leEZpbHRlcnMuc3Rkb3V0LnRyaW0oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhbm5leFZlcnNpb24gPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50czogWydhbm5leCcsICd2ZXJzaW9uJywgJy0tcmF3J10gfSkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgaWYgKGFubmV4VmVyc2lvbiA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHZhdWx0IHJlcG9zaXRvcnkgcm91dGVzIGZpbGVzIHRocm91Z2ggZ2l0LWFubmV4LCBidXQgZ2l0LWFubmV4IGlzIG5vdCBvbiBQQVRILiBCdWxrIG9wZXJhdGlvbiBjb21taXRzIGFyZSByZWZ1c2VkLCBiZWNhdXNlIHRoZXkgd291bGQgYWRkIGxhcmdlIGZpbGVzIHRvIGdpdCBpdHNlbGYuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgdGhlIGJ1bGstb3BlcmF0aW9uIGNvbW1pdHMgYSBwbHVnaW4gbWFkZSBvbiB0aGUgY3VycmVudCBicmFuY2gsIG5ld2VzdCBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIHBsdWdpbiBpZC5cbiAgICogQHJldHVybnMgVGhlIGNvbW1pdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdEJ1bGtPcGVyYXRpb25Db21taXRzKHBsdWdpbklkOiBzdHJpbmcpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25Db21taXRbXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuR2l0KHtcbiAgICAgIGFsbG93ZWRFeGl0Q29kZXM6IFswLCBHSVRfRkFUQUxfRVhJVF9DT0RFXSxcbiAgICAgIGdpdEFyZ3VtZW50czogW1xuICAgICAgICAnbG9nJyxcbiAgICAgICAgYC0tZm9ybWF0PSVIJHtVTklUX1NFUEFSQVRPUn0lYUkke1VOSVRfU0VQQVJBVE9SfSVzYCxcbiAgICAgICAgJy0tZXh0ZW5kZWQtcmVnZXhwJyxcbiAgICAgICAgYC0tZ3JlcD1eJHtQTFVHSU5fVFJBSUxFUl9LRVl9OiAke2VzY2FwZVJlZ0V4cChwbHVnaW5JZCl9JGBcbiAgICAgIF1cbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGNvbW1pdHM6IEJ1bGtPcGVyYXRpb25Db21taXRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiByZXN1bHQuc3Rkb3V0LnNwbGl0KC9cXHI/XFxuLykpIHtcbiAgICAgIGNvbnN0IFtzaGEgPSAnJywgZGF0ZSA9ICcnLCAuLi5zdWJqZWN0UGFydHNdID0gbGluZS5zcGxpdChVTklUX1NFUEFSQVRPUik7XG4gICAgICBjb25zdCBjb21taXQgPSBwYXJzZUJ1bGtPcGVyYXRpb25Db21taXQoeyBkYXRlLCBzaGEsIHN1YmplY3Q6IHN1YmplY3RQYXJ0cy5qb2luKFVOSVRfU0VQQVJBVE9SKSB9KTtcbiAgICAgIGlmIChjb21taXQpIHtcbiAgICAgICAgY29tbWl0cy5wdXNoKGNvbW1pdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21taXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbW1pdHMgd2hhdGV2ZXIgYSBzdGFsZSBsb2NrJ3Mgb3BlcmF0aW9uIGxlZnQgYmVoaW5kIGFzIGBPUDxuPiBpbnRlcnJ1cHRlZGAgYW5kIHJlbW92ZXMgdGhlIGxvY2suXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBpZCBvZiB0aGUgcmVjb3ZlcmVkIG9wZXJhdGlvbiwgb3IgYG51bGxgIHdoZW4gdGhlcmUgd2FzIG5vIHN0YWxlIGxvY2suXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVjb3ZlclN0YWxlTG9jaygpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy5yZWFkTG9jaygpO1xuICAgIHJldHVybiAhbG9jayB8fCAhdGhpcy5pc1N0YWxlKGxvY2spID8gbnVsbCA6IChhd2FpdCB0aGlzLnJlY292ZXIobG9jaykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmVydHMgYSBidWxrLW9wZXJhdGlvbiBjb21taXQgd2l0aCBgZ2l0IHJldmVydCAtLW5vLWVkaXRgLlxuICAgKlxuICAgKiBXaGF0ZXZlciBpcyBwZW5kaW5nIGlzIGNvbW1pdHRlZCBmaXJzdCwgc28gdGhlIHJldmVydCBzdGFydHMgZnJvbSBhIGNsZWFuIHRyZWUuIEEgY29uZmxpY3QgaXMgTk9UIGFib3J0ZWQ6IHRoZVxuICAgKiByZXBvIGlzIGxlZnQgbWlkLXJldmVydCBmb3IgdGhlIHVzZXIgdG8gcmVzb2x2ZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1pdCAtIFRoZSBjb21taXQgdG8gcmV2ZXJ0LlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSByZXZlcnQgc3RvcHBlZCBvbiBhIGNvbmZsaWN0LCBhbmQgd2hhdCBnaXQgcHJpbnRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXZlcnRCdWxrT3BlcmF0aW9uQ29tbWl0KGNvbW1pdDogQnVsa09wZXJhdGlvbkNvbW1pdCk6IFByb21pc2U8R2l0UmV2ZXJ0UmVzdWx0PiB7XG4gICAgYXdhaXQgdGhpcy5hc3NlcnRDYW5Db21taXRMYXJnZUZpbGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hY3F1aXJlTG9jaygpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdFBlbmRpbmcoeyBib2R5OiAnJywgc3ViamVjdDogYGNob3JlOiBiZWZvcmUgcmV2ZXJ0IG9mICR7Y29tbWl0Lm9wZXJhdGlvbklkfWAgfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGFsbG93ZWRFeGl0Q29kZXM6IFswLCAxXSwgZ2l0QXJndW1lbnRzOiBbJ3JldmVydCcsICctLW5vLWVkaXQnLCBjb21taXQuc2hhXSB9KTtcbiAgICAgIHJldHVybiB7IGlzQ29uZmxpY3Q6IHJlc3VsdC5leGl0Q29kZSAhPT0gMCwgb3V0cHV0OiBgJHtyZXN1bHQuc3Rkb3V0fSR7cmVzdWx0LnN0ZGVycn1gLnRyaW0oKSB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbGVhc2VMb2NrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBidWxrIG9wZXJhdGlvbiBiZXR3ZWVuIHR3byBjb21taXRzLlxuICAgKlxuICAgKiBUYWtlcyB0aGUgbGVhc2UgbG9jaywgY29tbWl0cyB3aGF0ZXZlciBpcyBwZW5kaW5nIGFzIGBjaG9yZTogYmVmb3JlIE9QPG4+YCwgcnVucyB0aGUgb3BlcmF0aW9uLCB3YWl0cyBmb3IgaXRzXG4gICAqIGZvbGxvdy11cHMgdG8gc2V0dGxlLCBjb21taXRzIHRoZSByZXN1bHQgYXMgYE9QPG4+OiA8c3VtbWFyeT5gIGFuZCByZWxlYXNlcyB0aGUgbG9jay4gQW4gb3BlcmF0aW9uIHRoYXQgdGhyb3dzXG4gICAqIHN0aWxsIGdldHMgaXRzIHBhcnRpYWwgY2hhbmdlcyBjb21taXR0ZWQsIGFzIGBPUDxuPiBpbnRlcnJ1cHRlZGAsIGJlZm9yZSB0aGUgZXJyb3IgaXMgcmV0aHJvd24uXG4gICAqXG4gICAqIFdoZW4gdGhlIGxvY2sgd2FzIHJlY292ZXJlZCB1bmRlciB0aGUgb3BlcmF0aW9uIChpdCB3ZW50IHN0YWxlLCBhbmQgYW5vdGhlciBvcGVyYXRpb24sIHRoZSBzY2hlZHVsZWQgYXV0b2NvbW1pdCBvclxuICAgKiBhIHJlbG9hZCBjb21taXR0ZWQgYE9QPG4+IGludGVycnVwdGVkYCBhbmQgcmVtb3ZlZCBpdCksIHRoZSByZXN0IGlzIG5ldmVyIGNvbW1pdHRlZCB1bmRlciB0aGUgcmVjb3ZlcmVkIGlkOiB0aGVcbiAgICogbG9jayBpcyB0YWtlbiBhZ2FpbiBhbmQgdGhlIHJlc3QgaXMgY29tbWl0dGVkIGFzIGEgZnJlc2ggYE9QPG0+YCB3aG9zZSBzdW1tYXJ5IG5hbWVzIGBPUDxuPmAuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIG9wZXJhdGlvbidzIHJlc3VsdCwgaXRzIGlkLCB0aGUgaGFzaCBvZiBpdHMgY29tbWl0IGFuZCB0aGUgaWQgaXQgbG9zdCB0byBhIHJlY292ZXJ5LCBpZiBhbnkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcnVuQnVsa09wZXJhdGlvbjxUPihwYXJhbXM6IEJ1bGtPcGVyYXRpb25HaXRSZXBvUnVuQnVsa09wZXJhdGlvblBhcmFtczxUPik6IFByb21pc2U8R2l0QnVsa09wZXJhdGlvblJlc3VsdDxUPj4ge1xuICAgIGF3YWl0IHRoaXMuYXNzZXJ0Q2FuQ29tbWl0TGFyZ2VGaWxlcygpO1xuICAgIGF3YWl0IHRoaXMuYWNxdWlyZUxvY2soKTtcbiAgICBsZXQgdW5yZWdpc3RlclByb2dyZXNzTGlzdGVuZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydE9wZXJhdGlvbklkID0gYXdhaXQgdGhpcy5hbGxvY2F0ZU9wZXJhdGlvbklkKHBhcmFtcy5wbHVnaW5JZCk7XG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdFBlbmRpbmcoeyBib2R5OiAnJywgc3ViamVjdDogYnVpbGRCZWZvcmVPcGVyYXRpb25Db21taXRTdWJqZWN0KHN0YXJ0T3BlcmF0aW9uSWQpIH0pO1xuXG4gICAgICB1bnJlZ2lzdGVyUHJvZ3Jlc3NMaXN0ZW5lciA9IHJlZ2lzdGVyQnVsa09wZXJhdGlvblByb2dyZXNzTGlzdGVuZXIodGhpcy5jcmVhdGVUaHJvdHRsZWRIZWFydGJlYXQoKSk7XG5cbiAgICAgIGxldCByZXN1bHQ6IFQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBwYXJhbXMub3BlcmF0aW9uKCk7XG4gICAgICAgIGF3YWl0IHBhcmFtcy5zZXR0bGUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gYXdhaXQgdGhpcy5yZWNsYWltTG9ja0lmUmVjb3ZlcmVkKHN0YXJ0T3BlcmF0aW9uSWQsIHBhcmFtcy5wbHVnaW5JZCkgPz8gc3RhcnRPcGVyYXRpb25JZDtcbiAgICAgICAgYXdhaXQgdGhpcy5jb21taXRPcGVyYXRpb24oeyBpc0ludGVycnVwdGVkOiB0cnVlLCBvcGVyYXRpb25JZCwgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZCB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VtZWRPcGVyYXRpb25JZCA9IGF3YWl0IHRoaXMucmVjbGFpbUxvY2tJZlJlY292ZXJlZChzdGFydE9wZXJhdGlvbklkLCBwYXJhbXMucGx1Z2luSWQpO1xuICAgICAgY29uc3Qgb3BlcmF0aW9uSWQgPSByZXN1bWVkT3BlcmF0aW9uSWQgPz8gc3RhcnRPcGVyYXRpb25JZDtcbiAgICAgIGNvbnN0IHN1bW1hcnkgPSByZXN1bWVkT3BlcmF0aW9uSWQgPT09IG51bGwgPyBwYXJhbXMuc3VtbWFyeSA6IGAke3BhcmFtcy5zdW1tYXJ5fSAocmVzdW1lZCBhZnRlciAke3N0YXJ0T3BlcmF0aW9uSWR9IHdhcyByZWNvdmVyZWQpYDtcbiAgICAgIGNvbnN0IGNvbW1pdFNoYSA9IGF3YWl0IHRoaXMuY29tbWl0T3BlcmF0aW9uKHsgb3BlcmF0aW9uSWQsIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsIHN1bW1hcnkgfSk7XG4gICAgICByZXR1cm4geyBjb21taXRTaGEsIG9wZXJhdGlvbklkLCByZWNvdmVyZWRPcGVyYXRpb25JZDogcmVzdW1lZE9wZXJhdGlvbklkID09PSBudWxsID8gbnVsbCA6IHN0YXJ0T3BlcmF0aW9uSWQsIHJlc3VsdCB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB1bnJlZ2lzdGVyUHJvZ3Jlc3NMaXN0ZW5lcj8uKCk7XG4gICAgICBhd2FpdCB0aGlzLnJlbGVhc2VMb2NrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhY3F1aXJlTG9jaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aGlzLmxvY2tXYWl0VGltZW91dEluTWlsbGlzZWNvbmRzO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnRyeUNyZWF0ZUxvY2soKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvY2sgPSBhd2FpdCB0aGlzLnJlYWRMb2NrKCk7XG4gICAgICBpZiAoIWxvY2spIHtcbiAgICAgICAgLy8gUmVsZWFzZWQgYmV0d2VlbiB0aGUgdHdvIGNhbGxzOiB0cnkgdG8gdGFrZSBpdCBhZ2FpbiBhdCBvbmNlLlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNTdGFsZShsb2NrKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlY292ZXIobG9jayk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRpbWVkIG91dCB3YWl0aW5nIGZvciAke2xvY2sub3BlcmF0aW9uSWQgfHwgJ2FuIG9wZXJhdGlvbid9IG9mICR7bG9jay5wbHVnaW5JZH0gb24gJHtsb2NrLmhvc3R9IHRvIHJlbGVhc2UgdGhlIGJ1bGsgb3BlcmF0aW9uIGxvY2sgJHt0aGlzLmxvY2tGaWxlUGF0aH0uYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBzZXRUaW1lb3V0QXN5bmMoTE9DS19QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhbGxvY2F0ZU9wZXJhdGlvbklkKHBsdWdpbklkOiBzdHJpbmcsIHVzZWRPcGVyYXRpb25JZD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBhd2FpdCB0aGlzLmZpbmROZXh0T3BlcmF0aW9uSWQodXNlZE9wZXJhdGlvbklkKTtcbiAgICBjb25zdCBvd25Mb2NrID0gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5vd25Mb2NrKTtcbiAgICB0aGlzLm93bkxvY2sgPSB7IC4uLm93bkxvY2ssIGhlYXJ0YmVhdEF0OiBEYXRlLm5vdygpLCBvcGVyYXRpb25JZCwgcGx1Z2luSWQgfTtcbiAgICBhd2FpdCB0aGlzLndyaXRlTG9jayh0aGlzLm93bkxvY2spO1xuICAgIHJldHVybiBvcGVyYXRpb25JZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29tbWl0T3BlcmF0aW9uKHBhcmFtczogQnVsa09wZXJhdGlvbkdpdFJlcG9Db21taXRPcGVyYXRpb25QYXJhbXMpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBjaGFuZ2VkRmlsZUNvdW50ID0gYXdhaXQgdGhpcy5zdGFnZUFsbCgpO1xuICAgIGlmIChjaGFuZ2VkRmlsZUNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZSA9IGJ1aWxkT3BlcmF0aW9uQ29tbWl0TWVzc2FnZSh7IC4uLnBhcmFtcywgY2hhbmdlZEZpbGVDb3VudCwgdGltZXN0YW1wOiBuZXcgRGF0ZSgpIH0pO1xuICAgIGF3YWl0IHRoaXMuY29tbWl0U3RhZ2VkKG1lc3NhZ2UpO1xuICAgIGNvbnN0IGhlYWRSZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50czogWydyZXYtcGFyc2UnLCAnSEVBRCddIH0pO1xuICAgIHJldHVybiBoZWFkUmVzdWx0LnN0ZG91dC50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFBlbmRpbmcobWVzc2FnZTogQ29tbWl0TWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChhd2FpdCB0aGlzLnN0YWdlQWxsKCkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jb21taXRTdGFnZWQobWVzc2FnZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFN0YWdlZChtZXNzYWdlOiBDb21taXRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ2l0QXJndW1lbnRzID0gWydjb21taXQnLCAnLS1xdWlldCcsICctbScsIG1lc3NhZ2Uuc3ViamVjdF07XG4gICAgaWYgKG1lc3NhZ2UuYm9keSkge1xuICAgICAgZ2l0QXJndW1lbnRzLnB1c2goJy1tJywgbWVzc2FnZS5ib2R5KTtcbiAgICB9XG4gICAgZ2l0QXJndW1lbnRzLnB1c2goJy0tJywgJy4nKTtcbiAgICBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50cyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGhyb3R0bGVkSGVhcnRiZWF0KCk6ICgpID0+IHZvaWQge1xuICAgIGxldCBsYXN0SGVhcnRiZWF0QXQgPSBEYXRlLm5vdygpO1xuICAgIGxldCBwZW5kaW5nSGVhcnRiZWF0OiBQcm9taXNlPHZvaWQ+ID0gbm9vcEFzeW5jKCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBpZiAobm93IC0gbGFzdEhlYXJ0YmVhdEF0IDwgSEVBUlRCRUFUX1RIUk9UVExFX0lOX01JTExJU0VDT05EUykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsYXN0SGVhcnRiZWF0QXQgPSBub3c7XG4gICAgICBwZW5kaW5nSGVhcnRiZWF0ID0gcGVuZGluZ0hlYXJ0YmVhdC50aGVuKCgpID0+IHRoaXMuaGVhcnRiZWF0KCkpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCB0aGUgYnVsayBvcGVyYXRpb24gbG9jayBoZWFydGJlYXQnLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kTmV4dE9wZXJhdGlvbklkKHVzZWRPcGVyYXRpb25JZD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gYC0tYWxsYCBhbHNvIHJlYWRzIGEgcmVwb3NpdG9yeSB3aXRoIG5vIGNvbW1pdCB5ZXQsIHdoZXJlIGEgcGxhaW4gYGdpdCBsb2dgIGZhaWxzLlxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuR2l0KHtcbiAgICAgIGdpdEFyZ3VtZW50czogWydsb2cnLCAnLS1hbGwnLCAnLS1mb3JtYXQ9JXMnLCAnLS1leHRlbmRlZC1yZWdleHAnLCAnLS1ncmVwPV4oY2hvcmU6IGJlZm9yZSApP09QWzAtOV0rJ11cbiAgICB9KTtcbiAgICAvLyBBIHJlY292ZXJlZCBvcGVyYXRpb24gdGhhdCBjaGFuZ2VkIG5vdGhpbmcgeWV0IGxlZnQgbm8gY29tbWl0IG5hbWluZyBpdHMgaWQsIHNvIGl0IGlzIHBhc3NlZCBpbiBleHBsaWNpdGx5LlxuICAgIHJldHVybiBnZXROZXh0T3BlcmF0aW9uSWQoWy4uLnJlc3VsdC5zdGRvdXQuc3BsaXQoL1xccj9cXG4vKSwgdXNlZE9wZXJhdGlvbklkID8/ICcnXSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhlYXJ0YmVhdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy5yZWFkTG9jaygpO1xuICAgIGlmICghbG9jayB8fCAhdGhpcy5pc093bkxvY2sobG9jaykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53cml0ZUxvY2soeyAuLi5sb2NrLCBoZWFydGJlYXRBdDogRGF0ZS5ub3coKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNPd25Mb2NrKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3duTG9jayAhPT0gbnVsbFxuICAgICAgJiYgbG9jay5ob3N0ID09PSB0aGlzLm93bkxvY2suaG9zdFxuICAgICAgJiYgbG9jay5wcm9jZXNzSWQgPT09IHRoaXMub3duTG9jay5wcm9jZXNzSWRcbiAgICAgICYmIGxvY2suc3RhcnRlZEF0ID09PSB0aGlzLm93bkxvY2suc3RhcnRlZEF0O1xuICB9XG5cbiAgcHJpdmF0ZSBpc1N0YWxlKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzQnVsa09wZXJhdGlvbkxvY2tTdGFsZShsb2NrLCB7XG4gICAgICBib290ZWRBdDogRGF0ZS5ub3coKSAtIHVwdGltZSgpICogTUlMTElTRUNPTkRTX0lOX1NFQ09ORCxcbiAgICAgIGhvc3Q6IGhvc3RuYW1lKCksXG4gICAgICBpc1Byb2Nlc3NBbGl2ZSxcbiAgICAgIG5vdzogRGF0ZS5ub3coKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkTG9jaygpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25Mb2NrIHwgbnVsbD4ge1xuICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHRleHQgPSBhd2FpdCByZWFkRmlsZSh0aGlzLmxvY2tGaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0Vycm9yV2l0aENvZGUoZXJyb3IsICdFTk9FTlQnKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICBpZiAoaXNCdWxrT3BlcmF0aW9uTG9jayh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVXBkYXRlcyBhcmUgYXRvbWljLCBidXQgYSBsb2NrIGJlaW5nIGNyZWF0ZWQgY2FuIGJlIHJlYWQgYmVmb3JlIGl0cyBjb250ZW50IGlzIHdyaXR0ZW4uIFRoZSBmaWxlJ3MgYWdlXG4gICAgICAvLyBzdGFuZHMgaW4gZm9yIHRoZSBoZWFydGJlYXQsIHNvIHN1Y2ggYSBsb2NrIHJlYWRzIGFzIGZyZXNoIGFuZCBhIGNvcnJ1cHQgb25lIGdvZXMgc3RhbGUgbGlrZSBhbnkgb3RoZXIuXG4gICAgfVxuICAgIGNvbnN0IGZpbGVTdGF0cyA9IGF3YWl0IHN0YXQodGhpcy5sb2NrRmlsZVBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICBoZWFydGJlYXRBdDogZmlsZVN0YXRzLm10aW1lTXMsXG4gICAgICBob3N0OiAnJyxcbiAgICAgIG9wZXJhdGlvbklkOiAnJyxcbiAgICAgIHBsdWdpbklkOiAnJyxcbiAgICAgIHByb2Nlc3NJZDogMCxcbiAgICAgIHByb2Nlc3NTdGFydGVkQXQ6IDAsXG4gICAgICBzdGFydGVkQXQ6IDBcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyB0aGUgb3BlcmF0aW9uJ3MgbG9jayBiZWZvcmUgaXRzIGNvbW1pdCwgb3IgdGFrZXMgdGhlIGxvY2sgYWdhaW4gd2hlbiBpdCB3YXMgcmVjb3ZlcmVkIHVuZGVyIHRoZVxuICAgKiBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBvcGVyYXRpb25JZCAtIFRoZSBpZCB0aGUgb3BlcmF0aW9uIHN0YXJ0ZWQgdW5kZXIuXG4gICAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi5cbiAgICogQHJldHVybnMgYG51bGxgIHdoZW4gdGhlIGxvY2sgaXMgc3RpbGwgdGhlIG9wZXJhdGlvbidzIG93biwgb3RoZXJ3aXNlIHRoZSBmcmVzaCBpZCB0aGUgcmVzdCBpcyBjb21taXR0ZWQgdW5kZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlY2xhaW1Mb2NrSWZSZWNvdmVyZWQob3BlcmF0aW9uSWQ6IHN0cmluZywgcGx1Z2luSWQ6IHN0cmluZyk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICAgIGNvbnN0IGxvY2sgPSBhd2FpdCB0aGlzLnJlYWRMb2NrKCk7XG4gICAgaWYgKGxvY2sgIT09IG51bGwgJiYgdGhpcy5pc093bkxvY2sobG9jaykpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVMb2NrKHsgLi4ubG9jaywgaGVhcnRiZWF0QXQ6IERhdGUubm93KCkgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKGBUaGUgYnVsayBvcGVyYXRpb24gbG9jayBvZiAke29wZXJhdGlvbklkfSB3YXMgcmVjb3ZlcmVkIHdoaWxlIGl0IHJhbjsgY29tbWl0dGluZyB0aGUgcmVzdCB1bmRlciBhIGZyZXNoIG9wZXJhdGlvbiBpZC5gKTtcbiAgICB0aGlzLm93bkxvY2sgPSBudWxsO1xuICAgIGF3YWl0IHRoaXMuYWNxdWlyZUxvY2soKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hbGxvY2F0ZU9wZXJhdGlvbklkKHBsdWdpbklkLCBvcGVyYXRpb25JZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlY292ZXIobG9jazogQnVsa09wZXJhdGlvbkxvY2spOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IG9wZXJhdGlvbklkID0gbG9jay5vcGVyYXRpb25JZCB8fCBhd2FpdCB0aGlzLmZpbmROZXh0T3BlcmF0aW9uSWQoKTtcbiAgICBhd2FpdCB0aGlzLmNvbW1pdE9wZXJhdGlvbih7IGlzSW50ZXJydXB0ZWQ6IHRydWUsIG9wZXJhdGlvbklkLCBwbHVnaW5JZDogbG9jay5wbHVnaW5JZCB8fCAndW5rbm93bicgfSk7XG4gICAgYXdhaXQgdW5saW5rKHRoaXMubG9ja0ZpbGVQYXRoKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGlmICghaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRU5PRU5UJykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG9wZXJhdGlvbklkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWxlYXNlTG9jaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy5yZWFkTG9jaygpO1xuICAgIGNvbnN0IGlzT3duTG9jayA9IGxvY2sgIT09IG51bGwgJiYgdGhpcy5pc093bkxvY2sobG9jayk7XG4gICAgdGhpcy5vd25Mb2NrID0gbnVsbDtcbiAgICBpZiAoIWlzT3duTG9jaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB1bmxpbmsodGhpcy5sb2NrRmlsZVBhdGgpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgaWYgKCFpc0Vycm9yV2l0aENvZGUoZXJyb3IsICdFTk9FTlQnKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuR2l0KHBhcmFtczogQnVsa09wZXJhdGlvbkdpdFJlcG9SdW5HaXRQYXJhbXMpOiBQcm9taXNlPEdpdENvbW1hbmRSZXN1bHQ+IHtcbiAgICBjb25zdCBhbGxvd2VkRXhpdENvZGVzID0gcGFyYW1zLmFsbG93ZWRFeGl0Q29kZXMgPz8gWzBdO1xuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOzsgYXR0ZW1wdCsrKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjR2l0KHsgY3dkOiB0aGlzLndvcmtpbmdEaXJlY3RvcnksIGdpdEFyZ3VtZW50czogcGFyYW1zLmdpdEFyZ3VtZW50cyB9KTtcbiAgICAgIGlmIChhbGxvd2VkRXhpdENvZGVzLmluY2x1ZGVzKHJlc3VsdC5leGl0Q29kZSkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGlmIChhdHRlbXB0IDwgSU5ERVhfTE9DS19SRVRSWV9DT1VOVCAmJiByZXN1bHQuc3RkZXJyLmluY2x1ZGVzKCdpbmRleC5sb2NrJykpIHtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dEFzeW5jKElOREVYX0xPQ0tfUkVUUllfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgR2l0Q29tbWFuZEVycm9yKHBhcmFtcy5naXRBcmd1bWVudHMsIHJlc3VsdC5leGl0Q29kZSwgcmVzdWx0LnN0ZGVycik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFnZUFsbCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGF3YWl0IHRoaXMucnVuR2l0KHsgZ2l0QXJndW1lbnRzOiBbJ2FkZCcsICctLWFsbCcsICctLScsICcuJ10gfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5HaXQoeyBnaXRBcmd1bWVudHM6IFsnZGlmZicsICctLWNhY2hlZCcsICctLW5hbWUtb25seScsICcteicsICctLScsICcuJ10gfSk7XG4gICAgcmV0dXJuIHJlc3VsdC5zdGRvdXQuc3BsaXQoJ1xcMCcpLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRyeUNyZWF0ZUxvY2soKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbG9jayA9IGNyZWF0ZUxvY2tSZWNvcmQoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKHRoaXMubG9ja0ZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShsb2NrKSwgeyBmbGFnOiAnd3gnIH0pO1xuICAgICAgdGhpcy5vd25Mb2NrID0gbG9jaztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRUVYSVNUJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZUxvY2sobG9jazogQnVsa09wZXJhdGlvbkxvY2spOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBXcml0dGVuIGJlc2lkZSB0aGUgbG9jayBhbmQgcmVuYW1lZCBvdmVyIGl0LCBzbyBhIHJlYWRlciBuZXZlciBzZWVzIGEgaGFsZi13cml0dGVuIGhlYXJ0YmVhdC5cbiAgICBjb25zdCB0ZW1wb3JhcnlQYXRoID0gYCR7dGhpcy5sb2NrRmlsZVBhdGh9LiR7U3RyaW5nKGxvY2sucHJvY2Vzc0lkKX0udG1wYDtcbiAgICBhd2FpdCB3cml0ZUZpbGUodGVtcG9yYXJ5UGF0aCwgSlNPTi5zdHJpbmdpZnkobG9jaykpO1xuICAgIGF3YWl0IHJlbmFtZSh0ZW1wb3JhcnlQYXRoLCB0aGlzLmxvY2tGaWxlUGF0aCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBlcnJvciB0aHJvd24gd2hlbiBhIGBnaXRgIGNvbW1hbmQgZmFpbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBHaXRDb21tYW5kRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gZ2l0QXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyBgZ2l0YCB3YXMgcnVuIHdpdGguXG4gICAqIEBwYXJhbSBleGl0Q29kZSAtIFRoZSBleGl0IGNvZGUuXG4gICAqIEBwYXJhbSBzdGRlcnIgLSBXaGF0IGBnaXRgIHByaW50ZWQgdG8gc3RkZXJyLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBnaXRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLCBwdWJsaWMgcmVhZG9ubHkgZXhpdENvZGU6IG51bWJlciwgcHVibGljIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nKSB7XG4gICAgc3VwZXIoYGdpdCAke2dpdEFyZ3VtZW50cy5qb2luKCcgJyl9IGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke1N0cmluZyhleGl0Q29kZSl9OiAke3N0ZGVyci50cmltKCl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0dpdENvbW1hbmRFcnJvcic7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlTG9ja1JlY29yZCgpOiBCdWxrT3BlcmF0aW9uTG9jayB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIHJldHVybiB7XG4gICAgaGVhcnRiZWF0QXQ6IG5vdyxcbiAgICBob3N0OiBob3N0bmFtZSgpLFxuICAgIG9wZXJhdGlvbklkOiAnJyxcbiAgICBwbHVnaW5JZDogJycsXG4gICAgcHJvY2Vzc0lkOiBwcm9jZXNzLnBpZCxcbiAgICBwcm9jZXNzU3RhcnRlZEF0OiBnZXRQcm9jZXNzU3RhcnRlZEF0KCksXG4gICAgc3RhcnRlZEF0OiBub3dcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY0dpdChwYXJhbXM6IEV4ZWNHaXRQYXJhbXMpOiBQcm9taXNlPEdpdENvbW1hbmRSZXN1bHQ+IHtcbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBleGVjRmlsZSgnZ2l0JywgWy4uLnBhcmFtcy5naXRBcmd1bWVudHNdLCB7IGN3ZDogcGFyYW1zLmN3ZCwgbWF4QnVmZmVyOiBNQVhfQlVGRkVSX0lOX0JZVEVTLCB3aW5kb3dzSGlkZTogdHJ1ZSB9LCAoZXJyb3IsIHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yLmNvZGUgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gZ2l0ICR7cGFyYW1zLmdpdEFyZ3VtZW50cy5qb2luKCcgJyl9YCwgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKHsgZXhpdENvZGU6IHR5cGVvZiBlcnJvcj8uY29kZSA9PT0gJ251bWJlcicgPyBlcnJvci5jb2RlIDogMCwgc3RkZXJyLCBzdGRvdXQgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQcm9jZXNzU3RhcnRlZEF0KCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4pO1xufVxuXG5mdW5jdGlvbiBpc0Vycm9yV2l0aENvZGUoZXJyb3I6IHVua25vd24sIGNvZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gY29kZTtcbn1cblxuZnVuY3Rpb24gaXNQcm9jZXNzQWxpdmUocHJvY2Vzc0lkOiBudW1iZXIpOiBib29sZWFuIHwgbnVsbCB7XG4gIGlmIChwcm9jZXNzSWQgPD0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzSWQsIDApO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiAhaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRVNSQ0gnKSAmJiAoaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRVBFUk0nKSB8fCBudWxsKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnQkEsbUJBQWdDO0FBQ2hDLHNCQUEwQjtBQUMxQixxQkFBNkI7QUFDN0IseUJBQWtDO0FBQ2xDLGdDQUF5QjtBQUN6QixzQkFNTztBQUNQLHFCQUdPO0FBQ1AsdUJBQXFCO0FBT3JCLHFDQUFzRDtBQUN0RCw0QkFTTztBQThHUCxNQUFNLDRDQUE0QztBQUNsRCxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLHlCQUF5QjtBQUMvQixNQUFNLHlDQUF5QztBQUMvQyxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLHNCQUFzQjtBQUM1QixNQUFNLHlCQUF5QjtBQUMvQixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLGlCQUFpQjtBQXNCaEIsTUFBTSxxQkFBcUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUloQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQSxFQUVDO0FBQUEsRUFDQTtBQUFBLEVBQ1QsVUFBb0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPckMsWUFBWSxRQUErQztBQUNoRSxTQUFLLGVBQWUsT0FBTztBQUMzQixTQUFLLG1CQUFtQixPQUFPO0FBQy9CLFNBQUssZ0NBQWdDLE9BQU8saUNBQWlD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
@@ -74,6 +74,13 @@ export interface GitBulkOperationResult<T> {
74
74
  * The operation id, such as `OP12`.
75
75
  */
76
76
  readonly operationId: string;
77
+ /**
78
+ * The id the operation started under, when its lock was recovered as stale while it ran, or `null` otherwise.
79
+ *
80
+ * The changes made before the recovery are in the `<recoveredOperationId> interrupted` commit, and the rest went into
81
+ * a fresh {@link operationId}, so undoing the whole operation takes reverting both.
82
+ */
83
+ readonly recoveredOperationId: null | string;
77
84
  /**
78
85
  * The operation's result.
79
86
  */
@@ -155,9 +162,13 @@ export declare class BulkOperationGitRepo {
155
162
  * follow-ups to settle, commits the result as `OP<n>: <summary>` and releases the lock. An operation that throws
156
163
  * still gets its partial changes committed, as `OP<n> interrupted`, before the error is rethrown.
157
164
  *
165
+ * When the lock was recovered under the operation (it went stale, and another operation, the scheduled autocommit or
166
+ * a reload committed `OP<n> interrupted` and removed it), the rest is never committed under the recovered id: the
167
+ * lock is taken again and the rest is committed as a fresh `OP<m>` whose summary names `OP<n>`.
168
+ *
158
169
  * @typeParam T - The type of the operation's result.
159
170
  * @param params - The parameters.
160
- * @returns The operation's result, its id and the hash of its commit.
171
+ * @returns The operation's result, its id, the hash of its commit and the id it lost to a recovery, if any.
161
172
  */
162
173
  runBulkOperation<T>(params: BulkOperationGitRepoRunBulkOperationParams<T>): Promise<GitBulkOperationResult<T>>;
163
174
  private acquireLock;
@@ -171,6 +182,15 @@ export declare class BulkOperationGitRepo {
171
182
  private isOwnLock;
172
183
  private isStale;
173
184
  private readLock;
185
+ /**
186
+ * Refreshes the operation's lock before its commit, or takes the lock again when it was recovered under the
187
+ * operation.
188
+ *
189
+ * @param operationId - The id the operation started under.
190
+ * @param pluginId - The id of the plugin running the operation.
191
+ * @returns `null` when the lock is still the operation's own, otherwise the fresh id the rest is committed under.
192
+ */
193
+ private reclaimLockIfRecovered;
174
194
  private recover;
175
195
  private releaseLock;
176
196
  private runGit;
@@ -0,0 +1,258 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
7
+ symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
8
+ symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
9
+ }
10
+
11
+ function ensureBrowserProcess() {
12
+ const browserProcess = {
13
+ browser: true,
14
+ cwd() {
15
+ return "/";
16
+ },
17
+ env: {},
18
+ platform: "android"
19
+ };
20
+ const existingProcess = globalThis.process;
21
+ if (!existingProcess) {
22
+ globalThis.process = browserProcess;
23
+ return;
24
+ }
25
+ if (existingProcess.versions?.node) {
26
+ return;
27
+ }
28
+ const existingProcessRecord = existingProcess;
29
+ for (const [key, value] of Object.entries(browserProcess)) {
30
+ existingProcessRecord[key] ??= value;
31
+ }
32
+ existingProcessRecord["browser"] = true;
33
+ }
34
+
35
+ ensureDisposeSymbols();
36
+ ensureBrowserProcess();
37
+ })();
38
+ (function patchObsidianRequire() {
39
+ const originalRequire = require;
40
+ if (!originalRequire || originalRequire.__isPatched) {
41
+ return;
42
+ }
43
+ require = Object.assign(
44
+ (id) => requirePatched(id),
45
+ originalRequire,
46
+ {
47
+ __isPatched: true
48
+ }
49
+ );
50
+ function extractDefault($module) {
51
+ return $module && $module.__esModule && "default" in $module ? $module.default : $module;
52
+ }
53
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
54
+ "@codemirror/autocomplete",
55
+ "@codemirror/collab",
56
+ "@codemirror/commands",
57
+ "@codemirror/language",
58
+ "@codemirror/lint",
59
+ "@codemirror/search",
60
+ "@codemirror/state",
61
+ "@codemirror/text",
62
+ "@codemirror/view",
63
+ "@lezer/common",
64
+ "@lezer/highlight",
65
+ "@lezer/lr",
66
+ "obsidian"
67
+ ]);
68
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
69
+ "@codemirror/closebrackets",
70
+ "@codemirror/comment",
71
+ "@codemirror/fold",
72
+ "@codemirror/gutter",
73
+ "@codemirror/highlight",
74
+ "@codemirror/history",
75
+ "@codemirror/matchbrackets",
76
+ "@codemirror/panel",
77
+ "@codemirror/rangeset",
78
+ "@codemirror/rectangular-selection",
79
+ "@codemirror/stream-parser",
80
+ "@codemirror/tooltip"
81
+ ]);
82
+ function requirePatched(id) {
83
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
84
+ return originalRequire?.(id);
85
+ }
86
+ const app = globalThis.app;
87
+ if (app?.isMobile) {
88
+ if (id === "process" || id === "node:process") {
89
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
90
+ return process;
91
+ }
92
+ } else {
93
+ const $module = originalRequire?.(id);
94
+ if ($module) {
95
+ return extractDefault($module);
96
+ }
97
+ }
98
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
99
+ return {};
100
+ }
101
+ })();
102
+
103
+ "use strict";
104
+ var __defProp = Object.defineProperty;
105
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
106
+ var __getOwnPropNames = Object.getOwnPropertyNames;
107
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
108
+ var __export = (target, all) => {
109
+ for (var name in all)
110
+ __defProp(target, name, { get: all[name], enumerable: true });
111
+ };
112
+ var __copyProps = (to, from, except, desc) => {
113
+ if (from && typeof from === "object" || typeof from === "function") {
114
+ for (let key of __getOwnPropNames(from))
115
+ if (!__hasOwnProp.call(to, key) && key !== except)
116
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
117
+ }
118
+ return to;
119
+ };
120
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
121
+ var desktop_request_url_stream_exports = {};
122
+ __export(desktop_request_url_stream_exports, {
123
+ openDesktopRequestUrlStream: () => openDesktopRequestUrlStream
124
+ });
125
+ module.exports = __toCommonJS(desktop_request_url_stream_exports);
126
+ var import_abort_controller = require('@mnaoumov/typescript-lib/abort-controller');
127
+ var import_type_guards = require('@mnaoumov/typescript-lib/type-guards');
128
+ var import_node_http = require('node:http');
129
+ var import_node_https = require('node:https');
130
+ const MAX_REDIRECT_COUNT = 20;
131
+ const HTTP_MOVED_PERMANENTLY_STATUS = 301;
132
+ const HTTP_FOUND_STATUS = 302;
133
+ const HTTP_SEE_OTHER_STATUS = 303;
134
+ const HTTP_TEMPORARY_REDIRECT_STATUS = 307;
135
+ const HTTP_PERMANENT_REDIRECT_STATUS = 308;
136
+ const REDIRECT_STATUSES = /* @__PURE__ */ new Set([
137
+ HTTP_FOUND_STATUS,
138
+ HTTP_MOVED_PERMANENTLY_STATUS,
139
+ HTTP_PERMANENT_REDIRECT_STATUS,
140
+ HTTP_SEE_OTHER_STATUS,
141
+ HTTP_TEMPORARY_REDIRECT_STATUS
142
+ ]);
143
+ const BODY_HEADERS = /* @__PURE__ */ new Set(["content-length", "content-type"]);
144
+ async function openDesktopRequestUrlStream(request) {
145
+ let currentRequest = {
146
+ abortSignal: request.abortSignal,
147
+ body: request.body,
148
+ headers: request.headers,
149
+ method: request.method,
150
+ url: request.url
151
+ };
152
+ for (let redirectCount = 0; ; redirectCount++) {
153
+ const incomingMessage = await sendRequest(currentRequest);
154
+ const status = (0, import_type_guards.ensureNonNullable)(incomingMessage.statusCode);
155
+ const location = incomingMessage.headers.location;
156
+ if (!REDIRECT_STATUSES.has(status) || location === void 0) {
157
+ return {
158
+ body: createIncomingMessageStream(incomingMessage, request.abortSignal),
159
+ headers: flattenHeaders(incomingMessage.headers),
160
+ status,
161
+ url: currentRequest.url
162
+ };
163
+ }
164
+ incomingMessage.resume();
165
+ if (redirectCount >= MAX_REDIRECT_COUNT) {
166
+ throw new TypeError(`Too many redirects requesting ${request.url}`);
167
+ }
168
+ const nextUrl = new URL(location, currentRequest.url);
169
+ if (nextUrl.protocol !== "http:" && nextUrl.protocol !== "https:") {
170
+ throw new TypeError(`Unsupported protocol ${nextUrl.protocol} in the redirect to ${nextUrl.href}`);
171
+ }
172
+ currentRequest = getRedirectedRequest(currentRequest, status, nextUrl.href);
173
+ }
174
+ }
175
+ function createIncomingMessageStream(incomingMessage, abortSignal) {
176
+ let isSettled = false;
177
+ let abortListener;
178
+ return new ReadableStream({
179
+ cancel() {
180
+ isSettled = true;
181
+ abortListener[Symbol.dispose]();
182
+ incomingMessage.destroy();
183
+ },
184
+ pull() {
185
+ incomingMessage.resume();
186
+ },
187
+ start(controller) {
188
+ function settle(error) {
189
+ if (isSettled) {
190
+ return;
191
+ }
192
+ isSettled = true;
193
+ if (error === void 0) {
194
+ controller.close();
195
+ } else {
196
+ controller.error(error);
197
+ }
198
+ }
199
+ incomingMessage.on("data", (chunk) => {
200
+ controller.enqueue(new Uint8Array(chunk));
201
+ if (Number(controller.desiredSize) <= 0) {
202
+ incomingMessage.pause();
203
+ }
204
+ });
205
+ incomingMessage.on("end", () => {
206
+ abortListener[Symbol.dispose]();
207
+ settle();
208
+ });
209
+ incomingMessage.on("error", (error) => {
210
+ abortListener[Symbol.dispose]();
211
+ settle(error);
212
+ });
213
+ abortListener = (0, import_abort_controller.onAbort)(abortSignal, () => {
214
+ settle(abortSignal.reason);
215
+ incomingMessage.destroy(abortSignal.reason);
216
+ });
217
+ }
218
+ });
219
+ }
220
+ function flattenHeaders(headers) {
221
+ const flatHeaders = {};
222
+ for (const [name, value] of Object.entries(headers)) {
223
+ flatHeaders[name] = [value].flat().join(", ");
224
+ }
225
+ return flatHeaders;
226
+ }
227
+ function getRedirectedRequest(request, status, url) {
228
+ const shouldSwitchToGet = status === HTTP_SEE_OTHER_STATUS || request.method === "POST" && (status === HTTP_MOVED_PERMANENTLY_STATUS || status === HTTP_FOUND_STATUS);
229
+ if (!shouldSwitchToGet) {
230
+ return { ...request, url };
231
+ }
232
+ return {
233
+ abortSignal: request.abortSignal,
234
+ body: void 0,
235
+ headers: Object.fromEntries(Object.entries(request.headers).filter(([name]) => !BODY_HEADERS.has(name.toLowerCase()))),
236
+ method: "GET",
237
+ url
238
+ };
239
+ }
240
+ async function sendRequest(params) {
241
+ const request = params.url.startsWith("https:") ? import_node_https.request : import_node_http.request;
242
+ return await new Promise((resolve, reject) => {
243
+ const clientRequest = request(params.url, {
244
+ headers: { ...params.headers },
245
+ method: params.method,
246
+ signal: params.abortSignal
247
+ }, resolve);
248
+ clientRequest.on("error", (error) => {
249
+ reject(params.abortSignal.aborted ? params.abortSignal.reason : error);
250
+ });
251
+ clientRequest.end(typeof params.body === "string" ? params.body : params.body && new Uint8Array(params.body));
252
+ });
253
+ }
254
+ // Annotate the CommonJS export names for ESM import in node:
255
+ 0 && (module.exports = {
256
+ openDesktopRequestUrlStream
257
+ });
258
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZXNrdG9wLXJlcXVlc3QtdXJsLXN0cmVhbS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGRlc2t0b3AgYXJtIG9mIHtAbGluayAuL3JlcXVlc3QtdXJsLnRzIHwgcmVxdWVzdFVybFN0cmVhbX06IHJlcXVlc3RzIGEgVVJMIHRocm91Z2ggYG5vZGU6aHR0cGAgL1xuICogYG5vZGU6aHR0cHNgLCBzbyB0aGUgcmVzcG9uc2UgYm9keSBzdHJlYW1zIGFzIGl0IGFycml2ZXMgYW5kIGFuIGFib3J0IHJlYWxseSBjYW5jZWxzIHRoZSByZXF1ZXN0LlxuICpcbiAqIERlc2t0b3Agb25seTogaXQgcmVhZHMgYG5vZGU6aHR0cGAgYW5kIGBub2RlOmh0dHBzYC4gUmVhY2ggaXQgdGhyb3VnaCBgcmVxdWVzdFVybFN0cmVhbWAsIHdoaWNoIGltcG9ydHMgaXRcbiAqIGR5bmFtaWNhbGx5IG9uIGRlc2t0b3AuXG4gKlxuICogVW5saWtlIENocm9taXVtJ3MgbmV0d29yayBzdGFjaywgTm9kZSBkb2VzIG5vdCByZWFkIHRoZSBzeXN0ZW0gcHJveHkgc2V0dGluZ3Mgb3IgY2VydGlmaWNhdGUgc3RvcmUsIHNvIGEgbWFjaGluZVxuICogdGhhdCByZWFjaGVzIHRoZSBpbnRlcm5ldCBvbmx5IHRocm91Z2ggYSBwcm94eSwgb3IgdGhhdCBpbnRlcmNlcHRzIFRMUyB3aXRoIGl0cyBvd24gcm9vdCBjZXJ0aWZpY2F0ZSwgbmVlZHMgdGhlXG4gKiBidWZmZXJlZCBgcmVxdWVzdFVybEV4YCBpbnN0ZWFkLlxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBSZWFkYWJsZVN0cmVhbSBpcyB0aGUgT2JzaWRpYW4gcmVuZGVyZXIncyBXZWIgQVBJLCBub3QgYSBOb2RlIGJ1aWx0aW4uICovXG5cbmltcG9ydCB0eXBlIHtcbiAgSW5jb21pbmdIdHRwSGVhZGVycyxcbiAgSW5jb21pbmdNZXNzYWdlXG59IGZyb20gJ25vZGU6aHR0cCc7XG5cbmltcG9ydCB7IG9uQWJvcnQgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYWJvcnQtY29udHJvbGxlcic7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyByZXF1ZXN0IGFzIHJlcXVlc3RIdHRwIH0gZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHJlcXVlc3QgYXMgcmVxdWVzdEh0dHBzIH0gZnJvbSAnbm9kZTpodHRwcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgRW5jb2RlZFJlcXVlc3RVcmxSZXF1ZXN0LFxuICBSZXF1ZXN0VXJsU3RyZWFtUmVzcG9uc2Vcbn0gZnJvbSAnLi9yZXF1ZXN0LXVybC50cyc7XG5cbmNvbnN0IE1BWF9SRURJUkVDVF9DT1VOVCA9IDIwO1xuY29uc3QgSFRUUF9NT1ZFRF9QRVJNQU5FTlRMWV9TVEFUVVMgPSAzMDE7XG5jb25zdCBIVFRQX0ZPVU5EX1NUQVRVUyA9IDMwMjtcbmNvbnN0IEhUVFBfU0VFX09USEVSX1NUQVRVUyA9IDMwMztcbmNvbnN0IEhUVFBfVEVNUE9SQVJZX1JFRElSRUNUX1NUQVRVUyA9IDMwNztcbmNvbnN0IEhUVFBfUEVSTUFORU5UX1JFRElSRUNUX1NUQVRVUyA9IDMwODtcbmNvbnN0IFJFRElSRUNUX1NUQVRVU0VTID0gbmV3IFNldChbXG4gIEhUVFBfRk9VTkRfU1RBVFVTLFxuICBIVFRQX01PVkVEX1BFUk1BTkVOVExZX1NUQVRVUyxcbiAgSFRUUF9QRVJNQU5FTlRfUkVESVJFQ1RfU1RBVFVTLFxuICBIVFRQX1NFRV9PVEhFUl9TVEFUVVMsXG4gIEhUVFBfVEVNUE9SQVJZX1JFRElSRUNUX1NUQVRVU1xuXSk7XG5jb25zdCBCT0RZX0hFQURFUlMgPSBuZXcgU2V0KFsnY29udGVudC1sZW5ndGgnLCAnY29udGVudC10eXBlJ10pO1xuXG5pbnRlcmZhY2UgU2VuZFJlcXVlc3RQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGJvZHk6IEFycmF5QnVmZmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBoZWFkZXJzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcXVlc3RzIGEgVVJMIHRocm91Z2ggYG5vZGU6aHR0cGAgLyBgbm9kZTpodHRwc2AgYW5kIHJldHVybnMgaXRzIGJvZHkgYXMgYSBzdHJlYW0sIGZvbGxvd2luZyByZWRpcmVjdHMuXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgLSBUaGUgZW5jb2RlZCByZXF1ZXN0LlxuICogQHJldHVybnMgVGhlIHJlc3BvbnNlLCB3aXRoIGEgc3RyZWFtZWQgYm9keS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5EZXNrdG9wUmVxdWVzdFVybFN0cmVhbShyZXF1ZXN0OiBFbmNvZGVkUmVxdWVzdFVybFJlcXVlc3QpOiBQcm9taXNlPFJlcXVlc3RVcmxTdHJlYW1SZXNwb25zZT4ge1xuICBsZXQgY3VycmVudFJlcXVlc3Q6IFNlbmRSZXF1ZXN0UGFyYW1zID0ge1xuICAgIGFib3J0U2lnbmFsOiByZXF1ZXN0LmFib3J0U2lnbmFsLFxuICAgIGJvZHk6IHJlcXVlc3QuYm9keSxcbiAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICB1cmw6IHJlcXVlc3QudXJsXG4gIH07XG5cbiAgZm9yIChsZXQgcmVkaXJlY3RDb3VudCA9IDA7OyByZWRpcmVjdENvdW50KyspIHtcbiAgICBjb25zdCBpbmNvbWluZ01lc3NhZ2UgPSBhd2FpdCBzZW5kUmVxdWVzdChjdXJyZW50UmVxdWVzdCk7XG4gICAgLy8gQSByZXNwb25zZSB0byBhIGNsaWVudCByZXF1ZXN0IGFsd2F5cyBjYXJyaWVzIGl0cyBzdGF0dXMgY29kZS5cbiAgICBjb25zdCBzdGF0dXMgPSBlbnN1cmVOb25OdWxsYWJsZShpbmNvbWluZ01lc3NhZ2Uuc3RhdHVzQ29kZSk7XG4gICAgY29uc3QgbG9jYXRpb24gPSBpbmNvbWluZ01lc3NhZ2UuaGVhZGVycy5sb2NhdGlvbjtcbiAgICBpZiAoIVJFRElSRUNUX1NUQVRVU0VTLmhhcyhzdGF0dXMpIHx8IGxvY2F0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJvZHk6IGNyZWF0ZUluY29taW5nTWVzc2FnZVN0cmVhbShpbmNvbWluZ01lc3NhZ2UsIHJlcXVlc3QuYWJvcnRTaWduYWwpLFxuICAgICAgICBoZWFkZXJzOiBmbGF0dGVuSGVhZGVycyhpbmNvbWluZ01lc3NhZ2UuaGVhZGVycyksXG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgdXJsOiBjdXJyZW50UmVxdWVzdC51cmxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaW5jb21pbmdNZXNzYWdlLnJlc3VtZSgpO1xuICAgIGlmIChyZWRpcmVjdENvdW50ID49IE1BWF9SRURJUkVDVF9DT1VOVCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVG9vIG1hbnkgcmVkaXJlY3RzIHJlcXVlc3RpbmcgJHtyZXF1ZXN0LnVybH1gKTtcbiAgICB9XG4gICAgY29uc3QgbmV4dFVybCA9IG5ldyBVUkwobG9jYXRpb24sIGN1cnJlbnRSZXF1ZXN0LnVybCk7XG4gICAgaWYgKG5leHRVcmwucHJvdG9jb2wgIT09ICdodHRwOicgJiYgbmV4dFVybC5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFVuc3VwcG9ydGVkIHByb3RvY29sICR7bmV4dFVybC5wcm90b2NvbH0gaW4gdGhlIHJlZGlyZWN0IHRvICR7bmV4dFVybC5ocmVmfWApO1xuICAgIH1cbiAgICBjdXJyZW50UmVxdWVzdCA9IGdldFJlZGlyZWN0ZWRSZXF1ZXN0KGN1cnJlbnRSZXF1ZXN0LCBzdGF0dXMsIG5leHRVcmwuaHJlZik7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlSW5jb21pbmdNZXNzYWdlU3RyZWFtKGluY29taW5nTWVzc2FnZTogSW5jb21pbmdNZXNzYWdlLCBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpOiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB7XG4gIGxldCBpc1NldHRsZWQgPSBmYWxzZTtcbiAgLy8gQXNzaWduZWQgaW4gYHN0YXJ0YCwgd2hpY2ggcnVucyBpbnNpZGUgdGhlIGNvbnN0cnVjdG9yLCBzbyBpdCBpcyBpbiBwbGFjZSBiZWZvcmUgYGNhbmNlbGAgY2FuIHJ1bi5cbiAgbGV0IGFib3J0TGlzdGVuZXI6IERpc3Bvc2FibGU7XG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4oe1xuICAgIGNhbmNlbCgpOiB2b2lkIHtcbiAgICAgIGlzU2V0dGxlZCA9IHRydWU7XG4gICAgICBhYm9ydExpc3RlbmVyW1N5bWJvbC5kaXNwb3NlXSgpO1xuICAgICAgaW5jb21pbmdNZXNzYWdlLmRlc3Ryb3koKTtcbiAgICB9LFxuICAgIHB1bGwoKTogdm9pZCB7XG4gICAgICBpbmNvbWluZ01lc3NhZ2UucmVzdW1lKCk7XG4gICAgfSxcbiAgICBzdGFydChjb250cm9sbGVyKTogdm9pZCB7XG4gICAgICBmdW5jdGlvbiBzZXR0bGUoZXJyb3I/OiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGlmIChpc1NldHRsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaXNTZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKGVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaW5jb21pbmdNZXNzYWdlLm9uKCdkYXRhJywgKGNodW5rOiBCdWZmZXIpID0+IHtcbiAgICAgICAgLy8gQSBjb3B5LCBzbyB0aGUgY2h1bmsgYmVsb25ncyB0byB0aGUgcmVuZGVyZXIncyByZWFsbSB3aGF0ZXZlciBOb2RlIGRvZXMgd2l0aCBpdHMgYnVmZmVyIGFmdGVyd2FyZHMuXG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShuZXcgVWludDhBcnJheShjaHVuaykpO1xuICAgICAgICBpZiAoTnVtYmVyKGNvbnRyb2xsZXIuZGVzaXJlZFNpemUpIDw9IDApIHtcbiAgICAgICAgICBpbmNvbWluZ01lc3NhZ2UucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpbmNvbWluZ01lc3NhZ2Uub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgYWJvcnRMaXN0ZW5lcltTeW1ib2wuZGlzcG9zZV0oKTtcbiAgICAgICAgc2V0dGxlKCk7XG4gICAgICB9KTtcbiAgICAgIGluY29taW5nTWVzc2FnZS5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgYWJvcnRMaXN0ZW5lcltTeW1ib2wuZGlzcG9zZV0oKTtcbiAgICAgICAgc2V0dGxlKGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgYWJvcnRMaXN0ZW5lciA9IG9uQWJvcnQoYWJvcnRTaWduYWwsICgpID0+IHtcbiAgICAgICAgc2V0dGxlKGFib3J0U2lnbmFsLnJlYXNvbik7XG4gICAgICAgIC8vIFRoZSBgZXJyb3JgIGV2ZW50IHRoaXMgcmFpc2VzIGZpbmRzIHRoZSBzdHJlYW0gc2V0dGxlZCBhbHJlYWR5LlxuICAgICAgICBpbmNvbWluZ01lc3NhZ2UuZGVzdHJveShhYm9ydFNpZ25hbC5yZWFzb24gYXMgRXJyb3IpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGZsYXR0ZW5IZWFkZXJzKGhlYWRlcnM6IEluY29taW5nSHR0cEhlYWRlcnMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgZmxhdEhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgLy8gTm9kZSBqb2lucyBldmVyeSByZXBlYXRlZCBoZWFkZXIgYnV0IGBzZXQtY29va2llYCwgd2hpY2ggYXJyaXZlcyBhcyBhbiBhcnJheS5cbiAgICBmbGF0SGVhZGVyc1tuYW1lXSA9IFt2YWx1ZV0uZmxhdCgpLmpvaW4oJywgJyk7XG4gIH1cbiAgcmV0dXJuIGZsYXRIZWFkZXJzO1xufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVxdWVzdChyZXF1ZXN0OiBTZW5kUmVxdWVzdFBhcmFtcywgc3RhdHVzOiBudW1iZXIsIHVybDogc3RyaW5nKTogU2VuZFJlcXVlc3RQYXJhbXMge1xuICAvLyBXaGF0IGBmZXRjaGAgZG9lczogYSAzMDMsIGFuZCBhIDMwMSBvciAzMDIgYW5zd2VyaW5nIGEgUE9TVCwgYmVjb21lIGEgR0VUIHdpdGhvdXQgYSBib2R5LlxuICBjb25zdCBzaG91bGRTd2l0Y2hUb0dldCA9IHN0YXR1cyA9PT0gSFRUUF9TRUVfT1RIRVJfU1RBVFVTXG4gICAgfHwgKHJlcXVlc3QubWV0aG9kID09PSAnUE9TVCcgJiYgKHN0YXR1cyA9PT0gSFRUUF9NT1ZFRF9QRVJNQU5FTlRMWV9TVEFUVVMgfHwgc3RhdHVzID09PSBIVFRQX0ZPVU5EX1NUQVRVUykpO1xuICBpZiAoIXNob3VsZFN3aXRjaFRvR2V0KSB7XG4gICAgcmV0dXJuIHsgLi4ucmVxdWVzdCwgdXJsIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhYm9ydFNpZ25hbDogcmVxdWVzdC5hYm9ydFNpZ25hbCxcbiAgICBib2R5OiB1bmRlZmluZWQsXG4gICAgaGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHJlcXVlc3QuaGVhZGVycykuZmlsdGVyKChbbmFtZV0pID0+ICFCT0RZX0hFQURFUlMuaGFzKG5hbWUudG9Mb3dlckNhc2UoKSkpKSxcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIHVybFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZW5kUmVxdWVzdChwYXJhbXM6IFNlbmRSZXF1ZXN0UGFyYW1zKTogUHJvbWlzZTxJbmNvbWluZ01lc3NhZ2U+IHtcbiAgY29uc3QgcmVxdWVzdCA9IHBhcmFtcy51cmwuc3RhcnRzV2l0aCgnaHR0cHM6JykgPyByZXF1ZXN0SHR0cHMgOiByZXF1ZXN0SHR0cDtcbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBjbGllbnRSZXF1ZXN0ID0gcmVxdWVzdChwYXJhbXMudXJsLCB7XG4gICAgICBoZWFkZXJzOiB7IC4uLnBhcmFtcy5oZWFkZXJzIH0sXG4gICAgICBtZXRob2Q6IHBhcmFtcy5tZXRob2QsXG4gICAgICBzaWduYWw6IHBhcmFtcy5hYm9ydFNpZ25hbFxuICAgIH0sIHJlc29sdmUpO1xuICAgIGNsaWVudFJlcXVlc3Qub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICByZWplY3QocGFyYW1zLmFib3J0U2lnbmFsLmFib3J0ZWQgPyBwYXJhbXMuYWJvcnRTaWduYWwucmVhc29uIGFzIEVycm9yIDogZXJyb3IpO1xuICAgIH0pO1xuICAgIGNsaWVudFJlcXVlc3QuZW5kKHR5cGVvZiBwYXJhbXMuYm9keSA9PT0gJ3N0cmluZycgPyBwYXJhbXMuYm9keSA6IHBhcmFtcy5ib2R5ICYmIG5ldyBVaW50OEFycmF5KHBhcmFtcy5ib2R5KSk7XG4gIH0pO1xufVxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gUmVhZGFibGVTdHJlYW0gaXMgdGhlIE9ic2lkaWFuIHJlbmRlcmVyJ3MgV2ViIEFQSSwgbm90IGEgTm9kZSBidWlsdGluLiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7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QU87QUFBQSxNQUNULENBQUM7QUFDRCxzQkFBZ0IsR0FBRyxTQUFTLENBQUMsVUFBVTtBQUNyQyxzQkFBYyxPQUFPLE9BQU8sRUFBRTtBQUM5QixlQUFPLEtBQUs7QUFBQSxNQUNkLENBQUM7QUFDRCwwQkFBZ0IsaUNBQVEsYUFBYSxNQUFNO0FBQ3pDLGVBQU8sWUFBWSxNQUFNO0FBRXpCLHdCQUFnQixRQUFRLFlBQVksTUFBZTtBQUFBLE1BQ3JELENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFDQSxTQUFTLGVBQWUsU0FBc0Q7QUFDNUUsUUFBTSxjQUFzQyxDQUFDO0FBQzdDLGFBQVcsQ0FBQyxNQUFNLEtBQUssS0FBSyxPQUFPLFFBQVEsT0FBTyxHQUFHO0FBRW5ELGdCQUFZLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxJQUFJO0FBQUEsRUFDOUM7QUFDQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLHFCQUFxQixTQUE0QixRQUFnQixLQUFnQztBQUV4RyxRQUFNLG9CQUFvQixXQUFXLHlCQUMvQixRQUFRLFdBQVcsV0FBVyxXQUFXLGlDQUFpQyxXQUFXO0FBQzNGLE1BQUksQ0FBQyxtQkFBbUI7QUFDdEIsV0FBTyxFQUFFLEdBQUcsU0FBUyxJQUFJO0FBQUEsRUFDM0I7QUFDQSxTQUFPO0FBQUEsSUFDTCxhQUFhLFFBQVE7QUFBQSxJQUNyQixNQUFNO0FBQUEsSUFDTixTQUFTLE9BQU8sWUFBWSxPQUFPLFFBQVEsUUFBUSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsYUFBYSxJQUFJLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQztBQUFBLElBQ3JILFFBQVE7QUFBQSxJQUNSO0FBQUEsRUFDRjtBQUNGO0FBRUEsZUFBZSxZQUFZLFFBQXFEO0FBQzlFLFFBQU0sVUFBVSxPQUFPLElBQUksV0FBVyxRQUFRLElBQUksa0JBQUFBLFVBQWUsaUJBQUFDO0FBQ2pFLFNBQU8sTUFBTSxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDNUMsVUFBTSxnQkFBZ0IsUUFBUSxPQUFPLEtBQUs7QUFBQSxNQUN4QyxTQUFTLEVBQUUsR0FBRyxPQUFPLFFBQVE7QUFBQSxNQUM3QixRQUFRLE9BQU87QUFBQSxNQUNmLFFBQVEsT0FBTztBQUFBLElBQ2pCLEdBQUcsT0FBTztBQUNWLGtCQUFjLEdBQUcsU0FBUyxDQUFDLFVBQVU7QUFDbkMsYUFBTyxPQUFPLFlBQVksVUFBVSxPQUFPLFlBQVksU0FBa0IsS0FBSztBQUFBLElBQ2hGLENBQUM7QUFDRCxrQkFBYyxJQUFJLE9BQU8sT0FBTyxTQUFTLFdBQVcsT0FBTyxPQUFPLE9BQU8sUUFBUSxJQUFJLFdBQVcsT0FBTyxJQUFJLENBQUM7QUFBQSxFQUM5RyxDQUFDO0FBQ0g7IiwibmFtZXMiOlsicmVxdWVzdEh0dHBzIiwicmVxdWVzdEh0dHAiXX0=
@@ -0,0 +1,22 @@
1
+ /// <reference path="./library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The desktop arm of {@link ./request-url.ts | requestUrlStream}: requests a URL through `node:http` /
6
+ * `node:https`, so the response body streams as it arrives and an abort really cancels the request.
7
+ *
8
+ * Desktop only: it reads `node:http` and `node:https`. Reach it through `requestUrlStream`, which imports it
9
+ * dynamically on desktop.
10
+ *
11
+ * Unlike Chromium's network stack, Node does not read the system proxy settings or certificate store, so a machine
12
+ * that reaches the internet only through a proxy, or that intercepts TLS with its own root certificate, needs the
13
+ * buffered `requestUrlEx` instead.
14
+ */
15
+ import type { EncodedRequestUrlRequest, RequestUrlStreamResponse } from './request-url.cjs';
16
+ /**
17
+ * Requests a URL through `node:http` / `node:https` and returns its body as a stream, following redirects.
18
+ *
19
+ * @param request - The encoded request.
20
+ * @returns The response, with a streamed body.
21
+ */
22
+ export declare function openDesktopRequestUrlStream(request: EncodedRequestUrlRequest): Promise<RequestUrlStreamResponse>;