@workflow/web-shared 5.0.0-beta.44 → 5.0.0-beta.47

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 (30) hide show
  1. package/dist/components/event-list-view.js +3 -3
  2. package/dist/components/trace-viewer/components/use-alt-held.d.ts +11 -0
  3. package/dist/components/trace-viewer/components/use-alt-held.d.ts.map +1 -0
  4. package/dist/components/trace-viewer/components/use-alt-held.js +48 -0
  5. package/dist/components/trace-viewer/trace-viewer.d.ts.map +1 -1
  6. package/dist/components/trace-viewer/trace-viewer.js +4 -17
  7. package/dist/components/trace-viewer.d.ts +4 -1
  8. package/dist/components/trace-viewer.d.ts.map +1 -1
  9. package/dist/components/trace-viewer.js +4 -3
  10. package/dist/components/ui/data-inspector.d.ts +3 -2
  11. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  12. package/dist/components/ui/data-inspector.js +85 -8
  13. package/dist/components/workflow-traces/trace-span-construction.d.ts +2 -1
  14. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  15. package/dist/components/workflow-traces/trace-span-construction.js +7 -3
  16. package/dist/lib/duplicate-events.d.ts.map +1 -1
  17. package/dist/lib/duplicate-events.js +14 -25
  18. package/dist/lib/trace-builder.d.ts +3 -1
  19. package/dist/lib/trace-builder.d.ts.map +1 -1
  20. package/dist/lib/trace-builder.js +5 -5
  21. package/package.json +5 -5
  22. package/src/components/event-list-view.tsx +2 -2
  23. package/src/components/trace-viewer/components/use-alt-held.ts +54 -0
  24. package/src/components/trace-viewer/trace-viewer.tsx +3 -15
  25. package/src/components/trace-viewer.tsx +6 -1
  26. package/src/components/ui/data-inspector.tsx +105 -9
  27. package/src/components/workflow-traces/trace-span-construction.ts +14 -2
  28. package/src/lib/duplicate-events.ts +14 -26
  29. package/src/lib/trace-builder.test.ts +42 -1
  30. package/src/lib/trace-builder.ts +13 -4
@@ -171,7 +171,7 @@ export const stepEventsToStepEntity = (events) => {
171
171
  /**
172
172
  * Converts step events to an OpenTelemetry Span
173
173
  */
174
- export function stepToSpan(stepEvents, maxEndTime) {
174
+ export function stepToSpan(stepEvents, maxEndTime, getStepAttributes) {
175
175
  const step = stepEventsToStepEntity(stepEvents);
176
176
  if (!step) {
177
177
  return null;
@@ -180,7 +180,11 @@ export function stepToSpan(stepEvents, maxEndTime) {
180
180
  parseWorkflowName(String(step.stepName));
181
181
  const attributes = {
182
182
  resource: 'step',
183
- data: step,
183
+ data: {
184
+ ...getStepAttributes?.(stepEvents),
185
+ // Canonical event-derived fields cannot be overridden by extensions.
186
+ ...step,
187
+ },
184
188
  };
185
189
  const resource = 'step';
186
190
  // Include ALL correlated events on the span so the sidebar detail view
@@ -333,4 +337,4 @@ export function runToSpan(run, runEvents, nowTime) {
333
337
  : undefined,
334
338
  };
335
339
  }
336
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2Utc3Bhbi1jb25zdHJ1Y3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy93b3JrZmxvdy10cmFjZXMvdHJhY2Utc3Bhbi1jb25zdHJ1Y3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUUsT0FBTyxFQUVMLHVCQUF1QixHQUV4QixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV2RSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixJQUFJLEVBQUUsMEJBQTBCO0lBQ2hDLE9BQU8sRUFBRSxPQUFPO0NBQ2pCLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sa0JBQWtCLEdBQTRCLElBQUksR0FBRyxDQUFDO0lBQzFELGNBQWM7SUFDZCxlQUFlO0lBQ2YsZUFBZTtJQUNmLGNBQWM7SUFDZCxlQUFlO0lBQ2YsYUFBYTtJQUNiLFlBQVk7SUFDWixjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCLFVBQVU7Q0FDWCxDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUMvQixLQUF3QixFQUNOLEVBQUU7SUFDcEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxFQUFFLFVBQVUsSUFBSSxLQUFLLEVBQUUsU0FBUyxDQUFDO0lBQ3BELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFN0IsTUFBTSxJQUFJLEdBQUcsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3RCxP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RixDQUFDO0lBRUYsMENBQTBDO0lBQzFDLE1BQU0sTUFBTSxHQUFHLHlCQUF5QixDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUU7UUFDekQsZ0JBQWdCLEVBQUUsSUFBSTtLQUN2QixDQUFDLENBQUM7SUFFSCxPQUFPO1FBQ0wsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQ3pCLElBQUksRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLFNBQVMsSUFBSSxHQUFHLENBQUM7UUFDbkUsSUFBSSxFQUFFLENBQUMsRUFBRSxxQkFBcUI7UUFDOUIsUUFBUSxFQUFFLEtBQUs7UUFDZixPQUFPLEVBQUUsZ0JBQWdCO1FBQ3pCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7UUFDbkIsVUFBVSxFQUFFLENBQUM7UUFDYixVQUFVO1FBQ1YsS0FBSyxFQUFFLEVBQUU7UUFDVCxNQUFNO1FBQ04sU0FBUyxFQUFFLGNBQWMsQ0FBQyxhQUFhLENBQUM7UUFDeEMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxPQUFPLENBQUM7UUFDaEMsUUFBUSxFQUFFLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUM7UUFDbkQsMEZBQTBGO1FBQzFGLGVBQWUsRUFDYixlQUFlLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUU7WUFDcEUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUM7WUFDakMsQ0FBQyxDQUFDLFNBQVM7S0FDaEIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZ1bmN0aW9ucyBmb3IgY29uc3RydWN0aW5nIE9wZW5UZWxlbWV0cnkgc3BhbnMgZnJvbSB3b3JrZmxvdyBlbnRpdGllc1xuICovXG5cbmltcG9ydCB7IHBhcnNlU3RlcE5hbWUsIHBhcnNlV29ya2Zsb3dOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHtcbiAgdHlwZSBFdmVudCxcbiAgaXNUZXJtaW5hbFN0ZXBFdmVudFR5cGUsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IFNwYW4sIFNwYW5FdmVudCB9IGZyb20gJy4uLy4uL2xpYi90cmFjZS10eXBlcyc7XG5pbXBvcnQgeyBzaG91bGRTaG93VmVydGljYWxMaW5lIH0gZnJvbSAnLi9ldmVudC1jb2xvcnMnO1xuaW1wb3J0IHsgY2FsY3VsYXRlRHVyYXRpb24sIGRhdGVUb090ZWxUaW1lIH0gZnJvbSAnLi90cmFjZS10aW1lLXV0aWxzJztcblxuZXhwb3J0IGNvbnN0IFdPUktGTE9XX0xJQlJBUlkgPSB7XG4gIG5hbWU6ICd3b3JrZmxvdy1kZXZlbG9wbWVudC1raXQnLFxuICB2ZXJzaW9uOiAnNC4wLjAnLFxufTtcblxuLyoqXG4gKiBFdmVudCB0eXBlcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgYXMgdmlzdWFsIG1hcmtlcnMgaW4gdGhlIHRyYWNlIHZpZXdlclxuICovXG5jb25zdCBNQVJLRVJfRVZFTlRfVFlQRVM6IFNldDxFdmVudFsnZXZlbnRUeXBlJ10+ID0gbmV3IFNldChbXG4gICdob29rX2NyZWF0ZWQnLFxuICAnaG9va19yZWNlaXZlZCcsXG4gICdob29rX2Rpc3Bvc2VkJyxcbiAgJ3N0ZXBfc3RhcnRlZCcsXG4gICdzdGVwX3JldHJ5aW5nJyxcbiAgJ3N0ZXBfZmFpbGVkJyxcbiAgJ3J1bl9mYWlsZWQnLFxuICAnd2FpdF9jcmVhdGVkJyxcbiAgJ3dhaXRfY29tcGxldGVkJyxcbiAgJ2F0dHJfc2V0Jyxcbl0pO1xuXG5leHBvcnQgY29uc3QgZ2V0RXZlbnRUaW1lc3RhbXAgPSAoXG4gIGV2ZW50OiBFdmVudCB8IHVuZGVmaW5lZFxuKTogRGF0ZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHZhbHVlID0gZXZlbnQ/Lm9jY3VycmVkQXQgPz8gZXZlbnQ/LmNyZWF0ZWRBdDtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBkYXRlID0gdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gdmFsdWUgOiBuZXcgRGF0ZSh2YWx1ZSk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gdW5kZWZpbmVkIDogZGF0ZTtcbn07XG5cbi8qKlxuICogQ29udmVydCB3b3JrZmxvdyBldmVudHMgdG8gc3BhbiBldmVudHNcbiAqIE9ubHkgaW5jbHVkZXMgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBhcyBtYXJrZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RXZlbnRzVG9TcGFuRXZlbnRzKFxuICBldmVudHM6IEV2ZW50W10sXG4gIGZpbHRlclR5cGVzID0gdHJ1ZSxcbiAgb3B0aW9uczogeyBwcmVmZXJPY2N1cnJlZEF0PzogYm9vbGVhbiB9ID0ge31cbik6IFNwYW5FdmVudFtdIHtcbiAgcmV0dXJuIGV2ZW50c1xuICAgIC5maWx0ZXIoKGV2ZW50KSA9PlxuICAgICAgZmlsdGVyVHlwZXMgPyBNQVJLRVJfRVZFTlRfVFlQRVMuaGFzKGV2ZW50LmV2ZW50VHlwZSkgOiB0cnVlXG4gICAgKVxuICAgIC5tYXAoKGV2ZW50KSA9PiAoe1xuICAgICAgbmFtZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgdGltZXN0YW1wOiBkYXRlVG9PdGVsVGltZShcbiAgICAgICAgb3B0aW9ucy5wcmVmZXJPY2N1cnJlZEF0XG4gICAgICAgICAgPyAoZ2V0RXZlbnRUaW1lc3RhbXAoZXZlbnQpID8/IGV2ZW50LmNyZWF0ZWRBdClcbiAgICAgICAgICA6IGV2ZW50LmNyZWF0ZWRBdFxuICAgICAgKSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCxcbiAgICAgICAgY29ycmVsYXRpb25JZDogZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgZXZlbnREYXRhOiAnZXZlbnREYXRhJyBpbiBldmVudCA/IGV2ZW50LmV2ZW50RGF0YSA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgICAvLyBDb250cm9sIHdoZXRoZXIgdG8gc2hvdyB2ZXJ0aWNhbCBsaW5lIGluIHRpbWVsaW5lXG4gICAgICBzaG93VmVydGljYWxMaW5lOiBzaG91bGRTaG93VmVydGljYWxMaW5lKGV2ZW50LmV2ZW50VHlwZSksXG4gICAgfSkpO1xufVxuXG5leHBvcnQgY29uc3Qgd2FpdEV2ZW50c1RvV2FpdEVudGl0eSA9IChcbiAgZXZlbnRzOiBFdmVudFtdXG4pOiB7XG4gIHdhaXRJZDogc3RyaW5nO1xuICBydW5JZDogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHJlc3VtZUF0PzogRGF0ZTtcbiAgY29tcGxldGVkQXQ/OiBEYXRlO1xufSB8IG51bGwgPT4ge1xuICBjb25zdCBzdGFydEV2ZW50ID0gZXZlbnRzLmZpbmQoKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnKTtcbiAgaWYgKCFzdGFydEV2ZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgY29tcGxldGVkRXZlbnQgPSBldmVudHMuZmluZChcbiAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJ1xuICApO1xuICByZXR1cm4ge1xuICAgIHdhaXRJZDogc3RhcnRFdmVudC5jb3JyZWxhdGlvbklkLFxuICAgIHJ1bklkOiBzdGFydEV2ZW50LnJ1bklkLFxuICAgIGNyZWF0ZWRBdDogZ2V0RXZlbnRUaW1lc3RhbXAoc3RhcnRFdmVudCkgPz8gc3RhcnRFdmVudC5jcmVhdGVkQXQsXG4gICAgcmVzdW1lQXQ6IHN0YXJ0RXZlbnQuZXZlbnREYXRhPy5yZXN1bWVBdFxuICAgICAgPyBuZXcgRGF0ZShzdGFydEV2ZW50LmV2ZW50RGF0YS5yZXN1bWVBdClcbiAgICAgIDogdW5kZWZpbmVkLFxuICAgIGNvbXBsZXRlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChjb21wbGV0ZWRFdmVudCksXG4gIH07XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgd29ya2Zsb3cgV2FpdCB0byBhbiBPcGVuVGVsZW1ldHJ5IFNwYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhaXRUb1NwYW4oXG4gIGV2ZW50czogRXZlbnRbXSxcbiAgbWF4RW5kVGltZTogRGF0ZSxcbiAgZmFsbGJhY2tFbmRUaW1lID0gbWF4RW5kVGltZVxuKTogU3BhbiB8IG51bGwge1xuICBjb25zdCB3YWl0ID0gd2FpdEV2ZW50c1RvV2FpdEVudGl0eShldmVudHMpO1xuICBpZiAoIXdhaXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBzdGFydFRpbWUgPSB3YWl0LmNyZWF0ZWRBdDtcbiAgY29uc3Qgc3RhcnRNcyA9IHN0YXJ0VGltZS5nZXRUaW1lKCk7XG4gIGxldCBlbmRUaW1lID0gd2FpdC5jb21wbGV0ZWRBdDtcbiAgaWYgKCFlbmRUaW1lKSB7XG4gICAgY29uc3QgZmFsbGJhY2tDYXAgPVxuICAgICAgd2FpdC5yZXN1bWVBdCAmJiB3YWl0LnJlc3VtZUF0LmdldFRpbWUoKSA8IGZhbGxiYWNrRW5kVGltZS5nZXRUaW1lKClcbiAgICAgICAgPyB3YWl0LnJlc3VtZUF0XG4gICAgICAgIDogZmFsbGJhY2tFbmRUaW1lO1xuICAgIGVuZFRpbWUgPVxuICAgICAgbWF4RW5kVGltZS5nZXRUaW1lKCkgPiBzdGFydE1zICYmXG4gICAgICBtYXhFbmRUaW1lLmdldFRpbWUoKSA8IGZhbGxiYWNrQ2FwLmdldFRpbWUoKVxuICAgICAgICA/IG1heEVuZFRpbWVcbiAgICAgICAgOiBmYWxsYmFja0NhcDtcbiAgfVxuICBjb25zdCBzdGFydCA9IGRhdGVUb090ZWxUaW1lKHN0YXJ0VGltZSk7XG4gIGNvbnN0IGVuZCA9IGRhdGVUb090ZWxUaW1lKGVuZFRpbWUpO1xuICBjb25zdCBkdXJhdGlvbiA9IGNhbGN1bGF0ZUR1cmF0aW9uKHN0YXJ0VGltZSwgZW5kVGltZSk7XG4gIGNvbnN0IHNwYW5FdmVudHMgPSBjb252ZXJ0RXZlbnRzVG9TcGFuRXZlbnRzKGV2ZW50cywgZmFsc2UpO1xuICByZXR1cm4ge1xuICAgIHNwYW5JZDogd2FpdC53YWl0SWQsXG4gICAgbmFtZTogJ3NsZWVwJyxcbiAgICBraW5kOiAxLCAvLyBJTlRFUk5BTCBzcGFuIGtpbmRcbiAgICByZXNvdXJjZTogJ3NsZWVwJyxcbiAgICBsaWJyYXJ5OiBXT1JLRkxPV19MSUJSQVJZLFxuICAgIHN0YXR1czogeyBjb2RlOiAwIH0sXG4gICAgdHJhY2VGbGFnczogMSxcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICByZXNvdXJjZTogJ3NsZWVwJyBhcyBjb25zdCxcbiAgICAgIGRhdGE6IHdhaXQsIC8vIHdhaXQgaXMgYSBwbGFpbiBvYmplY3QgYnVpbHQgZnJvbSBldmVudHMsIG5vIG5vbi1jbG9uZWFibGUgdHlwZXNcbiAgICB9LFxuICAgIGxpbmtzOiBbXSxcbiAgICBldmVudHM6IHNwYW5FdmVudHMsXG4gICAgZHVyYXRpb24sXG4gICAgc3RhcnRUaW1lOiBzdGFydCxcbiAgICBlbmRUaW1lOiBlbmQsXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBzdGVwRXZlbnRzVG9TdGVwRW50aXR5ID0gKFxuICBldmVudHM6IEV2ZW50W11cbik6IHtcbiAgc3RlcElkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHN0ZXBOYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogJ3BlbmRpbmcnIHwgJ3J1bm5pbmcnIHwgJ2NvbXBsZXRlZCcgfCAnZmFpbGVkJyB8ICdjYW5jZWxsZWQnO1xuICBhdHRlbXB0OiBudW1iZXI7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgdXBkYXRlZEF0OiBEYXRlO1xuICBzdGFydGVkQXQ/OiBEYXRlO1xuICBjb21wbGV0ZWRBdD86IERhdGU7XG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xufSB8IG51bGwgPT4ge1xuICBjb25zdCBjcmVhdGVkRXZlbnQgPSBldmVudHMuZmluZChcbiAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCdcbiAgKTtcblxuICAvLyBWMSBydW5zIGRvbid0IGVtaXQgc3RlcF9jcmVhdGVkIGV2ZW50cy4gRmFsbCBiYWNrIHRvIHRoZSBlYXJsaWVzdCBldmVudFxuICAvLyBpbiB0aGUgZ3JvdXAgc28gd2UgY2FuIHN0aWxsIGJ1aWxkIGEgc3RlcCBzcGFuLlxuICBjb25zdCBhbmNob3JFdmVudCA9IGNyZWF0ZWRFdmVudCA/PyBldmVudHNbMF07XG4gIGlmICghYW5jaG9yRXZlbnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFdhbGsgZXZlbnRzIHRvIGRlcml2ZSBzdGF0dXMsIGF0dGVtcHQgY291bnQsIGFuZCB0aW1lc3RhbXBzLlxuICAvLyBIYW5kbGVzIGJvdGggc3RlcF9yZXRyeWluZyBhbmQgY29uc2VjdXRpdmUgc3RlcF9zdGFydGVkIGFzIHJldHJ5IHNpZ25hbHMuXG4gIGxldCBzdGF0dXM6ICdwZW5kaW5nJyB8ICdydW5uaW5nJyB8ICdjb21wbGV0ZWQnIHwgJ2ZhaWxlZCcgfCAnY2FuY2VsbGVkJyA9XG4gICAgJ3BlbmRpbmcnO1xuICBsZXQgYXR0ZW1wdCA9IDA7XG4gIGxldCBzdGFydGVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gIGxldCBjb21wbGV0ZWRBdDogRGF0ZSB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB7XG4gICAgc3dpdGNoIChlLmV2ZW50VHlwZSkge1xuICAgICAgY2FzZSAnc3RlcF9zdGFydGVkJzpcbiAgICAgICAgc3RhdHVzID0gJ3J1bm5pbmcnO1xuICAgICAgICBhdHRlbXB0ICs9IDE7XG4gICAgICAgIGlmICghc3RhcnRlZEF0KSBzdGFydGVkQXQgPSBnZXRFdmVudFRpbWVzdGFtcChlKSA/PyBlLmNyZWF0ZWRBdDtcbiAgICAgICAgY29tcGxldGVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RlcF9jb21wbGV0ZWQnOlxuICAgICAgICBzdGF0dXMgPSAnY29tcGxldGVkJztcbiAgICAgICAgY29tcGxldGVkQXQgPSBnZXRFdmVudFRpbWVzdGFtcChlKSA/PyBlLmNyZWF0ZWRBdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdGVwX2ZhaWxlZCc6XG4gICAgICAgIHN0YXR1cyA9ICdmYWlsZWQnO1xuICAgICAgICBjb21wbGV0ZWRBdCA9IGdldEV2ZW50VGltZXN0YW1wKGUpID8/IGUuY3JlYXRlZEF0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N0ZXBfcmV0cnlpbmcnOlxuICAgICAgICBzdGF0dXMgPSAncGVuZGluZyc7XG4gICAgICAgIGNvbXBsZXRlZEF0ID0gdW5kZWZpbmVkO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBFbnN1cmUgYXQgbGVhc3QgYXR0ZW1wdCAxIGlmIHdlIG5ldmVyIHNhdyBzdGVwX3N0YXJ0ZWRcbiAgaWYgKGF0dGVtcHQgPT09IDApIGF0dGVtcHQgPSAxO1xuXG4gIGNvbnN0IGxhc3RFdmVudCA9IGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV07XG5cbiAgcmV0dXJuIHtcbiAgICBzdGVwSWQ6IGFuY2hvckV2ZW50LmNvcnJlbGF0aW9uSWQgPz8gJycsXG4gICAgcnVuSWQ6IGFuY2hvckV2ZW50LnJ1bklkLFxuICAgIHN0ZXBOYW1lOiBjcmVhdGVkRXZlbnQ/LmV2ZW50RGF0YT8uc3RlcE5hbWUgPz8gJycsXG4gICAgc3RhdHVzLFxuICAgIGF0dGVtcHQsXG4gICAgY3JlYXRlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChhbmNob3JFdmVudCkgPz8gYW5jaG9yRXZlbnQuY3JlYXRlZEF0LFxuICAgIHVwZGF0ZWRBdDpcbiAgICAgIGdldEV2ZW50VGltZXN0YW1wKGxhc3RFdmVudCkgPz9cbiAgICAgIGxhc3RFdmVudD8uY3JlYXRlZEF0ID8/XG4gICAgICBhbmNob3JFdmVudC5jcmVhdGVkQXQsXG4gICAgc3RhcnRlZEF0LFxuICAgIGNvbXBsZXRlZEF0LFxuICAgIHNwZWNWZXJzaW9uOiBhbmNob3JFdmVudC5zcGVjVmVyc2lvbixcbiAgfTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgc3RlcCBldmVudHMgdG8gYW4gT3BlblRlbGVtZXRyeSBTcGFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVwVG9TcGFuKHN0ZXBFdmVudHM6IEV2ZW50W10sIG1heEVuZFRpbWU6IERhdGUpOiBTcGFuIHwgbnVsbCB7XG4gIGNvbnN0IHN0ZXAgPSBzdGVwRXZlbnRzVG9TdGVwRW50aXR5KHN0ZXBFdmVudHMpO1xuICBpZiAoIXN0ZXApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBwYXJzZWROYW1lID1cbiAgICBwYXJzZVN0ZXBOYW1lKFN0cmluZyhzdGVwLnN0ZXBOYW1lKSkgPz9cbiAgICBwYXJzZVdvcmtmbG93TmFtZShTdHJpbmcoc3RlcC5zdGVwTmFtZSkpO1xuXG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSB7XG4gICAgcmVzb3VyY2U6ICdzdGVwJyBhcyBjb25zdCxcbiAgICBkYXRhOiBzdGVwLFxuICB9O1xuXG4gIGNvbnN0IHJlc291cmNlID0gJ3N0ZXAnO1xuXG4gIC8vIEluY2x1ZGUgQUxMIGNvcnJlbGF0ZWQgZXZlbnRzIG9uIHRoZSBzcGFuIHNvIHRoZSBzaWRlYmFyIGRldGFpbCB2aWV3XG4gIC8vIGNhbiBkaXNwbGF5IHRoZW0uIFRoZSB0aW1lbGluZSB1c2VzIHRoZSBgc2hvd1ZlcnRpY2FsTGluZWAgZmxhZyB0b1xuICAvLyBkZXRlcm1pbmUgd2hpY2ggZXZlbnRzIGFwcGVhciBhcyBtYXJrZXJzLlxuICBjb25zdCBldmVudHMgPSBjb252ZXJ0RXZlbnRzVG9TcGFuRXZlbnRzKHN0ZXBFdmVudHMsIGZhbHNlLCB7XG4gICAgcHJlZmVyT2NjdXJyZWRBdDogdHJ1ZSxcbiAgfSk7XG5cbiAgLy8gVXNlIHRoZSBldmVudCBvY2N1cnJlbmNlIHRpbWVzdGFtcCBmb3Igc3RlcCBzcGFucyB3aGVuIGl0IGlzIGF2YWlsYWJsZSxcbiAgLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBpbmdlc3QgdGltZXN0YW1wIHVzZWQgYnkgb2xkZXIgZXZlbnQgc3RyZWFtcy5cbiAgY29uc3Qgc3BhblN0YXJ0RXZlbnQgPVxuICAgIHN0ZXBFdmVudHMuZmluZCgoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcpID8/XG4gICAgc3RlcEV2ZW50c1swXTtcbiAgY29uc3Qgc3BhblN0YXJ0VGltZSA9XG4gICAgZ2V0RXZlbnRUaW1lc3RhbXAoc3BhblN0YXJ0RXZlbnQpID8/IG5ldyBEYXRlKHN0ZXAuY3JlYXRlZEF0KTtcbiAgbGV0IGFjdGl2ZVN0YXJ0VGltZSA9IHN0ZXAuc3RhcnRlZEF0ID8gbmV3IERhdGUoc3RlcC5zdGFydGVkQXQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBmaXJzdFN0YXJ0RXZlbnQgPSBzdGVwRXZlbnRzLmZpbmQoXG4gICAgKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnXG4gICk7XG4gIGlmIChmaXJzdFN0YXJ0RXZlbnQpIHtcbiAgICBhY3RpdmVTdGFydFRpbWUgPVxuICAgICAgZ2V0RXZlbnRUaW1lc3RhbXAoZmlyc3RTdGFydEV2ZW50KSA/PyBuZXcgRGF0ZShmaXJzdFN0YXJ0RXZlbnQuY3JlYXRlZEF0KTtcbiAgfVxuXG4gIGxldCBlbmRUaW1lID0gbmV3IERhdGUobWF4RW5kVGltZSk7XG4gIGlmIChzdGVwLmNvbXBsZXRlZEF0KSB7XG4gICAgY29uc3QgY29tcGxldGVkRXZlbnQgPSBzdGVwRXZlbnRzXG4gICAgICAuc2xpY2UoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmZpbmQoKGV2ZW50KSA9PiBpc1Rlcm1pbmFsU3RlcEV2ZW50VHlwZShldmVudC5ldmVudFR5cGUpKTtcbiAgICBlbmRUaW1lID0gZ2V0RXZlbnRUaW1lc3RhbXAoY29tcGxldGVkRXZlbnQpID8/IG5ldyBEYXRlKHN0ZXAuY29tcGxldGVkQXQpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzcGFuSWQ6IFN0cmluZyhzdGVwLnN0ZXBJZCksXG4gICAgbmFtZTogcGFyc2VkTmFtZT8uc2hvcnROYW1lID8/IFN0cmluZyhzdGVwLnN0ZXBOYW1lKSxcbiAgICBraW5kOiAxLCAvLyBJTlRFUk5BTCBzcGFuIGtpbmRcbiAgICByZXNvdXJjZSxcbiAgICBsaWJyYXJ5OiBXT1JLRkxPV19MSUJSQVJZLFxuICAgIHN0YXR1czogeyBjb2RlOiAwIH0sXG4gICAgdHJhY2VGbGFnczogMSxcbiAgICBhdHRyaWJ1dGVzLFxuICAgIGxpbmtzOiBbXSxcbiAgICBldmVudHMsXG4gICAgc3RhcnRUaW1lOiBkYXRlVG9PdGVsVGltZShzcGFuU3RhcnRUaW1lKSxcbiAgICBlbmRUaW1lOiBkYXRlVG9PdGVsVGltZShlbmRUaW1lKSxcbiAgICBkdXJhdGlvbjogY2FsY3VsYXRlRHVyYXRpb24oc3BhblN0YXJ0VGltZSwgZW5kVGltZSksXG4gICAgLy8gT25seSBzZXQgYWN0aXZlU3RhcnRUaW1lIGlmIGl0IGRpZmZlcnMgZnJvbSBzdGFydFRpbWUgKGkuZS4sIHRoZXJlIHdhcyBhIHF1ZXVlZCBwZXJpb2QpXG4gICAgYWN0aXZlU3RhcnRUaW1lOlxuICAgICAgYWN0aXZlU3RhcnRUaW1lICYmIGFjdGl2ZVN0YXJ0VGltZS5nZXRUaW1lKCkgPiBzcGFuU3RhcnRUaW1lLmdldFRpbWUoKVxuICAgICAgICA/IGRhdGVUb090ZWxUaW1lKGFjdGl2ZVN0YXJ0VGltZSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBob29rRXZlbnRzVG9Ib29rRW50aXR5ID0gKFxuICBldmVudHM6IEV2ZW50W11cbik6IHtcbiAgaG9va0lkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHRva2VuPzogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHJlY2VpdmVkQ291bnQ6IG51bWJlcjtcbiAgbGFzdFJlY2VpdmVkQXQ/OiBEYXRlO1xuICBkaXNwb3NlZEF0PzogRGF0ZTtcbn0gfCBudWxsID0+IHtcbiAgY29uc3QgY3JlYXRlZEV2ZW50ID0gZXZlbnRzLmZpbmQoXG4gICAgKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnXG4gICk7XG4gIGlmICghY3JlYXRlZEV2ZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgcmVjZWl2ZWRFdmVudHMgPSBldmVudHMuZmlsdGVyKFxuICAgIChldmVudCkgPT4gZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19yZWNlaXZlZCdcbiAgKTtcbiAgY29uc3QgZGlzcG9zZWRFdmVudHMgPSBldmVudHMuZmlsdGVyKFxuICAgIChldmVudCkgPT4gZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19kaXNwb3NlZCdcbiAgKTtcbiAgY29uc3QgbGFzdFJlY2VpdmVkRXZlbnQgPSByZWNlaXZlZEV2ZW50cy5hdCgtMSk7XG4gIHJldHVybiB7XG4gICAgaG9va0lkOiBjcmVhdGVkRXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICBydW5JZDogY3JlYXRlZEV2ZW50LnJ1bklkLFxuICAgIHRva2VuOiBjcmVhdGVkRXZlbnQuZXZlbnREYXRhPy50b2tlbixcbiAgICBjcmVhdGVkQXQ6IGdldEV2ZW50VGltZXN0YW1wKGNyZWF0ZWRFdmVudCkgPz8gY3JlYXRlZEV2ZW50LmNyZWF0ZWRBdCxcbiAgICByZWNlaXZlZENvdW50OiByZWNlaXZlZEV2ZW50cy5sZW5ndGgsXG4gICAgbGFzdFJlY2VpdmVkQXQ6IGdldEV2ZW50VGltZXN0YW1wKGxhc3RSZWNlaXZlZEV2ZW50KSxcbiAgICBkaXNwb3NlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChkaXNwb3NlZEV2ZW50cy5hdCgtMSkpLFxuICB9O1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHdvcmtmbG93IEhvb2sgdG8gYW4gT3BlblRlbGVtZXRyeSBTcGFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBob29rVG9TcGFuKGhvb2tFdmVudHM6IEV2ZW50W10sIG1heEVuZFRpbWU6IERhdGUpOiBTcGFuIHwgbnVsbCB7XG4gIGNvbnN0IGhvb2sgPSBob29rRXZlbnRzVG9Ib29rRW50aXR5KGhvb2tFdmVudHMpO1xuICBpZiAoIWhvb2spIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIENvbnZlcnQgaG9vay1yZWxhdGVkIGV2ZW50cyB0byBzcGFuIGV2ZW50c1xuICBjb25zdCBldmVudHMgPSBjb252ZXJ0RXZlbnRzVG9TcGFuRXZlbnRzKGhvb2tFdmVudHMsIGZhbHNlKTtcblxuICBjb25zdCBlbmRUaW1lID0gaG9vay5kaXNwb3NlZEF0IHx8IG1heEVuZFRpbWU7XG5cbiAgcmV0dXJuIHtcbiAgICBzcGFuSWQ6IFN0cmluZyhob29rLmhvb2tJZCksXG4gICAgbmFtZTogaG9vay50b2tlbiA/PyBTdHJpbmcoaG9vay5ob29rSWQpLFxuICAgIGtpbmQ6IDEsIC8vIElOVEVSTkFMIHNwYW4ga2luZFxuICAgIHJlc291cmNlOiAnaG9vaycsXG4gICAgbGlicmFyeTogV09SS0ZMT1dfTElCUkFSWSxcbiAgICBzdGF0dXM6IHsgY29kZTogMSB9LFxuICAgIHRyYWNlRmxhZ3M6IDEsXG4gICAgYXR0cmlidXRlczoge1xuICAgICAgcmVzb3VyY2U6ICdob29rJyBhcyBjb25zdCxcbiAgICAgIGRhdGE6IGhvb2ssXG4gICAgfSxcbiAgICBsaW5rczogW10sXG4gICAgZXZlbnRzLFxuICAgIHN0YXJ0VGltZTogZGF0ZVRvT3RlbFRpbWUoaG9vay5jcmVhdGVkQXQpLFxuICAgIGVuZFRpbWU6IGRhdGVUb090ZWxUaW1lKGVuZFRpbWUpLFxuICAgIGR1cmF0aW9uOiBjYWxjdWxhdGVEdXJhdGlvbihob29rLmNyZWF0ZWRBdCwgZW5kVGltZSksXG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJvb3Qgc3BhbiBmb3IgdGhlIHdvcmtmbG93IHJ1blxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuVG9TcGFuKFxuICBydW46IFdvcmtmbG93UnVuLFxuICBydW5FdmVudHM6IEV2ZW50W10sXG4gIG5vd1RpbWU/OiBEYXRlXG4pOiBTcGFuIHtcbiAgY29uc3Qgbm93ID0gbm93VGltZSA/PyBuZXcgRGF0ZSgpO1xuXG4gIC8vIFByZWZlciB0aGUgZXZlbnQgb2NjdXJyZW5jZSB0aW1lc3RhbXAgd2hlbiBhdmFpbGFibGUgc28gdGhlIHJvb3Qgc3BhblxuICAvLyBsaW5lcyB1cCB3aXRoIGNoaWxkIHNwYW5zIHRoYXQgYWxyZWFkeSB1c2UgZXZlbnQgb2NjdXJyZW5jZSB0aW1lLlxuICBjb25zdCBydW5DcmVhdGVkRXZlbnQgPSBydW5FdmVudHMuZmluZChcbiAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJ1xuICApO1xuICBjb25zdCBydW5TdGFydGVkRXZlbnQgPSBydW5FdmVudHMuZmluZChcbiAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJ1xuICApO1xuICBjb25zdCB0ZXJtaW5hbEV2ZW50ID0gcnVuRXZlbnRzXG4gICAgLnNsaWNlKClcbiAgICAucmV2ZXJzZSgpXG4gICAgLmZpbmQoXG4gICAgICAoZXZlbnQpID0+XG4gICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3J1bl9jb21wbGV0ZWQnIHx8XG4gICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnIHx8XG4gICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnXG4gICAgKTtcbiAgY29uc3Qgc3BhblN0YXJ0VGltZSA9XG4gICAgZ2V0RXZlbnRUaW1lc3RhbXAocnVuQ3JlYXRlZEV2ZW50KSA/PyBuZXcgRGF0ZShydW4uY3JlYXRlZEF0KTtcbiAgY29uc3QgYWN0aXZlU3RhcnRUaW1lID1cbiAgICBnZXRFdmVudFRpbWVzdGFtcChydW5TdGFydGVkRXZlbnQpID8/XG4gICAgKHJ1bi5zdGFydGVkQXQgPyBuZXcgRGF0ZShydW4uc3RhcnRlZEF0KSA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbXBsZXRlZEF0ID1cbiAgICBnZXRFdmVudFRpbWVzdGFtcCh0ZXJtaW5hbEV2ZW50KSA/PyBydW4uY29tcGxldGVkQXQgPz8gdW5kZWZpbmVkO1xuICBjb25zdCBlbmRUaW1lID0gY29tcGxldGVkQXQgPz8gbm93O1xuXG4gIC8vIE9ubHkgZW1iZWQgaWRlbnRpZmljYXRpb24gZmllbGRzLCBub3QgdGhlIGZ1bGwgb2JqZWN0IHdpdGhcbiAgLy8gaW5wdXQvb3V0cHV0L2Vycm9yIHdoaWNoIG1heSBjb250YWluIG5vbi1jbG9uZWFibGUgdHlwZXMuIExpZmVjeWNsZVxuICAvLyB0aW1lc3RhbXBzIGFyZSBldmVudC1kZXJpdmVkIHNvIGRldGFpbCByb3dzIGFsaWduIHdpdGggdGhlIHNwYW4gdGltZWxpbmUuXG4gIGNvbnN0IHsgaW5wdXQ6IF9pLCBvdXRwdXQ6IF9vLCBlcnJvcjogX2UsIC4uLnJ1bklkZW50aXR5IH0gPSBydW47XG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSB7XG4gICAgcmVzb3VyY2U6ICdydW4nIGFzIGNvbnN0LFxuICAgIGRhdGE6IHtcbiAgICAgIC4uLnJ1bklkZW50aXR5LFxuICAgICAgY3JlYXRlZEF0OiBzcGFuU3RhcnRUaW1lLFxuICAgICAgc3RhcnRlZEF0OiBhY3RpdmVTdGFydFRpbWUsXG4gICAgICBjb21wbGV0ZWRBdCxcbiAgICB9LFxuICB9O1xuXG4gIC8vIENvbnZlcnQgcnVuLWxldmVsIGV2ZW50cyB0byBzcGFuIGV2ZW50c1xuICBjb25zdCBldmVudHMgPSBjb252ZXJ0RXZlbnRzVG9TcGFuRXZlbnRzKHJ1bkV2ZW50cywgZmFsc2UsIHtcbiAgICBwcmVmZXJPY2N1cnJlZEF0OiB0cnVlLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHNwYW5JZDogU3RyaW5nKHJ1bi5ydW5JZCksXG4gICAgbmFtZTogU3RyaW5nKHBhcnNlV29ya2Zsb3dOYW1lKHJ1bi53b3JrZmxvd05hbWUpPy5zaG9ydE5hbWUgPz8gJz8nKSxcbiAgICBraW5kOiAxLCAvLyBJTlRFUk5BTCBzcGFuIGtpbmRcbiAgICByZXNvdXJjZTogJ3J1bicsXG4gICAgbGlicmFyeTogV09SS0ZMT1dfTElCUkFSWSxcbiAgICBzdGF0dXM6IHsgY29kZTogMCB9LFxuICAgIHRyYWNlRmxhZ3M6IDEsXG4gICAgYXR0cmlidXRlcyxcbiAgICBsaW5rczogW10sXG4gICAgZXZlbnRzLFxuICAgIHN0YXJ0VGltZTogZGF0ZVRvT3RlbFRpbWUoc3BhblN0YXJ0VGltZSksXG4gICAgZW5kVGltZTogZGF0ZVRvT3RlbFRpbWUoZW5kVGltZSksXG4gICAgZHVyYXRpb246IGNhbGN1bGF0ZUR1cmF0aW9uKHNwYW5TdGFydFRpbWUsIGVuZFRpbWUpLFxuICAgIC8vIE9ubHkgc2V0IGFjdGl2ZVN0YXJ0VGltZSBpZiBpdCBkaWZmZXJzIGZyb20gc3RhcnRUaW1lIChpLmUuLCB0aGVyZSB3YXMgYSBxdWV1ZWQgcGVyaW9kKVxuICAgIGFjdGl2ZVN0YXJ0VGltZTpcbiAgICAgIGFjdGl2ZVN0YXJ0VGltZSAmJiBhY3RpdmVTdGFydFRpbWUuZ2V0VGltZSgpID4gc3BhblN0YXJ0VGltZS5nZXRUaW1lKClcbiAgICAgICAgPyBkYXRlVG9PdGVsVGltZShhY3RpdmVTdGFydFRpbWUpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuIl19
340
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2Utc3Bhbi1jb25zdHJ1Y3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy93b3JrZmxvdy10cmFjZXMvdHJhY2Utc3Bhbi1jb25zdHJ1Y3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUUsT0FBTyxFQUVMLHVCQUF1QixHQUV4QixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV2RSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixJQUFJLEVBQUUsMEJBQTBCO0lBQ2hDLE9BQU8sRUFBRSxPQUFPO0NBQ2pCLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sa0JBQWtCLEdBQTRCLElBQUksR0FBRyxDQUFDO0lBQzFELGNBQWM7SUFDZCxlQUFlO0lBQ2YsZUFBZTtJQUNmLGNBQWM7SUFDZCxlQUFlO0lBQ2YsYUFBYTtJQUNiLFlBQVk7SUFDWixjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCLFVBQVU7Q0FDWCxDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUMvQixLQUF3QixFQUNOLEVBQUU7SUFDcEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxFQUFFLFVBQVUsSUFBSSxLQUFLLEVBQUUsU0FBUyxDQUFDO0lBQ3BELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFN0IsTUFBTSxJQUFJLEdBQUcsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3RCxP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LEVBQUU7WUFDSixHQUFHLFdBQVc7WUFDZCxTQUFTLEVBQUUsYUFBYTtZQUN4QixTQUFTLEVBQUUsZUFBZTtZQUMxQixXQUFXO1NBQ1o7S0FDRixDQUFDO0lBRUYsMENBQTBDO0lBQzFDLE1BQU0sTUFBTSxHQUFHLHlCQUF5QixDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUU7UUFDekQsZ0JBQWdCLEVBQUUsSUFBSTtLQUN2QixDQUFDLENBQUM7SUFFSCxPQUFPO1FBQ0wsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQ3pCLElBQUksRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLFNBQVMsSUFBSSxHQUFHLENBQUM7UUFDbkUsSUFBSSxFQUFFLENBQUMsRUFBRSxxQkFBcUI7UUFDOUIsUUFBUSxFQUFFLEtBQUs7UUFDZixPQUFPLEVBQUUsZ0JBQWdCO1FBQ3pCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7UUFDbkIsVUFBVSxFQUFFLENBQUM7UUFDYixVQUFVO1FBQ1YsS0FBSyxFQUFFLEVBQUU7UUFDVCxNQUFNO1FBQ04sU0FBUyxFQUFFLGNBQWMsQ0FBQyxhQUFhLENBQUM7UUFDeEMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxPQUFPLENBQUM7UUFDaEMsUUFBUSxFQUFFLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUM7UUFDbkQsMEZBQTBGO1FBQzFGLGVBQWUsRUFDYixlQUFlLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUU7WUFDcEUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUM7WUFDakMsQ0FBQyxDQUFDLFNBQVM7S0FDaEIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZ1bmN0aW9ucyBmb3IgY29uc3RydWN0aW5nIE9wZW5UZWxlbWV0cnkgc3BhbnMgZnJvbSB3b3JrZmxvdyBlbnRpdGllc1xuICovXG5cbmltcG9ydCB7IHBhcnNlU3RlcE5hbWUsIHBhcnNlV29ya2Zsb3dOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHtcbiAgdHlwZSBFdmVudCxcbiAgaXNUZXJtaW5hbFN0ZXBFdmVudFR5cGUsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IFNwYW4sIFNwYW5FdmVudCB9IGZyb20gJy4uLy4uL2xpYi90cmFjZS10eXBlcyc7XG5pbXBvcnQgeyBzaG91bGRTaG93VmVydGljYWxMaW5lIH0gZnJvbSAnLi9ldmVudC1jb2xvcnMnO1xuaW1wb3J0IHsgY2FsY3VsYXRlRHVyYXRpb24sIGRhdGVUb090ZWxUaW1lIH0gZnJvbSAnLi90cmFjZS10aW1lLXV0aWxzJztcblxuZXhwb3J0IGNvbnN0IFdPUktGTE9XX0xJQlJBUlkgPSB7XG4gIG5hbWU6ICd3b3JrZmxvdy1kZXZlbG9wbWVudC1raXQnLFxuICB2ZXJzaW9uOiAnNC4wLjAnLFxufTtcblxuLyoqXG4gKiBFdmVudCB0eXBlcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgYXMgdmlzdWFsIG1hcmtlcnMgaW4gdGhlIHRyYWNlIHZpZXdlclxuICovXG5jb25zdCBNQVJLRVJfRVZFTlRfVFlQRVM6IFNldDxFdmVudFsnZXZlbnRUeXBlJ10+ID0gbmV3IFNldChbXG4gICdob29rX2NyZWF0ZWQnLFxuICAnaG9va19yZWNlaXZlZCcsXG4gICdob29rX2Rpc3Bvc2VkJyxcbiAgJ3N0ZXBfc3RhcnRlZCcsXG4gICdzdGVwX3JldHJ5aW5nJyxcbiAgJ3N0ZXBfZmFpbGVkJyxcbiAgJ3J1bl9mYWlsZWQnLFxuICAnd2FpdF9jcmVhdGVkJyxcbiAgJ3dhaXRfY29tcGxldGVkJyxcbiAgJ2F0dHJfc2V0Jyxcbl0pO1xuXG5leHBvcnQgY29uc3QgZ2V0RXZlbnRUaW1lc3RhbXAgPSAoXG4gIGV2ZW50OiBFdmVudCB8IHVuZGVmaW5lZFxuKTogRGF0ZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHZhbHVlID0gZXZlbnQ/Lm9jY3VycmVkQXQgPz8gZXZlbnQ/LmNyZWF0ZWRBdDtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBkYXRlID0gdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gdmFsdWUgOiBuZXcgRGF0ZSh2YWx1ZSk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gdW5kZWZpbmVkIDogZGF0ZTtcbn07XG5cbi8qKlxuICogQ29udmVydCB3b3JrZmxvdyBldmVudHMgdG8gc3BhbiBldmVudHNcbiAqIE9ubHkgaW5jbHVkZXMgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBhcyBtYXJrZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RXZlbnRzVG9TcGFuRXZlbnRzKFxuICBldmVudHM6IEV2ZW50W10sXG4gIGZpbHRlclR5cGVzID0gdHJ1ZSxcbiAgb3B0aW9uczogeyBwcmVmZXJPY2N1cnJlZEF0PzogYm9vbGVhbiB9ID0ge31cbik6IFNwYW5FdmVudFtdIHtcbiAgcmV0dXJuIGV2ZW50c1xuICAgIC5maWx0ZXIoKGV2ZW50KSA9PlxuICAgICAgZmlsdGVyVHlwZXMgPyBNQVJLRVJfRVZFTlRfVFlQRVMuaGFzKGV2ZW50LmV2ZW50VHlwZSkgOiB0cnVlXG4gICAgKVxuICAgIC5tYXAoKGV2ZW50KSA9PiAoe1xuICAgICAgbmFtZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgdGltZXN0YW1wOiBkYXRlVG9PdGVsVGltZShcbiAgICAgICAgb3B0aW9ucy5wcmVmZXJPY2N1cnJlZEF0XG4gICAgICAgICAgPyAoZ2V0RXZlbnRUaW1lc3RhbXAoZXZlbnQpID8/IGV2ZW50LmNyZWF0ZWRBdClcbiAgICAgICAgICA6IGV2ZW50LmNyZWF0ZWRBdFxuICAgICAgKSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCxcbiAgICAgICAgY29ycmVsYXRpb25JZDogZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgZXZlbnREYXRhOiAnZXZlbnREYXRhJyBpbiBldmVudCA/IGV2ZW50LmV2ZW50RGF0YSA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgICAvLyBDb250cm9sIHdoZXRoZXIgdG8gc2hvdyB2ZXJ0aWNhbCBsaW5lIGluIHRpbWVsaW5lXG4gICAgICBzaG93VmVydGljYWxMaW5lOiBzaG91bGRTaG93VmVydGljYWxMaW5lKGV2ZW50LmV2ZW50VHlwZSksXG4gICAgfSkpO1xufVxuXG5leHBvcnQgY29uc3Qgd2FpdEV2ZW50c1RvV2FpdEVudGl0eSA9IChcbiAgZXZlbnRzOiBFdmVudFtdXG4pOiB7XG4gIHdhaXRJZDogc3RyaW5nO1xuICBydW5JZDogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHJlc3VtZUF0PzogRGF0ZTtcbiAgY29tcGxldGVkQXQ/OiBEYXRlO1xufSB8IG51bGwgPT4ge1xuICBjb25zdCBzdGFydEV2ZW50ID0gZXZlbnRzLmZpbmQoKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnKTtcbiAgaWYgKCFzdGFydEV2ZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgY29tcGxldGVkRXZlbnQgPSBldmVudHMuZmluZChcbiAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJ1xuICApO1xuICByZXR1cm4ge1xuICAgIHdhaXRJZDogc3RhcnRFdmVudC5jb3JyZWxhdGlvbklkLFxuICAgIHJ1bklkOiBzdGFydEV2ZW50LnJ1bklkLFxuICAgIGNyZWF0ZWRBdDogZ2V0RXZlbnRUaW1lc3RhbXAoc3RhcnRFdmVudCkgPz8gc3RhcnRFdmVudC5jcmVhdGVkQXQsXG4gICAgcmVzdW1lQXQ6IHN0YXJ0RXZlbnQuZXZlbnREYXRhPy5yZXN1bWVBdFxuICAgICAgPyBuZXcgRGF0ZShzdGFydEV2ZW50LmV2ZW50RGF0YS5yZXN1bWVBdClcbiAgICAgIDogdW5kZWZpbmVkLFxuICAgIGNvbXBsZXRlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChjb21wbGV0ZWRFdmVudCksXG4gIH07XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgd29ya2Zsb3cgV2FpdCB0byBhbiBPcGVuVGVsZW1ldHJ5IFNwYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhaXRUb1NwYW4oXG4gIGV2ZW50czogRXZlbnRbXSxcbiAgbWF4RW5kVGltZTogRGF0ZSxcbiAgZmFsbGJhY2tFbmRUaW1lID0gbWF4RW5kVGltZVxuKTogU3BhbiB8IG51bGwge1xuICBjb25zdCB3YWl0ID0gd2FpdEV2ZW50c1RvV2FpdEVudGl0eShldmVudHMpO1xuICBpZiAoIXdhaXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBzdGFydFRpbWUgPSB3YWl0LmNyZWF0ZWRBdDtcbiAgY29uc3Qgc3RhcnRNcyA9IHN0YXJ0VGltZS5nZXRUaW1lKCk7XG4gIGxldCBlbmRUaW1lID0gd2FpdC5jb21wbGV0ZWRBdDtcbiAgaWYgKCFlbmRUaW1lKSB7XG4gICAgY29uc3QgZmFsbGJhY2tDYXAgPVxuICAgICAgd2FpdC5yZXN1bWVBdCAmJiB3YWl0LnJlc3VtZUF0LmdldFRpbWUoKSA8IGZhbGxiYWNrRW5kVGltZS5nZXRUaW1lKClcbiAgICAgICAgPyB3YWl0LnJlc3VtZUF0XG4gICAgICAgIDogZmFsbGJhY2tFbmRUaW1lO1xuICAgIGVuZFRpbWUgPVxuICAgICAgbWF4RW5kVGltZS5nZXRUaW1lKCkgPiBzdGFydE1zICYmXG4gICAgICBtYXhFbmRUaW1lLmdldFRpbWUoKSA8IGZhbGxiYWNrQ2FwLmdldFRpbWUoKVxuICAgICAgICA/IG1heEVuZFRpbWVcbiAgICAgICAgOiBmYWxsYmFja0NhcDtcbiAgfVxuICBjb25zdCBzdGFydCA9IGRhdGVUb090ZWxUaW1lKHN0YXJ0VGltZSk7XG4gIGNvbnN0IGVuZCA9IGRhdGVUb090ZWxUaW1lKGVuZFRpbWUpO1xuICBjb25zdCBkdXJhdGlvbiA9IGNhbGN1bGF0ZUR1cmF0aW9uKHN0YXJ0VGltZSwgZW5kVGltZSk7XG4gIGNvbnN0IHNwYW5FdmVudHMgPSBjb252ZXJ0RXZlbnRzVG9TcGFuRXZlbnRzKGV2ZW50cywgZmFsc2UpO1xuICByZXR1cm4ge1xuICAgIHNwYW5JZDogd2FpdC53YWl0SWQsXG4gICAgbmFtZTogJ3NsZWVwJyxcbiAgICBraW5kOiAxLCAvLyBJTlRFUk5BTCBzcGFuIGtpbmRcbiAgICByZXNvdXJjZTogJ3NsZWVwJyxcbiAgICBsaWJyYXJ5OiBXT1JLRkxPV19MSUJSQVJZLFxuICAgIHN0YXR1czogeyBjb2RlOiAwIH0sXG4gICAgdHJhY2VGbGFnczogMSxcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICByZXNvdXJjZTogJ3NsZWVwJyBhcyBjb25zdCxcbiAgICAgIGRhdGE6IHdhaXQsIC8vIHdhaXQgaXMgYSBwbGFpbiBvYmplY3QgYnVpbHQgZnJvbSBldmVudHMsIG5vIG5vbi1jbG9uZWFibGUgdHlwZXNcbiAgICB9LFxuICAgIGxpbmtzOiBbXSxcbiAgICBldmVudHM6IHNwYW5FdmVudHMsXG4gICAgZHVyYXRpb24sXG4gICAgc3RhcnRUaW1lOiBzdGFydCxcbiAgICBlbmRUaW1lOiBlbmQsXG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIEdldFN0ZXBBdHRyaWJ1dGVzID0gKFxuICBldmVudHM6IEV2ZW50W11cbikgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjb25zdCBzdGVwRXZlbnRzVG9TdGVwRW50aXR5ID0gKFxuICBldmVudHM6IEV2ZW50W11cbik6IHtcbiAgc3RlcElkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHN0ZXBOYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogJ3BlbmRpbmcnIHwgJ3J1bm5pbmcnIHwgJ2NvbXBsZXRlZCcgfCAnZmFpbGVkJyB8ICdjYW5jZWxsZWQnO1xuICBhdHRlbXB0OiBudW1iZXI7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgdXBkYXRlZEF0OiBEYXRlO1xuICBzdGFydGVkQXQ/OiBEYXRlO1xuICBjb21wbGV0ZWRBdD86IERhdGU7XG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xufSB8IG51bGwgPT4ge1xuICBjb25zdCBjcmVhdGVkRXZlbnQgPSBldmVudHMuZmluZChcbiAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCdcbiAgKTtcblxuICAvLyBWMSBydW5zIGRvbid0IGVtaXQgc3RlcF9jcmVhdGVkIGV2ZW50cy4gRmFsbCBiYWNrIHRvIHRoZSBlYXJsaWVzdCBldmVudFxuICAvLyBpbiB0aGUgZ3JvdXAgc28gd2UgY2FuIHN0aWxsIGJ1aWxkIGEgc3RlcCBzcGFuLlxuICBjb25zdCBhbmNob3JFdmVudCA9IGNyZWF0ZWRFdmVudCA/PyBldmVudHNbMF07XG4gIGlmICghYW5jaG9yRXZlbnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFdhbGsgZXZlbnRzIHRvIGRlcml2ZSBzdGF0dXMsIGF0dGVtcHQgY291bnQsIGFuZCB0aW1lc3RhbXBzLlxuICAvLyBIYW5kbGVzIGJvdGggc3RlcF9yZXRyeWluZyBhbmQgY29uc2VjdXRpdmUgc3RlcF9zdGFydGVkIGFzIHJldHJ5IHNpZ25hbHMuXG4gIGxldCBzdGF0dXM6ICdwZW5kaW5nJyB8ICdydW5uaW5nJyB8ICdjb21wbGV0ZWQnIHwgJ2ZhaWxlZCcgfCAnY2FuY2VsbGVkJyA9XG4gICAgJ3BlbmRpbmcnO1xuICBsZXQgYXR0ZW1wdCA9IDA7XG4gIGxldCBzdGFydGVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gIGxldCBjb21wbGV0ZWRBdDogRGF0ZSB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB7XG4gICAgc3dpdGNoIChlLmV2ZW50VHlwZSkge1xuICAgICAgY2FzZSAnc3RlcF9zdGFydGVkJzpcbiAgICAgICAgc3RhdHVzID0gJ3J1bm5pbmcnO1xuICAgICAgICBhdHRlbXB0ICs9IDE7XG4gICAgICAgIGlmICghc3RhcnRlZEF0KSBzdGFydGVkQXQgPSBnZXRFdmVudFRpbWVzdGFtcChlKSA/PyBlLmNyZWF0ZWRBdDtcbiAgICAgICAgY29tcGxldGVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RlcF9jb21wbGV0ZWQnOlxuICAgICAgICBzdGF0dXMgPSAnY29tcGxldGVkJztcbiAgICAgICAgY29tcGxldGVkQXQgPSBnZXRFdmVudFRpbWVzdGFtcChlKSA/PyBlLmNyZWF0ZWRBdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdGVwX2ZhaWxlZCc6XG4gICAgICAgIHN0YXR1cyA9ICdmYWlsZWQnO1xuICAgICAgICBjb21wbGV0ZWRBdCA9IGdldEV2ZW50VGltZXN0YW1wKGUpID8/IGUuY3JlYXRlZEF0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N0ZXBfcmV0cnlpbmcnOlxuICAgICAgICBzdGF0dXMgPSAncGVuZGluZyc7XG4gICAgICAgIGNvbXBsZXRlZEF0ID0gdW5kZWZpbmVkO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBFbnN1cmUgYXQgbGVhc3QgYXR0ZW1wdCAxIGlmIHdlIG5ldmVyIHNhdyBzdGVwX3N0YXJ0ZWRcbiAgaWYgKGF0dGVtcHQgPT09IDApIGF0dGVtcHQgPSAxO1xuXG4gIGNvbnN0IGxhc3RFdmVudCA9IGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV07XG5cbiAgcmV0dXJuIHtcbiAgICBzdGVwSWQ6IGFuY2hvckV2ZW50LmNvcnJlbGF0aW9uSWQgPz8gJycsXG4gICAgcnVuSWQ6IGFuY2hvckV2ZW50LnJ1bklkLFxuICAgIHN0ZXBOYW1lOiBjcmVhdGVkRXZlbnQ/LmV2ZW50RGF0YT8uc3RlcE5hbWUgPz8gJycsXG4gICAgc3RhdHVzLFxuICAgIGF0dGVtcHQsXG4gICAgY3JlYXRlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChhbmNob3JFdmVudCkgPz8gYW5jaG9yRXZlbnQuY3JlYXRlZEF0LFxuICAgIHVwZGF0ZWRBdDpcbiAgICAgIGdldEV2ZW50VGltZXN0YW1wKGxhc3RFdmVudCkgPz9cbiAgICAgIGxhc3RFdmVudD8uY3JlYXRlZEF0ID8/XG4gICAgICBhbmNob3JFdmVudC5jcmVhdGVkQXQsXG4gICAgc3RhcnRlZEF0LFxuICAgIGNvbXBsZXRlZEF0LFxuICAgIHNwZWNWZXJzaW9uOiBhbmNob3JFdmVudC5zcGVjVmVyc2lvbixcbiAgfTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgc3RlcCBldmVudHMgdG8gYW4gT3BlblRlbGVtZXRyeSBTcGFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVwVG9TcGFuKFxuICBzdGVwRXZlbnRzOiBFdmVudFtdLFxuICBtYXhFbmRUaW1lOiBEYXRlLFxuICBnZXRTdGVwQXR0cmlidXRlcz86IEdldFN0ZXBBdHRyaWJ1dGVzXG4pOiBTcGFuIHwgbnVsbCB7XG4gIGNvbnN0IHN0ZXAgPSBzdGVwRXZlbnRzVG9TdGVwRW50aXR5KHN0ZXBFdmVudHMpO1xuICBpZiAoIXN0ZXApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBwYXJzZWROYW1lID1cbiAgICBwYXJzZVN0ZXBOYW1lKFN0cmluZyhzdGVwLnN0ZXBOYW1lKSkgPz9cbiAgICBwYXJzZVdvcmtmbG93TmFtZShTdHJpbmcoc3RlcC5zdGVwTmFtZSkpO1xuXG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSB7XG4gICAgcmVzb3VyY2U6ICdzdGVwJyBhcyBjb25zdCxcbiAgICBkYXRhOiB7XG4gICAgICAuLi5nZXRTdGVwQXR0cmlidXRlcz8uKHN0ZXBFdmVudHMpLFxuICAgICAgLy8gQ2Fub25pY2FsIGV2ZW50LWRlcml2ZWQgZmllbGRzIGNhbm5vdCBiZSBvdmVycmlkZGVuIGJ5IGV4dGVuc2lvbnMuXG4gICAgICAuLi5zdGVwLFxuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgcmVzb3VyY2UgPSAnc3RlcCc7XG5cbiAgLy8gSW5jbHVkZSBBTEwgY29ycmVsYXRlZCBldmVudHMgb24gdGhlIHNwYW4gc28gdGhlIHNpZGViYXIgZGV0YWlsIHZpZXdcbiAgLy8gY2FuIGRpc3BsYXkgdGhlbS4gVGhlIHRpbWVsaW5lIHVzZXMgdGhlIGBzaG93VmVydGljYWxMaW5lYCBmbGFnIHRvXG4gIC8vIGRldGVybWluZSB3aGljaCBldmVudHMgYXBwZWFyIGFzIG1hcmtlcnMuXG4gIGNvbnN0IGV2ZW50cyA9IGNvbnZlcnRFdmVudHNUb1NwYW5FdmVudHMoc3RlcEV2ZW50cywgZmFsc2UsIHtcbiAgICBwcmVmZXJPY2N1cnJlZEF0OiB0cnVlLFxuICB9KTtcblxuICAvLyBVc2UgdGhlIGV2ZW50IG9jY3VycmVuY2UgdGltZXN0YW1wIGZvciBzdGVwIHNwYW5zIHdoZW4gaXQgaXMgYXZhaWxhYmxlLFxuICAvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGluZ2VzdCB0aW1lc3RhbXAgdXNlZCBieSBvbGRlciBldmVudCBzdHJlYW1zLlxuICBjb25zdCBzcGFuU3RhcnRFdmVudCA9XG4gICAgc3RlcEV2ZW50cy5maW5kKChldmVudCkgPT4gZXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9jcmVhdGVkJykgPz9cbiAgICBzdGVwRXZlbnRzWzBdO1xuICBjb25zdCBzcGFuU3RhcnRUaW1lID1cbiAgICBnZXRFdmVudFRpbWVzdGFtcChzcGFuU3RhcnRFdmVudCkgPz8gbmV3IERhdGUoc3RlcC5jcmVhdGVkQXQpO1xuICBsZXQgYWN0aXZlU3RhcnRUaW1lID0gc3RlcC5zdGFydGVkQXQgPyBuZXcgRGF0ZShzdGVwLnN0YXJ0ZWRBdCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpcnN0U3RhcnRFdmVudCA9IHN0ZXBFdmVudHMuZmluZChcbiAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfc3RhcnRlZCdcbiAgKTtcbiAgaWYgKGZpcnN0U3RhcnRFdmVudCkge1xuICAgIGFjdGl2ZVN0YXJ0VGltZSA9XG4gICAgICBnZXRFdmVudFRpbWVzdGFtcChmaXJzdFN0YXJ0RXZlbnQpID8/IG5ldyBEYXRlKGZpcnN0U3RhcnRFdmVudC5jcmVhdGVkQXQpO1xuICB9XG5cbiAgbGV0IGVuZFRpbWUgPSBuZXcgRGF0ZShtYXhFbmRUaW1lKTtcbiAgaWYgKHN0ZXAuY29tcGxldGVkQXQpIHtcbiAgICBjb25zdCBjb21wbGV0ZWRFdmVudCA9IHN0ZXBFdmVudHNcbiAgICAgIC5zbGljZSgpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZmluZCgoZXZlbnQpID0+IGlzVGVybWluYWxTdGVwRXZlbnRUeXBlKGV2ZW50LmV2ZW50VHlwZSkpO1xuICAgIGVuZFRpbWUgPSBnZXRFdmVudFRpbWVzdGFtcChjb21wbGV0ZWRFdmVudCkgPz8gbmV3IERhdGUoc3RlcC5jb21wbGV0ZWRBdCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNwYW5JZDogU3RyaW5nKHN0ZXAuc3RlcElkKSxcbiAgICBuYW1lOiBwYXJzZWROYW1lPy5zaG9ydE5hbWUgPz8gU3RyaW5nKHN0ZXAuc3RlcE5hbWUpLFxuICAgIGtpbmQ6IDEsIC8vIElOVEVSTkFMIHNwYW4ga2luZFxuICAgIHJlc291cmNlLFxuICAgIGxpYnJhcnk6IFdPUktGTE9XX0xJQlJBUlksXG4gICAgc3RhdHVzOiB7IGNvZGU6IDAgfSxcbiAgICB0cmFjZUZsYWdzOiAxLFxuICAgIGF0dHJpYnV0ZXMsXG4gICAgbGlua3M6IFtdLFxuICAgIGV2ZW50cyxcbiAgICBzdGFydFRpbWU6IGRhdGVUb090ZWxUaW1lKHNwYW5TdGFydFRpbWUpLFxuICAgIGVuZFRpbWU6IGRhdGVUb090ZWxUaW1lKGVuZFRpbWUpLFxuICAgIGR1cmF0aW9uOiBjYWxjdWxhdGVEdXJhdGlvbihzcGFuU3RhcnRUaW1lLCBlbmRUaW1lKSxcbiAgICAvLyBPbmx5IHNldCBhY3RpdmVTdGFydFRpbWUgaWYgaXQgZGlmZmVycyBmcm9tIHN0YXJ0VGltZSAoaS5lLiwgdGhlcmUgd2FzIGEgcXVldWVkIHBlcmlvZClcbiAgICBhY3RpdmVTdGFydFRpbWU6XG4gICAgICBhY3RpdmVTdGFydFRpbWUgJiYgYWN0aXZlU3RhcnRUaW1lLmdldFRpbWUoKSA+IHNwYW5TdGFydFRpbWUuZ2V0VGltZSgpXG4gICAgICAgID8gZGF0ZVRvT3RlbFRpbWUoYWN0aXZlU3RhcnRUaW1lKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGhvb2tFdmVudHNUb0hvb2tFbnRpdHkgPSAoXG4gIGV2ZW50czogRXZlbnRbXVxuKToge1xuICBob29rSWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgcmVjZWl2ZWRDb3VudDogbnVtYmVyO1xuICBsYXN0UmVjZWl2ZWRBdD86IERhdGU7XG4gIGRpc3Bvc2VkQXQ/OiBEYXRlO1xufSB8IG51bGwgPT4ge1xuICBjb25zdCBjcmVhdGVkRXZlbnQgPSBldmVudHMuZmluZChcbiAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCdcbiAgKTtcbiAgaWYgKCFjcmVhdGVkRXZlbnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCByZWNlaXZlZEV2ZW50cyA9IGV2ZW50cy5maWx0ZXIoXG4gICAgKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJ1xuICApO1xuICBjb25zdCBkaXNwb3NlZEV2ZW50cyA9IGV2ZW50cy5maWx0ZXIoXG4gICAgKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJ1xuICApO1xuICBjb25zdCBsYXN0UmVjZWl2ZWRFdmVudCA9IHJlY2VpdmVkRXZlbnRzLmF0KC0xKTtcbiAgcmV0dXJuIHtcbiAgICBob29rSWQ6IGNyZWF0ZWRFdmVudC5jb3JyZWxhdGlvbklkLFxuICAgIHJ1bklkOiBjcmVhdGVkRXZlbnQucnVuSWQsXG4gICAgdG9rZW46IGNyZWF0ZWRFdmVudC5ldmVudERhdGE/LnRva2VuLFxuICAgIGNyZWF0ZWRBdDogZ2V0RXZlbnRUaW1lc3RhbXAoY3JlYXRlZEV2ZW50KSA/PyBjcmVhdGVkRXZlbnQuY3JlYXRlZEF0LFxuICAgIHJlY2VpdmVkQ291bnQ6IHJlY2VpdmVkRXZlbnRzLmxlbmd0aCxcbiAgICBsYXN0UmVjZWl2ZWRBdDogZ2V0RXZlbnRUaW1lc3RhbXAobGFzdFJlY2VpdmVkRXZlbnQpLFxuICAgIGRpc3Bvc2VkQXQ6IGdldEV2ZW50VGltZXN0YW1wKGRpc3Bvc2VkRXZlbnRzLmF0KC0xKSksXG4gIH07XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgd29ya2Zsb3cgSG9vayB0byBhbiBPcGVuVGVsZW1ldHJ5IFNwYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhvb2tUb1NwYW4oaG9va0V2ZW50czogRXZlbnRbXSwgbWF4RW5kVGltZTogRGF0ZSk6IFNwYW4gfCBudWxsIHtcbiAgY29uc3QgaG9vayA9IGhvb2tFdmVudHNUb0hvb2tFbnRpdHkoaG9va0V2ZW50cyk7XG4gIGlmICghaG9vaykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQ29udmVydCBob29rLXJlbGF0ZWQgZXZlbnRzIHRvIHNwYW4gZXZlbnRzXG4gIGNvbnN0IGV2ZW50cyA9IGNvbnZlcnRFdmVudHNUb1NwYW5FdmVudHMoaG9va0V2ZW50cywgZmFsc2UpO1xuXG4gIGNvbnN0IGVuZFRpbWUgPSBob29rLmRpc3Bvc2VkQXQgfHwgbWF4RW5kVGltZTtcblxuICByZXR1cm4ge1xuICAgIHNwYW5JZDogU3RyaW5nKGhvb2suaG9va0lkKSxcbiAgICBuYW1lOiBob29rLnRva2VuID8/IFN0cmluZyhob29rLmhvb2tJZCksXG4gICAga2luZDogMSwgLy8gSU5URVJOQUwgc3BhbiBraW5kXG4gICAgcmVzb3VyY2U6ICdob29rJyxcbiAgICBsaWJyYXJ5OiBXT1JLRkxPV19MSUJSQVJZLFxuICAgIHN0YXR1czogeyBjb2RlOiAxIH0sXG4gICAgdHJhY2VGbGFnczogMSxcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICByZXNvdXJjZTogJ2hvb2snIGFzIGNvbnN0LFxuICAgICAgZGF0YTogaG9vayxcbiAgICB9LFxuICAgIGxpbmtzOiBbXSxcbiAgICBldmVudHMsXG4gICAgc3RhcnRUaW1lOiBkYXRlVG9PdGVsVGltZShob29rLmNyZWF0ZWRBdCksXG4gICAgZW5kVGltZTogZGF0ZVRvT3RlbFRpbWUoZW5kVGltZSksXG4gICAgZHVyYXRpb246IGNhbGN1bGF0ZUR1cmF0aW9uKGhvb2suY3JlYXRlZEF0LCBlbmRUaW1lKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcm9vdCBzcGFuIGZvciB0aGUgd29ya2Zsb3cgcnVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5Ub1NwYW4oXG4gIHJ1bjogV29ya2Zsb3dSdW4sXG4gIHJ1bkV2ZW50czogRXZlbnRbXSxcbiAgbm93VGltZT86IERhdGVcbik6IFNwYW4ge1xuICBjb25zdCBub3cgPSBub3dUaW1lID8/IG5ldyBEYXRlKCk7XG5cbiAgLy8gUHJlZmVyIHRoZSBldmVudCBvY2N1cnJlbmNlIHRpbWVzdGFtcCB3aGVuIGF2YWlsYWJsZSBzbyB0aGUgcm9vdCBzcGFuXG4gIC8vIGxpbmVzIHVwIHdpdGggY2hpbGQgc3BhbnMgdGhhdCBhbHJlYWR5IHVzZSBldmVudCBvY2N1cnJlbmNlIHRpbWUuXG4gIGNvbnN0IHJ1bkNyZWF0ZWRFdmVudCA9IHJ1bkV2ZW50cy5maW5kKFxuICAgIChldmVudCkgPT4gZXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnXG4gICk7XG4gIGNvbnN0IHJ1blN0YXJ0ZWRFdmVudCA9IHJ1bkV2ZW50cy5maW5kKFxuICAgIChldmVudCkgPT4gZXZlbnQuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnXG4gICk7XG4gIGNvbnN0IHRlcm1pbmFsRXZlbnQgPSBydW5FdmVudHNcbiAgICAuc2xpY2UoKVxuICAgIC5yZXZlcnNlKClcbiAgICAuZmluZChcbiAgICAgIChldmVudCkgPT5cbiAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2ZhaWxlZCcgfHxcbiAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCdcbiAgICApO1xuICBjb25zdCBzcGFuU3RhcnRUaW1lID1cbiAgICBnZXRFdmVudFRpbWVzdGFtcChydW5DcmVhdGVkRXZlbnQpID8/IG5ldyBEYXRlKHJ1bi5jcmVhdGVkQXQpO1xuICBjb25zdCBhY3RpdmVTdGFydFRpbWUgPVxuICAgIGdldEV2ZW50VGltZXN0YW1wKHJ1blN0YXJ0ZWRFdmVudCkgPz9cbiAgICAocnVuLnN0YXJ0ZWRBdCA/IG5ldyBEYXRlKHJ1bi5zdGFydGVkQXQpIDogdW5kZWZpbmVkKTtcbiAgY29uc3QgY29tcGxldGVkQXQgPVxuICAgIGdldEV2ZW50VGltZXN0YW1wKHRlcm1pbmFsRXZlbnQpID8/IHJ1bi5jb21wbGV0ZWRBdCA/PyB1bmRlZmluZWQ7XG4gIGNvbnN0IGVuZFRpbWUgPSBjb21wbGV0ZWRBdCA/PyBub3c7XG5cbiAgLy8gT25seSBlbWJlZCBpZGVudGlmaWNhdGlvbiBmaWVsZHMsIG5vdCB0aGUgZnVsbCBvYmplY3Qgd2l0aFxuICAvLyBpbnB1dC9vdXRwdXQvZXJyb3Igd2hpY2ggbWF5IGNvbnRhaW4gbm9uLWNsb25lYWJsZSB0eXBlcy4gTGlmZWN5Y2xlXG4gIC8vIHRpbWVzdGFtcHMgYXJlIGV2ZW50LWRlcml2ZWQgc28gZGV0YWlsIHJvd3MgYWxpZ24gd2l0aCB0aGUgc3BhbiB0aW1lbGluZS5cbiAgY29uc3QgeyBpbnB1dDogX2ksIG91dHB1dDogX28sIGVycm9yOiBfZSwgLi4ucnVuSWRlbnRpdHkgfSA9IHJ1bjtcbiAgY29uc3QgYXR0cmlidXRlcyA9IHtcbiAgICByZXNvdXJjZTogJ3J1bicgYXMgY29uc3QsXG4gICAgZGF0YToge1xuICAgICAgLi4ucnVuSWRlbnRpdHksXG4gICAgICBjcmVhdGVkQXQ6IHNwYW5TdGFydFRpbWUsXG4gICAgICBzdGFydGVkQXQ6IGFjdGl2ZVN0YXJ0VGltZSxcbiAgICAgIGNvbXBsZXRlZEF0LFxuICAgIH0sXG4gIH07XG5cbiAgLy8gQ29udmVydCBydW4tbGV2ZWwgZXZlbnRzIHRvIHNwYW4gZXZlbnRzXG4gIGNvbnN0IGV2ZW50cyA9IGNvbnZlcnRFdmVudHNUb1NwYW5FdmVudHMocnVuRXZlbnRzLCBmYWxzZSwge1xuICAgIHByZWZlck9jY3VycmVkQXQ6IHRydWUsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgc3BhbklkOiBTdHJpbmcocnVuLnJ1bklkKSxcbiAgICBuYW1lOiBTdHJpbmcocGFyc2VXb3JrZmxvd05hbWUocnVuLndvcmtmbG93TmFtZSk/LnNob3J0TmFtZSA/PyAnPycpLFxuICAgIGtpbmQ6IDEsIC8vIElOVEVSTkFMIHNwYW4ga2luZFxuICAgIHJlc291cmNlOiAncnVuJyxcbiAgICBsaWJyYXJ5OiBXT1JLRkxPV19MSUJSQVJZLFxuICAgIHN0YXR1czogeyBjb2RlOiAwIH0sXG4gICAgdHJhY2VGbGFnczogMSxcbiAgICBhdHRyaWJ1dGVzLFxuICAgIGxpbmtzOiBbXSxcbiAgICBldmVudHMsXG4gICAgc3RhcnRUaW1lOiBkYXRlVG9PdGVsVGltZShzcGFuU3RhcnRUaW1lKSxcbiAgICBlbmRUaW1lOiBkYXRlVG9PdGVsVGltZShlbmRUaW1lKSxcbiAgICBkdXJhdGlvbjogY2FsY3VsYXRlRHVyYXRpb24oc3BhblN0YXJ0VGltZSwgZW5kVGltZSksXG4gICAgLy8gT25seSBzZXQgYWN0aXZlU3RhcnRUaW1lIGlmIGl0IGRpZmZlcnMgZnJvbSBzdGFydFRpbWUgKGkuZS4sIHRoZXJlIHdhcyBhIHF1ZXVlZCBwZXJpb2QpXG4gICAgYWN0aXZlU3RhcnRUaW1lOlxuICAgICAgYWN0aXZlU3RhcnRUaW1lICYmIGFjdGl2ZVN0YXJ0VGltZS5nZXRUaW1lKCkgPiBzcGFuU3RhcnRUaW1lLmdldFRpbWUoKVxuICAgICAgICA/IGRhdGVUb090ZWxUaW1lKGFjdGl2ZVN0YXJ0VGltZSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gIH07XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"duplicate-events.d.ts","sourceRoot":"","sources":["../../src/lib/duplicate-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,KAAK,EAGX,MAAM,iBAAiB,CAAC;AA2CzB;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,uIACkG,CAAC;AAsGvI;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,EAAE,iBAAiB,EAAE,EAAE;IAAE,iBAAiB,EAAE,OAAO,CAAA;CAAE,GACpD,GAAG,CAAC,MAAM,CAAC,CAYb"}
1
+ {"version":3,"file":"duplicate-events.d.ts","sourceRoot":"","sources":["../../src/lib/duplicate-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,KAAK,EAGX,MAAM,iBAAiB,CAAC;AA2BzB;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,uIACkG,CAAC;AAyGvI;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,EAAE,iBAAiB,EAAE,EAAE;IAAE,iBAAiB,EAAE,OAAO,CAAA;CAAE,GACpD,GAAG,CAAC,MAAM,CAAC,CAYb"}
@@ -1,16 +1,16 @@
1
- import { entityEventClass, isSlotEventId, } from '@workflow/world';
1
+ import { classifyEntityEvent, isSlotEventId, TERMINAL_EVENT_CLASSES, } from '@workflow/world';
2
2
  /**
3
3
  * Identifies events a replay reads past.
4
4
  *
5
5
  * Concurrent replays of one run write to a shared log, so a replay working
6
6
  * from a stale prefix can commit a second `step_created` / `step_started` /
7
- * `wait_created` for an entity the log already records one of. Every replay
8
- * reads the first event of that class at the same position, so a later one
9
- * cannot change what the workflow observes.
7
+ * `wait_created` / `attr_set` for an entity the log already records one of.
8
+ * Every replay reads the first event of that class at the same position, so a
9
+ * later one cannot change what the workflow observes.
10
10
  *
11
- * The classification mirrors `entityEventClass` in `@workflow/world`, which is
12
- * what the runtime keys its own duplicate detection on. What it cannot mirror
13
- * is consumer state: the runtime passes over an event only after every
11
+ * The classification comes from `classifyEntityEvent` in `@workflow/world`,
12
+ * the same function the runtime keys its own duplicate detection on. What it
13
+ * cannot share is consumer state: the runtime passes over an event only after every
14
14
  * registered callback has declined it, and a callback registered for a
15
15
  * still-open entity legitimately claims a repeat (each retry of a step writes
16
16
  * another `step_started`, and a live step consumer absorbs a second
@@ -18,24 +18,10 @@ import { entityEventClass, isSlotEventId, } from '@workflow/world';
18
18
  * same entity sits earlier in the log, which is the point past which no
19
19
  * consumer remains.
20
20
  */
21
- /**
22
- * Classes whose event closes its entity: no consumer is left for it after.
23
- *
24
- * The run's own terminal events are absent because `entityEventClass` gives
25
- * them no class. The runtime exits rather than replaying the body once the log
26
- * holds one, so nothing ever consumes them and nothing can repeat them.
27
- */
28
- const TERMINAL_EVENT_CLASSES = new Set([
29
- 'step_terminal',
30
- 'wait_completed',
31
- 'hook_disposed',
32
- ]);
33
21
  /** Classes with no entity to close first: the log records one per run. */
34
22
  const SINGLETON_EVENT_CLASSES = new Set([
35
23
  'run_started',
36
24
  ]);
37
- /** Entity key for events that carry no correlation ID (the run itself). */
38
- const RUN_ENTITY_KEY = '';
39
25
  /**
40
26
  * Shown against an event this module reports. Deliberately says what the log
41
27
  * shows rather than what the runtime did with it: tolerating these repeats is
@@ -107,10 +93,13 @@ function foldDuplicates(ordered) {
107
93
  const seenClasses = new Set();
108
94
  const closedEntities = new Set();
109
95
  for (const event of ordered) {
110
- const eventClass = entityEventClass(event.eventType);
111
- if (eventClass === undefined)
96
+ // Shared with the runtime's own duplicate detection, deliberately: an
97
+ // event it tracks under no class is one it never reads past, so naming it
98
+ // here would grey out an event the run acted on.
99
+ const classification = classifyEntityEvent(event);
100
+ if (classification === undefined)
112
101
  continue;
113
- const entity = event.correlationId ?? RUN_ENTITY_KEY;
102
+ const { eventClass, entity } = classification;
114
103
  const classKey = `${eventClass}:${entity}`;
115
104
  const repeatsClass = seenClasses.has(classKey);
116
105
  const entityWasClosed = closedEntities.has(entity);
@@ -163,4 +152,4 @@ export function findDuplicateEventIds(events, { isCompleteHistory }) {
163
152
  return new Set();
164
153
  return foldDuplicates(ordered);
165
154
  }
166
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVwbGljYXRlLWV2ZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvZHVwbGljYXRlLWV2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsZ0JBQWdCLEVBQ2hCLGFBQWEsR0FDZCxNQUFNLGlCQUFpQixDQUFDO0FBRXpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLHNCQUFzQixHQUFrQyxJQUFJLEdBQUcsQ0FBQztJQUNwRSxlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGVBQWU7Q0FDaEIsQ0FBQyxDQUFDO0FBRUgsMEVBQTBFO0FBQzFFLE1BQU0sdUJBQXVCLEdBQWtDLElBQUksR0FBRyxDQUFDO0lBQ3JFLGFBQWE7Q0FDZCxDQUFDLENBQUM7QUFFSCwyRUFBMkU7QUFDM0UsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBRTFCOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQ2xDLG9JQUFvSSxDQUFDO0FBRXZJOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsY0FBYyxDQUFDLENBQVEsRUFBRSxDQUFRO0lBQ3hDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQzdDLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVELFNBQVMsV0FBVyxD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TUFBTSxVQUFVLHFCQUFxQixDQUNuQyxNQUF3QixFQUN4QixFQUFFLGlCQUFpQixFQUFrQztJQUVyRCxJQUFJLENBQUMsaUJBQWlCLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTlELDJFQUEyRTtJQUMzRSxzRUFBc0U7SUFDdEUsTUFBTSxPQUFPLEdBQUcsTUFBTTtTQUNuQixNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRXhCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7UUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLENBQUM7SUFFcEQsT0FBTyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHR5cGUgRW50aXR5RXZlbnRDbGFzcyxcbiAgdHlwZSBFdmVudCxcbiAgZW50aXR5RXZlbnRDbGFzcyxcbiAgaXNTbG90RXZlbnRJZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuLyoqXG4gKiBJZGVudGlmaWVzIGV2ZW50cyBhIHJlcGxheSByZWFkcyBwYXN0LlxuICpcbiAqIENvbmN1cnJlbnQgcmVwbGF5cyBvZiBvbmUgcnVuIHdyaXRlIHRvIGEgc2hhcmVkIGxvZywgc28gYSByZXBsYXkgd29ya2luZ1xuICogZnJvbSBhIHN0YWxlIHByZWZpeCBjYW4gY29tbWl0IGEgc2Vjb25kIGBzdGVwX2NyZWF0ZWRgIC8gYHN0ZXBfc3RhcnRlZGAgL1xuICogYHdhaXRfY3JlYXRlZGAgZm9yIGFuIGVudGl0eSB0aGUgbG9nIGFscmVhZHkgcmVjb3JkcyBvbmUgb2YuIEV2ZXJ5IHJlcGxheVxuICogcmVhZHMgdGhlIGZpcnN0IGV2ZW50IG9mIHRoYXQgY2xhc3MgYXQgdGhlIHNhbWUgcG9zaXRpb24sIHNvIGEgbGF0ZXIgb25lXG4gKiBjYW5ub3QgY2hhbmdlIHdoYXQgdGhlIHdvcmtmbG93IG9ic2VydmVzLlxuICpcbiAqIFRoZSBjbGFzc2lmaWNhdGlvbiBtaXJyb3JzIGBlbnRpdHlFdmVudENsYXNzYCBpbiBgQHdvcmtmbG93L3dvcmxkYCwgd2hpY2ggaXNcbiAqIHdoYXQgdGhlIHJ1bnRpbWUga2V5cyBpdHMgb3duIGR1cGxpY2F0ZSBkZXRlY3Rpb24gb24uIFdoYXQgaXQgY2Fubm90IG1pcnJvclxuICogaXMgY29uc3VtZXIgc3RhdGU6IHRoZSBydW50aW1lIHBhc3NlcyBvdmVyIGFuIGV2ZW50IG9ubHkgYWZ0ZXIgZXZlcnlcbiAqIHJlZ2lzdGVyZWQgY2FsbGJhY2sgaGFzIGRlY2xpbmVkIGl0LCBhbmQgYSBjYWxsYmFjayByZWdpc3RlcmVkIGZvciBhXG4gKiBzdGlsbC1vcGVuIGVudGl0eSBsZWdpdGltYXRlbHkgY2xhaW1zIGEgcmVwZWF0IChlYWNoIHJldHJ5IG9mIGEgc3RlcCB3cml0ZXNcbiAqIGFub3RoZXIgYHN0ZXBfc3RhcnRlZGAsIGFuZCBhIGxpdmUgc3RlcCBjb25zdW1lciBhYnNvcmJzIGEgc2Vjb25kXG4gKiBgc3RlcF9jcmVhdGVkYCkuIFNvIGEgcmVwZWF0IGNvdW50cyBoZXJlIG9ubHkgb25jZSBhIHRlcm1pbmFsIGV2ZW50IGZvciB0aGVcbiAqIHNhbWUgZW50aXR5IHNpdHMgZWFybGllciBpbiB0aGUgbG9nLCB3aGljaCBpcyB0aGUgcG9pbnQgcGFzdCB3aGljaCBub1xuICogY29uc3VtZXIgcmVtYWlucy5cbiAqL1xuXG4vKipcbiAqIENsYXNzZXMgd2hvc2UgZXZlbnQgY2xvc2VzIGl0cyBlbnRpdHk6IG5vIGNvbnN1bWVyIGlzIGxlZnQgZm9yIGl0IGFmdGVyLlxuICpcbiAqIFRoZSBydW4ncyBvd24gdGVybWluYWwgZXZlbnRzIGFyZSBhYnNlbnQgYmVjYXVzZSBgZW50aXR5RXZlbnRDbGFzc2AgZ2l2ZXNcbiAqIHRoZW0gbm8gY2xhc3MuIFRoZSBydW50aW1lIGV4aXRzIHJhdGhlciB0aGFuIHJlcGxheWluZyB0aGUgYm9keSBvbmNlIHRoZSBsb2dcbiAqIGhvbGRzIG9uZSwgc28gbm90aGluZyBldmVyIGNvbnN1bWVzIHRoZW0gYW5kIG5vdGhpbmcgY2FuIHJlcGVhdCB0aGVtLlxuICovXG5jb25zdCBURVJNSU5BTF9FVkVOVF9DTEFTU0VTOiBSZWFkb25seVNldDxFbnRpdHlFdmVudENsYXNzPiA9IG5ldyBTZXQoW1xuICAnc3RlcF90ZXJtaW5hbCcsXG4gICd3YWl0X2NvbXBsZXRlZCcsXG4gICdob29rX2Rpc3Bvc2VkJyxcbl0pO1xuXG4vKiogQ2xhc3NlcyB3aXRoIG5vIGVudGl0eSB0byBjbG9zZSBmaXJzdDogdGhlIGxvZyByZWNvcmRzIG9uZSBwZXIgcnVuLiAqL1xuY29uc3QgU0lOR0xFVE9OX0VWRU5UX0NMQVNTRVM6IFJlYWRvbmx5U2V0PEVudGl0eUV2ZW50Q2xhc3M+ID0gbmV3IFNldChbXG4gICdydW5fc3RhcnRlZCcsXG5dKTtcblxuLyoqIEVudGl0eSBrZXkgZm9yIGV2ZW50cyB0aGF0IGNhcnJ5IG5vIGNvcnJlbGF0aW9uIElEICh0aGUgcnVuIGl0c2VsZikuICovXG5jb25zdCBSVU5fRU5USVRZX0tFWSA9ICcnO1xuXG4vKipcbiAqIFNob3duIGFnYWluc3QgYW4gZXZlbnQgdGhpcyBtb2R1bGUgcmVwb3J0cy4gRGVsaWJlcmF0ZWx5IHNheXMgd2hhdCB0aGUgbG9nXG4gKiBzaG93cyByYXRoZXIgdGhhbiB3aGF0IHRoZSBydW50aW1lIGRpZCB3aXRoIGl0OiB0b2xlcmF0aW5nIHRoZXNlIHJlcGVhdHMgaXNcbiAqIHJlY2VudCwgYW5kIG9uIGEgcnVuIHJlY29yZGVkIGJlZm9yZSBpdCBhIHJlcGVhdCBubyBjb25zdW1lciBjbGFpbWVkIGZhaWxlZFxuICogdGhlIHJlcGxheSBpbnN0ZWFkIG9mIGJlaW5nIHBhc3NlZCBvdmVyLlxuICovXG5leHBvcnQgY29uc3QgRFVQTElDQVRFX0VWRU5UX01FU1NBR0UgPVxuICAnV3JpdHRlbiBieSBhIGNvbmN1cnJlbnQgcmVwbGF5IGFmdGVyIGFuIGV2ZW50IG9mIHRoZSBzYW1lIGtpbmQgd2FzIGFscmVhZHkgcmVjb3JkZWQgYW5kIGFjdGVkIG9uLiBUaGUgcnVuIGZvbGxvd3MgdGhlIGVhcmxpZXIgb25lLic7XG5cbi8qKlxuICogQ2FuZGlkYXRlIGxvZyBvcmRlciwgYnkgZXZlbnQgSUQuXG4gKlxuICogRXZlbnQgSURzIGFyZSBmaXhlZC13aWR0aCBhbmQgbW9ub3RvbmljIHdpdGhpbiBhIHJ1biB1bmRlciBib3RoIHRoZSBVTElEIGFuZFxuICogdGhlIHNsb3Qgc2NoZW1lLiBMZW5ndGggaXMgY29tcGFyZWQgZmlyc3Qgc28gYSBzaG9ydGVyIElEIG5ldmVyIHNvcnRzIGFmdGVyXG4gKiBhIGxvbmdlciBvbmUgb24gYSBsb2cgdGhhdCBtaXhlcyB3aWR0aHMuXG4gKlxuICogV2hldGhlciB0aGlzICppcyogdGhlIGxvZyBvcmRlciBkZXBlbmRzIG9uIHRoZSBJRCBzY2hlbWUsIHdoaWNoIGlzIHdoeVxuICoge0BsaW5rIGhhc0tub3dhYmxlTG9nT3JkZXJ9IGdhdGVzIHRoZSBmb2xkLiBTZWUgaXRzIGRvYy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUV2ZW50SWQoYTogRXZlbnQsIGI6IEV2ZW50KTogbnVtYmVyIHtcbiAgaWYgKGEuZXZlbnRJZC5sZW5ndGggIT09IGIuZXZlbnRJZC5sZW5ndGgpIHtcbiAgICByZXR1cm4gYS5ldmVudElkLmxlbmd0aCAtIGIuZXZlbnRJZC5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIGEuZXZlbnRJZCA8IGIuZXZlbnRJZCA/IC0xIDogYS5ldmVudElkID4gYi5ldmVudElkID8gMSA6IDA7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZWRBdE1zKGV2ZW50OiBFdmVudCk6IG51bWJlciB7XG4gIGNvbnN0IGNyZWF0ZWRBdCA9IGV2ZW50LmNyZWF0ZWRBdDtcbiAgcmV0dXJuIGNyZWF0ZWRBdCBpbnN0YW5jZW9mIERhdGVcbiAgICA/IGNyZWF0ZWRBdC5nZXRUaW1lKClcbiAgICA6IG5ldyBEYXRlKGNyZWF0ZWRBdCBhcyB1bmtub3duIGFzIHN0cmluZykuZ2V0VGltZSgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIG9yZGVyIHRoZSBydW4gY29uc3VtZWQgaXRzIGxvZyBpbiBjYW4gYmUgcmVjb3ZlcmVkIGZyb20gdGhlXG4gKiBldmVudHMgYWxvbmUuXG4gKlxuICogV2hpY2ggb2NjdXJyZW5jZSBvZiBhIGNsYXNzIGNhbWUgZmlyc3QgaXMgdGhlIHdob2xlIHF1ZXN0aW9uIGhlcmUsIHNvIHRoZVxuICogZm9sZCBuZWVkcyB0aGUgbG9nJ3Mgb3JkZXIsIG5vdCBhbiBvcmRlci4gVGhlIGJhY2tlbmRzIGRvIG5vdCBhZ3JlZSBvbiBob3dcbiAqIHRvIHJlY292ZXIgaXQgZm9yIGV2ZXJ5IElEIHNjaGVtZTpcbiAqXG4gKiAtIEEgKipzbG90LW51bWJlcmVkKiogcnVuIGNhcnJpZXMgaXRzIHBvc2l0aW9uIGluIHRoZSBJRC4gVGhlIHNsb3QgaXMgZHJhd25cbiAqICAgYXQgdGhlIHB1Ymxpc2gsIHdoaWNoIGlzIHRoZSBsaW5lYXJpemF0aW9uIHBvaW50LCBzbyBzbG90IG9yZGVyIGlzIGxvZ1xuICogICBvcmRlciBldmVyeXdoZXJlIGFuZCB0aGUgSUQgYWxvbmUgc2V0dGxlcyBpdC5cbiAqIC0gQSAqKlVMSUQtbnVtYmVyZWQqKiBydW4gZG9lcyBub3QuIE9uZSBiYWNrZW5kIHJldHVybnMgc3VjaCBhIGxvZyBpblxuICogICBgKGNyZWF0ZWRBdCwgZXZlbnRJZClgIG9yZGVyIHdoaWxlIGFub3RoZXIgcmV0dXJucyBpdCBrZXllZCBvbiB0aGUgSUQsIGFuZFxuICogICBgY3JlYXRlZEF0YCBpcyBzdGFtcGVkIHdoZW4gdGhlIHdyaXRlIHJlcXVlc3QgYXJyaXZlcyByYXRoZXIgdGhhbiB3aGVuIGl0XG4gKiAgIGNvbW1pdHMuIENvbmN1cnJlbnQgd3JpdGVycyBjYW4gdGhlcmVmb3JlIHByb2R1Y2Ugb3Bwb3NpdGUgdGltZXN0YW1wIGFuZFxuICogICBJRCBvcmRlcnMsIGFuZCB0aGUgcnVuIGNvbnN1bWVkIHdoaWNoZXZlciBpdHMgb3duIGJhY2tlbmQgc2VydmVkLlxuICpcbiAqIFNvIGEgVUxJRCBsb2cgaXMgb25seSBrbm93YWJsZSB3aGVyZSB0aGUgdHdvIG9yZGVycyBhZ3JlZS4gV2hlcmUgdGhleVxuICogY29udHJhZGljdCwgdGhlIGZvbGQgY291bGQgbmFtZSB0aGUgc3Vydml2aW5nIGV2ZW50IGFuZCBwYXNzIG92ZXIgdGhlIG9uZVxuICogdGhlIHJ1biBhY3RlZCBvbiwgd2hpY2ggaXMgd29yc2UgdGhhbiBzYXlpbmcgbm90aGluZy5cbiAqL1xuZnVuY3Rpb24gaGFzS25vd2FibGVMb2dPcmRlcihvcmRlcmVkQnlJZDogcmVhZG9ubHkgRXZlbnRbXSk6IGJvb2xlYW4ge1xuICBpZiAob3JkZXJlZEJ5SWQuZXZlcnkoKGV2ZW50KSA9PiBpc1Nsb3RFdmVudElkKGV2ZW50LmV2ZW50SWQpKSkgcmV0dXJuIHRydWU7XG5cbiAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IG9yZGVyZWRCeUlkLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHByZXZpb3VzID0gY3JlYXRlZEF0TXMob3JkZXJlZEJ5SWRbaW5kZXggLSAxXSk7XG4gICAgY29uc3QgY3VycmVudCA9IGNyZWF0ZWRBdE1zKG9yZGVyZWRCeUlkW2luZGV4XSk7XG4gICAgLy8gQSBtaXNzaW5nIG9yIHVucGFyc2VhYmxlIHRpbWVzdGFtcCBsZWF2ZXMgbm90aGluZyB0byBjb3Jyb2JvcmF0ZSB0aGUgSURcbiAgICAvLyBvcmRlciB3aXRoLCB3aGljaCBpcyB0aGUgc2FtZSBwb3NpdGlvbiBhcyBhIGNvbnRyYWRpY3Rpb24uXG4gICAgaWYgKE51bWJlci5pc05hTihwcmV2aW91cykgfHwgTnVtYmVyLmlzTmFOKGN1cnJlbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnQgPCBwcmV2aW91cykgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBUaGUgZm9sZCBpdHNlbGYsIG92ZXIgYSBsb2cgd2hvc2Ugb3JkZXIgaXMga25vd24uICovXG5mdW5jdGlvbiBmb2xkRHVwbGljYXRlcyhvcmRlcmVkOiByZWFkb25seSBFdmVudFtdKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBkdXBsaWNhdGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHNlZW5DbGFzc2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGNsb3NlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBldmVudCBvZiBvcmRlcmVkKSB7XG4gICAgY29uc3QgZXZlbnRDbGFzcyA9IGVudGl0eUV2ZW50Q2xhc3MoZXZlbnQuZXZlbnRUeXBlKTtcbiAgICBpZiAoZXZlbnRDbGFzcyA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGVudGl0eSA9IGV2ZW50LmNvcnJlbGF0aW9uSWQgPz8gUlVOX0VOVElUWV9LRVk7XG4gICAgY29uc3QgY2xhc3NLZXkgPSBgJHtldmVudENsYXNzfToke2VudGl0eX1gO1xuICAgIGNvbnN0IHJlcGVhdHNDbGFzcyA9IHNlZW5DbGFzc2VzLmhhcyhjbGFzc0tleSk7XG4gICAgY29uc3QgZW50aXR5V2FzQ2xvc2VkID0gY2xvc2VkRW50aXRpZXMuaGFzKGVudGl0eSk7XG5cbiAgICBpZiAoVEVSTUlOQUxfRVZFTlRfQ0xBU1NFUy5oYXMoZXZlbnRDbGFzcykpIHtcbiAgICAgIGNsb3NlZEVudGl0aWVzLmFkZChlbnRpdHkpO1xuICAgIH1cblxuICAgIGlmICghcmVwZWF0c0NsYXNzKSB7XG4gICAgICAvLyBGaXJzdCBvZiBpdHMgY2xhc3MsIGJ1dCB0aGUgZW50aXR5IGFscmVhZHkgZmluaXNoZWQ6IG5vIGNvbnN1bWVyIGlzXG4gICAgICAvLyBsZWZ0IHRvIHRha2UgaXQgYW5kIGl0IHJlcGVhdHMgbm90aGluZywgc28gdGhlIHJ1bnRpbWUgcmVwb3J0c1xuICAgICAgLy8gZGl2ZXJnZW5jZSBoZXJlIGFuZCBleGl0cy4gRXZlcnl0aGluZyBwYXN0IHRoaXMgcG9pbnQgd2VudCB1bnJlYWQsIHNvXG4gICAgICAvLyB0aGUgZm9sZCBzdG9wcyB3aXRoIGl0IHJhdGhlciB0aGFuIHJlY29yZGluZyB0aGUgY2xhc3MgYW5kIHByZXNlbnRpbmdcbiAgICAgIC8vIGEgbGF0ZXIgZXZlbnQgb2YgaXQgYXMgYSByZXBlYXQgdGhlIHJ1biBwYXNzZWQgb3Zlci5cbiAgICAgIGlmIChlbnRpdHlXYXNDbG9zZWQpIGJyZWFrO1xuICAgICAgc2VlbkNsYXNzZXMuYWRkKGNsYXNzS2V5KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIFRoZSBlbnRpdHkgaXMgc3RpbGwgb3Blbiwgc28gYSBjb25zdW1lciBpcyByZWdpc3RlcmVkIGZvciBpdCBhbmQgdGFrZXNcbiAgICAvLyB0aGlzIGV2ZW50OiBhbm90aGVyIGF0dGVtcHQsIG5vdCBhIHJlcGVhdCByZWFkIHBhc3QuXG4gICAgaWYgKGVudGl0eVdhc0Nsb3NlZCB8fCBTSU5HTEVUT05fRVZFTlRfQ0xBU1NFUy5oYXMoZXZlbnRDbGFzcykpIHtcbiAgICAgIGR1cGxpY2F0ZXMuYWRkKGV2ZW50LmV2ZW50SWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkdXBsaWNhdGVzO1xufVxuXG4vKipcbiAqIFRoZSBJRHMgb2YgdGhlIGV2ZW50cyBpbiBgZXZlbnRzYCB0aGF0IHJlcGVhdCBhIGNsYXNzIHRoZSBsb2cgYWxyZWFkeVxuICogcmVjb3JkcyBmb3IgdGhlIHNhbWUgZW50aXR5LCBhZnRlciB0aGF0IGVudGl0eSBmaW5pc2hlZC5cbiAqXG4gKiBgaXNDb21wbGV0ZUhpc3RvcnlgIG11c3QgYmUgZmFsc2Ugd2hlbmV2ZXIgdGhlIGNhbGxlciBob2xkcyBhIHN1YnNldCBvZiB0aGVcbiAqIHJ1bidzIGxvZzogb25lIHBhZ2Ugb2YgYSBwYWdpbmF0ZWQgbGlzdCwgb3IgdGhlIHJlc3VsdCBvZiBhIHNlYXJjaC4gV2hpY2hcbiAqIG9jY3VycmVuY2Ugb2YgYSBjbGFzcyBjYW1lIGZpcnN0IGlzIGEgcHJvcGVydHkgb2YgdGhlIHdob2xlIGxvZywgc28gb24gYVxuICogc3Vic2V0IHRoZSBlYXJsaWVyIGV2ZW50IG1heSBiZSBtaXNzaW5nLCBhbmQgdGhlIGZvbGQgd291bGQgcmVwb3J0XG4gKiB0aGUgc3Vydml2aW5nIG9uZS4gTm90aGluZyBpcyBjbGFzc2lmaWVkIGluIHRoYXQgY2FzZS5cbiAqXG4gKiBUd28gb3RoZXIgdGhpbmdzIG1ha2UgdGhlIGFuc3dlciB1bmtub3dhYmxlIGFuZCB5aWVsZCB0aGUgc2FtZSBlbXB0eSByZXN1bHQ6XG4gKiBhIGxvZyB3aG9zZSBvcmRlciBjYW5ub3QgYmUgcmVjb3ZlcmVkIGZyb20gdGhlIGV2ZW50cyAoc2VlXG4gKiB7QGxpbmsgaGFzS25vd2FibGVMb2dPcmRlcn0pLCBhbmQgZXZlcnl0aGluZyBwYXN0IHRoZSBwb2ludCB0aGUgcnVuXG4gKiBkaXZlcmdlZCwgc2luY2UgdGhlIHJ1biBleGl0ZWQgdGhlcmUgYW5kIHJlYWQgbm8gZnVydGhlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmREdXBsaWNhdGVFdmVudElkcyhcbiAgZXZlbnRzOiByZWFkb25seSBFdmVudFtdLFxuICB7IGlzQ29tcGxldGVIaXN0b3J5IH06IHsgaXNDb21wbGV0ZUhpc3Rvcnk6IGJvb2xlYW4gfVxuKTogU2V0PHN0cmluZz4ge1xuICBpZiAoIWlzQ29tcGxldGVIaXN0b3J5IHx8IGV2ZW50cy5sZW5ndGggPCAyKSByZXR1cm4gbmV3IFNldCgpO1xuXG4gIC8vIERyb3BwZWQgYmVmb3JlIHRoZSBzb3J0LCBub3QgZHVyaW5nIHRoZSBmb2xkOiBhbiBldmVudCB3aXRoIG5vIElEIGhhcyBub1xuICAvLyBsb2cgcG9zaXRpb24gdG8gb3JkZXIgb24sIGFuZCB0aGUgY2FsbGVyIGNvdWxkIG5vdCBtYXRjaCBpdCBlaXRoZXIuXG4gIGNvbnN0IG9yZGVyZWQgPSBldmVudHNcbiAgICAuZmlsdGVyKChldmVudCkgPT4gQm9vbGVhbihldmVudC5ldmVudElkKSlcbiAgICAuc29ydChjb21wYXJlRXZlbnRJZCk7XG5cbiAgaWYgKCFoYXNLbm93YWJsZUxvZ09yZGVyKG9yZGVyZWQpKSByZXR1cm4gbmV3IFNldCgpO1xuXG4gIHJldHVybiBmb2xkRHVwbGljYXRlcyhvcmRlcmVkKTtcbn1cbiJdfQ==
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVwbGljYXRlLWV2ZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvZHVwbGljYXRlLWV2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsbUJBQW1CLEVBR25CLGFBQWEsRUFDYixzQkFBc0IsR0FDdkIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsMEVBQTBFO0FBQzFFLE1BQU0sdUJBQXVCLEdBQWtDLElBQUksR0FBRyxDQUFDO0lBQ3JFLGFBQWE7Q0FDZCxDQUFDLENBQUM7QUFFSDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUNsQyxvSUFBb0ksQ0FBQztBQUV2STs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLGNBQWMsQ0FBQyxDQUFRLEVBQUUsQ0FBUTtJQUN4QyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUM3QyxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFZO0lBQy9CLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFDbEMsT0FBTyxTQUFTLFlBQVksSUFBSTtRQUM5QixDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRTtRQUNyQixDQUFDLENBQUMsSUFBSSxJ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O1FBQUUsT0FBTyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTlELDJFQUEyRTtJQUMzRSxzRUFBc0U7SUFDdEUsTUFBTSxPQUFPLEdBQUcsTUFBTTtTQUNuQixNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRXhCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7UUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLENBQUM7SUFFcEQsT0FBTyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNsYXNzaWZ5RW50aXR5RXZlbnQsXG4gIHR5cGUgRW50aXR5RXZlbnRDbGFzcyxcbiAgdHlwZSBFdmVudCxcbiAgaXNTbG90RXZlbnRJZCxcbiAgVEVSTUlOQUxfRVZFTlRfQ0xBU1NFUyxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuLyoqXG4gKiBJZGVudGlmaWVzIGV2ZW50cyBhIHJlcGxheSByZWFkcyBwYXN0LlxuICpcbiAqIENvbmN1cnJlbnQgcmVwbGF5cyBvZiBvbmUgcnVuIHdyaXRlIHRvIGEgc2hhcmVkIGxvZywgc28gYSByZXBsYXkgd29ya2luZ1xuICogZnJvbSBhIHN0YWxlIHByZWZpeCBjYW4gY29tbWl0IGEgc2Vjb25kIGBzdGVwX2NyZWF0ZWRgIC8gYHN0ZXBfc3RhcnRlZGAgL1xuICogYHdhaXRfY3JlYXRlZGAgLyBgYXR0cl9zZXRgIGZvciBhbiBlbnRpdHkgdGhlIGxvZyBhbHJlYWR5IHJlY29yZHMgb25lIG9mLlxuICogRXZlcnkgcmVwbGF5IHJlYWRzIHRoZSBmaXJzdCBldmVudCBvZiB0aGF0IGNsYXNzIGF0IHRoZSBzYW1lIHBvc2l0aW9uLCBzbyBhXG4gKiBsYXRlciBvbmUgY2Fubm90IGNoYW5nZSB3aGF0IHRoZSB3b3JrZmxvdyBvYnNlcnZlcy5cbiAqXG4gKiBUaGUgY2xhc3NpZmljYXRpb24gY29tZXMgZnJvbSBgY2xhc3NpZnlFbnRpdHlFdmVudGAgaW4gYEB3b3JrZmxvdy93b3JsZGAsXG4gKiB0aGUgc2FtZSBmdW5jdGlvbiB0aGUgcnVudGltZSBrZXlzIGl0cyBvd24gZHVwbGljYXRlIGRldGVjdGlvbiBvbi4gV2hhdCBpdFxuICogY2Fubm90IHNoYXJlIGlzIGNvbnN1bWVyIHN0YXRlOiB0aGUgcnVudGltZSBwYXNzZXMgb3ZlciBhbiBldmVudCBvbmx5IGFmdGVyIGV2ZXJ5XG4gKiByZWdpc3RlcmVkIGNhbGxiYWNrIGhhcyBkZWNsaW5lZCBpdCwgYW5kIGEgY2FsbGJhY2sgcmVnaXN0ZXJlZCBmb3IgYVxuICogc3RpbGwtb3BlbiBlbnRpdHkgbGVnaXRpbWF0ZWx5IGNsYWltcyBhIHJlcGVhdCAoZWFjaCByZXRyeSBvZiBhIHN0ZXAgd3JpdGVzXG4gKiBhbm90aGVyIGBzdGVwX3N0YXJ0ZWRgLCBhbmQgYSBsaXZlIHN0ZXAgY29uc3VtZXIgYWJzb3JicyBhIHNlY29uZFxuICogYHN0ZXBfY3JlYXRlZGApLiBTbyBhIHJlcGVhdCBjb3VudHMgaGVyZSBvbmx5IG9uY2UgYSB0ZXJtaW5hbCBldmVudCBmb3IgdGhlXG4gKiBzYW1lIGVudGl0eSBzaXRzIGVhcmxpZXIgaW4gdGhlIGxvZywgd2hpY2ggaXMgdGhlIHBvaW50IHBhc3Qgd2hpY2ggbm9cbiAqIGNvbnN1bWVyIHJlbWFpbnMuXG4gKi9cblxuLyoqIENsYXNzZXMgd2l0aCBubyBlbnRpdHkgdG8gY2xvc2UgZmlyc3Q6IHRoZSBsb2cgcmVjb3JkcyBvbmUgcGVyIHJ1bi4gKi9cbmNvbnN0IFNJTkdMRVRPTl9FVkVOVF9DTEFTU0VTOiBSZWFkb25seVNldDxFbnRpdHlFdmVudENsYXNzPiA9IG5ldyBTZXQoW1xuICAncnVuX3N0YXJ0ZWQnLFxuXSk7XG5cbi8qKlxuICogU2hvd24gYWdhaW5zdCBhbiBldmVudCB0aGlzIG1vZHVsZSByZXBvcnRzLiBEZWxpYmVyYXRlbHkgc2F5cyB3aGF0IHRoZSBsb2dcbiAqIHNob3dzIHJhdGhlciB0aGFuIHdoYXQgdGhlIHJ1bnRpbWUgZGlkIHdpdGggaXQ6IHRvbGVyYXRpbmcgdGhlc2UgcmVwZWF0cyBpc1xuICogcmVjZW50LCBhbmQgb24gYSBydW4gcmVjb3JkZWQgYmVmb3JlIGl0IGEgcmVwZWF0IG5vIGNvbnN1bWVyIGNsYWltZWQgZmFpbGVkXG4gKiB0aGUgcmVwbGF5IGluc3RlYWQgb2YgYmVpbmcgcGFzc2VkIG92ZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBEVVBMSUNBVEVfRVZFTlRfTUVTU0FHRSA9XG4gICdXcml0dGVuIGJ5IGEgY29uY3VycmVudCByZXBsYXkgYWZ0ZXIgYW4gZXZlbnQgb2YgdGhlIHNhbWUga2luZCB3YXMgYWxyZWFkeSByZWNvcmRlZCBhbmQgYWN0ZWQgb24uIFRoZSBydW4gZm9sbG93cyB0aGUgZWFybGllciBvbmUuJztcblxuLyoqXG4gKiBDYW5kaWRhdGUgbG9nIG9yZGVyLCBieSBldmVudCBJRC5cbiAqXG4gKiBFdmVudCBJRHMgYXJlIGZpeGVkLXdpZHRoIGFuZCBtb25vdG9uaWMgd2l0aGluIGEgcnVuIHVuZGVyIGJvdGggdGhlIFVMSUQgYW5kXG4gKiB0aGUgc2xvdCBzY2hlbWUuIExlbmd0aCBpcyBjb21wYXJlZCBmaXJzdCBzbyBhIHNob3J0ZXIgSUQgbmV2ZXIgc29ydHMgYWZ0ZXJcbiAqIGEgbG9uZ2VyIG9uZSBvbiBhIGxvZyB0aGF0IG1peGVzIHdpZHRocy5cbiAqXG4gKiBXaGV0aGVyIHRoaXMgKmlzKiB0aGUgbG9nIG9yZGVyIGRlcGVuZHMgb24gdGhlIElEIHNjaGVtZSwgd2hpY2ggaXMgd2h5XG4gKiB7QGxpbmsgaGFzS25vd2FibGVMb2dPcmRlcn0gZ2F0ZXMgdGhlIGZvbGQuIFNlZSBpdHMgZG9jLlxuICovXG5mdW5jdGlvbiBjb21wYXJlRXZlbnRJZChhOiBFdmVudCwgYjogRXZlbnQpOiBudW1iZXIge1xuICBpZiAoYS5ldmVudElkLmxlbmd0aCAhPT0gYi5ldmVudElkLmxlbmd0aCkge1xuICAgIHJldHVybiBhLmV2ZW50SWQubGVuZ3RoIC0gYi5ldmVudElkLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gYS5ldmVudElkIDwgYi5ldmVudElkID8gLTEgOiBhLmV2ZW50SWQgPiBiLmV2ZW50SWQgPyAxIDogMDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlZEF0TXMoZXZlbnQ6IEV2ZW50KTogbnVtYmVyIHtcbiAgY29uc3QgY3JlYXRlZEF0ID0gZXZlbnQuY3JlYXRlZEF0O1xuICByZXR1cm4gY3JlYXRlZEF0IGluc3RhbmNlb2YgRGF0ZVxuICAgID8gY3JlYXRlZEF0LmdldFRpbWUoKVxuICAgIDogbmV3IERhdGUoY3JlYXRlZEF0IGFzIHVua25vd24gYXMgc3RyaW5nKS5nZXRUaW1lKCk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgb3JkZXIgdGhlIHJ1biBjb25zdW1lZCBpdHMgbG9nIGluIGNhbiBiZSByZWNvdmVyZWQgZnJvbSB0aGVcbiAqIGV2ZW50cyBhbG9uZS5cbiAqXG4gKiBXaGljaCBvY2N1cnJlbmNlIG9mIGEgY2xhc3MgY2FtZSBmaXJzdCBpcyB0aGUgd2hvbGUgcXVlc3Rpb24gaGVyZSwgc28gdGhlXG4gKiBmb2xkIG5lZWRzIHRoZSBsb2cncyBvcmRlciwgbm90IGFuIG9yZGVyLiBUaGUgYmFja2VuZHMgZG8gbm90IGFncmVlIG9uIGhvd1xuICogdG8gcmVjb3ZlciBpdCBmb3IgZXZlcnkgSUQgc2NoZW1lOlxuICpcbiAqIC0gQSAqKnNsb3QtbnVtYmVyZWQqKiBydW4gY2FycmllcyBpdHMgcG9zaXRpb24gaW4gdGhlIElELiBUaGUgc2xvdCBpcyBkcmF3blxuICogICBhdCB0aGUgcHVibGlzaCwgd2hpY2ggaXMgdGhlIGxpbmVhcml6YXRpb24gcG9pbnQsIHNvIHNsb3Qgb3JkZXIgaXMgbG9nXG4gKiAgIG9yZGVyIGV2ZXJ5d2hlcmUgYW5kIHRoZSBJRCBhbG9uZSBzZXR0bGVzIGl0LlxuICogLSBBICoqVUxJRC1udW1iZXJlZCoqIHJ1biBkb2VzIG5vdC4gT25lIGJhY2tlbmQgcmV0dXJucyBzdWNoIGEgbG9nIGluXG4gKiAgIGAoY3JlYXRlZEF0LCBldmVudElkKWAgb3JkZXIgd2hpbGUgYW5vdGhlciByZXR1cm5zIGl0IGtleWVkIG9uIHRoZSBJRCwgYW5kXG4gKiAgIGBjcmVhdGVkQXRgIGlzIHN0YW1wZWQgd2hlbiB0aGUgd3JpdGUgcmVxdWVzdCBhcnJpdmVzIHJhdGhlciB0aGFuIHdoZW4gaXRcbiAqICAgY29tbWl0cy4gQ29uY3VycmVudCB3cml0ZXJzIGNhbiB0aGVyZWZvcmUgcHJvZHVjZSBvcHBvc2l0ZSB0aW1lc3RhbXAgYW5kXG4gKiAgIElEIG9yZGVycywgYW5kIHRoZSBydW4gY29uc3VtZWQgd2hpY2hldmVyIGl0cyBvd24gYmFja2VuZCBzZXJ2ZWQuXG4gKlxuICogU28gYSBVTElEIGxvZyBpcyBvbmx5IGtub3dhYmxlIHdoZXJlIHRoZSB0d28gb3JkZXJzIGFncmVlLiBXaGVyZSB0aGV5XG4gKiBjb250cmFkaWN0LCB0aGUgZm9sZCBjb3VsZCBuYW1lIHRoZSBzdXJ2aXZpbmcgZXZlbnQgYW5kIHBhc3Mgb3ZlciB0aGUgb25lXG4gKiB0aGUgcnVuIGFjdGVkIG9uLCB3aGljaCBpcyB3b3JzZSB0aGFuIHNheWluZyBub3RoaW5nLlxuICovXG5mdW5jdGlvbiBoYXNLbm93YWJsZUxvZ09yZGVyKG9yZGVyZWRCeUlkOiByZWFkb25seSBFdmVudFtdKTogYm9vbGVhbiB7XG4gIGlmIChvcmRlcmVkQnlJZC5ldmVyeSgoZXZlbnQpID0+IGlzU2xvdEV2ZW50SWQoZXZlbnQuZXZlbnRJZCkpKSByZXR1cm4gdHJ1ZTtcblxuICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgb3JkZXJlZEJ5SWQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjcmVhdGVkQXRNcyhvcmRlcmVkQnlJZFtpbmRleCAtIDFdKTtcbiAgICBjb25zdCBjdXJyZW50ID0gY3JlYXRlZEF0TXMob3JkZXJlZEJ5SWRbaW5kZXhdKTtcbiAgICAvLyBBIG1pc3Npbmcgb3IgdW5wYXJzZWFibGUgdGltZXN0YW1wIGxlYXZlcyBub3RoaW5nIHRvIGNvcnJvYm9yYXRlIHRoZSBJRFxuICAgIC8vIG9yZGVyIHdpdGgsIHdoaWNoIGlzIHRoZSBzYW1lIHBvc2l0aW9uIGFzIGEgY29udHJhZGljdGlvbi5cbiAgICBpZiAoTnVtYmVyLmlzTmFOKHByZXZpb3VzKSB8fCBOdW1iZXIuaXNOYU4oY3VycmVudCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY3VycmVudCA8IHByZXZpb3VzKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFRoZSBmb2xkIGl0c2VsZiwgb3ZlciBhIGxvZyB3aG9zZSBvcmRlciBpcyBrbm93bi4gKi9cbmZ1bmN0aW9uIGZvbGREdXBsaWNhdGVzKG9yZGVyZWQ6IHJlYWRvbmx5IEV2ZW50W10pOiBTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IGR1cGxpY2F0ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3Qgc2VlbkNsYXNzZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgY2xvc2VkRW50aXRpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IGV2ZW50IG9mIG9yZGVyZWQpIHtcbiAgICAvLyBTaGFyZWQgd2l0aCB0aGUgcnVudGltZSdzIG93biBkdXBsaWNhdGUgZGV0ZWN0aW9uLCBkZWxpYmVyYXRlbHk6IGFuXG4gICAgLy8gZXZlbnQgaXQgdHJhY2tzIHVuZGVyIG5vIGNsYXNzIGlzIG9uZSBpdCBuZXZlciByZWFkcyBwYXN0LCBzbyBuYW1pbmcgaXRcbiAgICAvLyBoZXJlIHdvdWxkIGdyZXkgb3V0IGFuIGV2ZW50IHRoZSBydW4gYWN0ZWQgb24uXG4gICAgY29uc3QgY2xhc3NpZmljYXRpb24gPSBjbGFzc2lmeUVudGl0eUV2ZW50KGV2ZW50KTtcbiAgICBpZiAoY2xhc3NpZmljYXRpb24gPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBjb25zdCB7IGV2ZW50Q2xhc3MsIGVudGl0eSB9ID0gY2xhc3NpZmljYXRpb247XG4gICAgY29uc3QgY2xhc3NLZXkgPSBgJHtldmVudENsYXNzfToke2VudGl0eX1gO1xuICAgIGNvbnN0IHJlcGVhdHNDbGFzcyA9IHNlZW5DbGFzc2VzLmhhcyhjbGFzc0tleSk7XG4gICAgY29uc3QgZW50aXR5V2FzQ2xvc2VkID0gY2xvc2VkRW50aXRpZXMuaGFzKGVudGl0eSk7XG5cbiAgICBpZiAoVEVSTUlOQUxfRVZFTlRfQ0xBU1NFUy5oYXMoZXZlbnRDbGFzcykpIHtcbiAgICAgIGNsb3NlZEVudGl0aWVzLmFkZChlbnRpdHkpO1xuICAgIH1cblxuICAgIGlmICghcmVwZWF0c0NsYXNzKSB7XG4gICAgICAvLyBGaXJzdCBvZiBpdHMgY2xhc3MsIGJ1dCB0aGUgZW50aXR5IGFscmVhZHkgZmluaXNoZWQ6IG5vIGNvbnN1bWVyIGlzXG4gICAgICAvLyBsZWZ0IHRvIHRha2UgaXQgYW5kIGl0IHJlcGVhdHMgbm90aGluZywgc28gdGhlIHJ1bnRpbWUgcmVwb3J0c1xuICAgICAgLy8gZGl2ZXJnZW5jZSBoZXJlIGFuZCBleGl0cy4gRXZlcnl0aGluZyBwYXN0IHRoaXMgcG9pbnQgd2VudCB1bnJlYWQsIHNvXG4gICAgICAvLyB0aGUgZm9sZCBzdG9wcyB3aXRoIGl0IHJhdGhlciB0aGFuIHJlY29yZGluZyB0aGUgY2xhc3MgYW5kIHByZXNlbnRpbmdcbiAgICAgIC8vIGEgbGF0ZXIgZXZlbnQgb2YgaXQgYXMgYSByZXBlYXQgdGhlIHJ1biBwYXNzZWQgb3Zlci5cbiAgICAgIGlmIChlbnRpdHlXYXNDbG9zZWQpIGJyZWFrO1xuICAgICAgc2VlbkNsYXNzZXMuYWRkKGNsYXNzS2V5KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIFRoZSBlbnRpdHkgaXMgc3RpbGwgb3Blbiwgc28gYSBjb25zdW1lciBpcyByZWdpc3RlcmVkIGZvciBpdCBhbmQgdGFrZXNcbiAgICAvLyB0aGlzIGV2ZW50OiBhbm90aGVyIGF0dGVtcHQsIG5vdCBhIHJlcGVhdCByZWFkIHBhc3QuXG4gICAgaWYgKGVudGl0eVdhc0Nsb3NlZCB8fCBTSU5HTEVUT05fRVZFTlRfQ0xBU1NFUy5oYXMoZXZlbnRDbGFzcykpIHtcbiAgICAgIGR1cGxpY2F0ZXMuYWRkKGV2ZW50LmV2ZW50SWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkdXBsaWNhdGVzO1xufVxuXG4vKipcbiAqIFRoZSBJRHMgb2YgdGhlIGV2ZW50cyBpbiBgZXZlbnRzYCB0aGF0IHJlcGVhdCBhIGNsYXNzIHRoZSBsb2cgYWxyZWFkeVxuICogcmVjb3JkcyBmb3IgdGhlIHNhbWUgZW50aXR5LCBhZnRlciB0aGF0IGVudGl0eSBmaW5pc2hlZC5cbiAqXG4gKiBgaXNDb21wbGV0ZUhpc3RvcnlgIG11c3QgYmUgZmFsc2Ugd2hlbmV2ZXIgdGhlIGNhbGxlciBob2xkcyBhIHN1YnNldCBvZiB0aGVcbiAqIHJ1bidzIGxvZzogb25lIHBhZ2Ugb2YgYSBwYWdpbmF0ZWQgbGlzdCwgb3IgdGhlIHJlc3VsdCBvZiBhIHNlYXJjaC4gV2hpY2hcbiAqIG9jY3VycmVuY2Ugb2YgYSBjbGFzcyBjYW1lIGZpcnN0IGlzIGEgcHJvcGVydHkgb2YgdGhlIHdob2xlIGxvZywgc28gb24gYVxuICogc3Vic2V0IHRoZSBlYXJsaWVyIGV2ZW50IG1heSBiZSBtaXNzaW5nLCBhbmQgdGhlIGZvbGQgd291bGQgcmVwb3J0XG4gKiB0aGUgc3Vydml2aW5nIG9uZS4gTm90aGluZyBpcyBjbGFzc2lmaWVkIGluIHRoYXQgY2FzZS5cbiAqXG4gKiBUd28gb3RoZXIgdGhpbmdzIG1ha2UgdGhlIGFuc3dlciB1bmtub3dhYmxlIGFuZCB5aWVsZCB0aGUgc2FtZSBlbXB0eSByZXN1bHQ6XG4gKiBhIGxvZyB3aG9zZSBvcmRlciBjYW5ub3QgYmUgcmVjb3ZlcmVkIGZyb20gdGhlIGV2ZW50cyAoc2VlXG4gKiB7QGxpbmsgaGFzS25vd2FibGVMb2dPcmRlcn0pLCBhbmQgZXZlcnl0aGluZyBwYXN0IHRoZSBwb2ludCB0aGUgcnVuXG4gKiBkaXZlcmdlZCwgc2luY2UgdGhlIHJ1biBleGl0ZWQgdGhlcmUgYW5kIHJlYWQgbm8gZnVydGhlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmREdXBsaWNhdGVFdmVudElkcyhcbiAgZXZlbnRzOiByZWFkb25seSBFdmVudFtdLFxuICB7IGlzQ29tcGxldGVIaXN0b3J5IH06IHsgaXNDb21wbGV0ZUhpc3Rvcnk6IGJvb2xlYW4gfVxuKTogU2V0PHN0cmluZz4ge1xuICBpZiAoIWlzQ29tcGxldGVIaXN0b3J5IHx8IGV2ZW50cy5sZW5ndGggPCAyKSByZXR1cm4gbmV3IFNldCgpO1xuXG4gIC8vIERyb3BwZWQgYmVmb3JlIHRoZSBzb3J0LCBub3QgZHVyaW5nIHRoZSBmb2xkOiBhbiBldmVudCB3aXRoIG5vIElEIGhhcyBub1xuICAvLyBsb2cgcG9zaXRpb24gdG8gb3JkZXIgb24sIGFuZCB0aGUgY2FsbGVyIGNvdWxkIG5vdCBtYXRjaCBpdCBlaXRoZXIuXG4gIGNvbnN0IG9yZGVyZWQgPSBldmVudHNcbiAgICAuZmlsdGVyKChldmVudCkgPT4gQm9vbGVhbihldmVudC5ldmVudElkKSlcbiAgICAuc29ydChjb21wYXJlRXZlbnRJZCk7XG5cbiAgaWYgKCFoYXNLbm93YWJsZUxvZ09yZGVyKG9yZGVyZWQpKSByZXR1cm4gbmV3IFNldCgpO1xuXG4gIHJldHVybiBmb2xkRHVwbGljYXRlcyhvcmRlcmVkKTtcbn1cbiJdfQ==
@@ -6,6 +6,7 @@
6
6
  * a fully-formed Trace ready for the trace viewer.
7
7
  */
8
8
  import { type Event, type WorkflowRun } from '@workflow/world';
9
+ import { type GetStepAttributes } from '../components/workflow-traces/trace-span-construction';
9
10
  import type { Span } from './trace-types';
10
11
  /**
11
12
  * Events that belong to the run root span rather than a child entity span.
@@ -53,7 +54,8 @@ export declare function buildTrace(run: WorkflowRun, events: Event[], now: Date,
53
54
  * from the only copy the caller was given, and dropping the wrong one moves
54
55
  * a span. See {@link findDuplicateEventIds}.
55
56
  */
56
- { isCompleteHistory }?: {
57
+ { isCompleteHistory, getStepAttributes, }?: {
57
58
  isCompleteHistory?: boolean;
59
+ getStepAttributes?: GetStepAttributes;
58
60
  }): TraceWithMeta;
59
61
  //# sourceMappingURL=trace-builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"trace-builder.d.ts","sourceRoot":"","sources":["../../src/lib/trace-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,KAAK,EAIV,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAYzB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,KAAK,KAAG,OAIT,CAAC;AAEvC;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,KAAK,EAAE,EACf,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,KAAK,EAAE,CAMT;AAMD,MAAM,MAAM,aAAa,GAAG;IAC1B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACrC,cAAc,EAAE,KAAK,EAAE,CAAC;IACxB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAClC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;CAClC,CAAC;AAeF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,CAgCvE;AAsED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,EAAE,CAAC;IAClE,iEAAiE;IACjE,eAAe,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACxC;AAED,wBAAgB,UAAU,CACxB,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,KAAK,EAAE,EACf,GAAG,EAAE,IAAI;AACT;;;;;GAKG;AACH,EAAE,iBAAyB,EAAE,GAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GAClE,aAAa,CA8Cf"}
1
+ {"version":3,"file":"trace-builder.d.ts","sourceRoot":"","sources":["../../src/lib/trace-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,KAAK,EAIV,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,iBAAiB,EAOvB,MAAM,uDAAuD,CAAC;AAI/D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,KAAK,KAAG,OAIT,CAAC;AAEvC;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,KAAK,EAAE,EACf,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,KAAK,EAAE,CAMT;AAMD,MAAM,MAAM,aAAa,GAAG;IAC1B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACrC,cAAc,EAAE,KAAK,EAAE,CAAC;IACxB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAClC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;CAClC,CAAC;AAeF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,CAgCvE;AAuED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,EAAE,CAAC;IAClE,iEAAiE;IACjE,eAAe,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACxC;AAED,wBAAgB,UAAU,CACxB,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,KAAK,EAAE,EACf,GAAG,EAAE,IAAI;AACT;;;;;GAKG;AACH,EACE,iBAAyB,EACzB,iBAAiB,GAClB,GAAE;IACD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CAClC,GACL,aAAa,CA+Cf"}
@@ -87,14 +87,14 @@ function computeLatestKnownTime(events, run) {
87
87
  }
88
88
  return new Date(latest);
89
89
  }
90
- function buildSpans(run, groupedEvents, now, latestKnownTime) {
90
+ function buildSpans(run, groupedEvents, now, latestKnownTime, getStepAttributes) {
91
91
  // Active child spans cap at latestKnownTime so they don't extend into
92
92
  // unknown territory. Even when the run is completed, we may not have loaded
93
93
  // all events yet, so always use the latest event we've actually seen.
94
94
  const childMaxEnd = latestKnownTime;
95
95
  const runMaxEnd = run.completedAt ?? now;
96
96
  const stepSpans = Array.from(groupedEvents.eventsByStepId.values())
97
- .map((events) => stepToSpan(events, childMaxEnd))
97
+ .map((events) => stepToSpan(events, childMaxEnd, getStepAttributes))
98
98
  .filter((span) => span !== null);
99
99
  const hookSpans = Array.from(groupedEvents.hookEvents.values())
100
100
  .map((events) => hookToSpan(events, childMaxEnd))
@@ -131,7 +131,7 @@ export function buildTrace(run, events, now,
131
131
  * from the only copy the caller was given, and dropping the wrong one moves
132
132
  * a span. See {@link findDuplicateEventIds}.
133
133
  */
134
- { isCompleteHistory = false } = {}) {
134
+ { isCompleteHistory = false, getStepAttributes, } = {}) {
135
135
  // Span geometry comes from what the run acted on. A repeat of a class the
136
136
  // log already records is read past by every replay, and letting one through
137
137
  // here would stretch a span to whenever a concurrent replay committed it.
@@ -146,7 +146,7 @@ export function buildTrace(run, events, now,
146
146
  const actedOnEvents = events.filter((event) => !duplicateEventIds.has(event.eventId) && !isSealedNoopEvent(event));
147
147
  const groupedEvents = groupEventsByCorrelation(actedOnEvents);
148
148
  const latestKnownTime = computeLatestKnownTime(actedOnEvents, run);
149
- const { runSpan, spans } = buildSpans(run, groupedEvents, now, latestKnownTime);
149
+ const { runSpan, spans } = buildSpans(run, groupedEvents, now, latestKnownTime, getStepAttributes);
150
150
  const sortedCascadingSpans = cascadeSpans(runSpan, spans);
151
151
  // Compute known duration relative to trace start
152
152
  const traceStartMs = otelTimeToMs(runSpan.startTime);
@@ -167,4 +167,4 @@ export function buildTrace(run, events, now,
167
167
  duplicateEventIds,
168
168
  };
169
169
  }
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdHJhY2UtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLGVBQWUsRUFDZixlQUFlLEdBRWhCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsU0FBUyxFQUNULFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsVUFBVSxHQUNYLE1BQU0sdURBQXVELENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQzlFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR3BEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQVksRUFBVyxFQUFFLENBQ3ZELENBQUMsS0FBSyxDQUFDLGFBQWE7SUFDcEIsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ2hDLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUMxQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUV2Qzs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsTUFBZSxFQUNmLFFBQTRCLEVBQzVCLE1BQTBCO0lBRTFCLElBQUksUUFBUSxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN2QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENB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QyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUNyRSxDQUFDO0lBRUYsTUFBTSxhQUFhLEdBQUcsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUQsTUFBTSxlQUFlLEdBQUcsc0JBQXNCLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsVUFBVSxDQUNuQyxHQUFHLEVBQ0gsYUFBYSxFQUNiLEdBQUcsRUFDSCxlQUFlLENBQ2hCLENBQUM7SUFDRixNQUFNLG9CQUFvQixHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFMUQsaURBQWlEO0lBQ2pELE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckQsTUFBTSxlQUFlLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxHQUFHLFlBQVksQ0FBQztJQUVqRSxPQUFPO1FBQ0wsT0FBTyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1FBQ2xCLFVBQVUsRUFBRSxHQUFHLENBQUMsS0FBSztRQUNyQixLQUFLLEVBQUUsb0JBQW9CO1FBQzNCLFNBQVMsRUFBRTtZQUNUO2dCQUNFLElBQUksRUFBRSxVQUFVO2dCQUNoQixVQUFVLEVBQUU7b0JBQ1YsY0FBYyxFQUFFLGdCQUFnQixDQUFDLElBQUk7aUJBQ3RDO2FBQ0Y7U0FDRjtRQUNELGVBQWUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUM7UUFDN0MsaUJBQWlCO0tBQ2xCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCdWlsZHMgYSBjb21wbGV0ZSB0cmFjZSBmcm9tIGEgV29ya2Zsb3dSdW4gYW5kIGl0cyBFdmVudHMuXG4gKlxuICogVGhpcyBtb2R1bGUgZ3JvdXBzIHJhdyBldmVudHMgYnkgY29ycmVsYXRpb24gSUQgYW5kIGVudGl0eSB0eXBlLFxuICogY29udmVydHMgZWFjaCBncm91cCBpbnRvIGFuIE9wZW5UZWxlbWV0cnktc3R5bGUgU3BhbiwgYW5kIHJldHVybnNcbiAqIGEgZnVsbHktZm9ybWVkIFRyYWNlIHJlYWR5IGZvciB0aGUgdHJhY2Ugdmlld2VyLlxuICovXG5cbmltcG9ydCB7XG4gIHR5cGUgRXZlbnQsXG4gIGlzSG9va0xpZmVjeWNsZUV2ZW50VHlwZSxcbiAgaXNTdGVwRXZlbnRUeXBlLFxuICBpc1dhaXRFdmVudFR5cGUsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBnZXRFdmVudFRpbWVzdGFtcCxcbiAgaG9va1RvU3BhbixcbiAgcnVuVG9TcGFuLFxuICBzdGVwVG9TcGFuLFxuICBXT1JLRkxPV19MSUJSQVJZLFxuICB3YWl0VG9TcGFuLFxufSBmcm9tICcuLi9jb21wb25lbnRzL3dvcmtmbG93LXRyYWNlcy90cmFjZS1zcGFuLWNvbnN0cnVjdGlvbic7XG5pbXBvcnQgeyBvdGVsVGltZVRvTXMgfSBmcm9tICcuLi9jb21wb25lbnRzL3dvcmtmbG93LXRyYWNlcy90cmFjZS10aW1lLXV0aWxzJztcbmltcG9ydCB7IGZpbmREdXBsaWNhdGVFdmVudElkcyB9IGZyb20gJy4vZHVwbGljYXRlLWV2ZW50cyc7XG5pbXBvcnQgeyBpc1NlYWxlZE5vb3BFdmVudCB9IGZyb20gJy4vc2VhbGVkLWV2ZW50cyc7XG5pbXBvcnQgdHlwZSB7IFNwYW4gfSBmcm9tICcuL3RyYWNlLXR5cGVzJztcblxuLyoqXG4gKiBFdmVudHMgdGhhdCBiZWxvbmcgdG8gdGhlIHJ1biByb290IHNwYW4gcmF0aGVyIHRoYW4gYSBjaGlsZCBlbnRpdHkgc3Bhbi5cbiAqIE1pcnJvcnMgdGhlIGZhbGx0aHJvdWdoIGxvZ2ljIGluIHtAbGluayBncm91cEV2ZW50c0J5Q29ycmVsYXRpb259OiBldmVudHNcbiAqIHdpdGhvdXQgYSBjb3JyZWxhdGlvbklkIChydW4gbGlmZWN5Y2xlKSBwbHVzIGNvcnJlbGF0ZWQgZXZlbnRzIHRoYXQgYXJlbid0XG4gKiBzdGVwL3RpbWVyL2hvb2sgZXZlbnRzIChlLmcuIGBhdHRyX3NldGAsIHdob3NlIGNvcnJlbGF0aW9uSWQgaXMgYSBkZWR1cFxuICogdG9rZW4gcmF0aGVyIHRoYW4gYSBjaGlsZCBlbnRpdHkgSUQpLlxuICovXG5leHBvcnQgY29uc3QgaXNSdW5MZXZlbEV2ZW50ID0gKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4gPT5cbiAgIWV2ZW50LmNvcnJlbGF0aW9uSWQgfHxcbiAgKCFpc1dhaXRFdmVudFR5cGUoZXZlbnQuZXZlbnRUeXBlKSAmJlxuICAgICFpc0hvb2tMaWZlY3ljbGVFdmVudFR5cGUoZXZlbnQuZXZlbnRUeXBlKSAmJlxuICAgICFpc1N0ZXBFdmVudFR5cGUoZXZlbnQuZXZlbnRUeXBlKSk7XG5cbi8qKlxuICogRmlsdGVyIHRoZSByYXcgZXZlbnQgbGlzdCBkb3duIHRvIHRoZSBldmVudHMgZm9yIGEgc2VsZWN0ZWQgc3Bhbi5cbiAqIEZvciB0aGUgcnVuIHJvb3Qgc3BhbiB0aGlzIHJldHVybnMgcnVuLWxldmVsIGV2ZW50cyAoc2VlXG4gKiB7QGxpbmsgaXNSdW5MZXZlbEV2ZW50fSk7IGZvciBjaGlsZCBzcGFucyBpdCByZXR1cm5zIHRoZSBldmVudHNcbiAqIGNvcnJlbGF0ZWQgdG8gdGhhdCBzcGFuJ3MgSUQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJTcGFuUmF3RXZlbnRzKFxuICBldmVudHM6IEV2ZW50W10sXG4gIHJlc291cmNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHNwYW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBFdmVudFtdIHtcbiAgaWYgKHJlc291cmNlID09PSAncnVuJykge1xuICAgIHJldHVybiBldmVudHMuZmlsdGVyKGlzUnVuTGV2ZWxFdmVudCk7XG4gIH1cbiAgaWYgKCFzcGFuSWQpIHJldHVybiBbXTtcbiAgcmV0dXJuIGV2ZW50cy5maWx0ZXIoKGUpID0+IGUuY29ycmVsYXRpb25JZCA9PT0gc3BhbklkKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFdmVudCBncm91cGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCB0eXBlIEdyb3VwZWRFdmVudHMgPSB7XG4gIGV2ZW50c0J5U3RlcElkOiBNYXA8c3RyaW5nLCBFdmVudFtdPjtcbiAgcnVuTGV2ZWxFdmVudHM6IEV2ZW50W107XG4gIHRpbWVyRXZlbnRzOiBNYXA8c3RyaW5nLCBFdmVudFtdPjtcbiAgaG9va0V2ZW50czogTWFwPHN0cmluZywgRXZlbnRbXT47XG59O1xuXG5mdW5jdGlvbiBwdXNoRXZlbnQoXG4gIG1hcDogTWFwPHN0cmluZywgRXZlbnRbXT4sXG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZyxcbiAgZXZlbnQ6IEV2ZW50XG4pIHtcbiAgY29uc3QgZXhpc3RpbmcgPSBtYXAuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICBpZiAoZXhpc3RpbmcpIHtcbiAgICBleGlzdGluZy5wdXNoKGV2ZW50KTtcbiAgICByZXR1cm47XG4gIH1cbiAgbWFwLnNldChjb3JyZWxhdGlvbklkLCBbZXZlbnRdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwRXZlbnRzQnlDb3JyZWxhdGlvbihldmVudHM6IEV2ZW50W10pOiBHcm91cGVkRXZlbnRzIHtcbiAgY29uc3QgZXZlbnRzQnlTdGVwSWQgPSBuZXcgTWFwPHN0cmluZywgRXZlbnRbXT4oKTtcbiAgY29uc3QgcnVuTGV2ZWxFdmVudHM6IEV2ZW50W10gPSBbXTtcbiAgY29uc3QgdGltZXJFdmVudHMgPSBuZXcgTWFwPHN0cmluZywgRXZlbnRbXT4oKTtcbiAgY29uc3QgaG9va0V2ZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBFdmVudFtdPigpO1xuXG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IGV2ZW50LmNvcnJlbGF0aW9uSWQ7XG4gICAgaWYgKCFjb3JyZWxhdGlvbklkKSB7XG4gICAgICBydW5MZXZlbEV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpc1dhaXRFdmVudFR5cGUoZXZlbnQuZXZlbnRUeXBlKSkge1xuICAgICAgcHVzaEV2ZW50KHRpbWVyRXZlbnRzLCBjb3JyZWxhdGlvbklkLCBldmVudCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNIb29rTGlmZWN5Y2xlRXZlbnRUeXBlKGV2ZW50LmV2ZW50VHlwZSkpIHtcbiAgICAgIHB1c2hFdmVudChob29rRXZlbnRzLCBjb3JyZWxhdGlvbklkLCBldmVudCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNTdGVwRXZlbnRUeXBlKGV2ZW50LmV2ZW50VHlwZSkpIHtcbiAgICAgIHB1c2hFdmVudChldmVudHNCeVN0ZXBJZCwgY29ycmVsYXRpb25JZCwgZXZlbnQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcnVuTGV2ZWxFdmVudHMucHVzaChldmVudCk7XG4gIH1cblxuICByZXR1cm4geyBldmVudHNCeVN0ZXBJZCwgcnVuTGV2ZWxFdmVudHMsIHRpbWVyRXZlbnRzLCBob29rRXZlbnRzIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVHJhY2UgY29uc3RydWN0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbGF0ZXN0IGtub3duIGV2ZW50IHRpbWUgZnJvbSB0aGUgZXZlbnRzIGxpc3QuXG4gKiBBY3RpdmUgKGluLXByb2dyZXNzKSBjaGlsZCBzcGFucyBhcmUgY2FwcGVkIGF0IHRoaXMgdGltZSBpbnN0ZWFkIG9mIGBub3dgLFxuICogc28gdGhleSBvbmx5IGV4dGVuZCBhcyBmYXIgYXMgb3VyIGRhdGEgZ29lcy5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUxhdGVzdEtub3duVGltZShldmVudHM6IEV2ZW50W10sIHJ1bjogV29ya2Zsb3dSdW4pOiBEYXRlIHtcbiAgbGV0IGxhdGVzdCA9IG5ldyBEYXRlKHJ1bi5jcmVhdGVkQXQpLmdldFRpbWUoKTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBjb25zdCB0ID0gKGdldEV2ZW50VGltZXN0YW1wKGV2ZW50KSA/PyBuZXcgRGF0ZShldmVudC5jcmVhdGVkQXQpKS5nZXRUaW1lKCk7XG4gICAgaWYgKHQgPiBsYXRlc3QpIGxhdGVzdCA9IHQ7XG4gIH1cbiAgcmV0dXJuIG5ldyBEYXRlKGxhdGVzdCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3BhbnMoXG4gIHJ1bjogV29ya2Zsb3dSdW4sXG4gIGdyb3VwZWRFdmVudHM6IEdyb3VwZWRFdmVudHMsXG4gIG5vdzogRGF0ZSxcbiAgbGF0ZXN0S25vd25UaW1lOiBEYXRlXG4pIHtcbiAgLy8gQWN0aXZlIGNoaWxkIHNwYW5zIGNhcCBhdCBsYXRlc3RLbm93blRpbWUgc28gdGhleSBkb24ndCBleHRlbmQgaW50b1xuICAvLyB1bmtub3duIHRlcnJpdG9yeS4gRXZlbiB3aGVuIHRoZSBydW4gaXMgY29tcGxldGVkLCB3ZSBtYXkgbm90IGhhdmUgbG9hZGVkXG4gIC8vIGFsbCBldmVudHMgeWV0LCBzbyBhbHdheXMgdXNlIHRoZSBsYXRlc3QgZXZlbnQgd2UndmUgYWN0dWFsbHkgc2Vlbi5cbiAgY29uc3QgY2hpbGRNYXhFbmQgPSBsYXRlc3RLbm93blRpbWU7XG4gIGNvbnN0IHJ1bk1heEVuZCA9IHJ1bi5jb21wbGV0ZWRBdCA/PyBub3c7XG5cbiAgY29uc3Qgc3RlcFNwYW5zID0gQXJyYXkuZnJvbShncm91cGVkRXZlbnRzLmV2ZW50c0J5U3RlcElkLnZhbHVlcygpKVxuICAgIC5tYXAoKGV2ZW50cykgPT4gc3RlcFRvU3BhbihldmVudHMsIGNoaWxkTWF4RW5kKSlcbiAgICAuZmlsdGVyKChzcGFuKTogc3BhbiBpcyBTcGFuID0+IHNwYW4gIT09IG51bGwpO1xuXG4gIGNvbnN0IGhvb2tTcGFucyA9IEFycmF5LmZyb20oZ3JvdXBlZEV2ZW50cy5ob29rRXZlbnRzLnZhbHVlcygpKVxuICAgIC5tYXAoKGV2ZW50cykgPT4gaG9va1RvU3BhbihldmVudHMsIGNoaWxkTWF4RW5kKSlcbiAgICAuZmlsdGVyKChzcGFuKTogc3BhbiBpcyBTcGFuID0+IHNwYW4gIT09IG51bGwpO1xuXG4gIGNvbnN0IHdhaXRTcGFucyA9IEFycmF5LmZyb20oZ3JvdXBlZEV2ZW50cy50aW1lckV2ZW50cy52YWx1ZXMoKSlcbiAgICAubWFwKChldmVudHMpID0+IHdhaXRUb1NwYW4oZXZlbnRzLCBjaGlsZE1heEVuZCwgcnVuTWF4RW5kKSlcbiAgICAuZmlsdGVyKChzcGFuKTogc3BhbiBpcyBTcGFuID0+IHNwYW4gIT09IG51bGwpO1xuXG4gIHJldHVybiB7XG4gICAgcnVuU3BhbjogcnVuVG9TcGFuKHJ1biwgZ3JvdXBlZEV2ZW50cy5ydW5MZXZlbEV2ZW50cywgbm93KSxcbiAgICBzcGFuczogWy4uLnN0ZXBTcGFucywgLi4uaG9va1NwYW5zLCAuLi53YWl0U3BhbnNdLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjYXNjYWRlU3BhbnMocnVuU3BhbjogU3Bhbiwgc3BhbnM6IFNwYW5bXSkge1xuICBjb25zdCBzb3J0ZWRTcGFucyA9IFtcbiAgICBydW5TcGFuLFxuICAgIC4uLnNwYW5zLnNsaWNlKCkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYVN0YXJ0ID0gb3RlbFRpbWVUb01zKGEuc3RhcnRUaW1lKTtcbiAgICAgIGNvbnN0IGJTdGFydCA9IG90ZWxUaW1lVG9NcyhiLnN0YXJ0VGltZSk7XG4gICAgICByZXR1cm4gYVN0YXJ0IC0gYlN0YXJ0O1xuICAgIH0pLFxuICBdO1xuXG4gIHJldHVybiBzb3J0ZWRTcGFucy5tYXAoKHNwYW4sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgcGFyZW50U3BhbklkID1cbiAgICAgIGluZGV4ID09PSAwID8gdW5kZWZpbmVkIDogU3RyaW5nKHNvcnRlZFNwYW5zW2luZGV4IC0gMV0uc3BhbklkKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3BhbixcbiAgICAgIHBhcmVudFNwYW5JZCxcbiAgICB9O1xuICB9KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFjZVdpdGhNZXRhIHtcbiAgdHJhY2VJZDogc3RyaW5nO1xuICByb290U3BhbklkOiBzdHJpbmc7XG4gIHNwYW5zOiBTcGFuW107XG4gIHJlc291cmNlczogeyBuYW1lOiBzdHJpbmc7IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfVtdO1xuICAvKiogRHVyYXRpb24gaW4gbXMgZnJvbSB0cmFjZSBzdGFydCB0byB0aGUgbGF0ZXN0IGtub3duIGV2ZW50LiAqL1xuICBrbm93bkR1cmF0aW9uTXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBldmVudHMgbGVmdCBvdXQgb2YgdGhlIHNwYW4gZ2VvbWV0cnkgYXMgcmVwZWF0cy4gRW1wdHkgdW5sZXNzIHRoZVxuICAgKiBjYWxsZXIgdm91Y2hlZCBmb3IgdGhlIGxvZyBiZWluZyBjb21wbGV0ZS4gU2VlXG4gICAqIHtAbGluayBmaW5kRHVwbGljYXRlRXZlbnRJZHN9LlxuICAgKi9cbiAgZHVwbGljYXRlRXZlbnRJZHM6IFJlYWRvbmx5U2V0PHN0cmluZz47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRyYWNlKFxuICBydW46IFdvcmtmbG93UnVuLFxuICBldmVudHM6IEV2ZW50W10sXG4gIG5vdzogRGF0ZSxcbiAgLyoqXG4gICAqIFdoZXRoZXIgYGV2ZW50c2AgaXMgdGhlIHJ1bidzIHdob2xlIGxvZy4gRGVmYXVsdHMgdG8gZmFsc2UsIHdoaWNoIGJ1aWxkc1xuICAgKiB0aGUgdHJhY2UgZnJvbSBldmVyeSBldmVudDogb24gYSBzdWJzZXQgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgYSByZXBlYXRcbiAgICogZnJvbSB0aGUgb25seSBjb3B5IHRoZSBjYWxsZXIgd2FzIGdpdmVuLCBhbmQgZHJvcHBpbmcgdGhlIHdyb25nIG9uZSBtb3Zlc1xuICAgKiBhIHNwYW4uIFNlZSB7QGxpbmsgZmluZER1cGxpY2F0ZUV2ZW50SWRzfS5cbiAgICovXG4gIHsgaXNDb21wbGV0ZUhpc3RvcnkgPSBmYWxzZSB9OiB7IGlzQ29tcGxldGVIaXN0b3J5PzogYm9vbGVhbiB9ID0ge31cbik6IFRyYWNlV2l0aE1ldGEge1xuICAvLyBTcGFuIGdlb21ldHJ5IGNvbWVzIGZyb20gd2hhdCB0aGUgcnVuIGFjdGVkIG9uLiBBIHJlcGVhdCBvZiBhIGNsYXNzIHRoZVxuICAvLyBsb2cgYWxyZWFkeSByZWNvcmRzIGlzIHJlYWQgcGFzdCBieSBldmVyeSByZXBsYXksIGFuZCBsZXR0aW5nIG9uZSB0aHJvdWdoXG4gIC8vIGhlcmUgd291bGQgc3RyZXRjaCBhIHNwYW4gdG8gd2hlbmV2ZXIgYSBjb25jdXJyZW50IHJlcGxheSBjb21taXR0ZWQgaXQuXG4gIC8vIFNlYWxlZC1wb3NpdGlvbiBub29wcyBhcmUgZXhjbHVkZWQgZm9yIHRoZSBzYW1lIHJlYXNvbiB3aXRoIGEgZGlmZmVyZW50XG4gIC8vIGNsb2NrOiBhIG5vb3AncyBjcmVhdGVkQXQgaXMgdGhlIHNlYWxlcidzIHdhbGwgdGltZSwgd2hpY2ggY2FuIHBvc3RkYXRlXG4gIC8vIGV2ZXJ5IHJlYWwgZXZlbnQgYXJvdW5kIGl0LCBzbyBmZWVkaW5nIGl0IGludG8gc3BhbiBncm91cGluZyBvciB0aGVcbiAgLy8gbGF0ZXN0LWtub3duLXRpbWUgYm91bmQgd291bGQgY2hhcnQgdGhlIHNlYWxlcidzIHNjaGVkdWxlIGluc3RlYWQgb2YgdGhlXG4gIC8vIHJ1bidzLiBUaGUgZXZlbnQgbGlzdHMgc3RpbGwgc2hvdyBib3RoLCBtYXJrZWQgd2l0aCB0aGUgcmVhc29uLlxuICBjb25zdCBkdXBsaWNhdGVFdmVudElkcyA9IGZpbmREdXBsaWNhdGVFdmVudElkcyhldmVudHMsIHtcbiAgICBpc0NvbXBsZXRlSGlzdG9yeSxcbiAgfSk7XG4gIGNvbnN0IGFjdGVkT25FdmVudHMgPSBldmVudHMuZmlsdGVyKFxuICAgIChldmVudCkgPT5cbiAgICAgICFkdXBsaWNhdGVFdmVudElkcy5oYXMoZXZlbnQuZXZlbnRJZCkgJiYgIWlzU2VhbGVkTm9vcEV2ZW50KGV2ZW50KVxuICApO1xuXG4gIGNvbnN0IGdyb3VwZWRFdmVudHMgPSBncm91cEV2ZW50c0J5Q29ycmVsYXRpb24oYWN0ZWRPbkV2ZW50cyk7XG4gIGNvbnN0IGxhdGVzdEtub3duVGltZSA9IGNvbXB1dGVMYXRlc3RLbm93blRpbWUoYWN0ZWRPbkV2ZW50cywgcnVuKTtcbiAgY29uc3QgeyBydW5TcGFuLCBzcGFucyB9ID0gYnVpbGRTcGFucyhcbiAgICBydW4sXG4gICAgZ3JvdXBlZEV2ZW50cyxcbiAgICBub3csXG4gICAgbGF0ZXN0S25vd25UaW1lXG4gICk7XG4gIGNvbnN0IHNvcnRlZENhc2NhZGluZ1NwYW5zID0gY2FzY2FkZVNwYW5zKHJ1blNwYW4sIHNwYW5zKTtcblxuICAvLyBDb21wdXRlIGtub3duIGR1cmF0aW9uIHJlbGF0aXZlIHRvIHRyYWNlIHN0YXJ0XG4gIGNvbnN0IHRyYWNlU3RhcnRNcyA9IG90ZWxUaW1lVG9NcyhydW5TcGFuLnN0YXJ0VGltZSk7XG4gIGNvbnN0IGtub3duRHVyYXRpb25NcyA9IGxhdGVzdEtub3duVGltZS5nZXRUaW1lKCkgLSB0cmFjZVN0YXJ0TXM7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFjZUlkOiBydW4ucnVuSWQsXG4gICAgcm9vdFNwYW5JZDogcnVuLnJ1bklkLFxuICAgIHNwYW5zOiBzb3J0ZWRDYXNjYWRpbmdTcGFucyxcbiAgICByZXNvdXJjZXM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3dvcmtmbG93JyxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICdzZXJ2aWNlLm5hbWUnOiBXT1JLRkxPV19MSUJSQVJZLm5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0sXG4gICAga25vd25EdXJhdGlvbk1zOiBNYXRoLm1heCgwLCBrbm93bkR1cmF0aW9uTXMpLFxuICAgIGR1cGxpY2F0ZUV2ZW50SWRzLFxuICB9O1xufVxuIl19
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdHJhY2UtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLGVBQWUsRUFDZixlQUFlLEdBRWhCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsU0FBUyxFQUNULFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsVUFBVSxHQUNYLE1BQU0sdURBQXVELENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQzlFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR3BEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQVksRUFBVyxFQUFFLENBQ3ZELENBQUMsS0FBSyxDQUFDLGFBQWE7SUFDcEIsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ2hDLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUMxQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUV2Qzs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsTUFBZSxFQUNmLFFBQTRCLEVBQzVCLE1BQTBCO0lBRTFCLElBQUksUUFBUSxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN2QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLEtBQUssTUFBTSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQWFELFNBQVMsU0FBUyxDQUNoQixHQUF5QixFQUN6QixhQUFxQixFQUNyQixLQUFZO0lBRVosTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4QyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixPQUFPO0lBQ1QsQ0FBQztJQUNELEdBQUcsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBTSxVQUFVLHdCQUF3QixDQUFDLE1BQWU7SUFDdEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFDbEQsTUFBTSxjQUFjLEdBQVksRUFBRSxDQUFDO0lBQ25DLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0lBQy9DLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0lBRTlDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUMxQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQixTQUFTO1FBQ1gsQ0FBQztRQUVELElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3JDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzdDLFNBQVM7UUFDWCxDQUFDO1FBRUQsSUFBSSx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM5QyxTQUFTLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1QyxTQUFTO1FBQ1gsQ0FBQztRQUVELElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3JDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hELFNBQVM7UUFDWCxDQUFDO1FBRUQsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDO0FBQ3JFLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUscUJBQXFCO0FBQ3JCLDhFQUE4RTtBQUU5RTs7OztHQUlHO0FBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxNQUFlLEVBQUUsR0FBZ0I7SUFDL0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQy9DLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1RSxJQUFJLENBQUMsR0FBRyxNQUFNO1lBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQ0QsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQ2pCLEdBQWdCLEVBQ2hCLGFBQTRCLEVBQzVCLEdBQVMsRUFDVCxlQUFxQixFQUNyQixpQkFBcUM7SUFFckMsc0VBQXNFO0lBQ3RFLDRFQUE0RTtJQUM1RSxzRUFBc0U7SUFDdEUsTUFBTSxXQUFXLEdBQUcsZUFBZSxDQUFDO0lBQ3BDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDO0lBRXpDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNoRSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixDQUFDLENBQUM7U0FDbkUsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFnQixFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBRWpELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUM1RCxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDaEQsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFnQixFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBRWpELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUM3RCxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1NBQzNELE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBZ0IsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztJQUVqRCxPQUFPO1FBQ0wsT0FBTyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUM7UUFDMUQsS0FBSyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsR0FBRyxTQUFTLEVBQUUsR0FBRyxTQUFTLENBQUM7S0FDbEQsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxPQUFhLEVBQUUsS0FBYTtJQUNoRCxNQUFNLFdBQVcsR0FBRztRQUNsQixPQUFPO1FBQ1AsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdCLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDekMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6QyxPQUFPLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDekIsQ0FBQyxDQUFDO0tBQ0gsQ0FBQztJQUVGLE9BQU8sV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNyQyxNQUFNLFlBQVksR0FDaEIsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRSxPQUFPO1lBQ0wsR0FBRyxJQUFJO1lBQ1AsWUFBWTtTQUNiLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFpQkQsTUFBTSxVQUFVLFVBQVUsQ0FDeEIsR0FBZ0IsRUFDaEIsTUFBZSxFQUNmLEdBQVM7QUFDVDs7Ozs7R0FLRztBQUNILEVBQ0UsaUJBQWlCLEdBQUcsS0FBSyxFQUN6QixpQkFBaUIsTUFJZixFQUFFO0lBRU4sMEVBQTBFO0lBQzFFLDRFQUE0RTtJQUM1RSwwRUFBMEU7SUFDMUUsMEVBQTBFO0lBQzFFLDBFQUEwRTtJQUMxRSxzRUFBc0U7SUFDdEUsMkVBQTJFO0lBQzNFLGtFQUFrRTtJQUNsRSxNQUFNLGlCQUFpQixHQUFHLHFCQUFxQixDQUFDLE1BQU0sRUFBRTtRQUN0RCxpQkFBaUI7S0FDbEIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDakMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNSLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUNyRSxDQUFDO0lBRUYsTUFBTSxhQUFhLEdBQUcsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUQsTUFBTSxlQUFlLEdBQUcsc0JBQXNCLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsVUFBVSxDQUNuQyxHQUFHLEVBQ0gsYUFBYSxFQUNiLEdBQUcsRUFDSCxlQUFlLEVBQ2YsaUJBQWlCLENBQ2xCLENBQUM7SUFDRixNQUFNLG9CQUFvQixHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFMUQsaURBQWlEO0lBQ2pELE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckQsTUFBTSxlQUFlLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxHQUFHLFlBQVksQ0FBQztJQUVqRSxPQUFPO1FBQ0wsT0FBTyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1FBQ2xCLFVBQVUsRUFBRSxHQUFHLENBQUMsS0FBSztRQUNyQixLQUFLLEVBQUUsb0JBQW9CO1FBQzNCLFNBQVMsRUFBRTtZQUNUO2dCQUNFLElBQUksRUFBRSxVQUFVO2dCQUNoQixVQUFVLEVBQUU7b0JBQ1YsY0FBYyxFQUFFLGdCQUFnQixDQUFDLElBQUk7aUJBQ3RDO2FBQ0Y7U0FDRjtRQUNELGVBQWUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUM7UUFDN0MsaUJBQWlCO0tBQ2xCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCdWlsZHMgYSBjb21wbGV0ZSB0cmFjZSBmcm9tIGEgV29ya2Zsb3dSdW4gYW5kIGl0cyBFdmVudHMuXG4gKlxuICogVGhpcyBtb2R1bGUgZ3JvdXBzIHJhdyBldmVudHMgYnkgY29ycmVsYXRpb24gSUQgYW5kIGVudGl0eSB0eXBlLFxuICogY29udmVydHMgZWFjaCBncm91cCBpbnRvIGFuIE9wZW5UZWxlbWV0cnktc3R5bGUgU3BhbiwgYW5kIHJldHVybnNcbiAqIGEgZnVsbHktZm9ybWVkIFRyYWNlIHJlYWR5IGZvciB0aGUgdHJhY2Ugdmlld2VyLlxuICovXG5cbmltcG9ydCB7XG4gIHR5cGUgRXZlbnQsXG4gIGlzSG9va0xpZmVjeWNsZUV2ZW50VHlwZSxcbiAgaXNTdGVwRXZlbnRUeXBlLFxuICBpc1dhaXRFdmVudFR5cGUsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICB0eXBlIEdldFN0ZXBBdHRyaWJ1dGVzLFxuICBnZXRFdmVudFRpbWVzdGFtcCxcbiAgaG9va1RvU3BhbixcbiAgcnVuVG9TcGFuLFxuICBzdGVwVG9TcGFuLFxuICBXT1JLRkxPV19MSUJSQVJZLFxuICB3YWl0VG9TcGFuLFxufSBmcm9tICcuLi9jb21wb25lbnRzL3dvcmtmbG93LXRyYWNlcy90cmFjZS1zcGFuLWNvbnN0cnVjdGlvbic7XG5pbXBvcnQgeyBvdGVsVGltZVRvTXMgfSBmcm9tICcuLi9jb21wb25lbnRzL3dvcmtmbG93LXRyYWNlcy90cmFjZS10aW1lLXV0aWxzJztcbmltcG9ydCB7IGZpbmREdXBsaWNhdGVFdmVudElkcyB9IGZyb20gJy4vZHVwbGljYXRlLWV2ZW50cyc7XG5pbXBvcnQgeyBpc1NlYWxlZE5vb3BFdmVudCB9IGZyb20gJy4vc2VhbGVkLWV2ZW50cyc7XG5pbXBvcnQgdHlwZSB7IFNwYW4gfSBmcm9tICcuL3RyYWNlLXR5cGVzJztcblxuLyoqXG4gKiBFdmVudHMgdGhhdCBiZWxvbmcgdG8gdGhlIHJ1biByb290IHNwYW4gcmF0aGVyIHRoYW4gYSBjaGlsZCBlbnRpdHkgc3Bhbi5cbiAqIE1pcnJvcnMgdGhlIGZhbGx0aHJvdWdoIGxvZ2ljIGluIHtAbGluayBncm91cEV2ZW50c0J5Q29ycmVsYXRpb259OiBldmVudHNcbiAqIHdpdGhvdXQgYSBjb3JyZWxhdGlvbklkIChydW4gbGlmZWN5Y2xlKSBwbHVzIGNvcnJlbGF0ZWQgZXZlbnRzIHRoYXQgYXJlbid0XG4gKiBzdGVwL3RpbWVyL2hvb2sgZXZlbnRzIChlLmcuIGBhdHRyX3NldGAsIHdob3NlIGNvcnJlbGF0aW9uSWQgaXMgYSBkZWR1cFxuICogdG9rZW4gcmF0aGVyIHRoYW4gYSBjaGlsZCBlbnRpdHkgSUQpLlxuICovXG5leHBvcnQgY29uc3QgaXNSdW5MZXZlbEV2ZW50ID0gKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4gPT5cbiAgIWV2ZW50LmNvcnJlbGF0aW9uSWQgfHxcbiAgKCFpc1dhaXRFdmVudFR5cGUoZXZlbnQuZXZlbnRUeXBlKSAmJlxuICAgICFpc0hvb2tMaWZlY3ljbGVFdmVudFR5cGUoZXZlbnQuZXZlbnRUeXBlKSAmJlxuICAgICFpc1N0ZXBFdmVudFR5cGUoZXZlbnQuZXZlbnRUeXBlKSk7XG5cbi8qKlxuICogRmlsdGVyIHRoZSByYXcgZXZlbnQgbGlzdCBkb3duIHRvIHRoZSBldmVudHMgZm9yIGEgc2VsZWN0ZWQgc3Bhbi5cbiAqIEZvciB0aGUgcnVuIHJvb3Qgc3BhbiB0aGlzIHJldHVybnMgcnVuLWxldmVsIGV2ZW50cyAoc2VlXG4gKiB7QGxpbmsgaXNSdW5MZXZlbEV2ZW50fSk7IGZvciBjaGlsZCBzcGFucyBpdCByZXR1cm5zIHRoZSBldmVudHNcbiAqIGNvcnJlbGF0ZWQgdG8gdGhhdCBzcGFuJ3MgSUQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJTcGFuUmF3RXZlbnRzKFxuICBldmVudHM6IEV2ZW50W10sXG4gIHJlc291cmNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHNwYW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBFdmVudFtdIHtcbiAgaWYgKHJlc291cmNlID09PSAncnVuJykge1xuICAgIHJldHVybiBldmVudHMuZmlsdGVyKGlzUnVuTGV2ZWxFdmVudCk7XG4gIH1cbiAgaWYgKCFzcGFuSWQpIHJldHVybiBbXTtcbiAgcmV0dXJuIGV2ZW50cy5maWx0ZXIoKGUpID0+IGUuY29ycmVsYXRpb25JZCA9PT0gc3BhbklkKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFdmVudCBncm91cGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCB0eXBlIEdyb3VwZWRFdmVudHMgPSB7XG4gIGV2ZW50c0J5U3RlcElkOiBNYXA8c3RyaW5nLCBFdmVudFtdPjtcbiAgcnVuTGV2ZWxFdmVudHM6IEV2ZW50W107XG4gIHRpbWVyRXZlbnRzOiBNYXA8c3RyaW5nLCBFdmVudFtdPjtcbiAgaG9va0V2ZW50czogTWFwPHN0cmluZywgRXZlbnRbXT47XG59O1xuXG5mdW5jdGlvbiBwdXNoRXZlbnQoXG4gIG1hcDogTWFwPHN0cmluZywgRXZlbnRbXT4sXG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZyxcbiAgZXZlbnQ6IEV2ZW50XG4pIHtcbiAgY29uc3QgZXhpc3RpbmcgPSBtYXAuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICBpZiAoZXhpc3RpbmcpIHtcbiAgICBleGlzdGluZy5wdXNoKGV2ZW50KTtcbiAgICByZXR1cm47XG4gIH1cbiAgbWFwLnNldChjb3JyZWxhdGlvbklkLCBbZXZlbnRdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwRXZlbnRzQnlDb3JyZWxhdGlvbihldmVudHM6IEV2ZW50W10pOiBHcm91cGVkRXZlbnRzIHtcbiAgY29uc3QgZXZlbnRzQnlTdGVwSWQgPSBuZXcgTWFwPHN0cmluZywgRXZlbnRbXT4oKTtcbiAgY29uc3QgcnVuTGV2ZWxFdmVudHM6IEV2ZW50W10gPSBbXTtcbiAgY29uc3QgdGltZXJFdmVudHMgPSBuZXcgTWFwPHN0cmluZywgRXZlbnRbXT4oKTtcbiAgY29uc3QgaG9va0V2ZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBFdmVudFtdPigpO1xuXG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IGV2ZW50LmNvcnJlbGF0aW9uSWQ7XG4gICAgaWYgKCFjb3JyZWxhdGlvbklkKSB7XG4gICAgICBydW5MZXZlbEV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpc1dhaXRFdmVudFR5cGUoZXZlbnQuZXZlbnRUeXBlKSkge1xuICAgICAgcHVzaEV2ZW50KHRpbWVyRXZlbnRzLCBjb3JyZWxhdGlvbklkLCBldmVudCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNIb29rTGlmZWN5Y2xlRXZlbnRUeXBlKGV2ZW50LmV2ZW50VHlwZSkpIHtcbiAgICAgIHB1c2hFdmVudChob29rRXZlbnRzLCBjb3JyZWxhdGlvbklkLCBldmVudCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNTdGVwRXZlbnRUeXBlKGV2ZW50LmV2ZW50VHlwZSkpIHtcbiAgICAgIHB1c2hFdmVudChldmVudHNCeVN0ZXBJZCwgY29ycmVsYXRpb25JZCwgZXZlbnQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcnVuTGV2ZWxFdmVudHMucHVzaChldmVudCk7XG4gIH1cblxuICByZXR1cm4geyBldmVudHNCeVN0ZXBJZCwgcnVuTGV2ZWxFdmVudHMsIHRpbWVyRXZlbnRzLCBob29rRXZlbnRzIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVHJhY2UgY29uc3RydWN0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbGF0ZXN0IGtub3duIGV2ZW50IHRpbWUgZnJvbSB0aGUgZXZlbnRzIGxpc3QuXG4gKiBBY3RpdmUgKGluLXByb2dyZXNzKSBjaGlsZCBzcGFucyBhcmUgY2FwcGVkIGF0IHRoaXMgdGltZSBpbnN0ZWFkIG9mIGBub3dgLFxuICogc28gdGhleSBvbmx5IGV4dGVuZCBhcyBmYXIgYXMgb3VyIGRhdGEgZ29lcy5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUxhdGVzdEtub3duVGltZShldmVudHM6IEV2ZW50W10sIHJ1bjogV29ya2Zsb3dSdW4pOiBEYXRlIHtcbiAgbGV0IGxhdGVzdCA9IG5ldyBEYXRlKHJ1bi5jcmVhdGVkQXQpLmdldFRpbWUoKTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBjb25zdCB0ID0gKGdldEV2ZW50VGltZXN0YW1wKGV2ZW50KSA/PyBuZXcgRGF0ZShldmVudC5jcmVhdGVkQXQpKS5nZXRUaW1lKCk7XG4gICAgaWYgKHQgPiBsYXRlc3QpIGxhdGVzdCA9IHQ7XG4gIH1cbiAgcmV0dXJuIG5ldyBEYXRlKGxhdGVzdCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3BhbnMoXG4gIHJ1bjogV29ya2Zsb3dSdW4sXG4gIGdyb3VwZWRFdmVudHM6IEdyb3VwZWRFdmVudHMsXG4gIG5vdzogRGF0ZSxcbiAgbGF0ZXN0S25vd25UaW1lOiBEYXRlLFxuICBnZXRTdGVwQXR0cmlidXRlcz86IEdldFN0ZXBBdHRyaWJ1dGVzXG4pIHtcbiAgLy8gQWN0aXZlIGNoaWxkIHNwYW5zIGNhcCBhdCBsYXRlc3RLbm93blRpbWUgc28gdGhleSBkb24ndCBleHRlbmQgaW50b1xuICAvLyB1bmtub3duIHRlcnJpdG9yeS4gRXZlbiB3aGVuIHRoZSBydW4gaXMgY29tcGxldGVkLCB3ZSBtYXkgbm90IGhhdmUgbG9hZGVkXG4gIC8vIGFsbCBldmVudHMgeWV0LCBzbyBhbHdheXMgdXNlIHRoZSBsYXRlc3QgZXZlbnQgd2UndmUgYWN0dWFsbHkgc2Vlbi5cbiAgY29uc3QgY2hpbGRNYXhFbmQgPSBsYXRlc3RLbm93blRpbWU7XG4gIGNvbnN0IHJ1bk1heEVuZCA9IHJ1bi5jb21wbGV0ZWRBdCA/PyBub3c7XG5cbiAgY29uc3Qgc3RlcFNwYW5zID0gQXJyYXkuZnJvbShncm91cGVkRXZlbnRzLmV2ZW50c0J5U3RlcElkLnZhbHVlcygpKVxuICAgIC5tYXAoKGV2ZW50cykgPT4gc3RlcFRvU3BhbihldmVudHMsIGNoaWxkTWF4RW5kLCBnZXRTdGVwQXR0cmlidXRlcykpXG4gICAgLmZpbHRlcigoc3Bhbik6IHNwYW4gaXMgU3BhbiA9PiBzcGFuICE9PSBudWxsKTtcblxuICBjb25zdCBob29rU3BhbnMgPSBBcnJheS5mcm9tKGdyb3VwZWRFdmVudHMuaG9va0V2ZW50cy52YWx1ZXMoKSlcbiAgICAubWFwKChldmVudHMpID0+IGhvb2tUb1NwYW4oZXZlbnRzLCBjaGlsZE1heEVuZCkpXG4gICAgLmZpbHRlcigoc3Bhbik6IHNwYW4gaXMgU3BhbiA9PiBzcGFuICE9PSBudWxsKTtcblxuICBjb25zdCB3YWl0U3BhbnMgPSBBcnJheS5mcm9tKGdyb3VwZWRFdmVudHMudGltZXJFdmVudHMudmFsdWVzKCkpXG4gICAgLm1hcCgoZXZlbnRzKSA9PiB3YWl0VG9TcGFuKGV2ZW50cywgY2hpbGRNYXhFbmQsIHJ1bk1heEVuZCkpXG4gICAgLmZpbHRlcigoc3Bhbik6IHNwYW4gaXMgU3BhbiA9PiBzcGFuICE9PSBudWxsKTtcblxuICByZXR1cm4ge1xuICAgIHJ1blNwYW46IHJ1blRvU3BhbihydW4sIGdyb3VwZWRFdmVudHMucnVuTGV2ZWxFdmVudHMsIG5vdyksXG4gICAgc3BhbnM6IFsuLi5zdGVwU3BhbnMsIC4uLmhvb2tTcGFucywgLi4ud2FpdFNwYW5zXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2FzY2FkZVNwYW5zKHJ1blNwYW46IFNwYW4sIHNwYW5zOiBTcGFuW10pIHtcbiAgY29uc3Qgc29ydGVkU3BhbnMgPSBbXG4gICAgcnVuU3BhbixcbiAgICAuLi5zcGFucy5zbGljZSgpLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFTdGFydCA9IG90ZWxUaW1lVG9NcyhhLnN0YXJ0VGltZSk7XG4gICAgICBjb25zdCBiU3RhcnQgPSBvdGVsVGltZVRvTXMoYi5zdGFydFRpbWUpO1xuICAgICAgcmV0dXJuIGFTdGFydCAtIGJTdGFydDtcbiAgICB9KSxcbiAgXTtcblxuICByZXR1cm4gc29ydGVkU3BhbnMubWFwKChzcGFuLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudFNwYW5JZCA9XG4gICAgICBpbmRleCA9PT0gMCA/IHVuZGVmaW5lZCA6IFN0cmluZyhzb3J0ZWRTcGFuc1tpbmRleCAtIDFdLnNwYW5JZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNwYW4sXG4gICAgICBwYXJlbnRTcGFuSWQsXG4gICAgfTtcbiAgfSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2VXaXRoTWV0YSB7XG4gIHRyYWNlSWQ6IHN0cmluZztcbiAgcm9vdFNwYW5JZDogc3RyaW5nO1xuICBzcGFuczogU3BhbltdO1xuICByZXNvdXJjZXM6IHsgbmFtZTogc3RyaW5nOyBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH1bXTtcbiAgLyoqIER1cmF0aW9uIGluIG1zIGZyb20gdHJhY2Ugc3RhcnQgdG8gdGhlIGxhdGVzdCBrbm93biBldmVudC4gKi9cbiAga25vd25EdXJhdGlvbk1zOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnRzIGxlZnQgb3V0IG9mIHRoZSBzcGFuIGdlb21ldHJ5IGFzIHJlcGVhdHMuIEVtcHR5IHVubGVzcyB0aGVcbiAgICogY2FsbGVyIHZvdWNoZWQgZm9yIHRoZSBsb2cgYmVpbmcgY29tcGxldGUuIFNlZVxuICAgKiB7QGxpbmsgZmluZER1cGxpY2F0ZUV2ZW50SWRzfS5cbiAgICovXG4gIGR1cGxpY2F0ZUV2ZW50SWRzOiBSZWFkb25seVNldDxzdHJpbmc+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUcmFjZShcbiAgcnVuOiBXb3JrZmxvd1J1bixcbiAgZXZlbnRzOiBFdmVudFtdLFxuICBub3c6IERhdGUsXG4gIC8qKlxuICAgKiBXaGV0aGVyIGBldmVudHNgIGlzIHRoZSBydW4ncyB3aG9sZSBsb2cuIERlZmF1bHRzIHRvIGZhbHNlLCB3aGljaCBidWlsZHNcbiAgICogdGhlIHRyYWNlIGZyb20gZXZlcnkgZXZlbnQ6IG9uIGEgc3Vic2V0IHRoZXJlIGlzIG5vIHdheSB0byB0ZWxsIGEgcmVwZWF0XG4gICAqIGZyb20gdGhlIG9ubHkgY29weSB0aGUgY2FsbGVyIHdhcyBnaXZlbiwgYW5kIGRyb3BwaW5nIHRoZSB3cm9uZyBvbmUgbW92ZXNcbiAgICogYSBzcGFuLiBTZWUge0BsaW5rIGZpbmREdXBsaWNhdGVFdmVudElkc30uXG4gICAqL1xuICB7XG4gICAgaXNDb21wbGV0ZUhpc3RvcnkgPSBmYWxzZSxcbiAgICBnZXRTdGVwQXR0cmlidXRlcyxcbiAgfToge1xuICAgIGlzQ29tcGxldGVIaXN0b3J5PzogYm9vbGVhbjtcbiAgICBnZXRTdGVwQXR0cmlidXRlcz86IEdldFN0ZXBBdHRyaWJ1dGVzO1xuICB9ID0ge31cbik6IFRyYWNlV2l0aE1ldGEge1xuICAvLyBTcGFuIGdlb21ldHJ5IGNvbWVzIGZyb20gd2hhdCB0aGUgcnVuIGFjdGVkIG9uLiBBIHJlcGVhdCBvZiBhIGNsYXNzIHRoZVxuICAvLyBsb2cgYWxyZWFkeSByZWNvcmRzIGlzIHJlYWQgcGFzdCBieSBldmVyeSByZXBsYXksIGFuZCBsZXR0aW5nIG9uZSB0aHJvdWdoXG4gIC8vIGhlcmUgd291bGQgc3RyZXRjaCBhIHNwYW4gdG8gd2hlbmV2ZXIgYSBjb25jdXJyZW50IHJlcGxheSBjb21taXR0ZWQgaXQuXG4gIC8vIFNlYWxlZC1wb3NpdGlvbiBub29wcyBhcmUgZXhjbHVkZWQgZm9yIHRoZSBzYW1lIHJlYXNvbiB3aXRoIGEgZGlmZmVyZW50XG4gIC8vIGNsb2NrOiBhIG5vb3AncyBjcmVhdGVkQXQgaXMgdGhlIHNlYWxlcidzIHdhbGwgdGltZSwgd2hpY2ggY2FuIHBvc3RkYXRlXG4gIC8vIGV2ZXJ5IHJlYWwgZXZlbnQgYXJvdW5kIGl0LCBzbyBmZWVkaW5nIGl0IGludG8gc3BhbiBncm91cGluZyBvciB0aGVcbiAgLy8gbGF0ZXN0LWtub3duLXRpbWUgYm91bmQgd291bGQgY2hhcnQgdGhlIHNlYWxlcidzIHNjaGVkdWxlIGluc3RlYWQgb2YgdGhlXG4gIC8vIHJ1bidzLiBUaGUgZXZlbnQgbGlzdHMgc3RpbGwgc2hvdyBib3RoLCBtYXJrZWQgd2l0aCB0aGUgcmVhc29uLlxuICBjb25zdCBkdXBsaWNhdGVFdmVudElkcyA9IGZpbmREdXBsaWNhdGVFdmVudElkcyhldmVudHMsIHtcbiAgICBpc0NvbXBsZXRlSGlzdG9yeSxcbiAgfSk7XG4gIGNvbnN0IGFjdGVkT25FdmVudHMgPSBldmVudHMuZmlsdGVyKFxuICAgIChldmVudCkgPT5cbiAgICAgICFkdXBsaWNhdGVFdmVudElkcy5oYXMoZXZlbnQuZXZlbnRJZCkgJiYgIWlzU2VhbGVkTm9vcEV2ZW50KGV2ZW50KVxuICApO1xuXG4gIGNvbnN0IGdyb3VwZWRFdmVudHMgPSBncm91cEV2ZW50c0J5Q29ycmVsYXRpb24oYWN0ZWRPbkV2ZW50cyk7XG4gIGNvbnN0IGxhdGVzdEtub3duVGltZSA9IGNvbXB1dGVMYXRlc3RLbm93blRpbWUoYWN0ZWRPbkV2ZW50cywgcnVuKTtcbiAgY29uc3QgeyBydW5TcGFuLCBzcGFucyB9ID0gYnVpbGRTcGFucyhcbiAgICBydW4sXG4gICAgZ3JvdXBlZEV2ZW50cyxcbiAgICBub3csXG4gICAgbGF0ZXN0S25vd25UaW1lLFxuICAgIGdldFN0ZXBBdHRyaWJ1dGVzXG4gICk7XG4gIGNvbnN0IHNvcnRlZENhc2NhZGluZ1NwYW5zID0gY2FzY2FkZVNwYW5zKHJ1blNwYW4sIHNwYW5zKTtcblxuICAvLyBDb21wdXRlIGtub3duIGR1cmF0aW9uIHJlbGF0aXZlIHRvIHRyYWNlIHN0YXJ0XG4gIGNvbnN0IHRyYWNlU3RhcnRNcyA9IG90ZWxUaW1lVG9NcyhydW5TcGFuLnN0YXJ0VGltZSk7XG4gIGNvbnN0IGtub3duRHVyYXRpb25NcyA9IGxhdGVzdEtub3duVGltZS5nZXRUaW1lKCkgLSB0cmFjZVN0YXJ0TXM7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFjZUlkOiBydW4ucnVuSWQsXG4gICAgcm9vdFNwYW5JZDogcnVuLnJ1bklkLFxuICAgIHNwYW5zOiBzb3J0ZWRDYXNjYWRpbmdTcGFucyxcbiAgICByZXNvdXJjZXM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3dvcmtmbG93JyxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICdzZXJ2aWNlLm5hbWUnOiBXT1JLRkxPV19MSUJSQVJZLm5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0sXG4gICAga25vd25EdXJhdGlvbk1zOiBNYXRoLm1heCgwLCBrbm93bkR1cmF0aW9uTXMpLFxuICAgIGR1cGxpY2F0ZUV2ZW50SWRzLFxuICB9O1xufVxuIl19
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@workflow/web-shared",
3
3
  "description": "Shared components for Workflow Observability UI",
4
- "version": "5.0.0-beta.44",
4
+ "version": "5.0.0-beta.47",
5
5
  "private": false,
6
6
  "files": [
7
7
  "dist",
@@ -55,9 +55,9 @@
55
55
  "streamdown": "2.3.0",
56
56
  "tailwind-merge": "3.5.0",
57
57
  "tailwindcss": "4",
58
- "@workflow/core": "5.0.0-beta.44",
59
- "@workflow/utils": "5.0.0-beta.9",
60
- "@workflow/world": "5.0.0-beta.29"
58
+ "@workflow/core": "5.0.0-beta.47",
59
+ "@workflow/utils": "5.0.0-beta.10",
60
+ "@workflow/world": "5.0.0-beta.32"
61
61
  },
62
62
  "devDependencies": {
63
63
  "@biomejs/biome": "^2.4.4",
@@ -67,7 +67,7 @@
67
67
  "ai": "6.0.116",
68
68
  "typescript": "^6.0.3",
69
69
  "vitest": "^4.1.10",
70
- "@workflow/errors": "5.0.0-beta.18",
70
+ "@workflow/errors": "5.0.0-beta.19",
71
71
  "@workflow/tsconfig": "5.0.0-beta.0"
72
72
  },
73
73
  "scripts": {
@@ -1007,10 +1007,10 @@ export function EventRow({
1007
1007
  }, []);
1008
1008
 
1009
1009
  // When encryption key changes and this event was previously loaded,
1010
- // re-load to get decrypted data
1010
+ // re-load to get decrypted data. Keep the encrypted value visible until the
1011
+ // refreshed data arrives so the payload does not flash empty while decrypting.
1011
1012
  useEffect(() => {
1012
1013
  if (encryptionKey && hasAttemptedLoad && onLoadEventData) {
1013
- setLoadedEventData(null);
1014
1014
  setHasAttemptedLoad(false);
1015
1015
  onLoadEventData(event)
1016
1016
  .then((data) => {
@@ -0,0 +1,54 @@
1
+ 'use client';
2
+
3
+ import { useEffect, useState } from 'react';
4
+
5
+ function isAltModifierKey(key: string): boolean {
6
+ return key === 'Alt' || key === 'AltGraph';
7
+ }
8
+
9
+ function isTypingTarget(target: EventTarget | null): boolean {
10
+ return (
11
+ target instanceof HTMLInputElement ||
12
+ target instanceof HTMLTextAreaElement ||
13
+ (target instanceof HTMLElement && target.isContentEditable)
14
+ );
15
+ }
16
+
17
+ /**
18
+ * Whether Alt/Option is held, for the timeline delta overlay.
19
+ *
20
+ * preventDefault stops Chrome from taking the menu bar (which kills hover).
21
+ * Capture-phase keys; pointermove recovers if keydown was missed; blur
22
+ * clears after Alt+Tab.
23
+ */
24
+ export function useAltHeld(): { altHeld: boolean } {
25
+ const [altHeld, setAltHeld] = useState(false);
26
+
27
+ useEffect(() => {
28
+ const onKeyDown = (e: KeyboardEvent): void => {
29
+ if (!isAltModifierKey(e.key)) return;
30
+ if (!isTypingTarget(e.target)) {
31
+ e.preventDefault();
32
+ }
33
+ setAltHeld(true);
34
+ };
35
+ const onKeyUp = (e: KeyboardEvent): void => {
36
+ if (isAltModifierKey(e.key)) setAltHeld(false);
37
+ };
38
+ const onBlur = (): void => setAltHeld(false);
39
+ const onPointerMove = (e: PointerEvent): void => setAltHeld(e.altKey);
40
+
41
+ window.addEventListener('keydown', onKeyDown, true);
42
+ window.addEventListener('keyup', onKeyUp, true);
43
+ window.addEventListener('blur', onBlur);
44
+ window.addEventListener('pointermove', onPointerMove, true);
45
+ return () => {
46
+ window.removeEventListener('keydown', onKeyDown, true);
47
+ window.removeEventListener('keyup', onKeyUp, true);
48
+ window.removeEventListener('blur', onBlur);
49
+ window.removeEventListener('pointermove', onPointerMove, true);
50
+ };
51
+ }, []);
52
+
53
+ return { altHeld };
54
+ }
@@ -27,6 +27,7 @@ import {
27
27
  type TimelineHover,
28
28
  } from './components/timeline';
29
29
  import { TraceShortcutHelper } from './components/trace-shortcut-helper';
30
+ import { useAltHeld } from './components/use-alt-held';
30
31
  import { ROW_HEIGHT_PX, scrollRowIntoView } from './components/use-row-window';
31
32
  import { ActiveSpanProvider, useActiveSpan } from './context';
32
33
  import { searchSpans } from './search';
@@ -370,29 +371,16 @@ function TraceViewerContent({
370
371
  [setActiveSpan, scrollSpanIntoView, cancelPendingZoom, focusViewportOnSpan]
371
372
  );
372
373
 
373
- const [altHeld, setAltHeld] = useState(false);
374
+ const { altHeld } = useAltHeld();
374
375
 
375
376
  useEffect(() => {
376
377
  const onKeyDown = (e: KeyboardEvent): void => {
377
378
  if (e.key === 'Escape') {
378
379
  handleClearActiveSpan();
379
- } else if (e.key === 'Alt') {
380
- setAltHeld(true);
381
380
  }
382
381
  };
383
- const onKeyUp = (e: KeyboardEvent): void => {
384
- if (e.key === 'Alt') setAltHeld(false);
385
- };
386
- const onBlur = (): void => setAltHeld(false);
387
-
388
382
  window.addEventListener('keydown', onKeyDown);
389
- window.addEventListener('keyup', onKeyUp);
390
- window.addEventListener('blur', onBlur);
391
- return () => {
392
- window.removeEventListener('keydown', onKeyDown);
393
- window.removeEventListener('keyup', onKeyUp);
394
- window.removeEventListener('blur', onBlur);
395
- };
383
+ return () => window.removeEventListener('keydown', onKeyDown);
396
384
  }, [handleClearActiveSpan]);
397
385
 
398
386
  const timelineRef = useRef<HTMLDivElement>(null);