@workflow/core 5.0.0-beta.41 → 5.0.0-beta.43

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 (65) hide show
  1. package/dist/create-hook.d.ts +9 -5
  2. package/dist/create-hook.d.ts.map +1 -1
  3. package/dist/create-hook.js +1 -1
  4. package/dist/events-consumer.d.ts +97 -0
  5. package/dist/events-consumer.d.ts.map +1 -1
  6. package/dist/events-consumer.js +147 -14
  7. package/dist/private.d.ts +31 -12
  8. package/dist/private.d.ts.map +1 -1
  9. package/dist/private.js +149 -26
  10. package/dist/runtime/constants.d.ts +62 -0
  11. package/dist/runtime/constants.d.ts.map +1 -1
  12. package/dist/runtime/constants.js +70 -1
  13. package/dist/runtime/helpers.d.ts +127 -93
  14. package/dist/runtime/helpers.d.ts.map +1 -1
  15. package/dist/runtime/helpers.js +149 -132
  16. package/dist/runtime/quickjs-entrypoint.d.ts +10 -9
  17. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  18. package/dist/runtime/quickjs-entrypoint.js +162 -38
  19. package/dist/runtime/replay-budget.d.ts +8 -0
  20. package/dist/runtime/replay-budget.d.ts.map +1 -1
  21. package/dist/runtime/replay-budget.js +3 -3
  22. package/dist/runtime/resume-hook.d.ts.map +1 -1
  23. package/dist/runtime/resume-hook.js +53 -13
  24. package/dist/runtime/resume-latency.d.ts +143 -0
  25. package/dist/runtime/resume-latency.d.ts.map +1 -0
  26. package/dist/runtime/resume-latency.js +153 -0
  27. package/dist/runtime/run.d.ts.map +1 -1
  28. package/dist/runtime/run.js +54 -29
  29. package/dist/runtime/step-executor.d.ts +76 -13
  30. package/dist/runtime/step-executor.d.ts.map +1 -1
  31. package/dist/runtime/step-executor.js +171 -19
  32. package/dist/runtime/step-latency.d.ts +6 -0
  33. package/dist/runtime/step-latency.d.ts.map +1 -1
  34. package/dist/runtime/step-latency.js +3 -1
  35. package/dist/runtime/suspension-handler.d.ts +119 -8
  36. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  37. package/dist/runtime/suspension-handler.js +643 -46
  38. package/dist/runtime/world-compatibility.d.ts +6 -5
  39. package/dist/runtime/world-compatibility.d.ts.map +1 -1
  40. package/dist/runtime/world-compatibility.js +7 -6
  41. package/dist/runtime.d.ts.map +1 -1
  42. package/dist/runtime.js +583 -142
  43. package/dist/serialization/codec-devalue.d.ts.map +1 -1
  44. package/dist/serialization/codec-devalue.js +15 -4
  45. package/dist/serialization.d.ts +10 -2
  46. package/dist/serialization.d.ts.map +1 -1
  47. package/dist/serialization.js +55 -8
  48. package/dist/telemetry/semantic-conventions.d.ts +81 -0
  49. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  50. package/dist/telemetry/semantic-conventions.js +67 -1
  51. package/dist/telemetry.d.ts +6 -0
  52. package/dist/telemetry.d.ts.map +1 -1
  53. package/dist/telemetry.js +22 -1
  54. package/dist/test-support/orchestrator-context.d.ts +25 -0
  55. package/dist/test-support/orchestrator-context.d.ts.map +1 -0
  56. package/dist/test-support/orchestrator-context.js +91 -0
  57. package/dist/version.d.ts +1 -1
  58. package/dist/version.js +2 -2
  59. package/dist/workflow/create-hook.js +2 -2
  60. package/dist/workflow/hook.js +3 -3
  61. package/dist/workflow.js +43 -2
  62. package/docs/foundations/hooks.mdx +2 -2
  63. package/docs/foundations/streaming.mdx +24 -0
  64. package/docs/how-it-works/event-sourcing.mdx +39 -1
  65. package/package.json +5 -5
@@ -187,6 +187,75 @@ export function getMaxInlineSteps() {
187
187
  }
188
188
  return parsed;
189
189
  }
190
+ /**
191
+ * Upper bound on the serialized step input that resilient step dispatch will
192
+ * inline into the queue message's `stepInput`.
193
+ *
194
+ * Vercel Queues has no hard message-size cap (bodies above its ~256 KB
195
+ * inline threshold transparently spill to S3-backed storage), so this bound
196
+ * is a cost/latency choice, not a rejection guard: the message also carries
197
+ * the runId, stepId, stepName, and trace carrier alongside CBOR framing
198
+ * overhead, and staying under the queue's inline threshold keeps step
199
+ * messages on its fast inline path instead of paying an S3 store+fetch
200
+ * double-hop for bytes that already live in the event log. Above this size
201
+ * the dispatch falls back to the sequential path (`step_created` write, then
202
+ * a payload-less queue message). Matches `MAX_INLINE_RESUME_PAYLOAD_BYTES`
203
+ * on the resilient hook resume path.
204
+ */
205
+ export const MAX_RESILIENT_STEP_INPUT_BYTES = 128 * 1024;
206
+ /**
207
+ * Whether resilient step dispatch is enabled: the suspension handler
208
+ * parallelizes each newly created step's `step_created` event write with its
209
+ * step-execution queue publish, carrying the serialized step input in the
210
+ * queue message (`stepInput`) so the consumer can idempotently re-ensure the
211
+ * event if the direct write failed transiently. Mirrors the resilient start
212
+ * (`runInput`) and resilient hook resume (`hookInput`) patterns.
213
+ *
214
+ * **Off by default.** Enable via `WORKFLOW_RESILIENT_STEP_DISPATCH=1`.
215
+ *
216
+ * The queue publish races the create's verdict, and a create can come back
217
+ * refused — as a duplicate this replay should stop pursuing, or as a stale
218
+ * write on a World that refuses rather than reports. Either way the message
219
+ * carrying the payload is already out, so the consumer can materialize a step
220
+ * whose create was refused, and nothing orders the verdict before the
221
+ * consumer's redelivery re-ensure. Enabling this trades that window for the
222
+ * latency the parallel publish saves.
223
+ */
224
+ export function isResilientStepDispatchEnabled() {
225
+ return process.env.WORKFLOW_RESILIENT_STEP_DISPATCH === '1';
226
+ }
227
+ /**
228
+ * Whether batched event transitions are enabled: the suspension handler folds
229
+ * a clean fan-out's `step_created` + `wait_created` writes into one
230
+ * `world.events.createBatch` call (one durable write, per-event outcomes)
231
+ * instead of one write per event. Only engages when the World implements the
232
+ * optional `events.createBatch` AND the run is on slot identity
233
+ * (specVersion >= 6) AND the suspension carries no attribute/hook writes and
234
+ * no resilient step dispatch — everything else keeps the single-event path
235
+ * byte-for-byte.
236
+ *
237
+ * Reads `process.env.WORKFLOW_BATCH_TRANSITIONS` lazily. Default **ON**;
238
+ * disabled only by an explicit `'0'` / `'false'` (case-insensitive) — the
239
+ * operator escape hatch that restores the exact prior one-write-per-event
240
+ * path, mirroring `WORKFLOW_TURBO`'s kill-switch shape.
241
+ */
242
+ export function isBatchTransitionsEnabled() {
243
+ const raw = process.env.WORKFLOW_BATCH_TRANSITIONS;
244
+ if (raw === undefined || raw === '')
245
+ return true;
246
+ return !(raw === '0' || raw.toLowerCase() === 'false');
247
+ }
248
+ /**
249
+ * Ceiling on events per `createBatch` call from the batched fan-out fold.
250
+ * Mirrors the server's transaction budgets with a comfortable margin: each
251
+ * fan-out event costs 2 transaction items server-side (entity + event row)
252
+ * against the 100-item DynamoDB cap, and inline payloads count against a
253
+ * 768 KB byte budget — 32 events stays well under both, and a fan-out larger
254
+ * than this simply commits in successive batches (split batches lose
255
+ * cross-batch atomicity, which is exactly today's per-event-write crash
256
+ * surface — every batch still converges on retry via per-event 409s).
257
+ */
258
+ export const MAX_BATCH_FANOUT_EVENTS = 32;
190
259
  const warnedMaxEventsValues = new Set();
191
260
  /**
192
261
  * Optional client-side override for the server-supplied per-run event ceiling.
@@ -433,4 +502,4 @@ export const DEPLOYMENT_MISMATCH_MAX_RETRIES = 3;
433
502
  export function getDeploymentMismatchMaxRetries() {
434
503
  return envNumber('WORKFLOW_DEPLOYMENT_MISMATCH_MAX_RETRIES', DEPLOYMENT_MISMATCH_MAX_RETRIES, { integer: true, min: 0 });
435
504
  }
436
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdDLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLG9EQUFvRDtBQUNwRCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLHNEQUFzRDtBQUN0RCwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSx5RUFBeUU7QUFDekUsK0VBQStFO0FBQy9FLDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0Usc0JBQXNCO0FBQ3RCLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztBQUV2Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsd0VBQXdFO0lBQ3hFLDBFQUEwRTtJQUMxRSw4RUFBOEU7SUFDOUUseUVBQXlFO0lBQ3pFLDRFQUE0RTtJQUM1RSxPQUFPLFNBQVMsQ0FBQywrQkFBK0IsRUFBRSxvQkFBb0IsRUFBRTtRQUN0RSxPQUFPLEVBQUUsSUFBSTtRQUNiLEdBQUcsRUFBRSxDQUFDO1FBQ04sR0FBRyxFQUFFLG9CQUFvQjtLQUMxQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztBQUV6QywyREFBMkQ7QUFDM0QsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDO0FBRTVDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxPQUFPLENBQUM7QUFFN0Ms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U0FBUyxDQUNkLHlDQUF5QyxFQUN6Qyw4QkFBOEIsRUFDOUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQ2xCLENBQUM7QUFDSixDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMkVBQTJFO0FBQzNFLE1BQU0sQ0FBQyxNQUFNLG1DQUFtQyxHQUFHLENBQUMsQ0FBQztBQUVyRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUNBQW1DO0lBQ2pELE9BQU8sU0FBUyxDQUNkLDhDQUE4QyxFQUM5QyxtQ0FBbUMsRUFDbkMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQ2xCLENBQUM7QUFDSixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw0REFBNEQ7QUFDNUQsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsQ0FBQyxDQUFDO0FBRWpEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsK0JBQStCO0lBQzdDLE9BQU8sU0FBUyxDQUNkLDBDQUEwQyxFQUMxQywrQkFBK0IsRUFDL0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FDMUIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlbnZOdW1iZXIgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5cbi8vIE1heGltdW0gbnVtYmVyIG9mIHF1ZXVlIGRlbGl2ZXJ5IGF0dGVtcHRzIGJlZm9yZSB0aGUgaGFuZGxlciBnaXZlcyB1cCBhbmRcbi8vIGdyYWNlZnVsbHkgZmFpbHMgdGhlIHJ1bi9zdGVwLiBUaGlzIG11c3QgYmUgYm91bmRlZCB1bmRlciB0aGUgVlFTIG1lc3NhZ2Vcbi8vIG1heCB2aXNpYmlsaXR5IHdpbmRvdyAoMjQgaG91cnMpIHNvIHRoYXQgb3VyIGhhbmRsZXItc2lkZSBmYWlsdXJlIHBhdGhcbi8vIHJlbGlhYmx5IGV4ZWN1dGVzIGJlZm9yZSBWUVMgZXhwaXJlcyB0aGUgbWVzc2FnZS5cbi8vXG4vLyBUaGUgZWZmZWN0aXZlIHdhbGwtY2xvY2sgc3Vydml2YWwgZGVwZW5kcyBvbiB0aGUgcGVyLXJlZGVsaXZlcnkgYmFja29mZjogdGhlXG4vLyBgcmV0cnktYWZ0ZXJgIHRoZSBoYW5kbGVyIHJldHVybnMgKHNlZSB3b3JsZC12ZXJjZWxcbi8vIGBnZXRIYW5kbGVyRXJyb3JSZXRyeUFmdGVyU2Vjb25kc2ApIGZlZCB0aHJvdWdoIFZRUyBgY2FsY3VsYXRlQmFja29mZkRlbGF5YC5cbi8vIFZRUyB1c2VzIG91ciB2YWx1ZSBmb3IgdGhlIGZpcnN0IDMyIGF0dGVtcHRzIChjbGFtcGVkIHRvIFs1cywgOTAwc10pIHRoZW5cbi8vIGFwcGxpZXMgaXRzIG93biBleHBvbmVudGlhbCBncm93dGgg4oCUIGV2ZXJ5IGhvcCBoYXJkLWNhcHBlZCBhdCB0aGUgU1FTIGxpbWl0XG4vLyBvZiA5MDBzLiBXaXRoIHRoZSBiYWNrb2ZmIHJhbXBpbmcgdG93YXJkIHRoYXQgOTAwcyBjZWlsaW5nIChyZWFjaGVkIGJ5XG4vLyB+ZGVsaXZlcnkgMTEpLCA0OCBhdHRlbXB0cyBzcGFuIHJvdWdobHkgOeKAkzEwIGhvdXJzIG9mIHdhbGwtY2xvY2sgKH4zNSwwMDBzKSxcbi8vIGNvbWZvcnRhYmx5IHVuZGVyIHRoZSAyNC1ob3VyIG1lc3NhZ2UtdmlzaWJpbGl0eSBsaW1pdCBzbyB0aGUgZmFpbHVyZSBwYXRoXG4vLyBydW5zIGJlZm9yZSB0aGUgbWVzc2FnZSBleHBpcmVzLiAoQSBmbGF0dGVyLCBsb3ctY2FwcGVkIGJhY2tvZmYgZXhoYXVzdHMgdGhlXG4vLyBidWRnZXQgaW4gb25seSBhIGZldyBob3VycywgZmFpbGluZyBvdGhlcndpc2UtaGVhbHRoeSBydW5zIGR1cmluZyBhIHRyYW5zaWVudFxuLy8gYmFja2VuZCBvdXRhZ2U7IGNvbnZlcnNlbHksIHNwYW5uaW5nIHRoZSBmdWxsIDI0aCB3aW5kb3cgd291bGQgcmVxdWlyZSBhXG4vLyBzdWJzdGFudGlhbGx5IGhpZ2hlciBjYXAgaGVyZSwgbm90IGEgaGlnaGVyIHBlci1ob3AgY2VpbGluZyDigJQgVlFTIGNsYW1wc1xuLy8gZXZlcnkgaG9wIGF0IDkwMHMuKVxuZXhwb3J0IGNvbnN0IE1BWF9RVUVVRV9ERUxJVkVSSUVTID0gNDg7XG5cbi8qKlxuICogRWZmZWN0aXZlIG1heCBxdWV1ZSBkZWxpdmVyaWVzLiBPdmVycmlkZSB2aWEgYFdPUktGTE9XX01BWF9RVUVVRV9ERUxJVkVSSUVTYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1heFF1ZXVlRGVsaXZlcmllcygpOiBudW1iZXIge1xuICAvLyBPbmx5IGV2ZXIgbG93ZXIgdGhlIGRlbGl2ZXJ5IGJ1ZGdldC4gVGhlIGRlZmF1bHQgaXMgY2FsaWJyYXRlZCBzbyB0aGVcbiAgLy8gaGFuZGxlci1zaWRlIGZhaWx1cmUgcGF0aCBydW5zIGJlZm9yZSBWUVMgbWVzc2FnZS1yZXRlbnRpb24gZXhwaXJ5IChzZWVcbiAgLy8gTUFYX1FVRVVFX0RFTElWRVJJRVMgYWJvdmUpOyBhIGhpZ2hlciB2YWx1ZSB3b3VsZCBieXBhc3MgdGhhdCBpbnZhcmlhbnQgYW5kXG4gIC8vIGxldCBhIGJhZCBkZXBsb3ltZW50IHJlZGVsaXZlciB1bnRpbCBxdWV1ZSBleHBpcnkgaW5zdGVhZCBvZiByZWNvcmRpbmdcbiAgLy8gcnVuX2ZhaWwuIGBtYXhgIGNsYW1wcyBhIHRvby1oaWdoIG92ZXJyaWRlIGJhY2sgZG93biB0byB0aGUgc2FmZSBkZWZhdWx0LlxuICByZXR1cm4gZW52TnVtYmVyKCdXT1JLRkxPV19NQVhfUVVFVUVfREVMSVZFUklFUycsIE1BWF9RVUVVRV9ERUxJVkVSSUVTLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IDEsXG4gICAgbWF4OiBNQVhfUVVFVUVfREVMSVZFUklFUyxcbiAgfSk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgYWxsb3dlZCBmb3IgdGhlICpyZXBsYXkqIHBvcnRpb24gb2YgYSBzaW5nbGUgd29ya2Zsb3dcbiAqIGhhbmRsZXIgaW52b2NhdGlvbiAoaW4gbXMpLiBUaGlzIGJ1ZGdldCBvbmx5IGNvdmVycyBkZXRlcm1pbmlzdGljLXJlcGxheVxuICogYW5kIHdvcmtmbG93LVZNIGV4ZWN1dGlvbiBiZXR3ZWVuIHN0ZXAgYm91bmRhcmllcyDigJQgaW5saW5lIHN0ZXAgYm9kaWVzXG4gKiAoYFwidXNlIHN0ZXBcImAgZnVuY3Rpb25zIGludm9rZWQgdmlhIGBleGVjdXRlU3RlcGApIGRvIE5PVCBjb3VudCBhZ2FpbnN0XG4gKiBpdC4gU3RlcCBib2RpZXMgYXJlIGJvdW5kZWQgc2VwYXJhdGVseSBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvblxuICogYG1heER1cmF0aW9uYCAoZS5nLiA4MDBzIG9uIFZlcmNlbCBQcm8gRmx1aWQpIGFuZCBgTk9fSU5MSU5FX1JFUExBWV9BRlRFUl9NU2AuXG4gKlxuICogSWYgdGhlIG5vbi1zdGVwIChcInJlcGxheVwiKSB0aW1lIHdpdGhpbiBhIHNpbmdsZSBpbnZvY2F0aW9uIGV4Y2VlZHMgdGhpc1xuICogYnVkZ2V0LCB0aGUgaGFuZGxlciByZWplY3RzIHNvIHRoZSBxdWV1ZSBjYW4gcmV0cnkuIEFmdGVyXG4gKiBgUkVQTEFZX1RJTUVPVVRfTUFYX1JFVFJJRVNgIGV4aGF1c3RlZCBhdHRlbXB0cyB0aGUgcnVuIGlzIGZhaWxlZCB3aXRoXG4gKiBgUlVOX0VSUk9SX0NPREVTLlJFUExBWV9USU1FT1VUYC5cbiAqXG4gKiBOb3RlIHRoYXQgb24gVmVyY2VsIEhvYmJ5IChzdGFuZGFyZCBmdW5jdGlvbnMpLCB0aGUgcGxhdGZvcm0gYG1heER1cmF0aW9uYFxuICogaXMgNjBzIOKAlCB3ZWxsIGJlbG93IHRoaXMgYnVkZ2V0LCBzbyB0aGUgcGxhdGZvcm0gU0lHVEVSTSB3aWxsIGZpcmUgZmlyc3RcbiAqIGFuZCB0aGUgcXVldWUgd2lsbCByZS1kZWxpdmVyIHVudGlsIHRoZSB2aXNpYmlsaXR5IHdpbmRvdyBleHBpcmVzLiBXaXRoXG4gKiBGbHVpZCBDb21wdXRlIG9uIEhvYmJ5IHRoZSBwZXItZnVuY3Rpb24gY2VpbGluZyByaXNlcyB0byAzMDBzLCBzdGlsbFxuICogdW5kZXIgdGhlIGRlZmF1bHQgYnVkZ2V0LlxuICpcbiAqIE92ZXJyaWRlIHZpYSB0aGUgYFdPUktGTE9XX1JFUExBWV9USU1FT1VUX01TYCBlbnYgdmFyIChjbGFtcGVkIHRvXG4gKiBgTUlOX1JFUExBWV9USU1FT1VUX01TYC4uYE1BWF9SRVBMQVlfVElNRU9VVF9NU2ApLlxuICovXG5leHBvcnQgY29uc3QgUkVQTEFZX1RJTUVPVVRfTVMgPSAyNDBfMDAwO1xuXG4vKiogTG93ZXIgYm91bmQgZm9yIHRoZSByZXBsYXktdGltZW91dCBlbnYgdmFyIG92ZXJyaWRlLiAqL1xuZXhwb3J0IGNvbnN0IE1JTl9SRVBMQVlfVElNRU9VVF9NUyA9IDMwXzAwMDtcblxuLyoqXG4gKiBVcHBlciBib3VuZCBmb3IgdGhlIHJlcGxheS10aW1lb3V0IGVudiB2YXIgb3ZlcnJpZGUuIDc4MHMgbGVhdmVzIOKJpTIwcyBvZlxuICogaGVhZHJvb20gdW5kZXIgVmVyY2VsIFBybyBGbHVpZCdzIDgwMHMgZnVuY3Rpb24gY2VpbGluZyBzbyB0aGUgaGFuZGxlclxuICogY2FuIHdyaXRlIGBydW5fZmFpbGVkYCBiZWZvcmUgU0lHVEVSTS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9SRVBMQVlfVElNRU9VVF9NUyA9IDc4MF8wMDA7XG5cbi8vIFRyYWNrIHdoaWNoIHJhdyBlbnYgdmFyIHZhbHVlcyB3ZSd2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dCBzbyB0aGUgd2FybmluZ1xuLy8gbG9nIG9ubHkgZmlyZXMgb25jZSBwZXIgcHJvY2VzcyAodGhlIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbWFueSB0aW1lcykuXG5jb25zdCB3YXJuZWRSZXBsYXlUaW1lb3V0VmFsdWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbmZ1bmN0aW9uIHdhcm5PbmNlKFxuICByYXc6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogdm9pZCB7XG4gIGlmICh3YXJuZWRSZXBsYXlUaW1lb3V0VmFsdWVzLmhhcyhyYXcpKSByZXR1cm47XG4gIHdhcm5lZFJlcGxheVRpbWVvdXRWYWx1ZXMuYWRkKHJhdyk7XG4gIHJ1bnRpbWVMb2dnZXIud2FybihtZXNzYWdlLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBlZmZlY3RpdmUgcmVwbGF5LXRpbWVvdXQgYnVkZ2V0IGZvciB0aGUgY3VycmVudCBwcm9jZXNzLlxuICpcbiAqIFJlYWRzIGBwcm9jZXNzLmVudi5XT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NU2AgbGF6aWx5IHNvIHRlc3RzIGFuZFxuICogZGVwbG95bWVudHMgY2FuIG92ZXJyaWRlIHBlciBpbnZvY2F0aW9uLiBJbnZhbGlkIC8gb3V0LW9mLXJhbmdlIHZhbHVlc1xuICogZmFsbCBiYWNrIHRvIGEgc2FmZSB2YWx1ZSAobm8gdGhyb3cg4oCUIHRoZSBlbnYgdmFyIGlzIGFuIGVzY2FwZSBoYXRjaCxcbiAqIG5vdCBhIGhhcmQgcmVxdWlyZW1lbnQpIGFuZCBlbWl0IGEgb25lLXRpbWUgd2FybmluZyBzbyBtaXNjb25maWd1cmF0aW9uXG4gKiBpcyBvYnNlcnZhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVwbGF5VGltZW91dE1zKCk6IG51bWJlciB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX1JFUExBWV9USU1FT1VUX01TO1xuICBpZiAoIXJhdykgcmV0dXJuIFJFUExBWV9USU1FT1VUX01TO1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIocmF3KTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSB8fCBwYXJzZWQgPD0gMCkge1xuICAgIHdhcm5PbmNlKFxuICAgICAgcmF3LFxuICAgICAgJ0lnbm9yaW5nIFdPUktGTE9XX1JFUExBWV9USU1FT1VUX01TOiBub3QgYSBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyOyB1c2luZyBkZWZhdWx0JyxcbiAgICAgIHsgcmF3LCBkZWZhdWx0TXM6IFJFUExBWV9USU1FT1VUX01TIH1cbiAgICApO1xuICAgIHJldHVybiBSRVBMQVlfVElNRU9VVF9NUztcbiAgfVxuICBpZiAocGFyc2VkIDwgTUlOX1JFUExBWV9USU1FT1VUX01TKSB7XG4gICAgd2Fybk9uY2UocmF3LCAnV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTVMgYmVsb3cgbWluaW11bTsgY2xhbXBlZCcsIHtcbiAgICAgIHJhdyxcbiAgICAgIGNsYW1wZWRNczogTUlOX1JFUExBWV9USU1FT1VUX01TLFxuICAgICAgbWluTXM6IE1JTl9SRVBMQVlfVElNRU9VVF9NUyxcbiAgICB9KTtcbiAgICByZXR1cm4gTUlOX1JFUExBWV9USU1FT1VUX01TO1xuICB9XG4gIGlmIChwYXJzZWQgPiBNQVhfUkVQTEFZX1RJTUVPVVRfTVMpIHtcbiAgICB3YXJuT25jZShyYXcsICdXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NUyBhYm92ZSBtYXhpbXVtOyBjbGFtcGVkJywge1xuICAgICAgcmF3LFxuICAgICAgY2xhbXBlZE1zOiBNQVhfUkVQTEFZX1RJTUVPVVRfTVMsXG4gICAgICBtYXhNczogTUFYX1JFUExBWV9USU1FT1VUX01TLFxuICAgIH0pO1xuICAgIHJldHVybiBNQVhfUkVQTEFZX1RJTUVPVVRfTVM7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBSZXNldCB0aGUgd2Fybi1vbmNlIGNhY2hlLiBUZXN0LW9ubHkg4oCUIGV4cG9ydGVkIHNvIHVuaXQgdGVzdHMgY2FuXG4gKiBleGVyY2lzZSB0aGUgd2FybiBwYXRoIHJlcGVhdGVkbHkgd2l0aG91dCBzaGFyaW5nIHN0YXRlLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0UmVwbGF5VGltZW91dFdhcm5DYWNoZUZvclRlc3RzKCk6IHZvaWQge1xuICB3YXJuZWRSZXBsYXlUaW1lb3V0VmFsdWVzLmNsZWFyKCk7XG59XG5cbi8vIE51bWJlciBvZiBxdWV1ZSBkZWxpdmVyeSBhdHRlbXB0cyB0byBhbGxvdyBiZWZvcmUgcGVybWFuZW50bHkgZmFpbGluZyBhIHJ1blxuLy8gZHVlIHRvIGEgcmVwbGF5IHRpbWVvdXQuIE9uIGF0dGVtcHRzIDEgdGhyb3VnaCB0aGlzIHZhbHVlLCB0aGUgdGltZW91dFxuLy8gaGFuZGxlciByZWplY3RzIHdpdGhvdXQgd3JpdGluZyBydW5fZmFpbGVkIHNvIHRoZSBxdWV1ZSByZXRyaWVzIHRoZSBtZXNzYWdlLlxuLy8gT24gdGhlIG5leHQgYXR0ZW1wdCB0aGUgcnVuIGlzIG1hcmtlZCBhcyBmYWlsZWQuXG5leHBvcnQgY29uc3QgUkVQTEFZX1RJTUVPVVRfTUFYX1JFVFJJRVMgPSAzO1xuXG4vKipcbiAqIEVmZmVjdGl2ZSByZXBsYXktdGltZW91dCByZXRyeSBidWRnZXQuIE92ZXJyaWRlIHZpYVxuICogYFdPUktGTE9XX1JFUExBWV9USU1FT1VUX01BWF9SRVRSSUVTYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcGxheVRpbWVvdXRNYXhSZXRyaWVzKCk6IG51bWJlciB7XG4gIHJldHVybiBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX1JFUExBWV9USU1FT1VUX01BWF9SRVRSSUVTJyxcbiAgICBSRVBMQVlfVElNRU9VVF9NQVhfUkVUUklFUyxcbiAgICB7IGludGVnZXI6IHRydWUgfVxuICApO1xufVxuXG4vKipcbiAqIERlZmF1bHQgbWF4aW11bSBudW1iZXIgb2Ygc3RlcHMgdGhlIG93bmVkLWlubGluZSBwYXRoIHJ1bnMgaW5saW5lIChpblxuICogcGFyYWxsZWwpIHBlciBzdXNwZW5zaW9uLiBUaGUgcmVzdCBhcmUgcXVldWVkIHRvIGJhY2tncm91bmQgaGFuZGxlcnMuIEVhY2hcbiAqIGlubGluZSBzdGVwIGlzIGNyZWF0ZWQgbGF6aWx5IOKAlCBpdHMgYHN0ZXBfY3JlYXRlZGAgaXMgZm9sZGVkIGludG8gdGhlXG4gKiBgc3RlcF9zdGFydGVkYCB0aGF0IGBleGVjdXRlU3RlcGAgc2VuZHMg4oCUIHNvIGlubGluaW5nIE4gc3RlcHMgc2F2ZXMgTiBxdWV1ZVxuICogcm91bmQtdHJpcHMgZm9yIGEgYFByb21pc2UuYWxsYC1zdHlsZSBmYW4tb3V0LiBgMWAgcmVwcm9kdWNlcyB0aGVcbiAqIHNpbmdsZS1pbmxpbmUtc3RlcCBiZWhhdmlvciBleGFjdGx5ICh1c2VmdWwga2lsbC1zd2l0Y2gpLlxuICpcbiAqIE92ZXJyaWRlIHZpYSBgV09SS0ZMT1dfTUFYX0lOTElORV9TVEVQU2AgKGNsYW1wZWQgdG9cbiAqIGBNSU5fTUFYX0lOTElORV9TVEVQU2AuLmBNQVhfTUFYX0lOTElORV9TVEVQU2ApLlxuICovXG5leHBvcnQgY29uc3QgTUFYX0lOTElORV9TVEVQUyA9IDM7XG5cbi8qKiBMb3dlciBib3VuZCBmb3IgdGhlIGlubGluZS1zdGVwcyBlbnYgb3ZlcnJpZGUgKDEgPSBzaW5nbGUgaW5saW5lIHN0ZXApLiAqL1xuZXhwb3J0IGNvbnN0IE1JTl9NQVhfSU5MSU5FX1NURVBTID0gMTtcblxuLyoqXG4gKiBVcHBlciBib3VuZCBmb3IgdGhlIGlubGluZS1zdGVwcyBlbnYgb3ZlcnJpZGUuIElubGluZSBib2RpZXMgcnVuIGluIHBhcmFsbGVsXG4gKiB3aXRoaW4gb25lIGZ1bmN0aW9uIGludm9jYXRpb24sIHNvIHRoaXMgY2FwcyBtZW1vcnkvQ1BVIGZhbi1vdXQgcGVyIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfTUFYX0lOTElORV9TVEVQUyA9IDE2O1xuXG4vLyBXYXJuLW9uY2UgY2FjaGUgZm9yIFdPUktGTE9XX01BWF9JTkxJTkVfU1RFUFMsIGtleWVkIGJ5IHJhdyBlbnYgdmFsdWUuXG5jb25zdCB3YXJuZWRNYXhJbmxpbmVTdGVwc1ZhbHVlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4vKipcbiAqIFJlc29sdmUgdGhlIGVmZmVjdGl2ZSBtYXggbnVtYmVyIG9mIGlubGluZSBzdGVwcyBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzcy5cbiAqXG4gKiBSZWFkcyBgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfTUFYX0lOTElORV9TVEVQU2AgbGF6aWx5IHNvIHRlc3RzIGFuZFxuICogZGVwbG95bWVudHMgY2FuIG92ZXJyaWRlIHBlciBpbnZvY2F0aW9uLiBJbnZhbGlkIC8gb3V0LW9mLXJhbmdlIHZhbHVlcyBmYWxsXG4gKiBiYWNrIHRvIGEgc2FmZSB2YWx1ZSAobm8gdGhyb3cg4oCUIHRoZSBlbnYgdmFyIGlzIGFuIGVzY2FwZSBoYXRjaCkgYW5kIGVtaXQgYVxuICogb25lLXRpbWUgd2FybmluZyBzbyBtaXNjb25maWd1cmF0aW9uIGlzIG9ic2VydmFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXhJbmxpbmVTdGVwcygpOiBudW1iZXIge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTO1xuICBpZiAoIXJhdykgcmV0dXJuIE1BWF9JTkxJTkVfU1RFUFM7XG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcihyYXcpO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocGFyc2VkKSB8fCBwYXJzZWQgPD0gMCkge1xuICAgIGlmICghd2FybmVkTWF4SW5saW5lU3RlcHNWYWx1ZXMuaGFzKHJhdykpIHtcbiAgICAgIHdhcm5lZE1heElubGluZVN0ZXBzVmFsdWVzLmFkZChyYXcpO1xuICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAnSWdub3JpbmcgV09SS0ZMT1dfTUFYX0lOTElORV9TVEVQUzogbm90IGEgcG9zaXRpdmUgaW50ZWdlcjsgdXNpbmcgZGVmYXVsdCcsXG4gICAgICAgIHsgcmF3LCBkZWZhdWx0VmFsdWU6IE1BWF9JTkxJTkVfU1RFUFMgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIE1BWF9JTkxJTkVfU1RFUFM7XG4gIH1cbiAgaWYgKHBhcnNlZCA8IE1JTl9NQVhfSU5MSU5FX1NURVBTKSByZXR1cm4gTUlOX01BWF9JTkxJTkVfU1RFUFM7XG4gIGlmIChwYXJzZWQgPiBNQVhfTUFYX0lOTElORV9TVEVQUykge1xuICAgIGlmICghd2FybmVkTWF4SW5saW5lU3RlcHNWYWx1ZXMuaGFzKHJhdykpIHtcbiAgICAgIHdhcm5lZE1heElubGluZVN0ZXBzVmFsdWVzLmFkZChyYXcpO1xuICAgICAgcnVudGltZUxvZ2dlci53YXJuKCdXT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTIGFib3ZlIG1heGltdW07IGNsYW1wZWQnLCB7XG4gICAgICAgIHJhdyxcbiAgICAgICAgY2xhbXBlZFZhbHVlOiBNQVhfTUFYX0lOTElORV9TVEVQUyxcbiAgICAgICAgbWF4VmFsdWU6IE1BWF9NQVhfSU5MSU5FX1NURVBTLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBNQVhfTUFYX0lOTElORV9TVEVQUztcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5jb25zdCB3YXJuZWRNYXhFdmVudHNWYWx1ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuLyoqXG4gKiBPcHRpb25hbCBjbGllbnQtc2lkZSBvdmVycmlkZSBmb3IgdGhlIHNlcnZlci1zdXBwbGllZCBwZXItcnVuIGV2ZW50IGNlaWxpbmcuXG4gKiBXaGVuIHNldCB0byBhIHBvc2l0aXZlIGludGVnZXIsIHRoZSBydW50aW1lIGNsYW1wcyB0aGUgc2VydmVyJ3MgbGltaXQgKmRvd24qXG4gKiB0byB0aGlzIHZhbHVlIChuZXZlciByYWlzZXMgaXQpIHNvIGVuZm9yY2VtZW50IGNhbiBiZSBleGVyY2lzZWQgd2l0aG91dCBhXG4gKiBzZXJ2ZXItc2lkZSBjaGFuZ2UuIGB1bmRlZmluZWRgICh1bnNldCkg4oeSIHVzZSB0aGUgc2VydmVyIHZhbHVlIGFzLWlzLlxuICpcbiAqIFJlYWRzIGBwcm9jZXNzLmVudi5XT1JLRkxPV19NQVhfRVZFTlRTX09WRVJSSURFYCBsYXppbHkgc28gdGVzdHMgYW5kXG4gKiBkZXBsb3ltZW50cyBjYW4gb3ZlcnJpZGUgcGVyIGludm9jYXRpb24uIEludmFsaWQgdmFsdWVzIGZhbGwgYmFjayB0byB1bnNldFxuICogKG5vIHRocm93IOKAlCB0aGUgZW52IHZhciBpcyBhbiBlc2NhcGUgaGF0Y2gpIGFuZCBlbWl0IGEgb25lLXRpbWUgd2FybmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1heEV2ZW50c092ZXJyaWRlKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX01BWF9FVkVOVFNfT1ZFUlJJREU7XG4gIGlmICghcmF3KSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIocmF3KTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlZCkgfHwgcGFyc2VkIDw9IDApIHtcbiAgICBpZiAoIXdhcm5lZE1heEV2ZW50c1ZhbHVlcy5oYXMocmF3KSkge1xuICAgICAgd2FybmVkTWF4RXZlbnRzVmFsdWVzLmFkZChyYXcpO1xuICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAnSWdub3JpbmcgV09SS0ZMT1dfTUFYX0VWRU5UU19PVkVSUklERTogbm90IGEgcG9zaXRpdmUgaW50ZWdlcjsgdXNpbmcgc2VydmVyIGxpbWl0JyxcbiAgICAgICAgeyByYXcgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgb3B0aW1pc3RpYyBpbmxpbmUgc3RlcCBzdGFydCBpcyBlbmFibGVkLiBXaGVuIG9uLCB0aGUgb3duZWQtaW5saW5lXG4gKiBwYXRoIGJlZ2lucyBydW5uaW5nIGEgYnJhbmQtbmV3IHN0ZXAncyBib2R5ICpiZWZvcmUqIGl0cyBsYXp5IGBzdGVwX3N0YXJ0ZWRgXG4gKiBuZXR3b3JrIGNhbGwgcmVzb2x2ZXMgKHRoZSBpbnB1dCBpcyBhbHJlYWR5IGtub3duIGxvY2FsbHkpLCBhd2FpdGluZyB0aGVcbiAqIGBzdGVwX3N0YXJ0ZWRgIG9ubHkgYmVmb3JlIHRoZSB0ZXJtaW5hbCB3cml0ZS5cbiAqXG4gKiBUaGlzIGNhbiBydW4gYSBzdGVwIGJvZHkgbW9yZSB0aGFuIG9uY2Ugd2hlbiBoYW5kbGVycyByYWNlIGZvciB0aGUgc2FtZVxuICogc3RlcCdzIGNyZWF0ZS1jbGFpbSDigJQgYm90aCBydW4gdGhlIGJvZHkgYmVmb3JlIG9uZSB3aW5zLiBUaGF0IGlzIHVuc2FmZSBmb3JcbiAqIHN0ZXBzIHdpdGggbm9uLWlkZW1wb3RlbnQgc2lkZSBlZmZlY3RzOyBpbiBwYXJ0aWN1bGFyLCB0d28gY29uY3VycmVudCBydW5zXG4gKiBvZiBhIHN0ZXAgdGhhdCB3cml0ZXMgdG8gdGhlIHdvcmtmbG93IHN0cmVhbSAoZS5nLiBhbiBBSSBhZ2VudCBzdHJlYW1pbmdcbiAqIHRva2VucykgY2FuIGludGVybGVhdmUgYW5kIGNvcnJ1cHQgdGhlIHN0cmVhbSBkYXRhLiBTbyB0aGUgb3B0aW1pemF0aW9uIGlzXG4gKiAqKm9mZiBieSBkZWZhdWx0KiogYW5kIG11c3QgYmUgZXhwbGljaXRseSBvcHRlZCBpbnRvIHBlciBkZXBsb3ltZW50LlxuICpcbiAqIFJlYWRzIGBwcm9jZXNzLmVudi5XT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVGAgbGF6aWx5LiBEZWZhdWx0IE9GRjtcbiAqIGVuYWJsZWQgb25seSBieSBhbiBleHBsaWNpdCBgJzEnYCAvIGAndHJ1ZSdgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPcHRpbWlzdGljSW5saW5lU3RhcnRFbmFibGVkKCk6IGJvb2xlYW4ge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVDtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHJhdyA9PT0gJzEnIHx8IHJhdy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBvcGVyYXRvciBoYXMgKipleHBsaWNpdGx5IGRpc2FibGVkKiogb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgdmlhXG4gKiBgV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlQ9MGAgLyBgPWZhbHNlYC4gRGlzdGluY3QgZnJvbSBcInVuc2V0XCI6IHVuc2V0XG4gKiBsZWF2ZXMgdGhlIG9wdGltaXphdGlvbiBvZmYgYnkgZGVmYXVsdCBidXQgbGV0cyB0dXJibyBmb3JjZSBpdCBvbjsgYW4gZXhwbGljaXRcbiAqIGAwYC9gZmFsc2VgIGlzIGFuIG9wZXJhdG9yIG9wdC1vdXQgdGhhdCB0dXJibyBtdXN0IGhvbm9yICh0dXJibydzIGZvcmNlZFxuICogb3B0aW1pc3RpYyBzdGFydCBzdGlsbCBydW5zIGEgc3RlcCBib2R5IGJlZm9yZSBgc3RlcF9zdGFydGVkYC9gcnVuX3N0YXJ0ZWRgIGlzXG4gKiBjb25maXJtZWQsIHRoZSBwcm9wZXJ0eSBzdWNoIGFuIG9wZXJhdG9yIGlzIG9wdGluZyBvdXQgb2YpLCBzb1xuICogYGZvcmNlT3B0aW1pc3RpY1N0YXJ0YCBkZWZlcnMgdG8gdGhpcy4gUmVhZHMgdGhlIGVudiB2YXIgbGF6aWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPcHRpbWlzdGljSW5saW5lU3RhcnRFeHBsaWNpdGx5RGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gcmF3ID09PSAnMCcgfHwgcmF3LnRvTG93ZXJDYXNlKCkgPT09ICdmYWxzZSc7XG59XG5cbi8qKlxuICogV2hldGhlciBcInR1cmJvIG1vZGVcIiBpcyBlbmFibGVkLiBUdXJibyBtb2RlIGZhc3QtcGF0aHMgdGhlICpmaXJzdCBkZWxpdmVyeSBvZlxuICogdGhlIGZpcnN0IGludm9jYXRpb24qIG9mIGEgcnVuIChkZXRlY3RlZCBieSB0aGUgZW50cnlwb2ludCB2aWEgYHJ1bklucHV0YFxuICogcHJlc2VuY2UgKyBgbWV0YWRhdGEuYXR0ZW1wdCA9PT0gMWApOiBpdCBiYWNrZ3JvdW5kcyB0aGUgYHJ1bl9zdGFydGVkYCBldmVudFxuICogY3JlYXRpb24sIHNraXBzIHRoZSBpbml0aWFsIGV2ZW50LWxvZyBsb2FkIChub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4geWV0KSxcbiAqIGFuZCBmb3JjZXMgb3B0aW1pc3RpYyBpbmxpbmUgc3RlcCBzdGFydCBmb3IgdGhhdCBpbnZvY2F0aW9uIOKAlCBpbmRlcGVuZGVudCBvZlxuICogYFdPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUYC5cbiAqXG4gKiBGb3JjaW5nIG9wdGltaXN0aWMgc3RhcnQgaXMgc2FmZSBoZXJlIGJlY2F1c2UgdGhlIGZpcnN0IGRlbGl2ZXJ5IGhhcyBub1xuICogY29uY3VycmVudCBwZWVyIGhhbmRsZXIgdG8gcmFjZSB0aGUgc3RlcCBjcmVhdGUtY2xhaW0sIHNvIGEgc3RlcCBib2R5IHJ1bnNcbiAqIGV4YWN0bHkgb25jZS4gVGhhdCBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgZW5kcyBhcyBzb29uIGFzIHRoZSBydW4gY3JlYXRlcyBhXG4gKiBob29rIG9yIHdhaXQgKHdoaWNoIGludHJvZHVjZSByZXN1bWUvcGFyYWxsZWwgaW52b2NhdGlvbnMpLCBzbyB0aGUgcnVudGltZVxuICogZXhpdHMgdHVyYm8gYXQgdGhhdCBwb2ludC5cbiAqXG4gKiBSZWFkcyBgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfVFVSQk9gIGxhemlseS4gRGVmYXVsdCAqKk9OKio7IGRpc2FibGVkIG9ubHkgYnkgYW5cbiAqIGV4cGxpY2l0IGAnMCdgIC8gYCdmYWxzZSdgIChjYXNlLWluc2Vuc2l0aXZlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHVyYm9FbmFibGVkKCk6IGJvb2xlYW4ge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19UVVJCTztcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIShyYXcgPT09ICcwJyB8fCByYXcudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJyk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgUXVpY2tKUyBlbmdpbmUncyBiYXNlbGluZS1zbmFwc2hvdCBzdGFydHVwIG9wdGltaXphdGlvbiBpc1xuICogZW5hYmxlZCAoZGVmYXVsdCBPTikuIFdoZW4gb24sIHRoZSBlbmdpbmUgaHlkcmF0ZXMgYSBWTSB3aXRoIHRoZVxuICogd29ya2Zsb3cgYnVuZGxlIG9uY2UgcGVyIGZ1bmN0aW9uIGluc3RhbmNlLCBzbmFwc2hvdHMgaXQsIGFuZCBzdGFydHNcbiAqIGV2ZXJ5IGludm9jYXRpb24gYnkgcmVzdG9yaW5nIHRoZSBzbmFwc2hvdCBpbnN0ZWFkIG9mIHJlLWV2YWx1YXRpbmdcbiAqIHRoZSBidW5kbGUg4oCUIHNraXBwaW5nIHRoZSBkb21pbmFudCBzaGFyZSBvZiBWTSBzdGFydHVwIChtZWFzdXJlZFxuICogfjc3bXMg4oaSIH4zbXMgdG8gZmlyc3Qgc3VzcGVuc2lvbiBmb3IgYSAxLjNNQiBidW5kbGUpLiBCdW5kbGVzIHdob3NlXG4gKiBtb2R1bGUgc2NvcGUgY29uc3VtZXMgcmFuZG9tbmVzcywgcmVhZHMgdGhlIGNsb2NrLCBvciByZXBsYWNlcyBhXG4gKiBzZXJpYWxpemF0aW9uIGludHJpbnNpYyBhcmUgZGV0ZWN0ZWQgYXQgaHlkcmF0ZSB0aW1lIGFuZFxuICogYXV0b21hdGljYWxseSBmYWxsIGJhY2sgdG8gcGVyLWludm9jYXRpb24gZnJlc2ggZXZhbHVhdGlvbiAoc2VlXG4gKiBwcmVwYXJlQmFzZWxpbmVTbmFwc2hvdCkuIFNldCBXT1JLRkxPV19RVUlDS0pTX0JBU0VMSU5FX1NOQVBTSE9UPTAgdG9cbiAqIGRpc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1F1aWNrSlNCYXNlbGluZVNuYXBzaG90RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfUVVJQ0tKU19CQVNFTElORV9TTkFQU0hPVDtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIShyYXcgPT09ICcwJyB8fCByYXcudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJyk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgaW5saW5lIGxvb3AgcmV0YWlucyBhIHN1c3BlbmRlZCB3b3JrZmxvdyBWTSBhY3Jvc3MgaW5saW5lIHN0ZXBzXG4gKiB3aXRoaW4gb25lIGludm9jYXRpb24gKGRlZmF1bHQgT04pLiBXaGVuIG9uLCBhIHN0ZXAtb25seSBzdXNwZW5zaW9uIGtlZXBzXG4gKiB0aGUgbGl2ZSBWTSwgZXZlbnQgY29uc3VtZXIsIGFuZCBoeWRyYXRlZCBzdGF0ZSBhbGl2ZSwgYW5kIHRoZSBuZXh0IGxvb3BcbiAqIGl0ZXJhdGlvbiBhcHBlbmRzIG9ubHkgdGhlIG5ld2x5IGR1cmFibGUgZXZlbnRzIGluc3RlYWQgb2YgcmVidWlsZGluZyB0aGVcbiAqIGB2bS5Db250ZXh0YCBhbmQgcmVwbGF5aW5nIHRoZSB3aG9sZSBldmVudCBsb2cuIE5vbi1zdGVwIHN1c3BlbnNpb25zIGFuZFxuICogcmVwbGF5IGRpdmVyZ2VuY2UgYWx3YXlzIGZhbGwgYmFjayB0byB0aGUgb3JkaW5hcnkgZHVyYWJsZSByZXBsYXkgcGF0aC5cbiAqXG4gKiBgV09SS0ZMT1dfUkVUQUlORURfVk09MGAgKG9yIGBmYWxzZWApIGlzIHRoZSBraWxsIHN3aXRjaDogZXZlcnkgaXRlcmF0aW9uXG4gKiByZXBsYXlzIGZyb20gc2NyYXRjaCBpbiBhIGZyZXNoIFZNLCBtYXRjaGluZyB0aGUgcHJlLXJldGVudGlvbiBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVm1SZXRlbnRpb25FbmFibGVkKCk6IGJvb2xlYW4ge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19SRVRBSU5FRF9WTTtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIShyYXcgPT09ICcwJyB8fCByYXcudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJyk7XG59XG5cbi8qKlxuICogV2hldGhlciBpbmxpbmUgc3RlcCBvd25lcnNoaXAgaXMgZW5hYmxlZCAoZGVmYXVsdCBPTikuIFdoZW4gb24sIHRoZSBsYXp5XG4gKiBgc3RlcF9zdGFydGVkYCB0aGF0IGNyZWF0ZXMgYW4gaW5saW5lIHN0ZXAgcmVjb3JkcyB0aGUgb3duaW5nIHF1ZXVlXG4gKiBtZXNzYWdlIElELCBhbmQgd2FrZSByZXBsYXlzIHRoYXQgb2JzZXJ2ZSBhbiBhY3RpdmVseS1vd25lZCBzdGVwIGVucXVldWUgYVxuICogKmRlbGF5ZWQgYmFja3N0b3AqIG1lc3NhZ2UgaW5zdGVhZCBvZiBpbW1lZGlhdGVseSByZXF1ZXVlaW5nIGl0IOKAlCBmaXhpbmdcbiAqIGR1cGxpY2F0ZSBpbmxpbmUgc3RlcCBleGVjdXRpb24gd2hlbiBhIGhvb2svd2FpdCB3YWtlcyBhIHJ1biBtaWQtc3RlcFxuICogKHZlcmNlbC93b3JrZmxvdyMyNzgwKS5cbiAqXG4gKiBgV09SS0ZMT1dfSU5MSU5FX09XTkVSU0hJUD0wYCAob3IgYGZhbHNlYCkgaXMgdGhlIGtpbGwgc3dpdGNoOiBkaXNwYXRjaFxuICogcmV2ZXJ0cyB0byB0aGUgdW5jb25kaXRpb25hbCBpbW1lZGlhdGUgcmVxdWV1ZS4gU3RhbXBpbmcgaXMgdW5hZmZlY3RlZCDigJRcbiAqIHRoZSByZWNvcmRlZCBvd25lck1lc3NhZ2VJZCBpcyBpbmVydCBkYXRhIHdoZW4gdGhlIHN3aXRjaCBpcyBvZmYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0lubGluZU93bmVyc2hpcEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX0lOTElORV9PV05FUlNISVA7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuICEocmF3ID09PSAnMCcgfHwgcmF3LnRvTG93ZXJDYXNlKCkgPT09ICdmYWxzZScpO1xufVxuXG4vKipcbiAqIERlZmF1bHQgaW5saW5lLW93bmVyc2hpcCBsZWFzZSwgaW4gc2Vjb25kczogaG93IGxvbmcgYWZ0ZXIgYSBzdGVwJ3MgbGF0ZXN0XG4gKiAoc3RhbXBlZCkgYHN0ZXBfc3RhcnRlZGAgYSBub24tb3duZXIgaW52b2NhdGlvbiBhc3N1bWVzIHRoZSBvd25pbmdcbiAqIGludm9jYXRpb24gbWF5IHN0aWxsIGJlIGFsaXZlLiBXaXRoaW4gdGhlIGxlYXNlLCB3YWtlIHJlcGxheXMgZW5xdWV1ZSB0aGVcbiAqIHN0ZXAncyBiYWNrc3RvcCBtZXNzYWdlIHdpdGggYGRlbGF5U2Vjb25kcyA9IGxlYXNlIHJlbWFpbmluZ2AgaW5zdGVhZCBvZlxuICogaW1tZWRpYXRlbHk7IHBhc3QgaXQsIHRoZXkgZW5xdWV1ZSBpbW1lZGlhdGVseSAodG9kYXkncyBiZWhhdmlvcikuXG4gKlxuICogV2h5IGEgZml4ZWQgODYwIGFuZCBub3QgYSB2YWx1ZSBkZXJpdmVkIGZyb20gdGhlIGZ1bmN0aW9uJ3MgYG1heER1cmF0aW9uYDpcbiAqIG5laXRoZXIgcnVudGltZSBub3IgYnVpbGQgdGltZSBjYW4gc2VlIHRoZSByZXNvbHZlZCB2YWx1ZSDigJQgYnVpbGRlcnMgZW1pdFxuICogYG1heER1cmF0aW9uOiAnbWF4J2AsIHdoaWNoIHRoZSBwbGF0Zm9ybSByZXNvbHZlcyBwZXItcGxhbiBhdCBkZXBsb3ksIGFuZFxuICogbm8gZW52IHZhciBvciByZXF1ZXN0LWNvbnRleHQgZGVhZGxpbmUgQVBJIGV4cG9zZXMgdGhlIHJlc3VsdC4gVGhlIGJvdW5kXG4gKiBjb21lcyBmcm9tIGEgcGxhdGZvcm0gcnVsZSBpbnN0ZWFkOiBkdXJhdGlvbnMgYWJvdmUgODAwcyByZXF1aXJlIGV4cGxpY2l0XG4gKiBwZXItZnVuY3Rpb24gbnVtZXJpYyBjb25maWcsIHNvIGEgYnVpbGRlci1lbWl0dGVkIGAnbWF4J2AgcmVzb2x2ZXMgdG8gYXRcbiAqIG1vc3QgODAwcyDigJQgODYwcyB0aGVyZWZvcmUgZG9taW5hdGVzIGFueSB3b3JrZmxvdyByb3V0ZSdzIGludm9jYXRpb25cbiAqIGxpZmV0aW1lIHBsdXMgc2NoZWR1bGluZyBzbGFjay4gUmV2aXNpdCB3aGVuIHRoYXQgY2VpbGluZyBtb3ZlcyAodGhlXG4gKiAzMC1taW51dGUgZHVyYXRpb24gYmV0YSBiZWNvbWluZyByZWFjaGFibGUgdmlhIGAnbWF4J2Agd291bGQgaW52YWxpZGF0ZVxuICogdGhlIGJvdW5kKS4gV29ybGRzIHdpdGhvdXQgYW4gaW52b2NhdGlvbiBraWxsIGJvdW5kICh3b3JsZC1sb2NhbCxcbiAqIHNlbGYtaG9zdGVkKSBnZXQgbm8gZGVhdGggcHJvb2YgZnJvbSBhbnkgY29uc3RhbnQg4oCUIHRoZXJlIHRoZSBpbi1wcm9jZXNzXG4gKiBzaW5nbGUtZmxpZ2h0IGxheWVyIChzdGVwLXNpbmdsZS1mbGlnaHQudHMpIGlzIHdoYXQgbWFrZXMgYSBiYWNrc3RvcFxuICogZmlyaW5nIG1pZC1zdGVwIGhhcm1sZXNzLlxuICpcbiAqIDg2MCBhbHNvIHN0YXlzIHVuZGVyIHRoZSBxdWV1ZSdzIDkwMHMgbWF4aW11bSBkZWxheSAoU1FTIGNhcCksIHNvIGFcbiAqIGJhY2tzdG9wJ3MgZnVsbCBsZWFzZSByZW1haW5kZXIgYWx3YXlzIGZpdHMgaW4gYSBzaW5nbGUgZGVsYXllZCBtZXNzYWdlLlxuICpcbiAqIE92ZXJyaWRlIHZpYSBgV09SS0ZMT1dfSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTYCAoY2xhbXBlZCB0b1xuICogMS4uYE1BWF9JTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IElOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EUyA9IDg2MDtcblxuLyoqXG4gKiBVcHBlciBib3VuZCBmb3IgdGhlIGxlYXNlIGVudiBvdmVycmlkZS4gOTAwcyBpcyB0aGUgcXVldWUncyBtYXhpbXVtXG4gKiBwZXItbWVzc2FnZSBkZWxheSAoU1FTIGNhcCkg4oCUIGEgbG9uZ2VyIGxlYXNlIHdvdWxkIG5lZWQgZGVsYXkgY2hhaW5pbmdcbiAqIGxpa2UgbG9uZyB3YWl0cyB1c2U7IGNsYW1wIGluc3RlYWQgc28gb25lIGRlbGF5ZWQgbWVzc2FnZSBhbHdheXMgc3VmZmljZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTID0gOTAwO1xuXG4vKipcbiAqIEVmZmVjdGl2ZSBpbmxpbmUtb3duZXJzaGlwIGxlYXNlLiBPdmVycmlkZSB2aWFcbiAqIGBXT1JLRkxPV19JTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFNgIOKAlCBlLmcuIHJhaXNlIGl0IG9uIHNlbGYtaG9zdGVkXG4gKiBtdWx0aS1pbnN0YW5jZSB3b3JsZHMgd2l0aCBsb25nLXJ1bm5pbmcgc3RlcHMgdG8gd2lkZW4gdGhlIHdpbmRvdyBpbiB3aGljaFxuICogYSBsaXZlIG93bmVyIGlzIHByb3RlY3RlZCBmcm9tIGEgY29uY3VycmVudCBiYWNrc3RvcCBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbmxpbmVPd25lcnNoaXBMZWFzZVNlY29uZHMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTJyxcbiAgICBJTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlLCBtaW46IDEsIG1heDogTUFYX0lOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EUyB9XG4gICk7XG59XG5cbi8vIEEgcmVwbGF5LWNvbnN1bWVyIG1pc21hdGNoIGNhbiBiZSBjYXVzZWQgYnkgYSB0cmFuc2llbnQgZGl2ZXJnZW50IHJlcGxheVxuLy8gcmF0aGVyIHRoYW4gYW4gaW52YWxpZCBwZXJzaXN0ZWQgaGlzdG9yeS4gUXVldWUgYm91bmRlZCByZWNvdmVyeSByZXBsYXlzXG4vLyBiZWZvcmUgcmVjb3JkaW5nIHRlcm1pbmFsIGNvcnJ1cHRpb24gZm9yIGEgcnVuIHRoYXQgY2Fubm90IHJlcGxheS5cbmV4cG9ydCBjb25zdCBSRVBMQVlfRElWRVJHRU5DRV9NQVhfUkVUUklFUyA9IDM7XG5cbi8qKlxuICogRWZmZWN0aXZlIHJlcGxheS1kaXZlcmdlbmNlIHJlY292ZXJ5IGJ1ZGdldC4gT3ZlcnJpZGUgdmlhXG4gKiBgV09SS0ZMT1dfUkVQTEFZX0RJVkVSR0VOQ0VfTUFYX1JFVFJJRVNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVwbGF5RGl2ZXJnZW5jZU1heFJldHJpZXMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfUkVQTEFZX0RJVkVSR0VOQ0VfTUFYX1JFVFJJRVMnLFxuICAgIFJFUExBWV9ESVZFUkdFTkNFX01BWF9SRVRSSUVTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSB9XG4gICk7XG59XG5cbi8vIEEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uICg0MTIpIG1lYW5zIHRoZSByZXBsYXkncyBldmVudCBsb2cgd2FzIG1pc3NpbmcgYW5cbi8vIGV2ZW50IHRoZSBXb3JsZCBoYWQgYWxyZWFkeSByZWNvcmRlZCwgc28gdGhlIHJlcGxheSBpcyByZS1kZXJpdmVkIGZyb20gYVxuLy8gY29ycmVjdGVkIGxvZyBpbnNpZGUgdGhlIHNhbWUgaW52b2NhdGlvbi4gQm91bmRlZCBiZWNhdXNlIGEgcGVyc2lzdGVudGx5XG4vLyByZWplY3RlZCB3cml0ZSBzaG91bGQgZXNjYWxhdGUgcmF0aGVyIHRoYW4gc3BpbjogYWZ0ZXIgdGhpcyBtYW55IHJlc3RhcnRzIHRoZVxuLy8gcnVuIGlzIHJlLWludm9rZWQgKGEgbmV3IGludm9jYXRpb24sIHBvc3NpYmx5IGluIGEgZGlmZmVyZW50IHJlZ2lvbiksIGFuZCB0aGVcbi8vIHJ1bi1sZXZlbCBidWRnZXQgYmVsb3cgdGhlbiBhcHBsaWVzLlxuZXhwb3J0IGNvbnN0IFBSRUNPTkRJVElPTl9NQVhfSU5QUk9DRVNTX1JFU1RBUlRTID0gMztcblxuLyoqXG4gKiBFZmZlY3RpdmUgaW4tcHJvY2VzcyByZXBsYXktcmVzdGFydCBidWRnZXQgZm9yIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvbnMuXG4gKiBPdmVycmlkZSB2aWEgYFdPUktGTE9XX1BSRUNPTkRJVElPTl9NQVhfSU5QUk9DRVNTX1JFU1RBUlRTYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFByZWNvbmRpdGlvbk1heEluUHJvY2Vzc1Jlc3RhcnRzKCk6IG51bWJlciB7XG4gIHJldHVybiBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX1BSRUNPTkRJVElPTl9NQVhfSU5QUk9DRVNTX1JFU1RBUlRTJyxcbiAgICBQUkVDT05ESVRJT05fTUFYX0lOUFJPQ0VTU19SRVNUQVJUUyxcbiAgICB7IGludGVnZXI6IHRydWUgfVxuICApO1xufVxuXG4vLyBUaGUgaW4tcHJvY2VzcyBidWRnZXQgYWJvdmUgaXMgcGVyLWludm9jYXRpb24sIGFuZCBhIHJlLWludm9jYXRpb24gdGhhdFxuLy8gZW5xdWV1ZXMgYSBmcmVzaCBtZXNzYWdlIGFsc28gcmVzdGFydHMgdGhlIHF1ZXVlJ3MgZGVsaXZlcnkgY291bnQsIHNvIHdpdGhvdXRcbi8vIGEgY291bnRlciBjYXJyaWVkIG9uIHRoZSBtZXNzYWdlIGEgcGVybWFuZW50bHkgZmVuY2VkIHJ1biBoYXMgbm8gcnVuLWxldmVsXG4vLyBib3VuZCBhdCBhbGwuIEl0IGNhbiBzdGF5IGZlbmNlZCB3aXRob3V0IGFueSBwZXJtYW5lbnQgZmF1bHQg4oCUIGEgZnVsbCByZWxvYWRcbi8vIGlzIG5vdCBhdG9taWMgYWNyb3NzIHBhZ2VzLCBzbyBhIGJ1c3kgcnVuIGNhbiBhY3F1aXJlIGEgbmV3IGhvbGUgb24gZXZlcnlcbi8vIHJlbG9hZCDigJQgc28gdGhlIGNoYWluIGlzIGNvdW50ZWQgYW5kIHRoZSBydW4gZmFpbHMgb25jZSB0aGlzIG1hbnlcbi8vIHJlLWludm9jYXRpb25zIGhhdmUgYmVlbiBzcGVudCBvbiBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb25zLlxuZXhwb3J0IGNvbnN0IFBSRUNPTkRJVElPTl9NQVhfUkVJTlZPQ0FUSU9OUyA9IDU7XG5cbi8qKlxuICogRWZmZWN0aXZlIHBlci1ydW4gYnVkZ2V0IGZvciByZS1pbnZvY2F0aW9ucyBjYXVzZWQgYnkgc3RhbGUtc25hcHNob3RcbiAqIHJlamVjdGlvbnMuIE92ZXJyaWRlIHZpYSBgV09SS0ZMT1dfUFJFQ09ORElUSU9OX01BWF9SRUlOVk9DQVRJT05TYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFByZWNvbmRpdGlvbk1heFJlaW52b2NhdGlvbnMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfUFJFQ09ORElUSU9OX01BWF9SRUlOVk9DQVRJT05TJyxcbiAgICBQUkVDT05ESVRJT05fTUFYX1JFSU5WT0NBVElPTlMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlIH1cbiAgKTtcbn1cblxuLy8gQmFja29mZiBiZWZvcmUgYSBwcmVjb25kaXRpb24gcmUtaW52b2NhdGlvbi4gVW5saWtlIHRoZSBpbi1wcm9jZXNzIHJlc3RhcnRcbi8vICh3aGVyZSB0aGUgcG9pbnQgaXMgdG8gcmUtcmVhZCBpbW1lZGlhdGVseSksIGEgcmUtaW52b2NhdGlvbiBvbmx5IGhhcHBlbnNcbi8vIGFmdGVyIHRoZSBpbi1wcm9jZXNzIGJ1ZGdldCBmYWlsZWQgdG8gY2F0Y2ggdXAsIHNvIHRoZSBsb2cgaXMgYmVpbmcgZXh0ZW5kZWRcbi8vIGZhc3RlciB0aGFuIHRoaXMgcmVwbGF5IGNhbiBmb2xsb3cgaXQuIFdhaXRpbmcgbGV0cyB0aGUgd3JpdGVycyBxdWllc2NlLlxuZXhwb3J0IGNvbnN0IFBSRUNPTkRJVElPTl9SRUlOVk9LRV9ERUxBWV9TRUNPTkRTID0gMjtcblxuLyoqXG4gKiBFZmZlY3RpdmUgZGVsYXkgYmVmb3JlIGEgcHJlY29uZGl0aW9uIHJlLWludm9jYXRpb24uIE92ZXJyaWRlIHZpYVxuICogYFdPUktGTE9XX1BSRUNPTkRJVElPTl9SRUlOVk9LRV9ERUxBWV9TRUNPTkRTYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFByZWNvbmRpdGlvblJlaW52b2tlRGVsYXlTZWNvbmRzKCk6IG51bWJlciB7XG4gIHJldHVybiBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX1BSRUNPTkRJVElPTl9SRUlOVk9LRV9ERUxBWV9TRUNPTkRTJyxcbiAgICBQUkVDT05ESVRJT05fUkVJTlZPS0VfREVMQVlfU0VDT05EUyxcbiAgICB7IGludGVnZXI6IHRydWUgfVxuICApO1xufVxuXG4vLyBBIGRlbGl2ZXJ5IHJlYWNoaW5nIGEgZGVwbG95bWVudCB0aGUgcnVuIGlzIG5vdCBwaW5uZWQgdG8gaXMgbm90IHRyZWF0ZWQgYXNcbi8vIHBlcm1hbmVudC4gUmUtcm91dGUgdGhlIG1lc3NhZ2UgYXQgdGhlIHJ1bidzIG93biBkZXBsb3ltZW50IGEgYm91bmRlZCBudW1iZXJcbi8vIG9mIHRpbWVzIGJlZm9yZSBmYWlsaW5nIHRoZSBydW4gd2l0aCBERVBMT1lNRU5UX01JU01BVENILlxuZXhwb3J0IGNvbnN0IERFUExPWU1FTlRfTUlTTUFUQ0hfTUFYX1JFVFJJRVMgPSAzO1xuXG4vKipcbiAqIEVmZmVjdGl2ZSBkZXBsb3ltZW50LW1pc21hdGNoIHJlLXJvdXRlIGJ1ZGdldC4gT3ZlcnJpZGUgdmlhXG4gKiBgV09SS0ZMT1dfREVQTE9ZTUVOVF9NSVNNQVRDSF9NQVhfUkVUUklFU2A7IGAwYCBmYWlscyB0aGUgcnVuIG9uIHRoZSBmaXJzdFxuICogbWlzcm91dGVkIGRlbGl2ZXJ5IGluc3RlYWQgb2YgYXR0ZW1wdGluZyByZWNvdmVyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlcGxveW1lbnRNaXNtYXRjaE1heFJldHJpZXMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfREVQTE9ZTUVOVF9NSVNNQVRDSF9NQVhfUkVUUklFUycsXG4gICAgREVQTE9ZTUVOVF9NSVNNQVRDSF9NQVhfUkVUUklFUyxcbiAgICB7IGludGVnZXI6IHRydWUsIG1pbjogMCB9XG4gICk7XG59XG4iXX0=
505
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdDLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLG9EQUFvRDtBQUNwRCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLHNEQUFzRDtBQUN0RCwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSx5RUFBeUU7QUFDekUsK0VBQStFO0FBQy9FLDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0Usc0JBQXNCO0FBQ3RCLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztBQUV2Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsd0VBQXdFO0lBQ3hFLDBFQUEwRTtJQUMxRSw4RUFBOEU7SUFDOUUseUVBQXlFO0lBQ3pFLDRFQUE0RTtJQUM1RSxPQUFPLFNBQVMsQ0FBQywrQkFBK0IsRUFBRSxvQkFBb0IsRUFBRTtRQUN0RSxPQUFPLEVBQUUsSUFBSTtRQUNiLEdBQUcsRUFBRSxDQUFDO1FBQ04sR0FBRyxFQUFFLG9CQUFvQjtLQUMxQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztBQUV6QywyREFBMkQ7QUFDM0QsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDO0FBRTVDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxPQUFPLENBQUM7QUFFN0Ms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R0FJRztBQUNILE1BQU0sVUFBVSwrQkFBK0I7SUFDN0MsT0FBTyxTQUFTLENBQ2QsMENBQTBDLEVBQzFDLCtCQUErQixFQUMvQixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUMxQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVudk51bWJlciB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuLy8gTWF4aW11bSBudW1iZXIgb2YgcXVldWUgZGVsaXZlcnkgYXR0ZW1wdHMgYmVmb3JlIHRoZSBoYW5kbGVyIGdpdmVzIHVwIGFuZFxuLy8gZ3JhY2VmdWxseSBmYWlscyB0aGUgcnVuL3N0ZXAuIFRoaXMgbXVzdCBiZSBib3VuZGVkIHVuZGVyIHRoZSBWUVMgbWVzc2FnZVxuLy8gbWF4IHZpc2liaWxpdHkgd2luZG93ICgyNCBob3Vycykgc28gdGhhdCBvdXIgaGFuZGxlci1zaWRlIGZhaWx1cmUgcGF0aFxuLy8gcmVsaWFibHkgZXhlY3V0ZXMgYmVmb3JlIFZRUyBleHBpcmVzIHRoZSBtZXNzYWdlLlxuLy9cbi8vIFRoZSBlZmZlY3RpdmUgd2FsbC1jbG9jayBzdXJ2aXZhbCBkZXBlbmRzIG9uIHRoZSBwZXItcmVkZWxpdmVyeSBiYWNrb2ZmOiB0aGVcbi8vIGByZXRyeS1hZnRlcmAgdGhlIGhhbmRsZXIgcmV0dXJucyAoc2VlIHdvcmxkLXZlcmNlbFxuLy8gYGdldEhhbmRsZXJFcnJvclJldHJ5QWZ0ZXJTZWNvbmRzYCkgZmVkIHRocm91Z2ggVlFTIGBjYWxjdWxhdGVCYWNrb2ZmRGVsYXlgLlxuLy8gVlFTIHVzZXMgb3VyIHZhbHVlIGZvciB0aGUgZmlyc3QgMzIgYXR0ZW1wdHMgKGNsYW1wZWQgdG8gWzVzLCA5MDBzXSkgdGhlblxuLy8gYXBwbGllcyBpdHMgb3duIGV4cG9uZW50aWFsIGdyb3d0aCDigJQgZXZlcnkgaG9wIGhhcmQtY2FwcGVkIGF0IHRoZSBTUVMgbGltaXRcbi8vIG9mIDkwMHMuIFdpdGggdGhlIGJhY2tvZmYgcmFtcGluZyB0b3dhcmQgdGhhdCA5MDBzIGNlaWxpbmcgKHJlYWNoZWQgYnlcbi8vIH5kZWxpdmVyeSAxMSksIDQ4IGF0dGVtcHRzIHNwYW4gcm91Z2hseSA54oCTMTAgaG91cnMgb2Ygd2FsbC1jbG9jayAofjM1LDAwMHMpLFxuLy8gY29tZm9ydGFibHkgdW5kZXIgdGhlIDI0LWhvdXIgbWVzc2FnZS12aXNpYmlsaXR5IGxpbWl0IHNvIHRoZSBmYWlsdXJlIHBhdGhcbi8vIHJ1bnMgYmVmb3JlIHRoZSBtZXNzYWdlIGV4cGlyZXMuIChBIGZsYXR0ZXIsIGxvdy1jYXBwZWQgYmFja29mZiBleGhhdXN0cyB0aGVcbi8vIGJ1ZGdldCBpbiBvbmx5IGEgZmV3IGhvdXJzLCBmYWlsaW5nIG90aGVyd2lzZS1oZWFsdGh5IHJ1bnMgZHVyaW5nIGEgdHJhbnNpZW50XG4vLyBiYWNrZW5kIG91dGFnZTsgY29udmVyc2VseSwgc3Bhbm5pbmcgdGhlIGZ1bGwgMjRoIHdpbmRvdyB3b3VsZCByZXF1aXJlIGFcbi8vIHN1YnN0YW50aWFsbHkgaGlnaGVyIGNhcCBoZXJlLCBub3QgYSBoaWdoZXIgcGVyLWhvcCBjZWlsaW5nIOKAlCBWUVMgY2xhbXBzXG4vLyBldmVyeSBob3AgYXQgOTAwcy4pXG5leHBvcnQgY29uc3QgTUFYX1FVRVVFX0RFTElWRVJJRVMgPSA0ODtcblxuLyoqXG4gKiBFZmZlY3RpdmUgbWF4IHF1ZXVlIGRlbGl2ZXJpZXMuIE92ZXJyaWRlIHZpYSBgV09SS0ZMT1dfTUFYX1FVRVVFX0RFTElWRVJJRVNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF4UXVldWVEZWxpdmVyaWVzKCk6IG51bWJlciB7XG4gIC8vIE9ubHkgZXZlciBsb3dlciB0aGUgZGVsaXZlcnkgYnVkZ2V0LiBUaGUgZGVmYXVsdCBpcyBjYWxpYnJhdGVkIHNvIHRoZVxuICAvLyBoYW5kbGVyLXNpZGUgZmFpbHVyZSBwYXRoIHJ1bnMgYmVmb3JlIFZRUyBtZXNzYWdlLXJldGVudGlvbiBleHBpcnkgKHNlZVxuICAvLyBNQVhfUVVFVUVfREVMSVZFUklFUyBhYm92ZSk7IGEgaGlnaGVyIHZhbHVlIHdvdWxkIGJ5cGFzcyB0aGF0IGludmFyaWFudCBhbmRcbiAgLy8gbGV0IGEgYmFkIGRlcGxveW1lbnQgcmVkZWxpdmVyIHVudGlsIHF1ZXVlIGV4cGlyeSBpbnN0ZWFkIG9mIHJlY29yZGluZ1xuICAvLyBydW5fZmFpbC4gYG1heGAgY2xhbXBzIGEgdG9vLWhpZ2ggb3ZlcnJpZGUgYmFjayBkb3duIHRvIHRoZSBzYWZlIGRlZmF1bHQuXG4gIHJldHVybiBlbnZOdW1iZXIoJ1dPUktGTE9XX01BWF9RVUVVRV9ERUxJVkVSSUVTJywgTUFYX1FVRVVFX0RFTElWRVJJRVMsIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICAgIG1pbjogMSxcbiAgICBtYXg6IE1BWF9RVUVVRV9ERUxJVkVSSUVTLFxuICB9KTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IG1heGltdW0gdGltZSBhbGxvd2VkIGZvciB0aGUgKnJlcGxheSogcG9ydGlvbiBvZiBhIHNpbmdsZSB3b3JrZmxvd1xuICogaGFuZGxlciBpbnZvY2F0aW9uIChpbiBtcykuIFRoaXMgYnVkZ2V0IG9ubHkgY292ZXJzIGRldGVybWluaXN0aWMtcmVwbGF5XG4gKiBhbmQgd29ya2Zsb3ctVk0gZXhlY3V0aW9uIGJldHdlZW4gc3RlcCBib3VuZGFyaWVzIOKAlCBpbmxpbmUgc3RlcCBib2RpZXNcbiAqIChgXCJ1c2Ugc3RlcFwiYCBmdW5jdGlvbnMgaW52b2tlZCB2aWEgYGV4ZWN1dGVTdGVwYCkgZG8gTk9UIGNvdW50IGFnYWluc3RcbiAqIGl0LiBTdGVwIGJvZGllcyBhcmUgYm91bmRlZCBzZXBhcmF0ZWx5IGJ5IHRoZSBwbGF0Zm9ybSdzIGZ1bmN0aW9uXG4gKiBgbWF4RHVyYXRpb25gIChlLmcuIDgwMHMgb24gVmVyY2VsIFBybyBGbHVpZCkgYW5kIGBOT19JTkxJTkVfUkVQTEFZX0FGVEVSX01TYC5cbiAqXG4gKiBJZiB0aGUgbm9uLXN0ZXAgKFwicmVwbGF5XCIpIHRpbWUgd2l0aGluIGEgc2luZ2xlIGludm9jYXRpb24gZXhjZWVkcyB0aGlzXG4gKiBidWRnZXQsIHRoZSBoYW5kbGVyIHJlamVjdHMgc28gdGhlIHF1ZXVlIGNhbiByZXRyeS4gQWZ0ZXJcbiAqIGBSRVBMQVlfVElNRU9VVF9NQVhfUkVUUklFU2AgZXhoYXVzdGVkIGF0dGVtcHRzIHRoZSBydW4gaXMgZmFpbGVkIHdpdGhcbiAqIGBSVU5fRVJST1JfQ09ERVMuUkVQTEFZX1RJTUVPVVRgLlxuICpcbiAqIE5vdGUgdGhhdCBvbiBWZXJjZWwgSG9iYnkgKHN0YW5kYXJkIGZ1bmN0aW9ucyksIHRoZSBwbGF0Zm9ybSBgbWF4RHVyYXRpb25gXG4gKiBpcyA2MHMg4oCUIHdlbGwgYmVsb3cgdGhpcyBidWRnZXQsIHNvIHRoZSBwbGF0Zm9ybSBTSUdURVJNIHdpbGwgZmlyZSBmaXJzdFxuICogYW5kIHRoZSBxdWV1ZSB3aWxsIHJlLWRlbGl2ZXIgdW50aWwgdGhlIHZpc2liaWxpdHkgd2luZG93IGV4cGlyZXMuIFdpdGhcbiAqIEZsdWlkIENvbXB1dGUgb24gSG9iYnkgdGhlIHBlci1mdW5jdGlvbiBjZWlsaW5nIHJpc2VzIHRvIDMwMHMsIHN0aWxsXG4gKiB1bmRlciB0aGUgZGVmYXVsdCBidWRnZXQuXG4gKlxuICogT3ZlcnJpZGUgdmlhIHRoZSBgV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTVNgIGVudiB2YXIgKGNsYW1wZWQgdG9cbiAqIGBNSU5fUkVQTEFZX1RJTUVPVVRfTVNgLi5gTUFYX1JFUExBWV9USU1FT1VUX01TYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBSRVBMQVlfVElNRU9VVF9NUyA9IDI0MF8wMDA7XG5cbi8qKiBMb3dlciBib3VuZCBmb3IgdGhlIHJlcGxheS10aW1lb3V0IGVudiB2YXIgb3ZlcnJpZGUuICovXG5leHBvcnQgY29uc3QgTUlOX1JFUExBWV9USU1FT1VUX01TID0gMzBfMDAwO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIGZvciB0aGUgcmVwbGF5LXRpbWVvdXQgZW52IHZhciBvdmVycmlkZS4gNzgwcyBsZWF2ZXMg4omlMjBzIG9mXG4gKiBoZWFkcm9vbSB1bmRlciBWZXJjZWwgUHJvIEZsdWlkJ3MgODAwcyBmdW5jdGlvbiBjZWlsaW5nIHNvIHRoZSBoYW5kbGVyXG4gKiBjYW4gd3JpdGUgYHJ1bl9mYWlsZWRgIGJlZm9yZSBTSUdURVJNLlxuICovXG5leHBvcnQgY29uc3QgTUFYX1JFUExBWV9USU1FT1VUX01TID0gNzgwXzAwMDtcblxuLy8gVHJhY2sgd2hpY2ggcmF3IGVudiB2YXIgdmFsdWVzIHdlJ3ZlIGFscmVhZHkgd2FybmVkIGFib3V0IHNvIHRoZSB3YXJuaW5nXG4vLyBsb2cgb25seSBmaXJlcyBvbmNlIHBlciBwcm9jZXNzICh0aGUgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBtYW55IHRpbWVzKS5cbmNvbnN0IHdhcm5lZFJlcGxheVRpbWVvdXRWYWx1ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuZnVuY3Rpb24gd2Fybk9uY2UoXG4gIHJhdzogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiB2b2lkIHtcbiAgaWYgKHdhcm5lZFJlcGxheVRpbWVvdXRWYWx1ZXMuaGFzKHJhdykpIHJldHVybjtcbiAgd2FybmVkUmVwbGF5VGltZW91dFZhbHVlcy5hZGQocmF3KTtcbiAgcnVudGltZUxvZ2dlci53YXJuKG1lc3NhZ2UsIGRhdGEpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGVmZmVjdGl2ZSByZXBsYXktdGltZW91dCBidWRnZXQgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3MuXG4gKlxuICogUmVhZHMgYHByb2Nlc3MuZW52LldPUktGTE9XX1JFUExBWV9USU1FT1VUX01TYCBsYXppbHkgc28gdGVzdHMgYW5kXG4gKiBkZXBsb3ltZW50cyBjYW4gb3ZlcnJpZGUgcGVyIGludm9jYXRpb24uIEludmFsaWQgLyBvdXQtb2YtcmFuZ2UgdmFsdWVzXG4gKiBmYWxsIGJhY2sgdG8gYSBzYWZlIHZhbHVlIChubyB0aHJvdyDigJQgdGhlIGVudiB2YXIgaXMgYW4gZXNjYXBlIGhhdGNoLFxuICogbm90IGEgaGFyZCByZXF1aXJlbWVudCkgYW5kIGVtaXQgYSBvbmUtdGltZSB3YXJuaW5nIHNvIG1pc2NvbmZpZ3VyYXRpb25cbiAqIGlzIG9ic2VydmFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXBsYXlUaW1lb3V0TXMoKTogbnVtYmVyIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTVM7XG4gIGlmICghcmF3KSByZXR1cm4gUkVQTEFZX1RJTUVPVVRfTVM7XG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcihyYXcpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYXJzZWQpIHx8IHBhcnNlZCA8PSAwKSB7XG4gICAgd2Fybk9uY2UoXG4gICAgICByYXcsXG4gICAgICAnSWdub3JpbmcgV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTVM6IG5vdCBhIHBvc2l0aXZlIGZpbml0ZSBudW1iZXI7IHVzaW5nIGRlZmF1bHQnLFxuICAgICAgeyByYXcsIGRlZmF1bHRNczogUkVQTEFZX1RJTUVPVVRfTVMgfVxuICAgICk7XG4gICAgcmV0dXJuIFJFUExBWV9USU1FT1VUX01TO1xuICB9XG4gIGlmIChwYXJzZWQgPCBNSU5fUkVQTEFZX1RJTUVPVVRfTVMpIHtcbiAgICB3YXJuT25jZShyYXcsICdXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NUyBiZWxvdyBtaW5pbXVtOyBjbGFtcGVkJywge1xuICAgICAgcmF3LFxuICAgICAgY2xhbXBlZE1zOiBNSU5fUkVQTEFZX1RJTUVPVVRfTVMsXG4gICAgICBtaW5NczogTUlOX1JFUExBWV9USU1FT1VUX01TLFxuICAgIH0pO1xuICAgIHJldHVybiBNSU5fUkVQTEFZX1RJTUVPVVRfTVM7XG4gIH1cbiAgaWYgKHBhcnNlZCA+IE1BWF9SRVBMQVlfVElNRU9VVF9NUykge1xuICAgIHdhcm5PbmNlKHJhdywgJ1dPUktGTE9XX1JFUExBWV9USU1FT1VUX01TIGFib3ZlIG1heGltdW07IGNsYW1wZWQnLCB7XG4gICAgICByYXcsXG4gICAgICBjbGFtcGVkTXM6IE1BWF9SRVBMQVlfVElNRU9VVF9NUyxcbiAgICAgIG1heE1zOiBNQVhfUkVQTEFZX1RJTUVPVVRfTVMsXG4gICAgfSk7XG4gICAgcmV0dXJuIE1BWF9SRVBMQVlfVElNRU9VVF9NUztcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFJlc2V0IHRoZSB3YXJuLW9uY2UgY2FjaGUuIFRlc3Qtb25seSDigJQgZXhwb3J0ZWQgc28gdW5pdCB0ZXN0cyBjYW5cbiAqIGV4ZXJjaXNlIHRoZSB3YXJuIHBhdGggcmVwZWF0ZWRseSB3aXRob3V0IHNoYXJpbmcgc3RhdGUuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfcmVzZXRSZXBsYXlUaW1lb3V0V2FybkNhY2hlRm9yVGVzdHMoKTogdm9pZCB7XG4gIHdhcm5lZFJlcGxheVRpbWVvdXRWYWx1ZXMuY2xlYXIoKTtcbn1cblxuLy8gTnVtYmVyIG9mIHF1ZXVlIGRlbGl2ZXJ5IGF0dGVtcHRzIHRvIGFsbG93IGJlZm9yZSBwZXJtYW5lbnRseSBmYWlsaW5nIGEgcnVuXG4vLyBkdWUgdG8gYSByZXBsYXkgdGltZW91dC4gT24gYXR0ZW1wdHMgMSB0aHJvdWdoIHRoaXMgdmFsdWUsIHRoZSB0aW1lb3V0XG4vLyBoYW5kbGVyIHJlamVjdHMgd2l0aG91dCB3cml0aW5nIHJ1bl9mYWlsZWQgc28gdGhlIHF1ZXVlIHJldHJpZXMgdGhlIG1lc3NhZ2UuXG4vLyBPbiB0aGUgbmV4dCBhdHRlbXB0IHRoZSBydW4gaXMgbWFya2VkIGFzIGZhaWxlZC5cbmV4cG9ydCBjb25zdCBSRVBMQVlfVElNRU9VVF9NQVhfUkVUUklFUyA9IDM7XG5cbi8qKlxuICogRWZmZWN0aXZlIHJlcGxheS10aW1lb3V0IHJldHJ5IGJ1ZGdldC4gT3ZlcnJpZGUgdmlhXG4gKiBgV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTUFYX1JFVFJJRVNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVwbGF5VGltZW91dE1heFJldHJpZXMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTUFYX1JFVFJJRVMnLFxuICAgIFJFUExBWV9USU1FT1VUX01BWF9SRVRSSUVTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSB9XG4gICk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBtYXhpbXVtIG51bWJlciBvZiBzdGVwcyB0aGUgb3duZWQtaW5saW5lIHBhdGggcnVucyBpbmxpbmUgKGluXG4gKiBwYXJhbGxlbCkgcGVyIHN1c3BlbnNpb24uIFRoZSByZXN0IGFyZSBxdWV1ZWQgdG8gYmFja2dyb3VuZCBoYW5kbGVycy4gRWFjaFxuICogaW5saW5lIHN0ZXAgaXMgY3JlYXRlZCBsYXppbHkg4oCUIGl0cyBgc3RlcF9jcmVhdGVkYCBpcyBmb2xkZWQgaW50byB0aGVcbiAqIGBzdGVwX3N0YXJ0ZWRgIHRoYXQgYGV4ZWN1dGVTdGVwYCBzZW5kcyDigJQgc28gaW5saW5pbmcgTiBzdGVwcyBzYXZlcyBOIHF1ZXVlXG4gKiByb3VuZC10cmlwcyBmb3IgYSBgUHJvbWlzZS5hbGxgLXN0eWxlIGZhbi1vdXQuIGAxYCByZXByb2R1Y2VzIHRoZVxuICogc2luZ2xlLWlubGluZS1zdGVwIGJlaGF2aW9yIGV4YWN0bHkgKHVzZWZ1bCBraWxsLXN3aXRjaCkuXG4gKlxuICogT3ZlcnJpZGUgdmlhIGBXT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTYCAoY2xhbXBlZCB0b1xuICogYE1JTl9NQVhfSU5MSU5FX1NURVBTYC4uYE1BWF9NQVhfSU5MSU5FX1NURVBTYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfSU5MSU5FX1NURVBTID0gMztcblxuLyoqIExvd2VyIGJvdW5kIGZvciB0aGUgaW5saW5lLXN0ZXBzIGVudiBvdmVycmlkZSAoMSA9IHNpbmdsZSBpbmxpbmUgc3RlcCkuICovXG5leHBvcnQgY29uc3QgTUlOX01BWF9JTkxJTkVfU1RFUFMgPSAxO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIGZvciB0aGUgaW5saW5lLXN0ZXBzIGVudiBvdmVycmlkZS4gSW5saW5lIGJvZGllcyBydW4gaW4gcGFyYWxsZWxcbiAqIHdpdGhpbiBvbmUgZnVuY3Rpb24gaW52b2NhdGlvbiwgc28gdGhpcyBjYXBzIG1lbW9yeS9DUFUgZmFuLW91dCBwZXIgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9NQVhfSU5MSU5FX1NURVBTID0gMTY7XG5cbi8vIFdhcm4tb25jZSBjYWNoZSBmb3IgV09SS0ZMT1dfTUFYX0lOTElORV9TVEVQUywga2V5ZWQgYnkgcmF3IGVudiB2YWx1ZS5cbmNvbnN0IHdhcm5lZE1heElubGluZVN0ZXBzVmFsdWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIG1heCBudW1iZXIgb2YgaW5saW5lIHN0ZXBzIGZvciB0aGUgY3VycmVudCBwcm9jZXNzLlxuICpcbiAqIFJlYWRzIGBwcm9jZXNzLmVudi5XT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTYCBsYXppbHkgc28gdGVzdHMgYW5kXG4gKiBkZXBsb3ltZW50cyBjYW4gb3ZlcnJpZGUgcGVyIGludm9jYXRpb24uIEludmFsaWQgLyBvdXQtb2YtcmFuZ2UgdmFsdWVzIGZhbGxcbiAqIGJhY2sgdG8gYSBzYWZlIHZhbHVlIChubyB0aHJvdyDigJQgdGhlIGVudiB2YXIgaXMgYW4gZXNjYXBlIGhhdGNoKSBhbmQgZW1pdCBhXG4gKiBvbmUtdGltZSB3YXJuaW5nIHNvIG1pc2NvbmZpZ3VyYXRpb24gaXMgb2JzZXJ2YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1heElubGluZVN0ZXBzKCk6IG51bWJlciB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX01BWF9JTkxJTkVfU1RFUFM7XG4gIGlmICghcmF3KSByZXR1cm4gTUFYX0lOTElORV9TVEVQUztcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHJhdyk7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYXJzZWQpIHx8IHBhcnNlZCA8PSAwKSB7XG4gICAgaWYgKCF3YXJuZWRNYXhJbmxpbmVTdGVwc1ZhbHVlcy5oYXMocmF3KSkge1xuICAgICAgd2FybmVkTWF4SW5saW5lU3RlcHNWYWx1ZXMuYWRkKHJhdyk7XG4gICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICdJZ25vcmluZyBXT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTOiBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyOyB1c2luZyBkZWZhdWx0JyxcbiAgICAgICAgeyByYXcsIGRlZmF1bHRWYWx1ZTogTUFYX0lOTElORV9TVEVQUyB9XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gTUFYX0lOTElORV9TVEVQUztcbiAgfVxuICBpZiAocGFyc2VkIDwgTUlOX01BWF9JTkxJTkVfU1RFUFMpIHJldHVybiBNSU5fTUFYX0lOTElORV9TVEVQUztcbiAgaWYgKHBhcnNlZCA+IE1BWF9NQVhfSU5MSU5FX1NURVBTKSB7XG4gICAgaWYgKCF3YXJuZWRNYXhJbmxpbmVTdGVwc1ZhbHVlcy5oYXMocmF3KSkge1xuICAgICAgd2FybmVkTWF4SW5saW5lU3RlcHNWYWx1ZXMuYWRkKHJhdyk7XG4gICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ1dPUktGTE9XX01BWF9JTkxJTkVfU1RFUFMgYWJvdmUgbWF4aW11bTsgY2xhbXBlZCcsIHtcbiAgICAgICAgcmF3LFxuICAgICAgICBjbGFtcGVkVmFsdWU6IE1BWF9NQVhfSU5MSU5FX1NURVBTLFxuICAgICAgICBtYXhWYWx1ZTogTUFYX01BWF9JTkxJTkVfU1RFUFMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIE1BWF9NQVhfSU5MSU5FX1NURVBTO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogVXBwZXIgYm91bmQgb24gdGhlIHNlcmlhbGl6ZWQgc3RlcCBpbnB1dCB0aGF0IHJlc2lsaWVudCBzdGVwIGRpc3BhdGNoIHdpbGxcbiAqIGlubGluZSBpbnRvIHRoZSBxdWV1ZSBtZXNzYWdlJ3MgYHN0ZXBJbnB1dGAuXG4gKlxuICogVmVyY2VsIFF1ZXVlcyBoYXMgbm8gaGFyZCBtZXNzYWdlLXNpemUgY2FwIChib2RpZXMgYWJvdmUgaXRzIH4yNTYgS0JcbiAqIGlubGluZSB0aHJlc2hvbGQgdHJhbnNwYXJlbnRseSBzcGlsbCB0byBTMy1iYWNrZWQgc3RvcmFnZSksIHNvIHRoaXMgYm91bmRcbiAqIGlzIGEgY29zdC9sYXRlbmN5IGNob2ljZSwgbm90IGEgcmVqZWN0aW9uIGd1YXJkOiB0aGUgbWVzc2FnZSBhbHNvIGNhcnJpZXNcbiAqIHRoZSBydW5JZCwgc3RlcElkLCBzdGVwTmFtZSwgYW5kIHRyYWNlIGNhcnJpZXIgYWxvbmdzaWRlIENCT1IgZnJhbWluZ1xuICogb3ZlcmhlYWQsIGFuZCBzdGF5aW5nIHVuZGVyIHRoZSBxdWV1ZSdzIGlubGluZSB0aHJlc2hvbGQga2VlcHMgc3RlcFxuICogbWVzc2FnZXMgb24gaXRzIGZhc3QgaW5saW5lIHBhdGggaW5zdGVhZCBvZiBwYXlpbmcgYW4gUzMgc3RvcmUrZmV0Y2hcbiAqIGRvdWJsZS1ob3AgZm9yIGJ5dGVzIHRoYXQgYWxyZWFkeSBsaXZlIGluIHRoZSBldmVudCBsb2cuIEFib3ZlIHRoaXMgc2l6ZVxuICogdGhlIGRpc3BhdGNoIGZhbGxzIGJhY2sgdG8gdGhlIHNlcXVlbnRpYWwgcGF0aCAoYHN0ZXBfY3JlYXRlZGAgd3JpdGUsIHRoZW5cbiAqIGEgcGF5bG9hZC1sZXNzIHF1ZXVlIG1lc3NhZ2UpLiBNYXRjaGVzIGBNQVhfSU5MSU5FX1JFU1VNRV9QQVlMT0FEX0JZVEVTYFxuICogb24gdGhlIHJlc2lsaWVudCBob29rIHJlc3VtZSBwYXRoLlxuICovXG5leHBvcnQgY29uc3QgTUFYX1JFU0lMSUVOVF9TVEVQX0lOUFVUX0JZVEVTID0gMTI4ICogMTAyNDtcblxuLyoqXG4gKiBXaGV0aGVyIHJlc2lsaWVudCBzdGVwIGRpc3BhdGNoIGlzIGVuYWJsZWQ6IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXJcbiAqIHBhcmFsbGVsaXplcyBlYWNoIG5ld2x5IGNyZWF0ZWQgc3RlcCdzIGBzdGVwX2NyZWF0ZWRgIGV2ZW50IHdyaXRlIHdpdGggaXRzXG4gKiBzdGVwLWV4ZWN1dGlvbiBxdWV1ZSBwdWJsaXNoLCBjYXJyeWluZyB0aGUgc2VyaWFsaXplZCBzdGVwIGlucHV0IGluIHRoZVxuICogcXVldWUgbWVzc2FnZSAoYHN0ZXBJbnB1dGApIHNvIHRoZSBjb25zdW1lciBjYW4gaWRlbXBvdGVudGx5IHJlLWVuc3VyZSB0aGVcbiAqIGV2ZW50IGlmIHRoZSBkaXJlY3Qgd3JpdGUgZmFpbGVkIHRyYW5zaWVudGx5LiBNaXJyb3JzIHRoZSByZXNpbGllbnQgc3RhcnRcbiAqIChgcnVuSW5wdXRgKSBhbmQgcmVzaWxpZW50IGhvb2sgcmVzdW1lIChgaG9va0lucHV0YCkgcGF0dGVybnMuXG4gKlxuICogKipPZmYgYnkgZGVmYXVsdC4qKiBFbmFibGUgdmlhIGBXT1JLRkxPV19SRVNJTElFTlRfU1RFUF9ESVNQQVRDSD0xYC5cbiAqXG4gKiBUaGUgcXVldWUgcHVibGlzaCByYWNlcyB0aGUgY3JlYXRlJ3MgdmVyZGljdCwgYW5kIGEgY3JlYXRlIGNhbiBjb21lIGJhY2tcbiAqIHJlZnVzZWQg4oCUIGFzIGEgZHVwbGljYXRlIHRoaXMgcmVwbGF5IHNob3VsZCBzdG9wIHB1cnN1aW5nLCBvciBhcyBhIHN0YWxlXG4gKiB3cml0ZSBvbiBhIFdvcmxkIHRoYXQgcmVmdXNlcyByYXRoZXIgdGhhbiByZXBvcnRzLiBFaXRoZXIgd2F5IHRoZSBtZXNzYWdlXG4gKiBjYXJyeWluZyB0aGUgcGF5bG9hZCBpcyBhbHJlYWR5IG91dCwgc28gdGhlIGNvbnN1bWVyIGNhbiBtYXRlcmlhbGl6ZSBhIHN0ZXBcbiAqIHdob3NlIGNyZWF0ZSB3YXMgcmVmdXNlZCwgYW5kIG5vdGhpbmcgb3JkZXJzIHRoZSB2ZXJkaWN0IGJlZm9yZSB0aGVcbiAqIGNvbnN1bWVyJ3MgcmVkZWxpdmVyeSByZS1lbnN1cmUuIEVuYWJsaW5nIHRoaXMgdHJhZGVzIHRoYXQgd2luZG93IGZvciB0aGVcbiAqIGxhdGVuY3kgdGhlIHBhcmFsbGVsIHB1Ymxpc2ggc2F2ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc2lsaWVudFN0ZXBEaXNwYXRjaEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5XT1JLRkxPV19SRVNJTElFTlRfU1RFUF9ESVNQQVRDSCA9PT0gJzEnO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYmF0Y2hlZCBldmVudCB0cmFuc2l0aW9ucyBhcmUgZW5hYmxlZDogdGhlIHN1c3BlbnNpb24gaGFuZGxlciBmb2xkc1xuICogYSBjbGVhbiBmYW4tb3V0J3MgYHN0ZXBfY3JlYXRlZGAgKyBgd2FpdF9jcmVhdGVkYCB3cml0ZXMgaW50byBvbmVcbiAqIGB3b3JsZC5ldmVudHMuY3JlYXRlQmF0Y2hgIGNhbGwgKG9uZSBkdXJhYmxlIHdyaXRlLCBwZXItZXZlbnQgb3V0Y29tZXMpXG4gKiBpbnN0ZWFkIG9mIG9uZSB3cml0ZSBwZXIgZXZlbnQuIE9ubHkgZW5nYWdlcyB3aGVuIHRoZSBXb3JsZCBpbXBsZW1lbnRzIHRoZVxuICogb3B0aW9uYWwgYGV2ZW50cy5jcmVhdGVCYXRjaGAgQU5EIHRoZSBydW4gaXMgb24gc2xvdCBpZGVudGl0eVxuICogKHNwZWNWZXJzaW9uID49IDYpIEFORCB0aGUgc3VzcGVuc2lvbiBjYXJyaWVzIG5vIGF0dHJpYnV0ZS9ob29rIHdyaXRlcyBhbmRcbiAqIG5vIHJlc2lsaWVudCBzdGVwIGRpc3BhdGNoIOKAlCBldmVyeXRoaW5nIGVsc2Uga2VlcHMgdGhlIHNpbmdsZS1ldmVudCBwYXRoXG4gKiBieXRlLWZvci1ieXRlLlxuICpcbiAqIFJlYWRzIGBwcm9jZXNzLmVudi5XT1JLRkxPV19CQVRDSF9UUkFOU0lUSU9OU2AgbGF6aWx5LiBEZWZhdWx0ICoqT04qKjtcbiAqIGRpc2FibGVkIG9ubHkgYnkgYW4gZXhwbGljaXQgYCcwJ2AgLyBgJ2ZhbHNlJ2AgKGNhc2UtaW5zZW5zaXRpdmUpIOKAlCB0aGVcbiAqIG9wZXJhdG9yIGVzY2FwZSBoYXRjaCB0aGF0IHJlc3RvcmVzIHRoZSBleGFjdCBwcmlvciBvbmUtd3JpdGUtcGVyLWV2ZW50XG4gKiBwYXRoLCBtaXJyb3JpbmcgYFdPUktGTE9XX1RVUkJPYCdzIGtpbGwtc3dpdGNoIHNoYXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCYXRjaFRyYW5zaXRpb25zRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfQkFUQ0hfVFJBTlNJVElPTlM7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuICEocmF3ID09PSAnMCcgfHwgcmF3LnRvTG93ZXJDYXNlKCkgPT09ICdmYWxzZScpO1xufVxuXG4vKipcbiAqIENlaWxpbmcgb24gZXZlbnRzIHBlciBgY3JlYXRlQmF0Y2hgIGNhbGwgZnJvbSB0aGUgYmF0Y2hlZCBmYW4tb3V0IGZvbGQuXG4gKiBNaXJyb3JzIHRoZSBzZXJ2ZXIncyB0cmFuc2FjdGlvbiBidWRnZXRzIHdpdGggYSBjb21mb3J0YWJsZSBtYXJnaW46IGVhY2hcbiAqIGZhbi1vdXQgZXZlbnQgY29zdHMgMiB0cmFuc2FjdGlvbiBpdGVtcyBzZXJ2ZXItc2lkZSAoZW50aXR5ICsgZXZlbnQgcm93KVxuICogYWdhaW5zdCB0aGUgMTAwLWl0ZW0gRHluYW1vREIgY2FwLCBhbmQgaW5saW5lIHBheWxvYWRzIGNvdW50IGFnYWluc3QgYVxuICogNzY4IEtCIGJ5dGUgYnVkZ2V0IOKAlCAzMiBldmVudHMgc3RheXMgd2VsbCB1bmRlciBib3RoLCBhbmQgYSBmYW4tb3V0IGxhcmdlclxuICogdGhhbiB0aGlzIHNpbXBseSBjb21taXRzIGluIHN1Y2Nlc3NpdmUgYmF0Y2hlcyAoc3BsaXQgYmF0Y2hlcyBsb3NlXG4gKiBjcm9zcy1iYXRjaCBhdG9taWNpdHksIHdoaWNoIGlzIGV4YWN0bHkgdG9kYXkncyBwZXItZXZlbnQtd3JpdGUgY3Jhc2hcbiAqIHN1cmZhY2Ug4oCUIGV2ZXJ5IGJhdGNoIHN0aWxsIGNvbnZlcmdlcyBvbiByZXRyeSB2aWEgcGVyLWV2ZW50IDQwOXMpLlxuICovXG5leHBvcnQgY29uc3QgTUFYX0JBVENIX0ZBTk9VVF9FVkVOVFMgPSAzMjtcblxuY29uc3Qgd2FybmVkTWF4RXZlbnRzVmFsdWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbi8qKlxuICogT3B0aW9uYWwgY2xpZW50LXNpZGUgb3ZlcnJpZGUgZm9yIHRoZSBzZXJ2ZXItc3VwcGxpZWQgcGVyLXJ1biBldmVudCBjZWlsaW5nLlxuICogV2hlbiBzZXQgdG8gYSBwb3NpdGl2ZSBpbnRlZ2VyLCB0aGUgcnVudGltZSBjbGFtcHMgdGhlIHNlcnZlcidzIGxpbWl0ICpkb3duKlxuICogdG8gdGhpcyB2YWx1ZSAobmV2ZXIgcmFpc2VzIGl0KSBzbyBlbmZvcmNlbWVudCBjYW4gYmUgZXhlcmNpc2VkIHdpdGhvdXQgYVxuICogc2VydmVyLXNpZGUgY2hhbmdlLiBgdW5kZWZpbmVkYCAodW5zZXQpIOKHkiB1c2UgdGhlIHNlcnZlciB2YWx1ZSBhcy1pcy5cbiAqXG4gKiBSZWFkcyBgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfTUFYX0VWRU5UU19PVkVSUklERWAgbGF6aWx5IHNvIHRlc3RzIGFuZFxuICogZGVwbG95bWVudHMgY2FuIG92ZXJyaWRlIHBlciBpbnZvY2F0aW9uLiBJbnZhbGlkIHZhbHVlcyBmYWxsIGJhY2sgdG8gdW5zZXRcbiAqIChubyB0aHJvdyDigJQgdGhlIGVudiB2YXIgaXMgYW4gZXNjYXBlIGhhdGNoKSBhbmQgZW1pdCBhIG9uZS10aW1lIHdhcm5pbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXhFdmVudHNPdmVycmlkZSgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19NQVhfRVZFTlRTX09WRVJSSURFO1xuICBpZiAoIXJhdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHJhdyk7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYXJzZWQpIHx8IHBhcnNlZCA8PSAwKSB7XG4gICAgaWYgKCF3YXJuZWRNYXhFdmVudHNWYWx1ZXMuaGFzKHJhdykpIHtcbiAgICAgIHdhcm5lZE1heEV2ZW50c1ZhbHVlcy5hZGQocmF3KTtcbiAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgJ0lnbm9yaW5nIFdPUktGTE9XX01BWF9FVkVOVFNfT1ZFUlJJREU6IG5vdCBhIHBvc2l0aXZlIGludGVnZXI7IHVzaW5nIHNlcnZlciBsaW1pdCcsXG4gICAgICAgIHsgcmF3IH1cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIG9wdGltaXN0aWMgaW5saW5lIHN0ZXAgc3RhcnQgaXMgZW5hYmxlZC4gV2hlbiBvbiwgdGhlIG93bmVkLWlubGluZVxuICogcGF0aCBiZWdpbnMgcnVubmluZyBhIGJyYW5kLW5ldyBzdGVwJ3MgYm9keSAqYmVmb3JlKiBpdHMgbGF6eSBgc3RlcF9zdGFydGVkYFxuICogbmV0d29yayBjYWxsIHJlc29sdmVzICh0aGUgaW5wdXQgaXMgYWxyZWFkeSBrbm93biBsb2NhbGx5KSwgYXdhaXRpbmcgdGhlXG4gKiBgc3RlcF9zdGFydGVkYCBvbmx5IGJlZm9yZSB0aGUgdGVybWluYWwgd3JpdGUuXG4gKlxuICogVGhpcyBjYW4gcnVuIGEgc3RlcCBib2R5IG1vcmUgdGhhbiBvbmNlIHdoZW4gaGFuZGxlcnMgcmFjZSBmb3IgdGhlIHNhbWVcbiAqIHN0ZXAncyBjcmVhdGUtY2xhaW0g4oCUIGJvdGggcnVuIHRoZSBib2R5IGJlZm9yZSBvbmUgd2lucy4gVGhhdCBpcyB1bnNhZmUgZm9yXG4gKiBzdGVwcyB3aXRoIG5vbi1pZGVtcG90ZW50IHNpZGUgZWZmZWN0czsgaW4gcGFydGljdWxhciwgdHdvIGNvbmN1cnJlbnQgcnVuc1xuICogb2YgYSBzdGVwIHRoYXQgd3JpdGVzIHRvIHRoZSB3b3JrZmxvdyBzdHJlYW0gKGUuZy4gYW4gQUkgYWdlbnQgc3RyZWFtaW5nXG4gKiB0b2tlbnMpIGNhbiBpbnRlcmxlYXZlIGFuZCBjb3JydXB0IHRoZSBzdHJlYW0gZGF0YS4gU28gdGhlIG9wdGltaXphdGlvbiBpc1xuICogKipvZmYgYnkgZGVmYXVsdCoqIGFuZCBtdXN0IGJlIGV4cGxpY2l0bHkgb3B0ZWQgaW50byBwZXIgZGVwbG95bWVudC5cbiAqXG4gKiBSZWFkcyBgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlRgIGxhemlseS4gRGVmYXVsdCBPRkY7XG4gKiBlbmFibGVkIG9ubHkgYnkgYW4gZXhwbGljaXQgYCcxJ2AgLyBgJ3RydWUnYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT3B0aW1pc3RpY0lubGluZVN0YXJ0RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlQ7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiByYXcgPT09ICcxJyB8fCByYXcudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYW4gb3BlcmF0b3IgaGFzICoqZXhwbGljaXRseSBkaXNhYmxlZCoqIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IHZpYVxuICogYFdPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUPTBgIC8gYD1mYWxzZWAuIERpc3RpbmN0IGZyb20gXCJ1bnNldFwiOiB1bnNldFxuICogbGVhdmVzIHRoZSBvcHRpbWl6YXRpb24gb2ZmIGJ5IGRlZmF1bHQgYnV0IGxldHMgdHVyYm8gZm9yY2UgaXQgb247IGFuIGV4cGxpY2l0XG4gKiBgMGAvYGZhbHNlYCBpcyBhbiBvcGVyYXRvciBvcHQtb3V0IHRoYXQgdHVyYm8gbXVzdCBob25vciAodHVyYm8ncyBmb3JjZWRcbiAqIG9wdGltaXN0aWMgc3RhcnQgc3RpbGwgcnVucyBhIHN0ZXAgYm9keSBiZWZvcmUgYHN0ZXBfc3RhcnRlZGAvYHJ1bl9zdGFydGVkYCBpc1xuICogY29uZmlybWVkLCB0aGUgcHJvcGVydHkgc3VjaCBhbiBvcGVyYXRvciBpcyBvcHRpbmcgb3V0IG9mKSwgc29cbiAqIGBmb3JjZU9wdGltaXN0aWNTdGFydGAgZGVmZXJzIHRvIHRoaXMuIFJlYWRzIHRoZSBlbnYgdmFyIGxhemlseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT3B0aW1pc3RpY0lubGluZVN0YXJ0RXhwbGljaXRseURpc2FibGVkKCk6IGJvb2xlYW4ge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVDtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHJhdyA9PT0gJzAnIHx8IHJhdy50b0xvd2VyQ2FzZSgpID09PSAnZmFsc2UnO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgXCJ0dXJibyBtb2RlXCIgaXMgZW5hYmxlZC4gVHVyYm8gbW9kZSBmYXN0LXBhdGhzIHRoZSAqZmlyc3QgZGVsaXZlcnkgb2ZcbiAqIHRoZSBmaXJzdCBpbnZvY2F0aW9uKiBvZiBhIHJ1biAoZGV0ZWN0ZWQgYnkgdGhlIGVudHJ5cG9pbnQgdmlhIGBydW5JbnB1dGBcbiAqIHByZXNlbmNlICsgYG1ldGFkYXRhLmF0dGVtcHQgPT09IDFgKTogaXQgYmFja2dyb3VuZHMgdGhlIGBydW5fc3RhcnRlZGAgZXZlbnRcbiAqIGNyZWF0aW9uLCBza2lwcyB0aGUgaW5pdGlhbCBldmVudC1sb2cgbG9hZCAobm90aGluZyBoYXMgYmVlbiB3cml0dGVuIHlldCksXG4gKiBhbmQgZm9yY2VzIG9wdGltaXN0aWMgaW5saW5lIHN0ZXAgc3RhcnQgZm9yIHRoYXQgaW52b2NhdGlvbiDigJQgaW5kZXBlbmRlbnQgb2ZcbiAqIGBXT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVGAuXG4gKlxuICogRm9yY2luZyBvcHRpbWlzdGljIHN0YXJ0IGlzIHNhZmUgaGVyZSBiZWNhdXNlIHRoZSBmaXJzdCBkZWxpdmVyeSBoYXMgbm9cbiAqIGNvbmN1cnJlbnQgcGVlciBoYW5kbGVyIHRvIHJhY2UgdGhlIHN0ZXAgY3JlYXRlLWNsYWltLCBzbyBhIHN0ZXAgYm9keSBydW5zXG4gKiBleGFjdGx5IG9uY2UuIFRoYXQgc2luZ2xlLWhhbmRsZXIgZ3VhcmFudGVlIGVuZHMgYXMgc29vbiBhcyB0aGUgcnVuIGNyZWF0ZXMgYVxuICogaG9vayBvciB3YWl0ICh3aGljaCBpbnRyb2R1Y2UgcmVzdW1lL3BhcmFsbGVsIGludm9jYXRpb25zKSwgc28gdGhlIHJ1bnRpbWVcbiAqIGV4aXRzIHR1cmJvIGF0IHRoYXQgcG9pbnQuXG4gKlxuICogUmVhZHMgYHByb2Nlc3MuZW52LldPUktGTE9XX1RVUkJPYCBsYXppbHkuIERlZmF1bHQgKipPTioqOyBkaXNhYmxlZCBvbmx5IGJ5IGFuXG4gKiBleHBsaWNpdCBgJzAnYCAvIGAnZmFsc2UnYCAoY2FzZS1pbnNlbnNpdGl2ZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1R1cmJvRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfVFVSQk87XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuICEocmF3ID09PSAnMCcgfHwgcmF3LnRvTG93ZXJDYXNlKCkgPT09ICdmYWxzZScpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIFF1aWNrSlMgZW5naW5lJ3MgYmFzZWxpbmUtc25hcHNob3Qgc3RhcnR1cCBvcHRpbWl6YXRpb24gaXNcbiAqIGVuYWJsZWQgKGRlZmF1bHQgT04pLiBXaGVuIG9uLCB0aGUgZW5naW5lIGh5ZHJhdGVzIGEgVk0gd2l0aCB0aGVcbiAqIHdvcmtmbG93IGJ1bmRsZSBvbmNlIHBlciBmdW5jdGlvbiBpbnN0YW5jZSwgc25hcHNob3RzIGl0LCBhbmQgc3RhcnRzXG4gKiBldmVyeSBpbnZvY2F0aW9uIGJ5IHJlc3RvcmluZyB0aGUgc25hcHNob3QgaW5zdGVhZCBvZiByZS1ldmFsdWF0aW5nXG4gKiB0aGUgYnVuZGxlIOKAlCBza2lwcGluZyB0aGUgZG9taW5hbnQgc2hhcmUgb2YgVk0gc3RhcnR1cCAobWVhc3VyZWRcbiAqIH43N21zIOKGkiB+M21zIHRvIGZpcnN0IHN1c3BlbnNpb24gZm9yIGEgMS4zTUIgYnVuZGxlKS4gQnVuZGxlcyB3aG9zZVxuICogbW9kdWxlIHNjb3BlIGNvbnN1bWVzIHJhbmRvbW5lc3MsIHJlYWRzIHRoZSBjbG9jaywgb3IgcmVwbGFjZXMgYVxuICogc2VyaWFsaXphdGlvbiBpbnRyaW5zaWMgYXJlIGRldGVjdGVkIGF0IGh5ZHJhdGUgdGltZSBhbmRcbiAqIGF1dG9tYXRpY2FsbHkgZmFsbCBiYWNrIHRvIHBlci1pbnZvY2F0aW9uIGZyZXNoIGV2YWx1YXRpb24gKHNlZVxuICogcHJlcGFyZUJhc2VsaW5lU25hcHNob3QpLiBTZXQgV09SS0ZMT1dfUVVJQ0tKU19CQVNFTElORV9TTkFQU0hPVD0wIHRvXG4gKiBkaXNhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNRdWlja0pTQmFzZWxpbmVTbmFwc2hvdEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX1FVSUNLSlNfQkFTRUxJTkVfU05BUFNIT1Q7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuICEocmF3ID09PSAnMCcgfHwgcmF3LnRvTG93ZXJDYXNlKCkgPT09ICdmYWxzZScpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGlubGluZSBsb29wIHJldGFpbnMgYSBzdXNwZW5kZWQgd29ya2Zsb3cgVk0gYWNyb3NzIGlubGluZSBzdGVwc1xuICogd2l0aGluIG9uZSBpbnZvY2F0aW9uIChkZWZhdWx0IE9OKS4gV2hlbiBvbiwgYSBzdGVwLW9ubHkgc3VzcGVuc2lvbiBrZWVwc1xuICogdGhlIGxpdmUgVk0sIGV2ZW50IGNvbnN1bWVyLCBhbmQgaHlkcmF0ZWQgc3RhdGUgYWxpdmUsIGFuZCB0aGUgbmV4dCBsb29wXG4gKiBpdGVyYXRpb24gYXBwZW5kcyBvbmx5IHRoZSBuZXdseSBkdXJhYmxlIGV2ZW50cyBpbnN0ZWFkIG9mIHJlYnVpbGRpbmcgdGhlXG4gKiBgdm0uQ29udGV4dGAgYW5kIHJlcGxheWluZyB0aGUgd2hvbGUgZXZlbnQgbG9nLiBOb24tc3RlcCBzdXNwZW5zaW9ucyBhbmRcbiAqIHJlcGxheSBkaXZlcmdlbmNlIGFsd2F5cyBmYWxsIGJhY2sgdG8gdGhlIG9yZGluYXJ5IGR1cmFibGUgcmVwbGF5IHBhdGguXG4gKlxuICogYFdPUktGTE9XX1JFVEFJTkVEX1ZNPTBgIChvciBgZmFsc2VgKSBpcyB0aGUga2lsbCBzd2l0Y2g6IGV2ZXJ5IGl0ZXJhdGlvblxuICogcmVwbGF5cyBmcm9tIHNjcmF0Y2ggaW4gYSBmcmVzaCBWTSwgbWF0Y2hpbmcgdGhlIHByZS1yZXRlbnRpb24gYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZtUmV0ZW50aW9uRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfUkVUQUlORURfVk07XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuICEocmF3ID09PSAnMCcgfHwgcmF3LnRvTG93ZXJDYXNlKCkgPT09ICdmYWxzZScpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgaW5saW5lIHN0ZXAgb3duZXJzaGlwIGlzIGVuYWJsZWQgKGRlZmF1bHQgT04pLiBXaGVuIG9uLCB0aGUgbGF6eVxuICogYHN0ZXBfc3RhcnRlZGAgdGhhdCBjcmVhdGVzIGFuIGlubGluZSBzdGVwIHJlY29yZHMgdGhlIG93bmluZyBxdWV1ZVxuICogbWVzc2FnZSBJRCwgYW5kIHdha2UgcmVwbGF5cyB0aGF0IG9ic2VydmUgYW4gYWN0aXZlbHktb3duZWQgc3RlcCBlbnF1ZXVlIGFcbiAqICpkZWxheWVkIGJhY2tzdG9wKiBtZXNzYWdlIGluc3RlYWQgb2YgaW1tZWRpYXRlbHkgcmVxdWV1ZWluZyBpdCDigJQgZml4aW5nXG4gKiBkdXBsaWNhdGUgaW5saW5lIHN0ZXAgZXhlY3V0aW9uIHdoZW4gYSBob29rL3dhaXQgd2FrZXMgYSBydW4gbWlkLXN0ZXBcbiAqICh2ZXJjZWwvd29ya2Zsb3cjMjc4MCkuXG4gKlxuICogYFdPUktGTE9XX0lOTElORV9PV05FUlNISVA9MGAgKG9yIGBmYWxzZWApIGlzIHRoZSBraWxsIHN3aXRjaDogZGlzcGF0Y2hcbiAqIHJldmVydHMgdG8gdGhlIHVuY29uZGl0aW9uYWwgaW1tZWRpYXRlIHJlcXVldWUuIFN0YW1waW5nIGlzIHVuYWZmZWN0ZWQg4oCUXG4gKiB0aGUgcmVjb3JkZWQgb3duZXJNZXNzYWdlSWQgaXMgaW5lcnQgZGF0YSB3aGVuIHRoZSBzd2l0Y2ggaXMgb2ZmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbmxpbmVPd25lcnNoaXBFbmFibGVkKCk6IGJvb2xlYW4ge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19JTkxJTkVfT1dORVJTSElQO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhKHJhdyA9PT0gJzAnIHx8IHJhdy50b0xvd2VyQ2FzZSgpID09PSAnZmFsc2UnKTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGlubGluZS1vd25lcnNoaXAgbGVhc2UsIGluIHNlY29uZHM6IGhvdyBsb25nIGFmdGVyIGEgc3RlcCdzIGxhdGVzdFxuICogKHN0YW1wZWQpIGBzdGVwX3N0YXJ0ZWRgIGEgbm9uLW93bmVyIGludm9jYXRpb24gYXNzdW1lcyB0aGUgb3duaW5nXG4gKiBpbnZvY2F0aW9uIG1heSBzdGlsbCBiZSBhbGl2ZS4gV2l0aGluIHRoZSBsZWFzZSwgd2FrZSByZXBsYXlzIGVucXVldWUgdGhlXG4gKiBzdGVwJ3MgYmFja3N0b3AgbWVzc2FnZSB3aXRoIGBkZWxheVNlY29uZHMgPSBsZWFzZSByZW1haW5pbmdgIGluc3RlYWQgb2ZcbiAqIGltbWVkaWF0ZWx5OyBwYXN0IGl0LCB0aGV5IGVucXVldWUgaW1tZWRpYXRlbHkgKHRvZGF5J3MgYmVoYXZpb3IpLlxuICpcbiAqIFdoeSBhIGZpeGVkIDg2MCBhbmQgbm90IGEgdmFsdWUgZGVyaXZlZCBmcm9tIHRoZSBmdW5jdGlvbidzIGBtYXhEdXJhdGlvbmA6XG4gKiBuZWl0aGVyIHJ1bnRpbWUgbm9yIGJ1aWxkIHRpbWUgY2FuIHNlZSB0aGUgcmVzb2x2ZWQgdmFsdWUg4oCUIGJ1aWxkZXJzIGVtaXRcbiAqIGBtYXhEdXJhdGlvbjogJ21heCdgLCB3aGljaCB0aGUgcGxhdGZvcm0gcmVzb2x2ZXMgcGVyLXBsYW4gYXQgZGVwbG95LCBhbmRcbiAqIG5vIGVudiB2YXIgb3IgcmVxdWVzdC1jb250ZXh0IGRlYWRsaW5lIEFQSSBleHBvc2VzIHRoZSByZXN1bHQuIFRoZSBib3VuZFxuICogY29tZXMgZnJvbSBhIHBsYXRmb3JtIHJ1bGUgaW5zdGVhZDogZHVyYXRpb25zIGFib3ZlIDgwMHMgcmVxdWlyZSBleHBsaWNpdFxuICogcGVyLWZ1bmN0aW9uIG51bWVyaWMgY29uZmlnLCBzbyBhIGJ1aWxkZXItZW1pdHRlZCBgJ21heCdgIHJlc29sdmVzIHRvIGF0XG4gKiBtb3N0IDgwMHMg4oCUIDg2MHMgdGhlcmVmb3JlIGRvbWluYXRlcyBhbnkgd29ya2Zsb3cgcm91dGUncyBpbnZvY2F0aW9uXG4gKiBsaWZldGltZSBwbHVzIHNjaGVkdWxpbmcgc2xhY2suIFJldmlzaXQgd2hlbiB0aGF0IGNlaWxpbmcgbW92ZXMgKHRoZVxuICogMzAtbWludXRlIGR1cmF0aW9uIGJldGEgYmVjb21pbmcgcmVhY2hhYmxlIHZpYSBgJ21heCdgIHdvdWxkIGludmFsaWRhdGVcbiAqIHRoZSBib3VuZCkuIFdvcmxkcyB3aXRob3V0IGFuIGludm9jYXRpb24ga2lsbCBib3VuZCAod29ybGQtbG9jYWwsXG4gKiBzZWxmLWhvc3RlZCkgZ2V0IG5vIGRlYXRoIHByb29mIGZyb20gYW55IGNvbnN0YW50IOKAlCB0aGVyZSB0aGUgaW4tcHJvY2Vzc1xuICogc2luZ2xlLWZsaWdodCBsYXllciAoc3RlcC1zaW5nbGUtZmxpZ2h0LnRzKSBpcyB3aGF0IG1ha2VzIGEgYmFja3N0b3BcbiAqIGZpcmluZyBtaWQtc3RlcCBoYXJtbGVzcy5cbiAqXG4gKiA4NjAgYWxzbyBzdGF5cyB1bmRlciB0aGUgcXVldWUncyA5MDBzIG1heGltdW0gZGVsYXkgKFNRUyBjYXApLCBzbyBhXG4gKiBiYWNrc3RvcCdzIGZ1bGwgbGVhc2UgcmVtYWluZGVyIGFsd2F5cyBmaXRzIGluIGEgc2luZ2xlIGRlbGF5ZWQgbWVzc2FnZS5cbiAqXG4gKiBPdmVycmlkZSB2aWEgYFdPUktGTE9XX0lOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EU2AgKGNsYW1wZWQgdG9cbiAqIDEuLmBNQVhfSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBJTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFMgPSA4NjA7XG5cbi8qKlxuICogVXBwZXIgYm91bmQgZm9yIHRoZSBsZWFzZSBlbnYgb3ZlcnJpZGUuIDkwMHMgaXMgdGhlIHF1ZXVlJ3MgbWF4aW11bVxuICogcGVyLW1lc3NhZ2UgZGVsYXkgKFNRUyBjYXApIOKAlCBhIGxvbmdlciBsZWFzZSB3b3VsZCBuZWVkIGRlbGF5IGNoYWluaW5nXG4gKiBsaWtlIGxvbmcgd2FpdHMgdXNlOyBjbGFtcCBpbnN0ZWFkIHNvIG9uZSBkZWxheWVkIG1lc3NhZ2UgYWx3YXlzIHN1ZmZpY2VzLlxuICovXG5leHBvcnQgY29uc3QgTUFYX0lOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EUyA9IDkwMDtcblxuLyoqXG4gKiBFZmZlY3RpdmUgaW5saW5lLW93bmVyc2hpcCBsZWFzZS4gT3ZlcnJpZGUgdmlhXG4gKiBgV09SS0ZMT1dfSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTYCDigJQgZS5nLiByYWlzZSBpdCBvbiBzZWxmLWhvc3RlZFxuICogbXVsdGktaW5zdGFuY2Ugd29ybGRzIHdpdGggbG9uZy1ydW5uaW5nIHN0ZXBzIHRvIHdpZGVuIHRoZSB3aW5kb3cgaW4gd2hpY2hcbiAqIGEgbGl2ZSBvd25lciBpcyBwcm90ZWN0ZWQgZnJvbSBhIGNvbmN1cnJlbnQgYmFja3N0b3AgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzKCk6IG51bWJlciB7XG4gIHJldHVybiBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX0lOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EUycsXG4gICAgSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAxLCBtYXg6IE1BWF9JTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFMgfVxuICApO1xufVxuXG4vLyBBIHJlcGxheS1jb25zdW1lciBtaXNtYXRjaCBjYW4gYmUgY2F1c2VkIGJ5IGEgdHJhbnNpZW50IGRpdmVyZ2VudCByZXBsYXlcbi8vIHJhdGhlciB0aGFuIGFuIGludmFsaWQgcGVyc2lzdGVkIGhpc3RvcnkuIFF1ZXVlIGJvdW5kZWQgcmVjb3ZlcnkgcmVwbGF5c1xuLy8gYmVmb3JlIHJlY29yZGluZyB0ZXJtaW5hbCBjb3JydXB0aW9uIGZvciBhIHJ1biB0aGF0IGNhbm5vdCByZXBsYXkuXG5leHBvcnQgY29uc3QgUkVQTEFZX0RJVkVSR0VOQ0VfTUFYX1JFVFJJRVMgPSAzO1xuXG4vKipcbiAqIEVmZmVjdGl2ZSByZXBsYXktZGl2ZXJnZW5jZSByZWNvdmVyeSBidWRnZXQuIE92ZXJyaWRlIHZpYVxuICogYFdPUktGTE9XX1JFUExBWV9ESVZFUkdFTkNFX01BWF9SRVRSSUVTYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcGxheURpdmVyZ2VuY2VNYXhSZXRyaWVzKCk6IG51bWJlciB7XG4gIHJldHVybiBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX1JFUExBWV9ESVZFUkdFTkNFX01BWF9SRVRSSUVTJyxcbiAgICBSRVBMQVlfRElWRVJHRU5DRV9NQVhfUkVUUklFUyxcbiAgICB7IGludGVnZXI6IHRydWUgfVxuICApO1xufVxuXG4vLyBBIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvbiAoNDEyKSBtZWFucyB0aGUgcmVwbGF5J3MgZXZlbnQgbG9nIHdhcyBtaXNzaW5nIGFuXG4vLyBldmVudCB0aGUgV29ybGQgaGFkIGFscmVhZHkgcmVjb3JkZWQsIHNvIHRoZSByZXBsYXkgaXMgcmUtZGVyaXZlZCBmcm9tIGFcbi8vIGNvcnJlY3RlZCBsb2cgaW5zaWRlIHRoZSBzYW1lIGludm9jYXRpb24uIEJvdW5kZWQgYmVjYXVzZSBhIHBlcnNpc3RlbnRseVxuLy8gcmVqZWN0ZWQgd3JpdGUgc2hvdWxkIGVzY2FsYXRlIHJhdGhlciB0aGFuIHNwaW46IGFmdGVyIHRoaXMgbWFueSByZXN0YXJ0cyB0aGVcbi8vIHJ1biBpcyByZS1pbnZva2VkIChhIG5ldyBpbnZvY2F0aW9uLCBwb3NzaWJseSBpbiBhIGRpZmZlcmVudCByZWdpb24pLCBhbmQgdGhlXG4vLyBydW4tbGV2ZWwgYnVkZ2V0IGJlbG93IHRoZW4gYXBwbGllcy5cbmV4cG9ydCBjb25zdCBQUkVDT05ESVRJT05fTUFYX0lOUFJPQ0VTU19SRVNUQVJUUyA9IDM7XG5cbi8qKlxuICogRWZmZWN0aXZlIGluLXByb2Nlc3MgcmVwbGF5LXJlc3RhcnQgYnVkZ2V0IGZvciBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb25zLlxuICogT3ZlcnJpZGUgdmlhIGBXT1JLRkxPV19QUkVDT05ESVRJT05fTUFYX0lOUFJPQ0VTU19SRVNUQVJUU2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcmVjb25kaXRpb25NYXhJblByb2Nlc3NSZXN0YXJ0cygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19QUkVDT05ESVRJT05fTUFYX0lOUFJPQ0VTU19SRVNUQVJUUycsXG4gICAgUFJFQ09ORElUSU9OX01BWF9JTlBST0NFU1NfUkVTVEFSVFMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlIH1cbiAgKTtcbn1cblxuLy8gVGhlIGluLXByb2Nlc3MgYnVkZ2V0IGFib3ZlIGlzIHBlci1pbnZvY2F0aW9uLCBhbmQgYSByZS1pbnZvY2F0aW9uIHRoYXRcbi8vIGVucXVldWVzIGEgZnJlc2ggbWVzc2FnZSBhbHNvIHJlc3RhcnRzIHRoZSBxdWV1ZSdzIGRlbGl2ZXJ5IGNvdW50LCBzbyB3aXRob3V0XG4vLyBhIGNvdW50ZXIgY2FycmllZCBvbiB0aGUgbWVzc2FnZSBhIHBlcm1hbmVudGx5IGZlbmNlZCBydW4gaGFzIG5vIHJ1bi1sZXZlbFxuLy8gYm91bmQgYXQgYWxsLiBJdCBjYW4gc3RheSBmZW5jZWQgd2l0aG91dCBhbnkgcGVybWFuZW50IGZhdWx0IOKAlCBhIGZ1bGwgcmVsb2FkXG4vLyBpcyBub3QgYXRvbWljIGFjcm9zcyBwYWdlcywgc28gYSBidXN5IHJ1biBjYW4gYWNxdWlyZSBhIG5ldyBob2xlIG9uIGV2ZXJ5XG4vLyByZWxvYWQg4oCUIHNvIHRoZSBjaGFpbiBpcyBjb3VudGVkIGFuZCB0aGUgcnVuIGZhaWxzIG9uY2UgdGhpcyBtYW55XG4vLyByZS1pbnZvY2F0aW9ucyBoYXZlIGJlZW4gc3BlbnQgb24gc3RhbGUtc25hcHNob3QgcmVqZWN0aW9ucy5cbmV4cG9ydCBjb25zdCBQUkVDT05ESVRJT05fTUFYX1JFSU5WT0NBVElPTlMgPSA1O1xuXG4vKipcbiAqIEVmZmVjdGl2ZSBwZXItcnVuIGJ1ZGdldCBmb3IgcmUtaW52b2NhdGlvbnMgY2F1c2VkIGJ5IHN0YWxlLXNuYXBzaG90XG4gKiByZWplY3Rpb25zLiBPdmVycmlkZSB2aWEgYFdPUktGTE9XX1BSRUNPTkRJVElPTl9NQVhfUkVJTlZPQ0FUSU9OU2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcmVjb25kaXRpb25NYXhSZWludm9jYXRpb25zKCk6IG51bWJlciB7XG4gIHJldHVybiBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX1BSRUNPTkRJVElPTl9NQVhfUkVJTlZPQ0FUSU9OUycsXG4gICAgUFJFQ09ORElUSU9OX01BWF9SRUlOVk9DQVRJT05TLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSB9XG4gICk7XG59XG5cbi8vIEJhY2tvZmYgYmVmb3JlIGEgcHJlY29uZGl0aW9uIHJlLWludm9jYXRpb24uIFVubGlrZSB0aGUgaW4tcHJvY2VzcyByZXN0YXJ0XG4vLyAod2hlcmUgdGhlIHBvaW50IGlzIHRvIHJlLXJlYWQgaW1tZWRpYXRlbHkpLCBhIHJlLWludm9jYXRpb24gb25seSBoYXBwZW5zXG4vLyBhZnRlciB0aGUgaW4tcHJvY2VzcyBidWRnZXQgZmFpbGVkIHRvIGNhdGNoIHVwLCBzbyB0aGUgbG9nIGlzIGJlaW5nIGV4dGVuZGVkXG4vLyBmYXN0ZXIgdGhhbiB0aGlzIHJlcGxheSBjYW4gZm9sbG93IGl0LiBXYWl0aW5nIGxldHMgdGhlIHdyaXRlcnMgcXVpZXNjZS5cbmV4cG9ydCBjb25zdCBQUkVDT05ESVRJT05fUkVJTlZPS0VfREVMQVlfU0VDT05EUyA9IDI7XG5cbi8qKlxuICogRWZmZWN0aXZlIGRlbGF5IGJlZm9yZSBhIHByZWNvbmRpdGlvbiByZS1pbnZvY2F0aW9uLiBPdmVycmlkZSB2aWFcbiAqIGBXT1JLRkxPV19QUkVDT05ESVRJT05fUkVJTlZPS0VfREVMQVlfU0VDT05EU2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcmVjb25kaXRpb25SZWludm9rZURlbGF5U2Vjb25kcygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19QUkVDT05ESVRJT05fUkVJTlZPS0VfREVMQVlfU0VDT05EUycsXG4gICAgUFJFQ09ORElUSU9OX1JFSU5WT0tFX0RFTEFZX1NFQ09ORFMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlIH1cbiAgKTtcbn1cblxuLy8gQSBkZWxpdmVyeSByZWFjaGluZyBhIGRlcGxveW1lbnQgdGhlIHJ1biBpcyBub3QgcGlubmVkIHRvIGlzIG5vdCB0cmVhdGVkIGFzXG4vLyBwZXJtYW5lbnQuIFJlLXJvdXRlIHRoZSBtZXNzYWdlIGF0IHRoZSBydW4ncyBvd24gZGVwbG95bWVudCBhIGJvdW5kZWQgbnVtYmVyXG4vLyBvZiB0aW1lcyBiZWZvcmUgZmFpbGluZyB0aGUgcnVuIHdpdGggREVQTE9ZTUVOVF9NSVNNQVRDSC5cbmV4cG9ydCBjb25zdCBERVBMT1lNRU5UX01JU01BVENIX01BWF9SRVRSSUVTID0gMztcblxuLyoqXG4gKiBFZmZlY3RpdmUgZGVwbG95bWVudC1taXNtYXRjaCByZS1yb3V0ZSBidWRnZXQuIE92ZXJyaWRlIHZpYVxuICogYFdPUktGTE9XX0RFUExPWU1FTlRfTUlTTUFUQ0hfTUFYX1JFVFJJRVNgOyBgMGAgZmFpbHMgdGhlIHJ1biBvbiB0aGUgZmlyc3RcbiAqIG1pc3JvdXRlZCBkZWxpdmVyeSBpbnN0ZWFkIG9mIGF0dGVtcHRpbmcgcmVjb3ZlcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXBsb3ltZW50TWlzbWF0Y2hNYXhSZXRyaWVzKCk6IG51bWJlciB7XG4gIHJldHVybiBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX0RFUExPWU1FTlRfTUlTTUFUQ0hfTUFYX1JFVFJJRVMnLFxuICAgIERFUExPWU1FTlRfTUlTTUFUQ0hfTUFYX1JFVFJJRVMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlLCBtaW46IDAgfVxuICApO1xufVxuIl19
@@ -90,13 +90,11 @@ export declare function healthCheck(world: World, options?: HealthCheckOptions):
90
90
  * same array. The set is updated alongside `target`.
91
91
  *
92
92
  * Events are appended in the order the World returned them, and are not
93
- * re-sorted: a World's canonical order is its own, and the runtime cannot
94
- * reproduce it from event ids alone. `world-vercel` orders by event id, while
95
- * `world-local` orders by `(createdAt, eventId)` and deliberately re-mints keys
96
- * so that the two diverge. Every append source is already in canonical order
97
- * relative to the tail (a cursor-delimited page, or a write-response delta), so
98
- * receipt order is the order to keep. Nothing downstream may assume the tail is
99
- * the newest event — see {@link latestEventStateUpdatedAt}.
93
+ * re-sorted. Every append source is already in canonical order relative to the
94
+ * tail (a cursor-delimited page, or a write-response delta), so receipt order is
95
+ * the order to keep, and re-sorting here would only cost a pass over the log.
96
+ * Nothing downstream may assume the tail is the newest event see
97
+ * {@link maxEventSlot}.
100
98
  */
101
99
  export declare function appendUniqueEvents(target: Event[], events: readonly Event[], targetIds?: Set<string>): void;
102
100
  /**
@@ -107,8 +105,12 @@ export declare function appendUniqueEvents(target: Event[], events: readonly Eve
107
105
  * `preloadedEvents` is loaded `sortOrder: 'asc'` and is never re-sorted
108
106
  * client-side, so a `hook_received` spliced in by the lazy-resume consumer must
109
107
  * land in `eventId` order — a plain `push` would place a late-committing
110
- * earlier event after events that sort before it, corrupting replay. Event IDs
111
- * are ULIDs, so lexicographic string order matches commit order.
108
+ * earlier event after events that sort before it, corrupting replay.
109
+ *
110
+ * Lexicographic string order is the log's order: a slot id is a fixed-width
111
+ * zero-padded position, so comparing the strings compares the positions. This
112
+ * needs no parse of its own for that reason, and the comparison is exact rather
113
+ * than a reconstruction.
112
114
  */
113
115
  export declare function insertEventByEventId(target: Event[], event: Event): void;
114
116
  /**
@@ -132,70 +134,76 @@ export interface LoadedEventLog {
132
134
  events: Event[];
133
135
  cursor: string | null;
134
136
  }
135
- /**
136
- * Whether the optimistic-concurrency guard for event creation is enabled.
137
- * **On by default** where the runtime executes: replay-context creates send a
138
- * `stateUpdatedAt` snapshot (and can be rejected with 412 by a supporting
139
- * backend) unless `WORKFLOW_PRECONDITION_GUARD` is set to `0`. Backends without
140
- * guard support ignore the snapshot, so enabling by default is
141
- * backward-compatible.
142
- */
143
- export declare function isPreconditionGuardEnabled(): boolean;
144
137
  /**
145
138
  * Whether a replay refuses to run over a log with a hole in it (see
146
139
  * {@link findEventSlotGap}). **On by default**; set
147
140
  * `WORKFLOW_SLOT_GAP_CHECK=0` to replay across holes instead.
148
141
  *
149
- * The switch exists because the check trades one failure for another. A hole is
150
- * a position claimed by a write that then failed, so most of them stand for an
151
- * event that never happened and replaying past one is correct. But a hole
152
- * standing for an event that *did* happen is indistinguishable from that, and
153
- * replaying past that one produces a run whose result is wrong with nothing to
154
- * show for it. Failing loudly is the recoverable side of the trade, and this is
155
- * the way back out if a fleet turns out to carry benign holes.
142
+ * A World that allocates a position at the moment it commits leaves no hole
143
+ * behind when a write fails, so density is a property the log has by
144
+ * construction rather than one this check maintains. What the check is for is
145
+ * the reads and the Worlds where that does not hold, and by the time it runs
146
+ * the benign explanations are spent: a position missing because a concurrent
147
+ * commit is not visible yet clears on a re-read, which is what
148
+ * {@link settleEventSlotGap} does first.
149
+ *
150
+ * What is left is a hole that persists, and its two causes are
151
+ * indistinguishable from the log. Either a World allocated the position outside
152
+ * the commit and lost the write, in which case nothing happened there and
153
+ * replaying past it is correct, or an event that did happen is missing, in
154
+ * which case replaying past it decides a branch on absence and produces a wrong
155
+ * result with nothing to show for it. Failing is the recoverable side of that
156
+ * trade, and this is the way back out if a fleet turns out to carry holes of
157
+ * the first kind.
156
158
  */
157
159
  export declare function isSlotGapCheckEnabled(): boolean;
158
- /**
159
- * The `stateUpdatedAt` value to send with a replay-context event creation: the
160
- * *maximum* ULID time (epoch ms) over the events the runtime has loaded. Returns
161
- * `undefined` when there are no events or that id is not a decodable ULID.
162
- *
163
- * It is the maximum rather than the tail's because the loaded log is in the
164
- * World's canonical order, which is not necessarily event-id order (see
165
- * {@link appendUniqueEvents}). The maximum is what lets the count sent alongside
166
- * it be read as "events at or below this watermark": every loaded event is at or
167
- * below it, so the count is exactly `events.length`. Reading the tail instead
168
- * would understate the watermark on a World whose order is not id-ordered, which
169
- * is safe (it can only weaken detection) but needlessly imprecise.
170
- *
171
- * The maximum is found by lexicographic id comparison, decoding only once: the
172
- * 26-character Crockford ULID encodes its timestamp in the leading 10
173
- * characters, so the greatest id also carries the greatest time.
174
- *
175
- * Granularity: snapshots are epoch-milliseconds, and the backend allows an
176
- * equal-timestamp snapshot (an up-to-date client must not be rejected). Two
177
- * out-of-band events landing in the same millisecond where only the first was
178
- * loaded therefore pass this half of the guard undetected — that is exactly
179
- * the hole `stateEventCount` closes, since the count of events at or below the
180
- * watermark differs even when the watermarks are equal.
181
- */
182
- export declare function latestEventStateUpdatedAt(events: Event[]): number | undefined;
183
160
  /**
184
161
  * Merge the events a bump-and-report write handed back into the log it was
185
162
  * derived from, and answer how many of them were new.
186
163
  *
187
164
  * Unlike {@link appendUniqueEvents}, this re-sorts. The reported events occupy
188
165
  * slots *below* the write that reported them, so appending them would put them
189
- * after events they precede and on a slot-numbered run the id order is the
190
- * World's canonical order, so restoring it is well defined rather than a guess.
191
- * A run that is not slot-numbered cannot produce this report in the first
192
- * place; the sort is skipped rather than applied to ids it cannot order.
166
+ * after events they precede. Sorting by id restores the World's canonical order
167
+ * rather than guessing at it: a slot id is that order, written down.
193
168
  */
194
169
  export declare function mergeReportedEvents(target: Event[], events: readonly Event[]): number;
170
+ /** What {@link absorbSkippedSlotReport} did with a write's report. */
171
+ export interface SkippedSlotReport {
172
+ /** How many of the reported events were new to the log. Zero if dropped. */
173
+ added: number;
174
+ /** How many events the report offered, whether or not they were taken. */
175
+ offered: number;
176
+ /** The report was truncated, so it was dropped whole instead of merged. */
177
+ truncated: boolean;
178
+ }
179
+ /**
180
+ * Apply a write's skipped-slot report to the log it was derived from, deciding
181
+ * whether the report may be taken at all.
182
+ *
183
+ * Every replay-context write can come back carrying the events on the slots it
184
+ * skipped over, and every caller wants the same thing from them: fold them in
185
+ * so the writes that follow name a position above them, and so the replay
186
+ * resuming from this log sees them without a reload.
187
+ *
188
+ * The one policy is that a **truncated report is dropped whole**. It covers a
189
+ * span of positions but carries only some of the events on them, so merging it
190
+ * would raise the log's highest position past a position whose event is
191
+ * missing. Later writes read that maximum to say what they have seen, so each
192
+ * would claim a position it never saw, and the World only reports the span a
193
+ * write skips — it would never send the missing one. Dropping costs one more
194
+ * round of the same events on the next write and keeps the log a prefix of the
195
+ * truth, which the note above {@link mergeReportedEvents} explains is always an
196
+ * available answer.
197
+ *
198
+ * Callers that log do so from the returned counts; the decision is not theirs
199
+ * to re-derive.
200
+ */
201
+ export declare function absorbSkippedSlotReport(target: Event[], result: {
202
+ events?: readonly Event[];
203
+ hasMore?: boolean;
204
+ }): SkippedSlotReport;
195
205
  /**
196
- * The highest slot the loaded log occupies, or `undefined` when the run is not
197
- * slot-numbered. A run keeps the id scheme it was created under, so one event
198
- * settles it for the whole log.
206
+ * The highest slot the loaded log occupies, or `undefined` for an empty log.
199
207
  *
200
208
  * The maximum, not the count, and the two are not interchangeable even though
201
209
  * a healthy log makes them equal. A World hands a position to the insert that
@@ -208,8 +216,13 @@ export declare function mergeReportedEvents(target: Event[], events: readonly Ev
208
216
  *
209
217
  * A hole below the maximum is therefore a property of the read, not of the log,
210
218
  * which is what lets {@link settleEventSlotGap} re-read instead of giving up.
219
+ *
220
+ * @throws if any event id carries no slot. Every World the runtime replays
221
+ * against numbers events by slot, so an id that does not is a broken log rather
222
+ * than an older one, and a maximum derived by skipping it would understate the
223
+ * log to every write that reads it.
211
224
  */
212
- export declare function maxEventSlot(events: Event[]): number | undefined;
225
+ export declare function maxEventSlot(events: readonly Event[]): number | undefined;
213
226
  /** A position the log skips over, described well enough to name in an error. */
214
227
  export interface EventSlotGap {
215
228
  /** The lowest slot below the log's maximum that no event occupies. */
@@ -222,8 +235,8 @@ export interface EventSlotGap {
222
235
  /**
223
236
  * The hole in a loaded log, or `undefined` when there is none to find.
224
237
  *
225
- * On a slot-numbered run the World allocates every position, so a log that
226
- * holds `n` events below slot `n` is missing one. That matters before a replay
238
+ * The World allocates every position, so a log that holds `n` events below slot
239
+ * `n` is missing one. That matters before a replay
227
240
  * and nowhere else: the replay reads the log as the complete record of what has
228
241
  * happened, and an absent position is indistinguishable from an event that
229
242
  * never occurred. The branch it would have decided gets decided the other way,
@@ -240,8 +253,10 @@ export interface EventSlotGap {
240
253
  * legitimately begins at the second slot and fills in on its own. Every replay
241
254
  * that races a run's own start would otherwise report a hole.
242
255
  *
243
- * Returns `undefined` for a log this cannot read as slots at all: an empty one,
244
- * or a run numbered by ULID, where positions carry no density to check.
256
+ * Returns `undefined` for an empty log, which has no density to check.
257
+ *
258
+ * @throws if any event id carries no slot, for the reason {@link maxEventSlot}
259
+ * gives.
245
260
  */
246
261
  export declare function findEventSlotGap(events: readonly Event[]): EventSlotGap | undefined;
247
262
  /**
@@ -274,42 +289,39 @@ export declare function settleEventSlotGap(runId: string, loaded: LoadedEventLog
274
289
  gap: EventSlotGap | undefined;
275
290
  }>;
276
291
  /**
277
- * The precondition snapshot a replay-context event creation sends, describing
278
- * the event log the replay derived the event from.
279
- *
280
- * On a slot-numbered run this is `eventCount`, optionally with the set of
281
- * correlation ids the writer is blocked on. On a ULID-numbered run it is the
282
- * `stateUpdatedAt` / `stateEventCount` / `stateCursor` triple, whose three
283
- * fields are one indivisible unit: the backend reads the count only relative to
284
- * the watermark, and returns its inline delta only relative to the cursor.
285
- * Passing them as a single object is what keeps them from drifting apart at a
286
- * call site.
292
+ * How much of its run's log a replay-context event creation had loaded when it
293
+ * decided to write, as the highest slot that log occupies.
294
+ *
295
+ * One integer says it because the World keeps its positions dense: a writer
296
+ * that names slot N is claiming to hold every event from 1 to N and nothing
297
+ * above. The World answers by numbering the write above whatever the log has
298
+ * actually reached and handing back the events on the slots in between — the
299
+ * ones this writer decided without.
300
+ *
301
+ * Density is the World's invariant, not a claim about this particular read. A
302
+ * reader that is short of a position it holds no event for names a lower N,
303
+ * which understates what it has seen and only costs it a wider report. Naming
304
+ * a position it cannot account for is the direction that is unsafe, which is
305
+ * why {@link slotSnapshotParams} takes the maximum rather than the count.
306
+ *
307
+ * Its own object rather than a bare number so a call site cannot half-send it,
308
+ * and so the empty case spreads to nothing.
287
309
  */
288
- export interface PreconditionSnapshotParams {
289
- stateUpdatedAt?: number;
290
- stateEventCount?: number;
291
- stateCursor?: string;
310
+ export interface SlotSnapshotParams {
292
311
  eventCount?: number;
293
312
  }
294
313
  /**
295
- * Build the precondition snapshot to attach to a replay-context event creation.
296
- *
297
- * Returns an empty object no guard, backend behaves as before when the
298
- * guard is disabled or the watermark is not derivable. All three fields fail
299
- * open together: a count without a watermark is meaningless to the backend, and
300
- * a cursor without either would invite a delta nobody asked for.
301
- *
302
- * `stateEventCount` is `events.length` because the watermark is the log's
303
- * *maximum* ULID time, so every loaded event is at or below it regardless of the
304
- * order the World returned them in.
305
- *
306
- * Both fields are therefore invariant under permutation of the log: a maximum is
307
- * order-independent, and the length is set cardinality once `appendUniqueEvents`
308
- * has deduped by event id. Two replays that consume the same events in different
309
- * orders send an identical snapshot, so this guard detects that a log is missing
310
- * an event and can never detect that a replay consumed one in a different order.
314
+ * Build the slot snapshot to attach to a replay-context event creation.
315
+ *
316
+ * Empty for an empty log, which is the state a `run_created` write is issued
317
+ * from: there is no position held yet to name.
318
+ *
319
+ * The maximum rather than the length, for the reason {@link maxEventSlot}
320
+ * gives: a partially-read log holds fewer events than its highest position, and
321
+ * counting those would make the write claim to have seen less than it has, so
322
+ * the World would report the same events back on every attempt.
311
323
  */
312
- export declare function preconditionSnapshotParams(events: Event[], cursor?: string | null): PreconditionSnapshotParams;
324
+ export declare function slotSnapshotParams(events: readonly Event[]): SlotSnapshotParams;
313
325
  /**
314
326
  * The events a rejecting World attached to a `PreconditionFailedError`, when it
315
327
  * returned the ones the client's snapshot was missing inline.
@@ -335,6 +347,28 @@ export type EventCreator = (data: CreateEventRequest, params?: CreateEventParams
335
347
  * based on the presence of a `__health` query parameter.
336
348
  */
337
349
  export declare function withHealthCheck(handler: (req: Request) => Promise<Response>, worldSpecVersion?: number): (req: Request) => Promise<Response>;
350
+ /**
351
+ * Idempotency key for a step's background-dispatch queue message, scoped to
352
+ * the step's IDENTITY — correlation id plus (hashed) step name — rather than
353
+ * the bare correlation id.
354
+ *
355
+ * The scoping matters for resilient step dispatch under the precondition
356
+ * guard: a guard-rejected `step_created` leaves its (revoked) step message in
357
+ * flight, and the corrected replay may re-derive the same correlation id for
358
+ * a DIFFERENT step. Under a bare-correlationId key the corrected replay's
359
+ * dispatch would silently dedupe against the revoked in-flight message —
360
+ * which then resolves `skipped` against the re-created entity (the server's
361
+ * stepName fence rejects its bare start) — and the legitimate step would
362
+ * never be executed. Scoping by step name keeps every dedup property that
363
+ * matters (crash recovery re-dispatch, concurrent handlers, the delayed
364
+ * retry sharing the suspension re-dispatch's key — all name the same step)
365
+ * while letting the corrected schedule's dispatch through.
366
+ *
367
+ * Every producer of a step-dispatch (or step-retry) message must use this
368
+ * key. Cross-version mixing is not a concern: queue messages are pinned to
369
+ * the deployment that produced them, so one run never sees two key schemes.
370
+ */
371
+ export declare function stepDispatchIdempotencyKey(correlationId: string, stepName: string): string;
338
372
  /**
339
373
  * Queues a message to the specified queue with tracing.
340
374
  */
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/runtime/helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/runtime/helpers.ts"],"names":[],"mappings":"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"}