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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/dist/capabilities.d.ts +6 -0
  2. package/dist/capabilities.d.ts.map +1 -1
  3. package/dist/capabilities.js +13 -1
  4. package/dist/classify-error.d.ts.map +1 -1
  5. package/dist/classify-error.js +5 -2
  6. package/dist/create-hook.d.ts +41 -22
  7. package/dist/create-hook.d.ts.map +1 -1
  8. package/dist/create-hook.js +1 -1
  9. package/dist/describe-error.d.ts.map +1 -1
  10. package/dist/describe-error.js +12 -1
  11. package/dist/encryption.d.ts +15 -2
  12. package/dist/encryption.d.ts.map +1 -1
  13. package/dist/encryption.js +28 -7
  14. package/dist/flushable-stream.d.ts +55 -0
  15. package/dist/flushable-stream.d.ts.map +1 -1
  16. package/dist/flushable-stream.js +106 -4
  17. package/dist/global.d.ts +2 -0
  18. package/dist/global.d.ts.map +1 -1
  19. package/dist/global.js +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +2 -2
  23. package/dist/log-format.js +3 -3
  24. package/dist/private.d.ts +82 -50
  25. package/dist/private.d.ts.map +1 -1
  26. package/dist/private.js +149 -22
  27. package/dist/replay-payload-cache.d.ts +57 -0
  28. package/dist/replay-payload-cache.d.ts.map +1 -0
  29. package/dist/replay-payload-cache.js +143 -0
  30. package/dist/runtime/constants.d.ts +11 -0
  31. package/dist/runtime/constants.d.ts.map +1 -1
  32. package/dist/runtime/constants.js +26 -1
  33. package/dist/runtime/count-step-started-events.d.ts +52 -0
  34. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  35. package/dist/runtime/count-step-started-events.js +72 -0
  36. package/dist/runtime/get-port-lazy.js +4 -4
  37. package/dist/runtime/helpers.d.ts +47 -16
  38. package/dist/runtime/helpers.d.ts.map +1 -1
  39. package/dist/runtime/helpers.js +97 -28
  40. package/dist/runtime/resume-hook.d.ts +6 -3
  41. package/dist/runtime/resume-hook.d.ts.map +1 -1
  42. package/dist/runtime/resume-hook.js +180 -58
  43. package/dist/runtime/run.d.ts.map +1 -1
  44. package/dist/runtime/run.js +3 -3
  45. package/dist/runtime/runs.d.ts.map +1 -1
  46. package/dist/runtime/runs.js +5 -3
  47. package/dist/runtime/start.d.ts.map +1 -1
  48. package/dist/runtime/start.js +65 -18
  49. package/dist/runtime/step-executor.d.ts +48 -8
  50. package/dist/runtime/step-executor.d.ts.map +1 -1
  51. package/dist/runtime/step-executor.js +90 -20
  52. package/dist/runtime/suspension-handler.js +3 -3
  53. package/dist/runtime/world.d.ts +2 -7
  54. package/dist/runtime/world.d.ts.map +1 -1
  55. package/dist/runtime/world.js +3 -10
  56. package/dist/runtime.d.ts +1 -1
  57. package/dist/runtime.d.ts.map +1 -1
  58. package/dist/runtime.js +398 -184
  59. package/dist/sealed-box.d.ts +167 -0
  60. package/dist/sealed-box.d.ts.map +1 -0
  61. package/dist/sealed-box.js +571 -0
  62. package/dist/serialization/client.d.ts +3 -3
  63. package/dist/serialization/client.d.ts.map +1 -1
  64. package/dist/serialization/client.js +1 -1
  65. package/dist/serialization/codec.d.ts +6 -4
  66. package/dist/serialization/codec.d.ts.map +1 -1
  67. package/dist/serialization/codec.js +1 -1
  68. package/dist/serialization/encryption.d.ts +118 -17
  69. package/dist/serialization/encryption.d.ts.map +1 -1
  70. package/dist/serialization/encryption.js +131 -15
  71. package/dist/serialization/step.d.ts +4 -4
  72. package/dist/serialization/step.d.ts.map +1 -1
  73. package/dist/serialization/step.js +2 -2
  74. package/dist/serialization/types.d.ts +20 -0
  75. package/dist/serialization/types.d.ts.map +1 -1
  76. package/dist/serialization/types.js +11 -1
  77. package/dist/serialization-format.d.ts +44 -4
  78. package/dist/serialization-format.d.ts.map +1 -1
  79. package/dist/serialization-format.js +66 -9
  80. package/dist/serialization.d.ts +61 -21
  81. package/dist/serialization.d.ts.map +1 -1
  82. package/dist/serialization.js +556 -200
  83. package/dist/set-attributes.d.ts +2 -7
  84. package/dist/set-attributes.d.ts.map +1 -1
  85. package/dist/set-attributes.js +1 -6
  86. package/dist/step/context-storage.d.ts +2 -2
  87. package/dist/step/context-storage.d.ts.map +1 -1
  88. package/dist/step/context-storage.js +2 -2
  89. package/dist/step/writable-stream.d.ts.map +1 -1
  90. package/dist/step/writable-stream.js +14 -3
  91. package/dist/step.d.ts.map +1 -1
  92. package/dist/step.js +87 -22
  93. package/dist/symbols.d.ts +26 -0
  94. package/dist/symbols.d.ts.map +1 -1
  95. package/dist/symbols.js +27 -1
  96. package/dist/telemetry/semantic-conventions.d.ts +4 -4
  97. package/dist/telemetry/semantic-conventions.js +2 -2
  98. package/dist/version.d.ts +1 -1
  99. package/dist/version.js +2 -2
  100. package/dist/vm/index.d.ts.map +1 -1
  101. package/dist/vm/index.js +76 -9
  102. package/dist/workflow/abort-controller.d.ts +1 -1
  103. package/dist/workflow/abort-controller.d.ts.map +1 -1
  104. package/dist/workflow/abort-controller.js +38 -3
  105. package/dist/workflow/hook.d.ts.map +1 -1
  106. package/dist/workflow/hook.js +85 -30
  107. package/dist/workflow/index.d.ts +1 -1
  108. package/dist/workflow/index.d.ts.map +1 -1
  109. package/dist/workflow/index.js +2 -2
  110. package/dist/workflow/set-attributes.d.ts +0 -9
  111. package/dist/workflow/set-attributes.d.ts.map +1 -1
  112. package/dist/workflow/set-attributes.js +1 -6
  113. package/dist/workflow/sleep.d.ts.map +1 -1
  114. package/dist/workflow/sleep.js +21 -9
  115. package/dist/workflow.d.ts +14 -11
  116. package/dist/workflow.d.ts.map +1 -1
  117. package/dist/workflow.js +37 -92
  118. package/docs/api-reference/create-hook.mdx +43 -2
  119. package/docs/api-reference/define-hook.mdx +26 -24
  120. package/docs/api-reference/fatal-error.mdx +29 -7
  121. package/docs/api-reference/fetch.mdx +3 -4
  122. package/docs/api-reference/set-attributes.mdx +0 -4
  123. package/docs/api-reference/sleep.mdx +1 -1
  124. package/docs/foundations/hooks.mdx +1 -1
  125. package/docs/foundations/idempotency.mdx +16 -9
  126. package/docs/how-it-works/cancellation.mdx +2 -2
  127. package/docs/how-it-works/code-transform.mdx +19 -15
  128. package/docs/how-it-works/encryption.mdx +3 -3
  129. package/docs/how-it-works/event-sourcing.mdx +6 -6
  130. package/docs/how-it-works/framework-integrations.mdx +96 -342
  131. package/package.json +6 -6
  132. package/dist/runtime/step-handler.d.ts +0 -2
  133. package/dist/runtime/step-handler.d.ts.map +0 -1
  134. package/dist/runtime/step-handler.js +0 -839
  135. package/dist/step-hydration-cache.d.ts +0 -148
  136. package/dist/step-hydration-cache.d.ts.map +0 -1
  137. package/dist/step-hydration-cache.js +0 -171
@@ -39,7 +39,7 @@ function renderStructuredFields(framing, metadata) {
39
39
  if (!metadata || Object.keys(metadata).length === 0)
40
40
  return null;
41
41
  // Drop fields that the message already encodes. We render framings and
42
- // stacks into the message string itself in step-handler / runtime, so
42
+ // stacks into the message string itself in step executor / combined runtime, so
43
43
  // repeating them here would be pure noise.
44
44
  const redundant = new Set();
45
45
  redundant.add('errorStack');
@@ -126,7 +126,7 @@ function renderStructuredFields(framing, metadata) {
126
126
  *
127
127
  * Name: message
128
128
  * at userStep (./workflows/foo.ts:12:11)
129
- * at <unknown> (../../packages/core/src/runtime/step-handler.ts:535:32)
129
+ * at <unknown> (../../packages/core/src/runtime/step-executor.ts:535:32)
130
130
  * at <unknown> (.../node_modules/.pnpm/next@…/…/base-server.js:1454:9)
131
131
  * at <unknown> (.../node_modules/.pnpm/@opentelemetry+api@…/…/api.js:5440)
132
132
  * at … (15 more frames into Next.js / pnpm internals)
@@ -247,4 +247,4 @@ function formatPassthroughValue(v) {
247
247
  return String(v);
248
248
  }
249
249
  }
250
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLWZvcm1hdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2ctZm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sdUJBQXVCLENBQUM7QUFDOUMsT0FBTyxFQUNMLGNBQWMsRUFDZCxrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsTUFBYyxFQUNkLE9BQWUsRUFDZixRQUE2QztJQUU3QyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLE1BQU0sTUFBTSxHQUFHLHNCQUFzQixDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDL0QsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXhDLE1BQU0sS0FBSyxHQUFhLENBQUMsR0FBRyxNQUFNLElBQUksT0FBTyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkQsSUFBSSxNQUFNO1FBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixJQUFJLFdBQVc7UUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FDN0IsT0FBZSxFQUNmLFFBQTZDO0lBRTdDLElBQUksQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FB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QUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDckIsT0FBTyxDQUFDO2lCQUNMLEtBQUssQ0FBQyxJQUFJLENBQUM7aUJBQ1gsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hCLENBQUM7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsS0FBSyxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEFuc2kgZnJvbSAnQHdvcmtmbG93L2Vycm9ycy9hbnNpJztcbmltcG9ydCB7XG4gIGZvcm1hdFN0ZXBOYW1lLFxuICBmb3JtYXRXb3JrZmxvd05hbWUsXG4gIHBhcnNlU3RlcE5hbWUsXG4gIHBhcnNlV29ya2Zsb3dOYW1lLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuXG4vKipcbiAqIFN0cnVjdHVyZWQtbG9nIGNvbXBvc2l0aW9uIGZvciBgY29uc29sZS5lcnJvcmAgLyBgY29uc29sZS53YXJuYC4gRW1pdHNcbiAqIG9uZSBzdHJpbmcgaW4gdGhyZWUgc2VjdGlvbnMgc28gdGhlIG1vc3QgdXNlZnVsIGluZm9ybWF0aW9uIGlzIGF0IHRoZVxuICogdG9wLCBzdGFjayB0cmFjZSBhdCB0aGUgYm90dG9tOlxuICpcbiAqICAgICBbd29ya2Zsb3ctc2RrXSA8ZnJhbWluZyBsaW5lPlxuICogICAgICAgdXNlciBlcnJvciDCtyBGYXRhbEVycm9yXG4gKiAgICAgICBydW4gICAgd3J1bl/igKZcbiAqICAgICAgIHN0ZXAgICBzdGVwX+KApiDCtyBhZGQgKC4vd29ya2Zsb3dzL3gpXG4gKiAgICAgICBoaW50OiAgTW92ZSB0aGUgY2FsbCB0byBhIHN0ZXAgZnVuY3Rpb24uXG4gKiAgICAgRmF0YWxFcnJvcjog4oCmXG4gKiAgICAgICAgIGF0IOKApiAodHJpbW1lZCBzdGFjayDigJQgaW50ZXJuYWxzIGNvbGxhcHNlZClcbiAqXG4gKiBXaXRob3V0IHRoaXMgY29tcG9zaXRpb24sIGNhbGxlcnMgcGFzc2luZyBgJHtmcmFtaW5nfVxcbiR7c3RhY2t9YCBhcyB0aGVcbiAqIG1lc3NhZ2UgYW5kIHN0cnVjdHVyZWQgZmllbGRzIGFzIHRoZSBtZXRhZGF0YSBvYmplY3QgZ290IGB1dGlsLmluc3BlY3RgJ3NcbiAqIGRlZmF1bHQgb2JqZWN0IGR1bXAgYXBwZW5kZWQgKmFmdGVyKiB0aGUgc3RhY2ssIHdoaWNoIGJ1cmllcyB0aGUgcnVuIElEXG4gKiBhbmQgYXR0cmlidXRpb24gYmFkZ2UgdW5kZXIgMzArIGxpbmVzIG9mIGBub2RlX21vZHVsZXMvLnBucG0vLi4uYCBmcmFtZXMuXG4gKlxuICogVGhlIHNhbWUgbWV0YWRhdGEgaXMgYWxzbyBlbWl0dGVkIGFzIHN0cnVjdHVyZWQgT1RlbCBzcGFuIGV2ZW50cyBmcm9tXG4gKiB0aGUgbG9nZ2VyIGl0c2VsZiwgc28gYmFja2VuZHMgdGhhdCB3YW50IEpTT04tc2hhcGVkIGRhdGEgc3RpbGwgZ2V0IGl0LlxuICogd2ViL3dlYi1zaGFyZWQgZG8gbm90IGNvbnN1bWUgc3RkZXJyIGF0IGFsbCDigJQgdGhleSByZWFkIENCT1IvSlNPTiBldmVudFxuICogcGF5bG9hZHMgZnJvbSB0aGUgV29ybGQgZXZlbnQgbG9nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZUxvZ0xpbmUoXG4gIHByZWZpeDogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHtcbiAgY29uc3QgW2ZyYW1pbmcsIC4uLnJlc3RdID0gbWVzc2FnZS5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IGJvZHkgPSByZXN0LmpvaW4oJ1xcbicpO1xuICBjb25zdCBmaWVsZHMgPSByZW5kZXJTdHJ1Y3R1cmVkRmllbGRzKGZyYW1pbmcgPz8gJycsIG1ldGFkYXRhKTtcbiAgY29uc3QgdHJpbW1lZEJvZHkgPSB0cmltU3RhY2tCb2R5KGJvZHkpO1xuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtgJHtwcmVmaXh9ICR7ZnJhbWluZyA/PyAnJ31gXTtcbiAgaWYgKGZpZWxkcykgbGluZXMucHVzaChmaWVsZHMpO1xuICBpZiAodHJpbW1lZEJvZHkpIGxpbmVzLnB1c2godHJpbW1lZEJvZHkpO1xuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclN0cnVjdHVyZWRGaWVsZHMoXG4gIGZyYW1pbmc6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKCFtZXRhZGF0YSB8fCBPYmplY3Qua2V5cyhtZXRhZGF0YSkubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAvLyBEcm9wIGZpZWxkcyB0aGF0IHRoZSBtZXNzYWdlIGFscmVhZHkgZW5jb2Rlcy4gV2UgcmVuZGVyIGZyYW1pbmdzIGFuZFxuICAvLyBzdGFja3MgaW50byB0aGUgbWVzc2FnZSBzdHJpbmcgaXRzZWxmIGluIHN0ZXAtaGFuZGxlciAvIHJ1bnRpbWUsIHNvXG4gIC8vIHJlcGVhdGluZyB0aGVtIGhlcmUgd291bGQgYmUgcHVyZSBub2lzZS5cbiAgY29uc3QgcmVkdW5kYW50ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHJlZHVuZGFudC5hZGQoJ2Vycm9yU3RhY2snKTtcbiAgaWYgKFxuICAgIHR5cGVvZiBtZXRhZGF0YS5lcnJvck1lc3NhZ2UgPT09ICdzdHJpbmcnICYmXG4gICAgZnJhbWluZy5pbmNsdWRlcyhtZXRhZGF0YS5lcnJvck1lc3NhZ2UgYXMgc3RyaW5nKVxuICApIHtcbiAgICByZWR1bmRhbnQuYWRkKCdlcnJvck1lc3NhZ2UnKTtcbiAgfVxuXG4gIGNvbnN0IHdlbGxLbm93biA9IG5ldyBTZXQoW1xuICAgICd3b3JrZmxvd1J1bklkJyxcbiAgICAnd29ya2Zsb3dOYW1lJyxcbiAgICAnc3RlcElkJyxcbiAgICAnc3RlcE5hbWUnLFxuICAgICdlcnJvckF0dHJpYnV0aW9uJyxcbiAgICAnZXJyb3JDb2RlJyxcbiAgICAnZXJyb3JOYW1lJyxcbiAgICAnZXJyb3JNZXNzYWdlJyxcbiAgICAnZXJyb3JTdGFjaycsXG4gICAgJ2hpbnQnLFxuICAgICdhdHRlbXB0JyxcbiAgICAncmV0cnlDb3VudCcsXG4gIF0pO1xuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIEhlYWRlcjogZXJyb3IgY2xhc3MgKyBhdHRyaWJ1dGlvbiBiYWRnZS5cbiAgY29uc3QgZXJyb3JOYW1lID0gcGlja1N0cmluZyhtZXRhZGF0YSwgJ2Vycm9yTmFtZScpO1xuICBjb25zdCBhdHRyaWJ1dGlvbiA9IHBpY2tTdHJpbmcobWV0YWRhdGEsICdlcnJvckF0dHJpYnV0aW9uJyk7XG4gIGlmIChlcnJvck5hbWUgfHwgYXR0cmlidXRpb24pIHtcbiAgICBjb25zdCBiYWRnZSA9IGF0dHJpYnV0aW9uXG4gICAgICA/IGF0dHJpYnV0aW9uID09PSAnc2RrJ1xuICAgICAgICA/IEFuc2kubWFnZW50YSgnc2RrIGVycm9yJylcbiAgICAgICAgOiBBbnNpLnJlZCgndXNlciBlcnJvcicpXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGNscyA9IGVycm9yTmFtZSA/IEFuc2kuYm9sZChlcnJvck5hbWUpIDogJyc7XG4gICAgY29uc3Qgc2VwID0gYmFkZ2UgJiYgY2xzID8gQW5zaS5kaW0oJyDCtyAnKSA6ICcnO1xuICAgIGxpbmVzLnB1c2goYCAgJHtiYWRnZX0ke3NlcH0ke2Nsc31gKTtcbiAgfVxuXG4gIC8vIElEICsgcGFyc2VkIGZyaWVuZGx5LW5hbWUgcm93cy5cbiAgY29uc3QgcnVuSWQgPSBwaWNrU3RyaW5nKG1ldGFkYXRhLCAnd29ya2Zsb3dSdW5JZCcpO1xuICBjb25zdCB3Zk5hbWUgPSBwaWNrU3RyaW5nKG1ldGFkYXRhLCAnd29ya2Zsb3dOYW1lJyk7XG4gIGlmIChydW5JZCkge1xuICAgIGxpbmVzLnB1c2goZm9ybWF0SWRSb3coJ3J1bicsIHJ1bklkLCB3Zk5hbWUsIGZvcm1hdFdvcmtmbG93TmFtZSkpO1xuICB9IGVsc2UgaWYgKHdmTmFtZSkge1xuICAgIGxpbmVzLnB1c2goZm9ybWF0SWRSb3coJ3J1bicsIG51bGwsIHdmTmFtZSwgZm9ybWF0V29ya2Zsb3dOYW1lKSk7XG4gIH1cblxuICBjb25zdCBzdGVwSWQgPSBwaWNrU3RyaW5nKG1ldGFkYXRhLCAnc3RlcElkJyk7XG4gIGNvbnN0IHN0ZXBOYW1lID0gcGlja1N0cmluZyhtZXRhZGF0YSwgJ3N0ZXBOYW1lJyk7XG4gIGlmIChzdGVwSWQgfHwgc3RlcE5hbWUpIHtcbiAgICBsaW5lcy5wdXNoKGZvcm1hdElkUm93KCdzdGVwJywgc3RlcElkLCBzdGVwTmFtZSwgZm9ybWF0U3RlcE5hbWUpKTtcbiAgfVxuXG4gIGlmIChtZXRhZGF0YS5hdHRlbXB0ICE9PSB1bmRlZmluZWQgfHwgbWV0YWRhdGEucmV0cnlDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gYGF0dGVtcHRgIGFuZCBgcmV0cnlDb3VudGAgcmVhZCBhbWJpZ3VvdXNseSBuZXh0IHRvIGVhY2ggb3RoZXIgKGlzXG4gICAgLy8gXCIzIHJldHJpZXNcIiB0aGUgbGltaXQgb3Igd2hhdCBhbHJlYWR5IGhhcHBlbmVkPykuIFJlbmRlciB0aGUgbGltaXRcbiAgICAvLyBhcyBcIm1heCByZXRyaWVzXCIgdG8gbWFrZSB0aGUgYm91bmRhcnkgZXhwbGljaXQsIGFuZCBrZWVwIGBhdHRlbXB0YFxuICAgIC8vIGFzIHRoZSBjb3VudCBvZiB0b3RhbCBpbnZvY2F0aW9ucyBpbmNsdWRpbmcgdGhlIG9yaWdpbmFsLlxuICAgIGNvbnN0IGEgPSBtZXRhZGF0YS5hdHRlbXB0O1xuICAgIGNvbnN0IHIgPSBtZXRhZGF0YS5yZXRyeUNvdW50O1xuICAgIGlmIChhICE9PSB1bmRlZmluZWQgJiYgciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICBgICAke2t2S2V5KCdyZXRyeScpfSAke2F9ICR7QW5zaS5kaW0oJ2F0dGVtcHRzIMK3Jyl9ICR7cn0gJHtBbnNpLmRpbSgnbWF4IHJldHJpZXMnKX1gXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgICR7a3ZLZXkoJ3JldHJ5Jyl9ICR7YX0gJHtBbnNpLmRpbSgnYXR0ZW1wdHMnKX1gKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBlcnJvckNvZGUgPSBwaWNrU3RyaW5nKG1ldGFkYXRhLCAnZXJyb3JDb2RlJyk7XG4gIGlmIChlcnJvckNvZGUgJiYgZXJyb3JDb2RlICE9PSBlcnJvck5hbWUpIHtcbiAgICBsaW5lcy5wdXNoKGAgICR7a3ZLZXkoJ2NvZGUnKX0gJHtBbnNpLmRpbShlcnJvckNvZGUpfWApO1xuICB9XG5cbiAgY29uc3QgaGludCA9IHBpY2tTdHJpbmcobWV0YWRhdGEsICdoaW50Jyk7XG4gIGlmIChoaW50KSB7XG4gICAgbGluZXMucHVzaChgICAke0Fuc2kuaGludChoaW50KX1gKTtcbiAgfVxuXG4gIC8vIFNvcnRlZCBwYXNzLXRocm91Z2ggZm9yIHVua25vd24gZmllbGRzLlxuICBjb25zdCBwYXNzVGhyb3VnaCA9IE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhKVxuICAgIC5maWx0ZXIoXG4gICAgICAoW2ssIHZdKSA9PlxuICAgICAgICAhd2VsbEtub3duLmhhcyhrKSAmJiAhcmVkdW5kYW50LmhhcyhrKSAmJiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbFxuICAgIClcbiAgICAuc29ydCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIHBhc3NUaHJvdWdoKSB7XG4gICAgbGluZXMucHVzaChgICAke2t2S2V5KGspfSAke2Zvcm1hdFBhc3N0aHJvdWdoVmFsdWUodil9YCk7XG4gIH1cblxuICByZXR1cm4gbGluZXMubGVuZ3RoID8gbGluZXMuam9pbignXFxuJykgOiBudWxsO1xufVxuXG4vKipcbiAqIFN0cmlwIHRoZSBzdGFjayBkb3duIHRvIGZyYW1lcyB0aGUgdXNlciBjYW4gYWN0IG9uLiBWOCBzdGFja3MgZm9yIG91clxuICogcnVudGltZSBlcnJvcnMgbG9vayBsaWtlOlxuICpcbiAqICAgICBOYW1lOiBtZXNzYWdlXG4gKiAgICAgICAgIGF0IHVzZXJTdGVwICguL3dvcmtmbG93cy9mb28udHM6MTI6MTEpXG4gKiAgICAgICAgIGF0IDx1bmtub3duPiAoLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvcnVudGltZS9zdGVwLWhhbmRsZXIudHM6NTM1OjMyKVxuICogICAgICAgICBhdCA8dW5rbm93bj4gKC4uLi9ub2RlX21vZHVsZXMvLnBucG0vbmV4dEDigKYv4oCmL2Jhc2Utc2VydmVyLmpzOjE0NTQ6OSlcbiAqICAgICAgICAgYXQgPHVua25vd24+ICguLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUDigKYv4oCmL2FwaS5qczo1NDQwKVxuICogICAgICAgICBhdCDigKYgKDE1IG1vcmUgZnJhbWVzIGludG8gTmV4dC5qcyAvIHBucG0gaW50ZXJuYWxzKVxuICpcbiAqIFR3by1wYXNzIHRyaW06XG4gKlxuICogICAxLiBEcm9wIGZyYW1ld29yay1pbnRlcm5hbCBmcmFtZXMgKGBub2RlX21vZHVsZXMvLnBucG0vYCwgYG5vZGU6aW50ZXJuYWwvYCxcbiAqICAgICAgVHVyYm9wYWNrLWJ1bmRsZWQgYG5vZGVfbW9kdWxlc19fcG5wbV8qYCAvIGBfbmV4dF9kaXN0XypgIGNodW5rcykuXG4gKiAgIDIuIENhcCB0aGUgc3Vydml2aW5nIGZyYW1lcyBhdCBgTUFYX1ZJU0lCTEVfRlJBTUVTYCDigJQgcGFzdCB0aGF0LCBldmVuXG4gKiAgICAgIFwidXNlci1pc2hcIiBmcmFtZXMgYXJlIHVzdWFsbHkgZGVlcCBhc3luYyB3cmFwcGluZyB0aGF0IGRvZXNuJ3QgaGVscFxuICogICAgICBwaW5wb2ludCB0aGUgdGhyb3cuIFRoZSB1c2VyIGNhbiBkcm9wIGludG8gdGhlIGluc3BlY3QgQ0xJIGZvciB0aGVcbiAqICAgICAgZnVsbCBzdGFjayBvbiBkZW1hbmQuXG4gKlxuICogRWFjaCBzdXBwcmVzc2VkIHJ1biBlbWl0cyBvbmUgc3VtbWFyeSBsaW5lIHNvIHBlb3BsZSBrbm93IGhvdyBtdWNoIHdhc1xuICogdHJpbW1lZC5cbiAqL1xuY29uc3QgTUFYX1ZJU0lCTEVfRlJBTUVTID0gNjtcblxuZnVuY3Rpb24gdHJpbVN0YWNrQm9keShib2R5OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKCFib2R5KSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbGluZXMgPSBib2R5LnNwbGl0KCdcXG4nKTtcbiAgY29uc3Qgb3V0OiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZHJvcHBlZFJ1biA9IDA7XG4gIGxldCB2aXNpYmxlRnJhbWVDb3VudCA9IDA7XG4gIGxldCBjYXBwZWRGcmFtZXMgPSAwO1xuXG4gIGNvbnN0IGZsdXNoRHJvcHBlZCA9ICgpID0+IHtcbiAgICBpZiAoZHJvcHBlZFJ1biA+IDApIHtcbiAgICAgIG91dC5wdXNoKFxuICAgICAgICBBbnNpLmRpbShcbiAgICAgICAgICBgICAgICAgICDigKYgJHtkcm9wcGVkUnVufSBtb3JlICR7ZHJvcHBlZFJ1biA9PT0gMSA/ICdmcmFtZScgOiAnZnJhbWVzJ30gaW4gZnJhbWV3b3JrIGludGVybmFsc2BcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGRyb3BwZWRSdW4gPSAwO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCBpc0ZyYW1lID0gbGluZS50cmltU3RhcnQoKS5zdGFydHNXaXRoKCdhdCAnKTtcbiAgICBpZiAoaXNGcmFtZSAmJiBpc0ZyYW1ld29ya0ZyYW1lKGxpbmUpKSB7XG4gICAgICBkcm9wcGVkUnVuKys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGlzRnJhbWUgJiYgdmlzaWJsZUZyYW1lQ291bnQgPj0gTUFYX1ZJU0lCTEVfRlJBTUVTKSB7XG4gICAgICBjYXBwZWRGcmFtZXMrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmbHVzaERyb3BwZWQoKTtcbiAgICBvdXQucHVzaChsaW5lKTtcbiAgICBpZiAoaXNGcmFtZSkgdmlzaWJsZUZyYW1lQ291bnQrKztcbiAgfVxuICBmbHVzaERyb3BwZWQoKTtcbiAgaWYgKGNhcHBlZEZyYW1lcyA+IDApIHtcbiAgICBvdXQucHVzaChcbiAgICAgIEFuc2kuZGltKFxuICAgICAgICBgICAgICAgICDigKYgJHtjYXBwZWRGcmFtZXN9IG1vcmUgJHtjYXBwZWRGcmFtZXMgPT09IDEgPyAnZnJhbWUnIDogJ2ZyYW1lcyd9IChydW4gXFxgcG5wbSB3ZiBpbnNwZWN0IHJ1biA8aWQ+XFxgIGZvciB0aGUgZnVsbCBzdGFjaylgXG4gICAgICApXG4gICAgKTtcbiAgfVxuICByZXR1cm4gb3V0LmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBpc0ZyYW1ld29ya0ZyYW1lKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBPbmx5IGF0LWZyYW1lcyBhcmUgY2FuZGlkYXRlcyBmb3Igc3RyaXBwaW5nLiBIZWFkZXIgbGluZXMgKGBOYW1lOiDigKZgKVxuICAvLyBhbmQgYXJiaXRyYXJ5IHRyYWlsaW5nIGNvbnRleHQgKGUuZy4gYGNvZGU6ICdVU0VSX0VSUk9SJ2ApIHBhc3MgdGhyb3VnaC5cbiAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbVN0YXJ0KCk7XG4gIGlmICghdHJpbW1lZC5zdGFydHNXaXRoKCdhdCAnKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBub2RlOiogaW50ZXJuYWxzICh0aW1lcnMsIGFzeW5jIGhvb2tzLCB2bSwgZXRjLikgbmV2ZXIgaGVscCB1c2Vycy5cbiAgaWYgKHRyaW1tZWQuaW5jbHVkZXMoJ25vZGU6aW50ZXJuYWwvJykpIHJldHVybiB0cnVlO1xuICAvLyBwbnBtLXJvb3RlZCBmcmFtZXdvcmtzIGluc3RhbGxlZCBhcyBub2RlX21vZHVsZXMgZGVwZW5kZW5jaWVzLlxuICBpZiAodHJpbW1lZC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzLy5wbnBtLycpKSByZXR1cm4gdHJ1ZTtcbiAgLy8gVHVyYm9wYWNrL05leHQgYnVuZGxlIHRoZSBzYW1lIGZyYW1ld29yayBjb2RlIGludG8gY2h1bmtzIGxpa2VcbiAgLy8gYG5vZGVfbW9kdWxlc19fcG5wbV88aGFzaD4uXy5qc2AgYW5kIGA8Li4uPl9uZXh0X2Rpc3RfPGhhc2g+Ll8uanNgLFxuICAvLyBhbmQgZW1pdHMgTmV4dC5qcyBsb2FkZXIgcnVudGltZSBhcyBgMGR4Nl9uZXh0X2Rpc3RfPGhhc2g+Ll8uanNgLlxuICAvLyBUaGVzZSBhcmUgdGhlIGZyYW1lcyB0aGF0IHNob3cgdXAgYWZ0ZXIgVHVyYm9wYWNrIERDRSDigJQgc2FtZSBpbnRlbnRcbiAgLy8gYXMgdGhlIHJhdyBgbm9kZV9tb2R1bGVzLy5wbnBtL2AgZmlsdGVyIGFib3ZlLlxuICBpZiAodHJpbW1lZC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzX19wbnBtXycpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHRyaW1tZWQuaW5jbHVkZXMoJ19uZXh0X2Rpc3RfJykpIHJldHVybiB0cnVlO1xuICAvLyBQbGFpbiBub2RlX21vZHVsZXMgKG5vbi1wbnBtIHNldHVwcykgZm9yIHRoZSBzYW1lIGtpbmRzIG9mIGZyYW1ld29ya3MuXG4gIGlmIChcbiAgICB0cmltbWVkLmluY2x1ZGVzKCdub2RlX21vZHVsZXMvbmV4dC8nKSB8fFxuICAgIHRyaW1tZWQuaW5jbHVkZXMoJ25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS8nKSB8fFxuICAgIHRyaW1tZWQuaW5jbHVkZXMoJ25vZGVfbW9kdWxlcy92aXRlc3QvJykgfHxcbiAgICB0cmltbWVkLmluY2x1ZGVzKCdub2RlX21vZHVsZXMvQHZpdGVzdC8nKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBpY2tTdHJpbmcoXG4gIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAga2V5OiBzdHJpbmdcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB2ID0gbWV0YWRhdGFba2V5XTtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2Lmxlbmd0aCA+IDAgPyB2IDogbnVsbDtcbn1cblxuZnVuY3Rpb24ga3ZLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gQW5zaS5kaW0oa2V5LnBhZEVuZCg2KSk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdElkUm93KFxuICBsYWJlbDogc3RyaW5nLFxuICBpZDogc3RyaW5nIHwgbnVsbCxcbiAgbmFtZTogc3RyaW5nIHwgbnVsbCxcbiAgZm9ybWF0TmFtZTogKG46IHN0cmluZykgPT4gc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBpZENlbGwgPSBpZCA/IGlkIDogQW5zaS5kaW0oJ+KAlCcpO1xuICBjb25zdCBwYXJzZWQgPSBuYW1lXG4gICAgPyBsYWJlbCA9PT0gJ3J1bidcbiAgICAgID8gcGFyc2VXb3JrZmxvd05hbWUobmFtZSlcbiAgICAgIDogcGFyc2VTdGVwTmFtZShuYW1lKVxuICAgIDogbnVsbDtcbiAgY29uc3QgbmFtZUNlbGwgPSBwYXJzZWRcbiAgICA/IGAke0Fuc2kuZGltKCfCtycpfSAke2Zvcm1hdE5hbWUobmFtZSBhcyBzdHJpbmcpfWBcbiAgICA6ICcnO1xuICByZXR1cm4gYCAgJHtrdktleShsYWJlbCl9ICR7aWRDZWxsfSR7bmFtZUNlbGwgPyAnICcgKyBuYW1lQ2VsbCA6ICcnfWA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhc3N0aHJvdWdoVmFsdWUodjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodi5pbmNsdWRlcygnXFxuJykpIHtcbiAgICAgIHJldHVybiB2XG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLm1hcCgobGluZSwgaSkgPT4gKGkgPT09IDAgPyBsaW5lIDogYCAgICAgICAgICR7bGluZX1gKSlcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cbiAgICByZXR1cm4gdjtcbiAgfVxuICBpZiAodHlwZW9mIHYgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2ID09PSAnYm9vbGVhbicpIHJldHVybiBTdHJpbmcodik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU3RyaW5nKHYpO1xuICB9XG59XG4iXX0=
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLWZvcm1hdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2ctZm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sdUJBQXVCLENBQUM7QUFDOUMsT0FBTyxFQUNMLGNBQWMsRUFDZCxrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsTUFBYyxFQUNkLE9BQWUsRUFDZixRQUE2QztJQUU3QyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLE1BQU0sTUFBTSxHQUFHLHNCQUFzQixDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDL0QsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXhDLE1BQU0sS0FBSyxHQUFhLENBQUMsR0FBRyxNQUFNLElBQUksT0FBTyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkQsSUFBSSxNQUFNO1FBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixJQUFJLFdBQVc7UUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FDN0IsT0FBZSxFQUNmLFFBQTZDO0lBRTdDLElBQUksQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRWpFLHVFQUF1RTtJQUN2RSxnRkFBZ0Y7SUFDaEYsMkNBQTJDO0lBQzNDLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDcEMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM1QixJQUNFLE9BQU8sUUFBUSxDQUFDLFlBQVksS0FBSyxRQUFRO1FBQ3pDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQXNCLENBQUMsRUFDakQsQ0FBQztRQUNELFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDO1FBQ3hCLGVBQWU7UUFDZixjQUFjO1FBQ2QsUUFBUTtRQUNSLFVBQVU7UUFDVixrQkFBa0I7UUFDbEIsV0FBVztRQUNYLFdBQVc7UUFDWCxjQUFjO1FBQ2QsWUFBWTtRQUNaLE1BQU07UUFDTixTQUFTO1FBQ1QsWUFBWTtLQUNiLENBQUMsQ0FBQztJQUVILE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUUzQiwyQ0FBMkM7SUFDM0MsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNwRCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDN0QsSUFBSSxTQUFTLElBQUksV0FBVyxFQUFFLENBQUM7UUFDN0IsTUFBTSxLQUFLLEdBQUcsV0FBVztZQUN2QixDQUFDLENBQUMsV0FBVyxLQUFLLEtBQUs7Z0JBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztnQkFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO1lBQzFCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxNQUFNLEdBQUcsR0FBRyxLQUFLLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEQsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDcEQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNwRCxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7U0FBTSxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM5QyxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2xELElBQUksTUFBTSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN4RSxxRUFBcUU7UUFDckUscUVBQXFFO1FBQ3JFLHFFQUFxRTtRQUNyRSw0REFBNEQ7UUFDNUQsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUMzQixNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkMsS0FBSyxDQUFDLElBQUksQ0FDUixLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUNyRixDQUFDO1FBQ0osQ0FBQzthQUFNLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNwRCxJQUFJLFNBQVMsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDekMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxQyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ1QsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7U0FDekMsTUFBTSxDQUNMLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNULENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUMxRTtTQUNBLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNqQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDaEQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFFN0IsU0FBUyxhQUFhLENBQUMsSUFBWTtJQUNqQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsTUFBTSxHQUFHLEdBQWEsRUFBRSxDQUFDO0lBQ3pCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNuQixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUMxQixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7SUFFckIsTUFBTSxZQUFZLEdBQUcsR0FBRyxFQUFFO1FBQ3hCLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25CLEdBQUcsQ0FBQyxJQUFJLENBQ04sSUFBSSxDQUFDLEdBQUcsQ0FDTixhQUFhLFVBQVUsU0FBUyxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEseUJBQXlCLENBQy9GLENBQ0YsQ0FBQztZQUNGLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDakIsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRCxJQUFJLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RDLFVBQVUsRUFBRSxDQUFDO1lBQ2IsU0FBUztRQUNYLENBQUM7UUFDRCxJQUFJLE9BQU8sSUFBSSxpQkFBaUIsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3ZELFlBQVksRUFBRSxDQUFDO1lBQ2YsU0FBUztRQUNYLENBQUM7UUFDRCxZQUFZLEVBQUUsQ0FBQztRQUNmLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDZixJQUFJLE9BQU87WUFBRSxpQkFBaUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFDRCxZQUFZLEVBQUUsQ0FBQztJQUNmLElBQUksWUFBWSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQ04sSUFBSSxDQUFDLEdBQUcsQ0FDTixhQUFhLFlBQVksU0FBUyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsd0RBQXdELENBQ2xJLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsSUFBWTtJQUNwQyx3RUFBd0U7SUFDeEUsMkVBQTJFO0lBQzNFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM3QyxxRUFBcUU7SUFDckUsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEQsaUVBQWlFO0lBQ2pFLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3pELGlFQUFpRTtJQUNqRSxzRUFBc0U7SUFDdEUsb0VBQW9FO0lBQ3BFLHNFQUFzRTtJQUN0RSxpREFBaUQ7SUFDakQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDekQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ2pELHlFQUF5RTtJQUN6RSxJQUNFLE9BQU8sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUM7UUFDdEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyw4QkFBOEIsQ0FBQztRQUNoRCxPQUFPLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsRUFDekMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUNqQixRQUFpQyxFQUNqQyxHQUFXO0lBRVgsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUMxRCxDQUFDO0FBRUQsU0FBUyxLQUFLLENBQUMsR0FBVztJQUN4QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FDbEIsS0FBYSxFQUNiLEVBQWlCLEVBQ2pCLElBQW1CLEVBQ25CLFVBQWlDO0lBRWpDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUk7UUFDakIsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLO1lBQ2YsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQztZQUN6QixDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1QsTUFBTSxRQUFRLEdBQUcsTUFBTTtRQUNyQixDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxJQUFjLENBQUMsRUFBRTtRQUNsRCxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1AsT0FBTyxLQUFLLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztBQUN4RSxDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FBQyxDQUFVO0lBQ3hDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDckIsT0FBTyxDQUFDO2lCQUNMLEtBQUssQ0FBQyxJQUFJLENBQUM7aUJBQ1gsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hCLENBQUM7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsS0FBSyxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEFuc2kgZnJvbSAnQHdvcmtmbG93L2Vycm9ycy9hbnNpJztcbmltcG9ydCB7XG4gIGZvcm1hdFN0ZXBOYW1lLFxuICBmb3JtYXRXb3JrZmxvd05hbWUsXG4gIHBhcnNlU3RlcE5hbWUsXG4gIHBhcnNlV29ya2Zsb3dOYW1lLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuXG4vKipcbiAqIFN0cnVjdHVyZWQtbG9nIGNvbXBvc2l0aW9uIGZvciBgY29uc29sZS5lcnJvcmAgLyBgY29uc29sZS53YXJuYC4gRW1pdHNcbiAqIG9uZSBzdHJpbmcgaW4gdGhyZWUgc2VjdGlvbnMgc28gdGhlIG1vc3QgdXNlZnVsIGluZm9ybWF0aW9uIGlzIGF0IHRoZVxuICogdG9wLCBzdGFjayB0cmFjZSBhdCB0aGUgYm90dG9tOlxuICpcbiAqICAgICBbd29ya2Zsb3ctc2RrXSA8ZnJhbWluZyBsaW5lPlxuICogICAgICAgdXNlciBlcnJvciDCtyBGYXRhbEVycm9yXG4gKiAgICAgICBydW4gICAgd3J1bl/igKZcbiAqICAgICAgIHN0ZXAgICBzdGVwX+KApiDCtyBhZGQgKC4vd29ya2Zsb3dzL3gpXG4gKiAgICAgICBoaW50OiAgTW92ZSB0aGUgY2FsbCB0byBhIHN0ZXAgZnVuY3Rpb24uXG4gKiAgICAgRmF0YWxFcnJvcjog4oCmXG4gKiAgICAgICAgIGF0IOKApiAodHJpbW1lZCBzdGFjayDigJQgaW50ZXJuYWxzIGNvbGxhcHNlZClcbiAqXG4gKiBXaXRob3V0IHRoaXMgY29tcG9zaXRpb24sIGNhbGxlcnMgcGFzc2luZyBgJHtmcmFtaW5nfVxcbiR7c3RhY2t9YCBhcyB0aGVcbiAqIG1lc3NhZ2UgYW5kIHN0cnVjdHVyZWQgZmllbGRzIGFzIHRoZSBtZXRhZGF0YSBvYmplY3QgZ290IGB1dGlsLmluc3BlY3RgJ3NcbiAqIGRlZmF1bHQgb2JqZWN0IGR1bXAgYXBwZW5kZWQgKmFmdGVyKiB0aGUgc3RhY2ssIHdoaWNoIGJ1cmllcyB0aGUgcnVuIElEXG4gKiBhbmQgYXR0cmlidXRpb24gYmFkZ2UgdW5kZXIgMzArIGxpbmVzIG9mIGBub2RlX21vZHVsZXMvLnBucG0vLi4uYCBmcmFtZXMuXG4gKlxuICogVGhlIHNhbWUgbWV0YWRhdGEgaXMgYWxzbyBlbWl0dGVkIGFzIHN0cnVjdHVyZWQgT1RlbCBzcGFuIGV2ZW50cyBmcm9tXG4gKiB0aGUgbG9nZ2VyIGl0c2VsZiwgc28gYmFja2VuZHMgdGhhdCB3YW50IEpTT04tc2hhcGVkIGRhdGEgc3RpbGwgZ2V0IGl0LlxuICogd2ViL3dlYi1zaGFyZWQgZG8gbm90IGNvbnN1bWUgc3RkZXJyIGF0IGFsbCDigJQgdGhleSByZWFkIENCT1IvSlNPTiBldmVudFxuICogcGF5bG9hZHMgZnJvbSB0aGUgV29ybGQgZXZlbnQgbG9nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZUxvZ0xpbmUoXG4gIHByZWZpeDogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHtcbiAgY29uc3QgW2ZyYW1pbmcsIC4uLnJlc3RdID0gbWVzc2FnZS5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IGJvZHkgPSByZXN0LmpvaW4oJ1xcbicpO1xuICBjb25zdCBmaWVsZHMgPSByZW5kZXJTdHJ1Y3R1cmVkRmllbGRzKGZyYW1pbmcgPz8gJycsIG1ldGFkYXRhKTtcbiAgY29uc3QgdHJpbW1lZEJvZHkgPSB0cmltU3RhY2tCb2R5KGJvZHkpO1xuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtgJHtwcmVmaXh9ICR7ZnJhbWluZyA/PyAnJ31gXTtcbiAgaWYgKGZpZWxkcykgbGluZXMucHVzaChmaWVsZHMpO1xuICBpZiAodHJpbW1lZEJvZHkpIGxpbmVzLnB1c2godHJpbW1lZEJvZHkpO1xuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclN0cnVjdHVyZWRGaWVsZHMoXG4gIGZyYW1pbmc6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKCFtZXRhZGF0YSB8fCBPYmplY3Qua2V5cyhtZXRhZGF0YSkubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAvLyBEcm9wIGZpZWxkcyB0aGF0IHRoZSBtZXNzYWdlIGFscmVhZHkgZW5jb2Rlcy4gV2UgcmVuZGVyIGZyYW1pbmdzIGFuZFxuICAvLyBzdGFja3MgaW50byB0aGUgbWVzc2FnZSBzdHJpbmcgaXRzZWxmIGluIHN0ZXAgZXhlY3V0b3IgLyBjb21iaW5lZCBydW50aW1lLCBzb1xuICAvLyByZXBlYXRpbmcgdGhlbSBoZXJlIHdvdWxkIGJlIHB1cmUgbm9pc2UuXG4gIGNvbnN0IHJlZHVuZGFudCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICByZWR1bmRhbnQuYWRkKCdlcnJvclN0YWNrJyk7XG4gIGlmIChcbiAgICB0eXBlb2YgbWV0YWRhdGEuZXJyb3JNZXNzYWdlID09PSAnc3RyaW5nJyAmJlxuICAgIGZyYW1pbmcuaW5jbHVkZXMobWV0YWRhdGEuZXJyb3JNZXNzYWdlIGFzIHN0cmluZylcbiAgKSB7XG4gICAgcmVkdW5kYW50LmFkZCgnZXJyb3JNZXNzYWdlJyk7XG4gIH1cblxuICBjb25zdCB3ZWxsS25vd24gPSBuZXcgU2V0KFtcbiAgICAnd29ya2Zsb3dSdW5JZCcsXG4gICAgJ3dvcmtmbG93TmFtZScsXG4gICAgJ3N0ZXBJZCcsXG4gICAgJ3N0ZXBOYW1lJyxcbiAgICAnZXJyb3JBdHRyaWJ1dGlvbicsXG4gICAgJ2Vycm9yQ29kZScsXG4gICAgJ2Vycm9yTmFtZScsXG4gICAgJ2Vycm9yTWVzc2FnZScsXG4gICAgJ2Vycm9yU3RhY2snLFxuICAgICdoaW50JyxcbiAgICAnYXR0ZW1wdCcsXG4gICAgJ3JldHJ5Q291bnQnLFxuICBdKTtcblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBIZWFkZXI6IGVycm9yIGNsYXNzICsgYXR0cmlidXRpb24gYmFkZ2UuXG4gIGNvbnN0IGVycm9yTmFtZSA9IHBpY2tTdHJpbmcobWV0YWRhdGEsICdlcnJvck5hbWUnKTtcbiAgY29uc3QgYXR0cmlidXRpb24gPSBwaWNrU3RyaW5nKG1ldGFkYXRhLCAnZXJyb3JBdHRyaWJ1dGlvbicpO1xuICBpZiAoZXJyb3JOYW1lIHx8IGF0dHJpYnV0aW9uKSB7XG4gICAgY29uc3QgYmFkZ2UgPSBhdHRyaWJ1dGlvblxuICAgICAgPyBhdHRyaWJ1dGlvbiA9PT0gJ3NkaydcbiAgICAgICAgPyBBbnNpLm1hZ2VudGEoJ3NkayBlcnJvcicpXG4gICAgICAgIDogQW5zaS5yZWQoJ3VzZXIgZXJyb3InKVxuICAgICAgOiAnJztcbiAgICBjb25zdCBjbHMgPSBlcnJvck5hbWUgPyBBbnNpLmJvbGQoZXJyb3JOYW1lKSA6ICcnO1xuICAgIGNvbnN0IHNlcCA9IGJhZGdlICYmIGNscyA/IEFuc2kuZGltKCcgwrcgJykgOiAnJztcbiAgICBsaW5lcy5wdXNoKGAgICR7YmFkZ2V9JHtzZXB9JHtjbHN9YCk7XG4gIH1cblxuICAvLyBJRCArIHBhcnNlZCBmcmllbmRseS1uYW1lIHJvd3MuXG4gIGNvbnN0IHJ1bklkID0gcGlja1N0cmluZyhtZXRhZGF0YSwgJ3dvcmtmbG93UnVuSWQnKTtcbiAgY29uc3Qgd2ZOYW1lID0gcGlja1N0cmluZyhtZXRhZGF0YSwgJ3dvcmtmbG93TmFtZScpO1xuICBpZiAocnVuSWQpIHtcbiAgICBsaW5lcy5wdXNoKGZvcm1hdElkUm93KCdydW4nLCBydW5JZCwgd2ZOYW1lLCBmb3JtYXRXb3JrZmxvd05hbWUpKTtcbiAgfSBlbHNlIGlmICh3Zk5hbWUpIHtcbiAgICBsaW5lcy5wdXNoKGZvcm1hdElkUm93KCdydW4nLCBudWxsLCB3Zk5hbWUsIGZvcm1hdFdvcmtmbG93TmFtZSkpO1xuICB9XG5cbiAgY29uc3Qgc3RlcElkID0gcGlja1N0cmluZyhtZXRhZGF0YSwgJ3N0ZXBJZCcpO1xuICBjb25zdCBzdGVwTmFtZSA9IHBpY2tTdHJpbmcobWV0YWRhdGEsICdzdGVwTmFtZScpO1xuICBpZiAoc3RlcElkIHx8IHN0ZXBOYW1lKSB7XG4gICAgbGluZXMucHVzaChmb3JtYXRJZFJvdygnc3RlcCcsIHN0ZXBJZCwgc3RlcE5hbWUsIGZvcm1hdFN0ZXBOYW1lKSk7XG4gIH1cblxuICBpZiAobWV0YWRhdGEuYXR0ZW1wdCAhPT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnJldHJ5Q291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIGBhdHRlbXB0YCBhbmQgYHJldHJ5Q291bnRgIHJlYWQgYW1iaWd1b3VzbHkgbmV4dCB0byBlYWNoIG90aGVyIChpc1xuICAgIC8vIFwiMyByZXRyaWVzXCIgdGhlIGxpbWl0IG9yIHdoYXQgYWxyZWFkeSBoYXBwZW5lZD8pLiBSZW5kZXIgdGhlIGxpbWl0XG4gICAgLy8gYXMgXCJtYXggcmV0cmllc1wiIHRvIG1ha2UgdGhlIGJvdW5kYXJ5IGV4cGxpY2l0LCBhbmQga2VlcCBgYXR0ZW1wdGBcbiAgICAvLyBhcyB0aGUgY291bnQgb2YgdG90YWwgaW52b2NhdGlvbnMgaW5jbHVkaW5nIHRoZSBvcmlnaW5hbC5cbiAgICBjb25zdCBhID0gbWV0YWRhdGEuYXR0ZW1wdDtcbiAgICBjb25zdCByID0gbWV0YWRhdGEucmV0cnlDb3VudDtcbiAgICBpZiAoYSAhPT0gdW5kZWZpbmVkICYmIHIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgYCAgJHtrdktleSgncmV0cnknKX0gJHthfSAke0Fuc2kuZGltKCdhdHRlbXB0cyDCtycpfSAke3J9ICR7QW5zaS5kaW0oJ21heCByZXRyaWVzJyl9YFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGluZXMucHVzaChgICAke2t2S2V5KCdyZXRyeScpfSAke2F9ICR7QW5zaS5kaW0oJ2F0dGVtcHRzJyl9YCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXJyb3JDb2RlID0gcGlja1N0cmluZyhtZXRhZGF0YSwgJ2Vycm9yQ29kZScpO1xuICBpZiAoZXJyb3JDb2RlICYmIGVycm9yQ29kZSAhPT0gZXJyb3JOYW1lKSB7XG4gICAgbGluZXMucHVzaChgICAke2t2S2V5KCdjb2RlJyl9ICR7QW5zaS5kaW0oZXJyb3JDb2RlKX1gKTtcbiAgfVxuXG4gIGNvbnN0IGhpbnQgPSBwaWNrU3RyaW5nKG1ldGFkYXRhLCAnaGludCcpO1xuICBpZiAoaGludCkge1xuICAgIGxpbmVzLnB1c2goYCAgJHtBbnNpLmhpbnQoaGludCl9YCk7XG4gIH1cblxuICAvLyBTb3J0ZWQgcGFzcy10aHJvdWdoIGZvciB1bmtub3duIGZpZWxkcy5cbiAgY29uc3QgcGFzc1Rocm91Z2ggPSBPYmplY3QuZW50cmllcyhtZXRhZGF0YSlcbiAgICAuZmlsdGVyKFxuICAgICAgKFtrLCB2XSkgPT5cbiAgICAgICAgIXdlbGxLbm93bi5oYXMoaykgJiYgIXJlZHVuZGFudC5oYXMoaykgJiYgdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGxcbiAgICApXG4gICAgLnNvcnQoKFthXSwgW2JdKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBwYXNzVGhyb3VnaCkge1xuICAgIGxpbmVzLnB1c2goYCAgJHtrdktleShrKX0gJHtmb3JtYXRQYXNzdGhyb3VnaFZhbHVlKHYpfWApO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVzLmxlbmd0aCA/IGxpbmVzLmpvaW4oJ1xcbicpIDogbnVsbDtcbn1cblxuLyoqXG4gKiBTdHJpcCB0aGUgc3RhY2sgZG93biB0byBmcmFtZXMgdGhlIHVzZXIgY2FuIGFjdCBvbi4gVjggc3RhY2tzIGZvciBvdXJcbiAqIHJ1bnRpbWUgZXJyb3JzIGxvb2sgbGlrZTpcbiAqXG4gKiAgICAgTmFtZTogbWVzc2FnZVxuICogICAgICAgICBhdCB1c2VyU3RlcCAoLi93b3JrZmxvd3MvZm9vLnRzOjEyOjExKVxuICogICAgICAgICBhdCA8dW5rbm93bj4gKC4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL3J1bnRpbWUvc3RlcC1leGVjdXRvci50czo1MzU6MzIpXG4gKiAgICAgICAgIGF0IDx1bmtub3duPiAoLi4uL25vZGVfbW9kdWxlcy8ucG5wbS9uZXh0QOKApi/igKYvYmFzZS1zZXJ2ZXIuanM6MTQ1NDo5KVxuICogICAgICAgICBhdCA8dW5rbm93bj4gKC4uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQOKApi/igKYvYXBpLmpzOjU0NDApXG4gKiAgICAgICAgIGF0IOKApiAoMTUgbW9yZSBmcmFtZXMgaW50byBOZXh0LmpzIC8gcG5wbSBpbnRlcm5hbHMpXG4gKlxuICogVHdvLXBhc3MgdHJpbTpcbiAqXG4gKiAgIDEuIERyb3AgZnJhbWV3b3JrLWludGVybmFsIGZyYW1lcyAoYG5vZGVfbW9kdWxlcy8ucG5wbS9gLCBgbm9kZTppbnRlcm5hbC9gLFxuICogICAgICBUdXJib3BhY2stYnVuZGxlZCBgbm9kZV9tb2R1bGVzX19wbnBtXypgIC8gYF9uZXh0X2Rpc3RfKmAgY2h1bmtzKS5cbiAqICAgMi4gQ2FwIHRoZSBzdXJ2aXZpbmcgZnJhbWVzIGF0IGBNQVhfVklTSUJMRV9GUkFNRVNgIOKAlCBwYXN0IHRoYXQsIGV2ZW5cbiAqICAgICAgXCJ1c2VyLWlzaFwiIGZyYW1lcyBhcmUgdXN1YWxseSBkZWVwIGFzeW5jIHdyYXBwaW5nIHRoYXQgZG9lc24ndCBoZWxwXG4gKiAgICAgIHBpbnBvaW50IHRoZSB0aHJvdy4gVGhlIHVzZXIgY2FuIGRyb3AgaW50byB0aGUgaW5zcGVjdCBDTEkgZm9yIHRoZVxuICogICAgICBmdWxsIHN0YWNrIG9uIGRlbWFuZC5cbiAqXG4gKiBFYWNoIHN1cHByZXNzZWQgcnVuIGVtaXRzIG9uZSBzdW1tYXJ5IGxpbmUgc28gcGVvcGxlIGtub3cgaG93IG11Y2ggd2FzXG4gKiB0cmltbWVkLlxuICovXG5jb25zdCBNQVhfVklTSUJMRV9GUkFNRVMgPSA2O1xuXG5mdW5jdGlvbiB0cmltU3RhY2tCb2R5KGJvZHk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIWJvZHkpIHJldHVybiBudWxsO1xuICBjb25zdCBsaW5lcyA9IGJvZHkuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW107XG4gIGxldCBkcm9wcGVkUnVuID0gMDtcbiAgbGV0IHZpc2libGVGcmFtZUNvdW50ID0gMDtcbiAgbGV0IGNhcHBlZEZyYW1lcyA9IDA7XG5cbiAgY29uc3QgZmx1c2hEcm9wcGVkID0gKCkgPT4ge1xuICAgIGlmIChkcm9wcGVkUnVuID4gMCkge1xuICAgICAgb3V0LnB1c2goXG4gICAgICAgIEFuc2kuZGltKFxuICAgICAgICAgIGAgICAgICAgIOKApiAke2Ryb3BwZWRSdW59IG1vcmUgJHtkcm9wcGVkUnVuID09PSAxID8gJ2ZyYW1lJyA6ICdmcmFtZXMnfSBpbiBmcmFtZXdvcmsgaW50ZXJuYWxzYFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgZHJvcHBlZFJ1biA9IDA7XG4gICAgfVxuICB9O1xuXG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGNvbnN0IGlzRnJhbWUgPSBsaW5lLnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoJ2F0ICcpO1xuICAgIGlmIChpc0ZyYW1lICYmIGlzRnJhbWV3b3JrRnJhbWUobGluZSkpIHtcbiAgICAgIGRyb3BwZWRSdW4rKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoaXNGcmFtZSAmJiB2aXNpYmxlRnJhbWVDb3VudCA+PSBNQVhfVklTSUJMRV9GUkFNRVMpIHtcbiAgICAgIGNhcHBlZEZyYW1lcysrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZsdXNoRHJvcHBlZCgpO1xuICAgIG91dC5wdXNoKGxpbmUpO1xuICAgIGlmIChpc0ZyYW1lKSB2aXNpYmxlRnJhbWVDb3VudCsrO1xuICB9XG4gIGZsdXNoRHJvcHBlZCgpO1xuICBpZiAoY2FwcGVkRnJhbWVzID4gMCkge1xuICAgIG91dC5wdXNoKFxuICAgICAgQW5zaS5kaW0oXG4gICAgICAgIGAgICAgICAgIOKApiAke2NhcHBlZEZyYW1lc30gbW9yZSAke2NhcHBlZEZyYW1lcyA9PT0gMSA/ICdmcmFtZScgOiAnZnJhbWVzJ30gKHJ1biBcXGBwbnBtIHdmIGluc3BlY3QgcnVuIDxpZD5cXGAgZm9yIHRoZSBmdWxsIHN0YWNrKWBcbiAgICAgIClcbiAgICApO1xuICB9XG4gIHJldHVybiBvdXQuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGlzRnJhbWV3b3JrRnJhbWUobGluZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgYXQtZnJhbWVzIGFyZSBjYW5kaWRhdGVzIGZvciBzdHJpcHBpbmcuIEhlYWRlciBsaW5lcyAoYE5hbWU6IOKApmApXG4gIC8vIGFuZCBhcmJpdHJhcnkgdHJhaWxpbmcgY29udGV4dCAoZS5nLiBgY29kZTogJ1VTRVJfRVJST1InYCkgcGFzcyB0aHJvdWdoLlxuICBjb25zdCB0cmltbWVkID0gbGluZS50cmltU3RhcnQoKTtcbiAgaWYgKCF0cmltbWVkLnN0YXJ0c1dpdGgoJ2F0ICcpKSByZXR1cm4gZmFsc2U7XG4gIC8vIG5vZGU6KiBpbnRlcm5hbHMgKHRpbWVycywgYXN5bmMgaG9va3MsIHZtLCBldGMuKSBuZXZlciBoZWxwIHVzZXJzLlxuICBpZiAodHJpbW1lZC5pbmNsdWRlcygnbm9kZTppbnRlcm5hbC8nKSkgcmV0dXJuIHRydWU7XG4gIC8vIHBucG0tcm9vdGVkIGZyYW1ld29ya3MgaW5zdGFsbGVkIGFzIG5vZGVfbW9kdWxlcyBkZXBlbmRlbmNpZXMuXG4gIGlmICh0cmltbWVkLmluY2x1ZGVzKCdub2RlX21vZHVsZXMvLnBucG0vJykpIHJldHVybiB0cnVlO1xuICAvLyBUdXJib3BhY2svTmV4dCBidW5kbGUgdGhlIHNhbWUgZnJhbWV3b3JrIGNvZGUgaW50byBjaHVua3MgbGlrZVxuICAvLyBgbm9kZV9tb2R1bGVzX19wbnBtXzxoYXNoPi5fLmpzYCBhbmQgYDwuLi4+X25leHRfZGlzdF88aGFzaD4uXy5qc2AsXG4gIC8vIGFuZCBlbWl0cyBOZXh0LmpzIGxvYWRlciBydW50aW1lIGFzIGAwZHg2X25leHRfZGlzdF88aGFzaD4uXy5qc2AuXG4gIC8vIFRoZXNlIGFyZSB0aGUgZnJhbWVzIHRoYXQgc2hvdyB1cCBhZnRlciBUdXJib3BhY2sgRENFIOKAlCBzYW1lIGludGVudFxuICAvLyBhcyB0aGUgcmF3IGBub2RlX21vZHVsZXMvLnBucG0vYCBmaWx0ZXIgYWJvdmUuXG4gIGlmICh0cmltbWVkLmluY2x1ZGVzKCdub2RlX21vZHVsZXNfX3BucG1fJykpIHJldHVybiB0cnVlO1xuICBpZiAodHJpbW1lZC5pbmNsdWRlcygnX25leHRfZGlzdF8nKSkgcmV0dXJuIHRydWU7XG4gIC8vIFBsYWluIG5vZGVfbW9kdWxlcyAobm9uLXBucG0gc2V0dXBzKSBmb3IgdGhlIHNhbWUga2luZHMgb2YgZnJhbWV3b3Jrcy5cbiAgaWYgKFxuICAgIHRyaW1tZWQuaW5jbHVkZXMoJ25vZGVfbW9kdWxlcy9uZXh0LycpIHx8XG4gICAgdHJpbW1lZC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5LycpIHx8XG4gICAgdHJpbW1lZC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzL3ZpdGVzdC8nKSB8fFxuICAgIHRyaW1tZWQuaW5jbHVkZXMoJ25vZGVfbW9kdWxlcy9Adml0ZXN0LycpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGlja1N0cmluZyhcbiAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBrZXk6IHN0cmluZ1xuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHYgPSBtZXRhZGF0YVtrZXldO1xuICByZXR1cm4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYubGVuZ3RoID4gMCA/IHYgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBrdktleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBBbnNpLmRpbShrZXkucGFkRW5kKDYpKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0SWRSb3coXG4gIGxhYmVsOiBzdHJpbmcsXG4gIGlkOiBzdHJpbmcgfCBudWxsLFxuICBuYW1lOiBzdHJpbmcgfCBudWxsLFxuICBmb3JtYXROYW1lOiAobjogc3RyaW5nKSA9PiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGlkQ2VsbCA9IGlkID8gaWQgOiBBbnNpLmRpbSgn4oCUJyk7XG4gIGNvbnN0IHBhcnNlZCA9IG5hbWVcbiAgICA/IGxhYmVsID09PSAncnVuJ1xuICAgICAgPyBwYXJzZVdvcmtmbG93TmFtZShuYW1lKVxuICAgICAgOiBwYXJzZVN0ZXBOYW1lKG5hbWUpXG4gICAgOiBudWxsO1xuICBjb25zdCBuYW1lQ2VsbCA9IHBhcnNlZFxuICAgID8gYCR7QW5zaS5kaW0oJ8K3Jyl9ICR7Zm9ybWF0TmFtZShuYW1lIGFzIHN0cmluZyl9YFxuICAgIDogJyc7XG4gIHJldHVybiBgICAke2t2S2V5KGxhYmVsKX0gJHtpZENlbGx9JHtuYW1lQ2VsbCA/ICcgJyArIG5hbWVDZWxsIDogJyd9YDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UGFzc3Rocm91Z2hWYWx1ZSh2OiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xuICAgIGlmICh2LmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgcmV0dXJuIHZcbiAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAubWFwKChsaW5lLCBpKSA9PiAoaSA9PT0gMCA/IGxpbmUgOiBgICAgICAgICAgJHtsaW5lfWApKVxuICAgICAgICAuam9pbignXFxuJyk7XG4gICAgfVxuICAgIHJldHVybiB2O1xuICB9XG4gIGlmICh0eXBlb2YgdiA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHYgPT09ICdib29sZWFuJykgcmV0dXJuIFN0cmluZyh2KTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBTdHJpbmcodik7XG4gIH1cbn1cbiJdfQ==
package/dist/private.d.ts CHANGED
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * Utils used by the bundler when transforming code
3
3
  */
4
- import type { CryptoKey } from './encryption.js';
4
+ import type { WorldCapabilities } from '@workflow/world';
5
+ import type { PayloadKey } from './serialization/encryption.js';
5
6
  import type { EventsConsumer } from './events-consumer.js';
6
7
  import type { QueueItem } from './global.js';
8
+ import type { ReplayPayloadCache } from './replay-payload-cache.js';
7
9
  import type { Serializable } from './schemas.js';
8
- import type { StepHydrationCache } from './step-hydration-cache.js';
9
10
  export type StepFunction<Args extends Serializable[] = any[], Result extends Serializable | unknown = unknown> = ((...args: Args) => Promise<Result>) & {
10
11
  maxRetries?: number;
11
12
  stepId?: string;
@@ -26,7 +27,8 @@ export declare function registerStepFunction(stepId: string, stepFn: StepFunctio
26
27
  export declare function getStepFunction(stepId: string): StepFunction | undefined;
27
28
  export interface WorkflowOrchestratorContext {
28
29
  runId: string;
29
- encryptionKey: CryptoKey | undefined;
30
+ encryptionKey: PayloadKey | undefined;
31
+ worldCapabilities?: WorldCapabilities;
30
32
  globalThis: typeof globalThis;
31
33
  eventsConsumer: EventsConsumer;
32
34
  /**
@@ -55,26 +57,33 @@ export interface WorkflowOrchestratorContext {
55
57
  pendingDeliveries: number;
56
58
  /**
57
59
  * Ordered registry of in-flight "branch-deciding" deliveries — the
58
- * resolutions a workflow typically `Promise.race`s on: buffered hook
59
- * payloads (`hook_received`) and wait completions (`wait_completed`).
60
- * Keyed by the delivery's position (index) in the consumed event log.
60
+ * resolutions a workflow typically `Promise.race`s on, or awaits from
61
+ * independent concurrent branches: hook payloads (`hook_received`), wait
62
+ * completions (`wait_completed`), and step results (`step_completed` /
63
+ * `step_failed`). Keyed by the delivery's position (index) in the consumed
64
+ * event log.
61
65
  *
62
- * The problem: a buffered hook payload is observed via the async hook
63
- * iterator (`yield await this`), costing extra microtask hops, while a
64
- * `wait_completed` resolves with fewer hops and a reused sleep can
65
- * resolve in an entirely earlier loop iteration. Either way, the
66
- * resolution that the committed event log ordered first can lose a
67
- * `Promise.race` to a faster- or already-resolved competitor, diverging
68
- * from the log and surfacing as `CorruptedEventLogError`.
66
+ * The problem: each of these resolutions reaches workflow code after a
67
+ * different, workload-dependent number of microtask hops. A buffered hook
68
+ * payload is observed via the async hook iterator (`yield await this`),
69
+ * costing extra hops; a `wait_completed` resolves with fewer, and a reused
70
+ * sleep can resolve in an entirely earlier loop iteration; a step result is
71
+ * gated on hydration whose cost varies between replays of the SAME
72
+ * invocation the first replay pays the full decrypt/decompress/revive,
73
+ * while later replays sharing the invocation's `ReplayPayloadCache`
74
+ * memo-hit small primitive results and resolve in one or two hops. Either
75
+ * way, the resolution that the committed event log ordered first can lose a
76
+ * `Promise.race` (or a `useStep` ULID allocation) to a faster- or
77
+ * already-resolved competitor, diverging from the log and surfacing as
78
+ * `CorruptedEventLogError`.
69
79
  *
70
80
  * The fix is a strict, deterministic delivery order anchored on
71
81
  * event-log position: a delivery does not resolve to the workflow until
72
- * every earlier-in-log delivery of the OPPOSITE kind has been delivered.
73
- * (Opposite kind only: sequential same-kind hook payloads must not block
74
- * one another, and a wait need not wait behind a later wait.) Because the
82
+ * every relevant earlier-in-log delivery has been delivered. Because the
75
83
  * gate is "the earlier delivery resolved", not "won a timing race", the
76
84
  * outcome is independent of microtask hops, hydration/decryption time,
77
- * and `Promise.race` argument order.
85
+ * and `Promise.race` argument order. Which earlier kinds a delivery defers
86
+ * behind is spelled out on {@link awaitEarlierDeliveries}.
78
87
  *
79
88
  * Index is used rather than the `eventId` string because `eventId` is an
80
89
  * opaque, world-assigned value not guaranteed to sort in creation order
@@ -85,64 +94,87 @@ export interface WorkflowOrchestratorContext {
85
94
  */
86
95
  pendingDeliveryBarriers?: Map<number, DeliveryBarrierEntry>;
87
96
  /**
88
- * Per-run memoization cache for hydrated step return values, keyed by the
89
- * `step_completed` event id. Owned by the inline replay loop in `runtime.ts`
90
- * and threaded through each `runWorkflow` call so it survives across replay
91
- * iterations of the SAME run (a fresh context is created each iteration) but
92
- * never leaks across unrelated runs.
93
- *
94
- * On replay K of a sequential N-step workflow, the step consumer would
95
- * otherwise re-decrypt and re-parse the results of all K already-completed
96
- * steps — O(N²) across an invocation. This cache makes a completed step's
97
- * result available in O(1) on subsequent replays. Only primitive results are
98
- * memoized, so a shared reference can never let one replay's mutation leak
99
- * into the next; see `step-hydration-cache.ts` for the full rationale.
100
- *
101
- * Optional so contexts that do not initialize it (test harnesses) degrade
102
- * gracefully to re-hydrating every replay — identical to previous behavior.
97
+ * Invocation-scoped cache of prepared serialized payloads and immutable final
98
+ * values. Prepared bytes survive fresh replay VMs; object graphs do not.
103
99
  */
104
- stepHydrationCache?: StepHydrationCache;
100
+ replayPayloadCache: ReplayPayloadCache;
105
101
  }
106
102
  /** The kind of branch-deciding delivery a barrier represents. */
107
- export type DeliveryKind = 'hook' | 'wait';
103
+ export type DeliveryKind = 'hook' | 'wait' | 'step';
108
104
  interface DeliveryBarrierEntry {
109
105
  kind: DeliveryKind;
110
106
  /** Resolves once this delivery has resolved to the workflow. */
111
107
  delivered: Promise<void>;
108
+ /**
109
+ * Whether this delivery is committed to reaching the workflow without any
110
+ * further action by workflow code. True for wait completions and step
111
+ * results, which always resolve from their own chain, and for a hook payload
112
+ * that already had a waiting consumer when it was consumed.
113
+ *
114
+ * False for a BUFFERED hook payload no consumer has claimed yet: it is
115
+ * delivered by `claim()`, i.e. whenever the workflow next reads the hook —
116
+ * which may be causally *after* a later-in-log delivery. `arm()` flips it
117
+ * once a consumer takes the payload.
118
+ */
119
+ armed: boolean;
112
120
  }
113
121
  /**
114
- * Awaits, in strict event-log order, every still-registered delivery whose
115
- * index is earlier than `eventIndex` AND whose kind is in `deferBehindKinds`,
116
- * so that this resolution is handed to the workflow only after all relevant
117
- * earlier-in-log deliveries have been. This is what keeps a `Promise.race`
118
- * deterministic and aligned with the committed event log, independent of
119
- * microtask-hop counts, hydration time, or race-argument order.
122
+ * Awaits, in strict event-log order, every still-registered delivery that is
123
+ * earlier in the log than `eventIndex` and that a delivery of `kind` defers
124
+ * behind (see {@link DEFER_BEHIND}), so that this resolution is handed to the
125
+ * workflow only after all relevant earlier-in-log deliveries have been. This
126
+ * is what keeps a `Promise.race` — or the ULID a follow-up `useStep` draws on
127
+ * a concurrent branch deterministic and aligned with the committed event
128
+ * log, independent of microtask-hop counts, hydration time, or race-argument
129
+ * order. When this delivery does have to wait, it also yields a macrotask
130
+ * afterwards so the earlier delivery's consumer can run to its own next
131
+ * suspension point first; see the comment at that `await` for why ordering the
132
+ * `resolve()` calls alone is not enough.
120
133
  *
121
- * `deferBehindKinds` is the opposite kind(s): a hook defers behind earlier
122
- * WAITS (not earlier hooks those are sequential same-entity payloads), a
123
- * wait defers behind earlier HOOKS.
134
+ * One asymmetry: a STEP result additionally skips any earlier delivery that
135
+ * will not resolve on its own, i.e. one blocked (directly or transitively) on
136
+ * a buffered hook payload no consumer has claimed. Such a payload is delivered
137
+ * only when the workflow next reads the hook, and reaching that read very
138
+ * commonly requires the step result itself (`await stepX()` before the read).
139
+ * Gating the step on it would stall the workflow until the barrier's idle
140
+ * safety net fires, which then releases every delivery queued behind that
141
+ * payload at once — losing exactly the race this ordering exists to protect.
142
+ * Waits and hooks keep gating on unclaimed payloads: for them, waiting for the
143
+ * claim IS the ordering guarantee (a `wait_completed` must not preempt a
144
+ * payload the log ordered first).
124
145
  */
125
- export declare function awaitEarlierDeliveries(ctx: WorkflowOrchestratorContext, eventIndex: number | undefined, deferBehindKinds: readonly DeliveryKind[]): Promise<void>;
146
+ export declare function awaitEarlierDeliveries(ctx: WorkflowOrchestratorContext, eventIndex: number | undefined, kind: DeliveryKind): Promise<void>;
126
147
  /** Handle for a registered branch-deciding delivery barrier. */
127
148
  export interface DeliveryBarrier {
128
149
  /**
129
150
  * Mark this delivery as delivered to the workflow. Resolves its
130
- * `delivered` promise so any later-in-log opposite-kind delivery gated on
131
- * it (via {@link awaitEarlierDeliveries}) may proceed, and removes it from
132
- * the registry. Idempotent.
151
+ * `delivered` promise so any later-in-log delivery gated on it (via
152
+ * {@link awaitEarlierDeliveries}) may proceed, and removes it from the
153
+ * registry. Idempotent.
133
154
  */
134
155
  markDelivered: () => void;
156
+ /**
157
+ * Mark this delivery as committed to happening, for a barrier registered
158
+ * unarmed (a buffered hook payload) once a consumer has claimed it. From
159
+ * then on a later step result may be ordered behind it. Idempotent.
160
+ */
161
+ arm: () => void;
135
162
  }
136
163
  /**
137
164
  * Register a branch-deciding delivery at its event-log index so that later
138
- * opposite-kind deliveries can be ordered strictly after it. Returns an inert
139
- * handle when `pendingDeliveryBarriers` is not initialized.
165
+ * deliveries can be ordered strictly after it. Returns an inert handle when
166
+ * `pendingDeliveryBarriers` is not initialized.
167
+ *
168
+ * Pass `armed: false` for a delivery whose resolution waits on workflow code
169
+ * asking for it (a buffered hook payload); call `arm()` when it does.
140
170
  *
141
171
  * To guarantee a later delivery gated on this one can never hang when this
142
172
  * delivery is abandoned (the workflow took a different branch or is
143
173
  * suspending and never observes it), the barrier auto-resolves at idle.
144
174
  */
145
- export declare function registerDeliveryBarrier(ctx: WorkflowOrchestratorContext, eventIndex: number | undefined, kind: DeliveryKind): DeliveryBarrier;
175
+ export declare function registerDeliveryBarrier(ctx: WorkflowOrchestratorContext, eventIndex: number | undefined, kind: DeliveryKind, options?: {
176
+ armed?: boolean;
177
+ }): DeliveryBarrier;
146
178
  /**
147
179
  * Schedule a callback to fire only after all pending data deliveries
148
180
  * (step results, hook payloads) and async deserialization have completed.
@@ -1 +1 @@
1
- {"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../src/private.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,MAAM,YAAY,CACtB,IAAI,SAAS,YAAY,EAAE,GAAG,GAAG,EAAE,EACnC,MAAM,SAAS,YAAY,GAAG,OAAO,GAAG,OAAO,IAC7C,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAsEF;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,QAGxE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAoBxE;AAOD,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B;;;OAGG;IACH,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACzC,eAAe,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B;;;;;;OAMG;IACH,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B;;;;;;OAMG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,uBAAuB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAC5D;;;;;;;;;;;;;;;;OAgBG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;CACzC;AAED,iEAAiE;AACjE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3C,UAAU,oBAAoB;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,2BAA2B,EAChC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,gBAAgB,EAAE,SAAS,YAAY,EAAE,GACxC,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,gEAAgE;AAChE,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,2BAA2B,EAChC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,IAAI,EAAE,YAAY,GACjB,eAAe,CA6BjB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,2BAA2B,EAChC,EAAE,EAAE,MAAM,IAAI,GACb,IAAI,CAYN"}
1
+ {"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../src/private.ts"],"names":[],"mappings":"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"}