@workflow/core 5.0.0-beta.36 → 5.0.0-beta.37

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 (112) hide show
  1. package/dist/capabilities.d.ts +6 -0
  2. package/dist/capabilities.d.ts.map +1 -1
  3. package/dist/capabilities.js +13 -1
  4. package/dist/encryption.d.ts +15 -2
  5. package/dist/encryption.d.ts.map +1 -1
  6. package/dist/encryption.js +28 -7
  7. package/dist/flushable-stream.d.ts +26 -0
  8. package/dist/flushable-stream.d.ts.map +1 -1
  9. package/dist/flushable-stream.js +63 -187
  10. package/dist/index.d.ts +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -2
  13. package/dist/log-format.js +3 -3
  14. package/dist/private.d.ts +76 -33
  15. package/dist/private.d.ts.map +1 -1
  16. package/dist/private.js +149 -22
  17. package/dist/replay-payload-cache.d.ts +3 -2
  18. package/dist/replay-payload-cache.d.ts.map +1 -1
  19. package/dist/replay-payload-cache.js +8 -2
  20. package/dist/runtime/count-step-started-events.d.ts +52 -0
  21. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  22. package/dist/runtime/count-step-started-events.js +72 -0
  23. package/dist/runtime/helpers.d.ts +41 -12
  24. package/dist/runtime/helpers.d.ts.map +1 -1
  25. package/dist/runtime/helpers.js +75 -22
  26. package/dist/runtime/resume-hook.d.ts +2 -2
  27. package/dist/runtime/resume-hook.d.ts.map +1 -1
  28. package/dist/runtime/resume-hook.js +174 -55
  29. package/dist/runtime/run.d.ts.map +1 -1
  30. package/dist/runtime/run.js +3 -3
  31. package/dist/runtime/runs.d.ts.map +1 -1
  32. package/dist/runtime/runs.js +5 -3
  33. package/dist/runtime/start.d.ts.map +1 -1
  34. package/dist/runtime/start.js +65 -18
  35. package/dist/runtime/step-executor.d.ts +9 -8
  36. package/dist/runtime/step-executor.d.ts.map +1 -1
  37. package/dist/runtime/step-executor.js +17 -17
  38. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  39. package/dist/runtime/suspension-handler.js +2 -3
  40. package/dist/runtime/world.d.ts +2 -7
  41. package/dist/runtime/world.d.ts.map +1 -1
  42. package/dist/runtime/world.js +3 -10
  43. package/dist/runtime.d.ts +1 -1
  44. package/dist/runtime.d.ts.map +1 -1
  45. package/dist/runtime.js +74 -122
  46. package/dist/sealed-box.d.ts +167 -0
  47. package/dist/sealed-box.d.ts.map +1 -0
  48. package/dist/sealed-box.js +571 -0
  49. package/dist/serialization/client.d.ts +3 -3
  50. package/dist/serialization/client.d.ts.map +1 -1
  51. package/dist/serialization/client.js +1 -1
  52. package/dist/serialization/codec.d.ts +6 -4
  53. package/dist/serialization/codec.d.ts.map +1 -1
  54. package/dist/serialization/codec.js +1 -1
  55. package/dist/serialization/encryption.d.ts +118 -17
  56. package/dist/serialization/encryption.d.ts.map +1 -1
  57. package/dist/serialization/encryption.js +131 -15
  58. package/dist/serialization/step.d.ts +4 -4
  59. package/dist/serialization/step.d.ts.map +1 -1
  60. package/dist/serialization/step.js +2 -2
  61. package/dist/serialization/types.d.ts +20 -0
  62. package/dist/serialization/types.d.ts.map +1 -1
  63. package/dist/serialization/types.js +11 -1
  64. package/dist/serialization-format.d.ts +44 -4
  65. package/dist/serialization-format.d.ts.map +1 -1
  66. package/dist/serialization-format.js +66 -9
  67. package/dist/serialization.d.ts +21 -21
  68. package/dist/serialization.d.ts.map +1 -1
  69. package/dist/serialization.js +496 -174
  70. package/dist/set-attributes.d.ts +2 -7
  71. package/dist/set-attributes.d.ts.map +1 -1
  72. package/dist/set-attributes.js +1 -6
  73. package/dist/step/context-storage.d.ts +2 -2
  74. package/dist/step/context-storage.d.ts.map +1 -1
  75. package/dist/step/context-storage.js +2 -2
  76. package/dist/step/writable-stream.d.ts.map +1 -1
  77. package/dist/step/writable-stream.js +14 -3
  78. package/dist/step.d.ts.map +1 -1
  79. package/dist/step.js +79 -8
  80. package/dist/symbols.d.ts +23 -10
  81. package/dist/symbols.d.ts.map +1 -1
  82. package/dist/symbols.js +24 -11
  83. package/dist/telemetry/semantic-conventions.d.ts +4 -4
  84. package/dist/telemetry/semantic-conventions.js +2 -2
  85. package/dist/version.d.ts +1 -1
  86. package/dist/version.js +2 -2
  87. package/dist/vm/index.d.ts.map +1 -1
  88. package/dist/vm/index.js +76 -9
  89. package/dist/workflow/abort-controller.d.ts +1 -1
  90. package/dist/workflow/abort-controller.d.ts.map +1 -1
  91. package/dist/workflow/abort-controller.js +36 -2
  92. package/dist/workflow/hook.d.ts.map +1 -1
  93. package/dist/workflow/hook.js +64 -24
  94. package/dist/workflow/index.d.ts +1 -1
  95. package/dist/workflow/index.d.ts.map +1 -1
  96. package/dist/workflow/index.js +2 -2
  97. package/dist/workflow/set-attributes.d.ts +0 -9
  98. package/dist/workflow/set-attributes.d.ts.map +1 -1
  99. package/dist/workflow/set-attributes.js +1 -6
  100. package/dist/workflow/sleep.d.ts.map +1 -1
  101. package/dist/workflow/sleep.js +21 -9
  102. package/dist/workflow.d.ts +2 -2
  103. package/dist/workflow.d.ts.map +1 -1
  104. package/dist/workflow.js +22 -83
  105. package/docs/api-reference/set-attributes.mdx +0 -4
  106. package/docs/how-it-works/cancellation.mdx +2 -2
  107. package/docs/how-it-works/code-transform.mdx +19 -15
  108. package/docs/how-it-works/framework-integrations.mdx +95 -341
  109. package/package.json +6 -6
  110. package/dist/runtime/step-handler.d.ts +0 -2
  111. package/dist/runtime/step-handler.d.ts.map +0 -1
  112. package/dist/runtime/step-handler.js +0 -839
@@ -1,5 +1,6 @@
1
1
  import { ReplayDivergenceError } from '@workflow/errors';
2
2
  import { EventConsumerResult } from '../events-consumer.js';
3
+ import { awaitEarlierDeliveries, registerDeliveryBarrier, } from '../private.js';
3
4
  import { hydrateStepReturnValue } from '../serialization.js';
4
5
  import { ABORT_HOOK_TOKEN, ABORT_STREAM_NAME } from '../symbols.js';
5
6
  import { getAbortStreamId } from '../util.js';
@@ -150,6 +151,28 @@ export function createCreateAbortController(ctx) {
150
151
  // dehydration, so `'reason' in payload` is false and reason
151
152
  // ends up undefined on replay.
152
153
  const rawPayload = event.eventData?.payload;
154
+ // An abort is a branch-deciding delivery: `_setAborted` fires the
155
+ // signal's listeners, and a listener is free to invoke a step and
156
+ // draw a ULID. So it registers in the delivery-barrier registry as a
157
+ // 'hook' — which is exactly what the event is — so that wait, hook
158
+ // and step deliveries order against it by event-log position rather
159
+ // than by whose hydration finished first. It is always ARMED: unlike
160
+ // a buffered user hook payload, nothing about its delivery waits on
161
+ // workflow code asking for it.
162
+ //
163
+ // Resolving straight off the queue slot was sufficient only while
164
+ // every other delivery also resolved from its slot. Step results no
165
+ // longer do (see step.ts), so an abort whose slot ran while a
166
+ // log-earlier step sat behind a barrier would overtake it — see
167
+ // `delivery-barrier-coverage.test.ts`.
168
+ //
169
+ // The deferral is captured HERE, at event-consumption time, for the
170
+ // same two reasons spelled out in step.ts: the set of earlier
171
+ // deliveries stays a function of log position alone, and barriers
172
+ // that retire before this slot runs are still seen.
173
+ const eventIndex = ctx.eventsConsumer.eventIndex;
174
+ const barrier = registerDeliveryBarrier(ctx, eventIndex, 'hook');
175
+ const earlierDelivered = awaitEarlierDeliveries(ctx, eventIndex, 'hook');
153
176
  // Account this abort as a pending delivery, exactly like step
154
177
  // results (step.ts) and hook payloads (workflow/hook.ts) do. The
155
178
  // suspension handler dehydrates queued step arguments only once
@@ -161,6 +184,11 @@ export function createCreateAbortController(ctx) {
161
184
  // (and a missing reason). Bumping the counter holds the suspension
162
185
  // until `_setAborted` has landed, so downstream serialization is
163
186
  // deterministic regardless of reason-hydration (decryption) latency.
187
+ //
188
+ // It is released inside the slot, before the detached deferral, so
189
+ // `scheduleWhenIdle` can still reach idle and retire the barriers
190
+ // that deferral may be waiting on — the same shape as the hook and
191
+ // step paths.
164
192
  ctx.pendingDeliveries++;
165
193
  ctx.promiseQueue = ctx.promiseQueue.then(async () => {
166
194
  let reason;
@@ -182,11 +210,17 @@ export function createCreateAbortController(ctx) {
182
210
  // fallback (DOMException AbortError).
183
211
  }
184
212
  }
185
- this.signal._setAborted(reason);
186
213
  }
187
214
  finally {
188
215
  ctx.pendingDeliveries--;
189
216
  }
217
+ // Detached, like the other deliveries: `awaitEarlierDeliveries`
218
+ // may be waiting on a delivery this very queue drives, and
219
+ // blocking a slot on that would deadlock the queue.
220
+ void earlierDelivered.then(() => {
221
+ barrier.markDelivered();
222
+ this.signal._setAborted(reason);
223
+ });
190
224
  });
191
225
  ctx.invocationsQueue.delete(correlationId);
192
226
  // Multiple handlers can observe the same pending abort request and
@@ -275,4 +309,4 @@ export function createAbortSignalStatics() {
275
309
  },
276
310
  };
277
311
  }
278
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJvcnQtY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JrZmxvdy9hYm9ydC1jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFOUM7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixNQUFNLEdBQVksU0FBUyxDQUFDO0lBRW5CLENBQUMsaUJBQWlCLENBQUMsQ0FBUztJQUM1QixDQUFDLGdCQUFnQixDQUFDLENBQVM7SUFFcEMsVUFBVSxHQUFzQixFQUFFLENBQUM7SUFDbkMsUUFBUSxHQUFpRCxJQUFJLENBQUM7SUFFOUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxPQUFxRDtRQUMvRCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQVksVUFBa0IsRUFBRSxTQUFpQjtRQUMvQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcs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ZXJnZW5jZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBFdmVudENvbnN1bWVyUmVzdWx0IH0gZnJvbSAnLi4vZXZlbnRzLWNvbnN1bWVyLmpzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0IH0gZnJvbSAnLi4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQgeyBoeWRyYXRlU3RlcFJldHVyblZhbHVlIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBBQk9SVF9IT09LX1RPS0VOLCBBQk9SVF9TVFJFQU1fTkFNRSB9IGZyb20gJy4uL3N5bWJvbHMuanMnO1xuaW1wb3J0IHsgZ2V0QWJvcnRTdHJlYW1JZCB9IGZyb20gJy4uL3V0aWwuanMnO1xuXG4vKipcbiAqIEEgbGlnaHR3ZWlnaHQgQWJvcnRTaWduYWwgaW1wbGVtZW50YXRpb24gZm9yIHRoZSB3b3JrZmxvdyBWTSBjb250ZXh0LlxuICpcbiAqIGBzaWduYWwuYWJvcnRlZGAgYW5kIGxpc3RlbmVycyBhcmUgdXBkYXRlZCBpbiB0d28gc2NlbmFyaW9zOlxuICogMS4gT24gZmlyc3QtcnVuOiB3aGVuIGBhYm9ydCgpYCBpcyBjYWxsZWQgaW4gdGhlIHdvcmtmbG93IGNvZGVcbiAqIDIuIE9uIHJlcGxheTogd2hlbiB0aGUgZXZlbnRzIGNvbnN1bWVyIHByb2Nlc3NlcyB0aGUgYGhvb2tfcmVjZWl2ZWRgXG4gKiAgICBldmVudCAoY2hhaW5lZCB0aHJvdWdoIHByb21pc2VRdWV1ZSBmb3IgZGV0ZXJtaW5pc3RpYyBvcmRlcmluZylcbiAqXG4gKiBPbiByZXBsYXksIGBhYm9ydCgpYCBpbiB0aGUgd29ya2Zsb3cgY29kZSBiZWNvbWVzIGEgbm8tb3Agc2luY2VcbiAqIGBfc2V0QWJvcnRlZGAgd2FzIGFscmVhZHkgY2FsbGVkIGJ5IHRoZSBldmVudHMgY29uc3VtZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0Fib3J0U2lnbmFsIHtcbiAgYWJvcnRlZCA9IGZhbHNlO1xuICByZWFzb246IHVua25vd24gPSB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgW0FCT1JUX1NUUkVBTV9OQU1FXTogc3RyaW5nO1xuICByZWFkb25seSBbQUJPUlRfSE9PS19UT0tFTl06IHN0cmluZztcblxuICAjbGlzdGVuZXJzOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuICAjb25hYm9ydDogKCh0aGlzOiBXb3JrZmxvd0Fib3J0U2lnbmFsKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIGdldCBvbmFib3J0KCk6ICgodGhpczogV29ya2Zsb3dBYm9ydFNpZ25hbCkgPT4gdm9pZCkgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy4jb25hYm9ydDtcbiAgfVxuXG4gIHNldCBvbmFib3J0KGhhbmRsZXI6ICgodGhpczogV29ya2Zsb3dBYm9ydFNpZ25hbCkgPT4gdm9pZCkgfCBudWxsKSB7XG4gICAgdGhpcy4jb25hYm9ydCA9IGhhbmRsZXI7XG4gICAgaWYgKGhhbmRsZXIgJiYgdGhpcy5hYm9ydGVkKSB7XG4gICAgICBoYW5kbGVyLmNhbGwodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3Ioc3RyZWFtTmFtZTogc3RyaW5nLCBob29rVG9rZW46IHN0cmluZykge1xuICAgIHRoaXNbQUJPUlRfU1RSRUFNX05BTUVdID0gc3RyZWFtTmFtZTtcbiAgICB0aGlzW0FCT1JUX0hPT0tfVE9LRU5dID0gaG9va1Rva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBTZXRzIGFib3J0ZWQgc3RhdGUgYW5kIGZpcmVzIGxpc3RlbmVycy5cbiAgICogQ2FsbGVkIGJ5IGFib3J0KCkgb24gZmlyc3QtcnVuLCBvciBieSB0aGUgZXZlbnRzIGNvbnN1bWVyIG9uIHJlcGxheS5cbiAgICogSWRlbXBvdGVudCDigJQgc2Vjb25kIGNhbGwgaXMgYSBuby1vcC5cbiAgICovXG4gIF9zZXRBYm9ydGVkKHJlYXNvbj86IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hYm9ydGVkKSByZXR1cm47XG4gICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlYXNvbiA9IHJlYXNvbjtcbiAgICBpZiAodGhpcy4jb25hYm9ydCkge1xuICAgICAgdGhpcy4jb25hYm9ydC5jYWxsKHRoaXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuI2xpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9XG4gICAgdGhpcy4jbGlzdGVuZXJzID0gW107XG4gIH1cblxuICBhZGRFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZywgbGlzdGVuZXI6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAodHlwZSAhPT0gJ2Fib3J0JykgcmV0dXJuO1xuICAgIGlmICh0aGlzLmFib3J0ZWQpIHtcbiAgICAgIC8vIEZpcmUgc3luY2hyb25vdXNseSwgbm90IG9uIGEgbWljcm90YXNrLiBOYXRpdmUgQWJvcnRTaWduYWwgZmlyZXMgb24gYVxuICAgICAgLy8gbWljcm90YXNrIHBlciBzcGVjLCBidXQgaW5zaWRlIHRoZSB3b3JrZmxvdyBWTSB3ZSBkZWxpYmVyYXRlbHkgZGl2ZXJnZVxuICAgICAgLy8gZm9yIGRldGVybWluaXN0aWMgcmVwbGF5OiBsaXN0ZW5lciBvcmRlcmluZyBtdXN0IGJlIHRpZWQgdG8gdGhlXG4gICAgICAvLyBvcmNoZXN0cmF0b3IncyBzeW5jIGV4ZWN1dGlvbiBwYXRoLCBub3QgdG8gbWljcm90YXNrIHNjaGVkdWxpbmcuXG4gICAgICBsaXN0ZW5lcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gIH1cblxuICByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZywgbGlzdGVuZXI6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAodHlwZSAhPT0gJ2Fib3J0JykgcmV0dXJuO1xuICAgIHRoaXMuI2xpc3RlbmVycyA9IHRoaXMuI2xpc3RlbmVycy5maWx0ZXIoKGwpID0+IGwgIT09IGxpc3RlbmVyKTtcbiAgfVxuXG4gIHRocm93SWZBYm9ydGVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFib3J0ZWQpIHtcbiAgICAgIHRocm93IChcbiAgICAgICAgdGhpcy5yZWFzb24gPz9cbiAgICAgICAgbmV3IERPTUV4Y2VwdGlvbignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB3b3JrZmxvdy1jb250ZXh0IGBBYm9ydENvbnRyb2xsZXJgIGNsYXNzIHRoYXQgdXNlcyBob29rcyBmb3JcbiAqIGR1cmFibGUgc3RhdGUgYW5kIHN0cmVhbXMgZm9yIHJlYWwtdGltZSBzdGVwIHByb3BhZ2F0aW9uLlxuICpcbiAqIEZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBgY3JlYXRlQ3JlYXRlSG9vaygpYCBpbiBgd29ya2Zsb3cvaG9vay50c2A6XG4gKiAtIFJlZ2lzdGVycyBhIGhvb2sgaW4gdGhlIGludm9jYXRpb25zIHF1ZXVlIG9uIGNvbnN0cnVjdGlvblxuICogLSBTdWJzY3JpYmVzIHRvIHRoZSBldmVudHMgY29uc3VtZXIgZm9yIGhvb2tfY3JlYXRlZC9ob29rX3JlY2VpdmVkIGV2ZW50c1xuICogLSBgYWJvcnQoKWAgY2FsbHMgYF9zZXRBYm9ydGVkYCArIG1hcmtzIHRoZSBob29rIGZvciByZXN1bXB0aW9uXG4gKiAtIFRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgcHJvY2Vzc2VzIHRoZSBhYm9ydCAoY3JlYXRlcyBldmVudCArIHdyaXRlcyBzdHJlYW0pXG4gKiAtIE9uIHJlcGxheSwgdGhlIGV2ZW50cyBjb25zdW1lciBjYWxscyBgX3NldEFib3J0ZWRgIHdoZW4gaG9va19yZWNlaXZlZFxuICogICBpcyBwcm9jZXNzZWQsIGFuZCBgYWJvcnQoKWAgaW4gdGhlIHdvcmtmbG93IGNvZGUgYmVjb21lcyBhIG5vLW9wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDcmVhdGVBYm9ydENvbnRyb2xsZXIoY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQpIHtcbiAgcmV0dXJuIGNsYXNzIFdvcmtmbG93QWJvcnRDb250cm9sbGVyIHtcbiAgICByZWFkb25seSBzaWduYWw6IFdvcmtmbG93QWJvcnRTaWduYWw7XG4gICAgcmVhZG9ubHkgW0FCT1JUX1NUUkVBTV9OQU1FXTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IFtBQk9SVF9IT09LX1RPS0VOXTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBjb25zdCBpZCA9IGN0eC5nZW5lcmF0ZVVsaWQoKTtcbiAgICAgIGNvbnN0IHN0cmVhbU5hbWUgPSBnZXRBYm9ydFN0cmVhbUlkKGlkKTtcbiAgICAgIGNvbnN0IGhvb2tUb2tlbiA9IGBhYnJ0XyR7aWR9YDtcblxuICAgICAgdGhpc1tBQk9SVF9TVFJFQU1fTkFNRV0gPSBzdHJlYW1OYW1lO1xuICAgICAgdGhpc1tBQk9SVF9IT09LX1RPS0VOXSA9IGhvb2tUb2tlbjtcbiAgICAgIHRoaXMuc2lnbmFsID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwoc3RyZWFtTmFtZSwgaG9va1Rva2VuKTtcblxuICAgICAgLy8gUmVnaXN0ZXIgYW4gaW50ZXJuYWwgc3lzdGVtIGhvb2sgaW4gdGhlIGludm9jYXRpb25zIHF1ZXVlLlxuICAgICAgLy8gaXNTeXN0ZW0gcHJldmVudHMgdG9rZW4gbmFtZXNwYWNlIGNvbmZsaWN0cyB3aXRoIHVzZXIgaG9va3MuXG4gICAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gYGhvb2tfJHtjdHguZ2VuZXJhdGVVbGlkKCl9YDtcbiAgICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLnNldChjb3JyZWxhdGlvbklkLCB7XG4gICAgICAgIHR5cGU6ICdob29rJyxcbiAgICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgICAgdG9rZW46IGhvb2tUb2tlbixcbiAgICAgICAgaXNXZWJob29rOiBmYWxzZSxcbiAgICAgICAgaXNTeXN0ZW06IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgLy8gU3Vic2NyaWJlIHRvIGV2ZW50cyBmb3IgdGhpcyBob29rJ3MgbGlmZWN5Y2xlXG4gICAgICBjdHguZXZlbnRzQ29uc3VtZXIuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuY29ycmVsYXRpb25JZCAhPT0gY29ycmVsYXRpb25JZCkge1xuICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnRUb2tlbiA9XG4gICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZXZlbnQgJiYgZXZlbnQuZXZlbnREYXRhICYmICd0b2tlbicgaW4gZXZlbnQuZXZlbnREYXRhXG4gICAgICAgICAgICA/IGV2ZW50LmV2ZW50RGF0YS50b2tlblxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGVvZiBldmVudFRva2VuID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgIGV2ZW50VG9rZW4gIT09IHRoaXNbQUJPUlRfSE9PS19UT0tFTl1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgICAgICAgIGBSZXBsYXkgZGl2ZXJnZW5jZTogYWJvcnQgaG9vayBldmVudCAke2V2ZW50LmV2ZW50VHlwZX0gZm9yICR7Y29ycmVsYXRpb25JZH0gYmVsb25ncyB0byB0b2tlbiBcIiR7ZXZlbnRUb2tlbn1cIiwgYnV0IHRoZSBjdXJyZW50IGFib3J0IGhvb2sgZXhwZWN0cyBcIiR7dGhpc1tBQk9SVF9IT09LX1RPS0VOXX1cImAsXG4gICAgICAgICAgICAgICAgeyBldmVudElkOiBldmVudC5ldmVudElkIH1cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgY29uc3QgcXVldWVJdGVtID0gY3R4Lmludm9jYXRpb25zUXVldWUuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIGlmIChxdWV1ZUl0ZW0gJiYgcXVldWVJdGVtLnR5cGUgPT09ICdob29rJykge1xuICAgICAgICAgICAgcXVldWVJdGVtLmhhc0NyZWF0ZWRFdmVudCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnKSB7XG4gICAgICAgICAgLy8gVGhlIGFib3J0IHdhcyByZWNvcmRlZCBpbiB0aGUgZXZlbnQgbG9nIChmcm9tIGEgcHJldmlvdXMgcnVuJ3NcbiAgICAgICAgICAvLyBhYm9ydCgpIGNhbGwsIG9yIGZyb20gYSBzdGVwL2V4dGVybmFsIGFib3J0KS4gVXBkYXRlIHNpZ25hbFxuICAgICAgICAgIC8vIHN0YXRlIGFuZCBmaXJlIGxpc3RlbmVycyBhdCB0aGlzIGRldGVybWluaXN0aWMgcG9pbnQgaW4gdGhlXG4gICAgICAgICAgLy8gcHJvbWlzZVF1ZXVlIOKAlCBzYW1lIG9yZGVyaW5nIGFzIGhvb2sgcGF5bG9hZCBkZWxpdmVyeS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoZSBwYXlsb2FkIGlzIHRoZSBkZWh5ZHJhdGVkIGZvcm0gd3JpdHRlbiBieSB0aGUgc3VzcGVuc2lvblxuICAgICAgICAgIC8vIGhhbmRsZXIgKGEgVWludDhBcnJheSwgcG9zc2libHkgZW5jcnlwdGVkKS4gSHlkcmF0ZSBpdCB2aWEgdGhlXG4gICAgICAgICAgLy8gc2FtZSBtYWNoaW5lcnkgYXMgcmVndWxhciBob29rIHBheWxvYWRzICh3b3JrZmxvdy9ob29rLnRzOjExNylcbiAgICAgICAgICAvLyBzbyB0aGUgcmVhc29uIHJvdW5kLXRyaXBzIHdpdGggZnVsbCB0eXBlIGZpZGVsaXR5LiBSZWFkaW5nIHRoZVxuICAgICAgICAgIC8vIHJhdyBwYXlsb2FkIGhlcmUgaXMgYSBidWcg4oCUIGl0J3Mgbm90IGEgcGxhaW4gb2JqZWN0IGFmdGVyXG4gICAgICAgICAgLy8gZGVoeWRyYXRpb24sIHNvIGAncmVhc29uJyBpbiBwYXlsb2FkYCBpcyBmYWxzZSBhbmQgcmVhc29uXG4gICAgICAgICAgLy8gZW5kcyB1cCB1bmRlZmluZWQgb24gcmVwbGF5LlxuICAgICAgICAgIGNvbnN0IHJhd1BheWxvYWQgPSBldmVudC5ldmVudERhdGE/LnBheWxvYWQ7XG4gICAgICAgICAgLy8gQWNjb3VudCB0aGlzIGFib3J0IGFzIGEgcGVuZGluZyBkZWxpdmVyeSwgZXhhY3RseSBsaWtlIHN0ZXBcbiAgICAgICAgICAvLyByZXN1bHRzIChzdGVwLnRzKSBhbmQgaG9vayBwYXlsb2FkcyAod29ya2Zsb3cvaG9vay50cykgZG8uIFRoZVxuICAgICAgICAgIC8vIHN1c3BlbnNpb24gaGFuZGxlciBkZWh5ZHJhdGVzIHF1ZXVlZCBzdGVwIGFyZ3VtZW50cyBvbmx5IG9uY2VcbiAgICAgICAgICAvLyBgc2NoZWR1bGVXaGVuSWRsZWAgb2JzZXJ2ZXMgYHBlbmRpbmdEZWxpdmVyaWVzID09PSAwYC4gV2l0aG91dFxuICAgICAgICAgIC8vIHRoaXMgY291bnRlciwgYSBzdGVwIGRpc3BhdGNoZWQgcmlnaHQgYWZ0ZXIgdGhlIGFib3J0IOKAlCBlLmcuIG9uZVxuICAgICAgICAgIC8vIHRoYXQgcmVjZWl2ZXMgYGNvbnRyb2xsZXIuc2lnbmFsYCDigJQgY2FuIGhhdmUgaXRzIGFyZ3VtZW50c1xuICAgICAgICAgIC8vIHNlcmlhbGl6ZWQgd2hpbGUgdGhlIGFib3J0IGlzIHN0aWxsIGluIGZsaWdodCBiZWhpbmRcbiAgICAgICAgICAvLyBgYXdhaXQgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZWAsIGNhcHR1cmluZyBgc2lnbmFsLmFib3J0ZWQgPT09IGZhbHNlYFxuICAgICAgICAgIC8vIChhbmQgYSBtaXNzaW5nIHJlYXNvbikuIEJ1bXBpbmcgdGhlIGNvdW50ZXIgaG9sZHMgdGhlIHN1c3BlbnNpb25cbiAgICAgICAgICAvLyB1bnRpbCBgX3NldEFib3J0ZWRgIGhhcyBsYW5kZWQsIHNvIGRvd25zdHJlYW0gc2VyaWFsaXphdGlvbiBpc1xuICAgICAgICAgIC8vIGRldGVybWluaXN0aWMgcmVnYXJkbGVzcyBvZiByZWFzb24taHlkcmF0aW9uIChkZWNyeXB0aW9uKSBsYXRlbmN5LlxuICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcysrO1xuICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlYXNvbjogdW5rbm93bjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmIChyYXdQYXlsb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcHJlcGFyZWQgPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjdHgucmVwbGF5UGF5bG9hZENhY2hlLnByZXBhcmVFdmVudFBheWxvYWQoXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAncGF5bG9hZCcsXG4gICAgICAgICAgICAgICAgICAgICAgcmF3UGF5bG9hZFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29uc3QgaHlkcmF0ZWQgPSAoYXdhaXQgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgcmF3UGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgY3R4LnJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBjdHguZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgY3R4Lmdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZFxuICAgICAgICAgICAgICAgICAgKSkgYXMgeyByZWFzb24/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGh5ZHJhdGVkICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBoeWRyYXRlZCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAgICAgJ3JlYXNvbicgaW4gaHlkcmF0ZWRcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZWFzb24gPSBoeWRyYXRlZC5yZWFzb247XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAvLyBCZXN0LWVmZm9ydDogaWYgaHlkcmF0aW9uIGZhaWxzLCBmYWxsIGJhY2sgdG8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAvLyByZWFzb24uIFRoZSBzaWduYWwgc3RpbGwgYWJvcnRzOyB0aGUgdXNlciBqdXN0IHdvbid0IHNlZVxuICAgICAgICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIHJlYXNvbi4gTWF0Y2hlcyBXb3JrZmxvd0Fib3J0U2lnbmFsJ3Mgc3BlY1xuICAgICAgICAgICAgICAgICAgLy8gZmFsbGJhY2sgKERPTUV4Y2VwdGlvbiBBYm9ydEVycm9yKS5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5zaWduYWwuX3NldEFib3J0ZWQocmVhc29uKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcy0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY3R4Lmludm9jYXRpb25zUXVldWUuZGVsZXRlKGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIC8vIE11bHRpcGxlIGhhbmRsZXJzIGNhbiBvYnNlcnZlIHRoZSBzYW1lIHBlbmRpbmcgYWJvcnQgcmVxdWVzdCBhbmRcbiAgICAgICAgICAvLyBkdXJhYmx5IHJlY29yZCBpdCBiZWZvcmUgcmVwbGF5IHJlbW92ZXMgdGhlIHF1ZXVlIGl0ZW0uIEFib3J0IGlzXG4gICAgICAgICAgLy8gaWRlbXBvdGVudCwgc28gY29uc3VtZSBsYXRlciBtYXRjaGluZyByZWNlaXB0cyBhcyBuby1vcHMgaW5zdGVhZFxuICAgICAgICAgIC8vIG9mIHN1cmZhY2luZyBhIGNvcnJ1cHRlZCBldmVudCBsb2cgYWZ0ZXIgdGhlIGZpcnN0IHJlY2VpcHQuXG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19kaXNwb3NlZCcpIHtcbiAgICAgICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5kZWxldGUoY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGFib3J0KHJlYXNvbj86IHVua25vd24pOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47IC8vIG5vLW9wIChhbHJlYWR5IGFib3J0ZWQsIGUuZy4gZnJvbSByZXBsYXkpXG5cbiAgICAgIC8vIFVwZGF0ZSBzaWduYWwgc3RhdGUgYW5kIGZpcmUgbGlzdGVuZXJzIHN5bmNocm9ub3VzbHlcbiAgICAgIHRoaXMuc2lnbmFsLl9zZXRBYm9ydGVkKHJlYXNvbik7XG5cbiAgICAgIC8vIE1hcmsgdGhlIGhvb2sgZm9yIHJlc3VtcHRpb24gc28gdGhlIHN1c3BlbnNpb24gaGFuZGxlciByZWNvcmRzXG4gICAgICAvLyB0aGUgYWJvcnQgaW4gdGhlIGV2ZW50IGxvZyBhbmQgd3JpdGVzIHRoZSBzdHJlYW0gcGFja2V0LlxuICAgICAgZm9yIChjb25zdCBbLCBpdGVtXSBvZiBjdHguaW52b2NhdGlvbnNRdWV1ZSkge1xuICAgICAgICBpZiAoaXRlbS50eXBlID09PSAnaG9vaycgJiYgaXRlbS50b2tlbiA9PT0gdGhpc1tBQk9SVF9IT09LX1RPS0VOXSkge1xuICAgICAgICAgIGl0ZW0uYWJvcnRSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgICAgIGl0ZW0uYWJvcnRSZWFzb24gPSByZWFzb247XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHdvcmtmbG93LWNvbnRleHQgYEFib3J0U2lnbmFsYCBvYmplY3Qgd2l0aCBzdGF0aWMgbWV0aG9kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFib3J0U2lnbmFsU3RhdGljcygpOiB7XG4gIGFib3J0OiAocmVhc29uPzogdW5rbm93bikgPT4gV29ya2Zsb3dBYm9ydFNpZ25hbDtcbiAgYW55OiAoXG4gICAgc2lnbmFsczogSXRlcmFibGU8e1xuICAgICAgYWJvcnRlZDogYm9vbGVhbjtcbiAgICAgIHJlYXNvbj86IHVua25vd247XG4gICAgICBhZGRFdmVudExpc3RlbmVyPzogRnVuY3Rpb247XG4gICAgfT5cbiAgKSA9PiBXb3JrZmxvd0Fib3J0U2lnbmFsO1xuICB0aW1lb3V0OiAoKSA9PiBuZXZlcjtcbn0ge1xuICByZXR1cm4ge1xuICAgIGFib3J0KHJlYXNvbj86IHVua25vd24pOiBXb3JrZmxvd0Fib3J0U2lnbmFsIHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKCcnLCAnJyk7XG4gICAgICBzaWduYWwuX3NldEFib3J0ZWQoXG4gICAgICAgIHJlYXNvbiA/PyBuZXcgRE9NRXhjZXB0aW9uKCdUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLicsICdBYm9ydEVycm9yJylcbiAgICAgICk7XG4gICAgICByZXR1cm4gc2lnbmFsO1xuICAgIH0sXG5cbiAgICBhbnkoXG4gICAgICBzaWduYWxzOiBJdGVyYWJsZTx7XG4gICAgICAgIGFib3J0ZWQ6IGJvb2xlYW47XG4gICAgICAgIHJlYXNvbj86IHVua25vd247XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXI/OiBGdW5jdGlvbjtcbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcj86IEZ1bmN0aW9uO1xuICAgICAgfT5cbiAgICApOiBXb3JrZmxvd0Fib3J0U2lnbmFsIHtcbiAgICAgIGNvbnN0IGNvbXBvc2l0ZSA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKCcnLCAnJyk7XG5cbiAgICAgIC8vIE1hdGVyaWFsaXplIHRoZSBpdGVyYWJsZSBvbmNlLiBOYXRpdmUgQWJvcnRTaWduYWwuYW55IGRvZXMgdGhlIHNhbWU6XG4gICAgICAvLyBzaW5nbGUtc2hvdCBpdGVyYWJsZXMgKGUuZy4gZ2VuZXJhdG9ycykgd291bGQgb3RoZXJ3aXNlIHByb2R1Y2UgemVyb1xuICAgICAgLy8gZW50cmllcyBvbiB0aGUgc2Vjb25kIHBhc3MgYmVsb3cuXG4gICAgICBjb25zdCBhcnIgPSBBcnJheS5mcm9tKHNpZ25hbHMpO1xuXG4gICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBhcnIpIHtcbiAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgY29tcG9zaXRlLl9zZXRBYm9ydGVkKHNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTGlzdGVuIHRvIGVhY2ggc2lnbmFsIOKAlCBmaXJzdCBvbmUgdG8gYWJvcnQgd2lucy4gVHJhY2sgbGlzdGVuZXJzIHNvXG4gICAgICAvLyB3ZSBjYW4gcmVtb3ZlIHRoZW0gYWZ0ZXIgdGhlIGNvbXBvc2l0ZSBhYm9ydHM7IG90aGVyd2lzZSB0aGUgY2xvc3VyZXNcbiAgICAgIC8vIChjYXB0dXJpbmcgYGNvbXBvc2l0ZWApIHByZXZlbnQgR0MgZm9yIGFueSBpbnB1dCBzaWduYWwgdGhhdCBvdXRsaXZlc1xuICAgICAgLy8gdGhlIGNvbXBvc2l0ZSAoZS5nLiBhIGxvbmctbGl2ZWQgZXh0ZXJuYWwgY29udHJvbGxlcikuXG4gICAgICBjb25zdCBsaXN0ZW5lcnM6IEFycmF5PHtcbiAgICAgICAgc2lnbmFsOiAodHlwZW9mIGFycilbbnVtYmVyXTtcbiAgICAgICAgbGlzdGVuZXI6ICgpID0+IHZvaWQ7XG4gICAgICB9PiA9IFtdO1xuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHNpZ25hbCwgbGlzdGVuZXIgfSBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICBpZiAoc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGxpc3RlbmVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGlzdGVuZXJzLmxlbmd0aCA9IDA7XG4gICAgICB9O1xuXG4gICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBhcnIpIHtcbiAgICAgICAgaWYgKCFzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcikgY29udGludWU7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgIGlmICghY29tcG9zaXRlLmFib3J0ZWQpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZS5fc2V0QWJvcnRlZChzaWduYWwucmVhc29uKTtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKHsgc2lnbmFsLCBsaXN0ZW5lciB9KTtcbiAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH0sXG5cbiAgICB0aW1lb3V0KCk6IG5ldmVyIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Fib3J0U2lnbmFsLnRpbWVvdXQoKSBpcyBub3Qgc3VwcG9ydGVkIGluIHdvcmtmbG93IGZ1bmN0aW9ucy4gJyArXG4gICAgICAgICAgJ1VzZSBzbGVlcCgpIHdpdGggYW4gQWJvcnRDb250cm9sbGVyIGluc3RlYWQuICcgK1xuICAgICAgICAgICdTZWU6IC9kb2NzL2Vycm9ycy9hYm9ydC1zaWduYWwtdGltZW91dC1pbi13b3JrZmxvdydcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
312
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJvcnQtY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JrZmxvdy9hYm9ydC1jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsdUJBQXVCLEdBRXhCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFOUM7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixNQUFNLEdBQVksU0FBUyxDQUFDO0lBRW5CLENBQUMsaUJBQWlCLENBQUMsQ0FBUztJQUM1QixDQUFDLGdCQUFnQixDQUFDLENBQVM7SUFFcEMsVUFBVSxHQUFzQixFQUFFLENBQUM7SUFDbkMsUUFBUSxHQUFpRCxJQUFJLENBQUM7SUFFOUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxPQUFxRDtRQUMvRCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQVksVUFBa0IsRUFBRSxTQUFpQjtRQUMvQyxJQUFJLENBQUMsaUJB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bUJBQW1CLEVBQUUsQ0FBQzt3QkFDL0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDaEQsQ0FBQztnQkFDSCxDQUFDO2dCQUNELFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQztZQUVGLEtBQUssTUFBTSxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCO29CQUFFLFNBQVM7Z0JBQ3ZDLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRTtvQkFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDdkIsU0FBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3JDLE9BQU8sRUFBRSxDQUFDO29CQUNaLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDO2dCQUNGLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDckMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBRUQsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE9BQU87WUFDTCxNQUFNLElBQUksS0FBSyxDQUNiLGdFQUFnRTtnQkFDOUQsK0NBQStDO2dCQUMvQyxvREFBb0QsQ0FDdkQsQ0FBQztRQUNKLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcGxheURpdmVyZ2VuY2VFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCB9IGZyb20gJy4uL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQge1xuICBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzLFxuICByZWdpc3RlckRlbGl2ZXJ5QmFycmllcixcbiAgdHlwZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG59IGZyb20gJy4uL3ByaXZhdGUuanMnO1xuaW1wb3J0IHsgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZSB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgQUJPUlRfSE9PS19UT0tFTiwgQUJPUlRfU1RSRUFNX05BTUUgfSBmcm9tICcuLi9zeW1ib2xzLmpzJztcbmltcG9ydCB7IGdldEFib3J0U3RyZWFtSWQgfSBmcm9tICcuLi91dGlsLmpzJztcblxuLyoqXG4gKiBBIGxpZ2h0d2VpZ2h0IEFib3J0U2lnbmFsIGltcGxlbWVudGF0aW9uIGZvciB0aGUgd29ya2Zsb3cgVk0gY29udGV4dC5cbiAqXG4gKiBgc2lnbmFsLmFib3J0ZWRgIGFuZCBsaXN0ZW5lcnMgYXJlIHVwZGF0ZWQgaW4gdHdvIHNjZW5hcmlvczpcbiAqIDEuIE9uIGZpcnN0LXJ1bjogd2hlbiBgYWJvcnQoKWAgaXMgY2FsbGVkIGluIHRoZSB3b3JrZmxvdyBjb2RlXG4gKiAyLiBPbiByZXBsYXk6IHdoZW4gdGhlIGV2ZW50cyBjb25zdW1lciBwcm9jZXNzZXMgdGhlIGBob29rX3JlY2VpdmVkYFxuICogICAgZXZlbnQgKGNoYWluZWQgdGhyb3VnaCBwcm9taXNlUXVldWUgZm9yIGRldGVybWluaXN0aWMgb3JkZXJpbmcpXG4gKlxuICogT24gcmVwbGF5LCBgYWJvcnQoKWAgaW4gdGhlIHdvcmtmbG93IGNvZGUgYmVjb21lcyBhIG5vLW9wIHNpbmNlXG4gKiBgX3NldEFib3J0ZWRgIHdhcyBhbHJlYWR5IGNhbGxlZCBieSB0aGUgZXZlbnRzIGNvbnN1bWVyLlxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dBYm9ydFNpZ25hbCB7XG4gIGFib3J0ZWQgPSBmYWxzZTtcbiAgcmVhc29uOiB1bmtub3duID0gdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IFtBQk9SVF9TVFJFQU1fTkFNRV06IHN0cmluZztcbiAgcmVhZG9ubHkgW0FCT1JUX0hPT0tfVE9LRU5dOiBzdHJpbmc7XG5cbiAgI2xpc3RlbmVyczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcbiAgI29uYWJvcnQ6ICgodGhpczogV29ya2Zsb3dBYm9ydFNpZ25hbCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBnZXQgb25hYm9ydCgpOiAoKHRoaXM6IFdvcmtmbG93QWJvcnRTaWduYWwpID0+IHZvaWQpIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuI29uYWJvcnQ7XG4gIH1cblxuICBzZXQgb25hYm9ydChoYW5kbGVyOiAoKHRoaXM6IFdvcmtmbG93QWJvcnRTaWduYWwpID0+IHZvaWQpIHwgbnVsbCkge1xuICAgIHRoaXMuI29uYWJvcnQgPSBoYW5kbGVyO1xuICAgIGlmIChoYW5kbGVyICYmIHRoaXMuYWJvcnRlZCkge1xuICAgICAgaGFuZGxlci5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHN0cmVhbU5hbWU6IHN0cmluZywgaG9va1Rva2VuOiBzdHJpbmcpIHtcbiAgICB0aGlzW0FCT1JUX1NUUkVBTV9OQU1FXSA9IHN0cmVhbU5hbWU7XG4gICAgdGhpc1tBQk9SVF9IT09LX1RPS0VOXSA9IGhvb2tUb2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgU2V0cyBhYm9ydGVkIHN0YXRlIGFuZCBmaXJlcyBsaXN0ZW5lcnMuXG4gICAqIENhbGxlZCBieSBhYm9ydCgpIG9uIGZpcnN0LXJ1biwgb3IgYnkgdGhlIGV2ZW50cyBjb25zdW1lciBvbiByZXBsYXkuXG4gICAqIElkZW1wb3RlbnQg4oCUIHNlY29uZCBjYWxsIGlzIGEgbm8tb3AuXG4gICAqL1xuICBfc2V0QWJvcnRlZChyZWFzb24/OiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWJvcnRlZCkgcmV0dXJuO1xuICAgIHRoaXMuYWJvcnRlZCA9IHRydWU7XG4gICAgdGhpcy5yZWFzb24gPSByZWFzb247XG4gICAgaWYgKHRoaXMuI29uYWJvcnQpIHtcbiAgICAgIHRoaXMuI29uYWJvcnQuY2FsbCh0aGlzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLiNsaXN0ZW5lcnMpIHtcbiAgICAgIGxpc3RlbmVyKCk7XG4gICAgfVxuICAgIHRoaXMuI2xpc3RlbmVycyA9IFtdO1xuICB9XG5cbiAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKHR5cGUgIT09ICdhYm9ydCcpIHJldHVybjtcbiAgICBpZiAodGhpcy5hYm9ydGVkKSB7XG4gICAgICAvLyBGaXJlIHN5bmNocm9ub3VzbHksIG5vdCBvbiBhIG1pY3JvdGFzay4gTmF0aXZlIEFib3J0U2lnbmFsIGZpcmVzIG9uIGFcbiAgICAgIC8vIG1pY3JvdGFzayBwZXIgc3BlYywgYnV0IGluc2lkZSB0aGUgd29ya2Zsb3cgVk0gd2UgZGVsaWJlcmF0ZWx5IGRpdmVyZ2VcbiAgICAgIC8vIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheTogbGlzdGVuZXIgb3JkZXJpbmcgbXVzdCBiZSB0aWVkIHRvIHRoZVxuICAgICAgLy8gb3JjaGVzdHJhdG9yJ3Mgc3luYyBleGVjdXRpb24gcGF0aCwgbm90IHRvIG1pY3JvdGFzayBzY2hlZHVsaW5nLlxuICAgICAgbGlzdGVuZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICB9XG5cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKHR5cGUgIT09ICdhYm9ydCcpIHJldHVybjtcbiAgICB0aGlzLiNsaXN0ZW5lcnMgPSB0aGlzLiNsaXN0ZW5lcnMuZmlsdGVyKChsKSA9PiBsICE9PSBsaXN0ZW5lcik7XG4gIH1cblxuICB0aHJvd0lmQWJvcnRlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hYm9ydGVkKSB7XG4gICAgICB0aHJvdyAoXG4gICAgICAgIHRoaXMucmVhc29uID8/XG4gICAgICAgIG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgd29ya2Zsb3ctY29udGV4dCBgQWJvcnRDb250cm9sbGVyYCBjbGFzcyB0aGF0IHVzZXMgaG9va3MgZm9yXG4gKiBkdXJhYmxlIHN0YXRlIGFuZCBzdHJlYW1zIGZvciByZWFsLXRpbWUgc3RlcCBwcm9wYWdhdGlvbi5cbiAqXG4gKiBGb2xsb3dzIHRoZSBzYW1lIHBhdHRlcm4gYXMgYGNyZWF0ZUNyZWF0ZUhvb2soKWAgaW4gYHdvcmtmbG93L2hvb2sudHNgOlxuICogLSBSZWdpc3RlcnMgYSBob29rIGluIHRoZSBpbnZvY2F0aW9ucyBxdWV1ZSBvbiBjb25zdHJ1Y3Rpb25cbiAqIC0gU3Vic2NyaWJlcyB0byB0aGUgZXZlbnRzIGNvbnN1bWVyIGZvciBob29rX2NyZWF0ZWQvaG9va19yZWNlaXZlZCBldmVudHNcbiAqIC0gYGFib3J0KClgIGNhbGxzIGBfc2V0QWJvcnRlZGAgKyBtYXJrcyB0aGUgaG9vayBmb3IgcmVzdW1wdGlvblxuICogLSBUaGUgc3VzcGVuc2lvbiBoYW5kbGVyIHByb2Nlc3NlcyB0aGUgYWJvcnQgKGNyZWF0ZXMgZXZlbnQgKyB3cml0ZXMgc3RyZWFtKVxuICogLSBPbiByZXBsYXksIHRoZSBldmVudHMgY29uc3VtZXIgY2FsbHMgYF9zZXRBYm9ydGVkYCB3aGVuIGhvb2tfcmVjZWl2ZWRcbiAqICAgaXMgcHJvY2Vzc2VkLCBhbmQgYGFib3J0KClgIGluIHRoZSB3b3JrZmxvdyBjb2RlIGJlY29tZXMgYSBuby1vcFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ3JlYXRlQWJvcnRDb250cm9sbGVyKGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KSB7XG4gIHJldHVybiBjbGFzcyBXb3JrZmxvd0Fib3J0Q29udHJvbGxlciB7XG4gICAgcmVhZG9ubHkgc2lnbmFsOiBXb3JrZmxvd0Fib3J0U2lnbmFsO1xuICAgIHJlYWRvbmx5IFtBQk9SVF9TVFJFQU1fTkFNRV06IHN0cmluZztcbiAgICByZWFkb25seSBbQUJPUlRfSE9PS19UT0tFTl06IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgY29uc3QgaWQgPSBjdHguZ2VuZXJhdGVVbGlkKCk7XG4gICAgICBjb25zdCBzdHJlYW1OYW1lID0gZ2V0QWJvcnRTdHJlYW1JZChpZCk7XG4gICAgICBjb25zdCBob29rVG9rZW4gPSBgYWJydF8ke2lkfWA7XG5cbiAgICAgIHRoaXNbQUJPUlRfU1RSRUFNX05BTUVdID0gc3RyZWFtTmFtZTtcbiAgICAgIHRoaXNbQUJPUlRfSE9PS19UT0tFTl0gPSBob29rVG9rZW47XG4gICAgICB0aGlzLnNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKHN0cmVhbU5hbWUsIGhvb2tUb2tlbik7XG5cbiAgICAgIC8vIFJlZ2lzdGVyIGFuIGludGVybmFsIHN5c3RlbSBob29rIGluIHRoZSBpbnZvY2F0aW9ucyBxdWV1ZS5cbiAgICAgIC8vIGlzU3lzdGVtIHByZXZlbnRzIHRva2VuIG5hbWVzcGFjZSBjb25mbGljdHMgd2l0aCB1c2VyIGhvb2tzLlxuICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IGBob29rXyR7Y3R4LmdlbmVyYXRlVWxpZCgpfWA7XG4gICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5zZXQoY29ycmVsYXRpb25JZCwge1xuICAgICAgICB0eXBlOiAnaG9vaycsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQsXG4gICAgICAgIHRva2VuOiBob29rVG9rZW4sXG4gICAgICAgIGlzV2ViaG9vazogZmFsc2UsXG4gICAgICAgIGlzU3lzdGVtOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFN1YnNjcmliZSB0byBldmVudHMgZm9yIHRoaXMgaG9vaydzIGxpZmVjeWNsZVxuICAgICAgY3R4LmV2ZW50c0NvbnN1bWVyLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmNvcnJlbGF0aW9uSWQgIT09IGNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50VG9rZW4gPVxuICAgICAgICAgICdldmVudERhdGEnIGluIGV2ZW50ICYmIGV2ZW50LmV2ZW50RGF0YSAmJiAndG9rZW4nIGluIGV2ZW50LmV2ZW50RGF0YVxuICAgICAgICAgICAgPyBldmVudC5ldmVudERhdGEudG9rZW5cbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgZXZlbnRUb2tlbiA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBldmVudFRva2VuICE9PSB0aGlzW0FCT1JUX0hPT0tfVE9LRU5dXG4gICAgICAgICkge1xuICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgICAgbmV3IFJlcGxheURpdmVyZ2VuY2VFcnJvcihcbiAgICAgICAgICAgICAgICBgUmVwbGF5IGRpdmVyZ2VuY2U6IGFib3J0IGhvb2sgZXZlbnQgJHtldmVudC5ldmVudFR5cGV9IGZvciAke2NvcnJlbGF0aW9uSWR9IGJlbG9uZ3MgdG8gdG9rZW4gXCIke2V2ZW50VG9rZW59XCIsIGJ1dCB0aGUgY3VycmVudCBhYm9ydCBob29rIGV4cGVjdHMgXCIke3RoaXNbQUJPUlRfSE9PS19UT0tFTl19XCJgLFxuICAgICAgICAgICAgICAgIHsgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCB9XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJykge1xuICAgICAgICAgIGNvbnN0IHF1ZXVlSXRlbSA9IGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmdldChjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICBpZiAocXVldWVJdGVtICYmIHF1ZXVlSXRlbS50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgICAgIHF1ZXVlSXRlbS5oYXNDcmVhdGVkRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJykge1xuICAgICAgICAgIC8vIFRoZSBhYm9ydCB3YXMgcmVjb3JkZWQgaW4gdGhlIGV2ZW50IGxvZyAoZnJvbSBhIHByZXZpb3VzIHJ1bidzXG4gICAgICAgICAgLy8gYWJvcnQoKSBjYWxsLCBvciBmcm9tIGEgc3RlcC9leHRlcm5hbCBhYm9ydCkuIFVwZGF0ZSBzaWduYWxcbiAgICAgICAgICAvLyBzdGF0ZSBhbmQgZmlyZSBsaXN0ZW5lcnMgYXQgdGhpcyBkZXRlcm1pbmlzdGljIHBvaW50IGluIHRoZVxuICAgICAgICAgIC8vIHByb21pc2VRdWV1ZSDigJQgc2FtZSBvcmRlcmluZyBhcyBob29rIHBheWxvYWQgZGVsaXZlcnkuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgcGF5bG9hZCBpcyB0aGUgZGVoeWRyYXRlZCBmb3JtIHdyaXR0ZW4gYnkgdGhlIHN1c3BlbnNpb25cbiAgICAgICAgICAvLyBoYW5kbGVyIChhIFVpbnQ4QXJyYXksIHBvc3NpYmx5IGVuY3J5cHRlZCkuIEh5ZHJhdGUgaXQgdmlhIHRoZVxuICAgICAgICAgIC8vIHNhbWUgbWFjaGluZXJ5IGFzIHJlZ3VsYXIgaG9vayBwYXlsb2FkcyAod29ya2Zsb3cvaG9vay50czoxMTcpXG4gICAgICAgICAgLy8gc28gdGhlIHJlYXNvbiByb3VuZC10cmlwcyB3aXRoIGZ1bGwgdHlwZSBmaWRlbGl0eS4gUmVhZGluZyB0aGVcbiAgICAgICAgICAvLyByYXcgcGF5bG9hZCBoZXJlIGlzIGEgYnVnIOKAlCBpdCdzIG5vdCBhIHBsYWluIG9iamVjdCBhZnRlclxuICAgICAgICAgIC8vIGRlaHlkcmF0aW9uLCBzbyBgJ3JlYXNvbicgaW4gcGF5bG9hZGAgaXMgZmFsc2UgYW5kIHJlYXNvblxuICAgICAgICAgIC8vIGVuZHMgdXAgdW5kZWZpbmVkIG9uIHJlcGxheS5cbiAgICAgICAgICBjb25zdCByYXdQYXlsb2FkID0gZXZlbnQuZXZlbnREYXRhPy5wYXlsb2FkO1xuICAgICAgICAgIC8vIEFuIGFib3J0IGlzIGEgYnJhbmNoLWRlY2lkaW5nIGRlbGl2ZXJ5OiBgX3NldEFib3J0ZWRgIGZpcmVzIHRoZVxuICAgICAgICAgIC8vIHNpZ25hbCdzIGxpc3RlbmVycywgYW5kIGEgbGlzdGVuZXIgaXMgZnJlZSB0byBpbnZva2UgYSBzdGVwIGFuZFxuICAgICAgICAgIC8vIGRyYXcgYSBVTElELiBTbyBpdCByZWdpc3RlcnMgaW4gdGhlIGRlbGl2ZXJ5LWJhcnJpZXIgcmVnaXN0cnkgYXMgYVxuICAgICAgICAgIC8vICdob29rJyDigJQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHRoZSBldmVudCBpcyDigJQgc28gdGhhdCB3YWl0LCBob29rXG4gICAgICAgICAgLy8gYW5kIHN0ZXAgZGVsaXZlcmllcyBvcmRlciBhZ2FpbnN0IGl0IGJ5IGV2ZW50LWxvZyBwb3NpdGlvbiByYXRoZXJcbiAgICAgICAgICAvLyB0aGFuIGJ5IHdob3NlIGh5ZHJhdGlvbiBmaW5pc2hlZCBmaXJzdC4gSXQgaXMgYWx3YXlzIEFSTUVEOiB1bmxpa2VcbiAgICAgICAgICAvLyBhIGJ1ZmZlcmVkIHVzZXIgaG9vayBwYXlsb2FkLCBub3RoaW5nIGFib3V0IGl0cyBkZWxpdmVyeSB3YWl0cyBvblxuICAgICAgICAgIC8vIHdvcmtmbG93IGNvZGUgYXNraW5nIGZvciBpdC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFJlc29sdmluZyBzdHJhaWdodCBvZmYgdGhlIHF1ZXVlIHNsb3Qgd2FzIHN1ZmZpY2llbnQgb25seSB3aGlsZVxuICAgICAgICAgIC8vIGV2ZXJ5IG90aGVyIGRlbGl2ZXJ5IGFsc28gcmVzb2x2ZWQgZnJvbSBpdHMgc2xvdC4gU3RlcCByZXN1bHRzIG5vXG4gICAgICAgICAgLy8gbG9uZ2VyIGRvIChzZWUgc3RlcC50cyksIHNvIGFuIGFib3J0IHdob3NlIHNsb3QgcmFuIHdoaWxlIGFcbiAgICAgICAgICAvLyBsb2ctZWFybGllciBzdGVwIHNhdCBiZWhpbmQgYSBiYXJyaWVyIHdvdWxkIG92ZXJ0YWtlIGl0IOKAlCBzZWVcbiAgICAgICAgICAvLyBgZGVsaXZlcnktYmFycmllci1jb3ZlcmFnZS50ZXN0LnRzYC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoZSBkZWZlcnJhbCBpcyBjYXB0dXJlZCBIRVJFLCBhdCBldmVudC1jb25zdW1wdGlvbiB0aW1lLCBmb3IgdGhlXG4gICAgICAgICAgLy8gc2FtZSB0d28gcmVhc29ucyBzcGVsbGVkIG91dCBpbiBzdGVwLnRzOiB0aGUgc2V0IG9mIGVhcmxpZXJcbiAgICAgICAgICAvLyBkZWxpdmVyaWVzIHN0YXlzIGEgZnVuY3Rpb24gb2YgbG9nIHBvc2l0aW9uIGFsb25lLCBhbmQgYmFycmllcnNcbiAgICAgICAgICAvLyB0aGF0IHJldGlyZSBiZWZvcmUgdGhpcyBzbG90IHJ1bnMgYXJlIHN0aWxsIHNlZW4uXG4gICAgICAgICAgY29uc3QgZXZlbnRJbmRleCA9IGN0eC5ldmVudHNDb25zdW1lci5ldmVudEluZGV4O1xuICAgICAgICAgIGNvbnN0IGJhcnJpZXIgPSByZWdpc3RlckRlbGl2ZXJ5QmFycmllcihjdHgsIGV2ZW50SW5kZXgsICdob29rJyk7XG4gICAgICAgICAgY29uc3QgZWFybGllckRlbGl2ZXJlZCA9IGF3YWl0RWFybGllckRlbGl2ZXJpZXMoXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBldmVudEluZGV4LFxuICAgICAgICAgICAgJ2hvb2snXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBBY2NvdW50IHRoaXMgYWJvcnQgYXMgYSBwZW5kaW5nIGRlbGl2ZXJ5LCBleGFjdGx5IGxpa2Ugc3RlcFxuICAgICAgICAgIC8vIHJlc3VsdHMgKHN0ZXAudHMpIGFuZCBob29rIHBheWxvYWRzICh3b3JrZmxvdy9ob29rLnRzKSBkby4gVGhlXG4gICAgICAgICAgLy8gc3VzcGVuc2lvbiBoYW5kbGVyIGRlaHlkcmF0ZXMgcXVldWVkIHN0ZXAgYXJndW1lbnRzIG9ubHkgb25jZVxuICAgICAgICAgIC8vIGBzY2hlZHVsZVdoZW5JZGxlYCBvYnNlcnZlcyBgcGVuZGluZ0RlbGl2ZXJpZXMgPT09IDBgLiBXaXRob3V0XG4gICAgICAgICAgLy8gdGhpcyBjb3VudGVyLCBhIHN0ZXAgZGlzcGF0Y2hlZCByaWdodCBhZnRlciB0aGUgYWJvcnQg4oCUIGUuZy4gb25lXG4gICAgICAgICAgLy8gdGhhdCByZWNlaXZlcyBgY29udHJvbGxlci5zaWduYWxgIOKAlCBjYW4gaGF2ZSBpdHMgYXJndW1lbnRzXG4gICAgICAgICAgLy8gc2VyaWFsaXplZCB3aGlsZSB0aGUgYWJvcnQgaXMgc3RpbGwgaW4gZmxpZ2h0IGJlaGluZFxuICAgICAgICAgIC8vIGBhd2FpdCBoeWRyYXRlU3RlcFJldHVyblZhbHVlYCwgY2FwdHVyaW5nIGBzaWduYWwuYWJvcnRlZCA9PT0gZmFsc2VgXG4gICAgICAgICAgLy8gKGFuZCBhIG1pc3NpbmcgcmVhc29uKS4gQnVtcGluZyB0aGUgY291bnRlciBob2xkcyB0aGUgc3VzcGVuc2lvblxuICAgICAgICAgIC8vIHVudGlsIGBfc2V0QWJvcnRlZGAgaGFzIGxhbmRlZCwgc28gZG93bnN0cmVhbSBzZXJpYWxpemF0aW9uIGlzXG4gICAgICAgICAgLy8gZGV0ZXJtaW5pc3RpYyByZWdhcmRsZXNzIG9mIHJlYXNvbi1oeWRyYXRpb24gKGRlY3J5cHRpb24pIGxhdGVuY3kuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBJdCBpcyByZWxlYXNlZCBpbnNpZGUgdGhlIHNsb3QsIGJlZm9yZSB0aGUgZGV0YWNoZWQgZGVmZXJyYWwsIHNvXG4gICAgICAgICAgLy8gYHNjaGVkdWxlV2hlbklkbGVgIGNhbiBzdGlsbCByZWFjaCBpZGxlIGFuZCByZXRpcmUgdGhlIGJhcnJpZXJzXG4gICAgICAgICAgLy8gdGhhdCBkZWZlcnJhbCBtYXkgYmUgd2FpdGluZyBvbiDigJQgdGhlIHNhbWUgc2hhcGUgYXMgdGhlIGhvb2sgYW5kXG4gICAgICAgICAgLy8gc3RlcCBwYXRocy5cbiAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMrKztcbiAgICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCByZWFzb246IHVua25vd247XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAocmF3UGF5bG9hZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXBhcmVkID1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY3R4LnJlcGxheVBheWxvYWRDYWNoZS5wcmVwYXJlRXZlbnRQYXlsb2FkKFxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgJ3BheWxvYWQnLFxuICAgICAgICAgICAgICAgICAgICAgIHJhd1BheWxvYWRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGh5ZHJhdGVkID0gKGF3YWl0IGh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIHJhd1BheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgIGN0eC5ydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgY3R4LmVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgIGN0eC5nbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRcbiAgICAgICAgICAgICAgICAgICkpIGFzIHsgcmVhc29uPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBoeWRyYXRlZCAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgaHlkcmF0ZWQgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgICAgICdyZWFzb24nIGluIGh5ZHJhdGVkXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uID0gaHlkcmF0ZWQucmVhc29uO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQ6IGlmIGh5ZHJhdGlvbiBmYWlscywgZmFsbCBiYWNrIHRvIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgLy8gcmVhc29uLiBUaGUgc2lnbmFsIHN0aWxsIGFib3J0czsgdGhlIHVzZXIganVzdCB3b24ndCBzZWVcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBvcmlnaW5hbCByZWFzb24uIE1hdGNoZXMgV29ya2Zsb3dBYm9ydFNpZ25hbCdzIHNwZWNcbiAgICAgICAgICAgICAgICAgIC8vIGZhbGxiYWNrIChET01FeGNlcHRpb24gQWJvcnRFcnJvcikuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIERldGFjaGVkLCBsaWtlIHRoZSBvdGhlciBkZWxpdmVyaWVzOiBgYXdhaXRFYXJsaWVyRGVsaXZlcmllc2BcbiAgICAgICAgICAgIC8vIG1heSBiZSB3YWl0aW5nIG9uIGEgZGVsaXZlcnkgdGhpcyB2ZXJ5IHF1ZXVlIGRyaXZlcywgYW5kXG4gICAgICAgICAgICAvLyBibG9ja2luZyBhIHNsb3Qgb24gdGhhdCB3b3VsZCBkZWFkbG9jayB0aGUgcXVldWUuXG4gICAgICAgICAgICB2b2lkIGVhcmxpZXJEZWxpdmVyZWQudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGJhcnJpZXIubWFya0RlbGl2ZXJlZCgpO1xuICAgICAgICAgICAgICB0aGlzLnNpZ25hbC5fc2V0QWJvcnRlZChyZWFzb24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5kZWxldGUoY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgLy8gTXVsdGlwbGUgaGFuZGxlcnMgY2FuIG9ic2VydmUgdGhlIHNhbWUgcGVuZGluZyBhYm9ydCByZXF1ZXN0IGFuZFxuICAgICAgICAgIC8vIGR1cmFibHkgcmVjb3JkIGl0IGJlZm9yZSByZXBsYXkgcmVtb3ZlcyB0aGUgcXVldWUgaXRlbS4gQWJvcnQgaXNcbiAgICAgICAgICAvLyBpZGVtcG90ZW50LCBzbyBjb25zdW1lIGxhdGVyIG1hdGNoaW5nIHJlY2VpcHRzIGFzIG5vLW9wcyBpbnN0ZWFkXG4gICAgICAgICAgLy8gb2Ygc3VyZmFjaW5nIGEgY29ycnVwdGVkIGV2ZW50IGxvZyBhZnRlciB0aGUgZmlyc3QgcmVjZWlwdC5cbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJykge1xuICAgICAgICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmRlbGV0ZShjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWJvcnQocmVhc29uPzogdW5rbm93bik6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuc2lnbmFsLmFib3J0ZWQpIHJldHVybjsgLy8gbm8tb3AgKGFscmVhZHkgYWJvcnRlZCwgZS5nLiBmcm9tIHJlcGxheSlcblxuICAgICAgLy8gVXBkYXRlIHNpZ25hbCBzdGF0ZSBhbmQgZmlyZSBsaXN0ZW5lcnMgc3luY2hyb25vdXNseVxuICAgICAgdGhpcy5zaWduYWwuX3NldEFib3J0ZWQocmVhc29uKTtcblxuICAgICAgLy8gTWFyayB0aGUgaG9vayBmb3IgcmVzdW1wdGlvbiBzbyB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyIHJlY29yZHNcbiAgICAgIC8vIHRoZSBhYm9ydCBpbiB0aGUgZXZlbnQgbG9nIGFuZCB3cml0ZXMgdGhlIHN0cmVhbSBwYWNrZXQuXG4gICAgICBmb3IgKGNvbnN0IFssIGl0ZW1dIG9mIGN0eC5pbnZvY2F0aW9uc1F1ZXVlKSB7XG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdob29rJyAmJiBpdGVtLnRva2VuID09PSB0aGlzW0FCT1JUX0hPT0tfVE9LRU5dKSB7XG4gICAgICAgICAgaXRlbS5hYm9ydFJlcXVlc3RlZCA9IHRydWU7XG4gICAgICAgICAgaXRlbS5hYm9ydFJlYXNvbiA9IHJlYXNvbjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgd29ya2Zsb3ctY29udGV4dCBgQWJvcnRTaWduYWxgIG9iamVjdCB3aXRoIHN0YXRpYyBtZXRob2RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWJvcnRTaWduYWxTdGF0aWNzKCk6IHtcbiAgYWJvcnQ6IChyZWFzb24/OiB1bmtub3duKSA9PiBXb3JrZmxvd0Fib3J0U2lnbmFsO1xuICBhbnk6IChcbiAgICBzaWduYWxzOiBJdGVyYWJsZTx7XG4gICAgICBhYm9ydGVkOiBib29sZWFuO1xuICAgICAgcmVhc29uPzogdW5rbm93bjtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXI/OiBGdW5jdGlvbjtcbiAgICB9PlxuICApID0+IFdvcmtmbG93QWJvcnRTaWduYWw7XG4gIHRpbWVvdXQ6ICgpID0+IG5ldmVyO1xufSB7XG4gIHJldHVybiB7XG4gICAgYWJvcnQocmVhc29uPzogdW5rbm93bik6IFdvcmtmbG93QWJvcnRTaWduYWwge1xuICAgICAgY29uc3Qgc2lnbmFsID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwoJycsICcnKTtcbiAgICAgIHNpZ25hbC5fc2V0QWJvcnRlZChcbiAgICAgICAgcmVhc29uID8/IG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBzaWduYWw7XG4gICAgfSxcblxuICAgIGFueShcbiAgICAgIHNpZ25hbHM6IEl0ZXJhYmxlPHtcbiAgICAgICAgYWJvcnRlZDogYm9vbGVhbjtcbiAgICAgICAgcmVhc29uPzogdW5rbm93bjtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcj86IEZ1bmN0aW9uO1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyPzogRnVuY3Rpb247XG4gICAgICB9PlxuICAgICk6IFdvcmtmbG93QWJvcnRTaWduYWwge1xuICAgICAgY29uc3QgY29tcG9zaXRlID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwoJycsICcnKTtcblxuICAgICAgLy8gTWF0ZXJpYWxpemUgdGhlIGl0ZXJhYmxlIG9uY2UuIE5hdGl2ZSBBYm9ydFNpZ25hbC5hbnkgZG9lcyB0aGUgc2FtZTpcbiAgICAgIC8vIHNpbmdsZS1zaG90IGl0ZXJhYmxlcyAoZS5nLiBnZW5lcmF0b3JzKSB3b3VsZCBvdGhlcndpc2UgcHJvZHVjZSB6ZXJvXG4gICAgICAvLyBlbnRyaWVzIG9uIHRoZSBzZWNvbmQgcGFzcyBiZWxvdy5cbiAgICAgIGNvbnN0IGFyciA9IEFycmF5LmZyb20oc2lnbmFscyk7XG5cbiAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGFycikge1xuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICBjb21wb3NpdGUuX3NldEFib3J0ZWQoc2lnbmFsLnJlYXNvbik7XG4gICAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW4gdG8gZWFjaCBzaWduYWwg4oCUIGZpcnN0IG9uZSB0byBhYm9ydCB3aW5zLiBUcmFjayBsaXN0ZW5lcnMgc29cbiAgICAgIC8vIHdlIGNhbiByZW1vdmUgdGhlbSBhZnRlciB0aGUgY29tcG9zaXRlIGFib3J0czsgb3RoZXJ3aXNlIHRoZSBjbG9zdXJlc1xuICAgICAgLy8gKGNhcHR1cmluZyBgY29tcG9zaXRlYCkgcHJldmVudCBHQyBmb3IgYW55IGlucHV0IHNpZ25hbCB0aGF0IG91dGxpdmVzXG4gICAgICAvLyB0aGUgY29tcG9zaXRlIChlLmcuIGEgbG9uZy1saXZlZCBleHRlcm5hbCBjb250cm9sbGVyKS5cbiAgICAgIGNvbnN0IGxpc3RlbmVyczogQXJyYXk8e1xuICAgICAgICBzaWduYWw6ICh0eXBlb2YgYXJyKVtudW1iZXJdO1xuICAgICAgICBsaXN0ZW5lcjogKCkgPT4gdm9pZDtcbiAgICAgIH0+ID0gW107XG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHsgc2lnbmFsLCBsaXN0ZW5lciB9IG9mIGxpc3RlbmVycykge1xuICAgICAgICAgIGlmIChzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgbGlzdGVuZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsaXN0ZW5lcnMubGVuZ3RoID0gMDtcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGFycikge1xuICAgICAgICBpZiAoIXNpZ25hbC5hZGRFdmVudExpc3RlbmVyKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjb21wb3NpdGUuYWJvcnRlZCkge1xuICAgICAgICAgICAgY29tcG9zaXRlLl9zZXRBYm9ydGVkKHNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbGlzdGVuZXJzLnB1c2goeyBzaWduYWwsIGxpc3RlbmVyIH0pO1xuICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfSxcblxuICAgIHRpbWVvdXQoKTogbmV2ZXIge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQWJvcnRTaWduYWwudGltZW91dCgpIGlzIG5vdCBzdXBwb3J0ZWQgaW4gd29ya2Zsb3cgZnVuY3Rpb25zLiAnICtcbiAgICAgICAgICAnVXNlIHNsZWVwKCkgd2l0aCBhbiBBYm9ydENvbnRyb2xsZXIgaW5zdGVhZC4gJyArXG4gICAgICAgICAgJ1NlZTogL2RvY3MvZXJyb3JzL2Fib3J0LXNpZ25hbC10aW1lb3V0LWluLXdvcmtmbG93J1xuICAgICAgKTtcbiAgICB9LFxuICB9O1xufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/workflow/hook.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAI3D,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,eAAe,CAAC;AA2CvB,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,2BAA2B,IAChC,CAAC,GAAG,GAAG,EAAE,UAAS,WAAgB,KAAG,IAAI,CAAC,CAAC,CAAC,CAqe5E"}
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/workflow/hook.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAI3D,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,eAAe,CAAC;AA2CvB,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,2BAA2B,IAChC,CAAC,GAAG,GAAG,EAAE,UAAS,WAAgB,KAAG,IAAI,CAAC,CAAC,CAAC,CA8gB5E"}
@@ -183,22 +183,47 @@ export function createCreateHook(ctx) {
183
183
  }
184
184
  if (event.eventType === 'hook_received') {
185
185
  // Register a 'hook' delivery barrier at this event's log index so a
186
- // later-in-log `wait_completed` is delivered only after this hook,
187
- // and so this hook is delivered only after every earlier-in-log
188
- // `wait_completed` — keeping any `Promise.race` against a wait
189
- // deterministic and aligned with the committed event log, regardless
190
- // of microtask-hop count, hydration time, or race-argument order.
186
+ // later-in-log `wait_completed` or step result is delivered only after
187
+ // this hook, and so this hook is delivered only after every
188
+ // earlier-in-log `wait_completed` and step result — keeping any
189
+ // `Promise.race` (or concurrent-branch ULID allocation) deterministic
190
+ // and aligned with the committed event log, regardless of
191
+ // microtask-hop count, hydration time, or race-argument order.
191
192
  // See `ctx.pendingDeliveryBarriers`.
193
+ //
194
+ // The barrier is registered ARMED only when a consumer is already
195
+ // awaiting, so this payload is committed to reaching the workflow. A
196
+ // buffered payload is registered unarmed and armed by `claim()`: until
197
+ // a consumer takes it, a later step result must not be ordered behind
198
+ // it (see `awaitEarlierDeliveries`).
192
199
  const eventIndex = ctx.eventsConsumer.eventIndex;
193
- const barrier = registerDeliveryBarrier(ctx, eventIndex, 'hook');
194
- if (promises.length > 0) {
200
+ const hasWaitingConsumer = promises.length > 0;
201
+ const barrier = registerDeliveryBarrier(ctx, eventIndex, 'hook', {
202
+ armed: hasWaitingConsumer,
203
+ });
204
+ if (hasWaitingConsumer) {
205
+ // A consumer is already awaiting, so this payload's delivery is
206
+ // pinned to this log position: capture the deferral HERE, while
207
+ // consuming the event, not at the end of the hydration slot below —
208
+ // same reasoning as step.ts. An earlier step or hook whose slot runs
209
+ // first on this serial queue has usually delivered, and so
210
+ // deregistered its barrier, before this slot ends. Read then, it
211
+ // would be invisible and this payload would skip both the gate AND
212
+ // `awaitEarlierDeliveries`' macrotask yield, letting it overtake the
213
+ // branch that earlier delivery just woke. Every event in one drain
214
+ // window is consumed before any slot runs, so capturing at
215
+ // consumption time sees all of them.
216
+ //
217
+ // The BUFFERED branch below deliberately does NOT do this — see the
218
+ // comment on `claim()`.
219
+ const earlierDelivered = awaitEarlierDeliveries(ctx, eventIndex, 'hook');
195
220
  const next = promises.shift();
196
221
  if (next) {
197
- // A consumer is already awaiting. Hydrate through a promiseQueue
198
- // slot (so async deserialization stays in event-log order), then
199
- // defer behind earlier waits before resolving. The deferral runs
200
- // OFF the serial queue (it may wait on an earlier wait delivery
201
- // and blocking a queue slot on that would deadlock the queue).
222
+ // Hydrate through a promiseQueue slot (so async deserialization
223
+ // stays in event-log order), then defer behind earlier waits and
224
+ // steps before resolving. The deferral runs OFF the serial queue
225
+ // (it may wait on an earlier wait or step delivery and blocking a
226
+ // queue slot on that would deadlock the queue).
202
227
  ctx.pendingDeliveries++;
203
228
  let hydrateOutcome;
204
229
  ctx.promiseQueue = ctx.promiseQueue.then(async () => {
@@ -213,7 +238,7 @@ export function createCreateHook(ctx) {
213
238
  finally {
214
239
  ctx.pendingDeliveries--;
215
240
  }
216
- void awaitEarlierDeliveries(ctx, eventIndex, ['wait']).then(() => {
241
+ void earlierDelivered.then(() => {
217
242
  barrier.markDelivered();
218
243
  if (hydrateOutcome.ok) {
219
244
  next.resolve(hydrateOutcome.value);
@@ -236,15 +261,30 @@ export function createCreateHook(ctx) {
236
261
  // the consumer-facing promise on demand.
237
262
  let outcome;
238
263
  const hydrated = withResolvers();
239
- const claim = () => hydrated.promise
240
- .then(() => awaitEarlierDeliveries(ctx, eventIndex, ['wait']))
241
- .then(() => {
242
- barrier.markDelivered();
243
- if (outcome && !outcome.ok) {
244
- throw outcome.error;
245
- }
246
- return outcome.value;
247
- });
264
+ const claim = () => {
265
+ // A consumer has taken this payload, so its delivery no longer
266
+ // waits on workflow code: later step results may now be ordered
267
+ // behind it.
268
+ barrier.arm();
269
+ // Unlike every other delivery, the deferral is evaluated HERE, at
270
+ // claim time, rather than when the event was consumed. A buffered
271
+ // payload's delivery genuinely happens when the workflow reads the
272
+ // hook, which may be many deliveries later; a consumption-time
273
+ // snapshot would make the claim wait on — and pay the macrotask
274
+ // yield for — barriers that were relevant to a moment this payload
275
+ // never participated in. That is not theoretical: it stalls the
276
+ // second payload in the e2e `hookWithSleepWorkflow` long enough
277
+ // for the run to suspend before delivering it.
278
+ return hydrated.promise
279
+ .then(() => awaitEarlierDeliveries(ctx, eventIndex, 'hook'))
280
+ .then(() => {
281
+ barrier.markDelivered();
282
+ if (outcome && !outcome.ok) {
283
+ throw outcome.error;
284
+ }
285
+ return outcome.value;
286
+ });
287
+ };
248
288
  ctx.pendingDeliveries++;
249
289
  ctx.promiseQueue = ctx.promiseQueue.then(async () => {
250
290
  try {
@@ -297,7 +337,7 @@ export function createCreateHook(ctx) {
297
337
  // The payload was hydrated through a promiseQueue slot at its log
298
338
  // position (buffering branch above). `claim()` builds the
299
339
  // consumer-facing promise from that outcome, deferring behind any
300
- // earlier-in-log wait and marking this hook delivered — so
340
+ // earlier-in-log wait or step and marking this hook delivered — so
301
341
  // resolution order stays anchored to the event log, not this later
302
342
  // claim site.
303
343
  return nextDelivery.claim();
@@ -402,4 +442,4 @@ export function createCreateHook(ctx) {
402
442
  return hook;
403
443
  };
404
444
  }
405
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JrZmxvdy9ob29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsaUJBQWlCLEVBQ2pCLHFCQUFxQixHQUN0QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFFTCxtQkFBbUIsRUFDbkIsYUFBYSxHQUNkLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWhGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLGdCQUFnQixHQUVqQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILFNBQVMsb0JBQW9CLENBQzNCLEdBQWdDLEVBQ2hDLGdCQUFvQztJQUVwQyxJQUFJLE9BQU8sZ0JBQWdCLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQUcscUJBQXFCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBSXRELENBQUM7SUFDZCxNQUFNLFdBQVcsR0FBSSxRQUFnQixFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUM5RCxJQUFJLE9BQU8sV0FBVyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sSUFB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QUFDLENBQUM7WUFDM0QsQ0FBQztZQUVELDJEQUEyRDtZQUMzRCxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7Z0JBQzNCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDbkIsTUFBTSxNQUFNLElBQUksQ0FBQztnQkFDbkIsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLEVBQUUsV0FBVztZQUVwQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxXQUFXO1NBQzlCLENBQUM7UUFFRixxRUFBcUU7UUFDckUsb0VBQW9FO1FBQ3BFLGlDQUFpQztRQUNqQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDaEQsSUFBSSxTQUFTLElBQUksU0FBUyxLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM3QyxJQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBGYXRhbEVycm9yLFxuICBIb29rQ29uZmxpY3RFcnJvcixcbiAgUmVwbGF5RGl2ZXJnZW5jZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IFdPUktGTE9XX0RFU0VSSUFMSVpFIH0gZnJvbSAnQHdvcmtmbG93L3NlcmRlJztcbmltcG9ydCB7XG4gIHR5cGUgUHJvbWlzZVdpdGhSZXNvbHZlcnMsXG4gIHBhcnNlRHVyYXRpb25Ub0RhdGUsXG4gIHdpdGhSZXNvbHZlcnMsXG59IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IEhvb2tDb25mbGljdEV2ZW50IH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IGdldFNlcmlhbGl6YXRpb25DbGFzcywgUlVOX0NMQVNTX0lEIH0gZnJvbSAnLi4vY2xhc3Mtc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tPcHRpb25zIH0gZnJvbSAnLi4vY3JlYXRlLWhvb2suanMnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCB9IGZyb20gJy4uL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgeyBXb3JrZmxvd1N1c3BlbnNpb24gfSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgd2ViaG9va0xvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzLFxuICByZWdpc3RlckRlbGl2ZXJ5QmFycmllcixcbiAgc2NoZWR1bGVXaGVuSWRsZSxcbiAgdHlwZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG59IGZyb20gJy4uL3ByaXZhdGUuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW4gfSBmcm9tICcuLi9ydW50aW1lL3J1bi5qcyc7XG5pbXBvcnQgeyBoeWRyYXRlU3RlcFJldHVyblZhbHVlIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIGBSdW5gIGhhbmRsZSBmb3IgdGhlIHJ1biB0aGF0IG93bnMgYSBjb25mbGljdGluZyBob29rXG4gKiB0b2tlbiwgZm9yIHJlc29sdXRpb24gdGhyb3VnaCBgaG9vay5nZXRDb25mbGljdCgpYC5cbiAqXG4gKiBUaGUgaW5zdGFuY2UgaXMgY3JlYXRlZCB0aHJvdWdoIHRoZSBzZXJpYWxpemF0aW9uIGNsYXNzIHJlZ2lzdHJ5IG9uXG4gKiB0aGUgVk0ncyBnbG9iYWxUaGlzIOKAlCB0aGUgc2FtZSBjaGFubmVsIHRoYXQgcmV2aXZlcyBzZXJpYWxpemVkIGBSdW5gXG4gKiBpbnN0YW5jZXMgKGUuZy4gYHN0YXJ0KClgIHJldHVybiB2YWx1ZXMgY3Jvc3NpbmcgZnJvbSBhIHN0ZXAgaW50byB0aGVcbiAqIHdvcmtmbG93KS4gVGhlIHJlZ2lzdGVyZWQgY2xhc3MgaXMgdGhlIFZNIGJ1bmRsZSdzIHBsdWdpbi1jb21waWxlZFxuICogYFJ1bmAsIHdob3NlIG1ldGhvZHMgYXJlIGR1cmFibGUgc3RlcCBwcm94aWVzIOKAlCBzYWZlIHRvIGNhbGwgZnJvbVxuICogd29ya2Zsb3cgY29kZSDigJQgYW5kIGNvbnN0cnVjdGlvbiBnb2VzIHRocm91Z2ggaXRzXG4gKiBgV09SS0ZMT1dfREVTRVJJQUxJWkVgIGhvb2ssIGV4YWN0bHkgYXMgdGhlIGBJbnN0YW5jZWAgcmV2aXZlciB3b3VsZC5cbiAqXG4gKiBSZXR1cm5zIGBudWxsYCB3aGVuIGEgcmVhbCBgUnVuYCBjYW5ub3QgYmUgY29uc3RydWN0ZWQ6IHRoZSBjb25mbGljdFxuICogZXZlbnQgbGFja3MgYGNvbmZsaWN0aW5nUnVuSWRgICh3cml0dGVuIGJ5IGFuIG9sZCB3b3JsZCksIG9yIHRoZSBWTSdzXG4gKiByZWdpc3RyeSBoYXMgbm8gYFJ1bmAgKGEgY29udGV4dCB0aGF0IG5ldmVyIGV2YWx1YXRlZCB0aGVcbiAqIHdvcmtmbG93LW1vZGUgYGNyZWF0ZS1ob29rYCBtb2R1bGUsIHdoaWNoIGFsaWFzZXMgaXQgdW5kZXJcbiAqIGBSVU5fQ0xBU1NfSURgKS4gYGdldENvbmZsaWN0YCBhd2FpdGVycyB0aGVuIHJlamVjdCB3aXRoXG4gKiBgSG9va0NvbmZsaWN0RXJyb3JgIGluc3RlYWQgb2YgcmVzb2x2aW5nIHdpdGggYSB2YWx1ZSB0aGF0IGRvZXNuJ3RcbiAqIGhvbm9yIHRoZSBgUnVuYCBjb250cmFjdC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29uZmxpY3RpbmdSdW4oXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxuICBjb25mbGljdGluZ1J1bklkOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFJ1bjx1bmtub3duPiB8IG51bGwge1xuICBpZiAodHlwZW9mIGNvbmZsaWN0aW5nUnVuSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgUnVuQ2xhc3MgPSBnZXRTZXJpYWxpemF0aW9uQ2xhc3MoUlVOX0NMQVNTX0lELCBjdHguZ2xvYmFsVGhpcykgYXNcbiAgICB8IChhYnN0cmFjdCBuZXcgKFxuICAgICAgICAuLi5hcmdzOiBuZXZlclxuICAgICAgKSA9PiBSdW48dW5rbm93bj4pXG4gICAgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGRlc2VyaWFsaXplID0gKFJ1bkNsYXNzIGFzIGFueSk/LltXT1JLRkxPV19ERVNFUklBTElaRV07XG4gIGlmICh0eXBlb2YgZGVzZXJpYWxpemUgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gZGVzZXJpYWxpemUuY2FsbChSdW5DbGFzcywgeyBydW5JZDogY29uZmxpY3RpbmdSdW5JZCB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNyZWF0ZUhvb2soY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZUhvb2tJbXBsPFQgPSBhbnk+KG9wdGlvbnM6IEhvb2tPcHRpb25zID0ge30pOiBIb29rPFQ+IHtcbiAgICAvLyBSZWplY3QgYW4gZXhwbGljaXQgZW1wdHktc3RyaW5nIHRva2VuLiBBIHRva2VuIG11c3QgZWl0aGVyIGJlIG9taXR0ZWRcbiAgICAvLyAob3IgYHVuZGVmaW5lZGAvYG51bGxgKSB0byBnZXQgYSByYW5kb21seSBnZW5lcmF0ZWQgb25lLCBvciBiZSBhblxuICAgIC8vIGV4cGxpY2l0IG5vbi1lbXB0eSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyBhbG1vc3QgYWx3YXlzIGFuXG4gICAgLy8gYWNjaWRlbnRhbCB2YWx1ZSAoZS5nLiBhbiB1bnNldCB2YXJpYWJsZSkgYW5kIHdvdWxkIG90aGVyd2lzZSBzbGlwXG4gICAgLy8gdGhyb3VnaCB0aGUgYD8/YCBiZWxvdyDigJQgd2hpY2ggb25seSBmYWxscyBiYWNrIGZvciBudWxsaXNoIHZhbHVlcyDigJQgYW5kXG4gICAgLy8gYmUgdXNlZCBhcyBhIG1lYW5pbmdsZXNzLCBub24tZGV0ZXJtaW5pc3RpYyB0b2tlbi5cbiAgICBpZiAob3B0aW9ucy50b2tlbiA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2BjcmVhdGVIb29rKClgIHdhcyBjYWxsZWQgd2l0aCBhbiBlbXB0eSBzdHJpbmcgdG9rZW4uIFBhc3MgYSBub24tZW1wdHkgdG9rZW4sIG9yIG9taXQgdGhlIGB0b2tlbmAgb3B0aW9uIHRvIHVzZSBhIHJhbmRvbWx5IGdlbmVyYXRlZCBvbmUuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBvcHRpb25zLmlzV2ViaG9vayA9PT0gdHJ1ZSAmJlxuICAgICAgb3B0aW9ucy5leHBlcmltZW50YWxfbWluUmV0ZW50aW9uICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1dlYmhvb2sgaG9va3MgZG8gbm90IHN1cHBvcnQgYGV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb25gLiBVc2UgYSBub24td2ViaG9vayBgY3JlYXRlSG9vaygpYCB3aXRoIGByZXN1bWVIb29rKClgLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgb3B0aW9ucy5leHBlcmltZW50YWxfbWluUmV0ZW50aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGN0eC53b3JsZENhcGFiaWxpdGllcz8uaG9va1JldGVudGlvbj8uYWN0aXZlICE9PSB0cnVlXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRmF0YWxFcnJvcihcbiAgICAgICAgJ1RoZSBjb25maWd1cmVkIFdvcmxkIGRvZXMgbm90IHN1cHBvcnQgYGV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb25gIGZvciBIb29rcy4nXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIGhvb2sgSUQgYW5kIHRva2VuXG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IGBob29rXyR7Y3R4LmdlbmVyYXRlVWxpZCgpfWA7XG4gICAgY29uc3QgdG9rZW4gPSBvcHRpb25zLnRva2VuID8/IGN0eC5nZW5lcmF0ZU5hbm9pZCgpO1xuICAgIGNvbnN0IHRva2VuUmV0ZW50aW9uVW50aWwgPVxuICAgICAgb3B0aW9ucy5leHBlcmltZW50YWxfbWluUmV0ZW50aW9uID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBwYXJzZUR1cmF0aW9uVG9EYXRlKG9wdGlvbnMuZXhwZXJpbWVudGFsX21pblJldGVudGlvbik7XG5cbiAgICAvLyBBZGQgaG9vayBjcmVhdGlvbiB0byBpbnZvY2F0aW9ucyBxdWV1ZSAodXNpbmcgTWFwIGZvciBPKDEpIG9wZXJhdGlvbnMpXG4gICAgY29uc3QgaXNXZWJob29rID0gb3B0aW9ucy5pc1dlYmhvb2sgPz8gZmFsc2U7XG5cbiAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5zZXQoY29ycmVsYXRpb25JZCwge1xuICAgICAgdHlwZTogJ2hvb2snLFxuICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgIHRva2VuLFxuICAgICAgdG9rZW5SZXRlbnRpb25VbnRpbCxcbiAgICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLFxuICAgICAgaXNXZWJob29rLFxuICAgIH0pO1xuXG4gICAgLy8gUXVldWUgb2YgYnVmZmVyZWQgaG9vayBwYXlsb2FkcyAocmVjZWl2ZWQgYmVmb3JlIHRoZSB3b3JrZmxvdyBhd2FpdGVkXG4gICAgLy8gdGhlIGhvb2spLiBFYWNoIGVudHJ5J3MgYGNsYWltKClgIGJ1aWxkcyB0aGUgY29uc3VtZXItZmFjaW5nIHByb21pc2VcbiAgICAvLyBmcm9tIHRoZSBjYXB0dXJlZCBoeWRyYXRpb24gb3V0Y29tZSBhbmQgb3JkZXJzIGl0IGRldGVybWluaXN0aWNhbGx5IGJ5XG4gICAgLy8gZXZlbnQtbG9nIHBvc2l0aW9uIGFnYWluc3QgYW55IGNvbmN1cnJlbnQgYnJhbmNoLWRlY2lkaW5nIHJlc29sdXRpb25cbiAgICAvLyAoc2VlIGBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnNgKS5cbiAgICBjb25zdCBwYXlsb2Fkc1F1ZXVlOiB7IGNsYWltOiAoKSA9PiBQcm9taXNlPFQ+IH1bXSA9IFtdO1xuXG4gICAgLy8gUXVldWUgb2YgcHJvbWlzZXMgdGhhdCByZXNvbHZlIHRvIHRoZSBuZXh0IGhvb2sgcGF5bG9hZFxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPltdID0gW107XG5cbiAgICAvLyBRdWV1ZSBvZiBwcm9taXNlcyB0aGF0IHJlc29sdmUgb25jZSBob29rIHJlZ2lzdHJhdGlvbiBpcyBjb25maXJtZWRcbiAgICAvLyAod2l0aCBgbnVsbGApIG9yIGEgdG9rZW4gY29uZmxpY3QgaXMgZGV0ZWN0ZWQgKHdpdGggdGhlIGNvbmZsaWN0aW5nXG4gICAgLy8gYFJ1bmApLiBUaGVzZSBiYWNrIHRoZSBgaG9vay5nZXRDb25mbGljdCgpYCBnZXR0ZXIuXG4gICAgY29uc3QgZ2V0Q29uZmxpY3RQcm9taXNlczogUHJvbWlzZVdpdGhSZXNvbHZlcnM8UnVuPHVua25vd24+IHwgbnVsbD5bXSA9IFtdO1xuXG4gICAgbGV0IGV2ZW50TG9nRW1wdHkgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIHRoZSBldmVudCBsb2cgY29uZmlybXMgaG9vayBjcmVhdGlvbiBoYXBwZW5lZFxuICAgIGxldCBoYXNDcmVhdGVkID0gZmFsc2U7XG5cbiAgICAvLyBUcmFjayBpZiB0aGUgZXZlbnQgbG9nIGNvbmZpcm1zIGRpc3Bvc2FsIGhhcHBlbmVkIChyZXBsYXkgbm8tb3ApXG4gICAgbGV0IGhhc0Rpc3Bvc2VkRXZlbnQgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIHdlIGhhdmUgYSBjb25mbGljdCBzbyB3ZSBjYW4gcmVqZWN0IGZ1dHVyZSBhd2FpdHNcbiAgICBsZXQgaGFzQ29uZmxpY3QgPSBmYWxzZTtcbiAgICBsZXQgY29uZmxpY3RFcnJvclJlZjogSG9va0NvbmZsaWN0RXJyb3IgfCBudWxsID0gbnVsbDtcbiAgICAvLyBUaGUgY29uZmxpY3RpbmcgcnVuIGhhbmRsZSwgc2hhcmVkIGJ5IGV2ZXJ5IGBnZXRDb25mbGljdGAgYXdhaXQgc29cbiAgICAvLyByZXBlYXRlZCBhd2FpdHMgb2JzZXJ2ZSB0aGUgc2FtZSBpbnN0YW5jZSBkZXRlcm1pbmlzdGljYWxseS5cbiAgICBsZXQgY29uZmxpY3RSdW5SZWY6IFJ1bjx1bmtub3duPiB8IG51bGwgPSBudWxsO1xuXG4gICAgd2ViaG9va0xvZ2dlci5kZWJ1ZygnSG9vayBjb25zdW1lciBzZXR1cCcsIHsgY29ycmVsYXRpb25JZCwgdG9rZW4gfSk7XG4gICAgY3R4LmV2ZW50c0NvbnN1bWVyLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBldmVudHMgYW5kIHRoZXJlIGFyZSBwcm9taXNlcyB3YWl0aW5nLFxuICAgICAgLy8gaXQgbWVhbnMgdGhlIGhvb2sgaGFzIGJlZW4gYXdhaXRlZCwgYnV0IGFuIGluY29taW5nIHBheWxvYWQgaGFzIG5vdCB5ZXQgYmVlbiByZWNlaXZlZC5cbiAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIHdvcmtmbG93IHNob3VsZCBiZSBzdXNwZW5kZWQgdW50aWwgdGhlIGhvb2sgaXMgcmVzdW1lZC5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgZXZlbnRMb2dFbXB0eSA9IHRydWU7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIChwcm9taXNlcy5sZW5ndGggPiAwICYmIHBheWxvYWRzUXVldWUubGVuZ3RoID09PSAwKSB8fFxuICAgICAgICAgIChnZXRDb25mbGljdFByb21pc2VzLmxlbmd0aCA+IDAgJiYgIWhhc0NyZWF0ZWQgJiYgIWhhc0NvbmZsaWN0KVxuICAgICAgICApIHtcbiAgICAgICAgICBzY2hlZHVsZVdoZW5JZGxlKGN0eCwgKCkgPT4ge1xuICAgICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgICAgbmV3IFdvcmtmbG93U3VzcGVuc2lvbihjdHguaW52b2NhdGlvbnNRdWV1ZSwgY3R4Lmdsb2JhbFRoaXMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQuY29ycmVsYXRpb25JZCAhPT0gY29ycmVsYXRpb25JZCkge1xuICAgICAgICAvLyBXZSdyZSBub3QgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50IC0gdGhlIGNvcnJlbGF0aW9uSWQgYmVsb25ncyB0byBhIGRpZmZlcmVudCBlbnRpdHlcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV2ZW50VG9rZW4gPVxuICAgICAgICAnZXZlbnREYXRhJyBpbiBldmVudCAmJiBldmVudC5ldmVudERhdGEgJiYgJ3Rva2VuJyBpbiBldmVudC5ldmVudERhdGFcbiAgICAgICAgICA/IGV2ZW50LmV2ZW50RGF0YS50b2tlblxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAodHlwZW9mIGV2ZW50VG9rZW4gPT09ICdzdHJpbmcnICYmIGV2ZW50VG9rZW4gIT09IHRva2VuKSB7XG4gICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgICAgICBgUmVwbGF5IGRpdmVyZ2VuY2U6IGhvb2sgZXZlbnQgJHtldmVudC5ldmVudFR5cGV9IGZvciAke2NvcnJlbGF0aW9uSWR9IGJlbG9uZ3MgdG8gdG9rZW4gXCIke2V2ZW50VG9rZW59XCIsIGJ1dCB0aGUgY3VycmVudCBob29rIGNvbnN1bWVyIGV4cGVjdHMgXCIke3Rva2VufVwiYCxcbiAgICAgICAgICAgICAgeyBldmVudElkOiBldmVudC5ldmVudElkIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBob29rX2NyZWF0ZWQgZXZlbnQgdG8gbWFyayB0aGlzIGhvb2sgYXMgYWxyZWFkeSBjcmVhdGVkXG4gICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJykge1xuICAgICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGlmIChxdWV1ZUl0ZW0gJiYgcXVldWVJdGVtLnR5cGUgPT09ICdob29rJykge1xuICAgICAgICAgIHF1ZXVlSXRlbS5oYXNDcmVhdGVkRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIHF1ZXVlSXRlbS50b2tlblJldGVudGlvblVudGlsID0gZXZlbnQuZXZlbnREYXRhLnRva2VuUmV0ZW50aW9uVW50aWw7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ3JlYXRlZCA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgcGVuZGluZ0dldENvbmZsaWN0UHJvbWlzZXMgPSBnZXRDb25mbGljdFByb21pc2VzLnNsaWNlKCk7XG4gICAgICAgIGdldENvbmZsaWN0UHJvbWlzZXMubGVuZ3RoID0gMDtcbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCByZXNvbHZlciBvZiBwZW5kaW5nR2V0Q29uZmxpY3RQcm9taXNlcykge1xuICAgICAgICAgICAgcmVzb2x2ZXIucmVzb2x2ZShudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgaG9va19jb25mbGljdCBldmVudCAtIGFub3RoZXIgd29ya2Zsb3cgaXMgdXNpbmcgdGhpcyB0b2tlblxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfY29uZmxpY3QnKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGlzIGhvb2sgZnJvbSB0aGUgaW52b2NhdGlvbnMgcXVldWVcbiAgICAgICAgY3R4Lmludm9jYXRpb25zUXVldWUuZGVsZXRlKGNvcnJlbGF0aW9uSWQpO1xuXG4gICAgICAgIC8vIFN0b3JlIHRoZSBjb25mbGljdCBldmVudCBzbyB3ZSBjYW4gcmVqZWN0IGFueSBhd2FpdGVkIHByb21pc2VzLlxuICAgICAgICAvLyBDaGFpbiB0aHJvdWdoIHByb21pc2VRdWV1ZSB0byBlbnN1cmUgZGV0ZXJtaW5pc3RpYyBvcmRlcmluZy5cbiAgICAgICAgY29uc3QgY29uZmxpY3RFdmVudCA9IGV2ZW50IGFzIEhvb2tDb25mbGljdEV2ZW50O1xuICAgICAgICBjb25zdCBjb25mbGljdEVycm9yID0gbmV3IEhvb2tDb25mbGljdEVycm9yKFxuICAgICAgICAgIGNvbmZsaWN0RXZlbnQuZXZlbnREYXRhLnRva2VuLFxuICAgICAgICAgIGNvbmZsaWN0RXZlbnQuZXZlbnREYXRhLmNvbmZsaWN0aW5nUnVuSWRcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBNYXJrIHRoYXQgd2UgaGF2ZSBhIGNvbmZsaWN0IHNvIGZ1dHVyZSBhd2FpdHMgYWxzbyByZWplY3RcbiAgICAgICAgaGFzQ29uZmxpY3QgPSB0cnVlO1xuICAgICAgICBjb25mbGljdEVycm9yUmVmID0gY29uZmxpY3RFcnJvcjtcbiAgICAgICAgY29uZmxpY3RSdW5SZWYgPSBjcmVhdGVDb25mbGljdGluZ1J1bihcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgY29uZmxpY3RFdmVudC5ldmVudERhdGEuY29uZmxpY3RpbmdSdW5JZFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIENhcHR1cmUgYW5kIGRyYWluIHBlbmRpbmcgcHJvbWlzZXMgc3luY2hyb25vdXNseSBzbyB0aGUgbnVsbCBldmVudFxuICAgICAgICAvLyBoYW5kbGVyIHdvbid0IHNlZSB0aGVtIGFuZCB0cmlnZ2VyIGEgc3B1cmlvdXMgV29ya2Zsb3dTdXNwZW5zaW9uLlxuICAgICAgICAvLyBUaGUgYWN0dWFsIHNldHRsZW1lbnRzIGFyZSBkZWZlcnJlZCB0aHJvdWdoIHByb21pc2VRdWV1ZSBmb3JcbiAgICAgICAgLy8gb3JkZXJpbmcuIFBheWxvYWQgYXdhaXRlcnMgcmVqZWN0IHdpdGggSG9va0NvbmZsaWN0RXJyb3IsIHdoaWxlXG4gICAgICAgIC8vIGBnZXRDb25mbGljdGAgYXdhaXRlcnMgcmVzb2x2ZSB3aXRoIHRoZSBjb25mbGljdGluZyBydW4gc28gdGhlXG4gICAgICAgIC8vIHdvcmtmbG93IGNhbiBicmFuY2ggb24gdGhlIGNvbmZsaWN0IHdpdGhvdXQgdGhyb3dpbmcuIFdoZW4gbm9cbiAgICAgICAgLy8gcmVhbCBgUnVuYCBjYW4gYmUgY29uc3RydWN0ZWQgKHNlZSBgY3JlYXRlQ29uZmxpY3RpbmdSdW5gKSxcbiAgICAgICAgLy8gYGdldENvbmZsaWN0YCBhd2FpdGVycyByZWplY3Qgd2l0aCB0aGUgSG9va0NvbmZsaWN0RXJyb3IgaW5zdGVhZFxuICAgICAgICAvLyBvZiByZXNvbHZpbmcgd2l0aCBhIHZhbHVlIHRoYXQgZG9lc24ndCBob25vciB0aGUgYFJ1bmAgY29udHJhY3QuXG4gICAgICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlcyA9IHByb21pc2VzLnNsaWNlKCk7XG4gICAgICAgIHByb21pc2VzLmxlbmd0aCA9IDA7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdHZXRDb25mbGljdFByb21pc2VzID0gZ2V0Q29uZmxpY3RQcm9taXNlcy5zbGljZSgpO1xuICAgICAgICBnZXRDb25mbGljdFByb21pc2VzLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCByZXNvbHZlciBvZiBwZW5kaW5nUHJvbWlzZXMpIHtcbiAgICAgICAgICAgIHJlc29sdmVyLnJlamVjdChjb25mbGljdEVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCByZXNvbHZlciBvZiBwZW5kaW5nR2V0Q29uZmxpY3RQcm9taXNlcykge1xuICAgICAgICAgICAgaWYgKGNvbmZsaWN0UnVuUmVmKSB7XG4gICAgICAgICAgICAgIHJlc29sdmVyLnJlc29sdmUoY29uZmxpY3RSdW5SZWYpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZXIucmVqZWN0KGNvbmZsaWN0RXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJykge1xuICAgICAgICAvLyBSZWdpc3RlciBhICdob29rJyBkZWxpdmVyeSBiYXJyaWVyIGF0IHRoaXMgZXZlbnQncyBsb2cgaW5kZXggc28gYVxuICAgICAgICAvLyBsYXRlci1pbi1sb2cgYHdhaXRfY29tcGxldGVkYCBpcyBkZWxpdmVyZWQgb25seSBhZnRlciB0aGlzIGhvb2ssXG4gICAgICAgIC8vIGFuZCBzbyB0aGlzIGhvb2sgaXMgZGVsaXZlcmVkIG9ubHkgYWZ0ZXIgZXZlcnkgZWFybGllci1pbi1sb2dcbiAgICAgICAgLy8gYHdhaXRfY29tcGxldGVkYCDigJQga2VlcGluZyBhbnkgYFByb21pc2UucmFjZWAgYWdhaW5zdCBhIHdhaXRcbiAgICAgICAgLy8gZGV0ZXJtaW5pc3RpYyBhbmQgYWxpZ25lZCB3aXRoIHRoZSBjb21taXR0ZWQgZXZlbnQgbG9nLCByZWdhcmRsZXNzXG4gICAgICAgIC8vIG9mIG1pY3JvdGFzay1ob3AgY291bnQsIGh5ZHJhdGlvbiB0aW1lLCBvciByYWNlLWFyZ3VtZW50IG9yZGVyLlxuICAgICAgICAvLyBTZWUgYGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVyc2AuXG4gICAgICAgIGNvbnN0IGV2ZW50SW5kZXggPSBjdHguZXZlbnRzQ29uc3VtZXIuZXZlbnRJbmRleDtcbiAgICAgICAgY29uc3QgYmFycmllciA9IHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyKGN0eCwgZXZlbnRJbmRleCwgJ2hvb2snKTtcblxuICAgICAgICBpZiAocHJvbWlzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IG5leHQgPSBwcm9taXNlcy5zaGlmdCgpO1xuICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICAvLyBBIGNvbnN1bWVyIGlzIGFscmVhZHkgYXdhaXRpbmcuIEh5ZHJhdGUgdGhyb3VnaCBhIHByb21pc2VRdWV1ZVxuICAgICAgICAgICAgLy8gc2xvdCAoc28gYXN5bmMgZGVzZXJpYWxpemF0aW9uIHN0YXlzIGluIGV2ZW50LWxvZyBvcmRlciksIHRoZW5cbiAgICAgICAgICAgIC8vIGRlZmVyIGJlaGluZCBlYXJsaWVyIHdhaXRzIGJlZm9yZSByZXNvbHZpbmcuIFRoZSBkZWZlcnJhbCBydW5zXG4gICAgICAgICAgICAvLyBPRkYgdGhlIHNlcmlhbCBxdWV1ZSAoaXQgbWF5IHdhaXQgb24gYW4gZWFybGllciB3YWl0IGRlbGl2ZXJ5XG4gICAgICAgICAgICAvLyBhbmQgYmxvY2tpbmcgYSBxdWV1ZSBzbG90IG9uIHRoYXQgd291bGQgZGVhZGxvY2sgdGhlIHF1ZXVlKS5cbiAgICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcysrO1xuICAgICAgICAgICAgbGV0IGh5ZHJhdGVPdXRjb21lOlxuICAgICAgICAgICAgICB8IHsgb2s6IHRydWU7IHZhbHVlOiBUIH1cbiAgICAgICAgICAgICAgfCB7IG9rOiBmYWxzZTsgZXJyb3I6IHVua25vd24gfTtcbiAgICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXBhcmVkID1cbiAgICAgICAgICAgICAgICAgIGF3YWl0IGN0eC5yZXBsYXlQYXlsb2FkQ2FjaGUucHJlcGFyZUV2ZW50UGF5bG9hZChcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgJ3BheWxvYWQnLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5ldmVudERhdGEucGF5bG9hZFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50RGF0YS5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgY3R4LnJ1bklkLFxuICAgICAgICAgICAgICAgICAgY3R4LmVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICBjdHguZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgcHJlcGFyZWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGh5ZHJhdGVPdXRjb21lID0geyBvazogdHJ1ZSwgdmFsdWU6IHBheWxvYWQgYXMgVCB9O1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGh5ZHJhdGVPdXRjb21lID0geyBvazogZmFsc2UsIGVycm9yIH07XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgY3R4LnBlbmRpbmdEZWxpdmVyaWVzLS07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdm9pZCBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzKGN0eCwgZXZlbnRJbmRleCwgWyd3YWl0J10pLnRoZW4oXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgYmFycmllci5tYXJrRGVsaXZlcmVkKCk7XG4gICAgICAgICAgICAgICAgICBpZiAoaHlkcmF0ZU91dGNvbWUub2spIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKGh5ZHJhdGVPdXRjb21lLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQucmVqZWN0KGh5ZHJhdGVPdXRjb21lLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gY29uc3VtZXIgaXMgYXdhaXRpbmcgeWV0LiBIeWRyYXRlIHRocm91Z2ggYSBwcm9taXNlUXVldWUgc2xvdFxuICAgICAgICAgIC8vIGF0IHRoaXMgbG9nIHBvc2l0aW9uIGFuZCBwYXJrIHRoZSBPVVRDT01FICh2YWx1ZSBvciBlcnJvcikgZm9yIGFcbiAgICAgICAgICAvLyBsYXRlciBgaXRlcmF0b3IubmV4dCgpYCAvIGBhd2FpdCBob29rYCBjbGFpbS4gV2UgY2FwdHVyZSB0aGVcbiAgICAgICAgICAvLyBvdXRjb21lIHJhdGhlciB0aGFuIGVhZ2VybHkgcmVzb2x2aW5nL3JlamVjdGluZyBhIHByb21pc2Ugbm9cbiAgICAgICAgICAvLyBjb25zdW1lciBoYXMgYXR0YWNoZWQgdG8g4oCUIGEgcmVqZWN0ZWQgdW5jbGFpbWVkIHByb21pc2UgKGUuZy4gYVxuICAgICAgICAgIC8vIGJ1ZmZlcmVkIGVuY3J5cHRlZCBwYXlsb2FkIHdpdGggbm8ga2V5KSB3b3VsZCBvdGhlcndpc2Ugc3VyZmFjZVxuICAgICAgICAgIC8vIGFzIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gYW5kIGNyYXNoIHRoZSBwcm9jZXNzLiBgY2xhaW0oKWAgYnVpbGRzXG4gICAgICAgICAgLy8gdGhlIGNvbnN1bWVyLWZhY2luZyBwcm9taXNlIG9uIGRlbWFuZC5cbiAgICAgICAgICBsZXQgb3V0Y29tZTpcbiAgICAgICAgICAgIHwgeyBvazogdHJ1ZTsgdmFsdWU6IFQgfVxuICAgICAgICAgICAgfCB7IG9rOiBmYWxzZTsgZXJyb3I6IHVua25vd24gfVxuICAgICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgaHlkcmF0ZWQgPSB3aXRoUmVzb2x2ZXJzPHZvaWQ+KCk7XG5cbiAgICAgICAgICBjb25zdCBjbGFpbSA9ICgpOiBQcm9taXNlPFQ+ID0+XG4gICAgICAgICAgICBoeWRyYXRlZC5wcm9taXNlXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IGF3YWl0RWFybGllckRlbGl2ZXJpZXMoY3R4LCBldmVudEluZGV4LCBbJ3dhaXQnXSkpXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBiYXJyaWVyLm1hcmtEZWxpdmVyZWQoKTtcbiAgICAgICAgICAgICAgICBpZiAob3V0Y29tZSAmJiAhb3V0Y29tZS5vaykge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgb3V0Y29tZS5lcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIChvdXRjb21lIGFzIHsgb2s6IHRydWU7IHZhbHVlOiBUIH0pLnZhbHVlO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcysrO1xuICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcHJlcGFyZWQgPSBhd2FpdCBjdHgucmVwbGF5UGF5bG9hZENhY2hlLnByZXBhcmVFdmVudFBheWxvYWQoXG4gICAgICAgICAgICAgICAgZXZlbnQuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAncGF5bG9hZCcsXG4gICAgICAgICAgICAgICAgZXZlbnQuZXZlbnREYXRhLnBheWxvYWRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgICAgICAgZXZlbnQuZXZlbnREYXRhLnBheWxvYWQsXG4gICAgICAgICAgICAgICAgY3R4LnJ1bklkLFxuICAgICAgICAgICAgICAgIGN0eC5lbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgIGN0eC5nbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgIHByZXBhcmVkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIG91dGNvbWUgPSB7IG9rOiB0cnVlLCB2YWx1ZTogcGF5bG9hZCBhcyBUIH07XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBvdXRjb21lID0geyBvazogZmFsc2UsIGVycm9yIH07XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMtLTtcbiAgICAgICAgICAgICAgaHlkcmF0ZWQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBheWxvYWRzUXVldWUucHVzaCh7IGNsYWltIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJykge1xuICAgICAgICAvLyBUZXJtaW5hbCBzdGF0ZSAtIHJlbW92ZSBmcm9tIHF1ZXVlIChsaWtlIHN0ZXBfY29tcGxldGVkL3dhaXRfY29tcGxldGVkKVxuICAgICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5kZWxldGUoY29ycmVsYXRpb25JZCk7XG4gICAgICAgIC8vIE1hcmsgdGhhdCB0aGUgZXZlbnQgbG9nIGNvbmZpcm1zIGRpc3Bvc2FsIGhhcHBlbmVkXG4gICAgICAgIGhhc0Rpc3Bvc2VkRXZlbnQgPSB0cnVlO1xuICAgICAgICAvLyBXZSdyZSBkb25lIHByb2Nlc3NpbmcgYW55IG1vcmUgZXZlbnRzIGZvciB0aGlzIGhvb2tcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoaXMgcmVwbGF5IGluc3RhbGxlZCBhIGRpZmZlcmVudCBjb25zdW1lciB0aGFuIHRoZSBzdG9yZWQgZXZlbnQgbmVlZHMuXG4gICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgICAgYFJlcGxheSBkaXZlcmdlbmNlOiBVbmV4cGVjdGVkIGV2ZW50IHR5cGUgZm9yIGhvb2sgJHtjb3JyZWxhdGlvbklkfSAodG9rZW46ICR7dG9rZW59KSBcIiR7ZXZlbnQuZXZlbnRUeXBlfVwiYCxcbiAgICAgICAgICAgIHsgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICB9KTtcblxuICAgIC8vIFRyYWNrIGlmIHRoZSBob29rIGhhcyBiZWVuIGRpc3Bvc2VkXG4gICAgbGV0IGlzRGlzcG9zZWQgPSBmYWxzZTtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgcHJvbWlzZSB0aGF0IHdhaXRzIGZvciB0aGUgbmV4dCBob29rIHBheWxvYWRcbiAgICBmdW5jdGlvbiBjcmVhdGVIb29rUHJvbWlzZSgpOiBQcm9taXNlPFQ+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVycyA9IHdpdGhSZXNvbHZlcnM8VD4oKTtcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBhIGNvbmZsaWN0LCByZWplY3QgdGhyb3VnaCB0aGUgcHJvbWlzZVF1ZXVlIHRvIG1haW50YWluXG4gICAgICAvLyBkZXRlcm1pbmlzdGljIG9yZGVyaW5nIHdpdGggYW55IHByaW9yIHF1ZXVlZCByZXNvbHV0aW9ucy5cbiAgICAgIGlmIChoYXNDb25mbGljdCAmJiBjb25mbGljdEVycm9yUmVmKSB7XG4gICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmVycy5yZWplY3QoY29uZmxpY3RFcnJvclJlZik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXJzLnByb21pc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXlsb2Fkc1F1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgbmV4dERlbGl2ZXJ5ID0gcGF5bG9hZHNRdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAobmV4dERlbGl2ZXJ5KSB7XG4gICAgICAgICAgLy8gVGhlIHBheWxvYWQgd2FzIGh5ZHJhdGVkIHRocm91Z2ggYSBwcm9taXNlUXVldWUgc2xvdCBhdCBpdHMgbG9nXG4gICAgICAgICAgLy8gcG9zaXRpb24gKGJ1ZmZlcmluZyBicmFuY2ggYWJvdmUpLiBgY2xhaW0oKWAgYnVpbGRzIHRoZVxuICAgICAgICAgIC8vIGNvbnN1bWVyLWZhY2luZyBwcm9taXNlIGZyb20gdGhhdCBvdXRjb21lLCBkZWZlcnJpbmcgYmVoaW5kIGFueVxuICAgICAgICAgIC8vIGVhcmxpZXItaW4tbG9nIHdhaXQgYW5kIG1hcmtpbmcgdGhpcyBob29rIGRlbGl2ZXJlZCDigJQgc29cbiAgICAgICAgICAvLyByZXNvbHV0aW9uIG9yZGVyIHN0YXlzIGFuY2hvcmVkIHRvIHRoZSBldmVudCBsb2csIG5vdCB0aGlzIGxhdGVyXG4gICAgICAgICAgLy8gY2xhaW0gc2l0ZS5cbiAgICAgICAgICByZXR1cm4gbmV4dERlbGl2ZXJ5LmNsYWltKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50TG9nRW1wdHkpIHtcbiAgICAgICAgc2NoZWR1bGVXaGVuSWRsZShjdHgsICgpID0+IHtcbiAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgbmV3IFdvcmtmbG93U3VzcGVuc2lvbihjdHguaW52b2NhdGlvbnNRdWV1ZSwgY3R4Lmdsb2JhbFRoaXMpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHByb21pc2VzLnB1c2gocmVzb2x2ZXJzKTtcblxuICAgICAgcmV0dXJuIHJlc29sdmVycy5wcm9taXNlO1xuICAgIH1cblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgaG9vaydzXG4gICAgLy8gcmVnaXN0cmF0aW9uIG91dGNvbWU6IHRoZSBjb25mbGljdGluZyBgUnVuYCB3aGVuIHRoZSB0b2tlbiBpcyBvd25lZFxuICAgIC8vIGJ5IGFub3RoZXIgYWN0aXZlIGhvb2ssIGBudWxsYCBvbmNlIHRoaXMgaG9vaydzIHJlZ2lzdHJhdGlvbiBpc1xuICAgIC8vIGNvbW1pdHRlZC4gQm90aCBmYXN0LXBhdGhzIHNldHRsZSB0aHJvdWdoIGBjdHgucHJvbWlzZVF1ZXVlYCBzb1xuICAgIC8vIHJlc29sdXRpb24gb3JkZXIgYWx3YXlzIG1hdGNoZXMgZXZlbnQtbG9nIG9yZGVyLlxuICAgIGZ1bmN0aW9uIGNyZWF0ZUdldENvbmZsaWN0UHJvbWlzZSgpOiBQcm9taXNlPFJ1bjx1bmtub3duPiB8IG51bGw+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVycyA9IHdpdGhSZXNvbHZlcnM8UnVuPHVua25vd24+IHwgbnVsbD4oKTtcblxuICAgICAgaWYgKGhhc0NyZWF0ZWQpIHtcbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUobnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXJzLnByb21pc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNDb25mbGljdCkge1xuICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICBpZiAoY29uZmxpY3RSdW5SZWYpIHtcbiAgICAgICAgICAgIHJlc29sdmVycy5yZXNvbHZlKGNvbmZsaWN0UnVuUmVmKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlamVjdChjb25mbGljdEVycm9yUmVmKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXJzLnByb21pc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHF1ZXVlSXRlbSA9IGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmdldChjb3JyZWxhdGlvbklkKTtcbiAgICAgIGlmIChxdWV1ZUl0ZW0gJiYgcXVldWVJdGVtLnR5cGUgPT09ICdob29rJykge1xuICAgICAgICBxdWV1ZUl0ZW0uaGFzQ29uZmxpY3RBd2FpdGVyID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50TG9nRW1wdHkpIHtcbiAgICAgICAgc2NoZWR1bGVXaGVuSWRsZShjdHgsICgpID0+IHtcbiAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgbmV3IFdvcmtmbG93U3VzcGVuc2lvbihjdHguaW52b2NhdGlvbnNRdWV1ZSwgY3R4Lmdsb2JhbFRoaXMpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGdldENvbmZsaWN0UHJvbWlzZXMucHVzaChyZXNvbHZlcnMpO1xuICAgICAgcmV0dXJuIHJlc29sdmVycy5wcm9taXNlO1xuICAgIH1cblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBkaXNwb3NlIHRoZSBob29rXG4gICAgZnVuY3Rpb24gZGlzcG9zZUhvb2soKTogdm9pZCB7XG4gICAgICBpZiAoaXNEaXNwb3NlZCkge1xuICAgICAgICByZXR1cm47IC8vIEFscmVhZHkgZGlzcG9zZWQsIG5vdGhpbmcgdG8gZG9cbiAgICAgIH1cbiAgICAgIGlzRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgICAvLyBJZiB0aGUgZXZlbnQgbG9nIGFscmVhZHkgY29udGFpbnMgaG9va19kaXNwb3NlZCwgdGhpcyBpcyBhIHJlcGxheSDigJQgbm8tb3BcbiAgICAgIGlmIChoYXNEaXNwb3NlZEV2ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGRpc3Bvc2VkIGZsYWcgb24gdGhlIGV4aXN0aW5nIHF1ZXVlIGl0ZW1cbiAgICAgIGNvbnN0IHF1ZXVlSXRlbSA9IGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmdldChjb3JyZWxhdGlvbklkKTtcbiAgICAgIGlmIChxdWV1ZUl0ZW0gJiYgcXVldWVJdGVtLnR5cGUgPT09ICdob29rJykge1xuICAgICAgICBxdWV1ZUl0ZW0uZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBEcmFpbiBhbnkgcGVuZGluZyBwcm9taXNlcyB0aGF0IGFyZSB3YWl0aW5nIGZvciBwYXlsb2Fkcy5cbiAgICAgIC8vIFdpdGhvdXQgdGhpcywgcHJvbWlzZXMgY3JlYXRlZCBieSBgYXdhaXQgaG9va2Agb3IgdGhlIGFzeW5jIGl0ZXJhdG9yJ3NcbiAgICAgIC8vIGB5aWVsZCBhd2FpdCB0aGlzYCB3b3VsZCBoYW5nIGZvcmV2ZXIgc2luY2UgdGhlIGV2ZW50IGNvbnN1bWVyIHdpbGxcbiAgICAgIC8vIG5ldmVyIGRlbGl2ZXIgYW5vdGhlciBob29rX3JlY2VpdmVkIGFmdGVyIGRpc3Bvc2FsLlxuICAgICAgaWYgKHByb21pc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcHJvbWlzZXMubGVuZ3RoID0gMDtcbiAgICAgICAgc2NoZWR1bGVXaGVuSWRsZShjdHgsICgpID0+IHtcbiAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgbmV3IFdvcmtmbG93U3VzcGVuc2lvbihjdHguaW52b2NhdGlvbnNRdWV1ZSwgY3R4Lmdsb2JhbFRoaXMpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHdlYmhvb2tMb2dnZXIuZGVidWcoJ0hvb2sgZGlzcG9zZWQnLCB7IGNvcnJlbGF0aW9uSWQsIHRva2VuIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGhvb2s6IEhvb2s8VD4gPSB7XG4gICAgICB0b2tlbixcblxuICAgICAgZ2V0Q29uZmxpY3QoKTogUHJvbWlzZTxSdW48dW5rbm93bj4gfCBudWxsPiB7XG4gICAgICAgIHJldHVybiBjcmVhdGVHZXRDb25mbGljdFByb21pc2UoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9UaGVuUHJvcGVydHk6IEludGVudGlvbmFsbHkgdGhlbmFibGVcbiAgICAgIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICAgICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPikgfCBudWxsLFxuICAgICAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbFxuICAgICAgKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgICAgIHJldHVybiBjcmVhdGVIb29rUHJvbWlzZSgpLnRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpO1xuICAgICAgfSxcblxuICAgICAgLy8gU3VwcG9ydCBgZm9yIGF3YWl0IChjb25zdCBwYXlsb2FkIG9mIGhvb2spIHsg4oCmIH1gIHN5bnRheFxuICAgICAgYXN5bmMgKltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgIHdoaWxlICghaXNEaXNwb3NlZCkge1xuICAgICAgICAgIHlpZWxkIGF3YWl0IHRoaXM7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGRpc3Bvc2U6IGRpc3Bvc2VIb29rLFxuXG4gICAgICBbU3ltYm9sLmRpc3Bvc2VdOiBkaXNwb3NlSG9vayxcbiAgICB9O1xuXG4gICAgLy8gQWxzbyByZWdpc3RlciB3aXRoIHRoZSBWTSdzIFN5bWJvbC5kaXNwb3NlIHNvIGB1c2luZ2Agd29ya3MgaW5zaWRlXG4gICAgLy8gdGhlIHdvcmtmbG93IHNhbmRib3ggKHRoZSBWTSBtYXkgaGF2ZSBhIHBvbHlmaWxsZWQgU3ltYm9sLmRpc3Bvc2VcbiAgICAvLyB0aGF0IGRpZmZlcnMgZnJvbSB0aGUgaG9zdCdzKS5cbiAgICBjb25zdCB2bURpc3Bvc2UgPSBjdHguZ2xvYmFsVGhpcy5TeW1ib2wuZGlzcG9zZTtcbiAgICBpZiAodm1EaXNwb3NlICYmIHZtRGlzcG9zZSAhPT0gU3ltYm9sLmRpc3Bvc2UpIHtcbiAgICAgIChob29rIGFzIGFueSlbdm1EaXNwb3NlXSA9IGRpc3Bvc2VIb29rO1xuICAgIH1cblxuICAgIHJldHVybiBob29rO1xuICB9O1xufVxuIl19
445
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JrZmxvdy9ob29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsaUJBQWlCLEVBQ2pCLHFCQUFxQixHQUN0QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFFTCxtQkFBbUIsRUFDbkIsYUFBYSxHQUNkLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWhGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLGdCQUFnQixHQUVqQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILFNBQVMsb0JBQW9CLENBQzNCLEdBQWdDLEVBQ2hDLGdCQUFvQztJQUVwQyxJQUFJLE9BQU8sZ0JBQWdCLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQUcscUJBQXFCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBSXRELENBQUM7SUFDZCxNQUFNLFdBQVcsR0FBSSxRQUFnQixFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUM5RCxJQUFJLE9BQU8sV0FBVyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sSUFB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QUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDaEQsSUFBSSxTQUFTLElBQUksU0FBUyxLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM3QyxJQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBGYXRhbEVycm9yLFxuICBIb29rQ29uZmxpY3RFcnJvcixcbiAgUmVwbGF5RGl2ZXJnZW5jZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IFdPUktGTE9XX0RFU0VSSUFMSVpFIH0gZnJvbSAnQHdvcmtmbG93L3NlcmRlJztcbmltcG9ydCB7XG4gIHR5cGUgUHJvbWlzZVdpdGhSZXNvbHZlcnMsXG4gIHBhcnNlRHVyYXRpb25Ub0RhdGUsXG4gIHdpdGhSZXNvbHZlcnMsXG59IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IEhvb2tDb25mbGljdEV2ZW50IH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IGdldFNlcmlhbGl6YXRpb25DbGFzcywgUlVOX0NMQVNTX0lEIH0gZnJvbSAnLi4vY2xhc3Mtc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tPcHRpb25zIH0gZnJvbSAnLi4vY3JlYXRlLWhvb2suanMnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCB9IGZyb20gJy4uL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgeyBXb3JrZmxvd1N1c3BlbnNpb24gfSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgd2ViaG9va0xvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzLFxuICByZWdpc3RlckRlbGl2ZXJ5QmFycmllcixcbiAgc2NoZWR1bGVXaGVuSWRsZSxcbiAgdHlwZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG59IGZyb20gJy4uL3ByaXZhdGUuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW4gfSBmcm9tICcuLi9ydW50aW1lL3J1bi5qcyc7XG5pbXBvcnQgeyBoeWRyYXRlU3RlcFJldHVyblZhbHVlIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIGBSdW5gIGhhbmRsZSBmb3IgdGhlIHJ1biB0aGF0IG93bnMgYSBjb25mbGljdGluZyBob29rXG4gKiB0b2tlbiwgZm9yIHJlc29sdXRpb24gdGhyb3VnaCBgaG9vay5nZXRDb25mbGljdCgpYC5cbiAqXG4gKiBUaGUgaW5zdGFuY2UgaXMgY3JlYXRlZCB0aHJvdWdoIHRoZSBzZXJpYWxpemF0aW9uIGNsYXNzIHJlZ2lzdHJ5IG9uXG4gKiB0aGUgVk0ncyBnbG9iYWxUaGlzIOKAlCB0aGUgc2FtZSBjaGFubmVsIHRoYXQgcmV2aXZlcyBzZXJpYWxpemVkIGBSdW5gXG4gKiBpbnN0YW5jZXMgKGUuZy4gYHN0YXJ0KClgIHJldHVybiB2YWx1ZXMgY3Jvc3NpbmcgZnJvbSBhIHN0ZXAgaW50byB0aGVcbiAqIHdvcmtmbG93KS4gVGhlIHJlZ2lzdGVyZWQgY2xhc3MgaXMgdGhlIFZNIGJ1bmRsZSdzIHBsdWdpbi1jb21waWxlZFxuICogYFJ1bmAsIHdob3NlIG1ldGhvZHMgYXJlIGR1cmFibGUgc3RlcCBwcm94aWVzIOKAlCBzYWZlIHRvIGNhbGwgZnJvbVxuICogd29ya2Zsb3cgY29kZSDigJQgYW5kIGNvbnN0cnVjdGlvbiBnb2VzIHRocm91Z2ggaXRzXG4gKiBgV09SS0ZMT1dfREVTRVJJQUxJWkVgIGhvb2ssIGV4YWN0bHkgYXMgdGhlIGBJbnN0YW5jZWAgcmV2aXZlciB3b3VsZC5cbiAqXG4gKiBSZXR1cm5zIGBudWxsYCB3aGVuIGEgcmVhbCBgUnVuYCBjYW5ub3QgYmUgY29uc3RydWN0ZWQ6IHRoZSBjb25mbGljdFxuICogZXZlbnQgbGFja3MgYGNvbmZsaWN0aW5nUnVuSWRgICh3cml0dGVuIGJ5IGFuIG9sZCB3b3JsZCksIG9yIHRoZSBWTSdzXG4gKiByZWdpc3RyeSBoYXMgbm8gYFJ1bmAgKGEgY29udGV4dCB0aGF0IG5ldmVyIGV2YWx1YXRlZCB0aGVcbiAqIHdvcmtmbG93LW1vZGUgYGNyZWF0ZS1ob29rYCBtb2R1bGUsIHdoaWNoIGFsaWFzZXMgaXQgdW5kZXJcbiAqIGBSVU5fQ0xBU1NfSURgKS4gYGdldENvbmZsaWN0YCBhd2FpdGVycyB0aGVuIHJlamVjdCB3aXRoXG4gKiBgSG9va0NvbmZsaWN0RXJyb3JgIGluc3RlYWQgb2YgcmVzb2x2aW5nIHdpdGggYSB2YWx1ZSB0aGF0IGRvZXNuJ3RcbiAqIGhvbm9yIHRoZSBgUnVuYCBjb250cmFjdC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29uZmxpY3RpbmdSdW4oXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxuICBjb25mbGljdGluZ1J1bklkOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFJ1bjx1bmtub3duPiB8IG51bGwge1xuICBpZiAodHlwZW9mIGNvbmZsaWN0aW5nUnVuSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgUnVuQ2xhc3MgPSBnZXRTZXJpYWxpemF0aW9uQ2xhc3MoUlVOX0NMQVNTX0lELCBjdHguZ2xvYmFsVGhpcykgYXNcbiAgICB8IChhYnN0cmFjdCBuZXcgKFxuICAgICAgICAuLi5hcmdzOiBuZXZlclxuICAgICAgKSA9PiBSdW48dW5rbm93bj4pXG4gICAgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGRlc2VyaWFsaXplID0gKFJ1bkNsYXNzIGFzIGFueSk/LltXT1JLRkxPV19ERVNFUklBTElaRV07XG4gIGlmICh0eXBlb2YgZGVzZXJpYWxpemUgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gZGVzZXJpYWxpemUuY2FsbChSdW5DbGFzcywgeyBydW5JZDogY29uZmxpY3RpbmdSdW5JZCB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNyZWF0ZUhvb2soY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZUhvb2tJbXBsPFQgPSBhbnk+KG9wdGlvbnM6IEhvb2tPcHRpb25zID0ge30pOiBIb29rPFQ+IHtcbiAgICAvLyBSZWplY3QgYW4gZXhwbGljaXQgZW1wdHktc3RyaW5nIHRva2VuLiBBIHRva2VuIG11c3QgZWl0aGVyIGJlIG9taXR0ZWRcbiAgICAvLyAob3IgYHVuZGVmaW5lZGAvYG51bGxgKSB0byBnZXQgYSByYW5kb21seSBnZW5lcmF0ZWQgb25lLCBvciBiZSBhblxuICAgIC8vIGV4cGxpY2l0IG5vbi1lbXB0eSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyBhbG1vc3QgYWx3YXlzIGFuXG4gICAgLy8gYWNjaWRlbnRhbCB2YWx1ZSAoZS5nLiBhbiB1bnNldCB2YXJpYWJsZSkgYW5kIHdvdWxkIG90aGVyd2lzZSBzbGlwXG4gICAgLy8gdGhyb3VnaCB0aGUgYD8/YCBiZWxvdyDigJQgd2hpY2ggb25seSBmYWxscyBiYWNrIGZvciBudWxsaXNoIHZhbHVlcyDigJQgYW5kXG4gICAgLy8gYmUgdXNlZCBhcyBhIG1lYW5pbmdsZXNzLCBub24tZGV0ZXJtaW5pc3RpYyB0b2tlbi5cbiAgICBpZiAob3B0aW9ucy50b2tlbiA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2BjcmVhdGVIb29rKClgIHdhcyBjYWxsZWQgd2l0aCBhbiBlbXB0eSBzdHJpbmcgdG9rZW4uIFBhc3MgYSBub24tZW1wdHkgdG9rZW4sIG9yIG9taXQgdGhlIGB0b2tlbmAgb3B0aW9uIHRvIHVzZSBhIHJhbmRvbWx5IGdlbmVyYXRlZCBvbmUuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBvcHRpb25zLmlzV2ViaG9vayA9PT0gdHJ1ZSAmJlxuICAgICAgb3B0aW9ucy5leHBlcmltZW50YWxfbWluUmV0ZW50aW9uICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1dlYmhvb2sgaG9va3MgZG8gbm90IHN1cHBvcnQgYGV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb25gLiBVc2UgYSBub24td2ViaG9vayBgY3JlYXRlSG9vaygpYCB3aXRoIGByZXN1bWVIb29rKClgLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgb3B0aW9ucy5leHBlcmltZW50YWxfbWluUmV0ZW50aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGN0eC53b3JsZENhcGFiaWxpdGllcz8uaG9va1JldGVudGlvbj8uYWN0aXZlICE9PSB0cnVlXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRmF0YWxFcnJvcihcbiAgICAgICAgJ1RoZSBjb25maWd1cmVkIFdvcmxkIGRvZXMgbm90IHN1cHBvcnQgYGV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb25gIGZvciBIb29rcy4nXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIGhvb2sgSUQgYW5kIHRva2VuXG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IGBob29rXyR7Y3R4LmdlbmVyYXRlVWxpZCgpfWA7XG4gICAgY29uc3QgdG9rZW4gPSBvcHRpb25zLnRva2VuID8/IGN0eC5nZW5lcmF0ZU5hbm9pZCgpO1xuICAgIGNvbnN0IHRva2VuUmV0ZW50aW9uVW50aWwgPVxuICAgICAgb3B0aW9ucy5leHBlcmltZW50YWxfbWluUmV0ZW50aW9uID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBwYXJzZUR1cmF0aW9uVG9EYXRlKG9wdGlvbnMuZXhwZXJpbWVudGFsX21pblJldGVudGlvbik7XG5cbiAgICAvLyBBZGQgaG9vayBjcmVhdGlvbiB0byBpbnZvY2F0aW9ucyBxdWV1ZSAodXNpbmcgTWFwIGZvciBPKDEpIG9wZXJhdGlvbnMpXG4gICAgY29uc3QgaXNXZWJob29rID0gb3B0aW9ucy5pc1dlYmhvb2sgPz8gZmFsc2U7XG5cbiAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5zZXQoY29ycmVsYXRpb25JZCwge1xuICAgICAgdHlwZTogJ2hvb2snLFxuICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgIHRva2VuLFxuICAgICAgdG9rZW5SZXRlbnRpb25VbnRpbCxcbiAgICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLFxuICAgICAgaXNXZWJob29rLFxuICAgIH0pO1xuXG4gICAgLy8gUXVldWUgb2YgYnVmZmVyZWQgaG9vayBwYXlsb2FkcyAocmVjZWl2ZWQgYmVmb3JlIHRoZSB3b3JrZmxvdyBhd2FpdGVkXG4gICAgLy8gdGhlIGhvb2spLiBFYWNoIGVudHJ5J3MgYGNsYWltKClgIGJ1aWxkcyB0aGUgY29uc3VtZXItZmFjaW5nIHByb21pc2VcbiAgICAvLyBmcm9tIHRoZSBjYXB0dXJlZCBoeWRyYXRpb24gb3V0Y29tZSBhbmQgb3JkZXJzIGl0IGRldGVybWluaXN0aWNhbGx5IGJ5XG4gICAgLy8gZXZlbnQtbG9nIHBvc2l0aW9uIGFnYWluc3QgYW55IGNvbmN1cnJlbnQgYnJhbmNoLWRlY2lkaW5nIHJlc29sdXRpb25cbiAgICAvLyAoc2VlIGBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnNgKS5cbiAgICBjb25zdCBwYXlsb2Fkc1F1ZXVlOiB7IGNsYWltOiAoKSA9PiBQcm9taXNlPFQ+IH1bXSA9IFtdO1xuXG4gICAgLy8gUXVldWUgb2YgcHJvbWlzZXMgdGhhdCByZXNvbHZlIHRvIHRoZSBuZXh0IGhvb2sgcGF5bG9hZFxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPltdID0gW107XG5cbiAgICAvLyBRdWV1ZSBvZiBwcm9taXNlcyB0aGF0IHJlc29sdmUgb25jZSBob29rIHJlZ2lzdHJhdGlvbiBpcyBjb25maXJtZWRcbiAgICAvLyAod2l0aCBgbnVsbGApIG9yIGEgdG9rZW4gY29uZmxpY3QgaXMgZGV0ZWN0ZWQgKHdpdGggdGhlIGNvbmZsaWN0aW5nXG4gICAgLy8gYFJ1bmApLiBUaGVzZSBiYWNrIHRoZSBgaG9vay5nZXRDb25mbGljdCgpYCBnZXR0ZXIuXG4gICAgY29uc3QgZ2V0Q29uZmxpY3RQcm9taXNlczogUHJvbWlzZVdpdGhSZXNvbHZlcnM8UnVuPHVua25vd24+IHwgbnVsbD5bXSA9IFtdO1xuXG4gICAgbGV0IGV2ZW50TG9nRW1wdHkgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIHRoZSBldmVudCBsb2cgY29uZmlybXMgaG9vayBjcmVhdGlvbiBoYXBwZW5lZFxuICAgIGxldCBoYXNDcmVhdGVkID0gZmFsc2U7XG5cbiAgICAvLyBUcmFjayBpZiB0aGUgZXZlbnQgbG9nIGNvbmZpcm1zIGRpc3Bvc2FsIGhhcHBlbmVkIChyZXBsYXkgbm8tb3ApXG4gICAgbGV0IGhhc0Rpc3Bvc2VkRXZlbnQgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIHdlIGhhdmUgYSBjb25mbGljdCBzbyB3ZSBjYW4gcmVqZWN0IGZ1dHVyZSBhd2FpdHNcbiAgICBsZXQgaGFzQ29uZmxpY3QgPSBmYWxzZTtcbiAgICBsZXQgY29uZmxpY3RFcnJvclJlZjogSG9va0NvbmZsaWN0RXJyb3IgfCBudWxsID0gbnVsbDtcbiAgICAvLyBUaGUgY29uZmxpY3RpbmcgcnVuIGhhbmRsZSwgc2hhcmVkIGJ5IGV2ZXJ5IGBnZXRDb25mbGljdGAgYXdhaXQgc29cbiAgICAvLyByZXBlYXRlZCBhd2FpdHMgb2JzZXJ2ZSB0aGUgc2FtZSBpbnN0YW5jZSBkZXRlcm1pbmlzdGljYWxseS5cbiAgICBsZXQgY29uZmxpY3RSdW5SZWY6IFJ1bjx1bmtub3duPiB8IG51bGwgPSBudWxsO1xuXG4gICAgd2ViaG9va0xvZ2dlci5kZWJ1ZygnSG9vayBjb25zdW1lciBzZXR1cCcsIHsgY29ycmVsYXRpb25JZCwgdG9rZW4gfSk7XG4gICAgY3R4LmV2ZW50c0NvbnN1bWVyLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBldmVudHMgYW5kIHRoZXJlIGFyZSBwcm9taXNlcyB3YWl0aW5nLFxuICAgICAgLy8gaXQgbWVhbnMgdGhlIGhvb2sgaGFzIGJlZW4gYXdhaXRlZCwgYnV0IGFuIGluY29taW5nIHBheWxvYWQgaGFzIG5vdCB5ZXQgYmVlbiByZWNlaXZlZC5cbiAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIHdvcmtmbG93IHNob3VsZCBiZSBzdXNwZW5kZWQgdW50aWwgdGhlIGhvb2sgaXMgcmVzdW1lZC5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgZXZlbnRMb2dFbXB0eSA9IHRydWU7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIChwcm9taXNlcy5sZW5ndGggPiAwICYmIHBheWxvYWRzUXVldWUubGVuZ3RoID09PSAwKSB8fFxuICAgICAgICAgIChnZXRDb25mbGljdFByb21pc2VzLmxlbmd0aCA+IDAgJiYgIWhhc0NyZWF0ZWQgJiYgIWhhc0NvbmZsaWN0KVxuICAgICAgICApIHtcbiAgICAgICAgICBzY2hlZHVsZVdoZW5JZGxlKGN0eCwgKCkgPT4ge1xuICAgICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgICAgbmV3IFdvcmtmbG93U3VzcGVuc2lvbihjdHguaW52b2NhdGlvbnNRdWV1ZSwgY3R4Lmdsb2JhbFRoaXMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQuY29ycmVsYXRpb25JZCAhPT0gY29ycmVsYXRpb25JZCkge1xuICAgICAgICAvLyBXZSdyZSBub3QgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50IC0gdGhlIGNvcnJlbGF0aW9uSWQgYmVsb25ncyB0byBhIGRpZmZlcmVudCBlbnRpdHlcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV2ZW50VG9rZW4gPVxuICAgICAgICAnZXZlbnREYXRhJyBpbiBldmVudCAmJiBldmVudC5ldmVudERhdGEgJiYgJ3Rva2VuJyBpbiBldmVudC5ldmVudERhdGFcbiAgICAgICAgICA/IGV2ZW50LmV2ZW50RGF0YS50b2tlblxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAodHlwZW9mIGV2ZW50VG9rZW4gPT09ICdzdHJpbmcnICYmIGV2ZW50VG9rZW4gIT09IHRva2VuKSB7XG4gICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgICAgICBgUmVwbGF5IGRpdmVyZ2VuY2U6IGhvb2sgZXZlbnQgJHtldmVudC5ldmVudFR5cGV9IGZvciAke2NvcnJlbGF0aW9uSWR9IGJlbG9uZ3MgdG8gdG9rZW4gXCIke2V2ZW50VG9rZW59XCIsIGJ1dCB0aGUgY3VycmVudCBob29rIGNvbnN1bWVyIGV4cGVjdHMgXCIke3Rva2VufVwiYCxcbiAgICAgICAgICAgICAgeyBldmVudElkOiBldmVudC5ldmVudElkIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBob29rX2NyZWF0ZWQgZXZlbnQgdG8gbWFyayB0aGlzIGhvb2sgYXMgYWxyZWFkeSBjcmVhdGVkXG4gICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJykge1xuICAgICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGlmIChxdWV1ZUl0ZW0gJiYgcXVldWVJdGVtLnR5cGUgPT09ICdob29rJykge1xuICAgICAgICAgIHF1ZXVlSXRlbS5oYXNDcmVhdGVkRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIHF1ZXVlSXRlbS50b2tlblJldGVudGlvblVudGlsID0gZXZlbnQuZXZlbnREYXRhLnRva2VuUmV0ZW50aW9uVW50aWw7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ3JlYXRlZCA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgcGVuZGluZ0dldENvbmZsaWN0UHJvbWlzZXMgPSBnZXRDb25mbGljdFByb21pc2VzLnNsaWNlKCk7XG4gICAgICAgIGdldENvbmZsaWN0UHJvbWlzZXMubGVuZ3RoID0gMDtcbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCByZXNvbHZlciBvZiBwZW5kaW5nR2V0Q29uZmxpY3RQcm9taXNlcykge1xuICAgICAgICAgICAgcmVzb2x2ZXIucmVzb2x2ZShudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgaG9va19jb25mbGljdCBldmVudCAtIGFub3RoZXIgd29ya2Zsb3cgaXMgdXNpbmcgdGhpcyB0b2tlblxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfY29uZmxpY3QnKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGlzIGhvb2sgZnJvbSB0aGUgaW52b2NhdGlvbnMgcXVldWVcbiAgICAgICAgY3R4Lmludm9jYXRpb25zUXVldWUuZGVsZXRlKGNvcnJlbGF0aW9uSWQpO1xuXG4gICAgICAgIC8vIFN0b3JlIHRoZSBjb25mbGljdCBldmVudCBzbyB3ZSBjYW4gcmVqZWN0IGFueSBhd2FpdGVkIHByb21pc2VzLlxuICAgICAgICAvLyBDaGFpbiB0aHJvdWdoIHByb21pc2VRdWV1ZSB0byBlbnN1cmUgZGV0ZXJtaW5pc3RpYyBvcmRlcmluZy5cbiAgICAgICAgY29uc3QgY29uZmxpY3RFdmVudCA9IGV2ZW50IGFzIEhvb2tDb25mbGljdEV2ZW50O1xuICAgICAgICBjb25zdCBjb25mbGljdEVycm9yID0gbmV3IEhvb2tDb25mbGljdEVycm9yKFxuICAgICAgICAgIGNvbmZsaWN0RXZlbnQuZXZlbnREYXRhLnRva2VuLFxuICAgICAgICAgIGNvbmZsaWN0RXZlbnQuZXZlbnREYXRhLmNvbmZsaWN0aW5nUnVuSWRcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBNYXJrIHRoYXQgd2UgaGF2ZSBhIGNvbmZsaWN0IHNvIGZ1dHVyZSBhd2FpdHMgYWxzbyByZWplY3RcbiAgICAgICAgaGFzQ29uZmxpY3QgPSB0cnVlO1xuICAgICAgICBjb25mbGljdEVycm9yUmVmID0gY29uZmxpY3RFcnJvcjtcbiAgICAgICAgY29uZmxpY3RSdW5SZWYgPSBjcmVhdGVDb25mbGljdGluZ1J1bihcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgY29uZmxpY3RFdmVudC5ldmVudERhdGEuY29uZmxpY3RpbmdSdW5JZFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIENhcHR1cmUgYW5kIGRyYWluIHBlbmRpbmcgcHJvbWlzZXMgc3luY2hyb25vdXNseSBzbyB0aGUgbnVsbCBldmVudFxuICAgICAgICAvLyBoYW5kbGVyIHdvbid0IHNlZSB0aGVtIGFuZCB0cmlnZ2VyIGEgc3B1cmlvdXMgV29ya2Zsb3dTdXNwZW5zaW9uLlxuICAgICAgICAvLyBUaGUgYWN0dWFsIHNldHRsZW1lbnRzIGFyZSBkZWZlcnJlZCB0aHJvdWdoIHByb21pc2VRdWV1ZSBmb3JcbiAgICAgICAgLy8gb3JkZXJpbmcuIFBheWxvYWQgYXdhaXRlcnMgcmVqZWN0IHdpdGggSG9va0NvbmZsaWN0RXJyb3IsIHdoaWxlXG4gICAgICAgIC8vIGBnZXRDb25mbGljdGAgYXdhaXRlcnMgcmVzb2x2ZSB3aXRoIHRoZSBjb25mbGljdGluZyBydW4gc28gdGhlXG4gICAgICAgIC8vIHdvcmtmbG93IGNhbiBicmFuY2ggb24gdGhlIGNvbmZsaWN0IHdpdGhvdXQgdGhyb3dpbmcuIFdoZW4gbm9cbiAgICAgICAgLy8gcmVhbCBgUnVuYCBjYW4gYmUgY29uc3RydWN0ZWQgKHNlZSBgY3JlYXRlQ29uZmxpY3RpbmdSdW5gKSxcbiAgICAgICAgLy8gYGdldENvbmZsaWN0YCBhd2FpdGVycyByZWplY3Qgd2l0aCB0aGUgSG9va0NvbmZsaWN0RXJyb3IgaW5zdGVhZFxuICAgICAgICAvLyBvZiByZXNvbHZpbmcgd2l0aCBhIHZhbHVlIHRoYXQgZG9lc24ndCBob25vciB0aGUgYFJ1bmAgY29udHJhY3QuXG4gICAgICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlcyA9IHByb21pc2VzLnNsaWNlKCk7XG4gICAgICAgIHByb21pc2VzLmxlbmd0aCA9IDA7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdHZXRDb25mbGljdFByb21pc2VzID0gZ2V0Q29uZmxpY3RQcm9taXNlcy5zbGljZSgpO1xuICAgICAgICBnZXRDb25mbGljdFByb21pc2VzLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCByZXNvbHZlciBvZiBwZW5kaW5nUHJvbWlzZXMpIHtcbiAgICAgICAgICAgIHJlc29sdmVyLnJlamVjdChjb25mbGljdEVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCByZXNvbHZlciBvZiBwZW5kaW5nR2V0Q29uZmxpY3RQcm9taXNlcykge1xuICAgICAgICAgICAgaWYgKGNvbmZsaWN0UnVuUmVmKSB7XG4gICAgICAgICAgICAgIHJlc29sdmVyLnJlc29sdmUoY29uZmxpY3RSdW5SZWYpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZXIucmVqZWN0KGNvbmZsaWN0RXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJykge1xuICAgICAgICAvLyBSZWdpc3RlciBhICdob29rJyBkZWxpdmVyeSBiYXJyaWVyIGF0IHRoaXMgZXZlbnQncyBsb2cgaW5kZXggc28gYVxuICAgICAgICAvLyBsYXRlci1pbi1sb2cgYHdhaXRfY29tcGxldGVkYCBvciBzdGVwIHJlc3VsdCBpcyBkZWxpdmVyZWQgb25seSBhZnRlclxuICAgICAgICAvLyB0aGlzIGhvb2ssIGFuZCBzbyB0aGlzIGhvb2sgaXMgZGVsaXZlcmVkIG9ubHkgYWZ0ZXIgZXZlcnlcbiAgICAgICAgLy8gZWFybGllci1pbi1sb2cgYHdhaXRfY29tcGxldGVkYCBhbmQgc3RlcCByZXN1bHQg4oCUIGtlZXBpbmcgYW55XG4gICAgICAgIC8vIGBQcm9taXNlLnJhY2VgIChvciBjb25jdXJyZW50LWJyYW5jaCBVTElEIGFsbG9jYXRpb24pIGRldGVybWluaXN0aWNcbiAgICAgICAgLy8gYW5kIGFsaWduZWQgd2l0aCB0aGUgY29tbWl0dGVkIGV2ZW50IGxvZywgcmVnYXJkbGVzcyBvZlxuICAgICAgICAvLyBtaWNyb3Rhc2staG9wIGNvdW50LCBoeWRyYXRpb24gdGltZSwgb3IgcmFjZS1hcmd1bWVudCBvcmRlci5cbiAgICAgICAgLy8gU2VlIGBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnNgLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGUgYmFycmllciBpcyByZWdpc3RlcmVkIEFSTUVEIG9ubHkgd2hlbiBhIGNvbnN1bWVyIGlzIGFscmVhZHlcbiAgICAgICAgLy8gYXdhaXRpbmcsIHNvIHRoaXMgcGF5bG9hZCBpcyBjb21taXR0ZWQgdG8gcmVhY2hpbmcgdGhlIHdvcmtmbG93LiBBXG4gICAgICAgIC8vIGJ1ZmZlcmVkIHBheWxvYWQgaXMgcmVnaXN0ZXJlZCB1bmFybWVkIGFuZCBhcm1lZCBieSBgY2xhaW0oKWA6IHVudGlsXG4gICAgICAgIC8vIGEgY29uc3VtZXIgdGFrZXMgaXQsIGEgbGF0ZXIgc3RlcCByZXN1bHQgbXVzdCBub3QgYmUgb3JkZXJlZCBiZWhpbmRcbiAgICAgICAgLy8gaXQgKHNlZSBgYXdhaXRFYXJsaWVyRGVsaXZlcmllc2ApLlxuICAgICAgICBjb25zdCBldmVudEluZGV4ID0gY3R4LmV2ZW50c0NvbnN1bWVyLmV2ZW50SW5kZXg7XG4gICAgICAgIGNvbnN0IGhhc1dhaXRpbmdDb25zdW1lciA9IHByb21pc2VzLmxlbmd0aCA+IDA7XG4gICAgICAgIGNvbnN0IGJhcnJpZXIgPSByZWdpc3RlckRlbGl2ZXJ5QmFycmllcihjdHgsIGV2ZW50SW5kZXgsICdob29rJywge1xuICAgICAgICAgIGFybWVkOiBoYXNXYWl0aW5nQ29uc3VtZXIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChoYXNXYWl0aW5nQ29uc3VtZXIpIHtcbiAgICAgICAgICAvLyBBIGNvbnN1bWVyIGlzIGFscmVhZHkgYXdhaXRpbmcsIHNvIHRoaXMgcGF5bG9hZCdzIGRlbGl2ZXJ5IGlzXG4gICAgICAgICAgLy8gcGlubmVkIHRvIHRoaXMgbG9nIHBvc2l0aW9uOiBjYXB0dXJlIHRoZSBkZWZlcnJhbCBIRVJFLCB3aGlsZVxuICAgICAgICAgIC8vIGNvbnN1bWluZyB0aGUgZXZlbnQsIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBoeWRyYXRpb24gc2xvdCBiZWxvdyDigJRcbiAgICAgICAgICAvLyBzYW1lIHJlYXNvbmluZyBhcyBzdGVwLnRzLiBBbiBlYXJsaWVyIHN0ZXAgb3IgaG9vayB3aG9zZSBzbG90IHJ1bnNcbiAgICAgICAgICAvLyBmaXJzdCBvbiB0aGlzIHNlcmlhbCBxdWV1ZSBoYXMgdXN1YWxseSBkZWxpdmVyZWQsIGFuZCBzb1xuICAgICAgICAgIC8vIGRlcmVnaXN0ZXJlZCBpdHMgYmFycmllciwgYmVmb3JlIHRoaXMgc2xvdCBlbmRzLiBSZWFkIHRoZW4sIGl0XG4gICAgICAgICAgLy8gd291bGQgYmUgaW52aXNpYmxlIGFuZCB0aGlzIHBheWxvYWQgd291bGQgc2tpcCBib3RoIHRoZSBnYXRlIEFORFxuICAgICAgICAgIC8vIGBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzYCcgbWFjcm90YXNrIHlpZWxkLCBsZXR0aW5nIGl0IG92ZXJ0YWtlIHRoZVxuICAgICAgICAgIC8vIGJyYW5jaCB0aGF0IGVhcmxpZXIgZGVsaXZlcnkganVzdCB3b2tlLiBFdmVyeSBldmVudCBpbiBvbmUgZHJhaW5cbiAgICAgICAgICAvLyB3aW5kb3cgaXMgY29uc3VtZWQgYmVmb3JlIGFueSBzbG90IHJ1bnMsIHNvIGNhcHR1cmluZyBhdFxuICAgICAgICAgIC8vIGNvbnN1bXB0aW9uIHRpbWUgc2VlcyBhbGwgb2YgdGhlbS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoZSBCVUZGRVJFRCBicmFuY2ggYmVsb3cgZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIGRvIHRoaXMg4oCUIHNlZSB0aGVcbiAgICAgICAgICAvLyBjb21tZW50IG9uIGBjbGFpbSgpYC5cbiAgICAgICAgICBjb25zdCBlYXJsaWVyRGVsaXZlcmVkID0gYXdhaXRFYXJsaWVyRGVsaXZlcmllcyhcbiAgICAgICAgICAgIGN0eCxcbiAgICAgICAgICAgIGV2ZW50SW5kZXgsXG4gICAgICAgICAgICAnaG9vaydcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG5leHQgPSBwcm9taXNlcy5zaGlmdCgpO1xuICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICAvLyBIeWRyYXRlIHRocm91Z2ggYSBwcm9taXNlUXVldWUgc2xvdCAoc28gYXN5bmMgZGVzZXJpYWxpemF0aW9uXG4gICAgICAgICAgICAvLyBzdGF5cyBpbiBldmVudC1sb2cgb3JkZXIpLCB0aGVuIGRlZmVyIGJlaGluZCBlYXJsaWVyIHdhaXRzIGFuZFxuICAgICAgICAgICAgLy8gc3RlcHMgYmVmb3JlIHJlc29sdmluZy4gVGhlIGRlZmVycmFsIHJ1bnMgT0ZGIHRoZSBzZXJpYWwgcXVldWVcbiAgICAgICAgICAgIC8vIChpdCBtYXkgd2FpdCBvbiBhbiBlYXJsaWVyIHdhaXQgb3Igc3RlcCBkZWxpdmVyeSBhbmQgYmxvY2tpbmcgYVxuICAgICAgICAgICAgLy8gcXVldWUgc2xvdCBvbiB0aGF0IHdvdWxkIGRlYWRsb2NrIHRoZSBxdWV1ZSkuXG4gICAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMrKztcbiAgICAgICAgICAgIGxldCBoeWRyYXRlT3V0Y29tZTpcbiAgICAgICAgICAgICAgfCB7IG9rOiB0cnVlOyB2YWx1ZTogVCB9XG4gICAgICAgICAgICAgIHwgeyBvazogZmFsc2U7IGVycm9yOiB1bmtub3duIH07XG4gICAgICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmVwYXJlZCA9XG4gICAgICAgICAgICAgICAgICBhd2FpdCBjdHgucmVwbGF5UGF5bG9hZENhY2hlLnByZXBhcmVFdmVudFBheWxvYWQoXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICdwYXlsb2FkJyxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuZXZlbnREYXRhLnBheWxvYWRcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgICAgICAgICBldmVudC5ldmVudERhdGEucGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgIGN0eC5ydW5JZCxcbiAgICAgICAgICAgICAgICAgIGN0eC5lbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgY3R4Lmdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgIHByZXBhcmVkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBoeWRyYXRlT3V0Y29tZSA9IHsgb2s6IHRydWUsIHZhbHVlOiBwYXlsb2FkIGFzIFQgfTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBoeWRyYXRlT3V0Y29tZSA9IHsgb2s6IGZhbHNlLCBlcnJvciB9O1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcy0tO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZvaWQgZWFybGllckRlbGl2ZXJlZC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBiYXJyaWVyLm1hcmtEZWxpdmVyZWQoKTtcbiAgICAgICAgICAgICAgICBpZiAoaHlkcmF0ZU91dGNvbWUub2spIHtcbiAgICAgICAgICAgICAgICAgIG5leHQucmVzb2x2ZShoeWRyYXRlT3V0Y29tZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG5leHQucmVqZWN0KGh5ZHJhdGVPdXRjb21lLmVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIGNvbnN1bWVyIGlzIGF3YWl0aW5nIHlldC4gSHlkcmF0ZSB0aHJvdWdoIGEgcHJvbWlzZVF1ZXVlIHNsb3RcbiAgICAgICAgICAvLyBhdCB0aGlzIGxvZyBwb3NpdGlvbiBhbmQgcGFyayB0aGUgT1VUQ09NRSAodmFsdWUgb3IgZXJyb3IpIGZvciBhXG4gICAgICAgICAgLy8gbGF0ZXIgYGl0ZXJhdG9yLm5leHQoKWAgLyBgYXdhaXQgaG9va2AgY2xhaW0uIFdlIGNhcHR1cmUgdGhlXG4gICAgICAgICAgLy8gb3V0Y29tZSByYXRoZXIgdGhhbiBlYWdlcmx5IHJlc29sdmluZy9yZWplY3RpbmcgYSBwcm9taXNlIG5vXG4gICAgICAgICAgLy8gY29uc3VtZXIgaGFzIGF0dGFjaGVkIHRvIOKAlCBhIHJlamVjdGVkIHVuY2xhaW1lZCBwcm9taXNlIChlLmcuIGFcbiAgICAgICAgICAvLyBidWZmZXJlZCBlbmNyeXB0ZWQgcGF5bG9hZCB3aXRoIG5vIGtleSkgd291bGQgb3RoZXJ3aXNlIHN1cmZhY2VcbiAgICAgICAgICAvLyBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGFuZCBjcmFzaCB0aGUgcHJvY2Vzcy4gYGNsYWltKClgIGJ1aWxkc1xuICAgICAgICAgIC8vIHRoZSBjb25zdW1lci1mYWNpbmcgcHJvbWlzZSBvbiBkZW1hbmQuXG4gICAgICAgICAgbGV0IG91dGNvbWU6XG4gICAgICAgICAgICB8IHsgb2s6IHRydWU7IHZhbHVlOiBUIH1cbiAgICAgICAgICAgIHwgeyBvazogZmFsc2U7IGVycm9yOiB1bmtub3duIH1cbiAgICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IGh5ZHJhdGVkID0gd2l0aFJlc29sdmVyczx2b2lkPigpO1xuXG4gICAgICAgICAgY29uc3QgY2xhaW0gPSAoKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgICAgICAgICAvLyBBIGNvbnN1bWVyIGhhcyB0YWtlbiB0aGlzIHBheWxvYWQsIHNvIGl0cyBkZWxpdmVyeSBubyBsb25nZXJcbiAgICAgICAgICAgIC8vIHdhaXRzIG9uIHdvcmtmbG93IGNvZGU6IGxhdGVyIHN0ZXAgcmVzdWx0cyBtYXkgbm93IGJlIG9yZGVyZWRcbiAgICAgICAgICAgIC8vIGJlaGluZCBpdC5cbiAgICAgICAgICAgIGJhcnJpZXIuYXJtKCk7XG4gICAgICAgICAgICAvLyBVbmxpa2UgZXZlcnkgb3RoZXIgZGVsaXZlcnksIHRoZSBkZWZlcnJhbCBpcyBldmFsdWF0ZWQgSEVSRSwgYXRcbiAgICAgICAgICAgIC8vIGNsYWltIHRpbWUsIHJhdGhlciB0aGFuIHdoZW4gdGhlIGV2ZW50IHdhcyBjb25zdW1lZC4gQSBidWZmZXJlZFxuICAgICAgICAgICAgLy8gcGF5bG9hZCdzIGRlbGl2ZXJ5IGdlbnVpbmVseSBoYXBwZW5zIHdoZW4gdGhlIHdvcmtmbG93IHJlYWRzIHRoZVxuICAgICAgICAgICAgLy8gaG9vaywgd2hpY2ggbWF5IGJlIG1hbnkgZGVsaXZlcmllcyBsYXRlcjsgYSBjb25zdW1wdGlvbi10aW1lXG4gICAgICAgICAgICAvLyBzbmFwc2hvdCB3b3VsZCBtYWtlIHRoZSBjbGFpbSB3YWl0IG9uIOKAlCBhbmQgcGF5IHRoZSBtYWNyb3Rhc2tcbiAgICAgICAgICAgIC8vIHlpZWxkIGZvciDigJQgYmFycmllcnMgdGhhdCB3ZXJlIHJlbGV2YW50IHRvIGEgbW9tZW50IHRoaXMgcGF5bG9hZFxuICAgICAgICAgICAgLy8gbmV2ZXIgcGFydGljaXBhdGVkIGluLiBUaGF0IGlzIG5vdCB0aGVvcmV0aWNhbDogaXQgc3RhbGxzIHRoZVxuICAgICAgICAgICAgLy8gc2Vjb25kIHBheWxvYWQgaW4gdGhlIGUyZSBgaG9va1dpdGhTbGVlcFdvcmtmbG93YCBsb25nIGVub3VnaFxuICAgICAgICAgICAgLy8gZm9yIHRoZSBydW4gdG8gc3VzcGVuZCBiZWZvcmUgZGVsaXZlcmluZyBpdC5cbiAgICAgICAgICAgIHJldHVybiBoeWRyYXRlZC5wcm9taXNlXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IGF3YWl0RWFybGllckRlbGl2ZXJpZXMoY3R4LCBldmVudEluZGV4LCAnaG9vaycpKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgYmFycmllci5tYXJrRGVsaXZlcmVkKCk7XG4gICAgICAgICAgICAgICAgaWYgKG91dGNvbWUgJiYgIW91dGNvbWUub2spIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG91dGNvbWUuZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAob3V0Y29tZSBhcyB7IG9rOiB0cnVlOyB2YWx1ZTogVCB9KS52YWx1ZTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcysrO1xuICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcHJlcGFyZWQgPSBhd2FpdCBjdHgucmVwbGF5UGF5bG9hZENhY2hlLnByZXBhcmVFdmVudFBheWxvYWQoXG4gICAgICAgICAgICAgICAgZXZlbnQuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAncGF5bG9hZCcsXG4gICAgICAgICAgICAgICAgZXZlbnQuZXZlbnREYXRhLnBheWxvYWRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgICAgICAgZXZlbnQuZXZlbnREYXRhLnBheWxvYWQsXG4gICAgICAgICAgICAgICAgY3R4LnJ1bklkLFxuICAgICAgICAgICAgICAgIGN0eC5lbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgIGN0eC5nbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgIHByZXBhcmVkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIG91dGNvbWUgPSB7IG9rOiB0cnVlLCB2YWx1ZTogcGF5bG9hZCBhcyBUIH07XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBvdXRjb21lID0geyBvazogZmFsc2UsIGVycm9yIH07XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMtLTtcbiAgICAgICAgICAgICAgaHlkcmF0ZWQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBheWxvYWRzUXVldWUucHVzaCh7IGNsYWltIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJykge1xuICAgICAgICAvLyBUZXJtaW5hbCBzdGF0ZSAtIHJlbW92ZSBmcm9tIHF1ZXVlIChsaWtlIHN0ZXBfY29tcGxldGVkL3dhaXRfY29tcGxldGVkKVxuICAgICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5kZWxldGUoY29ycmVsYXRpb25JZCk7XG4gICAgICAgIC8vIE1hcmsgdGhhdCB0aGUgZXZlbnQgbG9nIGNvbmZpcm1zIGRpc3Bvc2FsIGhhcHBlbmVkXG4gICAgICAgIGhhc0Rpc3Bvc2VkRXZlbnQgPSB0cnVlO1xuICAgICAgICAvLyBXZSdyZSBkb25lIHByb2Nlc3NpbmcgYW55IG1vcmUgZXZlbnRzIGZvciB0aGlzIGhvb2tcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoaXMgcmVwbGF5IGluc3RhbGxlZCBhIGRpZmZlcmVudCBjb25zdW1lciB0aGFuIHRoZSBzdG9yZWQgZXZlbnQgbmVlZHMuXG4gICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgICAgYFJlcGxheSBkaXZlcmdlbmNlOiBVbmV4cGVjdGVkIGV2ZW50IHR5cGUgZm9yIGhvb2sgJHtjb3JyZWxhdGlvbklkfSAodG9rZW46ICR7dG9rZW59KSBcIiR7ZXZlbnQuZXZlbnRUeXBlfVwiYCxcbiAgICAgICAgICAgIHsgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICB9KTtcblxuICAgIC8vIFRyYWNrIGlmIHRoZSBob29rIGhhcyBiZWVuIGRpc3Bvc2VkXG4gICAgbGV0IGlzRGlzcG9zZWQgPSBmYWxzZTtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgcHJvbWlzZSB0aGF0IHdhaXRzIGZvciB0aGUgbmV4dCBob29rIHBheWxvYWRcbiAgICBmdW5jdGlvbiBjcmVhdGVIb29rUHJvbWlzZSgpOiBQcm9taXNlPFQ+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVycyA9IHdpdGhSZXNvbHZlcnM8VD4oKTtcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBhIGNvbmZsaWN0LCByZWplY3QgdGhyb3VnaCB0aGUgcHJvbWlzZVF1ZXVlIHRvIG1haW50YWluXG4gICAgICAvLyBkZXRlcm1pbmlzdGljIG9yZGVyaW5nIHdpdGggYW55IHByaW9yIHF1ZXVlZCByZXNvbHV0aW9ucy5cbiAgICAgIGlmIChoYXNDb25mbGljdCAmJiBjb25mbGljdEVycm9yUmVmKSB7XG4gICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmVycy5yZWplY3QoY29uZmxpY3RFcnJvclJlZik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXJzLnByb21pc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXlsb2Fkc1F1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgbmV4dERlbGl2ZXJ5ID0gcGF5bG9hZHNRdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAobmV4dERlbGl2ZXJ5KSB7XG4gICAgICAgICAgLy8gVGhlIHBheWxvYWQgd2FzIGh5ZHJhdGVkIHRocm91Z2ggYSBwcm9taXNlUXVldWUgc2xvdCBhdCBpdHMgbG9nXG4gICAgICAgICAgLy8gcG9zaXRpb24gKGJ1ZmZlcmluZyBicmFuY2ggYWJvdmUpLiBgY2xhaW0oKWAgYnVpbGRzIHRoZVxuICAgICAgICAgIC8vIGNvbnN1bWVyLWZhY2luZyBwcm9taXNlIGZyb20gdGhhdCBvdXRjb21lLCBkZWZlcnJpbmcgYmVoaW5kIGFueVxuICAgICAgICAgIC8vIGVhcmxpZXItaW4tbG9nIHdhaXQgb3Igc3RlcCBhbmQgbWFya2luZyB0aGlzIGhvb2sgZGVsaXZlcmVkIOKAlCBzb1xuICAgICAgICAgIC8vIHJlc29sdXRpb24gb3JkZXIgc3RheXMgYW5jaG9yZWQgdG8gdGhlIGV2ZW50IGxvZywgbm90IHRoaXMgbGF0ZXJcbiAgICAgICAgICAvLyBjbGFpbSBzaXRlLlxuICAgICAgICAgIHJldHVybiBuZXh0RGVsaXZlcnkuY2xhaW0oKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRMb2dFbXB0eSkge1xuICAgICAgICBzY2hlZHVsZVdoZW5JZGxlKGN0eCwgKCkgPT4ge1xuICAgICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgICBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKGN0eC5pbnZvY2F0aW9uc1F1ZXVlLCBjdHguZ2xvYmFsVGhpcylcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcHJvbWlzZXMucHVzaChyZXNvbHZlcnMpO1xuXG4gICAgICByZXR1cm4gcmVzb2x2ZXJzLnByb21pc2U7XG4gICAgfVxuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBob29rJ3NcbiAgICAvLyByZWdpc3RyYXRpb24gb3V0Y29tZTogdGhlIGNvbmZsaWN0aW5nIGBSdW5gIHdoZW4gdGhlIHRva2VuIGlzIG93bmVkXG4gICAgLy8gYnkgYW5vdGhlciBhY3RpdmUgaG9vaywgYG51bGxgIG9uY2UgdGhpcyBob29rJ3MgcmVnaXN0cmF0aW9uIGlzXG4gICAgLy8gY29tbWl0dGVkLiBCb3RoIGZhc3QtcGF0aHMgc2V0dGxlIHRocm91Z2ggYGN0eC5wcm9taXNlUXVldWVgIHNvXG4gICAgLy8gcmVzb2x1dGlvbiBvcmRlciBhbHdheXMgbWF0Y2hlcyBldmVudC1sb2cgb3JkZXIuXG4gICAgZnVuY3Rpb24gY3JlYXRlR2V0Q29uZmxpY3RQcm9taXNlKCk6IFByb21pc2U8UnVuPHVua25vd24+IHwgbnVsbD4ge1xuICAgICAgY29uc3QgcmVzb2x2ZXJzID0gd2l0aFJlc29sdmVyczxSdW48dW5rbm93bj4gfCBudWxsPigpO1xuXG4gICAgICBpZiAoaGFzQ3JlYXRlZCkge1xuICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcnMucHJvbWlzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0NvbmZsaWN0KSB7XG4gICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGlmIChjb25mbGljdFJ1blJlZikge1xuICAgICAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUoY29uZmxpY3RSdW5SZWYpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KGNvbmZsaWN0RXJyb3JSZWYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcnMucHJvbWlzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVldWVJdGVtID0gY3R4Lmludm9jYXRpb25zUXVldWUuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICAgICAgaWYgKHF1ZXVlSXRlbSAmJiBxdWV1ZUl0ZW0udHlwZSA9PT0gJ2hvb2snKSB7XG4gICAgICAgIHF1ZXVlSXRlbS5oYXNDb25mbGljdEF3YWl0ZXIgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRMb2dFbXB0eSkge1xuICAgICAgICBzY2hlZHVsZVdoZW5JZGxlKGN0eCwgKCkgPT4ge1xuICAgICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgICBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKGN0eC5pbnZvY2F0aW9uc1F1ZXVlLCBjdHguZ2xvYmFsVGhpcylcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZ2V0Q29uZmxpY3RQcm9taXNlcy5wdXNoKHJlc29sdmVycyk7XG4gICAgICByZXR1cm4gcmVzb2x2ZXJzLnByb21pc2U7XG4gICAgfVxuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGRpc3Bvc2UgdGhlIGhvb2tcbiAgICBmdW5jdGlvbiBkaXNwb3NlSG9vaygpOiB2b2lkIHtcbiAgICAgIGlmIChpc0Rpc3Bvc2VkKSB7XG4gICAgICAgIHJldHVybjsgLy8gQWxyZWFkeSBkaXNwb3NlZCwgbm90aGluZyB0byBkb1xuICAgICAgfVxuICAgICAgaXNEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgIC8vIElmIHRoZSBldmVudCBsb2cgYWxyZWFkeSBjb250YWlucyBob29rX2Rpc3Bvc2VkLCB0aGlzIGlzIGEgcmVwbGF5IOKAlCBuby1vcFxuICAgICAgaWYgKGhhc0Rpc3Bvc2VkRXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgZGlzcG9zZWQgZmxhZyBvbiB0aGUgZXhpc3RpbmcgcXVldWUgaXRlbVxuICAgICAgY29uc3QgcXVldWVJdGVtID0gY3R4Lmludm9jYXRpb25zUXVldWUuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICAgICAgaWYgKHF1ZXVlSXRlbSAmJiBxdWV1ZUl0ZW0udHlwZSA9PT0gJ2hvb2snKSB7XG4gICAgICAgIHF1ZXVlSXRlbS5kaXNwb3NlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIERyYWluIGFueSBwZW5kaW5nIHByb21pc2VzIHRoYXQgYXJlIHdhaXRpbmcgZm9yIHBheWxvYWRzLlxuICAgICAgLy8gV2l0aG91dCB0aGlzLCBwcm9taXNlcyBjcmVhdGVkIGJ5IGBhd2FpdCBob29rYCBvciB0aGUgYXN5bmMgaXRlcmF0b3Inc1xuICAgICAgLy8gYHlpZWxkIGF3YWl0IHRoaXNgIHdvdWxkIGhhbmcgZm9yZXZlciBzaW5jZSB0aGUgZXZlbnQgY29uc3VtZXIgd2lsbFxuICAgICAgLy8gbmV2ZXIgZGVsaXZlciBhbm90aGVyIGhvb2tfcmVjZWl2ZWQgYWZ0ZXIgZGlzcG9zYWwuXG4gICAgICBpZiAocHJvbWlzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBwcm9taXNlcy5sZW5ndGggPSAwO1xuICAgICAgICBzY2hlZHVsZVdoZW5JZGxlKGN0eCwgKCkgPT4ge1xuICAgICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgICBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKGN0eC5pbnZvY2F0aW9uc1F1ZXVlLCBjdHguZ2xvYmFsVGhpcylcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgd2ViaG9va0xvZ2dlci5kZWJ1ZygnSG9vayBkaXNwb3NlZCcsIHsgY29ycmVsYXRpb25JZCwgdG9rZW4gfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaG9vazogSG9vazxUPiA9IHtcbiAgICAgIHRva2VuLFxuXG4gICAgICBnZXRDb25mbGljdCgpOiBQcm9taXNlPFJ1bjx1bmtub3duPiB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUdldENvbmZsaWN0UHJvbWlzZSgpO1xuICAgICAgfSxcblxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RoZW5Qcm9wZXJ0eTogSW50ZW50aW9uYWxseSB0aGVuYWJsZVxuICAgICAgdGhlbjxUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgICAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IG51bGwsXG4gICAgICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsXG4gICAgICApOiBQcm9taXNlPFRSZXN1bHQxIHwgVFJlc3VsdDI+IHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUhvb2tQcm9taXNlKCkudGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCk7XG4gICAgICB9LFxuXG4gICAgICAvLyBTdXBwb3J0IGBmb3IgYXdhaXQgKGNvbnN0IHBheWxvYWQgb2YgaG9vaykgeyDigKYgfWAgc3ludGF4XG4gICAgICBhc3luYyAqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgd2hpbGUgKCFpc0Rpc3Bvc2VkKSB7XG4gICAgICAgICAgeWllbGQgYXdhaXQgdGhpcztcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZGlzcG9zZTogZGlzcG9zZUhvb2ssXG5cbiAgICAgIFtTeW1ib2wuZGlzcG9zZV06IGRpc3Bvc2VIb29rLFxuICAgIH07XG5cbiAgICAvLyBBbHNvIHJlZ2lzdGVyIHdpdGggdGhlIFZNJ3MgU3ltYm9sLmRpc3Bvc2Ugc28gYHVzaW5nYCB3b3JrcyBpbnNpZGVcbiAgICAvLyB0aGUgd29ya2Zsb3cgc2FuZGJveCAodGhlIFZNIG1heSBoYXZlIGEgcG9seWZpbGxlZCBTeW1ib2wuZGlzcG9zZVxuICAgIC8vIHRoYXQgZGlmZmVycyBmcm9tIHRoZSBob3N0J3MpLlxuICAgIGNvbnN0IHZtRGlzcG9zZSA9IGN0eC5nbG9iYWxUaGlzLlN5bWJvbC5kaXNwb3NlO1xuICAgIGlmICh2bURpc3Bvc2UgJiYgdm1EaXNwb3NlICE9PSBTeW1ib2wuZGlzcG9zZSkge1xuICAgICAgKGhvb2sgYXMgYW55KVt2bURpc3Bvc2VdID0gZGlzcG9zZUhvb2s7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhvb2s7XG4gIH07XG59XG4iXX0=
@@ -5,7 +5,7 @@ export { sleep } from '../sleep.js';
5
5
  export { createHook, createWebhook } from './create-hook.js';
6
6
  export { defineHook } from './define-hook.js';
7
7
  export { getWorkflowMetadata } from './get-workflow-metadata.js';
8
- export { experimental_setAttributes, type SetAttributesOptions, setAttributes, } from './set-attributes.js';
8
+ export { type SetAttributesOptions, setAttributes, } from './set-attributes.js';
9
9
  export { getWritable } from './writable-stream.js';
10
10
  export declare function getStepMetadata(): StepMetadata;
11
11
  export declare function resumeHook(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EACL,UAAU,EACV,cAAc,EACd,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACL,0BAA0B,EAC1B,KAAK,oBAAoB,EACzB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAInD,wBAAgB,eAAe,IAAI,YAAY,CAM9C;AACD,wBAAgB,UAAU,SAMzB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EACL,UAAU,EACV,cAAc,EACd,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACL,KAAK,oBAAoB,EACzB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAInD,wBAAgB,eAAe,IAAI,YAAY,CAM9C;AACD,wBAAgB,UAAU,SAMzB"}
@@ -4,7 +4,7 @@ export { sleep } from '../sleep.js';
4
4
  export { createHook, createWebhook } from './create-hook.js';
5
5
  export { defineHook } from './define-hook.js';
6
6
  export { getWorkflowMetadata } from './get-workflow-metadata.js';
7
- export { experimental_setAttributes, setAttributes, } from './set-attributes.js';
7
+ export { setAttributes, } from './set-attributes.js';
8
8
  export { getWritable } from './writable-stream.js';
9
9
  // workflows can't use these functions, but we still need to provide
10
10
  // the export so bundling doesn't fail when step and workflow are in same file
@@ -14,4 +14,4 @@ export function getStepMetadata() {
14
14
  export function resumeHook() {
15
15
  throwUnavailableInWorkflowContext('resumeHook()', 'https://workflow-sdk.dev/docs/api-reference/workflow-api/resume-hook', resumeHook);
16
16
  }
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixpQ0FBaUMsR0FDbEMsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQ0wsVUFBVSxFQUNWLGNBQWMsR0FFZixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUNMLDBCQUEwQixFQUUxQixhQUFhLEdBQ2QsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbkQsb0VBQW9FO0FBQ3BFLDhFQUE4RTtBQUM5RSxNQUFNLFVBQVUsZUFBZTtJQUM3QixxQkFBcUIsQ0FDbkIsbUJBQW1CLEVBQ25CLHdFQUF3RSxFQUN4RSxlQUFlLENBQ2hCLENBQUM7QUFDSixDQUFDO0FBQ0QsTUFBTSxVQUFVLFVBQVU7SUFDeEIsaUNBQWlDLENBQy9CLGNBQWMsRUFDZCxzRUFBc0UsRUFDdEUsVUFBVSxDQUNYLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdGhyb3dOb3RJblN0ZXBDb250ZXh0LFxuICB0aHJvd1VuYXZhaWxhYmxlSW5Xb3JrZmxvd0NvbnRleHQsXG59IGZyb20gJy4uL2NvbnRleHQtZXJyb3JzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RlcE1ldGFkYXRhIH0gZnJvbSAnLi4vc3RlcC9nZXQtc3RlcC1tZXRhZGF0YS5qcyc7XG5cbmV4cG9ydCB7XG4gIEZhdGFsRXJyb3IsXG4gIFJldHJ5YWJsZUVycm9yLFxuICB0eXBlIFJldHJ5YWJsZUVycm9yT3B0aW9ucyxcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5leHBvcnQgdHlwZSB7IEhvb2ssIEhvb2tPcHRpb25zIH0gZnJvbSAnLi4vY3JlYXRlLWhvb2suanMnO1xuZXhwb3J0IHsgc2xlZXAgfSBmcm9tICcuLi9zbGVlcC5qcyc7XG5leHBvcnQgeyBjcmVhdGVIb29rLCBjcmVhdGVXZWJob29rIH0gZnJvbSAnLi9jcmVhdGUtaG9vay5qcyc7XG5leHBvcnQgeyBkZWZpbmVIb29rIH0gZnJvbSAnLi9kZWZpbmUtaG9vay5qcyc7XG5leHBvcnQgeyBnZXRXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSAnLi9nZXQtd29ya2Zsb3ctbWV0YWRhdGEuanMnO1xuZXhwb3J0IHtcbiAgZXhwZXJpbWVudGFsX3NldEF0dHJpYnV0ZXMsXG4gIHR5cGUgU2V0QXR0cmlidXRlc09wdGlvbnMsXG4gIHNldEF0dHJpYnV0ZXMsXG59IGZyb20gJy4vc2V0LWF0dHJpYnV0ZXMuanMnO1xuZXhwb3J0IHsgZ2V0V3JpdGFibGUgfSBmcm9tICcuL3dyaXRhYmxlLXN0cmVhbS5qcyc7XG5cbi8vIHdvcmtmbG93cyBjYW4ndCB1c2UgdGhlc2UgZnVuY3Rpb25zLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBwcm92aWRlXG4vLyB0aGUgZXhwb3J0IHNvIGJ1bmRsaW5nIGRvZXNuJ3QgZmFpbCB3aGVuIHN0ZXAgYW5kIHdvcmtmbG93IGFyZSBpbiBzYW1lIGZpbGVcbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGVwTWV0YWRhdGEoKTogU3RlcE1ldGFkYXRhIHtcbiAgdGhyb3dOb3RJblN0ZXBDb250ZXh0KFxuICAgICdnZXRTdGVwTWV0YWRhdGEoKScsXG4gICAgJ2h0dHBzOi8vd29ya2Zsb3ctc2RrLmRldi9kb2NzL2FwaS1yZWZlcmVuY2Uvd29ya2Zsb3cvZ2V0LXN0ZXAtbWV0YWRhdGEnLFxuICAgIGdldFN0ZXBNZXRhZGF0YVxuICApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc3VtZUhvb2soKSB7XG4gIHRocm93VW5hdmFpbGFibGVJbldvcmtmbG93Q29udGV4dChcbiAgICAncmVzdW1lSG9vaygpJyxcbiAgICAnaHR0cHM6Ly93b3JrZmxvdy1zZGsuZGV2L2RvY3MvYXBpLXJlZmVyZW5jZS93b3JrZmxvdy1hcGkvcmVzdW1lLWhvb2snLFxuICAgIHJlc3VtZUhvb2tcbiAgKTtcbn1cbiJdfQ==
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixpQ0FBaUMsR0FDbEMsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQ0wsVUFBVSxFQUNWLGNBQWMsR0FFZixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUVMLGFBQWEsR0FDZCxNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxvRUFBb0U7QUFDcEUsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSxlQUFlO0lBQzdCLHFCQUFxQixDQUNuQixtQkFBbUIsRUFDbkIsd0VBQXdFLEVBQ3hFLGVBQWUsQ0FDaEIsQ0FBQztBQUNKLENBQUM7QUFDRCxNQUFNLFVBQVUsVUFBVTtJQUN4QixpQ0FBaUMsQ0FDL0IsY0FBYyxFQUNkLHNFQUFzRSxFQUN0RSxVQUFVLENBQ1gsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0aHJvd05vdEluU3RlcENvbnRleHQsXG4gIHRocm93VW5hdmFpbGFibGVJbldvcmtmbG93Q29udGV4dCxcbn0gZnJvbSAnLi4vY29udGV4dC1lcnJvcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGVwTWV0YWRhdGEgfSBmcm9tICcuLi9zdGVwL2dldC1zdGVwLW1ldGFkYXRhLmpzJztcblxuZXhwb3J0IHtcbiAgRmF0YWxFcnJvcixcbiAgUmV0cnlhYmxlRXJyb3IsXG4gIHR5cGUgUmV0cnlhYmxlRXJyb3JPcHRpb25zLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmV4cG9ydCB0eXBlIHsgSG9vaywgSG9va09wdGlvbnMgfSBmcm9tICcuLi9jcmVhdGUtaG9vay5qcyc7XG5leHBvcnQgeyBzbGVlcCB9IGZyb20gJy4uL3NsZWVwLmpzJztcbmV4cG9ydCB7IGNyZWF0ZUhvb2ssIGNyZWF0ZVdlYmhvb2sgfSBmcm9tICcuL2NyZWF0ZS1ob29rLmpzJztcbmV4cG9ydCB7IGRlZmluZUhvb2sgfSBmcm9tICcuL2RlZmluZS1ob29rLmpzJztcbmV4cG9ydCB7IGdldFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tICcuL2dldC13b3JrZmxvdy1tZXRhZGF0YS5qcyc7XG5leHBvcnQge1xuICB0eXBlIFNldEF0dHJpYnV0ZXNPcHRpb25zLFxuICBzZXRBdHRyaWJ1dGVzLFxufSBmcm9tICcuL3NldC1hdHRyaWJ1dGVzLmpzJztcbmV4cG9ydCB7IGdldFdyaXRhYmxlIH0gZnJvbSAnLi93cml0YWJsZS1zdHJlYW0uanMnO1xuXG4vLyB3b3JrZmxvd3MgY2FuJ3QgdXNlIHRoZXNlIGZ1bmN0aW9ucywgYnV0IHdlIHN0aWxsIG5lZWQgdG8gcHJvdmlkZVxuLy8gdGhlIGV4cG9ydCBzbyBidW5kbGluZyBkb2Vzbid0IGZhaWwgd2hlbiBzdGVwIGFuZCB3b3JrZmxvdyBhcmUgaW4gc2FtZSBmaWxlXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RlcE1ldGFkYXRhKCk6IFN0ZXBNZXRhZGF0YSB7XG4gIHRocm93Tm90SW5TdGVwQ29udGV4dChcbiAgICAnZ2V0U3RlcE1ldGFkYXRhKCknLFxuICAgICdodHRwczovL3dvcmtmbG93LXNkay5kZXYvZG9jcy9hcGktcmVmZXJlbmNlL3dvcmtmbG93L2dldC1zdGVwLW1ldGFkYXRhJyxcbiAgICBnZXRTdGVwTWV0YWRhdGFcbiAgKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXN1bWVIb29rKCkge1xuICB0aHJvd1VuYXZhaWxhYmxlSW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ3Jlc3VtZUhvb2soKScsXG4gICAgJ2h0dHBzOi8vd29ya2Zsb3ctc2RrLmRldi9kb2NzL2FwaS1yZWZlcmVuY2Uvd29ya2Zsb3ctYXBpL3Jlc3VtZS1ob29rJyxcbiAgICByZXN1bWVIb29rXG4gICk7XG59XG4iXX0=