sparkforensics-server 0.5.2 → 0.8.1

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 (445) hide show
  1. package/index.js +16 -7
  2. package/package.json +1 -1
  3. package/public/assets/AutoscalingChurn-DenWKTv-.js +1 -0
  4. package/public/assets/CacheUtilization-DLz7NdjV.js +1 -0
  5. package/public/assets/CachingOpportunity-zpQIqhzm.js +1 -0
  6. package/public/assets/ChartTheme-DAiARbLP.js +8 -0
  7. package/public/assets/ColdStart-C-9HjxWl.js +1 -0
  8. package/public/assets/ConfigAudit-D0V9tcrJ.js +1 -0
  9. package/public/assets/CoreUsageArea-yeerrljd.js +1 -0
  10. package/public/assets/Dashboard-DkUPrHKV.js +1 -0
  11. package/public/assets/DisclosureContext-DK1_iz6J.js +1 -0
  12. package/public/assets/DuplicatePlanSubtree-xDNDbCd3.js +1 -0
  13. package/public/assets/DurationHistogram-B6jsE0Ov.js +1 -0
  14. package/public/assets/EmptyState-C1uL40VU.js +1 -0
  15. package/public/assets/ExecutorUtilization-DXDZKmSc.js +1 -0
  16. package/public/assets/GcPressure-MRf7I4IG.js +1 -0
  17. package/public/assets/ImpactEstimate-Dm3xWbzV.js +1 -0
  18. package/public/assets/IncompleteRun-CaLOhMtf.js +1 -0
  19. package/public/assets/JobFailures-CzmzlvhO.js +1 -0
  20. package/public/assets/MemoryUtilization-AWUMUjCH.js +1 -0
  21. package/public/assets/NestedLoopJoin-C9sNr6Ss.js +1 -0
  22. package/public/assets/OverBroadcast-BOmRE6ca.js +1 -0
  23. package/public/assets/PartitionHint-BL2EmJfE.js +1 -0
  24. package/public/assets/PartitionSizing-BzBySvUq.js +1 -0
  25. package/public/assets/PlanExplorer-DdiQRcJU.js +1 -0
  26. package/public/assets/PlanGraphRoute-CIH9gBuR.js +1 -0
  27. package/public/assets/PlanView-B1hxzFRs.js +2 -0
  28. package/public/assets/PythonUdf-DvgCCueD.js +1 -0
  29. package/public/assets/RetryWaste-uXXu_CyM.js +1 -0
  30. package/public/assets/RowPagination-C-LzWkI5.js +1 -0
  31. package/public/assets/RowStatusCluster-Dbtmte7l.js +1 -0
  32. package/public/assets/ShuffleIO-nALwzC1_.js +1 -0
  33. package/public/assets/Skew-CHMEKgvk.js +1 -0
  34. package/public/assets/SlowHost-yyvjpHk6.js +1 -0
  35. package/public/assets/SmallFiles-y6odJ97n.js +1 -0
  36. package/public/assets/SpeculationWaste-C-SD2LOt.js +1 -0
  37. package/public/assets/Spill-DHTMmOup.js +1 -0
  38. package/public/assets/StageFailed-CQ3DxC9R.js +1 -0
  39. package/public/assets/StageFindingGroup-BgYLyj5q.js +1 -0
  40. package/public/assets/StageHeader-CIETkjVZ.js +1 -0
  41. package/public/assets/StagePill--P7PDd3s.js +1 -0
  42. package/public/assets/StageShape-BIv8vx_o.js +1 -0
  43. package/public/assets/StageSlowness-MMqzERxN.js +1 -0
  44. package/public/assets/Straggler-BgrY7AyW.js +1 -0
  45. package/public/assets/TaskFailures-BHHyKYTs.js +1 -0
  46. package/public/assets/TinyTask-DDScNhCl.js +1 -0
  47. package/public/assets/UnderBroadcast-CGIC04TI.js +1 -0
  48. package/public/assets/WidgetLeadSummary-CXFZP00C.js +1 -0
  49. package/public/assets/button-DbpTz2yk.js +1 -0
  50. package/public/assets/charts-vendor-CtTxwTeu.js +59 -0
  51. package/public/assets/composite-C9Nu2EI9.js +1 -0
  52. package/public/assets/d3-vendor-DNlD2-cz.js +1 -0
  53. package/public/assets/detector-registry-Bp8hrLua.js +2 -0
  54. package/public/assets/downsample-WmNM1qc9.js +1 -0
  55. package/public/assets/finding-anchor-Dr40LkS9.js +1 -0
  56. package/public/assets/findings-of-type-BL2u3RGZ.js +1 -0
  57. package/public/assets/impact-sort-mC5ISgX8.js +1 -0
  58. package/public/assets/inbox-KPU1Gppm.js +1 -0
  59. package/public/assets/index-CaRVPvAT.css +2 -0
  60. package/public/assets/index-fDiwfuoO.js +14 -0
  61. package/public/assets/inertValue-L9VxV0VE.js +1 -0
  62. package/public/assets/instrument-sans-latin-ext-wdth-normal-C5E2Gvlv.woff2 +0 -0
  63. package/public/assets/instrument-sans-latin-wdth-normal-BVScPF0l.woff2 +0 -0
  64. package/public/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  65. package/public/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  66. package/public/assets/layout.worker-CLcBHxVp.js +3 -0
  67. package/public/assets/{parser-worker-CA5RxqKc.js → parser-worker-CRIOPMOW.js} +8 -8
  68. package/public/assets/plan-graph-vendor-Ce6d4HU6.js +7 -0
  69. package/public/assets/react-vendor-C6KcUD36.js +9 -0
  70. package/public/assets/select-BHqOqun5.js +1 -0
  71. package/public/assets/toggle-DPeN6aNa.js +1 -0
  72. package/public/assets/toggle-group-Kl3uyHSr.js +1 -0
  73. package/public/assets/usePagedRows-BafD6bEN.js +1 -0
  74. package/public/assets/useRecentFiles-DzJZAoOT.js +3 -0
  75. package/public/assets/useRegisterFieldControl-pQv-ZDoU.js +1 -0
  76. package/public/assets/useScrollLock-BCxn_dMp.js +1 -0
  77. package/public/assets/useSortMode-DjrAN-z4.js +1 -0
  78. package/public/docs/404.html +3 -7
  79. package/public/docs/assets/{app.eYTPqTeq.js → app.1gvzd5Zb.js} +1 -1
  80. package/public/docs/assets/chunks/@localSearchIndexroot.DS2TQP5_.js +1 -0
  81. package/public/docs/assets/chunks/{VPLocalSearchBox.DsZrQKQR.js → VPLocalSearchBox.CNxT3s0I.js} +1 -1
  82. package/public/docs/assets/chunks/{theme.DsTNE2pE.js → theme.C5lLqUv7.js} +2 -2
  83. package/public/docs/assets/contributor-guide_architecture_board-widgets.md.CqKM_jEG.js +1 -0
  84. package/public/docs/assets/contributor-guide_architecture_board-widgets.md.CqKM_jEG.lean.js +1 -0
  85. package/public/docs/assets/{contributor-guide_architecture_board-widgets_caching-and-memory.md.8bH1HnZp.js → contributor-guide_architecture_board-widgets_caching-and-memory.md.BYDo3ClR.js} +1 -1
  86. package/public/docs/assets/contributor-guide_architecture_board-widgets_plan-advisor.md.ajUAVdbc.js +1 -0
  87. package/public/docs/assets/contributor-guide_architecture_board-widgets_visual-system-and-templating.md.WqY74T0T.js +1 -0
  88. package/public/docs/assets/contributor-guide_architecture_board-widgets_visual-system-and-templating.md.WqY74T0T.lean.js +1 -0
  89. package/public/docs/assets/contributor-guide_architecture_detector-contract.md.CHHgywoP.js +1 -0
  90. package/public/docs/assets/{contributor-guide_architecture_detector-contract.md.wj6Et6UD.lean.js → contributor-guide_architecture_detector-contract.md.CHHgywoP.lean.js} +1 -1
  91. package/public/docs/assets/contributor-guide_architecture_detector-contract_plan-attribution.md.DIz3_oz9.js +1 -0
  92. package/public/docs/assets/contributor-guide_architecture_detector-contract_plan-attribution.md.DIz3_oz9.lean.js +1 -0
  93. package/public/docs/assets/contributor-guide_architecture_detector-contract_threshold-tables.md.WH4tRHPL.js +1 -0
  94. package/public/docs/assets/{contributor-guide_architecture_detector-contract_threshold-tables.md.CKjWG56Y.lean.js → contributor-guide_architecture_detector-contract_threshold-tables.md.WH4tRHPL.lean.js} +1 -1
  95. package/public/docs/assets/{contributor-guide_architecture_drill-down.md.CqZPrdo9.js → contributor-guide_architecture_drill-down.md.yB-Hz2XT.js} +1 -1
  96. package/public/docs/assets/{contributor-guide_architecture_drill-down.md.CqZPrdo9.lean.js → contributor-guide_architecture_drill-down.md.yB-Hz2XT.lean.js} +1 -1
  97. package/public/docs/assets/contributor-guide_architecture_drill-down_plan-graph.md.BQZE04sw.js +1 -0
  98. package/public/docs/assets/{contributor-guide_architecture_drill-down_plan-graph.md.DwOozIEs.lean.js → contributor-guide_architecture_drill-down_plan-graph.md.BQZE04sw.lean.js} +1 -1
  99. package/public/docs/assets/contributor-guide_architecture_impact-estimation.md.K71YB-Rr.js +1 -0
  100. package/public/docs/assets/{contributor-guide_architecture_impact-estimation.md.CZv_ZGOp.lean.js → contributor-guide_architecture_impact-estimation.md.K71YB-Rr.lean.js} +1 -1
  101. package/public/docs/assets/contributor-guide_architecture_impact-estimation_caveats-tuning-and-coverage.md.DLCAffwn.js +1 -0
  102. package/public/docs/assets/{contributor-guide_architecture_impact-estimation_caveats-tuning-and-coverage.md.BUucRc0A.lean.js → contributor-guide_architecture_impact-estimation_caveats-tuning-and-coverage.md.DLCAffwn.lean.js} +1 -1
  103. package/public/docs/assets/contributor-guide_architecture_impact-estimation_stage-union-rollup.md.JFrzDMwo.js +1 -0
  104. package/public/docs/assets/contributor-guide_architecture_impact-estimation_stage-union-rollup.md.JFrzDMwo.lean.js +1 -0
  105. package/public/docs/assets/contributor-guide_architecture_overview.md.nxkpOhgf.js +1 -0
  106. package/public/docs/assets/contributor-guide_architecture_state-and-history_run-comparison-internals.md.U-9KMDFK.js +1 -0
  107. package/public/docs/assets/{contributor-guide_architecture_state-and-history_run-comparison-internals.md.CZA0JLtV.lean.js → contributor-guide_architecture_state-and-history_run-comparison-internals.md.U-9KMDFK.lean.js} +1 -1
  108. package/public/docs/assets/contributor-guide_architecture_widget-rendering.md.BrSz8Ezh.js +1 -0
  109. package/public/docs/assets/contributor-guide_architecture_widget-rendering_findings-tab.md.B7rjSF_h.js +1 -0
  110. package/public/docs/assets/contributor-guide_architecture_widget-rendering_findings-tab.md.B7rjSF_h.lean.js +1 -0
  111. package/public/docs/assets/{contributor-guide_architecture_widget-rendering_list-sort-mode.md.BuHKgH0C.js → contributor-guide_architecture_widget-rendering_list-sort-mode.md.37hcZJ7q.js} +1 -1
  112. package/public/docs/assets/{contributor-guide_architecture_widget-rendering_row-expand-contract.md.ZT89u9f1.js → contributor-guide_architecture_widget-rendering_row-expand-contract.md.mK_VmAWk.js} +1 -1
  113. package/public/docs/assets/{contributor-guide_architecture_worker-protocol.md.BAnhi2-d.js → contributor-guide_architecture_worker-protocol.md.Br6OE7RW.js} +1 -1
  114. package/public/docs/assets/contributor-guide_architecture_worker-protocol.md.Br6OE7RW.lean.js +1 -0
  115. package/public/docs/assets/contributor-guide_architecture_worker-protocol_cli-and-mcp.md.IVyaXrGe.js +1 -0
  116. package/public/docs/assets/{contributor-guide_architecture_worker-protocol_cli-and-mcp.md.DC1YqXBp.lean.js → contributor-guide_architecture_worker-protocol_cli-and-mcp.md.IVyaXrGe.lean.js} +1 -1
  117. package/public/docs/assets/{contributor-guide_architecture_worker-protocol_core-and-event-validation.md.DSVFPpWb.js → contributor-guide_architecture_worker-protocol_core-and-event-validation.md.DVSXn-bb.js} +1 -1
  118. package/public/docs/assets/{contributor-guide_architecture_worker-protocol_evidence-availability.md.CjimIDBY.js → contributor-guide_architecture_worker-protocol_evidence-availability.md.D3S5cyOW.js} +2 -2
  119. package/public/docs/assets/{contributor-guide_architecture_worker-protocol_evidence-availability.md.CjimIDBY.lean.js → contributor-guide_architecture_worker-protocol_evidence-availability.md.D3S5cyOW.lean.js} +1 -1
  120. package/public/docs/assets/contributor-guide_architecture_worker-protocol_evidence-report.md.CtmCU57I.js +1 -0
  121. package/public/docs/assets/{contributor-guide_architecture_worker-protocol_evidence-report.md.DVGZOWvW.lean.js → contributor-guide_architecture_worker-protocol_evidence-report.md.CtmCU57I.lean.js} +1 -1
  122. package/public/docs/assets/contributor-guide_contributing.md.DBW4drtZ.js +1 -0
  123. package/public/docs/assets/{contributor-guide_development-setup.md.D9bu4j_c.js → contributor-guide_development-setup.md.B21ZTDhn.js} +3 -3
  124. package/public/docs/assets/contributor-guide_development-setup.md.B21ZTDhn.lean.js +1 -0
  125. package/public/docs/assets/contributor-guide_testing.md.DpkozNoG.js +4 -0
  126. package/public/docs/assets/{contributor-guide_testing.md.By6XGR9a.lean.js → contributor-guide_testing.md.DpkozNoG.lean.js} +1 -1
  127. package/public/docs/assets/{index.md.CHJVslga.js → index.md.lMm7SUMz.js} +1 -1
  128. package/public/docs/assets/{index.md.CHJVslga.lean.js → index.md.lMm7SUMz.lean.js} +1 -1
  129. package/public/docs/assets/instrument-sans-latin-ext-wdth-normal.C5E2Gvlv.woff2 +0 -0
  130. package/public/docs/assets/instrument-sans-latin-wdth-normal.BVScPF0l.woff2 +0 -0
  131. package/public/docs/assets/jetbrains-mono-cyrillic-wght-normal.D73BlboJ.woff2 +0 -0
  132. package/public/docs/assets/jetbrains-mono-greek-wght-normal.Bw9x6K1M.woff2 +0 -0
  133. package/public/docs/assets/jetbrains-mono-latin-ext-wght-normal.DBQx-q_a.woff2 +0 -0
  134. package/public/docs/assets/jetbrains-mono-latin-wght-normal.B9CIFXIH.woff2 +0 -0
  135. package/public/docs/assets/jetbrains-mono-vietnamese-wght-normal.Bt-aOZkq.woff2 +0 -0
  136. package/public/docs/assets/style.Cfxqlj0y.css +1 -0
  137. package/public/docs/assets/user-guide_getting-started_ci-and-automation.md.C0pcQoNc.js +29 -0
  138. package/public/docs/assets/user-guide_getting-started_ci-and-automation.md.C0pcQoNc.lean.js +1 -0
  139. package/public/docs/assets/user-guide_getting-started_reading-the-dashboard.md.CGaxPX_1.js +1 -0
  140. package/public/docs/assets/{user-guide_getting-started_tuning-thresholds.md.B_MyjyZm.js → user-guide_getting-started_tuning-thresholds.md.BGVE-wrc.js} +2 -2
  141. package/public/docs/assets/{user-guide_getting-started_tuning-thresholds.md.B_MyjyZm.lean.js → user-guide_getting-started_tuning-thresholds.md.BGVE-wrc.lean.js} +1 -1
  142. package/public/docs/assets/{user-guide_mcp-tools.md.C65SjWUL.js → user-guide_mcp-tools.md.49r3L2YE.js} +1 -1
  143. package/public/docs/assets/{user-guide_mcp-tools_compare-runs.md.Cc_gLoix.js → user-guide_mcp-tools_compare-runs.md.BQ_kIptC.js} +11 -6
  144. package/public/docs/assets/user-guide_mcp-tools_compare-runs.md.BQ_kIptC.lean.js +1 -0
  145. package/public/docs/assets/user-guide_mcp-tools_diagnose-run.md.azCZXkH8.js +44 -0
  146. package/public/docs/assets/{user-guide_mcp-tools_diagnose-run.md.BP1vnHA5.lean.js → user-guide_mcp-tools_diagnose-run.md.azCZXkH8.lean.js} +1 -1
  147. package/public/docs/assets/{user-guide_mcp-tools_evaluate-budgets.md.BB0nDY3Z.js → user-guide_mcp-tools_evaluate-budgets.md.dpQpRQ7z.js} +2 -2
  148. package/public/docs/assets/{user-guide_mcp-tools_evaluate-budgets.md.BB0nDY3Z.lean.js → user-guide_mcp-tools_evaluate-budgets.md.dpQpRQ7z.lean.js} +1 -1
  149. package/public/docs/assets/{user-guide_mcp-tools_get-finding-evidence.md.rKyu4wts.js → user-guide_mcp-tools_get-finding-evidence.md.CH6FkNLX.js} +2 -1
  150. package/public/docs/assets/{user-guide_mcp-tools_get-finding-evidence.md.rKyu4wts.lean.js → user-guide_mcp-tools_get-finding-evidence.md.CH6FkNLX.lean.js} +1 -1
  151. package/public/docs/assets/{user-guide_mcp-tools_get-run-summary.md.DpxZ4ZNp.js → user-guide_mcp-tools_get-run-summary.md.EhaIsele.js} +1 -1
  152. package/public/docs/assets/user-guide_run-comparison.md.B_LOkdBf.js +1 -0
  153. package/public/docs/assets/user-guide_run-comparison.md.B_LOkdBf.lean.js +1 -0
  154. package/public/docs/assets/user-guide_understanding-findings.md.C4riKCKl.js +1 -0
  155. package/public/docs/assets/user-guide_understanding-findings.md.C4riKCKl.lean.js +1 -0
  156. package/public/docs/contributor-guide/architecture/board-widgets/caching-and-memory.html +6 -10
  157. package/public/docs/contributor-guide/architecture/board-widgets/plan-advisor.html +6 -10
  158. package/public/docs/contributor-guide/architecture/board-widgets/visual-system-and-templating.html +6 -10
  159. package/public/docs/contributor-guide/architecture/board-widgets.html +6 -10
  160. package/public/docs/contributor-guide/architecture/detector-contract/plan-attribution.html +6 -10
  161. package/public/docs/contributor-guide/architecture/detector-contract/threshold-tables.html +6 -10
  162. package/public/docs/contributor-guide/architecture/detector-contract.html +6 -10
  163. package/public/docs/contributor-guide/architecture/drill-down/plan-graph.html +6 -10
  164. package/public/docs/contributor-guide/architecture/drill-down.html +6 -10
  165. package/public/docs/contributor-guide/architecture/impact-estimation/caveats-tuning-and-coverage.html +6 -10
  166. package/public/docs/contributor-guide/architecture/impact-estimation/stage-union-rollup.html +6 -10
  167. package/public/docs/contributor-guide/architecture/impact-estimation.html +6 -10
  168. package/public/docs/contributor-guide/architecture/index.html +5 -9
  169. package/public/docs/contributor-guide/architecture/overview.html +6 -10
  170. package/public/docs/contributor-guide/architecture/state-and-history/history-server-intake.html +5 -9
  171. package/public/docs/contributor-guide/architecture/state-and-history/run-comparison-internals.html +6 -10
  172. package/public/docs/contributor-guide/architecture/state-and-history.html +5 -9
  173. package/public/docs/contributor-guide/architecture/widget-rendering/findings-tab.html +6 -10
  174. package/public/docs/contributor-guide/architecture/widget-rendering/investigation-routing.html +5 -9
  175. package/public/docs/contributor-guide/architecture/widget-rendering/list-sort-mode.html +6 -10
  176. package/public/docs/contributor-guide/architecture/widget-rendering/reference-section.html +5 -9
  177. package/public/docs/contributor-guide/architecture/widget-rendering/row-expand-contract.html +6 -10
  178. package/public/docs/contributor-guide/architecture/widget-rendering.html +6 -10
  179. package/public/docs/contributor-guide/architecture/worker-protocol/cli-and-mcp.html +6 -10
  180. package/public/docs/contributor-guide/architecture/worker-protocol/core-and-event-validation.html +6 -10
  181. package/public/docs/contributor-guide/architecture/worker-protocol/evidence-availability.html +7 -11
  182. package/public/docs/contributor-guide/architecture/worker-protocol/evidence-report.html +6 -10
  183. package/public/docs/contributor-guide/architecture/worker-protocol.html +6 -10
  184. package/public/docs/contributor-guide/contributing.html +6 -10
  185. package/public/docs/contributor-guide/development-setup.html +8 -12
  186. package/public/docs/contributor-guide/testing.html +9 -10
  187. package/public/docs/favicon.svg +2 -2
  188. package/public/docs/hashmap.json +1 -1
  189. package/public/docs/index.html +6 -10
  190. package/public/docs/logo-dark.svg +1 -0
  191. package/public/docs/logo-light.svg +1 -0
  192. package/public/docs/tuning-reference/anti-patterns.html +5 -9
  193. package/public/docs/tuning-reference/aqe.html +5 -9
  194. package/public/docs/tuning-reference/bottleneck-broadcast-sizing.html +5 -9
  195. package/public/docs/tuning-reference/bottleneck-cold-start.html +5 -9
  196. package/public/docs/tuning-reference/bottleneck-duplicate-plan-subtree.html +5 -9
  197. package/public/docs/tuning-reference/bottleneck-failures.html +5 -9
  198. package/public/docs/tuning-reference/bottleneck-gc.html +5 -9
  199. package/public/docs/tuning-reference/bottleneck-job-failure-rate.html +5 -9
  200. package/public/docs/tuning-reference/bottleneck-memory-utilization.html +5 -9
  201. package/public/docs/tuning-reference/bottleneck-retry-waste.html +5 -9
  202. package/public/docs/tuning-reference/bottleneck-shuffle.html +5 -9
  203. package/public/docs/tuning-reference/bottleneck-skew.html +5 -9
  204. package/public/docs/tuning-reference/bottleneck-slow-host.html +5 -9
  205. package/public/docs/tuning-reference/bottleneck-small-files.html +5 -9
  206. package/public/docs/tuning-reference/bottleneck-spill.html +5 -9
  207. package/public/docs/tuning-reference/bottleneck-straggler.html +5 -9
  208. package/public/docs/tuning-reference/bottleneck-tiny-tasks.html +5 -9
  209. package/public/docs/tuning-reference/bottleneck-utilization.html +5 -9
  210. package/public/docs/tuning-reference/caching.html +5 -9
  211. package/public/docs/tuning-reference/cluster-config.html +5 -9
  212. package/public/docs/tuning-reference/config.html +5 -9
  213. package/public/docs/tuning-reference/data-formats.html +5 -9
  214. package/public/docs/tuning-reference/index.html +5 -9
  215. package/public/docs/tuning-reference/intro.html +5 -9
  216. package/public/docs/tuning-reference/joins.html +5 -9
  217. package/public/docs/tuning-reference/memory-model.html +5 -9
  218. package/public/docs/tuning-reference/metrics.html +5 -9
  219. package/public/docs/tuning-reference/partitioning.html +5 -9
  220. package/public/docs/tuning-reference/pyspark.html +5 -9
  221. package/public/docs/tuning-reference/shuffle.html +5 -9
  222. package/public/docs/tuning-reference/spark-architecture.html +5 -9
  223. package/public/docs/tuning-reference/table-formats.html +5 -9
  224. package/public/docs/user-guide/alternative-log-retrieval/managed-platforms.html +5 -9
  225. package/public/docs/user-guide/alternative-log-retrieval/ssh-bastion.html +5 -9
  226. package/public/docs/user-guide/alternative-log-retrieval.html +5 -9
  227. package/public/docs/user-guide/getting-started/ci-and-automation.html +17 -15
  228. package/public/docs/user-guide/getting-started/reading-the-dashboard.html +6 -10
  229. package/public/docs/user-guide/getting-started/regression-metric-keys.html +5 -9
  230. package/public/docs/user-guide/getting-started/tuning-thresholds.html +7 -11
  231. package/public/docs/user-guide/getting-started.html +5 -9
  232. package/public/docs/user-guide/mcp-tools/compare-runs.html +16 -15
  233. package/public/docs/user-guide/mcp-tools/diagnose-run.html +28 -11
  234. package/public/docs/user-guide/mcp-tools/evaluate-budgets.html +6 -10
  235. package/public/docs/user-guide/mcp-tools/get-finding-documentation.html +5 -9
  236. package/public/docs/user-guide/mcp-tools/get-finding-evidence.html +7 -10
  237. package/public/docs/user-guide/mcp-tools/get-reference-doc.html +5 -9
  238. package/public/docs/user-guide/mcp-tools/get-run-summary.html +6 -10
  239. package/public/docs/user-guide/mcp-tools/list-runs.html +5 -9
  240. package/public/docs/user-guide/mcp-tools.html +6 -10
  241. package/public/docs/user-guide/run-comparison/how-stages-are-matched.html +5 -9
  242. package/public/docs/user-guide/run-comparison.html +6 -10
  243. package/public/docs/user-guide/understanding-findings.html +6 -10
  244. package/public/export-template.html +46 -46
  245. package/public/favicon.svg +2 -2
  246. package/public/index.html +8 -10
  247. package/public/sample-runs/sample-run.ndjson.gz +0 -0
  248. package/vendor-core/allocation.js +126 -39
  249. package/vendor-core/analyzer.js +85 -58
  250. package/vendor-core/api-merge-writes.js +3 -0
  251. package/vendor-core/aqe-skew.js +347 -0
  252. package/vendor-core/cli/budgets.js +6 -4
  253. package/vendor-core/cli/collect-run-pair.js +89 -0
  254. package/vendor-core/cli/collect-run-worker.js +16 -0
  255. package/vendor-core/cli/collect-run.js +1 -2
  256. package/vendor-core/cli/native-zstd.js +12 -16
  257. package/vendor-core/comparability.js +234 -0
  258. package/vendor-core/comparison-output.js +15 -7
  259. package/vendor-core/comparison-verdict.js +105 -25
  260. package/vendor-core/core-source-hash.txt +1 -1
  261. package/vendor-core/core-time-series.js +0 -1
  262. package/vendor-core/core-usage-locality.js +1 -1
  263. package/vendor-core/delta-log-paths.js +10 -1
  264. package/vendor-core/detectors.js +1078 -416
  265. package/vendor-core/docs-config.js +0 -4
  266. package/vendor-core/docs-content/detection/cache.md +2 -1
  267. package/vendor-core/docs-content/detection/cfg.md +19 -11
  268. package/vendor-core/docs-content/detection/cold.md +2 -1
  269. package/vendor-core/docs-content/detection/gc.md +7 -3
  270. package/vendor-core/docs-content/detection/host.md +11 -1
  271. package/vendor-core/docs-content/detection/mem.md +17 -6
  272. package/vendor-core/docs-content/detection/part.md +3 -1
  273. package/vendor-core/docs-content/detection/plan.md +55 -13
  274. package/vendor-core/docs-content/detection/shfl.md +11 -5
  275. package/vendor-core/docs-content/detection/skew.md +48 -1
  276. package/vendor-core/docs-content/detection/slow.md +4 -2
  277. package/vendor-core/docs-content/detection/spec.md +6 -1
  278. package/vendor-core/docs-content/detection/spill.md +6 -3
  279. package/vendor-core/docs-content/detection/strag.md +19 -6
  280. package/vendor-core/docs-content/detection/tiny.md +9 -3
  281. package/vendor-core/docs-content/detection/util.md +6 -2
  282. package/vendor-core/effective-conf.js +7 -10
  283. package/vendor-core/efficiency-model.js +24 -16
  284. package/vendor-core/etl-phases.js +1 -2
  285. package/vendor-core/event-handlers.js +175 -57
  286. package/vendor-core/event-schemas.js +21 -16
  287. package/vendor-core/evidence-availability.js +9 -2
  288. package/vendor-core/evidence-report.js +118 -35
  289. package/vendor-core/executor-peaks.js +41 -0
  290. package/vendor-core/export-data.js +5 -5
  291. package/vendor-core/finding-identity.js +78 -0
  292. package/vendor-core/finding-presentation.js +129 -39
  293. package/vendor-core/finding-types.js +108 -30
  294. package/vendor-core/format-utils.js +14 -15
  295. package/vendor-core/html-export.js +1 -1
  296. package/vendor-core/impact-band.js +2 -2
  297. package/vendor-core/impact-format.js +47 -19
  298. package/vendor-core/impact-model.js +28 -17
  299. package/vendor-core/job-groups.js +4 -4
  300. package/vendor-core/mcp-server-factory.js +48 -12
  301. package/vendor-core/mcp-tools.js +179 -24
  302. package/vendor-core/median.js +2 -2
  303. package/vendor-core/nested-loop-join.js +73 -0
  304. package/vendor-core/occupancy.js +1 -2
  305. package/vendor-core/parser-worker.js +1 -1
  306. package/vendor-core/plan-graph-model.js +14 -22
  307. package/vendor-core/plan-node-detail.js +2 -3
  308. package/vendor-core/plan-summary.js +24 -19
  309. package/vendor-core/plan-tree-walk.js +6 -8
  310. package/vendor-core/python-stage.js +12 -1
  311. package/vendor-core/recommendation-rollup.js +13 -12
  312. package/vendor-core/redact.js +52 -46
  313. package/vendor-core/remediation.js +10 -5
  314. package/vendor-core/run-aggregates.js +6 -8
  315. package/vendor-core/run-comparison.js +226 -66
  316. package/vendor-core/run-identity.js +12 -0
  317. package/vendor-core/run-interpretation.js +21 -0
  318. package/vendor-core/run-metrics.js +2 -2
  319. package/vendor-core/run-output.js +44 -11
  320. package/vendor-core/run-totals.js +12 -0
  321. package/vendor-core/run-verdict.js +76 -3
  322. package/vendor-core/scaling-sim.js +3 -4
  323. package/vendor-core/snappy-block.js +2 -2
  324. package/vendor-core/spark-conf.js +168 -0
  325. package/vendor-core/sql-stages.js +2 -2
  326. package/vendor-core/stage-alignment.js +2 -12
  327. package/vendor-core/stage-identity.js +58 -3
  328. package/vendor-core/stage-label.js +14 -0
  329. package/vendor-core/stage-plan-nodes.js +17 -3
  330. package/vendor-core/stage-quantiles.js +141 -9
  331. package/vendor-core/stage-structure.js +17 -3
  332. package/vendor-core/threshold-overrides.js +9 -3
  333. package/vendor-core/types.js +70 -23
  334. package/vendor-core/wall-clock.js +8 -0
  335. package/vendor-core/wasted-core-hours.js +12 -12
  336. package/vendor-core/write-targets.js +146 -14
  337. package/vendor-core/zstd-worker-client.js +1 -1
  338. package/vendor-core/zstd-worker.js +1 -1
  339. package/public/assets/AutoscalingChurn-8t3U3isq.js +0 -1
  340. package/public/assets/CacheUtilization-CJs9tTum.js +0 -1
  341. package/public/assets/CachingOpportunity-D1NcHs0V.js +0 -1
  342. package/public/assets/ColdStart-CdRJ9gD8.js +0 -1
  343. package/public/assets/ConfigAudit-B5Gbe5js.js +0 -1
  344. package/public/assets/CoreUsageArea-a--NTRGY.js +0 -1
  345. package/public/assets/Dashboard-C1hNeX49.js +0 -2
  346. package/public/assets/DisclosureContext-ZpE6CkHx.js +0 -1
  347. package/public/assets/DuplicatePlanSubtree-dobXdz7E.js +0 -1
  348. package/public/assets/ExecutorUtilization-D9grwi7t.js +0 -1
  349. package/public/assets/GcPressure-8-G2ri10.js +0 -1
  350. package/public/assets/IncompleteRun-B91lky7a.js +0 -1
  351. package/public/assets/JobFailures-BsWvBMyJ.js +0 -1
  352. package/public/assets/MemoryUtilization-BM5schZI.js +0 -1
  353. package/public/assets/OverBroadcast-DdN8JIJH.js +0 -1
  354. package/public/assets/PartitionHint-CUvbnnxy.js +0 -1
  355. package/public/assets/PartitionSizing-CY5HDYtp.js +0 -1
  356. package/public/assets/PlanExplorer-DgHCDBD_.js +0 -1
  357. package/public/assets/PlanGraphRoute-DH3KJb8j.js +0 -1
  358. package/public/assets/RetryWaste-DOnE9vGF.js +0 -1
  359. package/public/assets/ShuffleIO-MMnDESkF.js +0 -1
  360. package/public/assets/Skew-BmZZJ5ms.js +0 -1
  361. package/public/assets/SlowHost-CsJzfEqo.js +0 -1
  362. package/public/assets/SmallFiles-BoK3R1Ex.js +0 -1
  363. package/public/assets/SpeculationWaste-CnVxB5AJ.js +0 -1
  364. package/public/assets/Spill-BhNicyBy.js +0 -1
  365. package/public/assets/StageFailed-mAhHU4l_.js +0 -1
  366. package/public/assets/StageFindingGroup-BEtPWcT0.js +0 -1
  367. package/public/assets/StageHeader-DJkYkrsU.js +0 -1
  368. package/public/assets/StageShape-BDxRknLp.js +0 -1
  369. package/public/assets/StageSlowness-BPRw-otN.js +0 -1
  370. package/public/assets/Straggler-CZCbnOWP.js +0 -1
  371. package/public/assets/TaskFailures-C57YcLFQ.js +0 -1
  372. package/public/assets/TinyTask-Bi84qU7n.js +0 -1
  373. package/public/assets/UnderBroadcast-DdQV7htE.js +0 -1
  374. package/public/assets/charts-vendor-0VMaLVLN.js +0 -59
  375. package/public/assets/finding-anchor-Cl6_5hfV.js +0 -1
  376. package/public/assets/impact-sort-CssZ6MT2.js +0 -1
  377. package/public/assets/index-2h_TgUAb.css +0 -2
  378. package/public/assets/index-B-03mG7K.js +0 -14
  379. package/public/assets/plan-graph-vendor-BYl-AzN5.js +0 -7
  380. package/public/assets/react-vendor-DEdfrRTJ.js +0 -9
  381. package/public/assets/select-CQjNhprm.js +0 -1
  382. package/public/assets/usePagedRows-Dyl6T8Ok.js +0 -1
  383. package/public/assets/useRecentFiles-XZEnLlal.js +0 -11
  384. package/public/assets/useSortMode-Dhvit8dt.js +0 -1
  385. package/public/docs/assets/chunks/@localSearchIndexroot.u_e5bQz4.js +0 -1
  386. package/public/docs/assets/contributor-guide_architecture_board-widgets.md.YQcj5EI4.js +0 -1
  387. package/public/docs/assets/contributor-guide_architecture_board-widgets.md.YQcj5EI4.lean.js +0 -1
  388. package/public/docs/assets/contributor-guide_architecture_board-widgets_plan-advisor.md.RlzvUmNm.js +0 -1
  389. package/public/docs/assets/contributor-guide_architecture_board-widgets_visual-system-and-templating.md.DYgUpIJB.js +0 -1
  390. package/public/docs/assets/contributor-guide_architecture_board-widgets_visual-system-and-templating.md.DYgUpIJB.lean.js +0 -1
  391. package/public/docs/assets/contributor-guide_architecture_detector-contract.md.wj6Et6UD.js +0 -1
  392. package/public/docs/assets/contributor-guide_architecture_detector-contract_plan-attribution.md.yNex4bys.js +0 -1
  393. package/public/docs/assets/contributor-guide_architecture_detector-contract_plan-attribution.md.yNex4bys.lean.js +0 -1
  394. package/public/docs/assets/contributor-guide_architecture_detector-contract_threshold-tables.md.CKjWG56Y.js +0 -1
  395. package/public/docs/assets/contributor-guide_architecture_drill-down_plan-graph.md.DwOozIEs.js +0 -1
  396. package/public/docs/assets/contributor-guide_architecture_impact-estimation.md.CZv_ZGOp.js +0 -1
  397. package/public/docs/assets/contributor-guide_architecture_impact-estimation_caveats-tuning-and-coverage.md.BUucRc0A.js +0 -1
  398. package/public/docs/assets/contributor-guide_architecture_impact-estimation_stage-union-rollup.md.DdCGtAGu.js +0 -1
  399. package/public/docs/assets/contributor-guide_architecture_impact-estimation_stage-union-rollup.md.DdCGtAGu.lean.js +0 -1
  400. package/public/docs/assets/contributor-guide_architecture_overview.md.C1sSvm9i.js +0 -1
  401. package/public/docs/assets/contributor-guide_architecture_state-and-history_run-comparison-internals.md.CZA0JLtV.js +0 -1
  402. package/public/docs/assets/contributor-guide_architecture_widget-rendering.md.BOZ1azXG.js +0 -1
  403. package/public/docs/assets/contributor-guide_architecture_widget-rendering_findings-tab.md.BQXycK6G.js +0 -1
  404. package/public/docs/assets/contributor-guide_architecture_widget-rendering_findings-tab.md.BQXycK6G.lean.js +0 -1
  405. package/public/docs/assets/contributor-guide_architecture_worker-protocol.md.BAnhi2-d.lean.js +0 -1
  406. package/public/docs/assets/contributor-guide_architecture_worker-protocol_cli-and-mcp.md.DC1YqXBp.js +0 -1
  407. package/public/docs/assets/contributor-guide_architecture_worker-protocol_evidence-report.md.DVGZOWvW.js +0 -1
  408. package/public/docs/assets/contributor-guide_contributing.md.CQMvGwFt.js +0 -1
  409. package/public/docs/assets/contributor-guide_development-setup.md.D9bu4j_c.lean.js +0 -1
  410. package/public/docs/assets/contributor-guide_testing.md.By6XGR9a.js +0 -1
  411. package/public/docs/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  412. package/public/docs/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  413. package/public/docs/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  414. package/public/docs/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  415. package/public/docs/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  416. package/public/docs/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  417. package/public/docs/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  418. package/public/docs/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  419. package/public/docs/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  420. package/public/docs/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  421. package/public/docs/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  422. package/public/docs/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  423. package/public/docs/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  424. package/public/docs/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  425. package/public/docs/assets/style.tmDhD3c8.css +0 -1
  426. package/public/docs/assets/user-guide_getting-started_ci-and-automation.md.OUQqw3mI.js +0 -23
  427. package/public/docs/assets/user-guide_getting-started_ci-and-automation.md.OUQqw3mI.lean.js +0 -1
  428. package/public/docs/assets/user-guide_getting-started_reading-the-dashboard.md.Obf3W3__.js +0 -1
  429. package/public/docs/assets/user-guide_mcp-tools_compare-runs.md.Cc_gLoix.lean.js +0 -1
  430. package/public/docs/assets/user-guide_mcp-tools_diagnose-run.md.BP1vnHA5.js +0 -23
  431. package/public/docs/assets/user-guide_run-comparison.md.BUALkohi.js +0 -1
  432. package/public/docs/assets/user-guide_run-comparison.md.BUALkohi.lean.js +0 -1
  433. package/public/docs/assets/user-guide_understanding-findings.md.C9YRruMT.js +0 -1
  434. package/public/docs/assets/user-guide_understanding-findings.md.C9YRruMT.lean.js +0 -1
  435. /package/public/docs/assets/{contributor-guide_architecture_board-widgets_caching-and-memory.md.8bH1HnZp.lean.js → contributor-guide_architecture_board-widgets_caching-and-memory.md.BYDo3ClR.lean.js} +0 -0
  436. /package/public/docs/assets/{contributor-guide_architecture_board-widgets_plan-advisor.md.RlzvUmNm.lean.js → contributor-guide_architecture_board-widgets_plan-advisor.md.ajUAVdbc.lean.js} +0 -0
  437. /package/public/docs/assets/{contributor-guide_architecture_overview.md.C1sSvm9i.lean.js → contributor-guide_architecture_overview.md.nxkpOhgf.lean.js} +0 -0
  438. /package/public/docs/assets/{contributor-guide_architecture_widget-rendering.md.BOZ1azXG.lean.js → contributor-guide_architecture_widget-rendering.md.BrSz8Ezh.lean.js} +0 -0
  439. /package/public/docs/assets/{contributor-guide_architecture_widget-rendering_list-sort-mode.md.BuHKgH0C.lean.js → contributor-guide_architecture_widget-rendering_list-sort-mode.md.37hcZJ7q.lean.js} +0 -0
  440. /package/public/docs/assets/{contributor-guide_architecture_widget-rendering_row-expand-contract.md.ZT89u9f1.lean.js → contributor-guide_architecture_widget-rendering_row-expand-contract.md.mK_VmAWk.lean.js} +0 -0
  441. /package/public/docs/assets/{contributor-guide_architecture_worker-protocol_core-and-event-validation.md.DSVFPpWb.lean.js → contributor-guide_architecture_worker-protocol_core-and-event-validation.md.DVSXn-bb.lean.js} +0 -0
  442. /package/public/docs/assets/{contributor-guide_contributing.md.CQMvGwFt.lean.js → contributor-guide_contributing.md.DBW4drtZ.lean.js} +0 -0
  443. /package/public/docs/assets/{user-guide_getting-started_reading-the-dashboard.md.Obf3W3__.lean.js → user-guide_getting-started_reading-the-dashboard.md.CGaxPX_1.lean.js} +0 -0
  444. /package/public/docs/assets/{user-guide_mcp-tools.md.C65SjWUL.lean.js → user-guide_mcp-tools.md.49r3L2YE.lean.js} +0 -0
  445. /package/public/docs/assets/{user-guide_mcp-tools_get-run-summary.md.DpxZ4ZNp.lean.js → user-guide_mcp-tools_get-run-summary.md.EhaIsele.lean.js} +0 -0
@@ -0,0 +1,14 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./PlanGraphRoute-CIH9gBuR.js","./rolldown-runtime-hePW80VL.js","./react-vendor-C6KcUD36.js","./DisclosureContext-DK1_iz6J.js","./inertValue-L9VxV0VE.js","./button-DbpTz2yk.js","./useScrollLock-BCxn_dMp.js","./composite-C9Nu2EI9.js","./useRegisterFieldControl-pQv-ZDoU.js","./toggle-DPeN6aNa.js","./PlanView-B1hxzFRs.js","./RowStatusCluster-Dbtmte7l.js","./useRecentFiles-DzJZAoOT.js","./findings-of-type-BL2u3RGZ.js","./ChartTheme-DAiARbLP.js","./charts-vendor-CtTxwTeu.js","./d3-vendor-DNlD2-cz.js","./plan-graph-vendor-Ce6d4HU6.js","./plan-graph-vendor-DLioOiRN.css","./impact-sort-mC5ISgX8.js","./Dashboard-DkUPrHKV.js","./inbox-KPU1Gppm.js","./detector-registry-Bp8hrLua.js","./EmptyState-C1uL40VU.js","./toggle-group-Kl3uyHSr.js","./DurationHistogram-B6jsE0Ov.js","./downsample-WmNM1qc9.js","./WidgetLeadSummary-CXFZP00C.js","./StagePill--P7PDd3s.js","./RowPagination-C-LzWkI5.js","./ImpactEstimate-Dm3xWbzV.js"])))=>i.map(i=>d[i]);
2
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{c as t,i as n,o as r,s as i}from"./react-vendor-C6KcUD36.js";import{$t as a,Bt as o,Cn as s,Ct as c,D as l,Dn as u,Dt as d,Et as f,Ft as p,Gt as m,Ht as h,J as g,Jt as _,Kt as v,Lt as y,Mt as b,O as x,Ot as S,Pt as C,Qt as w,R as T,T as E,Tt as D,Ut as O,X as k,Xt as A,Yt as ee,Zt as te,a as ne,an as j,b as re,c as ie,cn as ae,et as oe,fn as se,gn as ce,ht as le,in as M,j as ue,k as de,kn as fe,kt as pe,ln as me,mn as N,mt as P,nn as he,on as F,pt as ge,rn as _e,t as ve,tn as ye,un as I,vt as be,w as xe,wt as Se,xt as Ce,yn as we,yt as Te}from"./DisclosureContext-DK1_iz6J.js";import{_ as L,a as Ee,d as De,f as Oe,i as ke,m as Ae,r as je,t as Me}from"./inertValue-L9VxV0VE.js";import{n as Ne,t as R}from"./button-DbpTz2yk.js";import{S as Pe,_ as Fe,a as Ie,c as Le,d as Re,dt as ze,f as Be,ft as Ve,i as He,k as Ue,l as We,m as Ge,n as Ke,p as qe,r as Je,t as Ye,u as Xe,v as Ze,x as Qe,xt as $e,y as et}from"./useScrollLock-BCxn_dMp.js";import{_ as tt,a as nt,v as rt}from"./composite-C9Nu2EI9.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();function it(e){return Array.isArray(e)?e.map(e=>it(e)).join(`,`):e==null?``:String(e)}var at=new Map;function ot(e,t){let n=JSON.stringify({locale:it(e),options:t}),r=at.get(n);if(r)return r;let i=new Intl.NumberFormat(e,t);return at.set(n,i),i}function st(e,t,n){return e==null?``:ot(t,n).format(e)}function ct(e,t=-(2**53-1),n=2**53-1){return Math.max(t,Math.min(e,n))}function lt(e,t,n){return(e-t)*100/(n-t)}var z=e(t(),1),ut=z.createContext(void 0);function dt(){let e=z.useContext(ut);if(e===void 0)throw Error(u(51));return e}var ft=`data-complete`,pt=`data-indeterminate`,mt=`data-progressing`,ht={status(e){return e===`progressing`?{[mt]:``}:e===`complete`?{[ft]:``}:e===`indeterminate`?{[pt]:``}:null}},B=n(),gt=z.forwardRef(function(e,t){let{format:n,getAriaValueText:r,locale:i,max:a=100,min:o=0,value:s,render:c,className:l,children:u,style:d,...f}=e,[p,m]=z.useState(),h=`indeterminate`,g=null,_=null,v=``,y=`indeterminate progress`;if(s!=null&&Number.isFinite(s)){let e=lt(s,o,a);g=ct(Number.isNaN(e)?0:e,0,100),_=ct(s,o,a),h=_===a?`complete`:`progressing`,v=n?st(_,i,n):st(g/100,i,{style:`percent`}),y=v}let b=z.useMemo(()=>({status:h}),[h]),x={"aria-labelledby":p,"aria-valuemax":a,"aria-valuemin":o,"aria-valuenow":_??void 0,"aria-valuetext":r?r(v,s):y,role:`progressbar`,children:(0,B.jsxs)(z.Fragment,{children:[u,(0,B.jsx)(`span`,{role:`presentation`,style:$e,children:`x`})]})},S=z.useMemo(()=>({formattedValue:v,percentageValue:g,setLabelId:m,state:b,value:s}),[v,g,m,b,s]),C=ce(`div`,e,{state:b,ref:t,props:[x,f],stateAttributesMapping:ht});return(0,B.jsx)(ut.Provider,{value:S,children:C})}),_t=z.forwardRef(function(e,t){let{render:n,className:r,style:i,...a}=e,{state:o}=dt();return ce(`div`,e,{state:o,ref:t,props:a,stateAttributesMapping:ht})}),vt=z.forwardRef(function(e,t){let{render:n,className:r,style:i,...a}=e,{percentageValue:o,state:s}=dt(),c=o==null?{}:{insetInlineStart:0,height:`inherit`,width:`${o}%`};return ce(`div`,e,{state:s,ref:t,props:[{style:c},a],stateAttributesMapping:ht})}),yt=r();function bt({className:e,children:t,value:n,...r}){return(0,B.jsxs)(gt,{value:n,"data-slot":`progress`,className:N(`flex flex-wrap gap-3`,e),...r,children:[t,(0,B.jsx)(xt,{children:(0,B.jsx)(St,{})})]})}function xt({className:e,...t}){return(0,B.jsx)(_t,{className:N(`relative flex h-1 w-full items-center overflow-x-hidden rounded-full bg-muted`,e),"data-slot":`progress-track`,...t})}function St({className:e,...t}){return(0,B.jsx)(vt,{"data-slot":`progress-indicator`,className:N(`h-full bg-primary transition-all data-[indeterminate]:w-2/5 data-[indeterminate]:animate-[progress-slide_1.4s_ease-in-out_infinite] motion-reduce:data-[indeterminate]:animate-none`,e),...t})}var Ct=(0,z.createContext)(null);function wt({children:e}){let t=F(e=>e.theme);return(0,z.useEffect)(()=>{if(t===`light`?document.documentElement.setAttribute(`data-theme`,`light`):document.documentElement.removeAttribute(`data-theme`),typeof window<`u`){try{window.localStorage.setItem(`shuffle-works-theme`,t)}catch{}try{window.localStorage.setItem(`vitepress-theme-appearance`,t)}catch{}}},[t]),(0,B.jsx)(Ct.Provider,{value:{theme:t,toggle:()=>j.getState().setTheme(t===`dark`?`light`:`dark`)},children:e})}function Tt(){let e=(0,z.useContext)(Ct);if(!e)throw Error(`useTheme outside ThemeProvider`);return e}var Et=e(i(),1);function Dt(e){if(!e||typeof document>`u`)return;let t=document.head||document.getElementsByTagName(`head`)[0],n=document.createElement(`style`);n.type=`text/css`,t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}var Ot=e=>{switch(e){case`success`:return jt;case`info`:return Nt;case`warning`:return Mt;case`error`:return Pt;default:return null}},kt=Array(12).fill(0),At=({visible:e,className:t})=>z.createElement(`div`,{className:[`sonner-loading-wrapper`,t].filter(Boolean).join(` `),"data-visible":e},z.createElement(`div`,{className:`sonner-spinner`},kt.map((e,t)=>z.createElement(`div`,{className:`sonner-loading-bar`,key:`spinner-bar-${t}`})))),jt=z.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`,"aria-hidden":`true`},z.createElement(`path`,{fillRule:`evenodd`,d:`M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z`,clipRule:`evenodd`})),Mt=z.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`currentColor`,height:`20`,width:`20`,"aria-hidden":`true`},z.createElement(`path`,{fillRule:`evenodd`,d:`M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z`,clipRule:`evenodd`})),Nt=z.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`,"aria-hidden":`true`},z.createElement(`path`,{fillRule:`evenodd`,d:`M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z`,clipRule:`evenodd`})),Pt=z.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`,"aria-hidden":`true`},z.createElement(`path`,{fillRule:`evenodd`,d:`M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z`,clipRule:`evenodd`})),Ft=z.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,width:`12`,height:`12`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`},z.createElement(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),z.createElement(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})),It=()=>{let[e,t]=z.useState(document.hidden);return z.useEffect(()=>{let e=()=>{t(document.hidden)};return document.addEventListener(`visibilitychange`,e),()=>document.removeEventListener(`visibilitychange`,e)},[]),e},Lt=1,Rt=100,zt=e=>typeof e?.id==`number`||e?.id?.length>0?e.id:Lt++,V=new class{constructor(){this.subscribe=e=>(this.subscribers.push(e),this.getActiveToasts().forEach(t=>e(t)),()=>{let t=this.subscribers.indexOf(e);this.subscribers.splice(t,1)}),this.publish=e=>{this.subscribers.forEach(t=>t(e))},this.addToast=e=>{this.publish(e),this.toasts=[...this.toasts,e],this.trimHistory()},this.trimHistory=()=>{let e=this.toasts.length-Rt;e<=0||(this.toasts=this.toasts.filter(t=>e>0&&this.dismissedToasts.has(t.id)?(this.dismissedToasts.delete(t.id),e--,!1):!0))},this.create=e=>{let{message:t,...n}=e,r=zt(e),i=this.pendingDismissals.get(r);i!==void 0&&(cancelAnimationFrame(i),this.pendingDismissals.delete(r),this.dismissedToasts.delete(r));let a=this.dismissedToasts.has(r),o=e.dismissible===void 0||e.dismissible;return a&&(this.dismissedToasts.delete(r),this.toasts=this.toasts.filter(e=>e.id!==r)),!a&&this.toasts.find(e=>e.id===r)?this.toasts=this.toasts.map(n=>n.id===r?(this.publish({...n,...e,id:r,title:t}),{...n,...e,id:r,dismissible:o,title:t}):n):this.addToast({title:t,...n,dismissible:o,id:r}),r},this.dismiss=e=>{if(e==null)return this.getActiveToasts().forEach(e=>{this.dismissedToasts.add(e.id),this.subscribers.forEach(t=>t({id:e.id,dismiss:!0}))}),e;this.dismissedToasts.add(e);let t=this.pendingDismissals.get(e);return t!==void 0&&cancelAnimationFrame(t),this.pendingDismissals.set(e,requestAnimationFrame(()=>{this.pendingDismissals.delete(e),this.subscribers.forEach(t=>t({id:e,dismiss:!0}))})),e},this.message=(e,t)=>this.create({...t,message:e,type:void 0}),this.error=(e,t)=>this.create({...t,message:e,type:`error`}),this.success=(e,t)=>this.create({...t,type:`success`,message:e}),this.info=(e,t)=>this.create({...t,type:`info`,message:e}),this.warning=(e,t)=>this.create({...t,type:`warning`,message:e}),this.loading=(e,t)=>this.create({...t,type:`loading`,message:e}),this.promise=(e,t)=>{if(!t)return;let n;t.loading!==void 0&&(n=this.create({...t,promise:e,type:`loading`,message:t.loading,description:typeof t.description==`function`?void 0:t.description}));let r=Promise.resolve(e instanceof Function?e():e),i=n!==void 0,a,o=r.then(async e=>{if(a=[`resolve`,e],z.isValidElement(e))i=!1,this.create({id:n,type:`default`,message:e});else if(Vt(e)&&!e.ok){i=!1;let r=typeof t.error==`function`?await t.error(`HTTP error! status: ${e.status}`):t.error,a=typeof t.description==`function`?await t.description(`HTTP error! status: ${e.status}`):t.description,o=typeof r==`object`&&!z.isValidElement(r)?r:{message:r};this.create({id:n,type:`error`,description:a,...o})}else if(e instanceof Error){i=!1;let r=typeof t.error==`function`?await t.error(e):t.error,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!z.isValidElement(r)?r:{message:r};this.create({id:n,type:`error`,description:a,...o})}else if(t.success!==void 0){i=!1;let r=typeof t.success==`function`?await t.success(e):t.success,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!z.isValidElement(r)?r:{message:r};this.create({id:n,type:`success`,description:a,...o})}}).catch(async e=>{if(a=[`reject`,e],t.error!==void 0){i=!1;let r=typeof t.error==`function`?await t.error(e):t.error,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!z.isValidElement(r)?r:{message:r};this.create({id:n,type:`error`,description:a,...o})}}).finally(()=>{i&&(this.dismiss(n),n=void 0),t.finally==null||t.finally.call(t)}),s=()=>new Promise((e,t)=>o.then(()=>a[0]===`reject`?t(a[1]):e(a[1])).catch(t));return typeof n!=`string`&&typeof n!=`number`?{unwrap:s}:Object.assign(n,{unwrap:s})},this.custom=(e,t)=>{let n=zt(t);return this.create({...t,jsx:e(n),id:n,type:void 0}),n},this.getActiveToasts=()=>this.toasts.filter(e=>!this.dismissedToasts.has(e.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set,this.pendingDismissals=new Map}},Bt=(e,t)=>V.message(e,t),Vt=e=>e&&typeof e==`object`&&`ok`in e&&typeof e.ok==`boolean`&&`status`in e&&typeof e.status==`number`,Ht=Object.assign(Bt,{success:V.success,info:V.info,warning:V.warning,error:V.error,custom:V.custom,message:V.message,promise:V.promise,dismiss:V.dismiss,loading:V.loading},{getHistory:()=>V.toasts,getToasts:()=>V.getActiveToasts()});Dt(`[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--normal-text);background:var(--normal-bg);border:1px solid var(--normal-border);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{-webkit-user-select:none;user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}`);function Ut(e){return e.label!==void 0}var Wt=3,Gt=`24px`,Kt=`16px`,qt=4e3,Jt=356,Yt=14,Xt=45,Zt=200;function Qt(...e){return e.filter(Boolean).join(` `)}function $t(e){let[t,n]=e.split(`-`),r=[];return t&&r.push(t),n&&r.push(n),r}var en=e=>{let{invert:t,toast:n,unstyled:r,interacting:i,setHeights:a,visibleToasts:o,heights:s,index:c,toasts:l,expanded:u,removeToast:d,defaultRichColors:f,closeButton:p,style:m,cancelButtonStyle:h,actionButtonStyle:g,className:_=``,descriptionClassName:v=``,duration:y,position:b,gap:x,expandByDefault:S,classNames:C,icons:w,closeButtonAriaLabel:T=`Close toast`}=e,[E,D]=z.useState(null),[O,k]=z.useState(null),[A,ee]=z.useState(!1),[te,ne]=z.useState(!1),[j,re]=z.useState(!1),[ie,ae]=z.useState(!1),[oe,se]=z.useState(!1),[ce,le]=z.useState(0),[M,ue]=z.useState(0),de=z.useRef(n.duration||y||qt),fe=z.useRef(null),pe=z.useRef(null),me=c===0,N=c+1<=o,P=n.type,he=P??`default`,F=n.dismissible!==!1,ge=n.className||``,_e=n.descriptionClassName||``,ve=z.useMemo(()=>s.findIndex(e=>e.toastId===n.id)||0,[s,n.id]),ye=z.useMemo(()=>n.closeButton??p,[n.closeButton,p]),I=z.useMemo(()=>n.duration||y||qt,[n.duration,y]),be=z.useRef(0),xe=z.useRef(0),Se=z.useRef(0),Ce=z.useRef(null),[we,Te]=b.split(`-`),L=z.useMemo(()=>s.reduce((e,t,n)=>n>=ve?e:e+t.height,0),[s,ve]),Ee=It(),De=z.useMemo(()=>e.swipeDirections??$t(b),[e.swipeDirections,b]),Oe=n.invert||t,ke=P===`loading`;xe.current=z.useMemo(()=>ve*x+L,[ve,L]),z.useEffect(()=>{de.current=I},[I]),z.useEffect(()=>{ee(!0)},[]),z.useEffect(()=>{let e=pe.current;if(e){let t=e.getBoundingClientRect().height;return ue(t),a(e=>[{toastId:n.id,height:t,position:n.position},...e]),()=>a(e=>e.filter(e=>e.toastId!==n.id))}},[a,n.id]),z.useLayoutEffect(()=>{if(!A)return;let e=pe.current,t=e.style.height;e.style.height=`auto`;let r=e.getBoundingClientRect().height;e.style.height=t,ue(r),a(e=>e.find(e=>e.toastId===n.id)?e.map(e=>e.toastId===n.id?{...e,height:r}:e):[{toastId:n.id,height:r,position:n.position},...e])},[A,n.title,n.description,a,n.id,n.jsx,n.action,n.cancel]);let Ae=z.useCallback(()=>{ne(!0),le(xe.current),a(e=>e.filter(e=>e.toastId!==n.id)),setTimeout(()=>{d(n)},Zt)},[n,d,a,xe]);z.useEffect(()=>{if(n.promise&&P===`loading`||n.duration===1/0||n.type===`loading`)return;let e;return u||i||Ee?(()=>{if(Se.current<be.current){let e=new Date().getTime()-be.current;de.current-=e}Se.current=new Date().getTime()})():de.current!==1/0&&(be.current=new Date().getTime(),e=setTimeout(()=>{n.onAutoClose==null||n.onAutoClose.call(n,n),Ae()},de.current)),()=>clearTimeout(e)},[u,i,n,P,Ee,Ae]),z.useEffect(()=>{n.delete&&(Ae(),n.onDismiss==null||n.onDismiss.call(n,n))},[Ae,n.delete]);function je(){return w?.loading?z.createElement(`div`,{className:Qt(C?.loader,n?.classNames?.loader,`sonner-loader`),"data-visible":P===`loading`},w.loading):z.createElement(At,{className:Qt(C?.loader,n?.classNames?.loader),visible:P===`loading`})}let Me=n.icon||w?.[P]||Ot(P);return z.createElement(`li`,{tabIndex:0,ref:pe,className:Qt(_,ge,C?.toast,n?.classNames?.toast,C?.[he],n?.classNames?.[he]),"data-sonner-toast":``,"data-rich-colors":n.richColors??f,"data-styled":!(n.jsx||n.unstyled||r),"data-mounted":A,"data-promise":!!n.promise,"data-swiped":oe,"data-removed":te,"data-visible":N,"data-y-position":we,"data-x-position":Te,"data-index":c,"data-front":me,"data-swiping":j,"data-dismissible":F,"data-type":P,"data-invert":Oe,"data-swipe-out":ie,"data-swipe-direction":O,"data-expanded":!!(u||S&&A),"data-testid":n.testId,style:{"--index":c,"--toasts-before":c,"--z-index":l.length-c,"--offset":`${te?ce:xe.current}px`,"--initial-height":S?`auto`:`${M}px`,...m,...n.style},onDragEnd:()=>{re(!1),D(null),Ce.current=null},onPointerDown:e=>{e.button!==2&&!ke&&F&&(fe.current=new Date,le(xe.current),e.target.setPointerCapture(e.pointerId),e.target.tagName!==`BUTTON`&&(re(!0),Ce.current={x:e.clientX,y:e.clientY}))},onPointerUp:()=>{if(ie||!F)return;Ce.current=null;let e=Number(pe.current?.style.getPropertyValue(`--swipe-amount-x`).replace(`px`,``)||0),t=Number(pe.current?.style.getPropertyValue(`--swipe-amount-y`).replace(`px`,``)||0),r=new Date().getTime()-fe.current?.getTime(),i=E===`x`?e:t,a=Math.abs(i)/r;if((E===`x`?De.includes(e>0?`right`:`left`):De.includes(t>0?`bottom`:`top`))&&(Math.abs(i)>=Xt||a>.11)){le(xe.current),n.onDismiss==null||n.onDismiss.call(n,n),k(E===`x`?e>0?`right`:`left`:t>0?`down`:`up`),Ae(),ae(!0);return}var o,s;(o=pe.current)==null||o.style.setProperty(`--swipe-amount-x`,`0px`),(s=pe.current)==null||s.style.setProperty(`--swipe-amount-y`,`0px`),se(!1),re(!1),D(null)},onPointerMove:e=>{var t,n;if(!Ce.current||!F||window.getSelection()?.toString().length>0)return;let r=e.clientY-Ce.current.y,i=e.clientX-Ce.current.x;!E&&(Math.abs(i)>1||Math.abs(r)>1)&&D(Math.abs(i)>Math.abs(r)?`x`:`y`);let a={x:0,y:0},o=e=>1/(1.5+Math.abs(e)/20);if(E===`y`){if(De.includes(`top`)||De.includes(`bottom`)){if(De.includes(`top`)&&r<0||De.includes(`bottom`)&&r>0)a.y=r;else{let e=r*o(r);a.y=Math.abs(e)<Math.abs(r)?e:r}}}else if(E===`x`&&(De.includes(`left`)||De.includes(`right`))){if(De.includes(`left`)&&i<0||De.includes(`right`)&&i>0)a.x=i;else{let e=i*o(i);a.x=Math.abs(e)<Math.abs(i)?e:i}}(Math.abs(a.x)>0||Math.abs(a.y)>0)&&se(!0),(t=pe.current)==null||t.style.setProperty(`--swipe-amount-x`,`${a.x}px`),(n=pe.current)==null||n.style.setProperty(`--swipe-amount-y`,`${a.y}px`)}},ye&&!n.jsx&&P!==`loading`?z.createElement(`button`,{"aria-label":T,"data-disabled":ke,"data-close-button":!0,onClick:ke||!F?()=>{}:()=>{Ae(),n.onDismiss==null||n.onDismiss.call(n,n)},className:Qt(C?.closeButton,n?.classNames?.closeButton)},w?.close??Ft):null,(P||n.icon||n.promise)&&n.icon!==null&&(w?.[P]!==null||n.icon)?z.createElement(`div`,{"data-icon":``,className:Qt(C?.icon,n?.classNames?.icon)},P===`loading`?n.icon||je():n.promise?je():null,P===`loading`?null:Me):null,z.createElement(`div`,{"data-content":``,className:Qt(C?.content,n?.classNames?.content)},z.createElement(`div`,{"data-title":``,className:Qt(C?.title,n?.classNames?.title)},n.jsx?n.jsx:typeof n.title==`function`?n.title():n.title),n.description?z.createElement(`div`,{"data-description":``,className:Qt(v,_e,C?.description,n?.classNames?.description)},typeof n.description==`function`?n.description():n.description):null),z.isValidElement(n.cancel)?n.cancel:n.cancel&&Ut(n.cancel)?z.createElement(`button`,{"data-button":!0,"data-cancel":!0,style:n.cancelButtonStyle||h,onClick:e=>{Ut(n.cancel)&&F&&(n.cancel.onClick==null||n.cancel.onClick.call(n.cancel,e),Ae())},className:Qt(C?.cancelButton,n?.classNames?.cancelButton)},n.cancel.label):null,z.isValidElement(n.action)?n.action:n.action&&Ut(n.action)?z.createElement(`button`,{"data-button":!0,"data-action":!0,style:n.actionButtonStyle||g,onClick:e=>{Ut(n.action)&&(n.action.onClick==null||n.action.onClick.call(n.action,e),!e.defaultPrevented&&Ae())},className:Qt(C?.actionButton,n?.classNames?.actionButton)},n.action.label):null)};function tn(){if(typeof window>`u`||typeof document>`u`)return`ltr`;let e=document.documentElement.getAttribute(`dir`);return e===`auto`||!e?window.getComputedStyle(document.documentElement).direction:e}function nn(e,t){let n={};return[e,t].forEach((e,t)=>{let r=t===1,i=r?`--mobile-offset`:`--offset`,a=r?Kt:Gt;function o(e){[`top`,`right`,`bottom`,`left`].forEach(t=>{n[`${i}-${t}`]=typeof e==`number`?`${e}px`:e})}typeof e==`number`||typeof e==`string`?o(e):typeof e==`object`?[`top`,`right`,`bottom`,`left`].forEach(t=>{e[t]===void 0?n[`${i}-${t}`]=a:n[`${i}-${t}`]=typeof e[t]==`number`?`${e[t]}px`:e[t]}):o(a)}),n}var rn=z.forwardRef(function(e,t){let{id:n,invert:r,position:i=`bottom-right`,hotkey:a=[`altKey`,`KeyT`],expand:o,closeButton:s,className:c,offset:l,mobileOffset:u,theme:d=`light`,richColors:f,duration:p,style:m,visibleToasts:h=Wt,toastOptions:g,dir:_=tn(),gap:v=Yt,icons:y,customAriaLabel:b,containerAriaLabel:x=`Notifications`}=e,[S,C]=z.useState([]),w=z.useMemo(()=>n?S.filter(e=>e.toasterId===n):S.filter(e=>!e.toasterId),[S,n]),T=z.useMemo(()=>Array.from(new Set([i].concat(w.filter(e=>e.position).map(e=>e.position)))),[w,i]),[E,D]=z.useState([]),[O,k]=z.useState(!1),[A,ee]=z.useState(!1),[te,ne]=z.useState(d===`system`?typeof window<`u`&&window.matchMedia&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:d),j=z.useRef(null),re=a.join(`+`).replace(/Key/g,``).replace(/Digit/g,``),ie=z.useRef(null),ae=z.useRef(!1),oe=z.useCallback(e=>{C(t=>(t.find(t=>t.id===e.id)?.delete||V.dismiss(e.id),t.filter(({id:t})=>t!==e.id)))},[]);return z.useEffect(()=>V.subscribe(e=>{if(e.dismiss){requestAnimationFrame(()=>{C(t=>t.map(t=>t.id===e.id?{...t,delete:!0}:t))});return}setTimeout(()=>{Et.flushSync(()=>{C(t=>{let n=t.findIndex(t=>t.id===e.id);return n===-1?[e,...t]:[...t.slice(0,n),{...t[n],...e},...t.slice(n+1)]})})})}),[]),z.useEffect(()=>{if(d!==`system`){ne(d);return}if(d===`system`&&(window.matchMedia&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?ne(`dark`):ne(`light`)),typeof window>`u`)return;let e=window.matchMedia(`(prefers-color-scheme: dark)`);try{e.addEventListener(`change`,({matches:e})=>{ne(e?`dark`:`light`)})}catch{e.addListener(({matches:e})=>{try{ne(e?`dark`:`light`)}catch(e){console.error(e)}})}},[d]),z.useEffect(()=>{S.length<=1&&k(!1)},[S]),z.useEffect(()=>{let e=e=>{if(a.length>0&&a.every(t=>e[t]||e.code===t)){var t;k(!0),(t=j.current)==null||t.focus()}e.code===`Escape`&&(document.activeElement===j.current||j.current?.contains(document.activeElement))&&k(!1)};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[a]),z.useEffect(()=>{if(j.current)return()=>{ie.current&&(ie.current.focus({preventScroll:!0}),ie.current=null,ae.current=!1)}},[j.current]),z.createElement(`section`,{ref:t,"aria-label":b??`${x} ${re}`,tabIndex:-1,"aria-live":`polite`,"aria-relevant":`additions text`,"aria-atomic":`false`,suppressHydrationWarning:!0,"data-react-aria-top-layer":!0},T.map((t,n)=>{let[i,a]=t.split(`-`);return w.length?z.createElement(`ol`,{key:t,dir:_===`auto`?tn():_,tabIndex:-1,ref:j,className:c,"data-sonner-toaster":!0,"data-sonner-theme":te,"data-y-position":i,"data-x-position":a,style:{"--front-toast-height":`${E[0]?.height||0}px`,"--width":`${Jt}px`,"--gap":`${v}px`,...m,...nn(l,u)},onBlur:e=>{ae.current&&!e.currentTarget.contains(e.relatedTarget)&&(ae.current=!1,ie.current&&=(ie.current.focus({preventScroll:!0}),null))},onFocus:e=>{e.target instanceof HTMLElement&&e.target.dataset.dismissible===`false`||ae.current||(ae.current=!0,ie.current=e.relatedTarget)},onMouseEnter:()=>k(!0),onMouseMove:()=>k(!0),onMouseLeave:()=>{A||k(!1)},onDragEnd:()=>k(!1),onPointerDown:e=>{e.target instanceof HTMLElement&&e.target.dataset.dismissible===`false`||ee(!0)},onPointerUp:()=>ee(!1)},w.filter(e=>!e.position&&n===0||e.position===t).map((n,i)=>z.createElement(en,{key:n.id,icons:y,index:i,toast:n,defaultRichColors:f,duration:g?.duration??p,className:g?.className,descriptionClassName:g?.descriptionClassName,invert:r,visibleToasts:h,closeButton:g?.closeButton??s,interacting:A,position:t,style:g?.style,unstyled:g?.unstyled,classNames:g?.classNames,cancelButtonStyle:g?.cancelButtonStyle,actionButtonStyle:g?.actionButtonStyle,closeButtonAriaLabel:g?.closeButtonAriaLabel,removeToast:oe,toasts:w.filter(e=>e.position==n.position),heights:E.filter(e=>e.position==n.position),setHeights:D,expandByDefault:o,gap:v,expanded:O,swipeDirections:e.swipeDirections}))):null}))}),an={name:`activity`,size:24,node:[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`,key:`169zse`}]]};an.node;var on=M(an),sn={name:`arrow-right`,size:24,node:[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`m12 5 7 7-7 7`,key:`xquz4c`}]]};sn.node;var cn=M(sn),ln={name:`book-open`,size:24,node:[[`path`,{d:`M12 5v16`,key:`1f6ucr`}],[`path`,{d:`M20.001 19A2 2 0 0022 17V5a2 2 0 00-1.999-2L16 3.002A5 5 0 0012 5a5 5 0 00-4-2H4a2 2 0 00-2 2v12a2 2 0 001.999 2H8a5 5 0 014 2 5 5 0 014-2z`,key:`1fyvmf`}]]};ln.node;var un=M(ln),dn={name:`bot`,size:24,node:[[`path`,{d:`M12 8V4H8`,key:`hb8ula`}],[`rect`,{width:`16`,height:`12`,x:`4`,y:`8`,rx:`2`,key:`enze0r`}],[`path`,{d:`M2 14h2`,key:`vft8re`}],[`path`,{d:`M20 14h2`,key:`4cs60a`}],[`path`,{d:`M15 13v2`,key:`1xurst`}],[`path`,{d:`M9 13v2`,key:`rq6x2g`}]]};dn.node;var fn=M(dn),pn={name:`circle-check`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m16 9-5.5 5.5L8 12`,key:`xofnsj`}]],aliases:[`check-circle-2`]};pn.node;var mn=M(pn),hn={name:`git-compare-arrows`,size:24,node:[[`circle`,{cx:`5`,cy:`6`,r:`3`,key:`1qnov2`}],[`path`,{d:`M12 6h5a2 2 0 0 1 2 2v7`,key:`1yj91y`}],[`path`,{d:`m15 9-3-3 3-3`,key:`1lwv8l`}],[`circle`,{cx:`19`,cy:`18`,r:`3`,key:`1qljk2`}],[`path`,{d:`M12 18H7a2 2 0 0 1-2-2V9`,key:`16sdep`}],[`path`,{d:`m9 15 3 3-3 3`,key:`1m3kbl`}]]};hn.node;var gn=M(hn),_n={name:`info`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 16v-4`,key:`1dtifu`}],[`path`,{d:`M12 8h.01`,key:`e9boi3`}]]};_n.node;var vn=M(_n),yn={name:`loader-circle`,size:24,node:[[`path`,{d:`M21 12a9 9 0 1 1-6.219-8.56`,key:`13zald`}]],aliases:[`loader-2`]};yn.node;var bn=M(yn),xn={name:`moon`,size:24,node:[[`path`,{d:`M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401`,key:`kfwtm`}]]};xn.node;var Sn=M(xn),Cn={name:`octagon-x`,size:24,node:[[`path`,{d:`m15 9-6 6`,key:`1uzhvr`}],[`path`,{d:`M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z`,key:`2d38gg`}],[`path`,{d:`m9 9 6 6`,key:`z0biqf`}]],aliases:[`x-octagon`]};Cn.node;var wn=M(Cn),Tn={name:`server`,size:24,node:[[`rect`,{width:`20`,height:`8`,x:`2`,y:`2`,rx:`2`,ry:`2`,key:`ngkwjq`}],[`rect`,{width:`20`,height:`8`,x:`2`,y:`14`,rx:`2`,ry:`2`,key:`iecqi9`}],[`line`,{x1:`6`,x2:`6.01`,y1:`6`,y2:`6`,key:`16zg32`}],[`line`,{x1:`6`,x2:`6.01`,y1:`18`,y2:`18`,key:`nzw8ys`}]]};Tn.node;var En=M(Tn),Dn={name:`shield-check`,size:24,node:[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]};Dn.node;var On=M(Dn),kn={name:`sun`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`4`,key:`4exip2`}],[`path`,{d:`M12 2v2`,key:`tus03m`}],[`path`,{d:`M12 20v2`,key:`1lh1kg`}],[`path`,{d:`m4.93 4.93 1.41 1.41`,key:`149t6j`}],[`path`,{d:`m17.66 17.66 1.41 1.41`,key:`ptbguv`}],[`path`,{d:`M2 12h2`,key:`1t8f8n`}],[`path`,{d:`M20 12h2`,key:`1q8mjw`}],[`path`,{d:`m6.34 17.66-1.41 1.41`,key:`1m8zz5`}],[`path`,{d:`m19.07 4.93-1.41 1.41`,key:`1shlcs`}]]};kn.node;var An=M(kn),jn={name:`triangle-alert`,size:24,node:[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]],aliases:[`alert-triangle`]};jn.node;var Mn=M(jn),Nn={name:`upload`,size:24,node:[[`path`,{d:`M12 3v12`,key:`1x0j5s`}],[`path`,{d:`m17 8-5-5-5 5`,key:`7q97r8`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}]]};Nn.node;var Pn=M(Nn),Fn={name:`workflow`,size:24,node:[[`rect`,{width:`8`,height:`8`,x:`3`,y:`3`,rx:`2`,key:`by2w9f`}],[`path`,{d:`M7 11v4a2 2 0 0 0 2 2h4`,key:`xkn7yn`}],[`rect`,{width:`8`,height:`8`,x:`13`,y:`13`,rx:`2`,key:`1cgmvn`}]]};Fn.node;var In=M(Fn),Ln={name:`x`,size:24,node:[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]};Ln.node;var Rn=M(Ln),zn=({...e})=>{let{theme:t}=Tt();return(0,B.jsx)(rn,{theme:t,className:`toaster group`,icons:{success:(0,B.jsx)(mn,{className:`size-4`}),info:(0,B.jsx)(vn,{className:`size-4`}),warning:(0,B.jsx)(Mn,{className:`size-4`}),error:(0,B.jsx)(wn,{className:`size-4`}),loading:(0,B.jsx)(bn,{className:`size-4 animate-spin`})},style:{"--normal-bg":`var(--popover)`,"--normal-text":`var(--popover-foreground)`,"--normal-border":`var(--border)`,"--border-radius":`var(--radius)`},toastOptions:{classNames:{toast:`cn-toast`}},...e})};function Bn(e,t,n){switch(e.type){case`progress`:t.onProgress?.(e);break;case`app`:t.onApp?.(e.data);break;case`stage`:t.onStage?.(e.data);break;case`sql`:t.onSql?.(e.data);break;case`sqlPlan`:t.onSqlPlan?.(e.data);break;case`executor`:t.onExecutor?.(e.data);break;case`job`:t.onJob?.(e.data);break;case`runAggregates`:t.onRunAggregates?.(e.data);break;case`stageExecutorMetrics`:t.onStageExecutorMetrics?.(e.data);break;case`stageSpeculationWaste`:t.onStageSpeculationWaste?.(e.data);break;case`stageLateAttemptWork`:t.onStageLateAttemptWork?.(e.data);break;case`done`:{let{skippedLines:n,unreadableSqlExecutions:r}=e;t.onDone?.(r?{skippedLines:n,unreadableSqlExecutions:r}:{skippedLines:n});break}case`error`:t.onError?.(e);break;case`taskData`:{let t=n?.get(e.reqId);t&&(t.resolve({metrics:e.metrics,fieldNames:e.fieldNames}),n.delete(e.reqId));break}}}function Vn(){let e=null,t=new Map,n=0,r={};function i(){e=new Worker(new URL(new URL(`parser-worker-CRIOPMOW.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),e.onmessage=({data:e})=>Bn(e,r,t),e.onerror=e=>{r.onError?.(`Worker crashed: ${e.message}`),u()}}function a(t,n){r=n,i(),e.postMessage({type:`parse`,file:t})}function o(t,n){r=n,i(),e.postMessage({type:`parseFromUrl`,request:t})}function s(t,n){r=n,i(),e.postMessage({type:`parseFiles`,files:t})}function c(r){return new Promise((i,a)=>{let o=String(n++);t.set(o,{resolve:i,reject:a}),e.postMessage({type:`getTaskData`,stageId:r,reqId:o})})}async function l(e){return await Promise.all(e.map(e=>c(e).then(t=>({stageId:e,...t}))))}function u(){e?.terminate(),e=null;for(let{reject:e}of t.values())e(Error(`Worker terminated`));t.clear()}return{startParse:a,startParseFromUrl:o,startParseFiles:s,requestTaskData:c,prefetchFlaggedStages:l,terminate:u}}function Hn(e,t){let n=t;e.skippedLines=n?.skippedLines??0,n?.unreadableSqlExecutions?e.unreadableSqlExecutions=n.unreadableSqlExecutions:delete e.unreadableSqlExecutions}function Un(e,{onProgress:t,onDone:n,onError:r}){return{onProgress:t,onApp(t){e.app=t},onStage(t){let n=t;e.stages.set(n.id,n)},onSql(t){let n=t;e.sql.set(n.id,t);for(let t of n.stageIds??[]){let r=e.stages.get(t);r&&(r.sqlExecutionId=n.id)}},onSqlPlan(t){let n=t,r=e.sql.get(n.executionId);r&&(r.planTree=n.planTree)},onExecutor(t){let n=t;n.kind===`added`?e.executors.added.push(n):e.executors.removed.push(n)},onJob(t){let n=t;e.jobs.set(n.id,n)},onRunAggregates(t){e.runAggregates=t},onStageExecutorMetrics(t){if(!(t instanceof Map))return;let n=t;for(let[t,r]of n){let n=e.stages.get(t);n&&(n.executorMetrics=r)}},onStageSpeculationWaste(t){let n=t;for(let[t,r]of n){let n=e.stages.get(t);n&&(n.speculationWasteMs=r.speculationWasteMs,n.speculationWastedAttempts=r.speculationWastedAttempts)}},onDone(t){Hn(e,t),n?.(t)},onStageLateAttemptWork(t){for(let[n,r]of t){let t=e.stages.get(n);t&&(t.lateAttemptWork=r)}},onError:r}}function Wn(e){let t=e.length;if(t===0)return 0;let n=t>>1;return t%2==1?e[n]:(e[n-1]+e[n])/2}function Gn(e,t){let n=t.reduce((e,t)=>e+(t.totalCores??0),0);if(n<=0){let r=e.resources?.executor?.cores??null;n=r==null?0:t.length*r}return n}function Kn(e){let t=[...e].sort((e,t)=>e.time-t.time||e.delta-t.delta),n=0,r=0;for(let e of t)n+=e.delta,n>r&&(r=n);return r}function qn(e,t,n){let r=new Map,i=[];for(let e of t){let t=e.totalCores??0;r.set(e.executorId,t),i.push({time:e.timestamp,delta:t})}for(let e of n){let t=r.get(e.executorId)??0;i.push({time:e.timestamp,delta:-t})}let a=Kn(i);if(a>0)return a;let o=Jn(t,n),s=e.resources?.executor?.cores??null;return s==null?0:o*s}function Jn(e,t){return Kn([...e.map(e=>({time:e.timestamp,delta:1})),...t.map(e=>({time:e.timestamp,delta:-1}))])}function Yn(e){if(e==null)return null;let t=String(e).trim().toLowerCase().match(/^([\d.]+)\s*([kmgt]?)(b?)$/);if(!t)return null;let n=parseFloat(t[1]);if(!Number.isFinite(n))return null;switch(t[2]){case`k`:return Math.round(n/1024);case`g`:return Math.round(n*1024);case`t`:return Math.round(n*1024*1024);case`m`:return Math.round(n);default:return t[3]===`b`?Math.round(n/1048576):Math.round(n)}}var H=`always`,Xn=[`spark.sql.adaptive.autoBroadcastJoinThreshold`,`spark.sql.adaptive.coalescePartitions.initialPartitionNum`];function Zn(e){return e in $n||Xn.includes(e)}var Qn=`*********(redacted)`,$n={"spark.speculation":[[H,`false`]],"spark.speculation.multiplier":[[H,`1.5`],[[4,0],`3`]],"spark.speculation.quantile":[[H,`0.75`],[[4,0],`0.9`]],"spark.executor.memory":[[H,`1g`]],"spark.serializer":[[H,`org.apache.spark.serializer.JavaSerializer`]],"spark.shuffle.service.enabled":[[H,`false`]],"spark.eventLog.logBlockUpdates.enabled":[[H,`false`]],"spark.eventLog.logStageExecutorMetrics":[[H,`false`]],"spark.dynamicAllocation.enabled":[[H,`false`]],"spark.dynamicAllocation.minExecutors":[[H,`0`]],"spark.dynamicAllocation.maxExecutors":[[H,`2147483647`]],"spark.dynamicAllocation.executorIdleTimeout":[[H,`60s`]],"spark.sql.shuffle.partitions":[[H,`200`]],"spark.sql.autoBroadcastJoinThreshold":[[H,`10MB`]],"spark.sql.files.maxPartitionBytes":[[H,`128MB`]],"spark.sql.adaptive.enabled":[[H,`false`],[[3,2],`true`]],"spark.sql.adaptive.skewJoin.enabled":[[[3,0],`true`]],"spark.sql.adaptive.coalescePartitions.enabled":[[[3,0],`true`]],"spark.sql.adaptive.skewJoin.skewedPartitionFactor":[[[3,0],`5`]],"spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes":[[[3,0],`256MB`]],"spark.sql.adaptive.forceOptimizeSkewedJoin":[[[3,3],`false`]],"spark.sql.adaptive.advisoryPartitionSizeInBytes":[[[3,0],`64MB`]],"spark.sql.adaptive.coalescePartitions.parallelismFirst":[[[3,2],`true`]],"spark.executor.memoryOverheadFactor":[[[3,3],`0.1`]],"spark.executor.minMemoryOverhead":[[[4,0],`384m`]],"spark.sql.execution.pythonUDF.arrow.enabled":[[[3,4],`false`],[[4,2],`true`]]},er=Qn;function tr(e){let t=/^(\d+)\.(\d+)/.exec(e??``);return t==null?null:[Number(t[1]),Number(t[2])]}function nr(e,t){let n=$n[t];if(n==null)return;let r=tr(e);if(r==null)return n.length===1&&n[0][0]===H?n[0][1]:void 0;let i;for(let[e,t]of n)(e===H||r[0]>e[0]||r[0]===e[0]&&r[1]>=e[1])&&(i=t);return i}function rr(e){return e!==er}function ir(e,t){if(t==null)return e;let n=Object.entries(t).filter(([,e])=>rr(e));return n.length===0?e:{...e,...Object.fromEntries(n)}}function ar(e,t){let n=e.modified?.[t];if(n!==void 0&&rr(n))return{value:n.trim(),source:`query`};let r=e.properties?.[t];if(r!==void 0)return{value:String(r).trim(),source:`app`};let i=nr(e.sparkVersion,t);return i===void 0?void 0:{value:i,source:`default`}}function or(e){let t=/^(-?\d+(?:\.\d+)?)\s*([kmgt]?)b?$/i.exec(e?.trim()??``);return t==null?null:t[2]===``?Number(t[1]):Number(t[1])*1024**(`kmgt`.indexOf(t[2].toLowerCase())+1)}function sr(e,t){let[n,r]=tr(e.sparkVersion)??[1/0,0],i=Number.parseFloat(ar(e,`spark.executor.memoryOverheadFactor`)?.value??``),a=Yn(ar(e,`spark.executor.minMemoryOverhead`)?.value);return{factor:(n>3||n===3&&r>=3)&&Number.isFinite(i)&&i>0?i:t.floorPct,minMB:n>=4&&a!=null&&a>=0?a:t.floorMB}}var cr=36e5,lr=1e3,ur=1024,dr={floorMB:384,floorPct:.1};function fr(e){let t=null,n=e=>{typeof e==`number`&&Number.isFinite(e)&&e>0&&(t==null||e>t)&&(t=e)};n(e.app?.startTime),n(e.app?.endTime);for(let t of e.stages.values())n(t.submittedAt),n(t.completedAt);for(let t of[...e.executors.added,...e.executors.removed])n(t.timestamp);return t}function pr(e){let t=e?.config;if(t==null)return null;let n={sparkVersion:e?.sparkVersion,properties:t},r=e=>ar(n,e)?.value,i=e=>{let t=r(e);return t===void 0?void 0:Yn(t)},a=i(`spark.executor.memory`);if(a==null)return null;let o=i(`spark.executor.memoryOverhead`);if(o===void 0&&(o=i(`spark.yarn.executor.memoryOverhead`)),o===void 0){let{minMB:e,factor:t}=sr(n,dr);o=Math.max(e,Math.round(a*t))}let s=r(`spark.memory.offHeap.enabled`)?.toLowerCase()===`true`?i(`spark.memory.offHeap.size`)??0:0,c=i(`spark.executor.pyspark.memory`)??0;return o===null||s===null||c===null?null:a+o+s+c}function mr(e){let t=ar({sparkVersion:e?.sparkVersion,properties:e?.config},`spark.dynamicAllocation.enabled`);return t==null||t.source==="default"?null:t.value.toLowerCase()===`true`?`on`:`off`}function hr(e){let t=mr(e.app),n=gr(e);if(n.length===0)return{coreHours:null,memoryGbHours:null,dynamicAllocation:t,executorsPeak:null,executorsMean:null,executorCores:null,executorSeconds:null};let r=e.app?.endTime??fr(e),i=pr(e.app),a=0,o=0,s=0,c=!0,l=new Set;for(let{start:e,end:t,cores:r}of n){let n=t-e;s+=n,r==null?c=!1:(a+=r*n,l.add(r)),o+=(i??0)*n}let u=e.app?.startTime,d=r!=null&&u!=null?r-u:0,f=n.flatMap(e=>e.removedAt==null?[]:[{executorId:e.executorId,timestamp:e.removedAt}]);return{coreHours:c?a/cr:null,memoryGbHours:i==null?null:o/ur/cr,dynamicAllocation:t,executorsPeak:Jn(n.map(e=>({executorId:e.executorId,timestamp:e.start})),f),executorsMean:d>0?s/d:null,executorCores:c&&l.size===1?[...l][0]:null,executorSeconds:s/lr}}function gr(e){let t=new Map;for(let n of e.executors.removed){let e=t.get(n.executorId);e?e.push(n.timestamp):t.set(n.executorId,[n.timestamp])}let n=e.app?.endTime??fr(e),r=Number.parseInt(ar({sparkVersion:e.app?.sparkVersion,properties:e.app?.config},`spark.executor.cores`)?.value??``,10),i=[],a=new Set;for(let o of e.executors.added){if(a.has(o.executorId))continue;a.add(o.executorId);let e=(t.get(o.executorId)??[]).filter(e=>e>=o.timestamp).sort((e,t)=>e-t)[0]??null;i.push({executorId:o.executorId,start:o.timestamp,end:Math.max(o.timestamp,e??n??o.timestamp),removedAt:e,cores:o.totalCores!=null&&o.totalCores>0?o.totalCores:Number.isFinite(r)?r:null})}return i}function _r(e){let{coreHours:t}=hr(e);return t!=null&&t>0?t*cr:null}function vr(e,t){if(_r(e)==null)return null;let n=0;for(let{start:r,end:i,cores:a}of gr(e))for(let[e,o]of t)n+=(a??0)*Math.max(0,Math.min(i,o)-Math.max(r,e));return n}var yr=new WeakMap;function br(e){let t=yr.get(e);if(t)return t;let n=new Map,r=(e,t)=>{e!==`driver`&&typeof t==`number`&&t>(n.get(e)??0)&&n.set(e,t)};for(let[t,n]of Object.entries(e.runAggregates?.executorPeakMetrics??{}))r(t,n?.jvmHeapMemory);for(let t of e.stages.values()){let e=t.executorMetrics;if(e instanceof Map)for(let[t,n]of e)r(t,n?.jvmHeapMemory)}return yr.set(e,n),n}function U(e,t=null){return{kind:`conf`,key:e,direction:`increase`,suggested:t}}function W(e,t=null){return{kind:`conf`,key:e,direction:`decrease`,suggested:t}}function xr(e,t=null){return{kind:`conf`,key:e,direction:`set`,suggested:t}}function Sr(e){return{kind:`code`,hint:e}}var Cr=`spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes`,wr=`spark.sql.adaptive.skewJoin.skewedPartitionFactor`,Tr=`spark.sql.adaptive.forceOptimizeSkewedJoin`,Er=`spark.sql.adaptive.advisoryPartitionSizeInBytes`,Dr=/^(SortMergeJoin|ShuffledHashJoin)(\(skew=true\))?$/,Or=e=>Dr.test(e),kr=/^(WholeStageCodegen|InputAdapter$|AQEShuffleRead$|CustomShuffleReader$|ColumnarToRow$)/,Ar=/^(AQEShuffleRead|CustomShuffleReader)$/,jr=new Set([`Inner`,`Cross`,`LeftSemi`,`LeftAnti`,`LeftOuter`]),Mr=new Set([`Inner`,`Cross`,`RightOuter`]),Nr=/\]\s*,\s*(Inner|Cross|LeftOuter|RightOuter|FullOuter|LeftSemi|LeftAnti|ExistenceJoin)\b/,Pr=2,Fr=.05,Ir=/Exchange$/,Lr=/\b(ENSURE_REQUIREMENTS|REPARTITION_BY_COL|REPARTITION_BY_NUM|REBALANCE_PARTITIONS_BY_NONE|REBALANCE_PARTITIONS_BY_COL)\b/;function Rr(e,t){return e.metrics?.find(e=>e.name===t)?.value??null}function zr(e){let t=[],n=e,r=!1;for(;n!=null;){if(Ar.test(n.name)&&t.push(n),kr.test(n.name)||n.name===`Sort`&&!r){n.name===`Sort`&&(r=!0),n=n.children[0];continue}break}let i=t.some(e=>/\bcoalesced\b/.test(e.detail??``));if(n==null)return{side:{kind:`operator`,name:`an unknown operator`},reads:t};if(n.name===`ShuffleQueryStage`){let e=Lr.exec(n.children[0]?.detail??``)?.[1];return e==null||e===`ENSURE_REQUIREMENTS`?{side:{kind:`joinShuffle`,coalesced:i},reads:t}:{side:{kind:`userShuffle`,hint:e.startsWith(`REBALANCE`)?`rebalance`:`repartition`,coalesced:i},reads:t}}return{side:{kind:`operator`,name:n.name},reads:t}}function Br(e){return/Aggregate$/.test(e)?`an aggregate`:/^Window/.test(e)?`a window`:/Scan/.test(e)?`a scan`:`a ${e} operator`}function Vr(e){for(let t of e){if(/Exchange$|^ShuffleQueryStage$/.test(t.name))return null;if(/Aggregate$/.test(t.name)&&!/partial_/.test(t.detail??``))return`an aggregate`;if(/^Window/.test(t.name))return`a window`;if(Dr.test(t.name))return`another join`}return null}function Hr(e){let t=new Map,n=[];return L(e,(e,r)=>{t.set(e,r),Dr.test(e.name)&&n.push(e)}),n.map(e=>{let n=[];for(let r=t.get(e)??null;r!=null;r=t.get(r)??null)n.push(r);return{node:e,ancestors:n}})}function Ur(e){if(e==null||e.name!==`AdaptiveSparkPlan`||!/isFinalPlan=true/.test(e.detail??``))return null;let t=!1;return L(e,e=>{Ar.test(e.name)&&/\bskewed\b/.test(e.detail??``)&&(t=!0)}),t}function Wr(e,t=[`shuffle bytes written`,`data size`]){let n=null;return L(e,e=>{if(n==null&&Ir.test(e.name))for(let r of t){let t=Rr(e,r);if(t!=null){n=t;return}}}),n}function Gr(e,t){let n=[];L(e.node,e=>{Ir.test(e.name)&&n.push(e)});let r=n.filter(e=>(e.stageIds?.length??0)>0);if(r.length>0)return r.some(e=>e.stageIds.includes(t.stageId));let i=Wr(e.node.children[0],[`shuffle bytes written`]),a=Wr(e.node.children[1],[`shuffle bytes written`]),o=t.stageShuffleReadBytes??0;return i==null||a==null||!(o>0)||!(i+a>0)?!1:Math.abs(o-(i+a))<=.1*(i+a)}function Kr(e){return e===0?`left`:`right`}function qr(e,t){let{node:n}=e,r=zr(n.children[0]),i=zr(n.children[1]),a=[...r.reads,...i.reads].filter(e=>/\bskewed\b/.test(e.detail??``));if(/\(skew=true\)$/.test(n.name)||a.length>0){let e=a.reduce((e,t)=>e+(Rr(t,`number of skewed partitions`)??0),0),n=a.reduce((e,t)=>e+(Rr(t,`number of skewed partition splits`)??0),0),r=e>0&&n>0?`AQE already split ${e} skewed partition${e===1?``:`s`} into ${n} tasks`:`AQE already split the skewed partitions`;return t.tailData==null?{case:`split`,text:`${r}, so the imbalance that remains is not join skew: look for a GC pause, a slow host or an expensive key instead`,remediation:[]}:{case:`split`,text:`${r}, yet the slow tasks still read far more data than the median task${t.tailData.ratio==null?``:` (a median ${Math.round(t.tailData.ratio*100)/100}× the data of the median task)`}, so skew remains that the split did not remove: ${t.keyRemedy}`,remediation:[Sr(t.keyRemedy)]}}let o=r.side.kind!==`operator`&&r.side.coalesced||i.side.kind!==`operator`&&i.side.coalesced,s=t.readP50>0?Math.round(t.readMax/t.readP50*100)/100:null,c=Wr(n.children[0]),l=Wr(n.children[1]),u=(c??0)+(l??0),d=c!=null&&l!=null&&u>0&&Math.min(c,l)<=Fr*u;if(!o&&d&&t.tailData==null&&t.readP50>0&&t.readMax<Pr*t.readP50)return{case:`evenReads`,text:`its shuffle reads are even (the largest task reads ${p(t.readMax)}, ${s}× the median), so AQE has no skewed partition to split and the slow tail is not partition-size skew: look for a GC pause, a slow host or an expensive key instead`,remediation:[]};let f=[r.side,i.side].map((e,t)=>({s:e,i:t})).find(e=>e.s.kind===`operator`);if(f?.s.kind===`operator`){let e=Br(f.s.name);return{case:`planShape`,text:`AQE skew-join handling cannot apply: the join's ${Kr(f.i)} input comes from ${e} instead of a shuffle, and AQE splits only a shuffle that feeds the join directly; ${t.keyRemedy}`,remediation:[Sr(t.keyRemedy)]}}let m=[r.side,i.side].find(e=>e.kind===`userShuffle`);if(m?.kind===`userShuffle`)return{case:`userRepartition`,text:`a ${m.hint} you wrote feeds the join, and AQE leaves a shuffle you asked for as it is (it splits only shuffles Spark added for the join): drop the ${m.hint} so the join's own shuffle can be split, or ${t.keyRemedy}`,remediation:[Sr(`drop the explicit ${m.hint} ahead of the join, or ${t.keyRemedy}`)]};let h=Nr.exec(n.detail??``)?.[1],g=h!=null&&jr.has(h),_=h!=null&&Mr.has(h);if(h!=null&&!g&&!_)return{case:`joinType`,text:`AQE never splits either side of a ${h} join: join the hot key on its own and union the results, or ${t.keyRemedy}`,remediation:[Sr(`join the hot key separately and union the results, or ${t.keyRemedy}`)]};let v=or(t.conf(Cr)),y=Number.parseFloat(t.conf(`spark.sql.adaptive.skewJoin.skewedPartitionFactor`)??``),b=v!=null&&t.readMax<=v,x=!o&&d&&Number.isFinite(y)&&t.readP50>0&&t.readMax<=y*t.readP50,S=`its largest shuffle partition (${p(t.readMax)})`;if(b&&x)return{case:`belowThreshold`,text:`${S} is under the ${t.conf(Cr)} threshold (${Cr}) and only ${s}× the median, under the ${y}× factor (${wr}) AQE needs before it treats a partition as skewed, so lower both for this query`,remediation:[W(Cr),W(wr)]};if(b)return{case:`belowThreshold`,text:`${S} is under the ${t.conf(Cr)} AQE needs before it treats a partition as skewed (${Cr}), so lower the threshold for this query`,remediation:[W(Cr)]};if(x)return{case:`belowThreshold`,text:`${S} is only ${s}× the median, under the ${y}× AQE needs before it treats a partition as skewed (${wr}), so lower the factor for this query`,remediation:[W(wr)]};let C=or(t.conf(Er));if(o&&C!=null&&t.readMax<=2*C)return null;let w=Vr(e.ancestors),T=t.conf(Tr),E=/^\d+\.\d+/.test(t.sparkVersion??``)?nr(t.sparkVersion,Tr)!=null:T!=null,D=E&&T?.toLowerCase()===`true`,O=w==null||D?null:`AQE skipped splitting it because ${w} above the join needs the join's partitioning and a split would add a shuffle: ${E?`set ${Tr}=true if that shuffle costs less than the tail, or `:``}${t.keyRemedy}`;if(h!=null&&g!==_){let e=g?`left`:`right`,n=g?`right`:`left`,r=w==null||D?``:`; if the skew is on the ${e} side, AQE skipped it because ${w} above the join needs the join's partitioning and a split would add a shuffle${E?` (${Tr}=true accepts that)`:``}`,i=`join the hot key on its own and union the results, or ${t.keyRemedy}`;return{case:`joinType`,text:`AQE can split only the ${e} side of a ${h} join, so a skewed partition on the ${n} side stays whole: if that is where the skew is, ${i}${r}`,remediation:[Sr(i),...r&&E?[xr(Tr,!0)]:[]]}}return O==null?{case:`notSplit`,text:`AQE did not split it although the partition is over the thresholds and the plan allows it, and the log does not say why (a partition built from a single map task cannot be split, for one): ${t.keyRemedy}`,remediation:[Sr(t.keyRemedy)]}:{case:`extraShuffle`,text:O,remediation:[E?xr(Tr,!0):Sr(t.keyRemedy)]}}function Jr(e){let{plan:t}=e;if(t==null||t.name!==`AdaptiveSparkPlan`||!/isFinalPlan=true/.test(t.detail??``))return null;let n=Hr(t),r=n.filter(t=>t.node.stageIds?.includes(e.stageId));r.length===0&&n.length===1&&!n[0].node.stageIds?.length&&Gr(n[0],e)&&(r=n);let i=r.map(t=>qr(t,e)).filter(e=>e!=null);return i.find(e=>e.case===`split`)??i[0]??null}function Yr(e,t){let n=e.sqlExecutionId;if(n==null)return[];let r=t.get(n)?.planTree??null;return r?[...Zr(r).get(e.id)??[]]:[]}var Xr=new WeakMap;function Zr(e){let t=Xr.get(e);if(t)return t;let n=new Map;return(function e(t){for(let e of new Set(t.stageIds??[])){let r=n.get(e);r?r.push(t):n.set(e,[t])}for(let n of t.children??[])e(n)})(e),Xr.set(e,n),n}var Qr=/^(?:\*\(\d+\)\s*)?(?:PythonRDD|BatchEvalPython|ArrowEvalPython|ArrowAggregatePython|ArrowWindowPython|\w+InPandas|\w+InArrow)\w*\b/,$r=/^(?:\*\(\d+\)\s*)?BatchEvalPython$/;function ei(e){return $r.test(e.name??``)}var ti=/PythonRDD/,ni=/org\.apache\.spark\.api\.python\./;function ri(e,t){return ti.test(e.name??``)||ni.test(e.details??``)?!0:Yr(e,t).some(e=>Qr.test(e.name??``))}var ii=new Set([`RACK_LOCAL`,`ANY`]),ai=5,oi=10,si={totalTasks:null,nonLocalTasks:null,ratio:null,topStages:[]};function ci(e,{minTasksPerStage:t=oi,topN:n=ai}={}){if(!Array.isArray(e)||e.length===0)return si;let r=0,i=0,a=[];for(let n of e){let e=n?.localityStats;if(!Array.isArray(e)||e.length===0)continue;let o=0,s=0;for(let{locality:t,count:n}of e)Number.isFinite(n)&&(o+=n,ii.has(t)&&(s+=n));r+=o,i+=s,o>=t&&a.push({stageId:n.id,nonLocalTasks:s,taskCount:o,ratio:s/o})}if(r===0)return si;let o=a.sort((e,t)=>t.nonLocalTasks-e.nonLocalTasks).slice(0,n);return{totalTasks:r,nonLocalTasks:i,ratio:i/r,topStages:o}}var li=[{key:`DURATION`,name:`duration`,prop:`duration`},{key:`GC_TIME`,name:`gcTime`,prop:`gcTime`},{key:`MEM_SPILLED`,name:`memorySpilled`,prop:`memSpilled`},{key:`DISK_SPILLED`,name:`diskSpilled`,prop:`diskSpilled`},{key:`SHUFFLE_READ`,name:`shuffleRead`,prop:`shuffleRead`},{key:`SHUFFLE_WRITE`,name:`shuffleWrite`,prop:`shuffleWrite`},{key:`LAUNCH_TIME`,name:`launchTime`,prop:`launchTime`},{key:`FINISH_TIME`,name:`finishTime`,prop:`finishTime`}],ui=li.length;Object.freeze({...Object.fromEntries(li.map((e,t)=>[e.key,t])),STRIDE:ui}),li.map(e=>e.name),li.map(e=>e.prop);function di(e){return(e.completedAt??0)-(e.submittedAt??0)}function fi(e){let t=di(e);return t>0?(e.executorRunTime??0)/t:0}function pi(e){let t=[...e.values()].filter(e=>di(e)>0),n=new Map;for(let e of t)n.set(e.id,0);if(t.length===0)return n;let r=[];for(let e of t){let t=fi(e);r.push({time:e.submittedAt??0,id:e.id,weight:t,isStart:!0}),r.push({time:e.completedAt??0,id:e.id,weight:t,isStart:!1})}r.sort((e,t)=>e.time-t.time);let i=new Map,a=r[0].time,o=0;for(;o<r.length;){let e=r[o].time;if(e>a&&i.size>0){let t=e-a,r=0;for(let e of i.values())r+=e;for(let[e,a]of i){let o=r>0?a/r:1/i.size;n.set(e,(n.get(e)??0)+t*o)}}for(;o<r.length&&r[o].time===e;){let e=r[o];e.isStart?i.set(e.id,e.weight):i.delete(e.id),o++}a=e}return n}function mi(e){let t=pi(e),n=new Map;for(let r of e.values()){let e=di(r);if(e<=0)continue;let i=t.get(r.id)??0;n.set(r.id,Math.min(1,i/e))}return n}function hi(e,t){let n=e.taskDurationMax??0;if(t<=0)return n;let r=e.executorRunTime??0;return Math.max(n,r/t)}function gi(e,t,n){let r=Math.max(0,di(t)-n);return Math.min(e,r)}function _i(e,t){let n=mi(e),r=new Map;for(let i of e.values()){let e=n.get(i.id);e!==void 0&&r.set(i.id,{gate:e,ceiling:hi(i,t),coreWorkFloor:t>0?(i.executorRunTime??0)/t:0})}return r}var vi=.999;function yi(e,t){if(e.tailReplayRecoveryMs!=null)return e.tailReplayRecoveryMs;let n=e.stragglerExcessMs??0,r=e.peakConcurrentTasks??0;return n<=0||r<=0?t:Math.max(t,n/r)}function bi(e,t){return Math.max(t,e.stragglerExcessMs??0)}function xi(e){let t=e.taskDurationP50??0;return!((e.stragglerCount??0)>0)||e.longestNonStragglerMs==null?t:Math.max(t,e.longestNonStragglerMs)}function Si(e,t,n,r,{shortensLongestTask:i=!1,removedCoreWorkMs:a=0,longestTaskAfterFixMs:o=0}={}){let s=n.get(t),c=r.get(t);if(!s||!c)return null;let l=s.executorRunTime??0,u=a>0&&l>0?c.coreWorkFloor*Math.max(0,1-a/l):c.coreWorkFloor,d=gi(e,s,i?Math.max((s.taskDurationMax??0)-e,o,u):c.ceiling);return c.gate>=vi?{basis:`serial`,wallClock:{low:d,high:d}}:{basis:`contended`,wallClock:{low:d*c.gate,high:d}}}function Ci(e,t,n,r){let i=[],a=[];for(let o of e){let e=Si(t.get(o)??0,o,n,r);if(!e)continue;i.push(e);let s=n.get(o);a.push([s.submittedAt??0,s.completedAt??0])}if(i.length===0)return null;let o=i.reduce((e,t)=>e+t.wallClock.high,0),s=i.reduce((e,t)=>e+t.wallClock.low,0),c=d(a).reduce((e,[t,n])=>e+(n-t),0),l=Math.min(o,c),u=Math.min(s,c);return{basis:i.every(e=>e.basis===`serial`)?`serial`:`contended`,wallClock:{low:u,high:l}}}var wi=.005,Ti=.02,Ei={warnPct:wi,critPct:Ti};function Di(e){if(e?.startTime==null||e?.endTime==null)return null;let t=e.endTime-e.startTime;return t>0?t:null}function Oi(e,t,n){let r=Di(t);if(r==null)return e;for(let t of e){if(t.type===`partitionSizing`&&t.rule===`maxPartitionTooBig`)continue;let e=t.impactEstimate?.wallClock?.high;if(e==null)continue;let i=e/r,{warnPct:a,critPct:o}=n?.(t.type)??Ei;t.impactBand=i>=o?`critical`:i>=a?`warning`:`info`}return e}var ki=125e6,Ai=2e8;function ji(e){let t=(Array.isArray(e.executorStats)?e.executorStats:[]).reduce((e,t)=>e+(t.totalDuration??0),0),n=e.taskCount??0,r=(e.completedAt??0)-(e.submittedAt??0),i=t-(e.executorRunTime??0);return t<=0||n<=0||r<=0||i<=0?null:{perTaskMs:i/n,concurrency:t/r}}function Mi(e){let t=Array.isArray(e.executorStats)?e.executorStats.length:0;return Math.max(1,t)}function Ni(e){let t=e.fetchWaitTime,n=e.executorRunTime??0,r=(e.completedAt??0)-(e.submittedAt??0);return typeof t!=`number`||n<=0||r<=0?null:t/(n/r)}function Pi(e){let t=e.retryWasteMs??0,n=e.wastedAttempts??0,r=Array.isArray(e.retryTaskSamples)?e.retryTaskSamples:[];if(t<=0||n<=0||r.length<n)return t;let i=r.reduce((e,t)=>Math.max(e,(t.attemptNumber??0)+1),1),a=Math.max(1,e.peakConcurrentTasks??1);return Math.min(t,Math.max(i*t/n,t/a))}var Fi=134217728,Ii=125e6,Li=15e3,Ri=125e6,zi=.01;function Bi(e,t=new Map){let n=e.executorRunTime??0,r=O(e.executorCpuTime??0);return n<=0||r<=0||ri(e,t)?!1:r/n<zi}var Vi={shortensLongestTask:!0};function G(e,t){return t?{basis:`resourceOnly`,wallClock:null,estimateMethod:e,rawWaste:t}:{basis:`informational`,wallClock:null,estimateMethod:e}}function Hi(e,t){return{...e,assumptions:t}}function Ui(e,t){let n=Array.isArray(t.executorStats)?t.executorStats.length:0,r=`${Math.round(e/1e6)} MB/s`;return n===0?`assumes ${r} on one device, as the stage has no per-executor data`:`assumes ${r} per executor over ${n} ${n===1?`executor`:`executors`}`}function Wi(){return G(`none`)}function Gi(e,t,n,r,i,a){let o=Si(e,t,n.stages,n.occupancy,a);return o?{basis:o.basis,wallClock:o.wallClock,estimateMethod:r,rawWaste:i}:G(r,i)}function Ki(e,t,n,r,i){let a=Ci(e,t,n.stages,n.occupancy);return a?{basis:a.basis,wallClock:a.wallClock,estimateMethod:r,rawWaste:i}:null}function qi(e,t,n){let r=e>0?{value:e,unit:`ms`}:void 0;if(!t||t.length===0)return G(`modeled`,r);let i=e/t.length;return Ki(t,new Map(t.map(e=>[e,i])),n,`modeled`,r)??G(`modeled`,r)}var Ji=new Set([`gc`,`retryWaste`,`speculationWaste`]);function Yi(e,t){if(t.coreTimeMs!==void 0)return t.coreTimeMs;let n=t.rawWaste;return!n||!Ji.has(e.type)?null:{low:n.value,high:n.value}}var Xi=`number of output rows`,Zi=/^BroadcastNestedLoopJoin\s+Build(?:Left|Right),\s*(\w+)(?:,\s*([\s\S]+))?$/,Qi=/^CartesianProduct(?:\s+([\s\S]+))?$/;function $i(e){let t=(e??``).replace(/#\d+L?/g,``).trim();return t.length>0?t:null}function ea(e){let t=(e.detail??``).trim();if(e.name===`BroadcastNestedLoopJoin`){let e=t.match(Zi);return{operator:`BroadcastNestedLoopJoin`,joinType:e?.[1]??null,condition:$i(e?.[2])}}return e.name===`CartesianProduct`?{operator:`CartesianProduct`,joinType:`Inner`,condition:$i(t.match(Qi)?.[1])}:null}var ta=new Set([`WholeStageCodegen`,`InputAdapter`,`Project`,`Sort`,`Exchange`,`BroadcastExchange`,`ShuffleQueryStage`,`BroadcastQueryStage`,`AQEShuffleRead`,`CustomShuffleReader`,`ColumnarToRow`,`AdaptiveSparkPlan`]);function na(e){let t=e;for(;t;){let e=t.metrics?.find(e=>e.name===Xi);if(e)return e.value;if(!(ta.has(t.name)||/^WholeStageCodegen/.test(t.name))||t.children.length!==1)return null;t=t.children[0]}return null}function ra(e){let t=e.metrics?.find(e=>e.name===Xi);return t?t.value:null}function ia(e){return e.flatMap(e=>[e,...[e.earlierAttempts,e.lateAttemptWork].filter(e=>e!=null).map(({durationMs:t,...n})=>({id:e.id,...n,submittedAt:0,completedAt:t??void 0}))])}function aa(e){let t=0;for(let n of e)typeof n.executorCpuTime==`number`&&Number.isFinite(n.executorCpuTime)&&n.executorCpuTime>0&&(t+=n.executorCpuTime);return t>0?O(t):null}function oa(e){if(!e.some(e=>(e.taskCount??0)>0))return null;let t=0,n=!1;for(let r of e)typeof r.outputRecords==`number`&&Number.isFinite(r.outputRecords)&&(t+=r.outputRecords,n=!0);return n?t:null}function sa(e,t=0){let n=3735928559^t,r=1103547991^t;for(let t=0;t<e.length;t++){let i=e.charCodeAt(t);n=Math.imul(n^i,2654435761),r=Math.imul(r^i,1597334677)}return n=Math.imul(n^n>>>16,2246822507)^Math.imul(r^r>>>13,3266489909),r=Math.imul(r^r>>>16,2246822507)^Math.imul(n^n>>>13,3266489909),(4294967296*(2097151&r)+(n>>>0)).toString(16)}var ca=`[redacted]`;function la(e){return e.className?e.className:e.lossReason?e.reason?`${e.reason}: ${e.lossReason}`:e.lossReason:e.reason}var ua=/^\s*(?:at \S.*|\.\.\.(?: \d+ more)?)$/,da=/^((?:Caused by: |Suppressed: )?[\w$]+(?:\.[\w$]+)+)(?::.*)?$/;function fa(e){let t=[];for(let n of e.split(`
3
+ `)){if(ua.test(n)){t.push(n);continue}let e=da.exec(n.trim());e&&t.push(e[1])}return t.join(`
4
+ `)}function pa(e){return{...e,message:e.message==null?null:ca,stackExcerpt:e.stackExcerpt==null?null:fa(e.stackExcerpt)}}function ma(e){let t=e.className??e.reason??`Unknown failure`,n=[e.message,e.lossReason].filter(e=>e!=null).join(` · `);return n?`${t}: ${n}`:t}var K=1048576,ha=1024*K;function ga(e){let[t,n]=[[`GB`,ha],[`MB`,K],[`KB`,1024]].find(([,t])=>e>=t)??[`bytes`,1];return`${Math.round(e/n*10)/10} ${t}`}function _a(e){if(e==null)return!1;for(let t of e.values())if(t.sqlExecutionId==null)return!0;return!1}function va(e,t){let{taskCount:n,spillDiskMax:r=0,spillMemMax:i=0,spillDiskP50:a=0,spillMemP50:o=0}=e;if(n===1){if(r>=t.singleTaskDiskGiB*ha||i>=t.singleTaskMemGiB*ha)return{magnitude:`severe`}}else{let e=n>0?r/n:0;if(r>=t.highDiskGiB*ha||e>=t.highTaskDiskMB*K||i>=t.highMemGiB*ha)return{magnitude:`high`};if(r>=t.medDiskMB*K||i>=t.medMemGiB*ha)return{magnitude:`medium`}}if(n>=t.skewMinTasks){if(a>0&&r/a>t.skewRatio&&r>=t.skewDiskFloorMB*K)return{magnitude:`high`};if(o>0&&i/o>t.skewRatio&&i>=t.skewMemFloorMB*K)return{magnitude:`medium`}}return null}function ya(e){return!Array.isArray(e)||e.length===0?null:[...e].sort((e,t)=>t.count-e.count)[0].reason}function ba(e,t){let n=new Set;for(let t of e)for(let e of t.stageIds??[])n.add(e);return n.size>0?[...n].sort((e,t)=>e-t):t}function xa(e){return(e??[]).filter(e=>!e.executorSide).map(e=>e.name).sort().join(`,`)}function Sa(e,t={}){let{includeDetail:n=!1,normalizeDetail:r=e=>e}=t,i=new WeakMap,a=[];function o(e,t){a.push(e);let s=e.exchangeRole===`read`?e.children[0]:null,c=s?s.children:e.children??[],l=s?s.metrics:e.metrics,u=c.map(e=>o(e,!1)),d=1+u.reduce((e,t)=>e+t.size,0),f=xa(l),p=u.map(e=>sa(e.fingerprint)).join(`,`),m={size:d,fingerprint:t&&n?`${e.name}[${f}]<${r(e.detail??``)}>{${p}}`:`${e.name}[${f}]{${p}}`};return i.set(e,m),m}return o(e,!0),{shapeOf:i,allNodes:a}}function Ca(e){let t=e.replace(/#\d+L?/g,``).replace(/,?\s*plan_id=\d+/g,``).replace(/\[codegen id\s*:\s*\d+\]/gi,`[codegen id]`).replace(/\bBuild(Left|Right)\b/g,`BuildSide`);return t=t.replace(/(?<![A-Za-z_])([A-Za-z_][\w.]*)\s*=\s*([A-Za-z_][\w.]*)/g,(e,t,n)=>{let[r,i]=[t,n].sort();return`${r} = ${i}`}),t}var wa=/Join/i,Ta=new WeakMap;function Ea(e){let t=Ta.get(e);return t===void 0&&(t=Ee(e.name??``,e.detail??``),Ta.set(e,t)),t}function Da(e){return wa.test(e)?`join`:e===`Union`?`union`:null}function Oa(e){let t=[],n=[];function r(e){n.push(e);let i=(e.children??[]).map(r);n.pop();let a=xa(e.metrics),o=i.map(e=>sa(e.fingerprint)).join(`,`),s=`${e.name}[${a}]{${o}}`,c=new Map,l=Ea(e);if(l){let t=(e.metrics??[]).find(e=>e.name===La);c.set(l,(c.get(l)??0)+(t?t.value:0))}for(let e of i)for(let[t,n]of e.leafRelationBytes)c.set(t,(c.get(t)??0)+n);let u=Da(e.name??``);return u&&t.push({node:e,operator:u,fingerprint:`${e.name}[${a}]<${Ca(e.detail??``)}>{${o}}`,leafRelationBytes:new Map(c),ancestorNodes:n.slice()}),{fingerprint:s,leafRelationBytes:c}}return r(e),t}function ka(e){let t=null;return L(e,e=>{t||=Ea(e)}),t}function Aa(e,{minSubtreeSize:t,minOccurrences:n}){let{shapeOf:r,allNodes:i}=Sa(e),a=i.filter(e=>r.get(e).size>=t&&e.exchangeRole!==`write`),o=new Map;for(let e of a){let t=r.get(e).fingerprint;o.has(t)||o.set(t,[]),o.get(t).push(e)}let s=[...o.values()].filter(e=>e.length>=n).sort((e,t)=>r.get(t[0]).size-r.get(e[0]).size),c=new WeakSet,l=e=>{c.add(e);for(let t of e.children??[])l(t)},u=[];for(let e of s){let t=e.filter(e=>!c.has(e));if(!(t.length<n)){for(let e of t)l(e);u.push({rootName:t[0].name,subtreeSize:r.get(t[0]).size,occurrences:t.length,isExchangeRoot:Oe(t[0]),sampleRelation:ka(t[0]),groupIndex:u.length,nodes:t})}}return u}function ja(e){let t=e=>{let t=[];return L(e,e=>t.push(e.detail??``)),t},n=e=>Ca(e).replace(/\b(\w+QueryStage)\s+\d+/g,`$1`),r=t(e[0]),i=[];for(let a of e.slice(1)){let e=t(a);if(e.length!==r.length)return!1;for(let t=0;t<r.length;t++)if(e[t]!==r[t]&&(i[t]??=n(r[t]),n(e[t])!==i[t]))return!1}return!0}function Ma(e){return e.exchangeRole!==`write`&&!e.name.startsWith(`WholeStageCodegen`)}function Na(e){let t=new Map;for(let n of e)if(Ma(n))for(let e of n.stageIds??[])t.set(e,(t.get(e)??0)+1);return t}function Pa(e,t){let n={};for(let[r,i]of Na(e))n[r]=i/(t.get(r)??i);return n}function Fa(e,t,n){return e<=n.minSubtreeSize&&t<=n.minOccurrences?`low`:e>=n.minSubtreeSize*2||t>=n.minOccurrences+2?`high`:`medium`}var Ia=`number of files read`,La=`size of files read`,Ra=`number of written files`,za=`written output`,Ba=/^(Sort|InputAdapter|WholeStageCodegen|ShuffleQueryStage|AQEShuffleRead|CustomShuffleReader)\b/;function Va(e){if(e.name===`ReusedExchange`)return null;let t=(e.metrics??[]).some(e=>e.name===`data size`);if(Oe(e)&&!De(e.name)&&t)return e;let n=e.children??[];return n.length!==1||!(Oe(e)||Ba.test(e.name))?null:Va(n[0])}function Ha(e){return(e.metrics??[]).find(e=>e.name===`data size`)?.value??0}var Ua=new Set([`Inner`,`Cross`,`RightOuter`]),Wa=new Set([`Inner`,`Cross`,`LeftOuter`,`LeftSingle`,`LeftSemi`,`LeftAnti`,`ExistenceJoin`]);function Ga(e){let t=ke(e.detail??``);if(t==null||(e.children??[]).length!==2)return null;let n=Va(e.children[0]),r=Va(e.children[1]);if(!n||!r)return null;let i=[];return Ua.has(t)&&i.push({joinType:t,buildSide:`left`,build:n,stream:r}),Wa.has(t)&&i.push({joinType:t,buildSide:`right`,build:r,stream:n}),i.reduce((e,t)=>e==null||Ha(t.build)<Ha(e.build)?t:e,null)}function Ka(e,t=()=>!0){if(e.length<3)return null;let n=Wn(e.map(e=>e.value).sort((e,t)=>e-t));if(n<=0)return null;let r=e.filter(t);if(r.length===0)return null;let i=r.reduce((e,t)=>t.value>e.value?t:e);return{key:i.key,ratio:i.value/n,value:i.value}}function qa(e,t){return Math.sqrt(2*Math.log(e/(2*t)))}function Ja(e){let t=e.filter(e=>e.taskCount>0),n=0,r=0;for(let e of t){if(!Number.isFinite(e.logDurationSum)||!Number.isFinite(e.logDurationM2))return null;n+=e.taskCount,r+=e.logDurationSum}if(n<2)return null;let i=r/n,a=0,o=t.map(e=>e.logDurationSum/e.taskCount);t.forEach((e,t)=>{a+=e.logDurationM2+e.taskCount*(o[t]-i)**2});let s=Math.sqrt(a/(n-1));if(!(s>0)||!Number.isFinite(s))return null;let c=Wn([...o].sort((e,t)=>e-t));return new Map(t.map((e,t)=>[e.executorId,(o[t]-c)/(s/Math.sqrt(e.taskCount))]))}function Ya(e,t,n,r){return{confidence:`low`,validationRequired:`One of ${n} executors: the largest of ${n} per-executor mean task times reaches ${Math.round(t*10)/10}x the median by chance when task durations vary widely or each executor ran few tasks (${r} tasks over ${n} executors here). Compare per-task times on executor ${e} in the Spark UI before acting.`,executorCount:n,taskCount:r}}function Xa(){return Es.map(e=>({type:e.type,version:e.version??1,scope:e.scope,thresholds:e.thresholds,docAnchor:e.docAnchor}))}function Za(e,t){let{taskCount:n,taskDurationP50:r,taskDurationP95:i,taskDurationMax:a}=e;return r===0?null:(n??0)>=t?{ratio:i/r,metric:`P95/median`}:{ratio:a/r,metric:`max/median`}}function Qa(e,t,n){return t==null||e>=t*n}function $a(e,t,n){let r=(e.completedAt??0)-(e.submittedAt??0),i=Di(t.app);return i!=null&&r>0&&r<i*n}function eo(e,t,n){return{wasteMs:yi(e,t),removedCoreWorkMs:bi(e,t),longestTaskAfterFixMs:n}}function to(e,t){let n=e.taskDurationP50??0;return eo(e,Math.max(0,t?(e.taskDurationP95??0)-n:(e.taskDurationMax??0)-n),xi(e))}function no(e){let t=xi(e);return eo(e,Math.max(0,(e.taskDurationMax??0)-t),t)}function ro(e,t,n){return{...Gi(e.wasteMs,t,n,`measured`,{value:e.wasteMs,unit:`ms`},{...Vi,removedCoreWorkMs:e.removedCoreWorkMs,longestTaskAfterFixMs:e.longestTaskAfterFixMs}),coreTimeMs:{low:e.removedCoreWorkMs,high:e.removedCoreWorkMs}}}function io(e,t,n){return ro(e,t,n.impact).wallClock?.high??e.wasteMs}function ao(e,t,n,r,i){let a=Za(e,r);return a===null||a.ratio<=n?null:Qa(io(to(e,a.metric===`P95/median`),e.id,t),Di(t.app),i)?a:null}function oo(e,t){let n=e.tailAttribution??null;if(n===null||!(n.excessMs>0))return{cause:`unattributed`,sharePct:0,attribution:n};let r=e=>Math.round(e/n.excessMs*100);if(n.dataMs/n.excessMs>=t)return{cause:`data`,sharePct:r(n.dataMs),attribution:n};let i=Math.max(0,n.excessMs-n.dataMs-n.gcMs-n.fetchWaitMs-n.hostMs),[a,o]=[[`gc`,n.gcMs],[`fetchWait`,n.fetchWaitMs],[`host`,n.hostMs],[n.dataRatio===null?`unattributed`:`unexplained`,i]].reduce((e,t)=>t[1]>e[1]?t:e);return{cause:a,sharePct:a===`unattributed`?0:r(o),attribution:n}}function so(e,t){return ar({sparkVersion:e?.sparkVersion,properties:e?.config},t)?.value}function co(e,t){return sr({sparkVersion:e?.sparkVersion,properties:e?.config},t)}var lo=new WeakMap;function uo(e,t){if(t==null)return e;let n=lo.get(t);if(n?.base===e)return n.derived;let r=ir(e?.config,t);if(r===e?.config)return e;let i={...e,config:r};return lo.set(t,{base:e,derived:i}),i}function fo(e,t){return uo(e.app,t.sqlExecutionId==null?void 0:e.sql.get(t.sqlExecutionId)?.modifiedConfigs)}function po(e){let t=Number.parseFloat(so(e,`spark.speculation.multiplier`)??``),n=Number.parseFloat(so(e,`spark.speculation.quantile`)??``);return!Number.isFinite(t)||!Number.isFinite(n)?null:`a task running over ${t}x the median is relaunched once ${Math.round(n*100)}% of the stage's tasks have finished`}function mo(e){let t=po(e);return t==null?``:` (with this run's settings, ${t})`}function ho(e,t,n){let r=so(e,t);return typeof n==`boolean`?r?.toLowerCase()===String(n):r===n}function go(e,t,n){return ho(e,t,n)?[]:[xr(t,n)]}function _o(e,t,n,r,i){return e?{text:i,remediation:[]}:{text:r,remediation:[xr(t,n)]}}function vo(e){return br(e).size>0&&(e.app?.resources?.executor?.memoryMB??0)>0}var yo=`spark.eventLog.logStageExecutorMetrics`,bo=`spark.sql.execution.pythonUDF.arrow.enabled`,xo=`data sent to Python workers`,So=`data returned from Python workers`;function Co(e){return _o(ho(e,bo,!0),bo,!0,`set ${bo}=true to ship rows in Arrow batches, or rewrite the UDF as a pandas UDF.`,`Arrow-optimized Python UDFs are already on for the session, so this UDF may have opted out with useArrow=False, take no arguments, or have been created before the property was set: check which, or rewrite it as a pandas UDF.`)}var wo=2,To=`salt the key or repartition on a better key`;function Eo(e){return e.shuffleReadBytes>0&&e.shuffleReadBytes>=e.inputBytes?`shuffle`:e.inputBytes>0?`input`:`other`}function Do(e){let t=/^(\d+)\./.exec(e?.sparkVersion??``);return t!=null&&Number(t[1])<3}function Oo(e,t,n){if(n||e.shuffleReadBytes>0&&e.shuffleReadBytes>=e.inputBytes){let n=!1,r=e.sqlExecutionId==null?null:t.sql.get(e.sqlExecutionId)?.planTree;return L(r,e=>{Or(e.name)&&(n=!0)}),n?`shuffleJoin`:`other`}return e.inputBytes>0?`inputScan`:`other`}function ko(e,t,n=!1,r){let i=Oo(e,t,n);if(i===`inputScan`)return{origin:i,text:`the stage reads uneven input files: compact small files or split large ones (lower spark.sql.files.maxPartitionBytes)`,remediation:[W(`spark.sql.files.maxPartitionBytes`)]};if(i===`other`)return{origin:i,text:To,remediation:[Sr(To)]};if(Do(t.app))return{origin:`other`,text:To,remediation:[Sr(To)]};let a=fo(t,e),o=Ao(a),s=r?.cause===`data`?{ratio:r.attribution?.dataRatio??null}:void 0,c=!ho(a,`spark.sql.adaptive.enabled`,!1)&&ho(a,`spark.sql.adaptive.skewJoin.enabled`,!0)&&e.sqlExecutionId!=null?Jr({plan:t.sql.get(e.sqlExecutionId)?.planTree,stageId:e.id,readMax:e.shuffleReadMax,readP50:e.shuffleReadP50,stageShuffleReadBytes:e.shuffleReadBytes,...s?{tailData:s}:{},conf:e=>so(a,e),sparkVersion:a?.sparkVersion,keyRemedy:To}):null;return c==null?{origin:i,...o}:{origin:i,aqeSkew:c.case,text:c.text,remediation:c.remediation}}function Ao(e){let t=`spark.sql.adaptive.skewJoin.enabled`;if(ho(e,`spark.sql.adaptive.enabled`,!1))return{text:`AQE is off, so enable it (spark.sql.adaptive.enabled) for skew-join handling to apply; otherwise ${To}`,remediation:[xr(`spark.sql.adaptive.enabled`,!0),...go(e,t,!0)]};let n=_o(ho(e,t,!0),t,!0,`for join-driven skew, enable AQE skew-join handling (${t}); otherwise ${To}`,`AQE skew-join handling is already on, so ${To}`);return n.remediation.length===0?{...n,remediation:[Sr(To)]}:n}function jo(e,t,n){let r=`spark.dynamicAllocation.enabled`;return _o(e.resources?.dynamicAllocationEnabled===!0||ho(e,r,!0),r,!0,t,n)}function Mo(e,t,n){let r=jo(e,t,n);return r.remediation.length>0?{...r,remediation:[...r.remediation,W(`spark.executor.instances`)]}:Number.parseInt(so(e,`spark.dynamicAllocation.minExecutors`)??``,10)>0?{text:`${n} by lowering spark.dynamicAllocation.maxExecutors and spark.dynamicAllocation.minExecutors`,remediation:[W(`spark.dynamicAllocation.maxExecutors`),W(`spark.dynamicAllocation.minExecutors`)]}:{text:`${n} by lowering spark.dynamicAllocation.maxExecutors`,remediation:[W(`spark.dynamicAllocation.maxExecutors`)]}}function No(e){let t=so(e,`spark.sql.shuffle.partitions`);return t!=null&&/^\d+$/.test(t)?Number(t):null}var Po=`spark.sql.adaptive.coalescePartitions.initialPartitionNum`;function Fo(e,t){let n=fo(t,e),r=e.sqlExecutionId!=null&&ho(n,`spark.sql.adaptive.enabled`,!0),i=r&&ho(n,`spark.sql.adaptive.coalescePartitions.enabled`,!0),a=i?so(n,Po):void 0,o=e.sqlExecutionId==null?null:t.sql.get(e.sqlExecutionId)?.planTree,s=r?Ur(o):null,c=Io(o);return a!=null&&/^\d+$/.test(a)?{count:Number(a),key:Po,aqe:r,coalesce:i,skewSplit:s,explicitRepartition:c}:{count:No(n),key:`spark.sql.shuffle.partitions`,aqe:r,coalesce:i,skewSplit:s,explicitRepartition:c}}function Io(e){let t=!1;return L(e,e=>{/\b(REPARTITION_BY_NUM|REPARTITION_BY_COL|REBALANCE_PARTITIONS_BY_NONE|REBALANCE_PARTITIONS_BY_COL)\b/.test(e.detail??``)&&(t=!0)}),t}function Lo(e,t){return t.count==null||e.taskCount===t.count?`matches`:t.coalesce&&e.taskCount<t.count?`coalesced`:t.aqe&&e.taskCount>t.count&&(t.skewSplit!==!1||!t.explicitRepartition)?`adjusted`:`own`}function Ro(e,t){let n=Fo(e,t),{count:r,key:i}=n,a=Math.ceil(e.shuffleReadBytes/Fi),o=Math.max(1,e.taskCount),s=Lo(e,n),c=`raise`;return e.shuffleReadBytes/o<=134217728?c=`sufficient`:s===`coalesced`?c=`aqeCoalesced`:r!=null&&r>=a&&s!==`adjusted`&&(c=`ownPartitioning`),{partitions:c,count:r,key:i,needed:a}}var zo=`spark.sql.adaptive.advisoryPartitionSizeInBytes`,Bo=`spark.sql.adaptive.coalescePartitions.parallelismFirst`;function Vo(e,t){let n=Fo(e,t),r=Lo(e,n);return{lever:r===`matches`?`property`:r===`coalesced`?`aqeCoalesced`:r===`adjusted`?`aqeAdjusted`:`ownPartitioning`,count:n.count,key:n.key,explicitRepartition:n.explicitRepartition}}function Ho(e,t,n){return n?` (this stage ran ${e.taskCount} tasks against ${t} configured, and AQE skew-join splits add tasks, so that is not necessarily its own repartition(n))`:` (this stage ran ${e.taskCount} tasks against ${t} configured, and the plan shows no repartition behind the difference)`}function Uo(e){let t=so(e,Bo);if(t!=null)return t.toLowerCase()===`true`;let n=/^(\d+)\.(\d+)/.exec(e?.sparkVersion??``);return n==null||Number(n[1])>3||Number(n[2])>=2}function Wo(e){return Uo(e)?{keys:`setting ${Bo}=false (so AQE targets the advisory size, not defaultParallelism tasks) and then raising ${zo}`,remediation:[xr(Bo,!1),U(zo)]}:{keys:`raising ${zo}`,remediation:[U(zo)]}}function Go(e,t){let{partitions:n,count:r,key:i,needed:a}=Ro(e,t);return n===`aqeCoalesced`?{partitions:n,text:`AQE coalesced the shuffle into ${e.taskCount} tasks (from ${r} configured partitions): lower ${zo} so each partition is smaller`,remediation:[W(zo)]}:n===`ownPartitioning`?{partitions:n,text:`${i} is already ${r}, so raise this stage's own partition count (its repartition(n) or RDD parallelism) so each partition is smaller`,remediation:[]}:{partitions:n,text:`raise ${i} so each partition is smaller`,remediation:[U(i,r==null?null:a)]}}function Ko(e,t,n){let{lever:r,count:i,key:a,explicitRepartition:o}=Vo(e,t);if(r===`aqeCoalesced`){let r=Wo(fo(t,e));return{text:`${r.keys}, or using .coalesce(${n}): AQE already coalesced the ${i} configured shuffle partitions into ${e.taskCount} tasks, so lowering the shuffle partition count will not merge them`,remediation:r.remediation}}if(r===`ownPartitioning`){let t=`lowering the repartition(n) or RDD partition count that sized this stage, or using .coalesce(${n})`;return{text:`${t} (the configured shuffle partition count is ${i} but this stage ran ${e.taskCount} tasks)`,remediation:[Sr(t)]}}return{text:`lowering ${a} or using .coalesce(${n})${r===`aqeAdjusted`?Ho(e,i,o):``}`,remediation:[W(a)]}}function qo(e,t){let n=U(`spark.executor.memory`),{lever:r,count:i,key:a,explicitRepartition:o}=Vo(e,t);if(r===`aqeCoalesced`)return{text:`AQE coalesced the ${i} configured shuffle partitions into ${e.taskCount} tasks: lower ${zo} so each partition is smaller, or increase executor memory`,remediation:[W(zo),n]};if(r===`ownPartitioning`){let t=`raise this stage's own partition count (its repartition(n) or RDD parallelism) so each partition is smaller`;return{text:`the configured shuffle partition count is ${i} but this stage ran ${e.taskCount} tasks, so ${t}, or increase executor memory`,remediation:[Sr(t),n]}}return{text:`raise ${a} or increase executor memory${r===`aqeAdjusted`?Ho(e,i,o):``}`,remediation:[U(a),n]}}function Jo(e,t){let{lever:n,count:r,key:i,explicitRepartition:a}=Vo(e,t);if(n===`aqeCoalesced`)return{text:`AQE coalesced the ${r} configured shuffle partitions into ${e.taskCount} tasks, so lower ${zo} to get more of them`,remediation:[W(zo)]};if(n===`ownPartitioning`){let t=`raise this stage's own partition count (its repartition(n) or RDD parallelism)`;return{text:`the configured shuffle partition count is ${r} but this stage ran ${e.taskCount} tasks, so ${t}`,remediation:[Sr(t)]}}return{text:`raise ${i}${n===`aqeAdjusted`?Ho(e,r,a):``}`,remediation:[U(i)]}}var Yo=2147483647,Xo=`spark.sql.autoBroadcastJoinThreshold`,Zo=`spark.sql.adaptive.autoBroadcastJoinThreshold`,Qo=`spark.sql.adaptive.nonEmptyPartitionRatioForBroadcastJoin`;function $o(e,t){return t&&so(e,Zo)!==void 0?Zo:Xo}function es(e,t){let n=so(e,t);return n!=null&&/^-\d+$/.test(n)?-1:or(n)}function ts(e){return e?.resources?.dynamicAllocationEnabled==null?!ho(e,`spark.dynamicAllocation.enabled`,!0):!e.resources.dynamicAllocationEnabled}var ns={rddInfo:`This ratio is a point-in-time storage snapshot from stage-submission events, not a runtime read-count. Confirm against the Spark UI's Storage tab before acting.`,blockUpdates:`This ratio is the RDD's peak cache residency rebuilt from block-update events, not a runtime read-count. Confirm against the Spark UI's Storage tab before acting.`};function rs(e){return e<10?`low`:e>=50?`high`:`medium`}function is({id:e,name:t}){return`RDD ${t?t.length>40?`${t.slice(0,40)}...`:t:e}`}function as(e,t,n){let r=Math.round(t*100),i=100-r;return{type:`cacheUtilization`,variant:`partialCache`,stageId:null,rddId:e.id,rddName:e.name||`RDD ${e.id}`,impactBand:n,metric:`cachedRatio`,value:r,confidence:rs(e.numPartitions),validationRequired:ns[e.storageSource??`rddInfo`],memorySize:e.memorySize,diskSize:e.diskSize,numCachedPartitions:e.numCachedPartitions,numPartitions:e.numPartitions,recommendation:`${is(e)} is ${i}% evicted from cache (${r}% of partitions cached): increase executor memory or reduce the cached dataset size.`,remediation:[U(`spark.executor.memory`)]}}function os(e,t,n){let r=Math.round(t*100);return{type:`cacheUtilization`,variant:`diskSpillover`,stageId:null,rddId:e.id,rddName:e.name||`RDD ${e.id}`,impactBand:n,metric:`diskRatio`,value:r,confidence:rs(e.numPartitions),validationRequired:ns[e.storageSource??`rddInfo`],memorySize:e.memorySize,diskSize:e.diskSize,numCachedPartitions:e.numCachedPartitions,numPartitions:e.numPartitions,recommendation:`${is(e)} is ${r}% spilled to disk despite requesting MEMORY_AND_DISK: executor memory may be too small for it.`,remediation:[U(`spark.executor.memory`)]}}function ss(e,t){return{type:`cacheUtilization`,variant:`storageUnobserved`,stageId:null,impactBand:`info`,metric:`persistedRdds`,value:e,dataUnavailable:!0,recommendation:`${e===1?`1 persisted RDD has`:`${e} persisted RDDs have`} no cache-storage evidence in this log, so eviction and disk spillover can't be checked: Spark 2.3+ records cached sizes only as block updates, which need spark.eventLog.logBlockUpdates.enabled=true.`,remediation:go(t,`spark.eventLog.logBlockUpdates.enabled`,!0)}}function cs(e,t,n){for(let[r,i]of Object.entries(n)){if(!Object.hasOwn(t,r))throw Error(`Detector ${e} has no threshold "${r}".`);let n=t[r];if(!(Array.isArray(n)?Array.isArray(i)&&i.length===n.length:typeof i==`number`))throw Error(`Threshold ${e}.${r} must have the same shape as its default.`)}return Object.freeze({...t,...n})}function ls(e,t,n){let r=Object.freeze({...t.thresholds}),i=n(r);return{...t,scope:e,thresholds:r,withThresholds:e=>e&&Object.keys(e).length>0?n(cs(t.type,r,e)):i}}function us(e){return ls(`stage`,e,t=>(n,r)=>e.detect(n,r,t))}function ds(e){return ls(`sql`,e,t=>(n,r)=>e.detect(n,r,t))}function fs(e){return ls(`app`,e,t=>n=>e.detect(n,t))}function ps(e){return ls(`config`,e,t=>n=>e.detect(n,t))}function ms(e,t){return e<=t*1.5?`low`:e>=t*5?`high`:`medium`}function hs(e,t,n){return n===`high`?e<=t.warnPct100*1.5?`low`:e>=t.warnPct100*3?`high`:`medium`:e>=t.lowInfoPct100*.66?`low`:e<=t.lowInfoPct100*.2?`high`:`medium`}function gs(e,t,n){return e<t*1.5?`low`:e>=n?`high`:`medium`}function _s(e,t){return e<=t*1.5?`low`:e>=t*4?`high`:`medium`}function vs(e,t,n){let r=t>0?e/(n*t):1/0;return r<=1.5?`low`:r>=3?`high`:`medium`}function ys(e,t,n){let r={low:0,medium:1,high:2},i=e<n.warnRatio*1.5?`low`:e>=n.critRatio?`high`:`medium`,a=t<n.minTasks*2?`low`:t>=n.minTasks*4?`high`:`medium`;return r[i]<=r[a]?i:a}function bs(e,t,n){return e<=t*1.5?`low`:e>=n?`high`:`medium`}function xs(e,t){return e<=t?`low`:e>=t*3?`high`:`medium`}function Ss(e){return`Checked only on stages with at least ${e/1e3}s of executor run time.`}var Cs=`This event log never recorded an ApplicationEnd event: the capture stopped before the run finished (a job still running, a rotated log, or a cut-short capture), so every figure on this board covers only what was captured.`;function ws(e,t,n){if(e.taskCount<n.minTasks)return null;let r=Di(t.app);if($a(e,t,n.floorPctWarn))return null;let i=(e.stragglerCount??0)/e.taskCount,a=(e.speculativeTasks??0)>0;if(!a&&i<=n.shareWarnAtFloor)return null;let o=a?e.speculativeTasks/e.taskCount:0,s=io(no(e),e.id,t),c=Qa(s,r,n.floorPctWarn),l=Qa(s,r,n.floorPctCrit),u=i>n.shareWarn||i>n.shareWarnAtFloor&&r!=null&&c;if(!a&&!u)return null;let d=o>=n.critPct&&l?`critical`:o>=n.warnPct&&c?`warning`:`info`,f=a&&!(S[u&&c?`warning`:`info`]<S[d]),p=f?e.speculativeTasks:Math.round(i*100);return{useSpeculativeMetric:f,value:p,detail:f?`${p} speculative attempt${p===1?``:`s`} discarded${mo(t.app)}`:`${p}% of tasks ran over 4× the median`,confidence:f?gs(o,n.warnPct,n.critPct):gs(i,n.shareWarn,n.critPct)}}function Ts(e,t,n,r){let i=n.attribution,a=i?.cpuPct==null?void 0:Math.round(i.cpuPct),o={cause:n.cause,...n.cause===`unattributed`?{}:{causeSharePct:n.sharePct},...a===void 0?{}:{cpuPct:a}},s=`${n.sharePct}% of the slow tasks' extra time`;switch(n.cause){case`data`:{let a=ko(e,t,!1,n),c=i?.dataRatio==null?null:Math.round(i.dataRatio*10)/10;return{evidence:{...o,origin:a.origin,aqeSkew:a.aqeSkew},remediation:a.remediation,recommendation:`${r}: data volume accounts for ${s} (${c===null?`the median task read almost nothing`:`the slow tasks read a median ${c}× the data of the median task`}): ${a.text}.`}}case`gc`:return{evidence:o,remediation:[U(`spark.executor.memory`)],recommendation:`${r}: GC accounts for ${s}: reduce object creation, use primitive types, avoid UDFs, increase executor memory.`};case`fetchWait`:return{evidence:o,remediation:void 0,recommendation:`${r}: waiting on shuffle fetches accounts for ${s}: look for a slow or overloaded node serving shuffle blocks, executors lost mid-stage, or reducers fetching many small blocks.`};case`host`:{let e=_o(ho(t.app,`spark.speculation`,!0),`spark.speculation`,!0,`check what it was running, and consider enabling spark.speculation to relaunch a lagging task automatically`,`check what it was running; speculation is already on, so a lagging task there is already relaunched`);return{evidence:{...o,host:i.host,hostTasks:i.hostTasks},remediation:e.remediation,recommendation:`${r}: ${i.hostTasks} of the ${i.tasks} slow tasks ran on ${i.host}, which accounts for ${s}: ${e.text}.`}}case`unexplained`:{let s=a===void 0?``:a<50?` They used ${a}% of their run time on CPU, so they mostly waited (on storage, a remote service or a lock).`:` They used ${a}% of their run time on CPU, so the work itself is slow.`,c=i?.dataRatio??0;if(i!=null&&c>=wo){let a=Math.round(c*10)/10,l=Math.round(i.dataMs/i.excessMs*100),u=i.dataMs>=i.excessMs-i.dataMs-i.gcMs-i.fetchWaitMs-i.hostMs,d=`${r}: the slow tasks read a median ${a}× the data of the median task, and data volume accounts for ${l}% of their extra time`;if(u){let r=ko(e,t,!1,n);return{evidence:{...o,origin:r.origin,aqeSkew:r.aqeSkew},remediation:r.remediation,recommendation:`${d}, more than anything else the log attributes (not a majority): ${r.text}.`}}return{evidence:o,remediation:void 0,recommendation:`${d}, so run time did not scale with it, and GC, shuffle fetch wait and one slow host do not account for the rest.${s} Look at per-record cost (UDFs, regular expressions, a call out per row) as well as the data they read.`}}return{evidence:o,remediation:void 0,recommendation:`${r}: the slow tasks read no more data than the median task, and GC, shuffle fetch wait and one slow host do not account for their time.${s} Look at per-record cost (UDFs, regular expressions, a call out per row).`}}default:return{evidence:o,remediation:void 0,recommendation:`${r}: nothing in the log attributes the slow tasks to data volume, GC, shuffle fetch wait or one host, so check their input sizes, GC time and hosts before choosing a fix.`}}}var Es=[us({type:`skew`,order:30,fixEffort:`code`,version:1,emits:[`skew`],docAnchor:`#bottleneck-skew`,thresholds:{ratioWarn:3,minTasksForP95:20,dataShareMin:.5,floorPctWarn:wi},detect(e,t,n){let r=ao(e,t,n.ratioWarn,n.minTasksForP95,n.floorPctWarn);if(r===null)return null;let{ratio:i,metric:o}=r,s=oo(e,n.dataShareMin);if(s.cause!==`data`)return null;let c=Math.round(i*10)/10,l=ko(e,t,!1,s),u=s.attribution?.dataRatio==null?void 0:Math.round(s.attribution.dataRatio*10)/10;return{type:`skew`,stageId:e.id,origin:l.origin,aqeSkew:l.aqeSkew,cause:s.cause,...u===void 0?{}:{dataRatio:u},impactBand:`warning`,metric:o,value:c,confidence:ms(i,n.ratioWarn),validationRequired:`Flagged only when it costs at least ${a(n.floorPctWarn)} of run time.`,recommendation:`Task duration ratio (${o}) is ${c}×${u===void 0?`, and the median task read almost nothing`:`, and the slow tasks read a median ${u}× the data of the median task`}: ${l.text}.`,remediation:l.remediation}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);return n?ro(to(n,e.metric===`P95/median`),e.stageId,t):null}}),us({type:`stageShape`,order:35,fixEffort:`code`,version:2,emits:[`stageShape`],docAnchor:`#bottleneck-stage-shape`,thresholds:{pRatioMax:.5,oiRatioMax:10,skewWarn:3,stageShareMin:.5,lowParallelismFloorPct:.005,taskStageSkewFloorPct:.005},detect(e,t,n){let r=[],i=(e.executorStats??[]).length*(t.app?.resources?.executor?.cores??1),a=(e.completedAt??0)-(e.submittedAt??0);if(i>0&&!$a(e,t,n.lowParallelismFloorPct)){let t=e.taskCount/i;t<n.pRatioMax&&r.push({type:`stageShape`,stageId:e.id,impactBand:`info`,rule:`lowParallelism`,metric:`pRatio`,value:Math.round(t*100)/100,totalCores:i,recommendation:`This stage runs ${e.taskCount} ${e.taskCount===1?`task`:`tasks`} across ~${i} cores: it is under-parallelized and leaves cluster capacity idle.`})}if(e.inputBytes>0){let t=e.outputBytes/e.inputBytes;t>n.oiRatioMax&&r.push({type:`stageShape`,stageId:e.id,impactBand:`info`,rule:`dataExplosion`,metric:`oiRatio`,value:Math.round(t*10)/10,recommendation:`This stage outputs ${Math.round(t)}× its input volume: check for an exploding join or a cross product.`})}if(a>0&&e.taskCount>1&&e.taskDurationP50>0&&!$a(e,t,n.taskStageSkewFloorPct)){let t=e.taskDurationMax/a,o=e.taskDurationMax/e.taskDurationP50;t>n.stageShareMin&&o>n.skewWarn&&r.push({type:`stageShape`,stageId:e.id,impactBand:`info`,rule:`taskStageSkew`,metric:`taskStageSkew`,value:Math.round(t*100)/100,totalCores:i,recommendation:`The longest task ran for ${Math.round(t*100)}% of this stage's wall-clock, ${Math.round(o*10)/10}× the median task: a single straggler is gating the whole stage.`})}return r},estimate(e,t){let n=t.stages.get(e.stageId);if(!n)return null;if(e.rule===`lowParallelism`){let t=(n.completedAt??0)-(n.submittedAt??0);return G(`measured`,{value:Math.max(0,(e.totalCores??0)-(n.taskCount??0))*t,unit:`coreMs`,idle:!0})}if(e.rule===`dataExplosion`)return G(`measured`,{value:Math.max(0,(n.outputBytes??0)-(n.inputBytes??0)),unit:`bytes`});if(e.rule===`taskStageSkew`){let r=e.totalCores??0,i=n.taskCount??0,a=Math.max(0,Math.min(r,i)-1)*Math.max(0,(n.taskDurationMax??0)-(n.taskDurationP50??0));return G(`modeled`,{value:t.runIdleCoreMs==null?a:Math.min(a,t.runIdleCoreMs),unit:`coreMs`,idle:!0})}return null}}),us({type:`shuffle`,order:20,fixEffort:`config`,version:1,emits:[`shuffle`],docAnchor:`#bottleneck-shuffle`,thresholds:{minBytes:50*K,stageFloorPct:.005},detect(e,t,n){let r=e.shuffleReadBytes;if(r<=n.minBytes||$a(e,t,n.stageFloorPct))return null;let{partitions:i,count:a,key:o}=Ro(e,t),s=p(r/Math.max(1,e.taskCount)),c=i===`sufficient`?{text:`its ${e.taskCount} tasks already read about ${s} each, so more partitions will not help: consider a broadcast join for the smaller side`,remediation:[]}:i===`aqeCoalesced`?{text:`AQE coalesced it into ${e.taskCount} tasks (from ${a} configured partitions): consider lowering ${zo} or adding a broadcast join`,remediation:[W(zo)]}:i===`ownPartitioning`?{text:`${o} is already ${a}, so consider raising this stage's own partition count (its repartition(n) or RDD parallelism) or adding a broadcast join`,remediation:[]}:{text:`consider increasing ${o} or adding a broadcast join`,remediation:[U(o)]};return{type:`shuffle`,stageId:e.id,impactBand:`info`,partitions:i,metric:`shuffleReadBytes`,value:r,recommendation:`${p(r)} shuffled in this stage: ${c.text}.`,remediation:c.remediation}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=n.shuffleReadBytes??0,i=r/(ki*Mi(n))*1e3,a=Ni(n),o=a==null?i:Math.min(i,a),s=a!=null&&a<i;return Hi(Gi(o,e.stageId,t,s?`measured`:`modeled`,{value:r,unit:`bytes`}),`${Ui(ki,n)}; counts network transfer only${s?`, capped at the fetch wait the tasks measured`:``}`)}}),us({type:`partitionSizing`,order:22,fixEffort:`config`,version:1,emits:[`partitionSizing`],docAnchor:`#bottleneck-partition-sizing`,thresholds:{skewRatio:5,skewFloorBytes:256*K,lowParTotalBytes:ha,lowParMaxTasks:7,maxPartBytes:5*ha},detect(e,t,n){let r=[],{shuffleReadP50:i,shuffleReadMax:a,shuffleReadBytes:o,taskCount:s}=e;if(a>n.skewRatio*i&&a>n.skewFloorBytes){let n=i>0?`${Math.round(a/i*10)/10}× the median (${p(i)})`:`far larger than the median, which is effectively empty`,o=ko(e,t,!0);r.push({type:`partitionSizing`,stageId:e.id,impactBand:`warning`,rule:`shufflePartitionSkew`,origin:o.origin,aqeSkew:o.aqeSkew,metric:`shuffleReadMax`,value:a,recommendation:`The largest shuffle partition (${p(a)}) is ${n}: ${o.text}.`,remediation:o.remediation})}if(o>=n.lowParTotalBytes&&s<=n.lowParMaxTasks){let n=Go(e,t);r.push({type:`partitionSizing`,stageId:e.id,impactBand:`warning`,rule:`lowShuffleParallelism`,partitions:n.partitions,metric:`taskCount`,value:s,recommendation:`${Math.round(o/ha*10)/10} GB of shuffle spread over only ${s} tasks: ${n.text}.`,remediation:n.remediation})}return a>=n.maxPartBytes&&r.push({type:`partitionSizing`,stageId:e.id,impactBand:`critical`,rule:`maxPartitionTooBig`,metric:`shuffleReadMax`,value:a,recommendation:`A single shuffle partition (${p(a)}) exceeds 5 GB: this will OOM or spill heavily. Repartition to break it up before this stage.`}),r},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=0,i=0;if(e.rule===`maxPartitionTooBig`)r=(n.shuffleReadMax??0)/ki*1e3;else if(e.rule===`shufflePartitionSkew`)r=Math.max(0,(n.shuffleReadMax??0)-(n.shuffleReadP50??0))/ki*1e3;else if(e.rule===`lowShuffleParallelism`){let e=Math.ceil((n.shuffleReadBytes??0)/Fi),t=n.taskCount??0;if(e>t&&t>0){r=Math.max(0,(n.completedAt??0)-(n.submittedAt??0))*(1-t/e);let a=n.taskDurationMax??0;i=a*t/e,a>0&&(r=Math.min(r,a-i))}}else return null;return Gi(r,e.stageId,t,`modeled`,{value:r,unit:`ms`},e.rule===`lowShuffleParallelism`?{...Vi,longestTaskAfterFixMs:i}:void 0)}}),us({type:`spill`,order:10,fixEffort:`code`,version:1,emits:[`spill`],docAnchor:`#bottleneck-spill`,thresholds:{singleTaskDiskGiB:1,singleTaskMemGiB:4,highDiskGiB:1,highTaskDiskMB:512,highMemGiB:4,medDiskMB:256,medMemGiB:1,skewRatio:5,skewDiskFloorMB:128,skewMemFloorMB:256,skewMinTasks:10,stageFloorPct:.005},detect(e,t,n){if(e.memoryBytesSpilled===0||$a(e,t,n.stageFloorPct))return null;let r=e.spillClassification,i=r===`skew`||r===`volume`,a=va(e,n),o=Eo(e),s=o===`shuffle`?qo(e,t):null;return{type:`spill`,stageId:e.id,impactBand:`warning`,reads:o,spillMagnitude:a?.magnitude,metric:`memoryBytesSpilled`,value:e.memoryBytesSpilled,confidence:i?`medium`:`low`,validationRequired:i?`Spill cause is inferred from the share of tasks that spilled: confirm against per-task spill metrics in the Spark UI.`:`Spill cause could not be classified: inspect per-task spill metrics in the Spark UI before acting.`,recommendation:r===`skew`?`${p(e.memoryBytesSpilled)} spilled, skew-driven: fix task skew first; adding memory will not help.`:s?`${p(e.memoryBytesSpilled)} spilled: ${s.text}.`:`${p(e.memoryBytesSpilled)} spilled: this stage reads no shuffle, so increase executor memory or process less data per task.`,remediation:r===`skew`?[]:s?.remediation??[U(`spark.executor.memory`)]}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=n.diskBytesSpilled??0;return Hi(Gi(r/(Ai*Mi(n))*1e3,e.stageId,t,`modeled`,{value:r,unit:`bytes`}),`${Ui(Ai,n)}; counts disk spill only, not memory spill, serialization or GC`)}}),us({type:`gc`,order:50,fixEffort:`config`,version:1,emits:[`gc`],docAnchor:`#bottleneck-gc`,thresholds:{warnPct100:10,lowInfoPct100:5,minRunTimeMs:1e4,lowInfoFloorPct:.005},detect(e,t,n){let r=e.gcPct;if((e.executorRunTime??0)>=n.minRunTimeMs&&r>n.warnPct100){let t=Math.round(r*10)/10;return{type:`gc`,stageId:e.id,impactBand:`warning`,metric:`gcPct`,value:t,confidence:hs(r,n,`high`),validationRequired:Ss(n.minRunTimeMs),recommendation:`GC consumed ${t}% of executor run time: reduce object creation, use primitive types, avoid UDFs, increase executor memory.`,remediation:[U(`spark.executor.memory`)]}}if((e.executorRunTime??0)>=n.minRunTimeMs&&!vo(t)&&e.stageFailureReason==null&&e.failedTasks===0&&r<n.lowInfoPct100&&!$a(e,t,n.lowInfoFloorPct)){let t=Math.round(r*10)/10;return{type:`gc`,stageId:e.id,direction:`low`,impactBand:`info`,metric:`gcPct`,value:t,confidence:hs(r,n,`low`),validationRequired:Ss(n.minRunTimeMs),recommendation:`GC consumed only ${t}% of executor run time: memory may be over-provisioned; consider reducing spark.executor.memory for cost savings.`,remediation:[W(`spark.executor.memory`)]}}return null},estimate(e,t){if(e.direction===`low`)return G(`none`);if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=(n.completedAt??0)-(n.submittedAt??0),i=n.executorRunTime??0,a=n.jvmGCTime??0,o={value:a,unit:`coreMs`};return i<=0||r<=0?G(`modeled`,o):Gi(a/(i/r),e.stageId,t,`modeled`,o)}}),us({type:`slowHost`,order:60,fixEffort:`config`,version:2,emits:[`slowHost`],docAnchor:`#bottleneck-slow-host`,thresholds:{minHosts:3,minTasks:15,ratioWarn:2,minShare:.2,shareWarn:.75,taskShareWarn:.5,ratioTiers:[1.33,1.78,3.16,10],floorMs:1e3,floorBytes:64*K,stageFloorPct:.005,outlierAlpha:.005},detect(e,t,n){let r=e.hostStats??[],i=e.executorStats??[];if(r.length<n.minHosts&&i.length<n.minHosts||e.taskCount<n.minTasks||$a(e,t,n.stageFloorPct))return null;let a=[],o=po(t.app),s=_o(ho(t.app,`spark.speculation`,!0),`spark.speculation`,!0,`check what it was running, and consider enabling spark.speculation to relaunch a lagging task automatically${o?` (with this run's settings, ${o})`:``}`,`check what it was running; speculation is already on, so a lagging task there is already relaunched${o?` (with this run's settings, ${o})`:``}`);if(r.length>=n.minHosts){let t=r.map(e=>({host:e.host,taskCount:e.taskCount,mean:e.totalDuration/e.taskCount})),i=Wn([...t].map(e=>e.mean).sort((e,t)=>e-t));if(i>0)for(let r of t){let t=r.mean/i,o=r.taskCount/e.taskCount;t<n.ratioWarn||o<n.minShare||r.mean<n.floorMs||a.push({type:`slowHost`,stageId:e.id,impactBand:`warning`,metric:`hostMeanRatio`,value:Math.round(t*10)/10,hostMeanMs:r.mean,host:r.host,hostTaskShare:Math.round(o*100)/100,recommendation:`${r.host} may just hold data locality for its tasks or carry one heavy stage, not necessarily a hardware fault: ${s.text}.`,remediation:s.remediation})}let o=r.reduce((e,t)=>e+t.totalDuration,0);if(o>0)for(let t of r){let r=t.totalDuration/o,i=t.taskCount/e.taskCount;r>=n.shareWarn&&i>=n.taskShareWarn&&a.push({type:`slowHost`,stageId:e.id,impactBand:`warning`,variant:`durationShare`,metric:`hostDurationShare`,value:Math.round(r*100)/100,hostMeanMs:t.totalDuration/t.taskCount,host:t.host,hostTaskShare:Math.round(i*100)/100,recommendation:`${t.host} is doing ${Math.round(r*100)}% of this stage's total task time: check for data locality or partition assignment skewing work onto one node.`})}}let c=e.executorStats??[],l=n.ratioTiers,u=e=>e>=l[3]?`critical`:e>=l[1]?`warning`:e>=l[0]?`info`:null,d=n.floorMs,f=n.floorBytes,p=c.filter(e=>e.taskCount>0).map(e=>({key:e.executorId,value:e.totalDuration/e.taskCount})),m=Ja(c),h=qa(p.length,n.outlierAlpha),g=[{dimension:`taskTime`,floor:d,samples:p,qualifies:e=>(m?.get(e.key)??-1/0)>=h},{dimension:`inputBytes`,floor:f,samples:c.map(e=>({key:e.executorId,value:e.inputBytes??0}))},{dimension:`shuffleBytes`,floor:f,samples:c.map(e=>({key:e.executorId,value:(e.shuffleReadBytes??0)+(e.shuffleWriteBytes??0)}))}],_=e.executorMetrics instanceof Map?e.executorMetrics:null;_&&_.size>=3&&g.push({dimension:`storageMemory`,floor:f,samples:[..._.entries()].map(([e,t])=>({key:e,value:(t.onHeapStorageMemory??0)+(t.offHeapStorageMemory??0)}))});for(let t of g){let n=Ka(t.samples,t.qualifies);if(!n||n.value<t.floor)continue;let r=u(n.ratio);if(!r)continue;let i=t.dimension===`taskTime`?`info`:r;a.push({type:`slowHost`,stageId:e.id,impactBand:i,variant:`multiDim`,dimension:t.dimension,metric:`execMaxMedianRatio`,value:Math.round(n.ratio*10)/10,execMaxValue:n.value,executorId:n.key,...t.dimension===`taskTime`?Ya(n.key,n.ratio,t.samples.length,e.taskCount):{},recommendation:`Executor ${n.key}'s ${Se[t.dimension]} is ${Math.round(n.ratio*10)/10}× the median: investigate uneven partition assignment or a degraded executor.`})}return a},estimate(e,t){let n=e.metric===`hostMeanRatio`||e.variant===`durationShare`?e.hostMeanMs:e.variant===`multiDim`&&e.dimension===`taskTime`?e.execMaxValue:null;if(n==null)return G(`none`);if(e.stageId==null)return null;let r=t.stages.get(e.stageId);if(!r)return null;let i=Math.max(0,n-(r.taskDurationP50??0));return Gi(i,e.stageId,t,`measured`,{value:i,unit:`ms`})}}),us({type:`stageSlowness`,order:65,fixEffort:`code`,version:2,emits:[`stageSlowness`],docAnchor:`#bottleneck-stage-slowness`,thresholds:{infoMin:15},suppressedBy:`slowHost`,detect(e,t,n){let r=(e.completedAt??0)-(e.submittedAt??0);if(!(r>0))return null;let i=r/6e4,a=i>=n.infoMin?`info`:null;if(!a)return null;let o=Math.round(i*10)/10,s=Eo(e),c=s===`shuffle`?Jo(e,t):null,l=c?`This stage ran ${o} minutes with no more specific cause flagged: often a partition-count problem, ${c.text}, or check for a large per-task data volume driving heavy shuffle and spill.`:s===`input`?`This stage ran ${o} minutes with no more specific cause flagged and reads mostly input files: often too few or too uneven input partitions, so check input file sizes and lower spark.sql.files.maxPartitionBytes, or look for a large per-task data volume driving heavy spill.`:`This stage ran ${o} minutes with no more specific cause flagged and reads neither shuffle nor input files: check what it computes and for a large per-task data volume driving heavy spill.`;return{type:`stageSlowness`,stageId:e.id,impactBand:a,metric:`stageDurationMinutes`,value:o,reads:s,recommendation:l,remediation:c?c.remediation:s===`input`?[W(`spark.sql.files.maxPartitionBytes`)]:[]}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;if(t.totalCores<=0)return G(`modeled`);let r=(n.inputBytes??0)+(n.shuffleReadBytes??0),i=typeof n.taskActiveMs==`number`?n.taskActiveMs:Math.max(0,(n.completedAt??0)-(n.submittedAt??0)),a=n.taskCount??0,o=r<=0&&Bi(n,t.sql)?0:i*Math.max(0,1-a/t.totalCores);return Gi(o,e.stageId,t,`modeled`,{value:o,unit:`ms`},Vi)}}),us({type:`stageFailed`,order:42,fixEffort:`code`,version:1,emits:[`stageFailed`],docAnchor:`#bottleneck-failures`,thresholds:{},detect(e){return e.stageFailureReason==null?null:{type:`stageFailed`,stageId:e.id,impactBand:`critical`,variant:`stageFailure`,metric:`stageFailureReason`,valueText:e.stageFailureReason,numTasks:e.taskCount,memoryBytesSpilled:e.memoryBytesSpilled,failedTaskDetails:e.failedTaskSamples??[],recommendation:`This stage attempt failed outright. Inspect the driver log for the failure reason and the job that triggered it.`}},estimate:Wi}),us({type:`failures`,order:40,fixEffort:`code`,version:2,emits:[`failures`],docAnchor:`#bottleneck-failures`,thresholds:{minTasks:10,warnRate:.05,critRate:.2},detect(e,t,n){if(e.taskCount<n.minTasks||!e.failedTasks)return null;let r=e.failedTasks/e.taskCount;if(r<=n.warnRate)return null;let i=Math.round(r*1e3)/10,a=ya(e.failureReasons),o=e.failureGroups??[],s=o.find(e=>e.reason===a),c=(s?la(s):null)??a,l=o.slice(0,5),u=l.reduce((e,t)=>e+t.count,0);return{type:`failures`,stageId:e.id,impactBand:r>n.critRate?`critical`:`warning`,metric:`failureRate`,value:i,failedTasks:e.failedTasks,dominantReason:a,dominantError:c,failureGroups:l,otherFailedTasks:Math.max(0,e.failedTasks-u),recommendation:`${i}% of tasks failed${c?` (dominant error: ${c})`:``}: investigate driver logs for executor instability or data-driven errors.`}},estimate:Wi}),us({type:`straggler`,order:70,fixEffort:`code`,version:1,emits:[`straggler`],docAnchor:`#bottleneck-straggler`,thresholds:{minTasks:10,shareWarn:.05,shareWarnAtFloor:.025,warnPct:.1,critPct:.2,floorPctWarn:wi,floorPctCrit:Ti},detect(e,t,n){let r=t.skewThresholds,i=oo(e,r.dataShareMin),o=ao(e,t,r.ratioWarn,r.minTasksForP95,r.floorPctWarn);if(i.cause===`data`&&o!==null)return null;let s=o!==null&&i.cause!==`data`,c=ws(e,t,n);if(c===null&&!s)return null;let l=c===null?{metric:o.metric,value:Math.round(o.ratio*10)/10,unit:`ratio`,detail:`Task duration ratio (${o.metric}) is ${Math.round(o.ratio*10)/10}×`}:{metric:c.useSpeculativeMetric?`speculativeTasks`:`stragglerShare`,value:c.value,unit:c.useSpeculativeMetric?`count`:`pct`,detail:c.detail},u=Ts(e,t,i,l.detail);return{type:`straggler`,stageId:e.id,impactBand:`info`,...u.evidence,metric:l.metric,value:l.value,unit:l.unit,speculativeTasks:e.speculativeTasks??0,stragglerCount:e.stragglerCount??0,confidence:c?.confidence??ms(o.ratio,r.ratioWarn),validationRequired:`Warning needs at least ${a(n.floorPctWarn)} of run time at stake, critical ${a(n.floorPctCrit)}.`,recommendation:u.recommendation,remediation:u.remediation}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);return n?ro(no(n),e.stageId,t):null}}),us({type:`speculationWaste`,order:71,fixEffort:`config`,version:1,emits:[`speculationWaste`],docAnchor:`#bottleneck-speculation-waste`,thresholds:{minWasted:5,minWasteMs:6e4},detect(e,t,n){let r=e.speculationWastedAttempts??0,i=e.speculationWasteMs??0;return r<n.minWasted||i<n.minWasteMs?null:{type:`speculationWaste`,stageId:e.id,impactBand:`warning`,metric:`speculationWasteMs`,value:i,confidence:_s(i,n.minWasteMs),recommendation:`Speculative execution discarded ${Math.round(i/1e3)}s of executor time in this stage: if task durations are naturally variable rather than genuine stragglers, consider tuning spark.speculation.multiplier/quantile${mo(t.app)}.`,remediation:[U(`spark.speculation.multiplier`),U(`spark.speculation.quantile`)]}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=n.speculationWasteMs??0;return Gi(r,e.stageId,t,`measured`,{value:r,unit:`ms`})}}),us({type:`retryWaste`,order:45,fixEffort:`code`,version:1,emits:[`retryWaste`],docAnchor:`#bottleneck-retry-waste`,thresholds:{minWasted:3,minWasteMs:3e4},detect(e,t,n){let r=e.wastedAttempts??0,i=e.retryWasteMs??0;return r<n.minWasted||i<n.minWasteMs?null:{type:`retryWaste`,stageId:e.id,impactBand:`warning`,metric:`retryWasteMs`,value:i,numTasks:e.taskCount,memoryBytesSpilled:e.memoryBytesSpilled,retriedTaskDetails:e.retryTaskSamples??[],recommendation:`Retried task attempts wasted ${Math.round(i/1e3)}s of executor time (${r} attempt${r===1?``:`s`}) even though the stage completed: investigate executor loss or fetch failures.`,extended:`${r} task attempts were superseded by a later retry, wasting ${Math.round(i/1e3)}s of executor time. Common causes: executor loss (OOM-kill, node death) or shuffle FetchFailed forcing a stage-map recompute. Check driver logs for the dominant reason (see the Failures widget) even if the final failure rate looks low; retries hide the true cost.`}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=n.retryWasteMs??0,i=Pi(n);return Gi(i,e.stageId,t,i===r?`measured`:`modeled`,{value:r,unit:`ms`})}}),us({type:`tinyTask`,order:80,fixEffort:`code`,version:1,emits:[`tinyTask`],docAnchor:`#bottleneck-tiny-tasks`,thresholds:{minTasks:100,maxP50:500,maxP95:1e3,stageFloorPct:.005},detect(e,t,n){if(e.taskCount<n.minTasks||$a(e,t,n.stageFloorPct)||e.taskDurationP50>n.maxP50||e.taskDurationP95>n.maxP95)return null;let r=Math.max(1,Math.round(e.taskCount/10)),i=Eo(e),a=i===`shuffle`?Ko(e,t,r):{text:`.coalesce(${r})`,remediation:[]};return{type:`tinyTask`,stageId:e.id,impactBand:`info`,reads:i,metric:`taskDurationP50`,value:Math.round(e.taskDurationP50),recommendation:`Many small tasks (${e.taskCount}, P50 ${Math.round(e.taskDurationP50)}ms): scheduler overhead may dominate. Try ${a.text}.`,remediation:a.remediation}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=n.taskCount??0,i=Math.max(0,r-Math.round(r/10)),a=ji(n);if(a){let n=i*a.perTaskMs/Math.max(1,a.concurrency);return Gi(n,e.stageId,t,`measured`,{value:n,unit:`ms`})}let o=i*50;return Gi(o,e.stageId,t,`modeled`,{value:o,unit:`ms`})}}),fs({type:`incompleteRun`,order:5,fixEffort:`code`,version:1,emits:[`incompleteRun`],thresholds:{},detect(e){return!e.app||e.app.startTime==null||e.app.endTime!=null?null:{type:`incompleteRun`,stageId:null,impactBand:`warning`,metric:`applicationEnd`,valueText:`missing`,recommendation:Cs}},estimate:Wi}),fs({type:`coldStart`,order:90,fixEffort:`code`,version:1,emits:[`coldStart`],docAnchor:`#bottleneck-cold-start`,thresholds:{gapSeconds:30},detect(e,t){let{app:n,stages:r,executorsAdded:i,executorsRemoved:a}=e;if(!n||n.startTime==null||r.size===0)return null;let o=1/0;for(let e of r.values())e.submittedAt>0&&e.submittedAt<o&&(o=e.submittedAt);if(!Number.isFinite(o))return null;let s=new Map;for(let e of a)s.set(e.executorId,e.timestamp);let c=1/0;for(let e of i)if(e.timestamp>0){if(e.timestamp<=o){let t=s.get(e.executorId);if(t==null||t>o)return null}else e.timestamp<c&&(c=e.timestamp)}if(!Number.isFinite(c))return null;let l=(c-o)/1e3;if(l<=t.gapSeconds)return null;let u=Math.round(l);return{type:`coldStart`,stageId:null,impactBand:`warning`,dynamicAllocation:ts(e.app)?`off`:`on`,metric:`startupGapSeconds`,value:u,recommendation:`The first stage waited ${u}s for an executor to become available: keep a warm pool of idle executors, or if using dynamic allocation, raise the minimum/initial executor count so it doesn't scale up from zero.`,remediation:ts(e.app)?[]:[U(`spark.dynamicAllocation.minExecutors`),U(`spark.dynamicAllocation.initialExecutors`)]}},estimate(e){if(typeof e.value!=`number`)return null;let t=e.value*1e3;return{basis:`serial`,wallClock:{low:t,high:t},estimateMethod:`measured`}}}),fs({type:`utilization`,order:100,fixEffort:`config`,version:1,emits:[`utilization`],docAnchor:`#bottleneck-utilization`,thresholds:{minUtil:.6},detect(e,t){let{app:n,executorsAdded:r,executorsRemoved:i,runAggregates:a}=e;if(!n||r.length===0||n.startTime==null||n.endTime==null)return null;let o=n.endTime-n.startTime;if(o<=0)return null;let s=_r({app:n,stages:e.stages,executors:{added:r,removed:i}});if(s==null)return null;let c=qn(n,r,i),l=(a?.busyCoreMs??0)/s;if(l>=t.minUtil)return null;let u=aa(e.stages.values()),d=u==null?null:Math.round(u/s*100),f=Math.round(l*100),p=Mo(n,`consider either reducing cluster size (spark.executor.instances) or enabling dynamic allocation`,`dynamic allocation is already on, so consider reducing cluster size`);return{type:`utilization`,stageId:null,impactBand:`info`,metric:`avgUtilization`,value:f,utilizationFraction:l,appDurationMs:o,totalCores:c,allocatedCoreMs:s,cpuUtilizationPct:d,recommendation:`Average executor utilization was only ${f}%: ${p.text}.`,remediation:p.remediation}},estimate(e){let t=e.utilizationFraction,n=e.allocatedCoreMs;if(t==null||n==null)return G(`measured`);let r=(1-t)*n;return{...G(`measured`,{value:r/pe,unit:`coreHours`,idle:!0}),idleCoreTimeMs:{low:r,high:r}}}}),fs({type:`memoryUtilization`,order:102,fixEffort:`config`,version:1,emits:[`memoryUtilization`],docAnchor:`#bottleneck-memory-utilization`,thresholds:{idleCoreWarn:.5,bandTooHigh:.7,wasteBufferMultiplier:1.5},detect(e,t){let{app:n,executorsAdded:r,executorsRemoved:i,runAggregates:a,stages:o}=e,s=[];if(n?.startTime==null||n?.endTime==null)return s;let c=n.endTime-n.startTime;if(c<=0)return s;let l=n.resources?.executor?.memoryMB??null,u=a?.busyCoreMs,d={app:n,stages:o,executors:{added:r,removed:i}},f=_r(d);if(u!=null&&f!=null){let e=1-u/f;if(e>t.idleCoreWarn){let t=Math.round(e*100),{memoryGbHours:r}=hr(d),i=Mo(n,`either reduce cluster size (spark.executor.instances) or enable dynamic allocation`,`dynamic allocation is already on, so reduce cluster size`);s.push({type:`memoryUtilization`,variant:`idleCores`,stageId:null,impactBand:`warning`,metric:`idleCoreRate`,value:t,idleRateFraction:e,allocatedMBSeconds:r==null?null:r*1024*3600,recommendation:`${t}% of available core-time ran no task: ${i.text}.`,remediation:i.remediation})}}let p=br(e);if(p.size===0){let e=_o(ho(n,yo,!0),yo,!0,` To measure it, set ${yo}=true to record the peaks per stage.`,` ${yo} is already on, so no executor ran long enough to be sampled.`);s.push({type:`memoryUtilization`,variant:`memoryBand`,stageId:null,impactBand:`info`,metric:`memoryBand`,dataUnavailable:!0,recommendation:`Executor heap peaks are missing from this log: Spark samples them at the executor heartbeat, so tasks shorter than the heartbeat interval report zeros (and local mode reports zeros throughout), and executor memory sizing was not measured.${e.text}`,remediation:e.remediation})}else if(l!=null&&l>0){let e=l*1024*1024,a=``,u=0;for(let[e,t]of p)t>u&&(u=t,a=e);let d=u/e;if(d<t.bandTooHigh){let t=Math.round(d*100),l=p.size;s.push({type:`memoryUtilization`,variant:`memoryBand`,rule:`heapOverProvisioned`,stageId:null,executorId:a,impactBand:`info`,metric:`heapUsedRatio`,value:t,allocatedBytes:e,heap:u,executorCount:l,executorSeconds:hr({app:n,stages:o,executors:{added:r,removed:i}}).executorSeconds??c/1e3*l,recommendation:`The busiest of ${l} sampled executors peaked at ${t}% of allocated heap (a lower bound: Spark samples at executor heartbeat): memory may be over-provisioned; consider reducing spark.executor.memory for cost savings.`,remediation:[W(`spark.executor.memory`)]})}}let m=hr(d),h=n.resources?.executor?.cores??m.executorCores;if(l!=null&&m.executorSeconds!=null&&m.executorSeconds>0&&h!=null&&h>0){let e=l*m.executorSeconds,n=0;for(let e of o.values())n+=e.executorRunTime??0;let r=l*(n/1e3/h),i=e-r;if(i>t.wasteBufferMultiplier*r){let e=Math.round(i);s.push({type:`memoryUtilization`,variant:`wasteModel`,stageId:null,impactBand:`info`,metric:`wastedMBSeconds`,value:e,confidence:vs(i,r,t.wasteBufferMultiplier),validationRequired:`Memory-waste estimate uses allocated-vs-used memory-time and a ${t.wasteBufferMultiplier}x buffer: confirm against the Spark UI before acting.`,recommendation:`Allocated executor memory sat largely idle over the run (~${e.toLocaleString(`en-US`)} MB-seconds wasted): review spark.executor.memory and executor count.`,remediation:[W(`spark.executor.memory`)]})}}return s},estimate(e){if(e.variant===`wasteModel`&&typeof e.value==`number`)return G(`measured`,{value:e.value,unit:`mbSeconds`});if(e.variant===`idleCores`){let t=e.idleRateFraction,n=e.allocatedMBSeconds;return t!=null&&n!=null?G(`modeled`,{value:t*n,unit:`mbSeconds`}):G(`modeled`)}if(e.variant===`memoryBand`&&e.rule===`heapOverProvisioned`){let t=e.allocatedBytes,n=e.heap,r=e.executorSeconds;if(t!=null&&n!=null&&r!=null)return G(`modeled`,{value:(t-n)/1048576*r,unit:`mbSeconds`})}return G(`modeled`)}}),fs({type:`cacheUtilization`,order:103,fixEffort:`code`,version:2,emits:[`cacheUtilization`],docAnchor:`#bottleneck-cache-utilization`,thresholds:{cachedRatioWarn:.5,cachedRatioInfo:.9,diskRatioWarn:.4,diskRatioInfo:.15},detect(e,t){let n=e.app?.rddInfo;if(!(n instanceof Map))return null;let r=[],i=0,a=ho(e.app,`spark.eventLog.logBlockUpdates.enabled`,!0),o=/^(\d+)\.(\d+)/.exec(e.app?.sparkVersion??``),s=o==null||Number(o[1])<2||Number(o[1])===2&&Number(o[2])<3,c=a||s||(e.app?.rddBlockUpdates??0)>0;for(let e of n.values()){let n=e.storageLevel??{};if((n.useMemory||n.useDisk)&&(i++,(e.numCachedPartitions??0)>0)){if(c=!0,(e.numPartitions??0)>0){let n=e.numCachedPartitions/e.numPartitions;n<t.cachedRatioWarn?r.push(as(e,n,`warning`)):n<t.cachedRatioInfo&&r.push(as(e,n,`info`))}if(n.useMemory&&n.useDisk){let n=(e.memorySize??0)+(e.diskSize??0);if(n>0){let i=(e.diskSize??0)/n;i>t.diskRatioWarn?r.push(os(e,i,`warning`)):i>t.diskRatioInfo&&r.push(os(e,i,`info`))}}}}return i>0&&!c&&r.push(ss(i,e.app)),r},estimate(e){if(e.dataUnavailable)return G(`none`);let t=e.memorySize??0,n=e.diskSize??0,r=e.numCachedPartitions??0,i=e.numPartitions??0,a=Math.max(0,i-r),o=t+n;return Hi(G(`modeled`,{value:((r>0?o/r*a:0)+n)/Ri*1e3,unit:`ms`}),`assumes ${Math.round(Ri/1e6)} MB/s per reading task, summed as task time and not divided over executors`)}}),fs({type:`coreLocality`,order:103,fixEffort:`config`,version:1,emits:[`coreLocality`],docAnchor:`#bottleneck-core-locality`,thresholds:{minTasks:50,warnRatio:.15,critRatio:.35},detect(e,t){let{totalTasks:n,nonLocalTasks:r,ratio:i}=ci([...e.stages.values()]);if(n==null||n<t.minTasks||i<t.warnRatio)return null;let o=Math.round(i*100);return{type:`coreLocality`,stageId:null,impactBand:i>=t.critRatio?`critical`:`warning`,metric:`nonLocalRatio`,value:o,nonLocalTaskCount:r,confidence:ys(i,n,t),validationRequired:`Flagged when at least ${a(t.warnRatio)} of tasks run non-local (critical at ${a(t.critRatio)}), on runs of ${t.minTasks}+ tasks.`,recommendation:`${o}% of tasks (${r}) ran without process- or node-local data placement: check executor/data colocation.`}},estimate(e){return G(`modeled`,{value:(e.nonLocalTaskCount??0)*20,unit:`coreMs`})}}),fs({type:`autoscalingChurn`,order:103,fixEffort:`config`,version:1,emits:[`autoscalingChurn`],docAnchor:`#bottleneck-autoscaling-churn`,thresholds:{shortLivedMs:12e4,warningPct:.3,criticalPct:.6,minExecutors:5},detect(e,t){let{app:n,executorsAdded:r,executorsRemoved:i}=e;if(!n||r.length===0||n.endTime==null||r.length<t.minExecutors)return null;let a=new Map;for(let e of i)a.set(e.executorId,e.timestamp);let o=0;for(let e of r)(a.has(e.executorId)?a.get(e.executorId):n.endTime)-e.timestamp<t.shortLivedMs&&o++;let s=o/r.length,c=s>t.criticalPct?`critical`:s>t.warningPct?`warning`:null;if(!c)return null;let l=Math.round(s*100),u=ts(n);return{type:`autoscalingChurn`,stageId:null,impactBand:c,metric:`shortLivedExecutorPct`,value:l,shortLivedExecutorCount:o,confidence:bs(s,t.warningPct,t.criticalPct),dynamicAllocation:u?`off`:`on`,recommendation:u?`${l}% of executors ran for under 2 minutes before being removed: dynamic allocation is off, so the churn comes from executors lost or preempted, not from autoscaling bounds; check the cluster manager's preemption and executor-loss logs.`:`${l}% of executors ran for under 2 minutes before being removed: this looks like wasteful re-provisioning rather than normal scale-down; consider raising spark.dynamicAllocation.executorIdleTimeout or widening the minExecutors/maxExecutors bounds to reduce flapping.`,remediation:u?[]:[U(`spark.dynamicAllocation.executorIdleTimeout`),W(`spark.dynamicAllocation.minExecutors`),U(`spark.dynamicAllocation.maxExecutors`)]}},estimate(e){return G(`modeled`,{value:(e.shortLivedExecutorCount??0)*Li/36e5,unit:`coreHours`})}}),fs({type:`cachingOpportunity`,order:105,fixEffort:`code`,version:1,emits:[`cachingOpportunity`],docAnchor:`#bottleneck-caching-opportunity`,thresholds:{minExecutions:2},detect(e,t){let n=e.sql;if(!(n instanceof Map)||n.size===0)return null;let r=new Map;for(let e of n.values()){if(!e.planTree)continue;let t=new Map;L(e.planTree,e=>{let n=Ea(e);if(!n)return;let r=(e.metrics??[]).find(e=>e.name===La);t.set(n,(t.get(n)??0)+(r?r.value:0))});for(let[n,i]of t){let t=r.get(n);if(!t){let e=n.indexOf(`:`);t={format:n.slice(0,e),relation:n.slice(e+1),executionIds:new Set,executionBytes:new Map},r.set(n,t)}t.executionIds.add(e.id),t.executionBytes.set(e.id,(t.executionBytes.get(e.id)??0)+i)}}let i=new Map;for(let e of n.values()){if(!e.planTree)continue;let t=Oa(e.planTree),n=new Map(t.map(e=>[e.node,e.fingerprint])),r=new Map;for(let e of t){let t=r.get(e.fingerprint);t||(t={operator:e.operator,node:e.node,leafRelationBytes:new Map,ancestorFingerprints:new Set(e.ancestorNodes.map(e=>n.get(e)).filter(e=>!!e))},r.set(e.fingerprint,t));for(let[n,r]of e.leafRelationBytes)t.leafRelationBytes.set(n,(t.leafRelationBytes.get(n)??0)+r)}for(let[t,n]of r){let r=i.get(t);r||(r={operator:n.operator,exampleNode:n.node,executionIds:new Set,executionBytes:new Map,ancestorFingerprints:new Set,leafRelationRids:new Set},i.set(t,r)),r.executionIds.add(e.id);let a=[...n.leafRelationBytes.values()].reduce((e,t)=>e+t,0);r.executionBytes.set(e.id,(r.executionBytes.get(e.id)??0)+a);for(let e of n.ancestorFingerprints)r.ancestorFingerprints.add(e);for(let e of n.leafRelationBytes.keys())r.leafRelationRids.add(e)}}let a=e=>i.has(e)&&i.get(e).executionIds.size>=t.minExecutions,o=new Map;for(let[e,n]of i){if(!a(e)){o.set(e,{finalExecutionIds:n.executionIds,suppressed:!0});continue}let r=[...n.ancestorFingerprints].filter(a).map(e=>i.get(e));if(r.length===0){o.set(e,{finalExecutionIds:n.executionIds,suppressed:!1});continue}let s=new Set(r.flatMap(e=>[...e.executionIds])),c=new Set([...n.executionIds].filter(e=>!s.has(e)));c.size===0||c.size<t.minExecutions?o.set(e,{finalExecutionIds:c,suppressed:!0}):o.set(e,{finalExecutionIds:c,suppressed:!1})}let s=e=>e.slice(e.indexOf(`:`)+1),c={join:[`joined`,`join`],union:[`unioned`,`union`]},l=[],u=new Map;for(let[e,n]of i){let r=o.get(e);if(r.suppressed)continue;let i=[...r.finalExecutionIds].sort((e,t)=>e-t),a=i.reduce((e,t)=>e+(n.executionBytes.get(t)??0),0),d=[...n.leafRelationRids].sort();if(d.length===0)continue;let f=d.map(e=>{let t=e.indexOf(`:`);return{relation:e.slice(t+1),format:e.slice(0,t)}}),[m,h]=c[n.operator],g=d.map(s).join(` ${h} `),_=i.length,v=a>=128*K?`${m[0].toUpperCase()}${m.slice(1)} result read by ${_} queries (~${p(a)}): cache/persist the ${m} DataFrame so it is computed once.`:`${m[0].toUpperCase()}${m.slice(1)} result read by ${_} queries: cache the ${m} DataFrame, or reconsider whether it needs to be recomputed each time.`;l.push({type:`cachingOpportunity`,variant:`composite`,stageId:null,impactBand:`info`,metric:`executionReuse`,value:_,format:`derived`,relations:f,operator:n.operator,relation:g,executionIds:i,totalReadBytes:a,confidence:xs(_,t.minExecutions),validationRequired:`Composite reuse is inferred from a structural plan-shape match (operator + normalized join/filter condition + child shapes) across SQL executions; confirm these executions truly compute the same join/union before caching.`,recommendation:v});for(let e of d){u.has(e)||u.set(e,new Set);for(let t of i)u.get(e).add(t)}}for(let[e,n]of r){let r=u.get(e),i=r?[...n.executionIds].filter(e=>!r.has(e)):[...n.executionIds];if(i.length<t.minExecutions)continue;let a=i.length,o=i.reduce((e,t)=>e+(n.executionBytes.get(t)??0),0),s=o>=128*K?`Read by ${a} queries (~${p(o)}): cache/persist the shared DataFrame so it is scanned once.`:`Read by ${a} queries: cache the shared DataFrame, or broadcast it if it is a small join lookup.`;l.push({type:`cachingOpportunity`,stageId:null,impactBand:`info`,metric:`executionReuse`,value:a,relation:n.relation,format:n.format,executionIds:i.sort((e,t)=>e-t),totalReadBytes:o,confidence:xs(a,t.minExecutions),validationRequired:`Relation-reuse is inferred from the pre-AQE plan scan identity across SQL executions; confirm the reads are the same data and cacheable within one session before acting.`,recommendation:s})}return l},estimate(e){let t=e.totalReadBytes??0,n=e.executionIds?.length??0;return Hi(G(`measured`,{value:t,unit:`bytes`,reread:!0}),`counts the bytes ${n} ${n===1?`query`:`queries`} scanned from the same relation, matched by plan; a cache would still read it once`)}}),fs({type:`jobFailureRate`,order:110,fixEffort:`code`,version:1,emits:[`jobFailureRate`],docAnchor:`#bottleneck-job-failure-rate`,thresholds:{infoRate:.1,warnRate:.3,critRate:.5},detect(e,t){let{jobs:n,stages:r}=e,i=(n?[...n.values()]:[]).filter(e=>e.result!=null);if(i.length===0)return null;let a=i.filter(e=>e.succeeded===!1),o=a.length,s=o/i.length;if(s<t.infoRate)return null;let c=0,l=0;for(let e of r.values())c+=e.taskCount??0,l+=e.failedTasks??0;let u=c>0?l/c:0,d=a.filter(e=>e.submissionTime!=null&&e.completionTime!=null),f=d.length>0?d.reduce((e,t)=>e+(t.completionTime-t.submissionTime),0)/d.length:0,p=i.length;return{type:`jobFailureRate`,stageId:null,impactBand:s>=t.critRate?`critical`:s>=t.warnRate?`warning`:`info`,metric:`jobFailureRate`,value:Math.round(s*1e3)/10,failedJobs:o,totalJobs:p,failedTasks:l,totalTasks:c,avgJobDurationMs:f,taskFailureRate:Math.round(u*1e3)/10,recommendation:`${o} of ${p} jobs never recovered: inspect the driver log for the failed job(s) and the stage failures that triggered them.`}},estimate(e){return G(`modeled`,{value:(e.failedJobs??0)*(e.avgJobDurationMs??0)/36e5,unit:`coreHours`})}}),ps({type:`configAudit`,order:121,fixEffort:`config`,version:1,inScorecard:!1,emits:[`configAudit`],docAnchor:`#config-autoscale-bounds`,thresholds:{},property:`spark.dynamicAllocation.maxExecutors`,detect(e){let t=e.app;if((t?.resources??null)?.dynamicAllocationEnabled!==!0)return null;let n=Number.parseInt(so(t,`spark.dynamicAllocation.maxExecutors`)??``,10);return!Number.isFinite(n)||n>=Yo?{type:`configAudit`,property:`spark.dynamicAllocation.maxExecutors`,impactBand:`info`,metric:`config`,valueText:`(unset)`,recommendation:`Dynamic allocation is on with no upper bound: set spark.dynamicAllocation.maxExecutors to cap cluster growth.`,remediation:[xr(`spark.dynamicAllocation.maxExecutors`)]}:null},estimate:Wi}),ps({type:`configAudit`,order:122,fixEffort:`config`,version:1,inScorecard:!1,emits:[`configAudit`],docAnchor:`#config-serializer`,thresholds:{},property:`spark.serializer`,detect(e){let t=e.app,n=t?.config??{},r=t?.resources??null;if(Object.keys(n).length===0||!_a(e.stages))return null;let i=ar({sparkVersion:t?.sparkVersion,properties:n},`spark.serializer`),a=r?.serializer??(i?.source==="default"?null:i?.value??null);return typeof a==`string`&&/kryo/i.test(a)?null:{type:`configAudit`,property:`spark.serializer`,impactBand:`info`,metric:`config`,valueText:a??`(default JavaSerializer)`,recommendation:`Current serializer is ${a??`the default JavaSerializer`}: consider spark.serializer=org.apache.spark.serializer.KryoSerializer for faster, smaller buffers.`,remediation:go(t,`spark.serializer`,`org.apache.spark.serializer.KryoSerializer`)}},estimate:Wi}),ps({type:`configAudit`,order:123,fixEffort:`config`,version:1,inScorecard:!1,emits:[`configAudit`],docAnchor:`#config-memory-overhead`,thresholds:{floorMB:384,floorPct:.1},property:`spark.executor.memoryOverhead`,detect(e,t){let n=e.app?.resources??null,r=n?.executor?.memoryMB??null,i=n?.executor?.memoryOverheadMB??null;if(r==null||i==null)return null;let{minMB:a,factor:o}=co(e.app,t),s=Math.max(a,Math.round(r*o));return i>=s?null:{type:`configAudit`,property:`spark.executor.memoryOverhead`,impactBand:`info`,metric:`config`,valueText:`${i} MiB`,recommendation:`Executor memoryOverhead (${i} MiB) is below the ${s} MiB Spark would have defaulted to (max of ${a} MiB or ${Math.round(o*1e3)/10}% of executor memory): raise it to avoid off-heap OOM-kills.`,remediation:[U(`spark.executor.memoryOverhead`,`${s}m`)]}},estimate:Wi}),ds({type:`duplicatePlanSubtree`,order:130,fixEffort:`code`,version:2,emits:[`duplicatePlanSubtree`],docAnchor:`#bottleneck-duplicate-plan-subtree`,thresholds:{minSubtreeSize:3,minOccurrences:2,stageFloorPct:.005},detect(e,t,n){if(!e.planTree)return null;let r=Aa(e.planTree,n);if(r.length===0)return null;let i=Ae(e.id,t.stages),a=[];L(e.planTree,e=>a.push(e));let o=Na(a),s=Di(t.app),l=r.map(r=>{let a=[];for(let e of r.nodes)L(e,e=>a.push(e));let l=ba(a,i),u=0;for(let e of l){let n=t.stages.get(e);n&&(u+=Math.max(0,(n.completedAt??0)-(n.submittedAt??0)))}if(s!=null&&u>0&&u<s*n.stageFloorPct)return null;let d=ja(r.nodes),p=Pa(a,o),m=a.map(e=>e.id).filter(Boolean),h=f({...r,value:r.occurrences}),g=d?``:` ${c}`;return{type:`duplicatePlanSubtree`,executionId:e.id,stageIds:l,planNodeIds:m,stageShares:p,occurrencesIdentical:d,impactBand:d&&Object.keys(p).length>0?`warning`:`info`,metric:`subtreeOccurrences`,value:r.occurrences,rootName:r.rootName,subtreeSize:r.subtreeSize,sampleRelation:r.sampleRelation,groupIndex:r.groupIndex,confidence:d?Fa(r.subtreeSize,r.occurrences,n):`low`,validationRequired:`Matching compares operator and metric names only, not literals or expression IDs: confirm the repeat in the Spark UI SQL tab before acting.`,recommendation:(r.isExchangeRoot?`${h}: this looks like a possible missed exchange reuse; check whether the same shuffle could be computed once and reused.`:`${h}: consider caching/persisting the shared computation or check for a duplicated query branch.`)+g}}).filter(e=>e!==null);return l.length>0?l:null},estimate(e,t){let n=e.stageIds;if(!n||n.length===0)return null;let r=typeof e.value==`number`?e.value:0;if(r<2||e.occurrencesIdentical===!1)return G(`none`);let i=e.stageShares??null,a=(r-1)/r,o=new Map;for(let e of n){let n=t.stages.get(e),r=i?i[e]??0:1;if(n&&r>0){let t=n.taskActiveMs??Math.max(0,(n.completedAt??0)-(n.submittedAt??0));o.set(e,t*r*a)}}if(o.size===0)return G(`none`);let s={value:[...o.values()].reduce((e,t)=>e+t,0),unit:`ms`};return Ki([...o.keys()],o,t,`measured`,s)??G(`measured`,s)}}),ds({type:`smallFiles`,order:131,fixEffort:`config`,version:2,emits:[`smallFiles`],docAnchor:`#bottleneck-small-files`,thresholds:{minFiles:100,maxAvgFileSizeMB:3},detect(e,t,n){if(!e.planTree)return null;let{minFiles:r,maxAvgFileSizeMB:i}=n,a=[];if(L(e.planTree,e=>{let t=e.metrics??[],n=e=>t.find(t=>t.name===e),o=(t,n,o)=>{if(!t||!n||!(t.value>r))return;let s=n.value/t.value;s<i*K&&a.push({direction:o,fileCount:t.value,avgBytes:s,nodeName:e.name,node:e})};o(n(Ia),n(La),`read`),o(n(Ra),n(za),`write`)}),a.length===0)return null;let o=Ae(e.id,t.stages);return a.map(t=>{let n=ba([t.node],o),r=t.node.id?[t.node.id]:[];return{type:`smallFiles`,executionId:e.id,stageIds:n,planNodeIds:r,impactBand:`warning`,metric:`avgFileSizeBytes`,value:Math.round(t.avgBytes),fileCount:t.fileCount,direction:t.direction,nodeName:t.nodeName,recommendation:t.direction===`read`?`${t.fileCount} small files were read at ${m(t.nodeName)}: consider compacting the upstream output so fewer, larger files are produced.`:`${t.fileCount} small files were written at ${m(t.nodeName)}: repartition or coalesce before writing to raise the average file size.`}})},estimate(e,t){let n=(e.fileCount??0)*10,r=e.stageIds,i=1;if(e.direction===`read`)for(let e of r??[])i=Math.max(i,t.stages.get(e)?.peakConcurrentTasks??1);return qi(n/i,r,t)}}),ds({type:`broadcastSizing`,order:132,fixEffort:`config`,version:3,emits:[`overBroadcast`,`underBroadcast`],docAnchor:`#bottleneck-broadcast-sizing`,thresholds:{broadcastTiers:[10*K,100*K,ha],comparisonTiers:[10*ha,300*ha],overBroadcastBytes:ha,minSmallerSideBytes:K},detect(e,t,n){if(!e.planTree)return null;let{broadcastTiers:r,comparisonTiers:i,overBroadcastBytes:a,minSmallerSideBytes:o}=n,s=Ae(e.id,t.stages),c=uo(t.app,e.modifiedConfigs),l=e=>{let t=$o(c,e),n=t===Xo?[t]:[Xo,t];return{key:t,threshold:es(c,t),admittingThresholds:n.map(e=>({key:e,threshold:es(c,e)}))}},u=l(!1),d=l(!0),f=new Set,m=[];return L(e.planTree,(t,n)=>{(t.name===`AdaptiveSparkPlan`||n!=null&&f.has(n))&&f.add(t);let c=f.has(t),{key:l,threshold:h,admittingThresholds:g}=c?d:u,_=t.name===`SortMergeJoin`?Ga(t):null;if(_){let t=Ha(_.build),n=Ha(_.stream);if(t>=o&&t<=a&&t<=n){let a=h!=null&&h<0?`disabled`:h!=null&&h>=t?`notLimiting`:`limits`,o=t<r[0]||t<r[1]&&n>i[0]||t<r[2]&&n>i[1];if(a===`notLimiting`||o){let r=[_.build,_.stream],{joinType:i,buildSide:o}=_,u=`The ${o} input to this ${i} Sort Merge Join (${p(t)})`,d=` (the other side is ${p(n)})`;m.push({type:`underBroadcast`,executionId:e.id,stageIds:ba(r,s),planNodeIds:r.map(e=>e.id).filter(Boolean),impactBand:`info`,metric:`smallerSideBytes`,value:t,largerSideBytes:n,joinType:i,buildSide:o,broadcastThreshold:a,recommendation:a===`notLimiting`?`${u} is under the effective ${l} (${p(h)}) yet was not broadcast${d}, so the threshold is not what stopped it: ${c?`a join hint, a shuffle that had already run, or a low share of non-empty partitions (below ${Qo}) usually is. Consider a broadcast() hint or lowering ${Qo}.`:`a join hint, missing table statistics, or a shuffle that had already run usually is. Consider a broadcast() hint or collecting statistics (ANALYZE TABLE).`}`:a===`disabled`?`${u} was not broadcast${d} because automatic broadcast is disabled (${l}=-1): this could have been a broadcast join. Set ${l} to a positive size or add a broadcast() hint.`:`${u} is over the effective ${l} (${h==null?`not a size`:p(h)}) but small enough to broadcast${d}: this could have been a broadcast join. Consider a broadcast() hint or raising ${l}.`,remediation:a===`notLimiting`?[]:[U(l)]})}}}if(De(t.name)){let n=(t.metrics??[]).find(e=>e.name===`data size`);if(n&&n.value>a){let r=(t.children??[])[0],i=g.filter(e=>e.threshold==null||e.threshold>=n.value),o=g.every(e=>e.threshold!=null&&e.threshold<0),c=i.length===0,l=o?`disabled`:c?`notLimiting`:`limits`,u=g.map(e=>`${e.key} (${e.threshold<0?`disabled`:p(e.threshold)})`).join(` and `),d=i.map(e=>e.key);m.push({type:`overBroadcast`,executionId:e.id,stageIds:ba(r?[r]:[],s),planNodeIds:[t.id].filter(Boolean),impactBand:`warning`,metric:`broadcastBytes`,value:n.value,broadcastThreshold:l,recommendation:o?`This broadcast (${p(n.value)}) exceeds the ${ga(a)} threshold: automatic broadcast is already disabled, so remove the broadcast() hint that forced it.`:c?`This broadcast (${p(n.value)}) exceeds the ${ga(a)} threshold: ${u} ${g.length>1?`are`:`is`} below it, so a broadcast() hint forced it: remove the hint.`:`This broadcast (${p(n.value)}) exceeds the ${ga(a)} threshold: check for a misapplied broadcast hint or a misconfigured ${d.join(` or `)}.`,remediation:d.map(e=>W(e))})}}}),m.length?m:null},estimate(e,t){return qi((e.value??0)/Ii*1e3,e.stageIds,t)}}),ds({type:`pythonUdf`,order:134,fixEffort:`code`,version:1,emits:[`pythonUdf`],docAnchor:`#pyspark`,thresholds:{minBytesSent:64*K,minStageMs:3e4},detect(e,t,n){if(!e.planTree)return null;let{minBytesSent:r,minStageMs:i}=n,a=[],o=0,s=0,c=!1;if(L(e.planTree,e=>{if(!ei(e))return;let t=e.metrics?.find(e=>e.name===xo)?.value;if(t==null||!e.stageIds?.length)return;a.push(e),o+=t;let n=e.metrics?.find(e=>e.name===So)?.value;n!=null&&(s+=n,c=!0)}),a.length===0||!(o>=r))return null;let l=ba(a,[]),u=l.reduce((e,n)=>{let r=t.stages.get(n);return e+Math.max(0,(r?.completedAt??0)-(r?.submittedAt??0))},0);if(!(u>=i))return null;let d=Co(uo(t.app,e.modifiedConfigs)),f=`sent ${p(o)} to Python workers${c?` and received ${p(s)} back`:``}`;return[{type:`pythonUdf`,executionId:e.id,stageIds:l,planNodeIds:a.flatMap(e=>e.id?[e.id]:[]),impactBand:`info`,metric:`dataSentBytes`,value:o,dataSentBytes:o,dataReturnedBytes:c?s:null,stageDurationMs:u,recommendation:`Row-at-a-time Python UDFs (BatchEvalPython) ${f} over ${y(u)} of stage time: ${d.text}`,remediation:d.remediation}]},estimate:Wi}),ds({type:`nestedLoopJoin`,order:133,fixEffort:`code`,version:1,emits:[`nestedLoopJoin`],docAnchor:`#joins`,thresholds:{minOutputRows:1e6,minExpansion:10},detect(e,t,n){if(!e.planTree)return null;let r=[];return L(e.planTree,t=>{let i=ea(t);if(!i||t.children.length!==2)return;let a=ra(t);if(a==null||a<n.minOutputRows)return;let o=i.operator===`CartesianProduct`,s=o?null:na(t.children[0]),c=o?null:na(t.children[1]),l=null;if(!o&&(s==null||c==null||(l=a/Math.max(s,c,1),l<n.minExpansion)))return;let u=ba([t],[]),d=i.condition==null?`Confirm the cross join is intended, or add a join key so the rows are matched instead of multiplied.`:`Add an equi-join key so Spark can use a hash or sort-merge join; for a range condition, bucket the range and join on the bucket as well.`,f=i.condition==null?``:` on ${i.condition}`;r.push({type:`nestedLoopJoin`,executionId:e.id,stageIds:u,planNodeIds:[t.id].filter(Boolean),impactBand:`info`,metric:`outputRows`,value:a,nodeName:i.operator,joinType:i.joinType,condition:i.condition,outputRows:a,leftRows:s,rightRows:c,confidence:`medium`,validationRequired:`Row counts are the executors' measured values; the time graded is the whole stage that runs the join, which also covers its other operators.`,recommendation:`${i.operator}${f} produced ${a.toLocaleString(`en-US`)} rows${l==null?i.condition==null?`, every left row paired with every right row.`:`: the pairs its condition kept from every left and right pairing it compared.`:` from ${s.toLocaleString(`en-US`)} and ${c.toLocaleString(`en-US`)} input rows (${Math.round(l).toLocaleString(`en-US`)}x the larger side).`} ${d}`,remediation:[Sr(d)]})}),r.length>0?r:null},estimate(e,t){let n=e.stageIds;if(!n||n.length===0)return G(`none`);let r=new Map;for(let e of n){let n=t.stages.get(e);n&&r.set(e,n.taskActiveMs??Math.max(0,(n.completedAt??0)-(n.submittedAt??0)))}if(r.size===0)return G(`none`);let i={value:[...r.values()].reduce((e,t)=>e+t,0),unit:`ms`};return Ki([...r.keys()],r,t,`modeled`,i)??G(`modeled`,i)}})],Ds=(()=>{let e=new Map;for(let t of Es)for(let n of t.emits)e.has(n)||e.set(n,t);return e})();function Os(e){return cs(`skew`,Ds.get(`skew`).thresholds,e?.skew??{})}var ks=Es;function As(e,t){return t?.[e.type]}function js(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((e,n)=>e===t[n]):e===t}function Ms(e,t){let n={};for(let[r,i]of Object.entries(As(e,t)??{})){if(!Object.hasOwn(e.thresholds,r))continue;let t=e.thresholds[r];js(i,t)||(n[r]={value:i,default:t})}return Object.keys(n).length>0?n:null}var Ns={straggler:`skew`};function Ps(e,t){let n=Ms(e,t),r=e.suppressedBy??Ns[e.type],i=r?ks.find(e=>e.type===r):void 0,a=i?Ms(i,t):null;if(!i||!a)return n;let o=Object.fromEntries(Object.entries(a).map(([e,t])=>[`${i.type}.${e}`,t]));return{...n,...o}}function Fs(e,t){let n=Ds.get(e);return n?Ps(n,t):null}function Is(e){let t={};for(let n of ks){let r=Ms(n,e);r&&(t[n.type]=r)}return Object.keys(t).length>0?t:null}function Ls(e,t){let n=As(e,t);return n?{...e.thresholds,...n}:e.thresholds}function Rs(e){return Xa().map((t,n)=>{let r=ks[n],i=Ms(r,e);return i?{...t,thresholds:Ls(r,e),tunedThresholds:i}:t})}function zs(e){return Array.isArray(e)?`[${e.join(`, `)}]`:String(e)}function Bs(e){return Object.entries(e).map(([e,{value:t,default:n}])=>`${e} ${zs(t)} (default ${zs(n)})`).join(`, `)}function Vs(e){return`${Object.entries(e).map(([e,t])=>`${e} ${Bs(t)}`).join(`; `)}. Findings from these detectors are marked, and their impact estimates are uncalibrated: the estimates are calibrated against the default thresholds.`}function Hs(e,t){let n=`Produced with tuned thresholds: ${Bs(e)}.`;return t?`${n} Impact estimates are calibrated against the default thresholds, so this finding's estimate is unvalidated.`:n}function Us(e){throw Error(`Unreachable case: ${JSON.stringify(e)}`)}function Ws(e,t){for(let n of e){let e=Ds.get(n.type)?.estimate(n,t);e&&(n.impactEstimate={...e,coreTimeMs:Yi(n,e)})}return Ks(e),e}var Gs=[`skew`,`straggler`];function Ks(e){let t=new Set,n=e.filter(e=>e.stageId!=null&&e.impactEstimate?.coreTimeMs!=null&&Gs.includes(e.type)).sort((e,t)=>Gs.indexOf(e.type)-Gs.indexOf(t.type));for(let e of n)t.has(e.stageId)?e.impactEstimate.coreTimeMs=null:t.add(e.stageId)}var qs=5,Js={totalCoreHours:null,usefulCoreHours:null,wastedCoreHours:null,totalCores:null,topStages:[]};function Ys(e,t=[],n,r=[]){if(!n||e?.startTime==null||e?.endTime==null||e.endTime-e.startTime<=0)return Js;let i=_r({app:e,stages:new Map,executors:{added:t,removed:r}});if(i==null)return Js;let a=qn(e,t,r),o=i/pe,s=(n.busyCoreMs??0)/pe;return{totalCoreHours:o,usefulCoreHours:s,wastedCoreHours:Math.max(0,o-s),totalCores:a,topStages:Object.entries(n.perStage??{}).map(([e,t])=>({stageId:Number(e),coreMs:t?.totalTaskDurationSum??0})).sort((e,t)=>t.coreMs-e.coreMs).slice(0,qs)}}var Xs=Es;function Zs(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,`0`)}var Qs=[`host`,`executorId`,`rule`,`variant`,`dimension`,`direction`,`nodeName`,`rootName`,`subtreeSize`,`groupIndex`,`largerSideBytes`,`rddId`,`relation`,`format`,`operator`,`executionIds`],$s=new Map(Object.entries({skew:[],stageShape:[`rule`],shuffle:[],partitionSizing:[`rule`],spill:[],gc:[`direction`],slowHost:[`host`,`executorId`,`variant`,`dimension`],stageSlowness:[],stageFailed:[`variant`],failures:[],straggler:[],speculationWaste:[],retryWaste:[],tinyTask:[],incompleteRun:[],coldStart:[],utilization:[],memoryUtilization:[`executorId`,`variant`],cacheUtilization:[`variant`,`rddId`],coreLocality:[],autoscalingChurn:[],cachingOpportunity:[`variant`,`relation`,`format`,`operator`,`executionIds`],jobFailureRate:[],configAudit:[],duplicatePlanSubtree:[`rootName`,`subtreeSize`,`groupIndex`],smallFiles:[`direction`,`nodeName`],pythonUdf:[],nestedLoopJoin:[`nodeName`],underBroadcast:[`largerSideBytes`],overBroadcast:[]}).map(([e,t])=>[e,new Set(t)]));function ec(e){return e.stageId==null?`executionId`in e?e.executionId:e.type===`configAudit`?e.property:``:e.stageId}function tc(e){let t=e,n=$s.get(e.type),r=Qs.map(e=>{let r=n?.has(e)?t[e]:void 0;return Array.isArray(r)?r.join(`,`):r??``}).join(`|`);return Zs(`${e.type}|${ec(e)}|${e.metric??``}|${e.value??e.valueText??``}|${r}`)}function nc(e,t,n,r=null){if(!n)return;let i=t.version??1;for(let a of Array.isArray(n)?n:[n]){if(!a)continue;let n={...a,docAnchor:a.docAnchor??t.docAnchor,detectorVersion:i};r&&(n.tunedThresholds=r);let o=tc(n);e.some(e=>e.id===o)||e.push({...n,id:o})}}function rc(e){for(let t of e){if(!t.tunedThresholds)continue;let e=t.impactEstimate!=null&&t.impactEstimate.basis!==`informational`,n=Hs(t.tunedThresholds,e);t.validationRequired=t.validationRequired?`${t.validationRequired} ${n}`:n}}function ic(e,t){let n=Ds.get(e);if(!n)return null;let{floorPctWarn:r,floorPctCrit:i}=Ls(n,t);return{warnPct:typeof r==`number`?r:wi,critPct:typeof i==`number`?i:Ti}}function ac(e){let t=new Map;for(let n of Xs){if(!n.suppressedBy)continue;let r=new Set(Xs.filter(e=>e.type===n.suppressedBy).flatMap(e=>e.emits));for(let i of n.emits){let n=t.get(i)??new Set;for(let t of e)r.has(t.type)&&t.stageId!=null&&n.add(t.stageId);t.set(i,n)}}return t.size===0?e:e.filter(e=>e.stageId==null||!t.get(e.type)?.has(e.stageId))}var oc=`spark.executor.memory`;function sc(e,t){return(e.remediation??[]).some(e=>e.kind===`conf`&&e.key===oc&&e.direction===t)}function cc(e){let t=e.filter(e=>sc(e,`increase`));if(t.length===0)return e;let n=new Set(t.flatMap(e=>e.stageId==null?[]:[e.stageId])),r=[...n].sort((e,t)=>e-t).join(`, `),i=n.size>0?`Stage${n.size===1?``:`s`} ${r} ask${n.size===1?`s`:``} for more executor memory, so confirm before lowering it.`:`Other findings ask for more executor memory, so confirm before lowering it.`,a=[];for(let t of e){if(!sc(t,`decrease`)||sc(t,`increase`)){a.push(t);continue}if(t.stageId!=null){n.has(t.stageId)||a.push(t);continue}a.push({...t,recommendation:`${t.recommendation??``} ${i}`.trim(),remediation:(t.remediation??[]).filter(e=>e.kind!==`conf`||e.key!==oc||e.direction!==`decrease`)})}return a}function lc(e,t,n,r){let{wastedCoreHours:i}=Ys(e,t,r,n);return i==null?null:i*pe}function uc(e,t,n,r,i,a=new Map,o=null,{thresholds:s}={}){let c=qn(e??{},n,r),l={stages:t,totalCores:c,sql:a,occupancy:_i(t,c),runIdleCoreMs:lc(e,n,r,o)},u={app:e,jobs:i,executorsAdded:n,executorsRemoved:r,runAggregates:o,impact:l,stages:t,sql:a,skewThresholds:Os(s)},d=[];for(let e of Xs){if(e.inScorecard===!1)continue;let t=As(e,s),n=Ps(e,s);switch(e.scope){case`stage`:{let r=e.withThresholds(t);for(let t of u.stages.values())nc(d,e,r(t,u),n);break}case`sql`:{let r=e.withThresholds(t);for(let t of u.sql.values())nc(d,e,r(t,u),n);break}case`app`:nc(d,e,e.withThresholds(t)(u),n);break;case`config`:nc(d,e,e.withThresholds(t)(u),n);break;default:Us(e)}}let f=cc(ac(d));return Ws(f,l),rc(f),Oi(f,e,s?e=>ic(e,s):void 0),f.sort((e,t)=>S[e.impactBand]-S[t.impactBand]),f}var dc=new WeakMap;function fc(e,t){let n=[],r={app:e,stages:t};for(let e of Xs)e.scope===`config`&&nc(n,e,e.withThresholds()(r));return Ws(n,{stages:new Map,occupancy:new Map,totalCores:0}),Oi(n,e),n.map(e=>({...e,stageId:e.stageId??null}))}function pc(e,t){if(e===null)return fc(e,t);let n=_a(t),r=dc.get(e);if(r?.rddWork===n)return r.findings.slice();let i=fc(e,t);return dc.set(e,{rddWork:n,findings:i}),i.slice()}var mc=`sparkforensics`,hc=`recentFiles`,gc=10,_c=0;function vc(){let e=Date.now();return e>_c?(_c=e,e):++_c}function yc(){return typeof window<`u`&&`showOpenFilePicker`in window}function bc(e){e.objectStoreNames.contains(hc)&&e.deleteObjectStore(hc),e.createObjectStore(hc,{keyPath:`id`})}function xc(e,t,n){return`${e}::${t}::${n}`}function Sc(){return new Promise((e,t)=>{let n=indexedDB.open(mc,1);n.onupgradeneeded=()=>bc(n.result),n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}function Cc(e,t){return e.transaction(hc,t).objectStore(hc)}function wc(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)})}async function Tc({handle:e,name:t,size:n,lastModified:r,appName:i=null,issueCount:a=null}){let o=await Sc();try{let s={id:xc(t,n,r),name:t,size:n,lastModified:r,handle:e,appName:i,issueCount:a,lastOpenedAt:vc()};await wc(Cc(o,`readwrite`).put(s));let c=await wc(Cc(o,`readonly`).getAll());if(c.length>gc){c.sort((e,t)=>e.lastOpenedAt-t.lastOpenedAt);let e=c.slice(0,c.length-gc);for(let t of e)await wc(Cc(o,`readwrite`).delete(t.id))}return s}finally{o.close()}}async function Ec(){let e=await Sc();try{return(await wc(Cc(e,`readonly`).getAll())).sort((e,t)=>t.lastOpenedAt-e.lastOpenedAt)}finally{e.close()}}async function Dc(e){let t=await Sc();try{let n=await wc(Cc(t,`readonly`).get(e));if(!n)return;n.lastOpenedAt=vc(),await wc(Cc(t,`readwrite`).put(n))}finally{t.close()}}async function Oc(e){let t=await Sc();try{await wc(Cc(t,`readwrite`).delete(e))}finally{t.close()}}async function kc(e){let t=await Sc();try{let n=await wc(Cc(t,`readonly`).get(e));return n?n.handle:null}finally{t.close()}}async function Ac(e,t=`read`){if(!e)return!1;let n=e,r={mode:t};return await n.queryPermission(r)===`granted`||await n.requestPermission(r)===`granted`}var jc=new Set([`local-server-unavailable`,`upstream-unreachable`,`application-not-found`,`access-or-upstream-failure`,`invalid-event-log`]),Mc=[/^application_\d+_\d+$/,/^local-\d+$/,/^app-[A-Za-z0-9][A-Za-z0-9._-]*$/,/^spark-[A-Za-z0-9][A-Za-z0-9._~-]*$/,/^driver-\d+$/],Nc=/^(?!\.{1,2}$)[A-Za-z0-9][A-Za-z0-9._~-]*$/;function Pc(e){return typeof e==`string`?e.trim():``}function Fc(e){let t=Pc(e);if(!t||t.includes(`?`)||t.includes(`#`))return null;let n;try{n=new URL(t)}catch{return null}return n.protocol!==`http:`&&n.protocol!==`https:`||n.username||n.password||n.search||n.hash?null:(n.pathname=`${n.pathname.replace(/\/+$/,``)}/`,n.toString())}function Ic(e){return Mc.some(t=>t.test(e))}function Lc(e){return Nc.test(e)}function Rc({baseUrl:e=``,appId:t=``,attemptId:n=``}={}){let r=Fc(e),i=Pc(t),a=Pc(n),o={baseUrl:r?null:`Enter an absolute HTTP(S) base URL without credentials, query, or fragment.`,appId:Ic(i)?null:`Enter a supported Spark application ID.`,attemptId:!a||Lc(a)?null:`Enter a URL-path-safe attempt ID.`};return o.baseUrl||o.appId||o.attemptId?{request:null,errors:o}:{request:{baseUrl:r,appId:i,attemptId:a||null},errors:o}}function zc(e){return e?.request!=null}function Bc(e){return typeof e==`string`&&jc.has(e)}var Vc={A:`Baseline`,B:`Candidate`},q={current:null},Hc={current:null};function Uc(e={}){let t=e.makeClient??Vn,n=(0,z.useCallback)(async e=>{let t=j.getState().taskDataCache.get(e);if(t)return t;let n=await q.current.requestTaskData(e);return j.getState().setTaskData(e,n),n},[]),r=(0,z.useCallback)(async(e=0)=>{let t=j.getState().appModel,n=I(t,{skippedLines:e}),r=uc(t.app,t.stages,t.executors.added,t.executors.removed,t.jobs,t.sql,t.runAggregates);j.getState().setFindings(r,pc(t.app,t.stages),n),j.getState().setSkippedLines(e),j.getState().setStatus(`ready`);let i=[...new Set(r.map(e=>e.stageId).filter(e=>e!=null))],a=await q.current.prefetchFlaggedStages(i);for(let{stageId:e,metrics:t,fieldNames:n}of a)j.getState().setTaskData(e,{metrics:t,fieldNames:n});let o=Hc.current;if(o?.handle){let e=new Set(r.map(e=>e.stageId??`app:${e.type}`)).size;await Tc({handle:o.handle,name:o.name,size:o.size,lastModified:o.lastModified,appName:t.app?.name??null,issueCount:e})}},[]),i=(0,z.useCallback)(()=>{let e=j.getState();e.activeFileId!=null&&e.appModel.app&&e.sessionCache.set(e.activeFileId,me(e.appModel,e.catalog,e.taskDataCache))},[]),a=(0,z.useCallback)(e=>(q.current?.terminate(),j.getState().resetModel(),j.getState().setStatus(`parsing`),j.getState().setActiveFile(null),Hc.current=null,q.current=t(),Un(j.getState().appModel,{onProgress:e=>j.getState().setParse({pct:e.pct??0,lines:e.linesProcessed??0,etaMs:e.etaMs??null}),onDone:e=>{r(e?.skippedLines??0)},onError:t=>{e?e(t):j.getState().setError(String(t?.message??t))}})),[t,r]),o=(0,z.useCallback)((e,t)=>{let n=a(),r=t?.id??xc(e.name,e.size,e.lastModified);j.getState().setActiveFile(r),t?.handle&&(Hc.current={handle:t.handle,name:e.name,size:e.size,lastModified:e.lastModified}),q.current.startParse(e,n)},[a]),s=(0,z.useCallback)(e=>{let t=a();q.current.startParseFiles(Array.from(e),t)},[a]),c=(0,z.useCallback)((e,t)=>{let n=a(e=>{if(j.getState().setShsParsing(!1),e?.source===`shs`&&Bc(e.code)){j.getState().resetModel(),t(e);return}j.getState().setError(String(e?.message??e))});j.getState().setShsParsing(!0),q.current.startParseFromUrl(e,n)},[a]),l=(0,z.useCallback)(()=>{i(),q.current?.terminate(),j.getState().resetModel(),j.getState().setStatus(`idle`)},[i]),u=(0,z.useCallback)(()=>{q.current?.terminate(),q.current=null,Hc.current=null,j.getState().resetModel(),j.getState().setActiveFile(null),j.getState().setStatus(`idle`)},[]),d=(0,z.useCallback)(async(e,t)=>{let n=j.getState();if(e===n.activeFileId)return`noop`;let r=n.sessionCache.get(e);if(r){i(),q.current?.terminate(),q.current=null;let t=ae(n.appModel,n.taskDataCache,r);return j.getState().setFindings(t,pc(n.appModel.app,n.appModel.stages)),j.getState().setSkippedLines(r.skippedLines??0),j.getState().setActiveFile(e),j.getState().setStatus(`ready`),await Dc(e),`restored`}let a=t??await kc(e);if(!a||!await Ac(a))return`gone`;let s;try{s=await a.getFile()}catch(t){return t instanceof DOMException&&(t.name===`NotFoundError`||t.name===`NotAllowedError`)&&(await Oc(e).catch(()=>{}),n.sessionCache.delete(e)),`gone`}return i(),o(s,{handle:a,id:e}),`started`},[o,i]),f=(0,z.useCallback)((e,t)=>{let n=j.getState().sessionCache,r=n.get(e),i=n.get(t);return!r||!i?null:{baseline:{label:_(e),snapshot:r},candidate:{label:_(t),snapshot:i}}},[]),p=(0,z.useCallback)(async(e,t)=>{if(e.kind===`file`)return{start:t=>q.current.startParse(e.file,t)};if(e.kind===`folder`)return{start:t=>q.current.startParseFiles(e.files,t)};if(e.kind===`url`)return{start:t=>q.current.startParseFromUrl(e.request,t)};if(e.kind===`cached`)return null;let n=e.handle??await kc(e.id);if(!n)return j.getState().setError(`${Vc[t]}: this recent file is no longer available.`),null;if(!await Ac(n))return j.getState().setError(`${Vc[t]}: permission to read this file was denied.`),null;let r;try{r=await n.getFile()}catch{return j.getState().setError(`${Vc[t]}: this recent file could not be read.`),null}return{start:e=>q.current.startParse(r,e)}},[]),m=(0,z.useCallback)((e,t=0)=>{let n=j.getState().appModel;j.getState().setEvidenceAvailability(I(n,{skippedLines:t}));let r=j.getState().appModel,i=uc(r.app,r.stages,r.executors.added,r.executors.removed,r.jobs,r.sql,r.runAggregates);j.getState().sessionCache.set(e,me(r,i,j.getState().taskDataCache))},[]),h=(0,z.useCallback)((e,n)=>{let r=(e,t)=>{q.current?.terminate(),j.getState().setCompareLoad(null),j.getState().setComparisonActive(!1);let n=t?.message??String(t);j.getState().setError(`${Vc[e]}: ${n}`)},i=async(e,n,i)=>{q.current?.terminate(),j.getState().resetModel(),j.getState().setActiveFile(e.id),j.getState().setCompareLoad({current:n===`A`?1:2}),q.current=t();let a=await p(e,n);if(!a){q.current?.terminate(),j.getState().setCompareLoad(null),j.getState().setComparisonActive(!1);return}let o=Un(j.getState().appModel,{onProgress:e=>j.getState().setParse({pct:e.pct??0,lines:e.linesProcessed??0,etaMs:e.etaMs??null}),onDone:e=>i(e?.skippedLines??0),onError:e=>r(n,e)});a.start(o)},a=(e,t,n)=>{if(e.kind===`cached`){if(!j.getState().sessionCache.has(e.id)){j.getState().setError(`${Vc[t]}: this run is no longer loaded. Load its event log again.`);return}n();return}i(e,t,t=>{m(e.id,t),n()})};a(e,`A`,()=>{a(n,`B`,()=>{j.getState().setCompareLoad(null),j.getState().setActiveFile(null),j.getState().setCompareSeed(null),j.getState().openComparison(e.id,n.id)})})},[t,p,m]),g=(0,z.useCallback)(()=>{let e=j.getState(),t=e.activeFileId;t!=null&&e.appModel.app&&(l(),j.getState().setCompareSeed({id:t,label:_(t)}))},[l]);return{startLoad:o,startLoadFolder:s,startLoadFromUrl:c,resetToDropZone:l,cancelParse:u,getTaskData:n,pickRecent:d,prepareComparison:f,startCompareLoad:h,drillIntoRun:(0,z.useCallback)(e=>{let t=j.getState(),n=t.sessionCache.get(e);if(!n)return;q.current?.terminate(),q.current=null;let r=ae(t.appModel,t.taskDataCache,n);j.getState().setFindings(r,pc(t.appModel.app,t.appModel.stages)),j.getState().setSkippedLines(n.skippedLines??0),j.getState().setActiveFile(e),j.getState().setStatus(`ready`),j.getState().setComparisonActive(!1)},[]),compareWithAnotherRun:g}}function Wc(e){let t=[...e.values()].filter(e=>e.submittedAt!=null&&e.completedAt!=null).map(e=>[e.submittedAt,e.completedAt]);return d(t)}function Gc(e,t){let n=e?.startTime??0,r=[...t.values()].filter(e=>e.submittedAt!=null&&e.completedAt!=null).map(e=>[e.submittedAt,e.completedAt]),i=e?.endTime??null??(r.length>0?r.reduce((e,t)=>Math.max(e,t[1]),-1/0):n),a=Math.max(0,i-n);if(r.length===0)return{total:a,startup:a,stagesActive:0,gaps:0,idle:0};let o=d(r),s=o.reduce((e,[t,n])=>e+(n-t),0),c=o[0][0],l=Math.max(0,c-n),u=0;for(let e=1;e<o.length;e++)u+=o[e][0]-o[e-1][1];let f=o[o.length-1][1],p=Math.max(0,i-f);return{total:a,startup:l,stagesActive:s,gaps:u,idle:p}}function Kc(e){if(e.length>qc)return Xc(e);let t=Yc.get(e);return t===void 0&&(Yc.size>=Jc&&Yc.clear(),t=Xc(e),Yc.set(e,t)),t}var qc=256,Jc=4096,Yc=new Map;function Xc(e){return String(e).toLowerCase().replace(/\b[0-9a-f]{8,}\b/g,`#`).replace(/\d+/g,`#`).replace(/\s+/g,` `).trim()}var Zc=new WeakMap;function Qc(e,t){let n=Zc.get(e);n||(n=new Map,Zc.set(e,n));let r=n.get(t);return r===void 0&&(r=t(e.detail??``),n.size>=$c&&n.delete(n.keys().next().value),n.set(t,r)),r}var $c=4,el=new WeakMap;function tl(e,t){if(!e)return null;let n=el.get(e)??new Map,r=n.get(t);if(r!==void 0)return r;function i(e){let n=(e.children??[]).map(i).sort();return sa(JSON.stringify([Kc(e.name??``),Qc(e,t),n]))}let a=i(e);return n.size>=$c&&n.delete(n.keys().next().value),n.set(t,a),el.set(e,n),a}function nl(e,t,n,r){let i=e.sqlExecutionId;if(i==null)return``;let a=t.sql.get(i)?.planTree??null;if(!a)return``;let o=(r??Yr(e,t.sql)).map(e=>JSON.stringify([Kc(e.name??``),Qc(e,n)]));return o.length===0?tl(a,n)??``:sa(JSON.stringify(o.sort()))}function rl(e,t,n,r){return Kc(e.name??``)+`§`+nl(e,t,n,r)}function il(e,t,n=()=>!0){let r=new Map;for(let[i,a]of e.stages){if(!n(i))continue;let e=t(a,i),o=r.get(e);o?o.push(i):r.set(e,[i])}return r}function al(e,t){let n=[],r=new Set;for(let i of[...e.keys()].sort()){let a=t.get(i);if(!a)continue;let o=e.get(i);if(o.length!==a.length)continue;let s=[...o].sort((e,t)=>e-t),c=[...a].sort((e,t)=>e-t);for(let e=0;e<s.length;e++)n.push({identity:i,baseId:s[e],candId:c[e]});r.add(i)}return{pairs:n,matchedIdentities:r}}var ol=1e6;function sl(e,t,n,r,i,a){if(e===0||t===0)return{pairs:[],bounded:!1};let o=e*t>ol,s=100+Math.ceil(Math.abs(e-t)/2),c=new Int32Array(e),l=new Int32Array(e);for(let n=0;n<e;n++){let r=Math.floor(n*t/e);c[n]=o?Math.max(0,r-s):0,l[n]=o?Math.min(t-1,r+s):t-1}let u=Array(e),d=(n,r)=>{for(;;){if(n>=e||r>=t)return 0;if(r<c[n])r=c[n];else if(r>l[n])n++;else return u[n][r-c[n]]}},f=n;for(let t=e-1;t>=0;t--){let e=new Int32Array(l[t]-c[t]+1);u[t]=e;for(let n=l[t];n>=c[t];n--){let i=Math.max(d(t+1,n),n+1<=l[t]?e[n+1-c[t]]:d(t+1,n+1)),a=f(t,n);a>=r&&(i=Math.max(i,a+d(t+1,n+1))),e[n-c[t]]=i}}let p=[],m=0,h=0;for(;m<e&&h<t;){if(h<c[m]){h=c[m];continue}if(h>l[m]){m++;continue}let e=u[m][h-c[m]],t=f(m,h);if(t>=r&&t+d(m+1,h+1)===e){p.push([m,h]),m++,h++;continue}let n=d(m+1,h)===e,o=d(m,h+1)===e;n&&o?i(m)>=a(h)?m++:h++:n?m++:h++}return{pairs:p,bounded:o}}var cl=/^(WholeStageCodegen|InputAdapter|ColumnarToRow|RowToColumnar)\b/,ll=e=>cl.test(e.name??``);function ul(e){let t=new Set;for(let n of e.matchAll(/([A-Za-z_][\w$.]*)#\d+L?/g))t.add(n[1]);return[...t].sort()}function dl(e){let t=new Set(e.filter(e=>!ll(e)));if(t.size===0)return null;let n=new Map,r=new Set,i=e=>{let n=[];for(let o of e.children??[])t.has(o)?(n.push(a(o)),r.add(o)):n.push(...i(o));return n},a=e=>{let t=n.get(e);return t===void 0&&(t=sa(JSON.stringify([Kc(e.name??``),pl(e),i(e).sort()])),n.set(e,t)),t};for(let e of t)a(e);let o=[...t].filter(e=>!r.has(e)).map(a).sort();return sa(JSON.stringify(o))}var fl=new WeakMap;function pl(e){let t=fl.get(e);return t===void 0&&(t=ul(e.detail??``),fl.set(e,t)),t}var ml=/[^A-Za-z0-9_.$]+/;function hl(e,t,n){let r=new Set,i=e=>{for(let t of e.split(ml))t&&r.add(t)};i(Kc(e??``));for(let e of t)ll(e)||(i(Kc(e.name??``)),i(Qc(e,n)));return[...r].sort()}function gl(e,t){if(e.length===0&&t.length===0)return 1;let n=0,r=0,i=0;for(;n<e.length&&r<t.length;)e[n]===t[r]?(i++,n++,r++):e[n]<t[r]?n++:r++;return i/(e.length+t.length-i)}var _l=[{name:`fileCounts`,apply:e=>e.replace(/FileIndex\(\d+ paths\)/g,`FileIndex(n paths)`)},{name:`dates`,apply:e=>e.replace(/\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?)?/g,`DATE`)},{name:`inLists`,apply:e=>e.replace(/\bIN \([^()]*\)/g,`IN (...)`).replace(/\bINSET [^()]*?(?=\))/g,`INSET ...`)},{name:`stagingDirs`,apply:e=>e.replace(/\/([A-Za-z0-9]{6,8})(?=\/)/g,(e,t)=>/[A-Z]/.test(t)&&/[a-z]/.test(t)||/[A-Za-z]/.test(t)&&/\d/.test(t)?`/TMP`:e)}],vl=`NORMALIZED`;function yl(e){if(!e||e.length===0)return[];if(e.length>16)throw Error(`At most 16 normalize patterns are accepted, got ${e.length}.`);return e.map(e=>{if(typeof e!=`string`||e.length===0)throw Error(`A normalize pattern must be a non-empty string.`);if(e.length>200)throw Error(`Normalize pattern "${e.slice(0,40)}..." is ${e.length} characters; the limit is 200.`);let t;try{t=new RegExp(e,`g`)}catch(t){throw Error(`Normalize pattern "${e}" is not a valid regular expression: ${t.message}`)}if(t.test(``))throw Error(`Normalize pattern "${e}" matches the empty string.`);return t.lastIndex=0,t})}function bl(e=[]){return t=>{let n=t;for(let t of e)n=n.replace(t,vl);n=Ca(n);for(let e of _l)n=e.apply(n);return n}}function xl(e,t,n,r){return rl(e,t,n,r)}function Sl(e){return/^(Scan|BatchScan)\b/.test(e.name??``)||/FileScan|JDBCRelation/.test(e.detail??``)}function Cl(e,t,n=Yr(e,t)){let r=0;for(let e of n){if(!Sl(e))continue;let t=e.name??``,n=e.detail??``;if(Ee(t,n)!==null||!je(t,n))return!1;r++}return r>0}var wl=[`executorRunTime`,`executorCpuTime`,`memoryBytesSpilled`,`diskBytesSpilled`,`inputBytes`,`outputBytes`,`shuffleReadBytes`,`shuffleWriteBytes`],Tl=.55,El=.5,Dl=1e6,Ol=25e4;function kl(e,t){let n=0,r=!1;for(let i of e){let e=i[t];typeof e==`number`&&Number.isFinite(e)&&(n+=e,r=!0)}return r?n:null}function Al(e){let t=ia([e]);return{executorRunTime:kl(t,`executorRunTime`),executorCpuTime:aa(t),memoryBytesSpilled:kl(t,`memoryBytesSpilled`),diskBytesSpilled:kl(t,`diskBytesSpilled`),inputBytes:kl(t,`inputBytes`),outputBytes:kl(t,`outputBytes`),shuffleReadBytes:kl(t,`shuffleReadBytes`),shuffleWriteBytes:kl(t,`shuffleWriteBytes`)}}function jl(e,t){let n={};for(let r of wl){let[i,a]=[e[r],t[r]];n[r]={baseline:i,candidate:a,delta:i!=null&&a!=null?a-i:null}}return n}function Ml(e){let t={};for(let n of wl){let r=0,i=!1;for(let t of e)t[n]!=null&&(r+=t[n],i=!0);t[n]=i?r:null}return t}var Nl=(e,t)=>e-t,Pl=/^(java|javax|jdk|sun|scala|py4j|org\.apache|io\.delta|io\.netty|com\.sun)\b/;function Fl(e){let t=[];for(let n of(e??``).split(`
5
+ `)){let e=n.trim().replace(/:\d+\)$/,`)`);e&&!Pl.test(e)&&t.push(e)}return t}var Il=(e,t)=>[...new Set(t(e).replace(/\S*\/([^/\s]+)/g,`$1`).split(/[^A-Za-z0-9_.$]+/).filter(Boolean))].sort();function Ll(e){let t=[],n=new Set;return(function e(r){if(!/^(WholeStageCodegen|InputAdapter|ColumnarToRow)\b/.test(r.name??``)){t.push(Kc(r.name??``));for(let e of pl(r))n.add(`@${e}`)}for(let t of r.children??[])e(t)})(e),[...t,...n].sort()}function Rl(e,t,n,r){let i=e=>{let t=new Int32Array(e.length);return e.forEach((e,n)=>{let i=r.get(e);i===void 0&&(i=r.size,r.set(e,i)),t[n]=i}),t.sort()},a=new Map,o=new Set,s=new Map,c=new Map,l=new Map;for(let[n,r]of e.stages){let i=Yr(r,e.sql);if(a.set(n,i),Cl(r,e.sql,i)){o.add(n);continue}s.set(n,xl(r,e,t,i)),c.set(n,dl(i));let u=r.sqlExecutionId??null,d=l.get(u);d?d.push(n):l.set(u,[n])}let u=(r,a)=>{a.sort(Nl);let o=r===null?null:e.sql.get(r)?.planTree??null,s=o?Ll(o):a.map(t=>c.get(t)??`n:${Kc(e.stages.get(t).name??``)}`).sort(),l=[...new Set(a.flatMap(t=>Fl(e.stages.get(t).details)))].sort(),u=r===null?[]:Il(e.sql.get(r)?.description??``,t),d=JSON.stringify([s,l,u]),f=n.get(d);return f===void 0&&(f=n.size,n.set(d,f)),{id:r,stageIds:a,structure:i(s),frames:i(l),description:i(u),signature:f}},d=[...l.keys()].filter(e=>e!==null).sort(Nl).map(e=>u(e,l.get(e))),f=l.get(null);return{snap:e,nodesOf:a,bookkeeping:o,exactKey:s,structuralKey:c,executions:d,pseudo:f?u(null,f):null}}var zl=4,Bl=2,Vl=1;function Hl(e,t){let n=zl*gl(e.structure,t.structure),r=zl;return e.frames.length>0&&t.frames.length>0&&(n+=Bl*gl(e.frames,t.frames),r+=Bl),e.description.length>0&&t.description.length>0&&(n+=Vl*gl(e.description,t.description),r+=Vl),Math.round(1e3*n/r)}function Ul(e,t,n,r,i,a){let o=n.id===null,s=new Set(n.stageIds),c=new Set(r.stageIds),l=[],u=(e,t,n,r)=>{l.push({baseId:e,candId:t,quality:n,score:r}),s.delete(e),c.delete(t)},d=(e,t,n)=>{let r=t.get(n);return r||(r=hl(e.snap.stages.get(n).name,e.nodesOf.get(n),a),t.set(n,r)),r},f=(n,r)=>gl(d(e,i.base,n),d(t,i.cand,r)),p=(e,t)=>{let n=new Map;for(let r of[...e].sort(Nl)){let e=t(r);if(e===null)continue;let i=n.get(e);i?i.push(r):n.set(e,[r])}return n},m=(e,t,n,r)=>{let i=p(s,e),a=p(c,t);for(let e of[...i.keys()].sort()){let t=a.get(e);if(!t)continue;let o=i.get(e);for(let e=0;e<Math.min(o.length,t.length);e++)u(o[e],t[e],n,r(o[e],t[e]))}},h=(e,t)=>Kc(a(e.snap.stages.get(t).details??``));m(t=>e.exactKey.get(t)+(o?`§${h(e,t)}`:``),e=>t.exactKey.get(e)+(o?`§${h(t,e)}`:``),`exact`,()=>1),m(t=>e.structuralKey.get(t)??null,e=>t.structuralKey.get(e)??null,`structural`,f);let g=(e,t)=>[...t].filter(t=>e.structuralKey.get(t)!=null).sort(Nl),_=g(e,s),v=g(t,c);if(_.length*v.length<=Ol){let e=[];for(let t of _)for(let n of v){let r=f(t,n);r>=.6&&e.push({baseId:t,candId:n,score:r})}e.sort((e,t)=>t.score-e.score||e.baseId+e.candId-(t.baseId+t.candId)||e.baseId-t.baseId);for(let{baseId:t,candId:n,score:r}of e)s.has(t)&&c.has(n)&&u(t,n,`aligned`,r)}let y=e=>t=>e.structuralKey.get(t)==null?Kc(e.snap.stages.get(t).name??``):null;return m(y(e),y(t),`aligned`,()=>El),{pairs:l,leftBase:[...s].sort(Nl),leftCand:[...c].sort(Nl)}}function Wl(e,t,n={}){let r=bl(n.normalizePath),i=new Map,a=new Map,o=Rl(e,r,i,a),s=Rl(t,r,i,a),c=e=>new Set(e.executions.map(e=>e.signature)).size,l=c(o)*c(s)<=Dl,u=new Map,d=(e,t)=>{if(e.signature===t.signature)return 1e3;if(!l)return Hl(e,t);let n=e.signature*i.size+t.signature,r=u.get(n);return r===void 0&&(r=Hl(e,t),u.set(n,r)),r},f=sl(o.executions.length,s.executions.length,(e,t)=>d(o.executions[e],s.executions[t]),Math.round(1e3*Tl),e=>o.executions[e].id,e=>s.executions[e].id),p=Math.min(o.executions.length,s.executions.length),m=p>0?f.pairs.length/p:null,h=m===null||m>=.5,g=[];if(h){for(let[e,t]of f.pairs)g.push([o.executions[e],s.executions[t]]);o.pseudo&&s.pseudo&&g.push([o.pseudo,s.pseudo])}let _=new Map,v=new Map,y=(e,t,n)=>{let r=e.get(n);return r||(r=Al(t.stages.get(n)),e.set(n,r)),r},b=(n,r)=>r.map(r=>n===`base`?y(_,e,r):y(v,t,r)),x={base:new Map,cand:new Map},S=[],C=[];for(let[n,i]of g){let a=Ul(o,s,n,i,x,r);for(let{baseId:n,candId:r,quality:i,score:o}of a.pairs)S.push({pairId:`b${n}-c${r}`,baseStageIds:[n],candStageIds:[r],quality:i,score:o,deltas:jl(y(_,e,n),y(v,t,r))});a.leftBase.length+a.leftCand.length>0&&n.id!==null&&i.id!==null&&n.stageIds.length!==i.stageIds.length&&C.push({baseExecutionId:n.id,candExecutionId:i.id,baseStageIds:a.leftBase,candStageIds:a.leftCand,deltas:jl(Ml(b(`base`,a.leftBase)),Ml(b(`cand`,a.leftCand)))})}S.sort((e,t)=>e.baseStageIds[0]-t.baseStageIds[0]||e.candStageIds[0]-t.candStageIds[0]),C.sort((e,t)=>e.baseExecutionId-t.baseExecutionId||e.candExecutionId-t.candExecutionId);let w=new Set(S.flatMap(e=>e.baseStageIds)),T=new Set(S.flatMap(e=>e.candStageIds)),E=new Set(C.flatMap(e=>e.baseStageIds)),D=new Set(C.flatMap(e=>e.candStageIds)),O=(e,t,n,r)=>[...e.stages.keys()].filter(e=>!t.has(e)&&!n.has(e)&&!r.has(e)).sort(Nl),k=0,A=0,ee=(e,t,n,r,i)=>{for(let a of t.stages.keys()){if(n.has(a))continue;let o=y(e,t,a).executorRunTime??0;k+=o,(r.has(a)||i.has(a))&&(A+=o)}};return ee(_,e,o.bookkeeping,w,E),ee(v,t,s.bookkeeping,T,D),{pairs:S,unmatched:{baseStageIds:O(e,o.bookkeeping,w,E),candStageIds:O(t,s.bookkeeping,T,D)},replanned:C,bookkeepingStageIds:{baseStageIds:[...o.bookkeeping].sort(Nl),candStageIds:[...s.bookkeeping].sort(Nl)},runtimeCoverage:k>0?A/k:null,executionAlignment:{baseExecutions:o.executions.length,candExecutions:s.executions.length,pairedExecutions:f.pairs.length,bounded:f.bounded,agreement:m,accepted:h}}}function Gl(e){return`rule`in e&&typeof e.rule==`string`?e.rule:e.type}function Kl(e){return e.impactBand??`unknown`}function ql(e,t){return e.stageId==null?`executionId`in e&&typeof e.executionId==`number`?`execution:${t.execution(e.executionId)}`:e.type===`configAudit`?`property:${e.property}`:`run`:`stage:${t.stage(e.stageId)}`}function Jl(e,t){return`${e.type}|${Gl(e)}|${ql(e,t)}`}function Yl(e,t){let n=new Map;for(let r of e){let e=Jl(r,t),i=n.get(e);i?i.push(r):n.set(e,[r])}return n}function Xl(e,t,n,r){let i=Yl(e,n),a=Yl(t,r),o={introduced:[],resolved:[],changed:[]};for(let e of new Set([...i.keys(),...a.keys()])){let t=[...i.get(e)??[]],n=[...a.get(e)??[]];for(let e=t.length-1;e>=0;e--){let r=n.findIndex(n=>Kl(n)===Kl(t[e]));r<0||(t.splice(e,1),n.splice(r,1))}let r=Math.min(t.length,n.length);for(let e=0;e<r;e++)o.changed.push({baseline:t[e],candidate:n[e]});o.resolved.push(...t.slice(r)),o.introduced.push(...n.slice(r))}return o}var Zl=new Set([`stageFailed`,`jobFailureRate`]);function Ql(e){let t=e.split(`
6
+ `)[0].trim();return t.length===0?null:t.length>240?`${t.slice(0,237).trimEnd()}...`:t}function $l(e){return typeof e==`string`?e:null}function eu(e,t){let n=[...e.values()].filter(e=>e.result!=null),r=n.filter(e=>e.succeeded===!1).sort((e,t)=>e.id-t.id),i=new Set(r.flatMap(e=>e.stageIds)),a=t.filter(e=>e.type===`stageFailed`).sort((e,t)=>Number(i.has(t.stageId))-Number(i.has(e.stageId)))[0],o=a?.valueText??r.map(e=>$l(e.exception)).find(e=>e!=null)??null;return{failedJobs:r.length,totalJobs:n.length,failedJobStageIds:i,reason:r.length>0&&o!=null?Ql(o):null,reasonStageId:a?.stageId??null}}function tu(e,t){return t.reason==null?!1:e.type===`stageFailed`?Ql(e.valueText)===t.reason:e.type===`jobFailureRate`&&t.failedJobs===1&&(t.reasonStageId==null||t.failedJobStageIds.has(t.reasonStageId))}var nu=`No stage in this log recorded an end, so the stage checks had nothing to measure.`,ru=`The log has no end-of-run record, so the core usage, memory and executor churn checks had no run length to measure.`;function iu(e){return[...e.values()].some(e=>e.submittedAt!=null&&e.completedAt!=null)}function au(e){return`dataUnavailable`in e&&e.dataUnavailable===!0||!Te(e)}var ou=new Set([`utilization`,`memoryUtilization`,`autoscalingChurn`]),su=new Set(Xa().filter(e=>e.scope===`stage`).map(e=>e.type));function cu(e){return e.some(e=>e.type===`incompleteRun`)}function lu(e,t){let n=new Set;t&&n.add(nu),cu(e)&&n.add(ru);for(let t of e)au(t)&&t.recommendation&&n.add(t.recommendation);return[...n]}function uu(e,t){return eu(e.jobs,t).failedJobs>0||t.some(Te)?!1:lu(t,!iu(e.stages)).length===0}function du(e,t){let n=!iu(e),r=cu(t),i=new Map;for(let e of t)au(e)&&(i.get(e.type)||i.set(e.type,e.recommendation??null));let a=e=>i.get(e)||(n&&su.has(e)?nu:r&&ou.has(e)?ru:i.has(e)?`The log lacked the data this check needs.`:null);return{isNotRun:e=>a(e)!=null,notRunReason:a}}var fu=/(?<![^\s"'(\[=,])(?:[A-Za-z][A-Za-z0-9+.-]*:\/\/[^\s/]*)?(?:\/[^\s/:"')\]]+)+/g;function pu(e){return e.replace(fu,e=>e.slice(e.lastIndexOf(`/`)+1))}function mu(e){return{id:e?.id??null,attemptId:typeof e?.attemptId==`string`?e.attemptId:null}}var hu=`secret|password|token|access[.]?key`,gu=`passwd|pwd|(?:^|[._-])pass(?:[._-]|$)|api[._-]?key|account[._-]?key|private[._-]?key|credential|(?:^|[._-])sas(?:[._-]|$)|(?:^|[._-])sig(?:nature)?(?:[._-]|$)`,_u=`[redacted]`;function vu(e){let t=/^\(\?([a-z]+)\)/.exec(e),n=new Set,r=e;if(t){r=e.slice(t[0].length);for(let e of t[1])if(e===`i`||e===`m`||e===`s`)n.add(e);else if(e!==`u`)return null}try{return new RegExp(r,[...n].join(``))}catch{return null}}var yu=RegExp(`((?:^|[\\s;&,?:"'(]|-D)(?:[\\w.-]*?(?:password|passwd|pwd|secret|token|api[_.-]?key|account[_.-]?key|access[_.-]?key|private[_.-]?key)|pass|sas|credential|sig|signature|x-amz-signature|x-amz-credential|x-amz-security-token|x-goog-signature|x-goog-credential)\\s*=\\s*)("[^"]*"|'[^']*'|[^;&,\\s"']*)`,`gi`);function bu(e){return(/^[a-z][a-z0-9+.-]*:/i.test(e)||e.includes(`://`)?e.replace(/(:\/\/)[^/\s@?#,]*@/g,`$1${_u}@`).replace(/^((?:[a-z][a-z0-9+.-]*:)+[^\s:/@]+\/)[^\s@]+@/i,`$1${_u}@`):e).replace(yu,`$1${_u}`)}function xu(e,t={}){let n=e?.config;if(n==null)return null;let r=new RegExp(hu,`i`),i=new RegExp(gu,`i`),a=n[`spark.redaction.regex`]??null,o=a==null?null:vu(a),s=a==null||o!=null,c=t.userPattern??null,l=c==null?null:vu(c);if(c!=null&&l==null)throw Error(`invalid secret pattern: ${c}`);let u=t.keys?new Set(t.keys):null,d={},f=[],p=(e,t,n)=>(e?.test(t)??!1)||(e?.test(n)??!1);for(let e of Object.keys(n).sort()){if(u&&!u.has(e))continue;let t=n[e];!s||p(r,e,t)||i.test(e)||p(o,e,t)||p(l,e,t)?f.push(e):d[e]=bu(t)}return{schemaVersion:1,values:d,maskedKeys:f,absentKeys:u?[...u].filter(e=>!(e in n)).sort():[]}}var Su=/^spark\.(app\.(id|startTime|submitTime)|driver\.(host|port)|yarn\.app\.id|ui\.port)$/;function Cu(e){if(!e||e.length===0)return[];if(e.length>16)throw Error(`At most 16 ignore patterns are accepted, got ${e.length}.`);return e.map(e=>{if(typeof e!=`string`||e.length===0)throw Error(`An ignore pattern must be a non-empty string.`);if(e.length>200)throw Error(`Ignore pattern "${e.slice(0,40)}..." is ${e.length} characters; the limit is 200.`);try{return new RegExp(e)}catch(t){throw Error(`Ignore pattern "${e}" is not a valid regular expression: ${t.message}`)}})}function wu(e,t,n,r){let i=xu(e.app,{userPattern:r}),a=xu(t.app,{userPattern:r});if(i==null||a==null)return{equal:null,differences:[],ignoredKeys:[],withheldKeys:[]};let o=new Set([...i.maskedKeys,...a.maskedKeys]),s=[...new Set([...Object.keys(i.values),...Object.keys(a.values)])].filter(e=>!o.has(e)).sort(),c=[],l=[];for(let e of s){let t=i.values[e]??null,r=a.values[e]??null;t!==r&&(Su.test(e)||n.some(t=>t.test(e))?l.push(e):c.push({key:e,baseline:t,candidate:r}))}return{equal:c.length===0,differences:c,ignoredKeys:l,withheldKeys:[...o].sort()}}function Tu(e){let t={baseline:e.unmatched.baseStageIds.length,candidate:e.unmatched.candStageIds.length};return{equal:t.baseline===0&&t.candidate===0&&e.replanned.length===0,unmatched:t,replanned:e.replanned.length}}function Eu(e,t){return e==null||t==null?null:e===0?t===0?0:null:(t-e)/Math.abs(e)}function Du(e,t){return{baseline:e,candidate:t,relativeDifference:Eu(e,t)}}function Ou(e,t,n){return e===0?t===0:Math.abs(t-e)/Math.abs(e)<n}function ku(e,t,n,r){let i=e=>n.find(t=>t.key===e),a=Du(i(`inputBytes`)?.baseline??null,i(`inputBytes`)?.candidate??null),o=Du(i(`outputBytes`)?.baseline??null,i(`outputBytes`)?.candidate??null),s=Du(oa(e),oa(t)),c=[];for(let e of[a,o])e.baseline!=null&&e.candidate!=null&&c.push(Ou(e.baseline,e.candidate,r));return s.baseline!=null&&s.candidate!=null&&c.push(s.baseline===s.candidate),{inputBytes:a,outputRows:s,outputBytes:o,equal:[s,o].some(e=>e.baseline!=null&&e.candidate!=null)?c.every(Boolean):null}}function Au(e,t){return e==null||t==null||e===0?null:t/e}function ju(e,t){return{baseline:e,candidate:t,ratio:Au(e,t)}}function Mu(e){let t=e.app?.startTime,n=e.app?.endTime??(e.executors?fr(e):null);return t!=null&&n!=null&&n>=t?[t,n]:null}function Nu(e,t,n,r,{ignoreConf:i,confRedactRegex:a,noiseBand:o}){let s=e=>ia([...e.stages.values()]),c=e=>e.executors?hr(e):null,l=c(e),u=c(t),d=e=>r.find(t=>t.key===e),f=(e,t)=>{let n=e.executors?_r(e):null;return t!=null&&n!=null?t/n:null},p=ju(d(`executorRunTime`)?.baseline??null,d(`executorRunTime`)?.candidate??null),m=ju(l?.executorsMean??null,u?.executorsMean??null),h=ju(f(e,p.baseline),f(t,p.candidate)),g=[p.ratio,m.ratio,h.ratio],_=g.every(e=>e!=null&&e>0)?g[0]/(g[1]*g[2]):null,v=Mu(e),y=Mu(t),b=v&&y?Math.max(0,Math.min(v[1],y[1])-Math.max(v[0],y[0])):null;return{noiseBand:o,conf:wu(e,t,Cu(i),a),plan:Tu(n),volume:ku(s(e),s(t),r,o),capacity:{baseline:{meanExecutors:l?.executorsMean??null,peakExecutors:l?.executorsPeak??null},candidate:{meanExecutors:u?.executorsMean??null,peakExecutors:u?.executorsPeak??null}},overlapMs:b,wallClockBridge:{wallClock:ju(d(`wallClock`)?.baseline??null,d(`wallClock`)?.candidate??null),taskTime:p,meanExecutors:m,taskShareOfAllocation:h,explainedWallClock:_}}}function Pu(e){let t=e=>S[e]??9;return t(e.candImpactBand)<t(e.baseImpactBand)}function Fu(e){let{failedJobs:t,totalJobs:n}=eu(e.jobs,e.catalog);return{failedJobs:t,totalJobs:n,incomplete:cu(e.catalog)}}function Iu(e,t){return rl(e,t,Ca)}function Lu(e){let t=new Map,n=n=>{let r=t.get(n);if(r===void 0){let i=e.stages.get(n);r=i?Iu(i,e):`#${n}`,t.set(n,r)}return r},r,i={stage:n,execution:t=>{if(!r){r=new Map;for(let[t,n]of e.stages){if(n.sqlExecutionId==null)continue;let e=r.get(n.sqlExecutionId);e?e.push(t):r.set(n.sqlExecutionId,[t])}}let i=r.get(t);return i?sa(JSON.stringify(i.map(n).sort())):`#${t}`}};return e=>Jl(e,i)}function Ru(e,t){let n=il(e,t=>Iu(t,e)),r=il(t,e=>Iu(e,t)),i=new Set;for(let e of[n,r])for(let[t,n]of e)n.length>1&&i.add(t);let{pairs:a,matchedIdentities:o}=al(n,r),s=e.stages.size+t.stages.size;return{pairs:a,matchedIdentities:o,collisionIdentities:i,coverage:s===0?1:2*a.length/s}}function zu(e){if(e.length===0)return null;let t=[...e].sort((e,t)=>e-t),n=Math.ceil(.95*t.length)-1;return t[Math.min(t.length-1,Math.max(0,n))]}function Bu(e,t){let n=0,r=!1;for(let i of e){let e=i[t];Number.isFinite(e)&&(n+=e,r=!0)}return{sum:n,present:r}}function Vu(e){let t=(e.completedAt??0)-(e.submittedAt??0);return t>0&&Number.isFinite(e.taskDurationMax)?e.taskDurationMax/t:null}function Hu(e){let t=[];for(let n of e){let e=Vu(n);e!=null&&t.push(e)}return t}var Uu=new Set([`inputBytes`,`outputBytes`,`taskCount`,`executorsAdded`]);function Wu(e,t,n){if(t==null||n==null)return`unavailable`;if(Uu.has(e))return n===t?`unchanged`:`neutral`;let r=n-t;return r<0?`improvement`:r>0?`regression`:`unchanged`}var Gu=.02;function Ku(e,t,n=Gu){let r=(e,t,r,i,a={})=>({key:e,label:t,baseline:r,candidate:i,delta:r==null||i==null?null:i-r,direction:Wu(e,r,i),withinNoise:r!=null&&i!=null&&Ou(r,i,n),...a}),i=[],a=e=>ia([...e.stages.values()]);i.push(r(`wallClock`,`Wall-clock duration`,Gc(e.app,e.stages).total,Gc(t.app,t.stages).total));let o=Bu(a(e),`memoryBytesSpilled`),s=Bu(a(t),`memoryBytesSpilled`);i.push(r(`shuffleSpill`,`Memory spill`,o.present?o.sum:null,s.present?s.sum:null,{unavailableReason:o.present&&s.present?void 0:`No memory-spill data recorded for a run`}));let c=zu(Hu([...e.stages.values()])),l=zu(Hu([...t.stages.values()]));i.push(r(`taskSkew`,`Task skew (p95)`,c,l,{unavailableReason:c!=null&&l!=null?void 0:`No stage had measurable duration for a run`}));let u=Bu(a(e),`taskCount`),d=Bu(a(t),`taskCount`),f=Bu(a(e),`failedTasks`),p=Bu(a(t),`failedTasks`),m=u.present&&u.sum>0&&f.present?f.sum/u.sum:null,h=d.present&&d.sum>0&&p.present?p.sum/d.sum:null;i.push(r(`failedTaskRate`,`Failed-task rate`,m,h,{unavailableReason:m!=null&&h!=null?void 0:`No task or failure counts recorded for a run`}));let g=(n,o,s,c)=>{let l=Bu(a(e),s),u=Bu(a(t),s);i.push(r(n,o,l.present?l.sum:null,u.present?u.sum:null,{unavailableReason:l.present&&u.present?void 0:c}))};g(`diskSpill`,`Disk spill`,`diskBytesSpilled`,`No disk-spill data recorded for a run`),g(`gcTime`,`GC time`,`jvmGCTime`,`No GC-time data recorded for a run`),g(`inputBytes`,`Input read`,`inputBytes`,`No input-bytes data recorded for a run`),g(`outputBytes`,`Output written`,`outputBytes`,`No output-bytes data recorded for a run`),g(`executorRunTime`,`Executor run-time`,`executorRunTime`,`No executor run-time recorded for a run`),g(`taskCount`,`Task count`,`taskCount`,`No task counts recorded for a run`);let _=e=>Array.isArray(e.executors?.added)?e.executors.added.length:null,v=_(e),y=_(t);i.push(r(`executorsAdded`,`Executors added`,v,y,{unavailableReason:v!=null&&y!=null?void 0:`No executor events recorded for a run`}));let b=e=>aa(a(e)),x=b(e),S=b(t);i.push(r(`executorCpuTime`,`Executor CPU time`,x,S,{unavailableReason:x!=null&&S!=null?void 0:`No executor CPU time recorded for a run`}));let C=e=>e.executors?hr(e).coreHours:null,w=C(e),T=C(t);return i.push(r(`allocatedCoreHours`,`Allocated core-hours`,w,T,{unavailableReason:w!=null&&T!=null?void 0:`No executor lifecycle or core count recorded for a run`})),i}function qu(e,t,n){let r=new Map,i=new Map,a=new Map;for(let o of n){r.set(o.baseStageIds[0],o.pairId),i.set(o.candStageIds[0],o.pairId);let n=e.stages.get(o.baseStageIds[0])?.sqlExecutionId,s=t.stages.get(o.candStageIds[0])?.sqlExecutionId;if(n==null||s==null)continue;let c=a.get(n)??new Map;c.set(s,(c.get(s)??0)+1),a.set(n,c)}let o=new Map;for(let[e,t]of a){let[n]=[...t].sort((e,t)=>t[1]-e[1]||e[0]-t[0])[0];o.set(e,n)}let s=new Set(o.values());return{base:{stage:e=>r.get(e)??`unpaired`,execution:e=>o.has(e)?`c${o.get(e)}`:`unpaired`},cand:{stage:e=>i.get(e)??`unpaired`,execution:e=>s.has(e)?`c${e}`:`unpaired`}}}function Ju(e,t,n=[]){let r=qu(e,t,n),i=Xl(e.catalog,t.catalog,r.base,r.cand),a=(e,t)=>{let n=new Set;for(let r of t){let t=r.stageId==null?void 0:e.stages.get(r.stageId)?.name;t&&n.add(t)}return[...n].sort()},o=e=>[...new Set(e.map(pu))].sort(),s=Lu(e),c=Lu(t),l=(e,t)=>[...new Set(e.map(t))].sort(),u=(e,t)=>{let n=new Map;for(let r of e){let e=t(r),i=n.get(e);i?i.push(r):n.set(e,[r])}return[...n].sort(([e],[t])=>e<t?-1:+(e>t))},d=(e,t,n)=>u(e,e=>`${Gl(e)}§${Kl(e)}`).map(([,e])=>{let r=e.length,i=a(t,e);return{rule:Gl(e[0]),type:e[0].type,impactBand:Kl(e[0]),baseCount:n===`base`?r:0,candCount:n===`cand`?r:0,delta:n===`cand`?r:-r,stages:i,stageLabels:o(i),keys:l(e,n===`cand`?c:s)}}),f=u(i.changed,e=>`${Gl(e.candidate)}§${Kl(e.baseline)}§${Kl(e.candidate)}`).map(([,e])=>{let n=a(t,e.map(e=>e.candidate));return{rule:Gl(e[0].candidate),type:e[0].candidate.type,baseImpactBand:Kl(e[0].baseline),candImpactBand:Kl(e[0].candidate),count:e.length,stages:n,stageLabels:o(n),keys:l(e.map(e=>e.candidate),c),baseKeys:l(e.map(e=>e.baseline),s)}});return{introduced:d(i.introduced,t,`cand`),resolved:d(i.resolved,e,`base`),changed:f}}function Yu(e,t){return e?.name!=null&&t?.name!=null&&e.name!==t.name}function Xu(e,t,n){return n.map(n=>{let r=n.baseStageIds[0],i=n.candStageIds[0],a=e.stages.get(r),o=Vu(a),s=Vu(t.stages.get(i));return{pairId:n.pairId,name:Kc(a.name??``),baseId:r,candId:i,baseline:o,candidate:s,delta:o!=null&&s!=null?s-o:null}}).sort((e,t)=>e.name<t.name?-1:e.name>t.name?1:e.baseId-t.baseId)}function Zu(e){let t=e=>Number.isFinite(e)?e:null,n=(e.completedAt??0)-(e.submittedAt??0);return{duration:n>0?n:null,memoryBytesSpilled:t(e.memoryBytesSpilled),diskBytesSpilled:t(e.diskBytesSpilled),jvmGCTime:t(e.jvmGCTime),inputBytes:t(e.inputBytes),outputBytes:t(e.outputBytes),executorRunTime:t(e.executorRunTime),taskCount:t(e.taskCount),failedTasks:t(e.failedTasks)}}function Qu(e){return[...e.stages].map(([e,t])=>({id:e,name:t.name??`Stage ${e}`,metrics:Zu(t)}))}var $u=.9;function ed(e,t,n={}){let r=e.snapshot,i=t.snapshot,a=n.noiseBand??.02;if(!Number.isFinite(a)||a<0||a>1)throw Error(`noiseBand must be a number from 0 to 1, got ${a}.`);let o=Ru(r,i),s=Wl(r,i,{normalizePath:yl(n.normalizePath)}),c=s.runtimeCoverage,l=Yu(r.app,i.app),u=c===null,d=c!==null&&c<$u,f=u?`insufficient`:l||d?`low`:`ok`,p=c===null?``:`${Math.floor(c*100)}%`,m=u?`${l?`Run names differ and no`:`No`} executor run time was recorded in either run, so there is no work to compare.`:l&&d?`Run names differ and only ${p} of executor run time is in matched stages, so deltas may compare different work.`:l?`Run names differ, so deltas may compare different work.`:d?`Only ${p} of executor run time is in matched stages, so per-stage rows mostly compare unrelated work.`:null,h=Ku(r,i,a);return{baselineLabel:e.label,candidateLabel:t.label,baselineApp:mu(r.app),candidateApp:mu(i.app),confidence:f,reason:m,matchedCoverage:o.coverage,comparisonSchemaVersion:1,runtimeCoverage:c,stagePairs:s.pairs.map(e=>({...e,stageLabel:pu(r.stages.get(e.baseStageIds[0])?.name??``)})),unmatched:s.unmatched,replanned:s.replanned,bookkeepingStageIds:s.bookkeepingStageIds,executionAlignment:s.executionAlignment,metrics:h,findings:Ju(r,i,s.pairs),stageSkew:Xu(r,i,s.pairs),baseStages:Qu(r),candStages:Qu(i),jobOutcomes:{baseline:Fu(r),candidate:Fu(i)},comparability:Nu(r,i,s,h,{ignoreConf:n.ignoreConf,confRedactRegex:n.confRedactRegex,noiseBand:a})}}function td({entries:e,activeId:t=null,onPick:n,onRemove:r}){return e.length?(0,B.jsx)(`ul`,{className:`flex flex-col gap-0.5`,children:e.map(e=>{let i=e.appName||e.name,a=e.issueCount==null?``:` · ${e.issueCount} issue${e.issueCount===1?``:`s`}`;return(0,B.jsxs)(`li`,{className:N(`flex items-center gap-1 rounded-md`,e.id===t&&`bg-accent-soft`),children:[(0,B.jsxs)(`button`,{type:`button`,className:`tap-target-comfortable flex min-w-0 flex-1 cursor-pointer flex-col items-start gap-0.5 rounded-md px-1.5 py-1 text-left hover:bg-muted`,onClick:()=>n?.(e.id),children:[(0,B.jsx)(`span`,{className:`w-full truncate text-sm font-medium`,children:i}),(0,B.jsxs)(`span`,{className:`recent-entry-meta w-full truncate text-muted-foreground`,children:[e.name,` · `,p(e.size),a]})]}),(0,B.jsx)(R,{type:`button`,variant:`ghost`,size:`icon`,className:`tap-target-comfortable`,"aria-label":`Remove from recent files`,onClick:()=>r?.(e.id),children:(0,B.jsx)(Rn,{"aria-hidden":`true`})})]},e.id)})}):(0,B.jsx)(`p`,{className:`px-1.5 py-1 text-sm text-muted-foreground`,children:`No recent files yet`})}var nd=`sample-run`;function rd(e,t){let n=e=>e.match(/(\d+)|(\D+)/g)??[e],r=n(e),i=n(t),a=Math.max(r.length,i.length);for(let e=0;e<a;e++){let t=r[e]??``,n=i[e]??``;if(t===n)continue;let a=Number(t),o=Number(n);return!Number.isNaN(a)&&!Number.isNaN(o)?a-o:t<n?-1:1}return 0}function id(e){let t=e.filter(e=>!e.toLowerCase().startsWith(`appstatus`)).filter(e=>/^events_\d+_/.test(e)),n=e=>parseInt(e.match(/^events_(\d+)_/)[1],10),r=t.filter(e=>e.endsWith(`.compact`)).map(n),i=r.length>0?Math.max(...r):-1,a=t.filter(e=>{let t=n(e);return e.endsWith(`.compact`)?t===i:t>i}).sort(rd),o=a.map(n);for(let e=1;e<o.length;e++)if(o[e]!==o[e-1]+1)throw Error(`Rolling event-log directory is missing file(s) between index ${o[e-1]} and ${o[e]}.`);return a}var ad={baseUrl:`shuffle-works-shs-base-url`,appId:`shuffle-works-shs-app-id`,attemptId:`shuffle-works-shs-attempt-id`};function od(e){if(typeof window>`u`)return``;try{return window.localStorage.getItem(ad[e])??``}catch{return``}}var sd=`sample-runs/sample-run.ndjson.gz`,cd=`docs/user-guide/getting-started.html#local-server-mode`,ld={"local-server-unavailable":`The local server is unavailable. Start local-server mode, then try again.`,"upstream-unreachable":`The History Server could not be reached. Check the address and try again.`,"application-not-found":`The requested application was not found. Check the application and attempt IDs.`,"access-or-upstream-failure":`The History Server could not provide this event log. Check access and try again.`,"invalid-event-log":`The response did not contain a supported event log. Choose a local file or try another application.`};async function ud(e){let t=e.createReader(),n=[];for(;;){let e=await new Promise((e,n)=>t.readEntries(e,n));if(e.length===0)break;n.push(...e)}let r=n.filter(e=>e.isFile);return Promise.all(r.map(e=>new Promise((t,n)=>e.file(t,n))))}function dd({onPick:e,compact:t=!1}={}){let{startLoad:n,startLoadFolder:r,startLoadFromUrl:i,pickRecent:a}=Uc(),o=F(e=>e.shsParsing),s=(0,z.useRef)(null),c=(0,z.useRef)(null),[l,u]=(0,z.useState)(!1),[d,f]=(0,z.useState)([]),[p,m]=(0,z.useState)(()=>od(`baseUrl`)),[h,g]=(0,z.useState)(()=>od(`appId`)),[_,v]=(0,z.useState)(()=>od(`attemptId`)),[y,b]=(0,z.useState)(!1),[x,S]=(0,z.useState)(!1),[C,w]=(0,z.useState)(!1),[T,E]=(0,z.useState)(!1),[D,O]=(0,z.useState)({baseUrl:!1,appId:!1,attemptId:!1}),[k,A]=(0,z.useState)(null),ee=(0,z.useRef)(null),[te,ne]=(0,z.useState)(!1),re=Rc({baseUrl:p,appId:h,attemptId:_}),ie=C||o,ae=y||o;(0,z.useEffect)(()=>{k&&ee.current?.focus()},[k]),(0,z.useEffect)(()=>{if(t)return;let e=new AbortController,n=setTimeout(()=>e.abort(),800);return fetch(`/shs-proxy`,{signal:e.signal}).then(e=>{e.status===400&&E(!0)}).catch(()=>{}).finally(()=>clearTimeout(n)),()=>{clearTimeout(n),e.abort()}},[t]);let oe=(0,z.useCallback)(()=>{Ec().then(e=>f(e)).catch(()=>f([]))},[]);(0,z.useEffect)(()=>{oe()},[oe]);let se=(0,z.useCallback)(async()=>{ne(!0);try{let t=await fetch(sd);if(!t.ok)throw Error(`HTTP ${t.status}`);let r=await t.blob(),i=new File([r],`sample-run.ndjson.gz`,{type:`application/gzip`});e?e({kind:`file`,id:xc(i.name,i.size,i.lastModified),label:i.name,file:i}):n(i,{id:nd})}catch{j.getState().setError(`Could not load the sample run. Check your connection and try again, or choose a file below.`)}finally{ne(!1)}},[n,e]),ce=(0,z.useCallback)(async()=>{if(yc()){let t;try{[t]=await window.showOpenFilePicker()}catch{return}try{let r=await t.getFile();e?e({kind:`file`,id:xc(r.name,r.size,r.lastModified),label:r.name,file:r,handle:t}):n(r,{handle:t})}catch{j.getState().setError(`Could not read the selected file.`)}return}s.current?.click()},[n,e]),le=(0,z.useCallback)(t=>{let n=t.map(e=>e.name);if(!n.some(e=>/^events_\d+_/.test(e))){j.getState().setError(`This isn't a Spark rolling event-log directory. Choose file to load a single event log.`);return}let i;try{i=id(n)}catch(e){j.getState().setError(e.message);return}let a=new Map(t.map(e=>[e.name,e])),o=i.map(e=>a.get(e));if(e){let t=o[0];e({kind:`folder`,id:`folder:${t?.name??i[0]}`,label:`${o.length}-file rolling log`,files:o});return}r(o)},[r,e]),M=(0,z.useCallback)(t=>{let r=t.target.files?.[0];r&&(e?e({kind:`file`,id:xc(r.name,r.size,r.lastModified),label:r.name,file:r}):n(r)),t.target.value=``},[n,e]),ue=(0,z.useCallback)(e=>{let t=Array.from(e.target.files??[]);t.length&&le(t),e.target.value=``},[le]),de=(0,z.useCallback)(async t=>{let r=t.dataTransfer.files[0],i=t.dataTransfer.items?.[0],a=i?.webkitGetAsEntry?.();if(a&&a.isDirectory){try{let e=await ud(a);le(e)}catch{j.getState().setError(`Could not read the dropped folder.`)}return}if(yc()&&i?.getAsFileSystemHandle)try{let t=await i.getAsFileSystemHandle();if(t&&t.kind===`file`){let r=await t.getFile();e?e({kind:`file`,id:xc(r.name,r.size,r.lastModified),label:r.name,file:r,handle:t}):n(r,{handle:t});return}}catch{j.getState().setError(`Could not read the selected file.`);return}r&&(e?e({kind:`file`,id:xc(r.name,r.size,r.lastModified),label:r.name,file:r}):n(r))},[n,le,e]),fe=(0,z.useCallback)(e=>{e.preventDefault(),u(!1),de(e)},[de]),pe=(0,z.useCallback)(async t=>{let n=d.find(e=>e.id===t);if(e){e({kind:`recent`,id:t,label:n?.appName||n?.name||t,handle:n?.handle});return}let r=await a(t,n?.handle);(r===`restored`||r===`gone`)&&oe()},[d,a,oe,e]),me=(0,z.useCallback)(e=>{let t=d.find(t=>t.id===e);Oc(e).catch(()=>{}).finally(oe),t&&Ht(`Removed "${t.appName||t.name}" from recent files`,{action:{label:`Undo`,onClick:()=>{Tc(t).catch(()=>{}).finally(oe)}}})},[d,oe]),P=(0,z.useCallback)((e,t)=>{if(e===`baseUrl`&&m(t),e===`appId`&&g(t),e===`attemptId`&&v(t),A(null),typeof window<`u`)try{window.localStorage.setItem(ad[e],t)}catch{}},[]),ve=(0,z.useCallback)(e=>{O(t=>({...t,[e]:!0}))},[]),ye=(0,z.useCallback)(t=>{t.preventDefault(),O({baseUrl:!0,appId:!0,attemptId:!0}),A(null);let n=re.request;if(zc(re)&&n){if(e){let t=n.attemptId?`${n.appId}/${n.attemptId}`:n.appId;e({kind:`url`,id:t,label:t,request:n});return}i(n,e=>{A({code:e.code,message:e.message})})}},[re,i,e]),I=e=>D[e]?re.errors[e]:null,be=(0,B.jsxs)(`section`,{className:`landing-history-server w-full text-left`,children:[(0,B.jsxs)(`button`,{type:`button`,className:`drop-zone-disclosure tap-target-comfortable flex w-full cursor-pointer items-center justify-between px-3 py-2 text-left text-sm font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,"aria-expanded":ie,"aria-controls":`shs-fetch-panel`,onClick:()=>w(e=>!e),children:[`Fetch from Spark History Server`,ie?(0,B.jsx)(he,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`}):(0,B.jsx)(_e,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`})]}),ie?(0,B.jsxs)(`div`,{id:`shs-fetch-panel`,className:`drop-zone-subpanel mt-3 p-4`,children:[(0,B.jsx)(`p`,{className:`mb-3 text-sm text-muted-foreground`,children:`Requires local-server mode and a History Server reachable from this machine.`}),(0,B.jsxs)(`form`,{onSubmit:ye,className:`flex flex-col gap-3`,children:[(0,B.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-3`,children:[(0,B.jsxs)(`label`,{className:`flex flex-col gap-1 text-xs text-muted-foreground`,children:[`Base URL`,(0,B.jsx)(`input`,{type:`text`,value:p,onChange:e=>P(`baseUrl`,e.target.value),onBlur:()=>ve(`baseUrl`),placeholder:`http://history-server:18080`,"aria-label":`Spark History Server base URL`,"aria-invalid":!!I(`baseUrl`),"aria-describedby":I(`baseUrl`)?`shs-base-url-error`:void 0,className:`tap-target-input rounded-md border border-input bg-card px-2 py-1 font-mono text-sm text-foreground`}),I(`baseUrl`)?(0,B.jsx)(`span`,{id:`shs-base-url-error`,className:`text-destructive`,children:I(`baseUrl`)}):null]}),(0,B.jsxs)(`label`,{className:`flex flex-col gap-1 text-xs text-muted-foreground`,children:[`Application ID`,(0,B.jsx)(`input`,{type:`text`,value:h,onChange:e=>P(`appId`,e.target.value),onBlur:()=>ve(`appId`),placeholder:`application_1234567890_0001`,"aria-label":`Application ID`,"aria-invalid":!!I(`appId`),"aria-describedby":I(`appId`)?`shs-app-id-error`:void 0,className:`tap-target-input rounded-md border border-input bg-card px-2 py-1 font-mono text-sm text-foreground`}),I(`appId`)?(0,B.jsx)(`span`,{id:`shs-app-id-error`,className:`text-destructive`,children:I(`appId`)}):null]}),(0,B.jsxs)(`label`,{className:`flex flex-col gap-1 text-xs text-muted-foreground`,children:[`Attempt ID (optional)`,(0,B.jsx)(`input`,{type:`text`,value:_,onChange:e=>P(`attemptId`,e.target.value),onBlur:()=>ve(`attemptId`),placeholder:`2`,"aria-label":`Attempt ID (optional)`,"aria-invalid":!!I(`attemptId`),"aria-describedby":I(`attemptId`)?`shs-attempt-id-error`:void 0,className:`tap-target-input rounded-md border border-input bg-card px-2 py-1 font-mono text-sm text-foreground`}),I(`attemptId`)?(0,B.jsx)(`span`,{id:`shs-attempt-id-error`,className:`text-destructive`,children:I(`attemptId`)}):null]})]}),o?(0,B.jsx)(`p`,{role:`status`,"aria-live":`polite`,className:`text-sm text-muted-foreground`,children:`Fetching event log…`}):null,k?(0,B.jsxs)(`p`,{ref:ee,role:`alert`,tabIndex:-1,className:`text-sm text-destructive`,children:[ld[k.code],` `,`Edit the fields, review `,(0,B.jsx)(`a`,{href:cd,target:`_blank`,rel:`noopener noreferrer`,className:`tap-target-comfortable text-primary underline-offset-4 hover:underline`,children:`Local-server setup`}),`, or choose a local file.`,k.message?(0,B.jsx)(`span`,{"data-testid":`shs-error-detail`,className:`mt-1 block`,children:k.message}):null]}):null,(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,B.jsx)(R,{type:`submit`,className:`tap-target-comfortable`,disabled:!zc(re)||o,children:`Fetch`}),(0,B.jsx)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:`Application IDs: application_…, local-…, app-…, spark-…, or driver-…`})]})]})]}):null]});return(0,B.jsxs)(`div`,{"data-testid":`drop-zone`,role:`region`,"aria-label":`Drop Spark event log file here`,className:N(`drop-zone-panel mx-auto flex w-full flex-col items-center justify-center gap-6 p-6 text-center`,t?`max-w-full`:`landing-drop-zone max-w-none p-6 sm:p-8`,l&&`is-drag-over`),onDragOver:e=>{e.preventDefault(),u(!0)},onDragLeave:()=>u(!1),onDrop:fe,children:[(0,B.jsx)(`span`,{className:`drop-zone-icon`,"aria-hidden":`true`,children:(0,B.jsx)(Pn,{className:`size-5`})}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`p`,{className:`drop-zone-title font-heading`,children:`Choose a Spark event log`}),(0,B.jsx)(`p`,{className:`mt-1 text-sm text-muted-foreground`,children:`Drop an event log file here, or choose a file below.`}),(0,B.jsx)(`p`,{className:`drop-zone-formats mx-auto mt-2 max-w-xl text-muted-foreground`,children:`Accepts a Spark event log file: newline-delimited JSON, one event per line, optionally gzip/Zstandard/LZ4/Snappy-compressed, or the .zip a Spark History Server download returns.`})]}),(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center justify-center gap-2`,children:[(0,B.jsx)(R,{type:`button`,className:`tap-target-comfortable max-sm:h-11`,onClick:()=>void ce(),children:`Choose file`}),t?null:(0,B.jsx)(R,{type:`button`,variant:`outline`,className:`tap-target-comfortable max-sm:h-11`,onClick:()=>void se(),disabled:te,children:te?`Loading sample…`:`Try a sample run`})]}),t?null:(0,B.jsxs)(`section`,{className:`w-full max-w-2xl text-left`,children:[(0,B.jsxs)(`button`,{type:`button`,className:`tap-target-comfortable mx-auto flex min-h-8 w-full cursor-pointer items-center justify-center gap-1 rounded-sm text-sm font-medium max-sm:min-h-11 text-primary underline-offset-4 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,"aria-expanded":x,"aria-controls":`find-event-log-panel`,onClick:()=>S(e=>!e),children:[`Where do I find my event log?`,x?(0,B.jsx)(he,{"aria-hidden":`true`,className:`size-4 shrink-0`}):(0,B.jsx)(_e,{"aria-hidden":`true`,className:`size-4 shrink-0`})]}),x?(0,B.jsxs)(`div`,{id:`find-event-log-panel`,className:`drop-zone-subpanel mt-3 p-4 text-sm`,children:[(0,B.jsxs)(`ol`,{className:`list-decimal space-y-2 pl-5 text-muted-foreground`,children:[(0,B.jsxs)(`li`,{children:[(0,B.jsx)(`span`,{className:`font-medium text-foreground`,children:`Turn event logging on.`}),` Spark writes one log per application when `,(0,B.jsx)(`code`,{children:`spark.eventLog.enabled`}),` is `,(0,B.jsx)(`code`,{children:`true`}),`, into the directory set by`,` `,(0,B.jsx)(`code`,{children:`spark.eventLog.dir`}),` (for example `,(0,B.jsx)(`code`,{children:`/tmp/spark-events`}),`, or an HDFS or object-store path). Copy the file for your application from there.`]}),(0,B.jsxs)(`li`,{children:[(0,B.jsx)(`span`,{className:`font-medium text-foreground`,children:`Or download it from a Spark History Server.`}),` Open`,` `,(0,B.jsx)(`code`,{children:`<history-server>/api/v1/applications/<app-id>/logs`}),` and drop the .zip it returns here as-is.`]}),(0,B.jsxs)(`li`,{children:[(0,B.jsx)(`span`,{className:`font-medium text-foreground`,children:`Just exploring?`}),` `,(0,B.jsx)(`button`,{type:`button`,className:`cursor-pointer rounded-sm text-primary underline-offset-4 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,onClick:()=>void se(),disabled:te,children:`Load the sample run`}),` `,`to see what the report looks like first.`]})]}),(0,B.jsx)(`a`,{href:ge,target:`_blank`,rel:`noopener noreferrer`,className:`mt-3 inline-block text-primary underline-offset-4 hover:underline`,children:`More ways to get a log`})]}):null]}),(0,B.jsx)(`input`,{ref:s,type:`file`,className:`hidden`,"data-testid":`file-input`,"aria-label":`Choose file`,onChange:M}),(0,B.jsx)(`input`,{ref:c,type:`file`,className:`hidden`,"data-testid":`folder-input`,"aria-label":`Choose rolling log folder`,onChange:ue,webkitdirectory:`true`,directory:`true`}),t?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(R,{type:`button`,variant:`outline`,className:`tap-target-comfortable`,onClick:()=>c.current?.click(),children:`Choose rolling-log folder`}),(0,B.jsx)(`div`,{className:`w-full max-w-2xl`,children:be})]}):(0,B.jsxs)(B.Fragment,{children:[T?(0,B.jsxs)(`div`,{className:`drop-zone-subpanel flex w-full max-w-2xl items-start gap-2 p-4 text-left`,children:[(0,B.jsx)(En,{"aria-hidden":`true`,className:`mt-0.5 size-4 shrink-0 text-muted-foreground`}),(0,B.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`If a Spark History Server is reachable, open`,` `,(0,B.jsx)(`strong`,{className:`font-medium text-foreground`,children:`Other sources`}),` below to fetch a run from it directly.`]})]}):null,(0,B.jsxs)(`section`,{className:`landing-other-sources w-full max-w-2xl text-left`,children:[(0,B.jsxs)(`button`,{type:`button`,className:`drop-zone-disclosure tap-target-comfortable flex w-full cursor-pointer items-center justify-between px-3 py-2 text-left text-sm font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,"aria-expanded":ae,"aria-controls":`other-sources-panel`,onClick:()=>b(e=>!e),children:[`Other sources`,ae?(0,B.jsx)(he,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`}):(0,B.jsx)(_e,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`})]}),ae?(0,B.jsxs)(`div`,{id:`other-sources-panel`,className:`drop-zone-subpanel mt-3 flex flex-col gap-3 p-4`,children:[(0,B.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Use these for a rolling `,(0,B.jsx)(`code`,{children:`eventlog_v2_*`}),` directory or to fetch an application from a local Spark History Server.`]}),(0,B.jsx)(`div`,{children:(0,B.jsx)(R,{type:`button`,variant:`outline`,className:`tap-target-comfortable`,onClick:()=>c.current?.click(),children:`Choose rolling-log folder`})}),be]}):null]})]}),d.length>0&&(0,B.jsxs)(`div`,{className:`drop-zone-recent w-full max-w-md text-left`,children:[(0,B.jsx)(`p`,{className:`trace-eyebrow mb-1 px-1.5`,children:`Recent files`}),(0,B.jsx)(td,{entries:d,onPick:e=>void pe(e),onRemove:me})]})]})}var fd=`npx sparkforensics-mcp`,pd=`{
7
+ "mcpServers": {
8
+ "sparkforensics": {
9
+ "command": "npx",
10
+ "args": ["sparkforensics-mcp"]
11
+ }
12
+ }
13
+ }`;function md(){return(0,B.jsxs)(l,{className:`w-full`,children:[(0,B.jsx)(de,{className:N(Ne({variant:`outline`}),`tap-target-comfortable`),children:`Use with an AI assistant (MCP)`}),(0,B.jsxs)(x,{className:`mt-2 flex w-full flex-col gap-2 text-sm`,children:[(0,B.jsx)(`p`,{className:`text-muted-foreground`,children:`This project exposes an MCP server so an AI assistant can diagnose a run directly, without going through this web UI.`}),(0,B.jsx)(`pre`,{"data-testid":`mcp-config-snippet`,className:`mcp-snippet overflow-x-auto p-2 text-xs whitespace-pre`,children:fd}),(0,B.jsx)(`p`,{className:`text-muted-foreground`,children:`Or, in an MCP client config:`}),(0,B.jsx)(`pre`,{className:`mcp-snippet overflow-x-auto p-2 text-xs whitespace-pre`,children:pd})]})]})}var hd=`[data-shuffle-product-bar]`;function gd(){return document.querySelector(hd)}function _d({className:e,children:t}){let n=gd();return n?(0,Et.createPortal)((0,B.jsx)(`div`,{"data-shuffle-page-controls":!0,children:t}),n):(0,B.jsx)(`div`,{className:e,"data-shuffle-page-controls":!0,children:t})}function vd({message:e,nonce:t}){let n=(0,z.useRef)(null);return(0,z.useEffect)(()=>{n.current?.focus()},[e,t]),(0,B.jsxs)(`div`,{ref:n,role:`alert`,tabIndex:-1,className:`mb-4 flex items-start gap-3 rounded-xl border border-l-[3px] border-border border-l-critical bg-card p-4 text-sm text-foreground`,children:[(0,B.jsx)(Mn,{"aria-hidden":`true`,className:`mt-0.5 size-4 shrink-0 text-critical`}),(0,B.jsx)(`p`,{children:e})]})}var yd=`docs/`;function bd({label:e,onChange:t}){return(0,B.jsxs)(`div`,{className:`trace-panel flex items-center justify-between gap-3 p-4`,children:[(0,B.jsxs)(`span`,{className:`min-w-0 truncate font-mono text-sm`,children:[(0,B.jsx)(`span`,{"aria-hidden":`true`,className:`mr-2 text-accent`,children:`✓`}),e]}),(0,B.jsx)(R,{type:`button`,variant:`ghost`,size:`sm`,className:`tap-target-comfortable`,onClick:t,children:`Change`})]})}function xd({testId:e,ariaLabel:t,source:n,onPick:r,onChange:i}){return(0,B.jsx)(`div`,{"data-testid":e,"aria-label":t,className:`min-w-0 flex-1`,children:n?(0,B.jsx)(bd,{label:n.label,onChange:i}):(0,B.jsx)(dd,{onPick:r,compact:!0})})}function Sd({onClick:e}){return(0,B.jsxs)(R,{type:`button`,variant:`outline`,className:`tap-target-comfortable`,onClick:e,children:[`Compare two runs `,(0,B.jsx)(cn,{"aria-hidden":`true`})]})}function Cd(){return(0,B.jsxs)(`div`,{className:`landing-resources`,"aria-label":`SparkForensics resources`,children:[(0,B.jsxs)(`a`,{href:yd,target:`_blank`,rel:`noopener noreferrer`,className:`landing-resource-card`,children:[(0,B.jsx)(ye,{"aria-hidden":`true`}),(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`strong`,{children:`Read the docs`}),(0,B.jsx)(`span`,{children:`How to load a log, read the board, and use every finding.`})]}),(0,B.jsx)(cn,{"aria-hidden":`true`,className:`landing-resource-arrow`})]}),(0,B.jsxs)(`a`,{href:`${P}/intro.html`,target:`_blank`,rel:`noopener noreferrer`,className:`landing-resource-card`,children:[(0,B.jsx)(un,{"aria-hidden":`true`}),(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`strong`,{children:`Spark optimization reference`}),(0,B.jsx)(`span`,{children:`Architecture, memory, shuffle, and tuning notes behind every finding.`})]}),(0,B.jsx)(cn,{"aria-hidden":`true`,className:`landing-resource-arrow`})]})]})}function wd({onCompare:e}){return(0,B.jsxs)(`section`,{className:`landing-next-steps`,"aria-labelledby":`next-steps-title`,children:[(0,B.jsx)(`div`,{children:(0,B.jsx)(`h2`,{id:`next-steps-title`,children:`After your first run, go further with the same evidence.`})}),(0,B.jsxs)(`div`,{className:`landing-next-step-list`,children:[(0,B.jsxs)(`article`,{children:[(0,B.jsx)(gn,{"aria-hidden":`true`}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`h3`,{children:`Compare two runs`}),(0,B.jsx)(`p`,{children:`Use a baseline and candidate log to see which structurally matched stages changed.`}),(0,B.jsx)(Sd,{onClick:e})]})]}),(0,B.jsxs)(`article`,{children:[(0,B.jsx)(fn,{"aria-hidden":`true`}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`h3`,{children:`Use with an AI assistant`}),(0,B.jsx)(`p`,{children:`Connect MCP when you want an agent to inspect this evidence with you.`}),(0,B.jsx)(md,{})]})]}),(0,B.jsxs)(`article`,{children:[(0,B.jsx)(In,{"aria-hidden":`true`}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`h3`,{children:`Automate it in Airflow`}),(0,B.jsx)(`p`,{children:`Run this analysis after every Spark job with sparkforensics-operator instead of checking runs by hand.`}),(0,B.jsxs)(R,{variant:`outline`,className:`tap-target-comfortable`,nativeButton:!1,render:(0,B.jsx)(`a`,{href:`https://github.com/shuffle-works/sparkforensics-operator`,target:`_blank`,rel:`noopener noreferrer`}),children:[`View sparkforensics-operator `,(0,B.jsx)(cn,{"aria-hidden":`true`})]})]})]})]})]})}function Td({errorMessage:e,errorNonce:t}={}){let{startCompareLoad:n,drillIntoRun:r}=Uc(),{theme:i,toggle:a}=Tt(),[o]=(0,z.useState)(()=>j.getState().compareSeed),[s,c]=(0,z.useState)(o!=null),[l,u]=(0,z.useState)(o?{kind:`cached`,...o}:null),[d,f]=(0,z.useState)(null),p=o!=null&&l?.kind===`cached`&&l.id===o.id;return s?(0,B.jsxs)(`div`,{className:`mx-auto flex w-full max-w-5xl flex-col gap-4`,children:[(0,B.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,B.jsx)(`h2`,{className:`compare-landing-title font-heading`,children:`Compare two runs`}),(0,B.jsx)(R,{type:`button`,variant:`ghost`,size:`sm`,className:`tap-target-comfortable`,onClick:()=>{if(p){j.getState().setCompareSeed(null),r(o.id);return}c(!1),u(null),f(null)},children:p?`Back to the run`:`Cancel`})]}),(0,B.jsx)(`p`,{className:`landing-compare-intro`,children:p?`The baseline is the run you had open. Pick the candidate to compare it with, for example the same job after a change.`:`Load a baseline run and a candidate run. Compare structurally matched stages to review material changes in a shared stage-level context.`}),e?(0,B.jsx)(vd,{message:e,nonce:t}):null,(0,B.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-2`,children:[(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`p`,{className:`trace-eyebrow mb-2`,children:`Baseline`}),(0,B.jsx)(xd,{testId:`compare-slot-a`,ariaLabel:`Baseline`,source:l,onPick:u,onChange:()=>{j.getState().setCompareSeed(null),u(null)}})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`p`,{className:`trace-eyebrow mb-2`,children:`Candidate`}),(0,B.jsx)(xd,{testId:`compare-slot-b`,ariaLabel:`Candidate`,source:d,onPick:f,onChange:()=>f(null)})]})]}),(0,B.jsx)(`div`,{className:`flex justify-end`,children:(0,B.jsx)(R,{type:`button`,className:`tap-target-comfortable`,disabled:!l||!d,onClick:()=>{l&&d&&n(l,d)},children:`Compare`})})]}):(0,B.jsxs)(`div`,{className:`landing-shell mx-auto w-full max-w-6xl`,children:[(0,B.jsxs)(`section`,{className:`landing-hero`,"aria-labelledby":`landing-title`,children:[(0,B.jsxs)(_d,{className:`landing-identity`,children:[(0,B.jsx)(on,{"aria-hidden":`true`,className:`size-4`}),(0,B.jsx)(`span`,{children:`SparkForensics`}),(0,B.jsxs)(`button`,{type:`button`,className:`theme-toggle tap-target-comfortable`,"aria-label":`Toggle theme`,"aria-pressed":i===`light`,title:`Toggle theme`,onClick:a,children:[(0,B.jsx)(An,{"aria-hidden":`true`,className:`theme-icon sun`}),(0,B.jsx)(Sn,{"aria-hidden":`true`,className:`theme-icon moon`})]})]}),(0,B.jsxs)(`div`,{className:`landing-hero-copy`,children:[(0,B.jsx)(`h2`,{id:`landing-title`,children:`Analyze a Spark event log.`}),(0,B.jsx)(`p`,{children:`Load the log from one Spark run. You get a verdict on how it went, the stages worth fixing first, and the evidence behind each suggestion.`})]}),(0,B.jsxs)(`div`,{className:`landing-proof`,"aria-label":`SparkForensics guarantees`,children:[(0,B.jsxs)(`span`,{children:[(0,B.jsx)(On,{"aria-hidden":`true`}),` Nothing leaves your machine`]}),(0,B.jsxs)(`span`,{children:[(0,B.jsx)(fn,{"aria-hidden":`true`}),` Bring your AI into the investigation`]}),(0,B.jsxs)(`span`,{children:[(0,B.jsx)(gn,{"aria-hidden":`true`}),` Compare one run against another`]})]}),(0,B.jsx)(Cd,{}),(0,B.jsxs)(`div`,{className:`landing-intake`,children:[e?(0,B.jsx)(vd,{message:e,nonce:t}):null,(0,B.jsx)(dd,{})]})]}),(0,B.jsx)(wd,{onCompare:()=>c(!0)})]})}var Ed=z.createContext(void 0);function Dd(e){let t=z.useContext(Ed);if(!e&&t===void 0)throw Error(u(27));return t}var Od=z.forwardRef(function(e,t){let{render:n,className:r,style:i,forceRender:a=!1,...o}=e,s=Dd(),c=s.useState(`open`),l=s.useState(`nested`),u=s.useState(`mounted`),d={open:c,transitionStatus:s.useState(`transitionStatus`)};return ce(`div`,e,{state:d,ref:[s.context.backdropRef,t],stateAttributesMapping:Ve,props:[{role:`presentation`,hidden:!u,style:{userSelect:`none`,WebkitUserSelect:`none`}},o],enabled:a||!l})}),kd=z.forwardRef(function(e,t){let{render:n,className:r,style:i,disabled:a=!1,nativeButton:o=!0,...c}=e,l=Dd(),u=l.useState(`open`),{getButtonProps:d,buttonRef:f}=s({disabled:a,native:o}),p={disabled:a};function m(e){u&&l.setOpen(!1,g(k,e.nativeEvent))}return ce(`button`,e,{state:p,ref:[t,f],props:[{onClick:m},c,d]})}),Ad=z.forwardRef(function(e,t){let{render:n,className:r,style:i,id:a,...o}=e,s=Dd(),c=se(a);return s.useSyncedValueWithCleanup(`descriptionElementId`,c),ce(`p`,e,{ref:t,props:[{id:c},o]})});function jd(e,t,n=!1){return{open:!1,openProp:void 0,mounted:!1,transitionStatus:void 0,floatingRootContext:new Fe({open:!1,transitionStatus:void 0,floatingElement:null,referenceElement:null,triggerElements:e,floatingId:t,syncOnly:!0,nested:n,onOpenChange:void 0}),floatingId:t,triggerCount:0,preventUnmountingOnClose:!1,payload:void 0,activeTriggerId:null,activeTriggerElement:null,triggerIdProp:void 0,popupElement:null,positionerElement:null,activeTriggerProps:we,inactiveTriggerProps:we,popupProps:we}}var Md=e=>e.triggerIdProp??e.activeTriggerId,Nd=e=>e.openProp??e.open,Pd=e=>(e.popupElement?.id??e.floatingId)||void 0;function Fd(e,t){return t!==void 0&&Nd(e)&&Md(e)===t}function Id(e,t){return Fd(e,t)?!0:t!==void 0&&Nd(e)&&Md(e)==null&&e.triggerCount===1}var Ld={open:Nd,mounted:e=>e.mounted,transitionStatus:e=>e.transitionStatus,floatingRootContext:e=>e.floatingRootContext,triggerCount:e=>e.triggerCount,preventUnmountingOnClose:e=>e.preventUnmountingOnClose,payload:e=>e.payload,activeTriggerId:Md,activeTriggerElement:e=>e.mounted?e.activeTriggerElement:null,popupId:Pd,isTriggerActive:(e,t)=>t!==void 0&&Md(e)===t,isOpenedByTrigger:(e,t)=>Fd(e,t),isMountedByTrigger:(e,t)=>t!==void 0&&Md(e)===t&&e.mounted,triggerProps:(e,t)=>t?e.activeTriggerProps:e.inactiveTriggerProps,triggerPopupId:(e,t)=>Id(e,t)?Pd(e):void 0,popupProps:e=>e.popupProps,popupElement:e=>e.popupElement,positionerElement:e=>e.positionerElement},Rd=z.createContext(void 0);function zd(){let e=z.useContext(Rd);if(e===void 0)throw Error(u(26));return e}var Bd=`--nested-dialogs`,Vd=`data-nested-dialog-open`,Hd={...ze,...T,nestedDialogOpen(e){return e?{[Vd]:``}:null}},Ud=z.forwardRef(function(e,t){let{render:n,className:r,style:i,finalFocus:a,initialFocus:o,...s}=e,c=Dd(),l=c.useState(`descriptionElementId`),u=c.useState(`disablePointerDismissal`),d=c.useState(`floatingRootContext`),f=c.useState(`popupProps`),p=c.useState(`modal`),m=c.useState(`mounted`),h=c.useState(`nested`),g=c.useState(`nestedOpenDialogCount`),_=c.useState(`open`),v=c.useState(`openMethod`),y=c.useState(`titleElementId`),b=c.useState(`transitionStatus`),x=c.useState(`role`),S=d.useState(`floatingId`);zd(),ue({open:_,ref:c.context.popupRef,onComplete(){_&&c.context.onOpenChangeComplete?.(!0)}});let C=o===void 0?Le(c.context.popupRef):o,w=g>0,T=c.useStateSetter(`popupElement`),E=ce(`div`,e,{state:{open:_,nested:h,transitionStatus:b,nestedDialogOpen:w},props:[f,{id:S,"aria-labelledby":y,"aria-describedby":l,role:x,...He,hidden:!m,onKeyDown(e){nt.has(e.key)&&e.stopPropagation()},style:{[Bd]:g}},s],ref:[t,c.context.popupRef,T],stateAttributesMapping:Hd});return(0,B.jsx)(Pe,{context:d,openInteractionType:v,disabled:!m,closeOnFocusOut:!u,initialFocus:C,returnFocus:a,modal:p!==!1,restoreFocus:`popup`,children:E})}),Wd=z.forwardRef(function(e,t){let{keepMounted:n=!1,...r}=e,i=Dd(),a=i.useState(`mounted`),o=i.useState(`modal`),s=i.useState(`open`);return a||n?(0,B.jsx)(Rd.Provider,{value:n,children:(0,B.jsxs)(Ue,{ref:t,...r,children:[a&&o===!0&&(0,B.jsx)(Ke,{ref:i.context.internalBackdropRef,inert:Me(!s)}),e.children]})}):null});function Gd({store:e,parentContext:t,isDrawer:n}){let r=e.useState(`open`),i=e.useState(`disablePointerDismissal`),a=e.useState(`modal`),o=e.useState(`popupElement`),s=e.useState(`floatingRootContext`),[c,l]=z.useState(0),[u,d]=z.useState(0),f=c===0,p=Qe(s,{outsidePressEvent(){return e.context.internalBackdropRef.current||e.context.backdropRef.current?`intentional`:{mouse:a===`trap-focus`?`sloppy`:`intentional`,touch:`sloppy`}},outsidePress(t){if(!e.context.outsidePressEnabledRef.current||`button`in t&&t.button!==0)return!1;if(`touches`in t){if(t.type===`touchend`){if(t.changedTouches.length!==1||t.touches.length!==0)return!1}else if(t.touches.length!==1)return!1}let n=rt(t);if(f&&!i){if(a){let t=e.context.internalBackdropRef.current,r=e.context.backdropRef.current;return t||r?t===n||r===n||tt(n,o)&&!n?.hasAttribute(`data-base-ui-portal`):!0}return!0}return!1},escapeKey:f});return Ye(r&&a===!0,o),e.useContextCallback(`onNestedDialogOpen`,(e,t)=>{l(e),d(t)}),fe(()=>(t?.onNestedDialogOpen&&(r?t.onNestedDialogOpen(c+1,u+ +!!n):t.onNestedDialogOpen(0,0)),()=>{t?.onNestedDialogOpen&&r&&t.onNestedDialogOpen(0,0)}),[n,r,c,u,t]),Be(e,{activeTriggerProps:p.reference,inactiveTriggerProps:p.trigger,popupProps:p.floating,nestedOpenDialogCount:c,nestedOpenDrawerCount:u}),null}var Kd={...Ld,modal:e=>e.modal,nested:e=>e.nested,nestedOpenDialogCount:e=>e.nestedOpenDialogCount,nestedOpenDrawerCount:e=>e.nestedOpenDrawerCount,disablePointerDismissal:e=>e.disablePointerDismissal,openMethod:e=>e.openMethod,descriptionElementId:e=>e.descriptionElementId,titleElementId:e=>e.titleElementId,viewportElement:e=>e.viewportElement,role:e=>e.role},qd=class extends Ze{constructor(e,t,n){let r=new Je,i=Jd(e,r,t,n);super(i,Yd(r),Kd)}setOpen=(e,t)=>{t.preventUnmountOnClose=()=>{this.set(`preventUnmountingOnClose`,!0)},!e&&t.trigger==null&&this.state.activeTriggerId!=null&&(t.trigger=this.state.activeTriggerElement??void 0),this.context.onOpenChange?.(e,t),!t.isCanceled&&(this.state.floatingRootContext.dispatchOpenChange(e,t),this.update(We(this.state,e,t.trigger)))}};function Jd(e,t,n,r=!1){return{...jd(t,n,r),modal:!0,disablePointerDismissal:!1,viewportElement:null,descriptionElementId:void 0,titleElementId:void 0,openMethod:null,nested:!1,nestedOpenDialogCount:0,nestedOpenDrawerCount:0,role:`dialog`,...e}}function Yd(e){return{popupRef:z.createRef(),backdropRef:z.createRef(),internalBackdropRef:z.createRef(),outsidePressEnabledRef:{current:!0},triggerElements:e,onOpenChange:void 0,onOpenChangeComplete:void 0}}function Xd(e,t){let{children:n,open:r,defaultOpen:i=!1,onOpenChange:a,onOpenChangeComplete:o,disablePointerDismissal:s=!1,modal:c=!0,actionsRef:l,handle:u,triggerId:d,defaultTriggerId:f=null}=t,p=e===`drawer`,m=e===`alert-dialog`,h=m?!0:c,_=m||s,v=m?`alertdialog`:`dialog`,y=Dd(!0),b={modal:h,disablePointerDismissal:_,nested:y!=null,role:v},x=qe((e,t)=>new qd({open:i,openProp:r,activeTriggerId:f,triggerIdProp:d,...b},e,t),!0);x.useControlledProp(`openProp`,r),x.useControlledProp(`triggerIdProp`,d),x.useSyncedValues(b),x.useContextCallback(`onOpenChange`,a),x.useContextCallback(`onOpenChangeComplete`,o);let S=x.useState(`open`),C=x.useState(`mounted`),w=x.useState(`payload`);Ge(x,S),Xe(x);let{forceUnmount:T}=Re(S,x);z.useImperativeHandle(l,()=>({unmount:T,close:()=>x.setOpen(!1,g(oe))}),[T,x]);let E=S||C;return(0,B.jsxs)(Ed.Provider,{value:x,children:[u&&(0,B.jsx)(Ie,{handle:u,store:x}),E&&(0,B.jsx)(Gd,{store:x,parentContext:y?.context,isDrawer:p}),typeof n==`function`?n({payload:w}):n]})}var Zd=et(function(e){return Xd(`dialog`,e)}),Qd=z.forwardRef(function(e,t){let{render:n,className:r,style:i,id:a,...o}=e,s=Dd(),c=se(a);return s.useSyncedValueWithCleanup(`titleElementId`,c),ce(`h2`,e,{ref:t,props:[{id:c},o]})});function $d(e){let t=(0,z.useId)();return`${e??t}`}var ef=typeof window<`u`?z.useLayoutEffect:z.useEffect;function tf(e){let t=(0,z.useRef)(e);return ef(()=>{t.current=e},[e]),(0,z.useCallback)((...e)=>t.current?.(...e),[t])}function nf(...e){return tf(t=>{e.forEach(e=>{if(e)switch(typeof e){case`function`:e(t);break;case`object`:e.current=t}})})}function J(e,t=`Assertion error`){if(!e)throw Error(t)}(0,z.createContext)(null);var rf;function af(){return rf===void 0&&(rf=typeof matchMedia==`function`&&!!matchMedia(`(pointer:coarse)`).matches),rf}function of({expandHitTargets:e,axis:t,rect:n}){let r=e?af()?t.resizeTargetMinimumSize.coarse:t.resizeTargetMinimumSize.fine:0;if(n.width<r){let e=r-n.width;n=new DOMRect(n.x-e/2,n.y,n.width+e,n.height)}if(n.height<r){let e=r-n.height;n=new DOMRect(n.x,n.y-e/2,n.width,n.height+e)}return n}function sf(e){switch(typeof e){case`number`:return[e,`px`];case`string`:{let t=parseFloat(e);return e.endsWith(`%`)?[t,`%`]:e.endsWith(`px`)?[t,`px`]:e.endsWith(`rem`)?[t,`rem`]:e.endsWith(`em`)?[t,`em`]:e.endsWith(`vh`)?[t,`vh`]:e.endsWith(`vw`)?[t,`vw`]:[t,`%`]}}}var cf=class{#e={};addListener(e,t){let n=this.#e[e];return n===void 0?this.#e[e]=[t]:n.includes(t)||n.push(t),()=>{this.removeListener(e,t)}}emit(e,t){let n=this.#e[e];if(n!==void 0){if(n.length===1)n[0].call(null,t);else{let e=!1,r=null,i=Array.from(n);for(let n=0;n<i.length;n++){let a=i[n];try{a.call(null,t)}catch(t){r===null&&(e=!0,r=t)}}if(e)throw r}}}removeAllListeners(){this.#e={}}removeListener(e,t){let n=this.#e[e];if(n!==void 0){let e=n.indexOf(t);e>=0&&n.splice(e,1)}}},Y={cursorFlags:0,state:`inactive`},lf=new cf;function uf(){return Y}function df(e){return lf.addListener(`change`,e)}function ff(e,t=[],n,r=!1){let i=Y,a={...Y};a.cursorFlags=e,a.state===`active`&&(a.didPointerMove||=r,a.previews=t,n&&(a.previewLayoutMap=n)),Y=a,lf.emit(`change`,{prev:i,next:a})}function pf(e){let t=Y;Y=e,t.state===`active`&&e.state!==`active`&&t.didPointerMove&&t.hitRegions.forEach(({separator:e})=>{e&&e.element.ownerDocument.activeElement===e.element&&e.element.blur()}),lf.emit(`change`,{prev:t,next:e})}function mf(e){Y.state!==`active`||!Y.previews.some(t=>t.separator===e)||pf({...Y,previews:Y.previews.map(t=>t.separator===e?{...t}:t)})}function hf(e){if(Y.state===`inactive`)return!1;let t=Y.hitRegions.filter(t=>t.axis!==e),n=Y.state===`active`&&Y.previews.some(t=>t.axis===e);if(t.length===Y.hitRegions.length&&!n)return!1;if(t.length===0)pf({cursorFlags:0,state:`inactive`});else if(Y.state===`active`){let n=new Map(Y.initialLayoutMap),r=new Map(Y.previewLayoutMap);n.delete(e),r.delete(e),pf({...Y,cursorFlags:0,hitRegions:t,initialLayoutMap:n,previewLayoutMap:r,previews:Y.previews.filter(t=>t.axis!==e)})}else pf({...Y,hitRegions:t});return!0}var gf=e=>e,_f=()=>{},vf=1,yf=2,bf=4,xf=8,Sf=3,Cf=12,wf;function Tf(){return wf===void 0&&(wf=!1,typeof window<`u`&&(window.navigator.userAgent.includes(`Chrome`)||window.navigator.userAgent.includes(`Firefox`))&&(wf=!0)),wf}function Ef({cursorFlags:e,axes:t,state:n}){let r=0,i=0;switch(n){case`active`:case`hover`:t.forEach(e=>{if(!e.mutableState.disableCursor)switch(e.orientation){case`horizontal`:r++;break;case`vertical`:i++}})}if(r!==0||i!==0){if(n===`active`&&e&&Tf()){let t=(e&vf)!==0,n=(e&yf)!==0,r=(e&bf)!==0,i=(e&xf)!==0;if(t)return r?`se-resize`:i?`ne-resize`:`e-resize`;if(n)return r?`sw-resize`:i?`nw-resize`:`w-resize`;if(r)return`s-resize`;if(i)return`n-resize`}return Tf()?r>0&&i>0?`move`:r>0?`ew-resize`:`ns-resize`:r>0&&i>0?`grab`:r>0?`col-resize`:`row-resize`}}var Df=new WeakMap;function Of(e){if(!e.defaultView||!e.adoptedStyleSheets)return;let{prevStyle:t,styleSheet:n}=Df.get(e)??{};n===void 0&&(n=new e.defaultView.CSSStyleSheet,e.adoptedStyleSheets&&(Object.isExtensible(e.adoptedStyleSheets)?e.adoptedStyleSheets.push(n):e.adoptedStyleSheets=[...e.adoptedStyleSheets,n]));let r=uf();switch(r.state){case`active`:case`hover`:{let e=Ef({cursorFlags:r.cursorFlags,axes:r.hitRegions.map(e=>e.axis),state:r.state}),i=`*, *:hover {cursor: ${e} !important; }`;if(t===i)return;t=i,e?n.cssRules.length===0?n.insertRule(i):n.replaceSync(i):n.cssRules.length===1&&n.deleteRule(0);break}case`inactive`:t=void 0,n.cssRules.length===1&&n.deleteRule(0)}Df.set(e,{prevStyle:t,styleSheet:n})}function kf({axis:e}){let{layoutStrategy:t,orientation:n,items:r}=e;return t?t.calculateAvailableSize():r.reduce((e,t)=>(e+=n===`horizontal`?t.element.offsetWidth:t.element.offsetHeight,e),0)}function Af(e,t){let n=e.compareDocumentPosition(t);return n&Node.DOCUMENT_POSITION_DISCONNECTED?0:n&Node.DOCUMENT_POSITION_FOLLOWING?-1:n&Node.DOCUMENT_POSITION_PRECEDING?1:0}function jf(e,t){return Array.from(t).sort((t,n)=>{let r=e===`horizontal`?Mf(t,n):Nf(t,n);return r===0?Af(t.element,n.element):r})}function Mf(e,t){let n=e.element.offsetLeft-t.element.offsetLeft;return n===0?e.element.offsetWidth-t.element.offsetWidth:n}function Nf(e,t){let n=e.element.offsetTop-t.element.offsetTop;return n===0?e.element.offsetHeight-t.element.offsetHeight:n}function Pf(e){return typeof e==`object`&&!!e&&`nodeType`in e&&e.nodeType===Node.ELEMENT_NODE}function Ff(e,t){return{x:e.x>=t.left&&e.x<=t.right?0:Math.min(Math.abs(e.x-t.left),Math.abs(e.x-t.right)),y:e.y>=t.top&&e.y<=t.bottom?0:Math.min(Math.abs(e.y-t.top),Math.abs(e.y-t.bottom))}}function If({orientation:e,rects:t,targetRect:n}){let r={x:n.x+n.width/2,y:n.y+n.height/2},i,a=Number.MAX_VALUE;for(let n of t){let{x:t,y:o}=Ff(r,n),s=e===`horizontal`?t:o;s<a&&(a=s,i=n)}return J(i,`No rect found`),i}function Lf({expandHitTargets:e=!0,axis:t,includeDisabled:n=!1}){if(t.layoutStrategy)return t.layoutStrategy.calculateHitRegions({expandHitTargets:e,axis:t,includeDisabled:n});let{element:r,orientation:i,items:a,separators:o}=t,s=jf(i,Array.from(r.children).filter(Pf).filter(e=>!e.hasAttribute(`data-resize-preview`)).map(e=>({element:e}))).map(({element:e})=>e),c=[],l=!1,u=!1,d=-1,f,p=-1,m=0,h,g=[];{let e=-1;for(let t of s)t.hasAttribute(`data-panel`)&&(e++,t.hasAttribute(`data-disabled`)||(m++,d===-1&&(d=e),p=e))}if(n||m>1){let r=-1;for(let m of s)if(m.hasAttribute(`data-panel`)){r++;let o=a.find(e=>e.element===m);if(o){if(h){let a=h.element.getBoundingClientRect(),s=m.getBoundingClientRect(),_;if(u){let e=i===`horizontal`?new DOMRect(a.right,a.top,0,a.height):new DOMRect(a.left,a.bottom,a.width,0),t=i===`horizontal`?new DOMRect(s.left,s.top,0,s.height):new DOMRect(s.left,s.top,s.width,0);switch(g.length){case 0:_=[e,t];break;case 1:{let n=g[0];_=[n,If({orientation:i,rects:[a,s],targetRect:n.element.getBoundingClientRect()})===a?t:e];break}default:_=g}}else _=g.length?g:[i===`horizontal`?new DOMRect(a.right,s.top,s.left-a.right,s.height):new DOMRect(s.left,a.bottom,s.width,s.top-a.bottom)];for(let i of _){let a=of({expandHitTargets:e,axis:t,rect:`width`in i?i:i.element.getBoundingClientRect()});(n||!l&&!(r<=d||r>p))&&(f??=kf({axis:t}),c.push({axis:t,axisSize:f,items:[h,o],separator:`width`in i?void 0:i,rect:a})),l=!1}}u=!1,h=o,g=[]}}else if(m.hasAttribute(`data-separator`)){m.ariaDisabled!==null&&(l=!0);let e=o.find(e=>e.element===m);e?g.push(e):(h=void 0,g=[])}else u=!0}return c}function Rf(e,t){let n=getComputedStyle(e);return t*parseFloat(n.fontSize)}function zf(e,t){let n=getComputedStyle(e.ownerDocument.documentElement);return t*parseFloat(n.fontSize)}function Bf(e){return e/100*window.innerHeight}function Vf(e){return e/100*window.innerWidth}function Hf({axisSize:e,itemElement:t,styleProp:n}){let r,[i,a]=sf(n);switch(a){case`%`:r=i/100*e;break;case`px`:r=i;break;case`rem`:r=zf(t,i);break;case`em`:r=Rf(t,i);break;case`vh`:r=Bf(i);break;case`vw`:r=Vf(i)}return r}function X(e){return parseFloat(e.toFixed(3))}function Uf(e){let{items:t}=e,n=kf({axis:e});return n===0?t.map(e=>({groupResizeBehavior:e.constraintProps.groupResizeBehavior,collapsedSize:0,collapsible:e.constraintProps.collapsible===!0,defaultSize:void 0,disabled:e.constraintProps.disabled,minSize:0,maxSize:100,itemId:e.id})):t.map(e=>{let{element:t,constraintProps:r}=e,i=0;r.collapsedSize!==void 0&&(i=X(Hf({axisSize:n,itemElement:t,styleProp:r.collapsedSize})/n*100));let a;r.collapsedThreshold!==void 0&&(a=X(Hf({axisSize:n,itemElement:t,styleProp:r.collapsedThreshold})/n*100));let o;r.defaultSize!==void 0&&(o=X(Hf({axisSize:n,itemElement:t,styleProp:r.defaultSize})/n*100));let s=0;r.minSize!==void 0&&(s=X(Hf({axisSize:n,itemElement:t,styleProp:r.minSize})/n*100));let c=100;return r.maxSize!==void 0&&(c=X(Hf({axisSize:n,itemElement:t,styleProp:r.maxSize})/n*100)),{groupResizeBehavior:r.groupResizeBehavior,collapsedSize:i,collapsedThreshold:a,collapsible:r.collapsible===!0,defaultSize:o,disabled:r.disabled,minSize:s,maxSize:c,itemId:e.id}})}var Wf=new Map,Gf=new cf;function Kf(e){Wf=new Map(Wf),Wf.delete(e)}function qf(e,t){for(let[t]of Wf)if(t.id===e)return t}function Jf(e,t){for(let[t,n]of Wf)if(t.id===e)return n;if(t)throw Error(`Could not find data for Group with id ${e}`)}function Yf(){return Wf}function Xf(e,t){return Gf.addListener(`axisChange`,n=>{n.axis.id===e&&t(n)})}function Zf(e,t,n){let r=Wf.get(e);Wf=new Map(Wf),Wf.set(e,t),Gf.emit(`axisChange`,{axis:e,isUserInteraction:n?.isUserInteraction===!0,prev:r,next:t})}function Qf(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!=t[n])return!1;return!0}function Z(e,t,n=0){return Math.abs(X(e)-X(t))<=n}function $f(e,t){return Z(e,t)?0:e>t?1:-1}function ep({overrideDisabledItems:e,itemConstraints:t,prevSize:n,size:r}){let{collapsedSize:i=0,collapsedThreshold:a,collapsible:o,disabled:s,maxSize:c=100,minSize:l=0}=t;if(s&&!e)return n;if($f(r,l)<0){if(o){let e=a??(l-i)/2,t=$f(n,i)<=0,o=t?i+e:l-e,s=$f(r,o);r=$f(r,i)<=0||s<0||a!==void 0&&t&&s===0?i:l}else r=l}return r=Math.min(c,r),r=X(r),r}function tp({delta:e,initialLayout:t,itemConstraints:n,pivotIndices:r,prevLayout:i,trigger:a}){if(Z(e,0))return t;let o=a===`imperative-api`,s=n.map(({itemId:e})=>t[e]),c=n.map(({itemId:e})=>i[e]),l=[...s],[u,d]=r;J(u!=null,`Invalid first pivot index`),J(d!=null,`Invalid second pivot index`);let f=0;switch(a){case`keyboard`:{let t=e<0?d:u,r=n[t];J(r,`Panel constraints not found for index ${t}`);let{collapsedSize:i=0,collapsible:a,minSize:o=0}=r;if(a){let n=s[t];if(J(n!=null,`Previous layout not found for panel index ${t}`),Z(n,i)){let t=o-n;$f(t,Math.abs(e))>0&&(e=e<0?0-t:t)}}}{let t=e<0?u:d,r=n[t];J(r,`No panel constraints found for index ${t}`);let{collapsedSize:i=0,collapsible:a,minSize:o=0}=r;if(a){let n=s[t];if(J(n!=null,`Previous layout not found for panel index ${t}`),Z(n,o)){let t=n-i;$f(t,Math.abs(e))>0&&(e=e<0?0-t:t)}}}break;default:{let t=e<0?d:u,r=n[t];J(r,`Panel constraints not found for index ${t}`);let i=s[t],{collapsedSize:a,collapsedThreshold:o,collapsible:c,minSize:l}=r;if(c&&$f(i,l)<0){let t=l-a,n=o??t/2;if($f(i+Math.abs(e),l)<0){let r=$f(Math.abs(e),n);e=r>0||r===0&&o===void 0&&e<0?e<0?-t:t:0}}break}}{let t=e<0?1:-1,r=e<0?d:u,i=0;for(;;){let e=s[r];J(e!=null,`Previous layout not found for panel index ${r}`);let a=ep({overrideDisabledItems:o,itemConstraints:n[r],prevSize:e,size:100})-e;if(i+=a,r+=t,r<0||r>=n.length)break}let a=Math.min(Math.abs(e),Math.abs(i));e=e<0?0-a:a}{let t=e<0?u:d;for(;t>=0&&t<n.length;){let r=Math.abs(e)-Math.abs(f),i=s[t];J(i!=null,`Previous layout not found for panel index ${t}`);let a=i-r,c=ep({overrideDisabledItems:o,itemConstraints:n[t],prevSize:i,size:a});if(!Z(i,c)&&(f+=i-c,l[t]=c,f.toFixed(3).localeCompare(Math.abs(e).toFixed(3),void 0,{numeric:!0})>=0))break;e<0?t--:t++}}if(Qf(c,l))return i;{let t=e<0?d:u,r=s[t];J(r!=null,`Previous layout not found for panel index ${t}`);let i=r+f,a=ep({overrideDisabledItems:o,itemConstraints:n[t],prevSize:r,size:i});if(l[t]=a,!Z(a,i)){let t=i-a,r=e<0?d:u;for(;r>=0&&r<n.length;){let i=l[r];J(i!=null,`Previous layout not found for panel index ${r}`);let a=i+t,s=ep({overrideDisabledItems:o,itemConstraints:n[r],prevSize:i,size:a});if(Z(i,s)||(t-=s-i,l[r]=s),Z(t,0))break;e>0?r--:r++}}}return Z(Object.values(l).reduce((e,t)=>t+e,0),100,.1)?l.reduce((e,t,r)=>(e[n[r].itemId]=t,e),{}):i}function np(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e)if(t[n]===void 0||$f(e[n],t[n])!==0)return!1;return!0}function rp({commit:e,document:t,event:n,hitRegions:r,initialLayoutMap:i,mountedAxes:a,pointerDownAtPoint:o,prevCursorFlags:s}){let c=0,l=uf(),u=l.state===`active`?l.previews:[],d=new Map(l.state===`active`?l.previewLayoutMap:void 0);r.forEach(t=>{let{axis:r,axisSize:s}=t,{orientation:l,items:f}=r;if(e&&r.resizePreviewMode!==`separator`)return;let{disableCursor:p}=r.mutableState,m=0;m=o?l===`horizontal`?(n.clientX-o.x)/s*100:(n.clientY-o.y)/s*100:l===`horizontal`?n.clientX<0?-100:100:n.clientY<0?-100:100;let h=i.get(r),g=a.get(r);if(!h||!g)return;let{defaultLayoutDeferred:_,derivedItemConstraints:v,axisSize:y,layout:b,separatorToItems:x}=g;if(v&&b&&x){let n=r.resizePreviewMode===`separator`?d.get(r)??b:b,i=tp({delta:m,initialLayout:h,itemConstraints:v,pivotIndices:t.items.map(e=>f.indexOf(e)),prevLayout:n,trigger:`mouse-or-touch`});if(r.resizePreviewMode===`separator`&&!e&&!np(i,n)){d.set(r,i);let e=0,t=f.map(t=>(e+=i[t.id]-h[t.id],s/100*e));u=u.map(e=>{if(e.axis!==r)return e;let n=t[e.itemIndex];return n===e.offset?e:{...e,offset:n}})}if(np(i,n)&&m!==0&&!p)switch(l){case`horizontal`:c|=m<0?vf:yf;break;case`vertical`:c|=m<0?bf:xf}(r.resizePreviewMode!==`separator`||e)&&!np(i,b)&&Zf(t.axis,{defaultLayoutDeferred:_,derivedItemConstraints:v,axisSize:y,layout:i,requestedAxisSize:y,requestedLayout:i,separatorToItems:x})}});let f=0;n.movementX===0?f|=s&Sf:f|=c&Sf,n.movementY===0?f|=s&Cf:f|=c&Cf;let p=l.state===`active`&&(n.clientX!==l.pointerDownAtPoint.x||n.clientY!==l.pointerDownAtPoint.y);ff(f,u,d,p),Of(t)}function ip(e,t){let n=uf(),r=Yf(),i=!1;return n.state===`active`&&(rp({commit:!0,document:e,event:t,hitRegions:n.hitRegions,initialLayoutMap:n.initialLayoutMap,mountedAxes:r,pointerDownAtPoint:n.pointerDownAtPoint,prevCursorFlags:n.cursorFlags}),pf({cursorFlags:0,state:`inactive`}),n.hitRegions.length>0&&(Of(e),i=!0,n.hitRegions.forEach(e=>{if(!r.has(e.axis))return;let t=Jf(e.axis.id,!0);Zf(e.axis,t,{isUserInteraction:!0})}))),i}function ap(e){e.defaultPrevented||ip(e.currentTarget,e)}function op(e,t,n){let r,i={x:1/0,y:1/0};for(let a of t){let t=Ff(n,a.rect);switch(e){case`horizontal`:(t.x<i.x||t.x===i.x&&t.y<=i.y)&&(r=a,i=t);break;case`vertical`:(t.y<i.y||t.y===i.y&&t.x<=i.x)&&(r=a,i=t)}}return r?{distance:i,hitRegion:r}:void 0}function sp(e){return typeof e==`object`&&!!e&&`nodeType`in e&&e.nodeType===Node.DOCUMENT_FRAGMENT_NODE}function cp(e,t){if(e===t)throw Error(`Cannot compare node with itself`);let n={a:mp(e),b:mp(t)},r;for(;n.a.at(-1)===n.b.at(-1);)r=n.a.pop(),n.b.pop();J(r,`Stacking order can only be calculated for elements with a common ancestor`);let i={a:pp(fp(n.a)),b:pp(fp(n.b))};if(i.a===i.b){let e=r.childNodes,t={a:n.a.at(-1),b:n.b.at(-1)},i=e.length;for(;i--;){let n=e[i];if(n===t.a)return 1;if(n===t.b)return-1}}return Math.sign(i.a-i.b)}var lp=/\b(?:position|zIndex|opacity|transform|webkitTransform|mixBlendMode|filter|webkitFilter|isolation)\b/;function up(e){let t=getComputedStyle(hp(e)??e).display;return t===`flex`||t===`inline-flex`}function dp(e){let t=getComputedStyle(e);return!!(t.position===`fixed`||t.zIndex!==`auto`&&(t.position!==`static`||up(e))||+t.opacity<1||`transform`in t&&t.transform!==`none`||`webkitTransform`in t&&t.webkitTransform!==`none`||`mixBlendMode`in t&&t.mixBlendMode!==`normal`||`filter`in t&&t.filter!==`none`||`webkitFilter`in t&&t.webkitFilter!==`none`||`isolation`in t&&t.isolation===`isolate`||lp.test(t.willChange)||t.webkitOverflowScrolling===`touch`)}function fp(e){let t=e.length;for(;t--;){let n=e[t];if(J(n,`Missing node`),dp(n))return n}return null}function pp(e){return e&&Number(getComputedStyle(e).zIndex)||0}function mp(e){let t=[];for(;e;)t.push(e),e=hp(e);return t}function hp(e){let{parentNode:t}=e;return sp(t)?t.host:t}function gp(e,t){return e.x<t.x+t.width&&e.x+e.width>t.x&&e.y<t.y+t.height&&e.y+e.height>t.y}function _p(e){try{return e.matches(`:modal`)}catch{return!1}}function vp({axisElement:e,hitRegion:t,pointerEventTarget:n}){if(Pf(n)){let t=n.closest(`dialog`);if(t&&!t.contains(e)&&_p(t))return!1}if(!Pf(n)||n.contains(e)||e.contains(n))return!0;if(cp(n,e)>0){let r=n;for(;r;){if(r.contains(e))return!0;if(gp(r.getBoundingClientRect(),t))return!1;r=r.parentElement}}return!0}function yp(e,t){let n=[];return t.forEach((t,r)=>{if(r.disabled)return;let i=Lf({axis:r}),a=op(r.orientation,i,{x:e.clientX,y:e.clientY});a&&a.distance.x<=0&&a.distance.y<=0&&vp({axisElement:r.element,hitRegion:a.hitRegion.rect,pointerEventTarget:e.target})&&n.push(a.hitRegion)}),n}function bp({layout:e,itemConstraints:t}){let n=t.map(({itemId:t})=>e[t]),r=[...n],i=r.reduce((e,t)=>e+t,0);if(Object.keys(e).length!==t.length)throw Error(`Invalid ${t.length} panel layout: ${Object.values(e).map(e=>`${e}%`).join(`, `)}`);if(!Z(i,100)&&r.length>0)for(let e=0;e<t.length;e++){let t=r[e];J(t!=null,`No layout data found for index ${e}`);let n=100/i*t;r[e]=n}let a=0;for(let e=0;e<t.length;e++){let i=n[e];J(i!=null,`No layout data found for index ${e}`);let o=r[e];J(o!=null,`No layout data found for index ${e}`);let s=ep({overrideDisabledItems:!0,itemConstraints:t[e],prevSize:i,size:o});o!=s&&(a+=o-s,r[e]=s)}if(!Z(a,0))for(let e=0;e<t.length;e++){let n=r[e];J(n!=null,`No layout data found for index ${e}`);let i=n+a,o=ep({overrideDisabledItems:!0,itemConstraints:t[e],prevSize:n,size:i});if(n!==o&&(a-=o-n,r[e]=o,Z(a,0)))break}return r.reduce((e,n,r)=>(e[t[r].itemId]=n,e),{})}function xp({axisId:e,itemId:t}){let n=()=>{let t=Yf();for(let[n,{defaultLayoutDeferred:r,derivedItemConstraints:i,layout:a,axisSize:o,separatorToItems:s}]of t)if(n.id===e)return{defaultLayoutDeferred:r,derivedItemConstraints:i,axis:n,axisSize:o,layout:a,separatorToItems:s};throw Error(`Group ${e} not found`)},r=()=>{let e=n().derivedItemConstraints.find(e=>e.itemId===t);if(e!==void 0)return e;throw Error(`Panel constraints not found for Panel ${t}`)},i=()=>{let e=n().axis.items.find(e=>e.id===t);if(e!==void 0)return e;throw Error(`Layout not found for Panel ${t}`)},a=()=>{let e=n().layout[t];if(e!==void 0)return e;throw Error(`Layout not found for Panel ${t}`)},o=({nextSize:e,items:n,prevLayout:r,derivedItemConstraints:i})=>{let o=a(),s=n.findIndex(e=>e.id===t),c=s===0,l=s===n.length-1;if(l&&e<o&&(c||n.slice(0,s).every((e,t)=>{let n=i[t];return n?.collapsible&&Z(n.collapsedSize,r[n.itemId])}))){let e=n.slice(0,s).reduce((e,t)=>e+r[t.id],0);return{...r,[t]:X(100-e)}}return tp({delta:l?o-e:e-o,initialLayout:r,itemConstraints:i,pivotIndices:l?[s-1,s]:[s,s+1],prevLayout:r,trigger:`imperative-api`})},s=e=>{if(e===a())return;let{defaultLayoutDeferred:t,derivedItemConstraints:r,axis:i,axisSize:s,layout:c,separatorToItems:l}=n(),u=bp({layout:o({nextSize:e,items:i.items,prevLayout:c,derivedItemConstraints:r}),itemConstraints:r});np(c,u)||Zf(i,{defaultLayoutDeferred:t,derivedItemConstraints:r,axisSize:s,layout:u,requestedAxisSize:s,requestedLayout:u,separatorToItems:l})};return{collapse:()=>{let{collapsible:e,collapsedSize:t}=r(),{mutableValues:n}=i(),o=a();e&&o!==t&&(n.expandToSize=o,s(t))},expand:()=>{let{collapsible:e,collapsedSize:t,minSize:n}=r(),{mutableValues:o}=i(),c=a();if(e&&c===t){let e=o.expandToSize??n;e===0&&(e=1),s(e)}},getSize:()=>{let{axis:e}=n(),r=a(),{element:o}=i();return{asPercentage:r,inPixels:e.layoutStrategy?e.layoutStrategy.getItemSizeInPixels(t):e.orientation===`horizontal`?o.offsetWidth:o.offsetHeight}},isCollapsed:()=>{let{collapsible:e,collapsedSize:t}=r(),n=a();return e&&Z(t,n)},resize:e=>{let{axis:t}=n(),{element:r}=i(),a=kf({axis:t}),o=X(Hf({axisSize:a,itemElement:r,styleProp:e})/a*100);s(o)}}}function Sp(e){e.defaultPrevented||yp(e,Yf()).forEach(t=>{if(t.separator&&!t.separator.disableDoubleClick){let n=t.items.find(e=>e.constraintProps.defaultSize!==void 0);if(n){let r=n.constraintProps.defaultSize,i=xp({axisId:t.axis.id,itemId:n.id});i&&r!==void 0&&(i.resize(r),e.preventDefault())}}})}function Cp(e){let t=Yf();for(let[n]of t)if(n.separators.some(t=>t.element===e))return n;throw Error(`Could not find parent Group for separator element`)}function wp({axisId:e}){let t=()=>{let t=Yf();for(let[n,r]of t)if(n.id===e)return{axis:n,...r};throw Error(`Could not find Group with id "${e}"`)};return{getLayout(){let{defaultLayoutDeferred:e,layout:n}=t();return e?{}:n},setLayout(e){let{defaultLayoutDeferred:n,derivedItemConstraints:r,axis:i,axisSize:a,layout:o,separatorToItems:s}=t(),c=bp({layout:e,itemConstraints:r});return n?o:(np(o,c)||Zf(i,{defaultLayoutDeferred:n,derivedItemConstraints:r,axisSize:a,layout:c,requestedAxisSize:a,requestedLayout:c,separatorToItems:s}),c)}}}function Tp(e,t){let n=Cp(e),r=Jf(n.id,!0),i=n.separators.find(t=>t.element===e);J(i,`Matching separator not found`);let a=r.separatorToItems.get(i);J(a,`Matching panels not found`);let o=a.map(e=>n.items.indexOf(e)),s=wp({axisId:n.id}).getLayout(),c=bp({layout:tp({delta:t,initialLayout:s,itemConstraints:r.derivedItemConstraints,pivotIndices:o,prevLayout:s,trigger:`keyboard`}),itemConstraints:r.derivedItemConstraints});np(s,c)||Zf(n,{defaultLayoutDeferred:r.defaultLayoutDeferred,derivedItemConstraints:r.derivedItemConstraints,axisSize:r.axisSize,layout:c,requestedAxisSize:r.axisSize,requestedLayout:c,separatorToItems:r.separatorToItems},{isUserInteraction:!0})}function Ep(e){if(e.defaultPrevented)return;let t=e.currentTarget,n=Cp(t);if(!(n.disabled||n.separators.find(e=>e.element===t)?.disabled))switch(e.key){case`ArrowDown`:e.preventDefault(),n.orientation===`vertical`&&Tp(t,5);break;case`ArrowLeft`:e.preventDefault(),n.orientation===`horizontal`&&Tp(t,-5);break;case`ArrowRight`:e.preventDefault(),n.orientation===`horizontal`&&Tp(t,5);break;case`ArrowUp`:e.preventDefault(),n.orientation===`vertical`&&Tp(t,-5);break;case`End`:e.preventDefault(),Tp(t,100);break;case`Enter`:{e.preventDefault();let{derivedItemConstraints:r,layout:i,separatorToItems:a}=Jf(n.id,!0),o=n.separators.find(e=>e.element===t);J(o,`Matching separator not found`);let s=a.get(o);J(s,`Matching panels not found`);let c=s[0],l=r.find(e=>e.itemId===c.id);if(J(l,`Panel metadata not found`),l.collapsible){let e=i[c.id];Tp(t,(l.collapsedSize===e?n.mutableState.expandedItemSizes[c.id]??l.minSize:l.collapsedSize)-e)}break}case`F6`:{e.preventDefault();let t=n.separators.map(e=>e.element),r=Array.from(t).findIndex(t=>t===e.currentTarget);J(r!==null,`Index not found`),t[e.shiftKey?r>0?r-1:t.length-1:r+1<t.length?r+1:0].focus({preventScroll:!0});break}case`Home`:e.preventDefault(),Tp(t,-100)}}function Dp(e,t){let{element:n,orientation:r,items:i}=e,a=n.getBoundingClientRect(),o=r===`horizontal`;return Lf({expandHitTargets:!1,axis:e,includeDisabled:!0}).map(({items:r,rect:s,separator:c},l)=>{let u=i.indexOf(r[0]),d=o?s.left+s.width/2:s.top+s.height/2;return{active:t.some(t=>{if(t.axis!==e||t.items[0]!==r[0])return!1;if(c||t.separator)return t.separator===c;let n=o?t.rect.left+t.rect.width/2:t.rect.top+t.rect.height/2;return Z(d,n)}),axis:e,key:c?`separator-${c.id}`:`panel-${r[0].id}-${l}`,offset:0,itemIndex:u,rect:new DOMRect((o&&!c?d:s.left)-a.left-n.clientLeft+n.scrollLeft,(!o&&!c?d:s.top)-a.top-n.clientTop+n.scrollTop,o&&!c?0:s.width,!o&&!c?0:s.height),separator:c}})}function Op(e){if(e.defaultPrevented||e.pointerType===`mouse`&&e.button>0)return;let t=Yf(),n=yp(e,t);if(n.length===0)return;let r=new Map,i=!1;n.forEach(e=>{e.separator&&(i||(i=!0,e.separator.element.focus({focusVisible:!1,preventScroll:!0})));let n=t.get(e.axis);n&&r.set(e.axis,n.layout)});let a=Array.from(r.keys()).flatMap(e=>e.resizePreviewMode===`separator`?Dp(e,n):[]);pf({cursorFlags:0,didPointerMove:!1,hitRegions:n,initialLayoutMap:r,pointerDownAtPoint:{x:e.clientX,y:e.clientY},previewLayoutMap:new Map(r),previews:a,state:`active`}),e.preventDefault()}function kp(e){let t=Yf(),n=uf();n.state===`active`&&rp({commit:!1,document:e.currentTarget,event:e,hitRegions:n.hitRegions,initialLayoutMap:n.initialLayoutMap,mountedAxes:t,prevCursorFlags:n.cursorFlags})}function Ap(e){if(e.defaultPrevented)return;let t=uf(),n=Yf();switch(t.state){case`active`:if(e.buttons===0){t.previewLayoutMap.forEach((e,t)=>{let r=n.get(t);t.resizePreviewMode===`separator`&&r&&!np(e,r.layout)&&Zf(t,{...r,layout:e,requestedAxisSize:r.axisSize,requestedLayout:e})}),pf({cursorFlags:0,state:`inactive`}),t.hitRegions.forEach(e=>{if(!n.has(e.axis))return;let t=Jf(e.axis.id,!0);Zf(e.axis,t,{isUserInteraction:!0})}),Of(e.currentTarget);return}for(let n of t.hitRegions)if(n.separator){let{element:t}=n.separator;t.isConnected&&!t.hasPointerCapture?.(e.pointerId)&&t.setPointerCapture?.(e.pointerId)}rp({commit:!1,document:e.currentTarget,event:e,hitRegions:t.hitRegions,initialLayoutMap:t.initialLayoutMap,mountedAxes:n,pointerDownAtPoint:t.pointerDownAtPoint,prevCursorFlags:t.cursorFlags});break;default:{let r=yp(e,n);r.length===0?t.state!==`inactive`&&pf({cursorFlags:0,state:`inactive`}):pf({cursorFlags:0,hitRegions:r,state:`hover`}),Of(e.currentTarget);break}}}function jp(e){if(e.relatedTarget instanceof HTMLIFrameElement)switch(uf().state){case`hover`:pf({cursorFlags:0,state:`inactive`})}}function Mp(e){e.defaultPrevented||e.pointerType===`mouse`&&e.button>0||ip(e.currentTarget,e)&&e.preventDefault()}function Np(e){let t=0,n=0,r={};for(let i of e)if(i.defaultSize!==void 0){t++;let e=X(i.defaultSize);n+=e,r[i.itemId]=e}else r[i.itemId]=void 0;let i=e.length-t;if(i!==0){let t=X((100-n)/i);for(let n of e)n.defaultSize===void 0&&(r[n.itemId]=t)}return r}function Pp(e,t){let n=e.map(e=>e.id),r=Object.keys(t);if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}function Fp({axis:e,itemConstraints:t}){let n=e.items.map(({id:e})=>e).join(`,`),r=e.mutableState.defaultLayout;return e.mutableState.layouts[n]??(r&&Pp(e.items,r)?r:Np(t))}function Ip({itemIds:e,layout:t}){return bp({layout:t,itemConstraints:e.map(e=>({collapsedSize:0,collapsible:!1,defaultSize:void 0,disabled:void 0,itemId:e,maxSize:100,minSize:0}))})}function Lp(e,t,n){if(!n[0])return;let r=e.items.find(e=>e.element===t);if(!r||!r.onResize)return;let i=kf({axis:e}),a=e.orientation===`horizontal`?r.element.offsetWidth:r.element.offsetHeight,o=r.mutableValues.prevSize,s={asPercentage:X(a/i*100),inPixels:a};r.mutableValues.prevSize=s,r.onResize(s,r.id,o)}function Rp(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e)if(e[n]!==t[n])return!1;return!0}function zp(e,t){return e.length===t.length&&e.every((e,n)=>Rp(e,t[n]))}function Bp({axis:e,nextAxisSize:t,prevAxisSize:n,prevLayout:r}){if(n<=0||t<=0||n===t)return r;let i=0,a=0,o=!1,s=new Map,c=[];for(let l of e.items){let e=r[l.id]??0;switch(l.constraintProps.groupResizeBehavior){case`preserve-pixel-size`:{o=!0;let r=X(e/100*n/t*100);s.set(l.id,r),i+=r;break}default:c.push(l.id),a+=e}}if(!o||c.length===0)return r;let l=100-i,u={...r};if(s.forEach((e,t)=>{u[t]=e}),a>0)for(let e of c)u[e]=X((r[e]??0)/a*l);else{let e=X(l/c.length);for(let t of c)u[t]=e}return u}var Vp=new Map;function Hp(e){let t=!0;J(e.element.ownerDocument.defaultView,`Cannot register an unmounted Group`);let n=e.element.ownerDocument.defaultView.ResizeObserver,r=new Set,i=new Set,a=new n(n=>{for(let r of n){let{borderBoxSize:n,target:i}=r;if(i===e.element){if(t){let t=kf({axis:e});if(t===0)return;let n=Jf(e.id);if(!n)return;let r=Uf(e),i=n.requestedAxisSize,a=n.requestedLayout;n.defaultLayoutDeferred&&(i=t,a=Ip({itemIds:e.items.map(({id:e})=>e),layout:Fp({axis:e,itemConstraints:r})}));let o=bp({layout:Bp({axis:e,nextAxisSize:t,prevAxisSize:i,prevLayout:a}),itemConstraints:r});if(!n.defaultLayoutDeferred&&np(n.layout,o)&&zp(n.derivedItemConstraints,r)&&n.axisSize===t)continue;Zf(e,{defaultLayoutDeferred:!1,derivedItemConstraints:r,axisSize:t,layout:o,requestedAxisSize:i,requestedLayout:a,separatorToItems:n.separatorToItems})}}else Lp(e,i,n)}});a.observe(e.element),e.items.forEach(e=>{J(!r.has(e.id),`Panel ids must be unique; id "${e.id}" was used more than once`),r.add(e.id),e.onResize&&a.observe(e.element)});let o=kf({axis:e}),s=Uf(e),c=Fp({axis:e,itemConstraints:s}),l=bp({layout:c,itemConstraints:s}),u=e.element.ownerDocument;Vp.set(u,(Vp.get(u)??0)+1);let d=new Map;return Lf({axis:e,includeDisabled:!0}).forEach(e=>{e.separator&&d.set(e.separator,e.items)}),Zf(e,{defaultLayoutDeferred:o===0,derivedItemConstraints:s,axisSize:o,layout:l,requestedAxisSize:o,requestedLayout:Ip({itemIds:e.items.map(({id:e})=>e),layout:c}),separatorToItems:d}),e.separators.forEach(e=>{J(!i.has(e.id),`Separator ids must be unique; id "${e.id}" was used more than once`),i.add(e.id),e.element.addEventListener(`keydown`,Ep)}),Vp.get(u)===1&&(u.addEventListener(`contextmenu`,ap,!0),u.addEventListener(`dblclick`,Sp,!0),u.addEventListener(`pointerdown`,Op,!0),u.addEventListener(`pointerleave`,kp),u.addEventListener(`pointermove`,Ap),u.addEventListener(`pointerout`,jp),u.addEventListener(`pointerup`,Mp,!0)),function(){t=!1,Vp.set(u,Math.max(0,(Vp.get(u)??0)-1)),Kf(e),hf(e)&&Of(u),e.separators.forEach(e=>{e.element.removeEventListener(`keydown`,Ep)}),Vp.get(u)||(u.removeEventListener(`contextmenu`,ap,!0),u.removeEventListener(`dblclick`,Sp,!0),u.removeEventListener(`pointerdown`,Op,!0),u.removeEventListener(`pointerleave`,kp),u.removeEventListener(`pointermove`,Ap),u.removeEventListener(`pointerout`,jp),u.removeEventListener(`pointerup`,Mp,!0)),a.disconnect()}}function Up({derivedItemConstraints:e,axis:t,layout:n,prevLayout:r,requestedLayout:i}){let a=t.items.map(({id:e})=>e).join(`,`);t.mutableState.layouts[a]=i,r&&e.forEach(e=>{if(e.collapsible){let i=Z(e.collapsedSize,n[e.itemId]),a=Z(e.collapsedSize,r[e.itemId]);i&&!a&&(t.mutableState.expandedItemSizes[e.itemId]=r[e.itemId])}})}function Wp(){let[e,t]=(0,z.useState)({});return[e,(0,z.useCallback)(()=>t({}),[])]}function Gp(e){let t=(0,z.useRef)({...e});return ef(()=>{for(let n in e)t.current[n]=e[n]},[e]),t.current}var Kp=(0,z.createContext)(null);function qp({layout:e,itemConstraints:t,itemId:n,itemIndex:r}){let i,a,o=e[n],s=t.find(e=>e.itemId===n);if(s){let c=s.maxSize,l=s.collapsible?s.collapsedSize:s.minSize,u=[r,r+1];a=bp({layout:tp({delta:l-o,initialLayout:e,itemConstraints:t,pivotIndices:u,prevLayout:e}),itemConstraints:t})[n],i=bp({layout:tp({delta:c-o,initialLayout:e,itemConstraints:t,pivotIndices:u,prevLayout:e}),itemConstraints:t})[n]}return{valueControls:n,valueMax:i,valueMin:a,valueNow:o}}function Jp({attributes:e,axisId:t,axisOrientation:n,children:r,className:i,disableCursor:a,disabled:o,disableDoubleClick:s,elementRef:c,id:l,isSharedHitRegion:u,preview:d,registerSeparator:f,requiredStyle:p,style:m,styleDefaults:h,tabIndex:g=0,updateSeparatorProps:_}){let v=Gp({disabled:o,disableDoubleClick:s,children:r,className:i,preview:d,style:m}),[y,b]=(0,z.useState)({}),[x,S]=(0,z.useState)(`inactive`),[C,w]=(0,z.useState)(!1),T=(0,z.useRef)(null),E=(0,z.useRef)(null),D=nf(T,c),O=n===`horizontal`?`vertical`:`horizontal`;ef(()=>{let e=T.current;if(e!==null){let n={disabled:v.disabled,disableDoubleClick:v.disableDoubleClick,element:e,id:l,get children(){return v.children},get className(){return v.className},get preview(){return v.preview},get style(){return v.style}};E.current=n;let r=f(n),i=df(e=>{S(e.next.state!==`inactive`&&e.next.hitRegions.some(e=>e.separator===n||(u?.(e)??!1))?e.next.state:`inactive`)}),a=Xf(t,e=>{let{derivedItemConstraints:t,layout:r,separatorToItems:i}=e.next,a=i.get(n);if(a){let n=a[0],i=t.findIndex(e=>e.itemId===n.id),{layoutStrategy:o}=e.axis;b({...qp({layout:r,itemConstraints:t,itemId:n.id,itemIndex:i}),...o?.getItemAriaControls&&{valueControls:o.getItemAriaControls(n.id)}})}});return()=>{E.current=null,i(),a(),r()}}},[t,l,u,f,v]),ef(()=>{let e=E.current;e&&mf(e)},[d]),(0,z.useEffect)(()=>{_(l,{disabled:o,disableDoubleClick:s})},[o,s,l,_]);let k;o&&!a&&(k=`not-allowed`);let A;if(o)A=`disabled`;else switch(x){case`active`:A=`active`;break;default:A=C?`focus`:x}return(0,B.jsx)(`div`,{...e,"aria-controls":y.valueControls,"aria-disabled":o||void 0,"aria-orientation":O,"aria-valuemax":y.valueMax,"aria-valuemin":y.valueMin,"aria-valuenow":y.valueNow,children:r,className:i,"data-separator":A,"data-testid":l,id:l,onBlur:()=>w(!1),onFocus:()=>w(!0),ref:D,role:`separator`,style:{...h,cursor:k,...m,...p,touchAction:`none`},tabIndex:o?void 0:g})}function Yp(e){for(let t=1;t<e.length;t++)if(Af(e[t-1],e[t])>0)return!1;return!0}function Xp({separator:e}){let{element:t}=e,n=(0,z.useRef)(null);return ef(()=>{let e=t.cloneNode(!0),r=[t,...t.querySelectorAll(`*`)],i=[e,...e.querySelectorAll(`*`)],a=t.ownerDocument.defaultView;return r.forEach((e,t)=>{let n=i[t];if(n instanceof a.HTMLElement||n instanceof a.SVGElement){let t=a.getComputedStyle(e);for(let e=0;e<t.length;e++){let r=t.item(e);n.style.setProperty(r,t.getPropertyValue(r))}}n.removeAttribute(`data-testid`),n.removeAttribute(`id`)}),Object.assign(e.style,{boxSizing:`border-box`,height:`100%`,margin:`0`,position:`static`,transform:`none`,width:`100%`}),n.current.appendChild(e),()=>e.remove()},[t]),(0,B.jsx)(`div`,{ref:n,style:{height:`100%`,opacity:.65,pointerEvents:`none`,width:`100%`}})}function Zp(){let e=(0,z.useContext)(Kp);return J(e,`Group Context not found; did you render a Panel or Separator outside of a Group?`),e}function Qp(e){let{registerOverlay:t}=Zp(),n=(0,z.useRef)(e);Rp(n.current,e)||(n.current=e);let r=n.current;return ef(()=>t(r),[t,r]),null}Qp.displayName=`SeparatorOverlay`;function $p({active:e,orientation:t,style:n,...r}){let i;switch(t){case`horizontal`:i={height:`100%`,minWidth:`1px`};break;case`vertical`:i={minHeight:`1px`,width:`100%`}}return(0,B.jsx)(`div`,{...r,"data-separator-overlay":e?`active`:`inactive`,style:{...i,...n,flexShrink:0,pointerEvents:`none`}})}function em({overlay:e,preview:t}){let{axis:n,offset:r,rect:i,separator:a}=t,o=n.orientation===`horizontal`,s=a?.preview,c=e;return(0,z.isValidElement)(s)&&s.type===Qp&&(c=s.props,s=void 0),s??(c?s=(0,B.jsx)($p,{...c,active:t.active,orientation:n.orientation}):a&&(s=(0,B.jsx)(Xp,{separator:a}))),(0,B.jsx)(`div`,{"aria-hidden":`true`,"data-resize-preview":!0,inert:!0,style:{height:i.height,left:i.left,pointerEvents:`none`,position:`absolute`,top:i.top,transform:o?`translateX(${r}px)`:`translateY(${r}px)`,width:i.width},children:s})}function tm(e){return Array.from(e).sort(Af)}function nm(e,t){let n=(0,z.useRef)({getLayout:()=>({}),setLayout:gf});(0,z.useImperativeHandle)(t,()=>n.current,[]),ef(()=>{Object.assign(n.current,wp({axisId:e}))})}function rm({groupId:e,resizePreviewMode:t}){let[n,r]=(0,z.useState)([]),i=(0,z.useRef)(n);return ef(()=>{let n=n=>{let a=qf(e),o=t===`separator`&&n.state===`active`?n.previews.filter(e=>e.axis===a&&(e.active||!Z(e.offset,0))):[],s=i.current;s.length===o.length&&o.every((e,t)=>e===s[t])||(i.current=o,r(o))};if(t!==`separator`){n(uf());return}let a=df(({next:e})=>n(e));return n(uf()),a},[e,t]),n}function im({children:e,className:t,defaultLayout:n,disableCursor:r,disabled:i,elementRef:a,groupRef:o,id:s,onLayoutChange:c,onLayoutChanged:l,orientation:u=`horizontal`,resizePreviewMode:d=`panel`,resizeTargetMinimumSize:f={coarse:20,fine:10},style:p,...m}){let h=(0,z.useRef)({onLayoutChange:{},onLayoutChanged:{}}),g=tf(e=>{np(h.current.onLayoutChange,e)||(h.current.onLayoutChange=e,c?.(e))}),_=tf((e,t,n)=>{np(h.current.onLayoutChanged,e)||(h.current.onLayoutChanged=e,l?.(e,{isUserInteraction:t,requestedLayout:n}))}),v=$d(s),[y,b]=(0,z.useState)(),x=rm({groupId:v,resizePreviewMode:d}),S=(0,z.useRef)(null),[C,w]=Wp(),T=(0,z.useRef)([]),E=(0,z.useRef)({lastExpandedPanelSizes:{},layouts:{},panels:[],separators:[]}),D=nf(S,a);nm(v,o);let O=tf((e,t)=>{let r=Jf(e);if(r)return{flexGrow:r.layout[t]??1};if(n?.[t])return{flexGrow:n?.[t]}}),k=Gp({defaultLayout:n,disableCursor:r,resizeTargetMinimumSize:f}),A=(0,z.useMemo)(()=>({get disableCursor(){return!!k.disableCursor},getPanelStyles:O,id:v,orientation:u,registerPanel:e=>{let t=E.current;return t.panels=jf(u,[...t.panels,e]),w(),()=>{t.panels=t.panels.filter(t=>t!==e),w()}},registerOverlay:e=>(b(e),()=>{b(void 0)}),registerSeparator:e=>{let t=E.current;return t.separators=jf(u,[...t.separators,e]),w(),()=>{t.separators=t.separators.filter(t=>t!==e),w()}},updatePanelProps:(e,{disabled:t})=>{let n=E.current.panels.find(t=>t.id===e);n&&(n.constraintProps.disabled=t);let r=qf(v),i=Jf(v);r&&i&&Zf(r,{...i,derivedItemConstraints:Uf(r)})},updateSeparatorProps:(e,{disabled:t,disableDoubleClick:n})=>{let r=E.current.separators.find(t=>t.id===e);r&&(r.disabled=t,r.disableDoubleClick=n)}}),[O,v,w,u,k]),ee=(0,z.useRef)(null);return ef(()=>{let e=S.current;if(e===null)return;let t=E.current;t.panels=jf(u,t.panels),t.separators=jf(u,t.separators),T.current=tm([...t.panels.map(({element:e})=>e),...t.separators.map(({element:e})=>e)]);let n;if(k.defaultLayout!==void 0&&Object.keys(k.defaultLayout).length===t.panels.length){n={};for(let e of t.panels){let t=k.defaultLayout[e.id];t!==void 0&&(n[e.id]=t)}}let r={disabled:!!i,element:e,id:v,mutableState:{defaultLayout:n,disableCursor:!!k.disableCursor,expandedItemSizes:E.current.lastExpandedPanelSizes,layouts:E.current.layouts},orientation:u,items:t.panels,resizePreviewMode:d,get resizeTargetMinimumSize(){return k.resizeTargetMinimumSize},separators:t.separators};ee.current=r;let a=Hp(r),{defaultLayoutDeferred:o,derivedItemConstraints:s,layout:c,requestedLayout:l}=Jf(r.id,!0);!o&&s.length>0&&(g(c),_(c,!1,l));let f=Xf(v,e=>{let{defaultLayoutDeferred:t,derivedItemConstraints:n,layout:i,requestedLayout:a}=e.next;if(t||n.length===0)return;Up({derivedItemConstraints:n,axis:r,layout:i,prevLayout:e.prev?.layout,requestedLayout:a});let o=uf(),s=o.state!==`active`||!o.hitRegions.some(e=>e.axis===r);g(i),s&&_(i,e.isUserInteraction,a)});return()=>{ee.current=null,a(),f()}},[i,v,_,g,u,C,d,k]),ef(()=>{Yp(T.current)||w()}),(0,z.useEffect)(()=>{let e=ee.current;e&&(e.mutableState.defaultLayout=n,e.mutableState.disableCursor=!!r)}),(0,B.jsx)(Kp.Provider,{value:A,children:(0,B.jsxs)(`div`,{...m,className:t,"data-group":!0,"data-testid":v,id:v,ref:D,style:{height:`100%`,width:`100%`,overflow:`hidden`,position:d===`separator`?`relative`:void 0,...p,display:`flex`,flexDirection:u===`horizontal`?`row`:`column`,flexWrap:`nowrap`,touchAction:u===`horizontal`?`pan-y`:`pan-x`},children:[e,x.map(e=>(0,B.jsx)(em,{overlay:y,preview:e},e.key))]})})}im.displayName=`Group`;function am(e,t){let{id:n}=Zp(),r=(0,z.useRef)({collapse:_f,expand:_f,getSize:()=>({asPercentage:0,inPixels:0}),isCollapsed:()=>!1,resize:_f});(0,z.useImperativeHandle)(t,()=>r.current,[]),ef(()=>{Object.assign(r.current,xp({axisId:n,itemId:e}))})}function om({children:e,className:t,collapsedSize:n=`0%`,collapsedThreshold:r,collapsible:i=!1,defaultSize:a,disabled:o,elementRef:s,groupResizeBehavior:c=`preserve-relative-size`,id:l,maxSize:u=`100%`,minSize:d=`0%`,onResize:f,panelRef:p,style:m,...h}){let g=!!l,_=$d(l),v=Gp({disabled:o}),y=(0,z.useRef)(null),b=nf(y,s),{getPanelStyles:x,id:S,orientation:C,registerPanel:w,updatePanelProps:T}=Zp(),E=f!==null,D=tf((e,t,n)=>{f?.(e,l,n)});ef(()=>{let e=y.current;if(e!==null){let t={element:e,id:_,idIsStable:g,mutableValues:{expandToSize:void 0,prevSize:void 0},onResize:E?D:void 0,constraintProps:{groupResizeBehavior:c,collapsedSize:n,collapsedThreshold:r,collapsible:i,defaultSize:a,disabled:v.disabled,maxSize:u,minSize:d}};return w(t)}},[c,n,r,i,a,E,_,g,u,d,D,w,v]),(0,z.useEffect)(()=>{T(_,{disabled:o})},[o,_,T]),am(_,p);let O=()=>{let e=x(S,_);if(e)return JSON.stringify(e)},k=(0,z.useSyncExternalStore)(e=>Xf(S,e),O,O),A;return A=k?JSON.parse(k):a===void 0?{flexGrow:1}:{flexGrow:void 0,flexShrink:void 0,flexBasis:a},(0,B.jsx)(`div`,{...h,"data-disabled":o||void 0,"data-panel":!0,"data-testid":_,id:_,ref:b,style:{...sm,display:`flex`,flexBasis:0,flexShrink:1,overflow:`visible`,...A},children:(0,B.jsx)(`div`,{className:t,style:{maxHeight:`100%`,maxWidth:`100%`,flexGrow:1,overflow:`auto`,...m,touchAction:C===`horizontal`?`pan-y`:`pan-x`},children:e})})}om.displayName=`Panel`;var sm={minHeight:0,maxHeight:`100%`,height:`auto`,minWidth:0,maxWidth:`100%`,width:`auto`,border:`none`,borderWidth:0,padding:0,margin:0},cm={flexBasis:`auto`},lm={flexGrow:0,flexShrink:0};function um({children:e,className:t,disabled:n,disableDoubleClick:r,elementRef:i,id:a,preview:o,style:s,...c}){let l=$d(a),{disableCursor:u,id:d,orientation:f,registerSeparator:p,updateSeparatorProps:m}=Zp();return(0,B.jsx)(Jp,{attributes:c,axisId:d,axisOrientation:f,className:t,disableCursor:u,disabled:n,disableDoubleClick:r,elementRef:i,id:l,preview:o,registerSeparator:p,requiredStyle:lm,style:s,styleDefaults:cm,updateSeparatorProps:m,children:e})}um.displayName=`Separator`;var dm=6,fm=320,pm=.9;function mm(e){return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)}function hm(){return Math.min(fm,Math.floor(window.innerWidth*pm))}function gm(e,t){let n=e.indexOf(`#`),r=n===-1?e:e.slice(0,n),i=n===-1?``:e.slice(n);return`${r}${r.includes(`?`)?`&`:`?`}t=${t}${i}`}function _m(e,t){let n=null;try{n=e.contentDocument}catch{return}n&&n.addEventListener(`keydown`,e=>{e.key!==`Escape`||e.defaultPrevented||n.querySelector(`.VPLocalSearchBox, [role="dialog"][aria-modal="true"]`)||t()})}function vm(){let{isOpen:e,target:t,close:n}=E(),{theme:r}=Tt(),i=(0,z.useSyncExternalStore)(mm,hm),a=(0,z.useRef)(null),[o,s]=(0,z.useState)(null),c=(0,z.useRef)(null),l=(0,z.useCallback)(e=>{if(c.current?.disconnect(),c.current=null,!e){document.documentElement.style.setProperty(`--docs-inset`,`0px`);return}let t=()=>document.documentElement.style.setProperty(`--docs-inset`,`${e.getBoundingClientRect().width+dm}px`),n=new ResizeObserver(t);n.observe(e),t(),c.current=n},[]);(0,z.useEffect)(()=>{if(!e){a.current=null,s(null);return}let n=t.path,i=a.current;i&&i.path===n&&i.theme===r||(a.current={kind:`site`,path:n,theme:r},s(gm(n,r)))},[e,t,r]);let u=t.source===`reference`?`Reference`:`Guide`;return(0,B.jsx)(Zd,{open:e,modal:!1,disablePointerDismissal:!0,onOpenChange:e=>{e||n()},children:(0,B.jsx)(Wd,{children:(0,B.jsx)(Ud,{"data-slot":`docs-panel`,className:`pointer-events-none fixed inset-0 z-[60]`,children:(0,B.jsxs)(im,{orientation:`horizontal`,className:`h-full w-full`,children:[(0,B.jsx)(om,{minSize:`10%`,className:`pointer-events-none`}),(0,B.jsx)(um,{"aria-label":`Resize docs panel`,className:`pointer-events-auto w-1.5 cursor-col-resize bg-border/60 transition-colors hover:bg-primary/50 data-dragging:bg-primary/50`}),(0,B.jsx)(om,{defaultSize:576,minSize:i,maxSize:`90vw`,className:`pointer-events-auto`,children:(0,B.jsxs)(`div`,{ref:l,className:`flex h-full flex-col border-l border-border bg-popover text-sm text-popover-foreground shadow-lg`,children:[(0,B.jsxs)(`div`,{className:`flex items-center justify-between border-b border-border p-4`,children:[(0,B.jsx)(Qd,{className:`font-heading text-base font-medium text-foreground`,children:u}),(0,B.jsxs)(kd,{render:(0,B.jsx)(R,{variant:`ghost`,size:`icon-sm`}),children:[(0,B.jsx)(Rn,{"aria-hidden":`true`}),(0,B.jsx)(`span`,{className:`sr-only`,children:`Close`})]})]}),(0,B.jsx)(`iframe`,{src:o??void 0,title:u,className:`w-full flex-1 border-0`,onLoad:e=>_m(e.currentTarget,n)})]})})]})})})})}function ym({className:e,...t}){return(0,B.jsx)(`div`,{"data-slot":`table-container`,className:`relative w-full overflow-x-auto rounded-sm outline-none focus-visible:ring-2 focus-visible:ring-accent`,tabIndex:0,children:(0,B.jsx)(`table`,{"data-slot":`table`,className:N(`w-full caption-bottom text-sm`,e),...t})})}function bm({className:e,...t}){return(0,B.jsx)(`thead`,{"data-slot":`table-header`,className:N(`[&_tr]:border-b`,e),...t})}function xm({className:e,...t}){return(0,B.jsx)(`tbody`,{"data-slot":`table-body`,className:N(`[&_tr:last-child]:border-0`,e),...t})}function Sm({className:e,...t}){return(0,B.jsx)(`tr`,{"data-slot":`table-row`,className:N(`border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted`,e),...t})}function Q({className:e,...t}){return(0,B.jsx)(`th`,{"data-slot":`table-head`,className:N(`h-10 px-2 text-left align-middle font-mono text-xs font-medium tracking-[.06em] uppercase whitespace-nowrap text-muted-foreground [&:has([role=checkbox])]:pr-0`,e),...t})}function $({className:e,...t}){return(0,B.jsx)(`td`,{"data-slot":`table-cell`,className:N(`p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0`,e),...t})}function Cm({className:e,...t}){return(0,B.jsx)(`caption`,{"data-slot":`table-caption`,className:N(`mt-4 text-sm text-muted-foreground`,e),...t})}function wm({className:e,size:t=`default`,...n}){return(0,B.jsx)(`div`,{"data-slot":`card`,"data-size":t,className:N(`group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground ring-1 ring-border [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl`,e),...n})}function Tm({className:e,...t}){return(0,B.jsx)(`div`,{"data-slot":`card-content`,className:N(`px-(--card-spacing)`,e),...t})}var Em=(0,z.createContext)(null),Dm=(0,z.createContext)(null),Om=(0,z.createContext)(null),km=(0,z.createContext)(null);function Am({children:e,registerWidget:t,registerFindingAnchor:n,reportWidgetOpen:r,clearRouteFocus:i,focusedWidgetId:a,activeRouteTarget:o,flashedFinding:s}){let c=(0,z.useMemo)(()=>({registerWidget:t,registerFindingAnchor:n,reportWidgetOpen:r,clearRouteFocus:i}),[t,n,r,i]);return(0,B.jsx)(Em.Provider,{value:c,children:(0,B.jsx)(Dm.Provider,{value:a,children:(0,B.jsx)(Om.Provider,{value:o,children:(0,B.jsx)(km.Provider,{value:s,children:e})})})})}function jm(){return(0,z.useContext)(Em)}function Mm(){return(0,z.useContext)(Dm)}function Nm(){return(0,z.useContext)(Om)}function Pm(){return(0,z.useContext)(km)}var Fm=(0,z.createContext)(null);function Im(){return(0,z.useContext)(Fm)}function Lm({children:e,className:t}){return(0,B.jsx)(`div`,{className:N(`grid grid-cols-[repeat(auto-fit,minmax(320px,1fr))] gap-4`,t),children:e})}function Rm({cardId:e,widgetId:t,children:n,className:r,collapsedTile:i=!1}){let a=jm(),o=Mm(),[s,c]=(0,z.useState)(0),[l,u]=(0,z.useState)(!1),d=(0,z.useRef)(null),f=(0,z.useRef)(null),p=(0,z.useMemo)(()=>({openRequestGeneration:s,reportOpen:e=>{u(e),t&&a?.reportWidgetOpen(t,e)},setDisclosureButton:e=>{f.current=e},onDisclosureBlur:()=>{t&&a?.clearRouteFocus(t)},routeFocused:t?o===t:!1,collapsedTile:i}),[a,s,t,o,i]);return(0,z.useLayoutEffect)(()=>{if(a&&t&&d.current)return a.registerWidget(t,{wrapperElement:d.current,open:()=>{c(e=>e+1)},getDisclosureButton:()=>f.current})},[a,t]),(0,B.jsx)(Fm.Provider,{value:p,children:(0,B.jsx)(`div`,{ref:d,"data-testid":`widget-grid-item-${e}`,className:N(`empty:hidden`,t&&`scroll-mt-20`,l&&`col-span-full`,r),children:n})})}function zm({children:e}){return(0,B.jsx)(Fm.Provider,{value:null,children:e})}function Bm({title:e,subtitle:t,impactBand:n,badges:r,statusBadge:i,summary:a,defaultCollapsed:o=!1,collapsible:s=!0,open:c,onOpenChange:u,compact:d=!1,routeFocused:f,disclosureButtonRef:p,fixFor:m=[],children:h,id:g}){let _=[...new Set(m.map(D).filter(e=>e!==void 0))],v=(0,B.jsxs)(B.Fragment,{children:[_.length>0?(0,B.jsx)(`div`,{className:`mb-3 space-y-1 text-sm`,children:_.map(e=>(0,B.jsx)(`p`,{children:e},e))}):null,h]}),y=Im(),b=(0,z.useRef)(null),S=y?.collapsedTile??!1,[C,w]=(0,z.useState)(!S&&!o),T=c??C,E=f??y?.routeFocused??!1,[O,k]=(0,z.useState)(E),A=(0,z.useRef)(0);(0,z.useLayoutEffect)(()=>{y?.reportOpen(T)},[y,T]),(0,z.useLayoutEffect)(()=>{let e=y?.openRequestGeneration??0;e!==0&&e!==A.current&&(A.current=e,T||(c===void 0?w(!0):u?.(!0)))},[c,y?.openRequestGeneration,u,T]),(0,z.useLayoutEffect)(()=>{k(E)},[E]);let ee=e=>{c===void 0?w(e):u?.(e)},te=(0,B.jsxs)(`div`,{className:`flex flex-col gap-2 px-(--card-spacing) sm:flex-row sm:flex-wrap sm:items-center sm:justify-between`,children:[s?(0,B.jsxs)(de,{ref:e=>{y?.setDisclosureButton(e),typeof p==`function`?p(e):p&&(p.current=e)},"aria-expanded":String(T),"data-route-focused":O?``:void 0,className:N(`tap-target-comfortable tap-target-comfortable--sm flex min-w-0 cursor-pointer items-center gap-2 bg-transparent text-left sm:flex-1`,O&&`border-ring ring-[3px] ring-ring/50 focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50`),onBlur:e=>{e.relatedTarget&&b.current?.contains(e.relatedTarget)||(k(!1),y?.onDisclosureBlur())},children:[(0,B.jsx)(`h3`,{className:`font-heading text-sm leading-snug font-semibold`,children:e}),T?(0,B.jsx)(he,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`}):(0,B.jsx)(_e,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`})]}):(0,B.jsx)(`h3`,{className:`min-w-0 font-heading text-sm leading-snug font-semibold sm:flex-1`,children:e}),r||T&&i?(0,B.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center gap-1`,children:[r,T?i:null]}):null,t?(0,B.jsx)(`p`,{className:`w-full basis-full font-mono text-xs text-muted-foreground sm:-mt-1.5`,children:t}):null]}),j=(0,B.jsx)(zm,{children:(0,B.jsx)(Tm,{children:v})});return(0,B.jsx)(wm,{ref:b,id:g,size:d?`sm`:`default`,className:N(n?N(`border-l-[3px]`,ne[n]):`border-l-0`,S&&`h-full`,S&&!T&&`min-h-[6.5rem]`),children:s?(0,B.jsxs)(l,{open:T,onOpenChange:ee,children:[te,a&&!T?(0,B.jsx)(`div`,{className:`px-(--card-spacing) pb-(--card-spacing)`,children:a}):null,(0,B.jsx)(zm,{children:(0,B.jsx)(x,{keepMounted:!0,children:(0,B.jsx)(ve.Provider,{value:T,children:(0,B.jsx)(Tm,{children:v})})})})]}):(0,B.jsxs)(B.Fragment,{children:[te,j]})})}function Vm(){return(0,B.jsx)(wm,{"aria-hidden":`true`,children:(0,B.jsx)(Tm,{children:(0,B.jsx)(`div`,{className:`h-5 w-1/3 animate-pulse rounded-md bg-muted motion-reduce:animate-none`})})})}var Hm=Gu;function Um(e){return e.baseline!=null&&e.candidate!=null}function Wm(e){return e.withinNoise===void 0?e.baseline===0?e.candidate!==0:Math.abs(e.candidate-e.baseline)/Math.abs(e.baseline)>=Hm:!e.withinNoise}var Gm=e=>`${Math.round(Math.abs(e)*100)}%`,Km=e=>`×${e.toFixed(2)}`;function qm(e){let{wallClockBridge:t,noiseBand:n}=e,r=e=>e!=null&&Math.abs(e-1)>=n,i=[],{meanExecutors:a,taskTime:o,taskShareOfAllocation:s}=t;return r(a.ratio)&&i.push(`executors averaged ${a.baseline.toFixed(1)} in the baseline and ${a.candidate.toFixed(1)} in the candidate`),r(o.ratio)&&i.push(`task time was ${y(o.baseline)} in the baseline and ${y(o.candidate)} in the candidate`),r(s.ratio)&&i.push(`task time filled ${Gm(s.baseline)} of allocated core time in the baseline and ${Gm(s.candidate)} in the candidate`),i}function Jm({wallClockBridge:e}){let{wallClock:t,taskTime:n,meanExecutors:r,taskShareOfAllocation:i}=e;return t.ratio==null||n.ratio==null||r.ratio==null||i.ratio==null?null:`Candidate over baseline: wall clock ${Km(t.ratio)} is task time ${Km(n.ratio)} divided by mean executors ${Km(r.ratio)} times task time's share of allocated core time ${Km(i.ratio)}.`}function Ym({conf:e,plan:t}){return e.equal===!0&&t.equal}function Xm(e,t){if(!Wm(e))return[];let n=e.candidate>e.baseline;return t.filter(e=>e.key===`executorRunTime`||e.key===`allocatedCoreHours`).filter(Um).filter(e=>e.baseline>0&&Wm(e)&&e.candidate>e.baseline!==n).map(e=>`${e.label.toLowerCase()} is ${Gm((e.candidate-e.baseline)/e.baseline)} ${e.candidate<e.baseline?`lower`:`higher`}`)}function Zm(e){let t=ee(e);return re[t]?.expansion??t}function Qm(e){let t=new Map;for(let n of[...e.introduced,...e.resolved]){let e=Zm(n.type);t.set(e,(t.get(e)??0)+n.candCount-n.baseCount)}return t}function $m(e,t){return[...e].filter(([,e])=>t(e)).map(([e])=>e)}function eh(e,{failedJobs:t,totalJobs:n}){return t<n?`The ${e} had ${t} of ${n} jobs fail`:n===1?`The ${e}'s only job failed`:`All ${n} of the ${e}'s jobs failed`}function th({failedJobs:e,totalJobs:t}){return e===0?`none`:e<t?`${e} of ${t}`:t===1?`its only job failed`:`all ${t} failed`}function nh(e,t){if(e.failedJobs===0&&t.failedJobs===0)return null;let n=t.failedJobs>e.failedJobs?`worse`:t.failedJobs<e.failedJobs?`better`:`same`;return t.failedJobs===0?{title:`${eh(`baseline`,e)}; the candidate completed`,tone:n}:{title:`${eh(`candidate`,t)} (baseline: ${th(e)})`,tone:n}}function rh(e,t,n,r){let i=e.find(e=>e.key===`wallClock`),a=`Run time could not be compared between the baseline and the candidate`,o=`unknown`,s=n?[`baseline`,`candidate`].filter(e=>n[e].incomplete):[];if(i&&i.baseline!=null&&i.baseline>0&&i.candidate!=null&&s.length>0){let e=i.candidate-i.baseline;a=Math.abs(e/i.baseline)<Hm?`The candidate's log covers about as much run time as the baseline's`:`The candidate's log covers ${y(Math.abs(e))} ${e<0?`less`:`more`} run time than the baseline's`}else if(i&&i.baseline!=null&&i.baseline>0&&i.candidate!=null){let e=i.candidate-i.baseline,t=e/i.baseline;if(!Wm({...i,baseline:i.baseline,candidate:i.candidate}))a=`The candidate took about as long as the baseline`,o=`same`;else{let n=e<0;a=`The candidate finished ${y(Math.abs(e))} ${n?`faster`:`slower`} than the baseline (${Math.round(Math.abs(t)*100)}%)`,o=n?`better`:`worse`}}let c=[],l=n?nh(n.baseline,n.candidate):null;if(r&&!l&&s.length===0&&i&&Um(i)&&i.baseline>0){let t=i.candidate-i.baseline,n=Wm(i)?`Time differs by ${y(Math.abs(t))} (${Gm(t/i.baseline)})`:`The candidate took about as long as the baseline`;if(Ym(r)&&r.volume.equal!==!1){let e=r.volume.equal===!0,t=Wm(i),s=t?qm(r):[];a=`${e?`Same configuration, plan and output`:`Same configuration and plan. Output was not compared`}. ${n}${s.length>0?`: ${s.join(`, `)}`:t?`, and no measured factor explains it`:``}.`,e&&(!t||s.length>0)&&(o=`equivalent`);let l=t?Jm(r):null;l&&c.push(l)}else{let n=Xm(i,e);n.length>0&&(a=`The candidate finished ${y(Math.abs(t))} ${t<0?`faster`:`slower`} than the baseline (${Gm(t/i.baseline)}), while ${n.join(` and `)}`,o=`mixed`)}}let u=e.filter(e=>e.key!==`wallClock`&&!Uu.has(e.key)).filter(Um),d=u.filter(Wm),f=d.filter(e=>e.direction===`regression`).map(e=>e.label),p=d.filter(e=>e.direction===`improvement`).map(e=>e.label);l&&(c.push(`${a}.`),a=l.title,o=l.tone),s.length===2?c.push(`Neither log has an end-of-run record, so their times cover only what each log captured, not how long the runs took.`):s.length===1&&c.push(`The ${s[0]}'s log has no end-of-run record, so its time covers only what the log captured, not how long the run took.`),f.length>0&&c.push(`Worse in the candidate: ${f.join(`, `)}.`),p.length>0&&c.push(`Better in the candidate: ${p.join(`, `)}.`),u.length>0&&f.length===0&&p.length===0&&c.push(`Other measured cost metrics look about the same.`);let m=Qm(t),h=$m(m,e=>e>0),g=$m(m,e=>e<0);h.length>0&&c.push(`New or more frequent in the candidate: ${h.join(`, `)}.`),g.length>0&&c.push(`Less frequent in the candidate: ${g.join(`, `)}.`);let _=[...new Set((t.changed??[]).filter(Pu).map(e=>Zm(e.type)))];return _.length>0&&c.push(`More severe in the candidate: ${_.join(`, `)}.`),{title:a,tone:o,sentences:c}}function ih({...e}){return(0,B.jsx)(Zd,{"data-slot":`dialog`,...e})}function ah({...e}){return(0,B.jsx)(Wd,{"data-slot":`dialog-portal`,...e})}function oh({className:e,...t}){return(0,B.jsx)(Od,{"data-slot":`dialog-overlay`,className:N(`fixed inset-0 isolate z-50 bg-(--overlay-scrim) duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0 motion-reduce:animate-none`,e),...t})}function sh({className:e,children:t,showCloseButton:n=!0,...r}){return(0,B.jsxs)(ah,{children:[(0,B.jsx)(oh,{}),(0,B.jsxs)(Ud,{"data-slot":`dialog-content`,className:N(`fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 motion-reduce:animate-none`,e),...r,children:[t,n&&(0,B.jsxs)(kd,{"data-slot":`dialog-close`,render:(0,B.jsx)(R,{variant:`ghost`,className:`absolute top-2 right-2`,size:`icon-sm`}),children:[(0,B.jsx)(Rn,{}),(0,B.jsx)(`span`,{className:`sr-only`,children:`Close`})]})]})]})}function ch({className:e,...t}){return(0,B.jsx)(`div`,{"data-slot":`dialog-header`,className:N(`flex flex-col gap-2`,e),...t})}function lh({className:e,showCloseButton:t=!1,children:n,...r}){return(0,B.jsxs)(`div`,{"data-slot":`dialog-footer`,className:N(`-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end`,e),...r,children:[n,t&&(0,B.jsx)(kd,{render:(0,B.jsx)(R,{variant:`outline`}),children:`Close`})]})}function uh({className:e,...t}){return(0,B.jsx)(Qd,{"data-slot":`dialog-title`,className:N(`font-heading text-base leading-none font-medium`,e),...t})}function dh({className:e,...t}){return(0,B.jsx)(Ad,{"data-slot":`dialog-description`,className:N(`text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground`,e),...t})}var fh=e=>String(e),ph=[{key:`duration`,label:`Duration`,fmt:y},{key:`executorRunTime`,label:`Executor run-time`,fmt:y},{key:`jvmGCTime`,label:`GC time`,fmt:y},{key:`memoryBytesSpilled`,label:`Memory spill`,fmt:p},{key:`diskBytesSpilled`,label:`Disk spill`,fmt:p},{key:`inputBytes`,label:`Input read`,fmt:p},{key:`outputBytes`,label:`Output written`,fmt:p},{key:`taskCount`,label:`Task count`,fmt:fh},{key:`failedTasks`,label:`Failed tasks`,fmt:fh}];function mh(e,t){return e==null?`—`:t(e)}function hh({base:e,cand:t,fmt:n}){if(e==null||t==null)return(0,B.jsx)($,{className:`text-muted-foreground`,children:`—`});let r=t-e,i=r===0?`unchanged`:(r<0?`-`:`+`)+n(Math.abs(r));return(0,B.jsx)($,{className:N(`font-medium`,r===0?`text-muted-foreground`:r<0?`text-clean`:`text-critical`),children:i})}function gh({base:e,cand:t}){return(0,B.jsxs)(ym,{className:`trace-table`,children:[(0,B.jsx)(bm,{children:(0,B.jsxs)(Sm,{children:[(0,B.jsx)(Q,{className:`text-left`,children:`Metric`}),(0,B.jsx)(Q,{children:`Baseline`}),(0,B.jsx)(Q,{children:`Candidate`}),(0,B.jsx)(Q,{children:`Δ`})]})}),(0,B.jsx)(xm,{children:ph.map(n=>(0,B.jsxs)(Sm,{"aria-label":n.label,children:[(0,B.jsx)(Q,{scope:`row`,className:`text-left`,children:n.label}),(0,B.jsx)($,{children:mh(e.metrics[n.key],n.fmt)}),(0,B.jsx)($,{children:mh(t.metrics[n.key],n.fmt)}),(0,B.jsx)(hh,{base:e.metrics[n.key],cand:t.metrics[n.key],fmt:n.fmt})]},n.key))})]})}var _h=`pin-pair-hint`;function vh({baseStages:e,candStages:t}){let[n,r]=(0,z.useState)(``),[i,a]=(0,z.useState)(``),[o,s]=(0,z.useState)([]);if(e.length===0||t.length===0)return null;let c=t=>e.find(e=>e.id===t),l=e=>t.find(t=>t.id===e),u=()=>{n!==``&&i!==``&&s(e=>[...e,{baseId:Number(n),candId:Number(i)}])},d=n===``||i===``,f=e=>s(t=>t.filter((t,n)=>n!==e));return(0,B.jsxs)(Bm,{title:`Pinned per-stage deltas`,children:[(0,B.jsx)(`p`,{className:`mb-3 text-xs text-muted-foreground`,children:`Pick one stage from each run to compare directly. Pairs are chosen by you: no automatic matching.`}),(0,B.jsxs)(`div`,{className:`mb-4 flex flex-wrap items-end gap-3`,children:[(0,B.jsxs)(`label`,{className:`flex max-w-full min-w-0 flex-col gap-1 text-xs text-muted-foreground`,children:[`Baseline stage`,(0,B.jsxs)(`select`,{className:`comparison-select max-w-full px-2 py-1 text-sm text-foreground`,value:n,onChange:e=>r(e.target.value),children:[(0,B.jsx)(`option`,{value:``,children:`Select…`}),e.map(e=>(0,B.jsx)(`option`,{value:String(e.id),children:e.name},e.id))]})]}),(0,B.jsxs)(`label`,{className:`flex max-w-full min-w-0 flex-col gap-1 text-xs text-muted-foreground`,children:[`Candidate stage`,(0,B.jsxs)(`select`,{className:`comparison-select max-w-full px-2 py-1 text-sm text-foreground`,value:i,onChange:e=>a(e.target.value),children:[(0,B.jsx)(`option`,{value:``,children:`Select…`}),t.map(e=>(0,B.jsx)(`option`,{value:String(e.id),children:e.name},e.id))]})]}),(0,B.jsx)(R,{type:`button`,size:`sm`,disabled:d,"aria-describedby":d?_h:void 0,onClick:u,children:`Pin pair`}),d?(0,B.jsx)(`span`,{id:_h,className:`pb-1 text-xs text-muted-foreground`,children:`Pick one stage from each run`}):null]}),(0,B.jsx)(`div`,{className:`flex flex-col gap-4`,children:o.map((e,t)=>{let n=c(e.baseId),r=l(e.candId);return!n||!r?null:(0,B.jsxs)(`div`,{className:`comparison-subpanel p-3`,children:[(0,B.jsxs)(`div`,{className:`mb-2 flex items-center justify-between gap-2`,children:[(0,B.jsxs)(`span`,{className:`text-sm font-medium`,children:[n.name,` → `,r.name]}),(0,B.jsx)(R,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>f(t),children:`Remove`})]}),(0,B.jsx)(gh,{base:n,cand:r})]},t)})})]})}var yh=25,bh=50,xh=[{label:`Run time`,metrics:[`executorRunTime`],fmt:y},{label:`CPU time`,metrics:[`executorCpuTime`],fmt:y},{label:`Spill`,metrics:[`memoryBytesSpilled`,`diskBytesSpilled`],fmt:p},{label:`Input`,metrics:[`inputBytes`],fmt:p,neutral:!0},{label:`Output`,metrics:[`outputBytes`],fmt:p,neutral:!0},{label:`Shuffle`,metrics:[`shuffleReadBytes`,`shuffleWriteBytes`],fmt:p}],Sh={exact:`Same plan and details in both runs.`,structural:`Same plan shape; details such as literals or paths differ.`,aligned:`Different plan shape, paired by similarity or position. The two stages may not be the same work.`};function Ch(e,t){let n=null;for(let r of t){let t=e[r].delta;t!=null&&(n=(n??0)+t)}return n}function wh({value:e,column:t}){if(e==null)return(0,B.jsx)($,{className:`text-muted-foreground`,children:`—`});let n=e===0?`unchanged`:(e<0?`-`:`+`)+t.fmt(Math.abs(e)),r=e===0||t.neutral?`text-muted-foreground`:e<0?`text-clean`:`text-critical`;return(0,B.jsx)($,{className:N(`font-medium`,r),children:n})}var Th=`cursor-pointer rounded text-left text-xs underline-offset-2 hover:underline focus-visible:ring-[3px] focus-visible:ring-ring/50 outline-none`;function Eh({label:e,deltas:t}){let n=t.executorRunTime;return(0,B.jsxs)(`span`,{children:[e,`: `,n.baseline==null?`—`:y(n.baseline),` → `,n.candidate==null?`—`:y(n.candidate)]})}function Dh({model:e,baselineLabel:t,candidateLabel:n,onOpenStage:r}){let[i,a]=(0,z.useState)(yh),[o,s]=(0,z.useState)(null),c=(e,t)=>e?.find(e=>e.id===t)?.name,l=[...e.stagePairs].sort((e,t)=>Math.abs(t.deltas.executorRunTime.delta??0)-Math.abs(e.deltas.executorRunTime.delta??0)||e.pairId.localeCompare(t.pairId)),u=e.unmatched,d=u.baseStageIds.length+u.candStageIds.length>0;return l.length===0&&e.replanned.length===0&&!d?null:(0,B.jsxs)(Bm,{title:`Stages compared`,children:[l.length===0?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:Ah(e.replanned.length>0,d)}),(0,B.jsx)(jh,{baseStages:e.baseStages??[],candStages:e.candStages??[],onPick:(t,n)=>s({title:`${Oh(e.baseStages,t)} → ${Oh(e.candStages,n)}`,note:`Stages you picked yourself; the two runs did not pair them.`,baseStageIds:[t],candStageIds:[n]})})]}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`p`,{className:`mb-3 text-xs text-muted-foreground`,children:`Change from baseline to candidate, largest run-time change first. Under each stage, quality says how the pair was matched and score is how alike they are, from 0 to 1. Select a stage to see both runs side by side.`}),(0,B.jsxs)(ym,{className:`trace-table`,children:[(0,B.jsx)(bm,{children:(0,B.jsxs)(Sm,{children:[(0,B.jsx)(Q,{className:`text-left`,children:`Stage`}),xh.map(e=>(0,B.jsx)(Q,{children:e.label},e.label))]})}),(0,B.jsx)(xm,{children:l.slice(0,i).map(t=>{let n=c(e.baseStages,t.baseStageIds[0])??`Stage ${t.baseStageIds[0]}`;return(0,B.jsxs)(Sm,{"data-testid":`stage-pair-row`,"data-quality":t.quality,children:[(0,B.jsxs)(Q,{scope:`row`,className:`text-left`,children:[(0,B.jsx)(`button`,{type:`button`,className:N(Th,`block max-w-[22rem] truncate text-sm font-medium`),title:n,"aria-label":`Compare ${n} in both runs`,onClick:()=>s({title:n,note:`${t.quality} match, score ${t.score.toFixed(2)}. ${Sh[t.quality]}`,baseStageIds:t.baseStageIds,candStageIds:t.candStageIds}),children:n}),(0,B.jsxs)(`div`,{className:`stage-pair-meta mt-0.5`,title:Sh[t.quality],children:[t.quality,` · `,t.score.toFixed(2)]})]}),xh.map(e=>(0,B.jsx)(wh,{value:Ch(t.deltas,e.metrics),column:e},e.label))]},t.pairId)})})]}),l.length>i?(0,B.jsxs)(R,{variant:`ghost`,size:`sm`,className:`mt-2`,onClick:()=>a(e=>e+bh),children:[`Show `,Math.min(bh,l.length-i),` more of `,l.length-i,` remaining`]}):null]}),e.replanned.length>0?(0,B.jsxs)(`div`,{className:`mt-4`,"data-testid":`replanned-stages`,children:[(0,B.jsx)(`h4`,{className:`trace-eyebrow mb-1`,children:`Re-planned work`}),(0,B.jsx)(`p`,{className:`mb-2 text-xs text-muted-foreground`,children:`These queries ran a different number of stages, so the leftover stages are compared as a group rather than one by one.`}),(0,B.jsx)(`ul`,{className:`flex flex-col gap-2`,children:e.replanned.map(t=>(0,B.jsxs)(`li`,{className:`border-b border-border pb-2 text-sm last:border-0`,children:[(0,B.jsxs)(`div`,{className:`flex flex-wrap gap-x-4 font-mono text-xs text-muted-foreground`,children:[(0,B.jsxs)(`span`,{children:[`Query `,t.baseExecutionId,` → `,t.candExecutionId]}),(0,B.jsx)(Eh,{label:`Run time`,deltas:t.deltas})]}),(0,B.jsxs)(`button`,{type:`button`,className:N(Th,`mt-1`),onClick:()=>s({title:`Re-planned query ${t.baseExecutionId} → ${t.candExecutionId}`,note:`The two runs ran a different number of stages here, so these leftover stages are not paired one to one.`,baseStageIds:t.baseStageIds,candStageIds:t.candStageIds}),children:[`Baseline `,kh(t.baseStageIds,e.baseStages),` · Candidate `,kh(t.candStageIds,e.candStages)]})]},`${t.baseExecutionId}-${t.candExecutionId}`))})]}):null,d?(0,B.jsxs)(`div`,{className:`mt-4`,"data-testid":`unmatched-stages`,children:[(0,B.jsx)(`h4`,{className:`trace-eyebrow mb-1`,children:`Unmatched stages`}),(0,B.jsxs)(`button`,{type:`button`,className:Th,onClick:()=>s({title:`Unmatched stages`,note:`These stages paired with nothing in the other run.`,baseStageIds:u.baseStageIds,candStageIds:u.candStageIds}),children:[`Baseline `,kh(u.baseStageIds,e.baseStages),` · Candidate `,kh(u.candStageIds,e.candStages)]})]}):null,(0,B.jsx)(Nh,{selection:o,baseStages:e.baseStages??[],candStages:e.candStages??[],baselineLabel:t,candidateLabel:n,onClose:()=>s(null),onOpenStage:r})]})}var Oh=(e,t)=>{let n=e?.find(e=>e.id===t)?.name;return n?`${n} (${t})`:`Stage ${t}`},kh=(e,t)=>e.length===0?`none`:e.map(e=>Oh(t,e)).join(`, `),Ah=(e,t)=>e&&t?`No stages are paired: some queries ran a different number of stages in each run, and the other stages match nothing in the other run.`:e?`No stages are paired: the queries ran a different number of stages in each run, and none of their stages match.`:`No stages are paired: no stage in one run matches a stage in the other.`;function jh({baseStages:e,candStages:t,onPick:n}){let[r,i]=(0,z.useState)(``),[a,o]=(0,z.useState)(``);if(e.length===0||t.length===0)return null;let s=(e,t,n,r)=>(0,B.jsxs)(`label`,{className:`flex max-w-full min-w-0 flex-col gap-1 text-xs text-muted-foreground`,children:[e,(0,B.jsxs)(`select`,{className:`comparison-select max-w-full px-2 py-1 text-sm text-foreground`,value:t,onChange:e=>n(e.target.value),children:[(0,B.jsx)(`option`,{value:``,children:`Select…`}),r.map(e=>(0,B.jsx)(`option`,{value:String(e.id),children:`Stage ${e.id} · ${e.name}`},e.id))]})]});return(0,B.jsxs)(`div`,{className:`mt-3`,role:`group`,"aria-label":`Pick a stage pair`,"data-testid":`stage-picker`,children:[(0,B.jsx)(`h4`,{className:`trace-eyebrow mb-2`,children:`Pick a stage pair`}),(0,B.jsxs)(`div`,{className:`flex flex-wrap items-end gap-3`,children:[s(`Baseline stage`,r,i,e),s(`Candidate stage`,a,o,t),(0,B.jsx)(R,{type:`button`,size:`sm`,disabled:r===``||a===``,onClick:()=>n(Number(r),Number(a)),children:`Compare pair`})]})]})}var Mh={id:-1,name:`—`,metrics:{duration:null,memoryBytesSpilled:null,diskBytesSpilled:null,jvmGCTime:null,inputBytes:null,outputBytes:null,executorRunTime:null,taskCount:null,failedTasks:null}};function Nh({selection:e,baseStages:t,candStages:n,baselineLabel:r,candidateLabel:i,onClose:a,onOpenStage:o}){let s=(e,t)=>e.find(e=>e.id===t)??Mh,c=e?Array.from({length:Math.max(e.baseStageIds.length,e.candStageIds.length)},(t,n)=>({baseId:e.baseStageIds[n],candId:e.candStageIds[n]})):[];return(0,B.jsx)(ih,{open:e!==null,onOpenChange:e=>{e||a()},children:(0,B.jsx)(sh,{className:`max-h-[85vh] overflow-y-auto sm:max-w-5xl`,"data-testid":`stage-pair-dialog`,children:e?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(ch,{children:[(0,B.jsx)(uh,{className:`[overflow-wrap:anywhere]`,children:e.title}),e.note?(0,B.jsx)(dh,{children:e.note}):null]}),(0,B.jsx)(`div`,{className:`flex flex-col gap-4`,children:c.map(({baseId:e,candId:a},c)=>{let l=s(t,e),u=s(n,a);return(0,B.jsxs)(`section`,{"aria-label":`Stage ${e??`none`} and stage ${a??`none`}`,className:`comparison-subpanel p-3`,children:[(0,B.jsxs)(`div`,{className:`mb-2 grid gap-2 text-xs sm:grid-cols-2`,children:[(0,B.jsxs)(`div`,{title:r,children:[(0,B.jsxs)(`div`,{className:`font-semibold`,children:[`Baseline`,e===void 0?``:` · stage ${e}`]}),(0,B.jsx)(`div`,{className:`font-mono text-muted-foreground [overflow-wrap:anywhere]`,children:l.name})]}),(0,B.jsxs)(`div`,{title:i,children:[(0,B.jsxs)(`div`,{className:`font-semibold`,children:[`Candidate`,a===void 0?``:` · stage ${a}`]}),(0,B.jsx)(`div`,{className:`font-mono text-muted-foreground [overflow-wrap:anywhere]`,children:u.name})]})]}),(0,B.jsx)(gh,{base:l,cand:u}),(0,B.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-2`,children:[e===void 0?null:(0,B.jsxs)(R,{variant:`outline`,size:`sm`,onClick:()=>o(`baseline`,e),children:[`Open stage `,e,` in the baseline dashboard`]}),a===void 0?null:(0,B.jsxs)(R,{variant:`outline`,size:`sm`,onClick:()=>o(`candidate`,a),children:[`Open stage `,a,` in the candidate dashboard`]})]})]},c)})})]}):null})})}var Ph=Intl.NumberFormat(),Fh=8,Ih=e=>e==null?`—`:e.toFixed(1),Lh=e=>e==null?`—`:`×${e.toFixed(2)}`,Rh=e=>e==null?`—`:`${(e*100).toFixed(1)}%`;function zh(e){let t=e.relativeDifference;return t==null?e.baseline==null||e.candidate==null?`Unavailable`:`Baseline is 0`:t===0?`Equal`:`${t>0?`+`:`-`}${(Math.abs(t)*100).toFixed(1)}%`}function Bh({label:e,baseline:t,candidate:n,note:r}){return(0,B.jsxs)(Sm,{"aria-label":e,children:[(0,B.jsx)(Q,{scope:`row`,className:`text-left`,children:e}),(0,B.jsx)($,{children:t}),(0,B.jsx)($,{children:n}),(0,B.jsx)($,{className:`text-muted-foreground`,children:r})]})}function Vh({conf:e}){return e.equal==null?`A log records no Spark properties`:e.equal?e.ignoredKeys.length>0?`Same (${e.ignoredKeys.length} ignored)`:`Same`:`${e.differences.length} differ`}function Hh({plan:e}){return e.equal?`Every stage pairs`:`${e.unmatched.baseline} baseline and ${e.unmatched.candidate} candidate stages unmatched, ${e.replanned} re-planned`}function Uh({comparability:e,baselineLabel:t,candidateLabel:n}){let{conf:r,volume:i,capacity:a,wallClockBridge:o,overlapMs:s}=e,c=r.differences.slice(0,Fh);return(0,B.jsx)(`div`,{"data-testid":`comparability-card`,children:(0,B.jsxs)(Bm,{title:`What differs between the runs`,children:[(0,B.jsx)(ym,{className:`trace-table`,children:(0,B.jsxs)(xm,{children:[(0,B.jsxs)(Sm,{children:[(0,B.jsx)(Q,{className:`text-left`,children:`Figure`}),(0,B.jsx)(Q,{title:t,children:`Baseline`}),(0,B.jsx)(Q,{title:n,children:`Candidate`}),(0,B.jsx)(Q,{children:`Comparison`})]}),(0,B.jsx)(Bh,{label:`Spark configuration`,baseline:``,candidate:``,note:Vh(e)}),(0,B.jsx)(Bh,{label:`Plan`,baseline:``,candidate:``,note:Hh(e)}),(0,B.jsx)(Bh,{label:`Input read`,baseline:i.inputBytes.baseline==null?`—`:p(i.inputBytes.baseline),candidate:i.inputBytes.candidate==null?`—`:p(i.inputBytes.candidate),note:zh(i.inputBytes)}),(0,B.jsx)(Bh,{label:`Output rows`,baseline:i.outputRows.baseline==null?`—`:Ph.format(i.outputRows.baseline),candidate:i.outputRows.candidate==null?`—`:Ph.format(i.outputRows.candidate),note:zh(i.outputRows)}),(0,B.jsx)(Bh,{label:`Output written`,baseline:i.outputBytes.baseline==null?`—`:p(i.outputBytes.baseline),candidate:i.outputBytes.candidate==null?`—`:p(i.outputBytes.candidate),note:zh(i.outputBytes)}),(0,B.jsx)(Bh,{label:`Executors, mean`,baseline:Ih(a.baseline.meanExecutors),candidate:Ih(a.candidate.meanExecutors),note:Lh(o.meanExecutors.ratio)}),(0,B.jsx)(Bh,{label:`Executors, peak`,baseline:Ih(a.baseline.peakExecutors),candidate:Ih(a.candidate.peakExecutors),note:Lh(a.baseline.peakExecutors&&a.candidate.peakExecutors?a.candidate.peakExecutors/a.baseline.peakExecutors:null)}),(0,B.jsx)(Bh,{label:`Task time, share of allocated core time`,baseline:Rh(o.taskShareOfAllocation.baseline),candidate:Rh(o.taskShareOfAllocation.candidate),note:Lh(o.taskShareOfAllocation.ratio)})]})}),c.length>0?(0,B.jsxs)(`ul`,{className:`mt-3 flex flex-col gap-1 text-xs`,"aria-label":`Configuration differences`,children:[c.map(e=>(0,B.jsxs)(`li`,{className:`font-mono`,children:[(0,B.jsx)(`span`,{className:`text-foreground`,children:e.key}),(0,B.jsxs)(`span`,{className:`text-muted-foreground`,children:[`: `,e.baseline??`not set`,` → `,e.candidate??`not set`]})]},e.key)),r.differences.length>c.length?(0,B.jsxs)(`li`,{className:`text-muted-foreground`,children:[`and `,r.differences.length-c.length,` more`]}):null]}):null,(0,B.jsxs)(`p`,{className:`mt-3 text-xs text-muted-foreground`,children:[s==null?`The run windows are not both known.`:s===0?`The runs did not overlap in time.`:`The runs overlapped for ${y(s)}.`,o.explainedWallClock!=null&&o.wallClock.ratio!=null?` Wall clock ${Lh(o.wallClock.ratio)} follows from task time ${Lh(o.taskTime.ratio)} over mean executors ${Lh(o.meanExecutors.ratio)} times the task-time share ${Lh(o.taskShareOfAllocation.ratio)}, which is ${Lh(o.explainedWallClock)}.`:``]})]})})}var Wh=`bg-plan-aggregate/8 text-plan-aggregate`,Gh=e=>`${e.toFixed(2)}×`,Kh={wallClock:y,shuffleSpill:p,taskSkew:Gh,failedTaskRate:e=>`${(e*100).toFixed(1)}%`,diskSpill:p,gcTime:y,inputBytes:p,outputBytes:p,executorRunTime:y,executorCpuTime:y,allocatedCoreHours:e=>`${e.toFixed(2)} core-h`},qh=e=>Kh[e]??(e=>Intl.NumberFormat().format(e)),Jh={regression:`text-critical`,improvement:`text-clean`,unchanged:`text-muted-foreground`,neutral:`text-muted-foreground`,unavailable:`text-muted-foreground`};function Yh({m:e}){if(e.direction===`unavailable`)return(0,B.jsxs)(Sm,{"aria-label":e.label,"data-direction":`unavailable`,children:[(0,B.jsx)(Q,{scope:`row`,className:`text-left`,children:e.label}),(0,B.jsxs)($,{colSpan:3,className:`text-muted-foreground`,children:[`Unavailable: `,e.unavailableReason]})]});let t=qh(e.key),n=e=>e==null?`—`:t(e),r=e=>e==null?`—`:e===0?`unchanged`:(e<0?`-`:`+`)+t(Math.abs(e)),i=Uu.has(e.key)?`text-muted-foreground`:Jh[e.direction];return(0,B.jsxs)(Sm,{"aria-label":e.label,"data-direction":e.direction,children:[(0,B.jsx)(Q,{scope:`row`,className:`text-left`,children:e.label}),(0,B.jsx)($,{children:n(e.baseline)}),(0,B.jsx)($,{children:n(e.candidate)}),(0,B.jsx)($,{className:N(`font-medium`,i),children:r(e.delta)})]})}var Xh=[`critical`,`warning`,`info`],Zh=e=>Xh.includes(e)?e:`info`;function Qh({stages:e}){return e.length===0?null:(0,B.jsx)(`div`,{className:`mt-1 flex flex-wrap gap-1`,children:e.map(e=>(0,B.jsx)(`span`,{className:`comparison-stage-chip`,children:e},e))})}function $h({items:e}){return(0,B.jsx)(`ul`,{className:`flex flex-col gap-2`,children:e.map(e=>(0,B.jsxs)(`li`,{className:`flex flex-col gap-1 border-b border-border pb-2 last:border-0 last:pb-0`,children:[(0,B.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,B.jsx)(ie,{type:e.type,impactBand:Zh(e.impactBand),className:ee(e.type)===`PLAN`?Wh:void 0}),(0,B.jsxs)(`span`,{className:`comparison-count text-muted-foreground`,children:[e.baseCount,` → `,e.candCount]})]}),(0,B.jsx)(Qh,{stages:e.stages})]},`${e.rule}§${e.impactBand}`))})}function eg({items:e}){return(0,B.jsx)(`ul`,{className:`flex flex-col gap-2`,children:e.map(e=>(0,B.jsxs)(`li`,{className:`flex flex-col gap-1 border-b border-border pb-2 last:border-0 last:pb-0`,children:[(0,B.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,B.jsx)(ie,{type:e.type,impactBand:Zh(e.candImpactBand),className:ee(e.type)===`PLAN`?Wh:void 0}),(0,B.jsxs)(`span`,{className:`comparison-count text-muted-foreground`,children:[e.baseImpactBand,` → `,e.candImpactBand,e.count>1?` (${e.count} findings)`:``]})]}),(0,B.jsx)(Qh,{stages:e.stages})]},`${e.rule}§${e.baseImpactBand}§${e.candImpactBand}`))})}function tg({reason:e,confidence:t}){let[n,r]=(0,z.useState)(!1);return n?null:(0,B.jsxs)(`div`,{role:`alert`,"data-confidence":t,className:`mb-4 flex items-start justify-between gap-3 rounded-xl border border-l-[3px] border-border border-l-warning bg-card px-4 py-3 text-sm text-foreground`,children:[(0,B.jsx)(`span`,{children:e}),(0,B.jsx)(`button`,{type:`button`,onClick:()=>r(!0),"aria-label":`Dismiss warning`,className:`shrink-0 cursor-pointer rounded px-1 text-muted-foreground hover:text-foreground`,children:`Dismiss`})]})}function ng({model:e,onDrillIn:t}){let n=rh(e.metrics,e.findings,e.jobOutcomes,e.comparability);return(0,B.jsxs)(`section`,{"aria-labelledby":`comparison-verdict-title`,"data-testid":`comparison-verdict`,"data-tone":n.tone,className:`comparison-verdict space-y-3 p-4 sm:p-5`,children:[(0,B.jsx)(`h2`,{id:`comparison-verdict-title`,className:`font-heading`,children:n.title}),n.sentences.length>0?(0,B.jsx)(`p`,{className:`max-w-prose text-sm text-muted-foreground`,children:n.sentences.join(` `)}):null,t?(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,B.jsxs)(R,{size:`sm`,onClick:()=>t(`candidate`),children:[`See where to start in the candidate`,(0,B.jsx)(cn,{"aria-hidden":`true`})]}),(0,B.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Opens the candidate's own verdict and next steps.`})]}):null]})}function rg({model:e,onClose:t,onDrillIn:n}){(0,z.useEffect)(()=>{let e=e=>{e.key===`Escape`&&t()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[t]);let r=e.findings.changed??[],i=(0,B.jsxs)(`header`,{className:`mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[(0,B.jsxs)(`div`,{className:`min-w-0`,children:[(0,B.jsx)(`h1`,{className:`comparison-title font-heading`,children:`Run comparison`}),(0,B.jsxs)(`p`,{className:`mt-1 text-sm text-muted-foreground`,children:[`Baseline `,(0,B.jsx)(`strong`,{className:`comparison-run-label`,children:e.baselineLabel}),` vs candidate `,(0,B.jsx)(`strong`,{className:`comparison-run-label`,children:e.candidateLabel})]})]}),(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 sm:shrink-0`,children:[n?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(R,{variant:`outline`,size:`sm`,onClick:()=>n(`baseline`),children:`View baseline dashboard`}),(0,B.jsx)(R,{variant:`outline`,size:`sm`,onClick:()=>n(`candidate`),children:`View candidate dashboard`})]}):null,(0,B.jsx)(R,{variant:`ghost`,size:`sm`,onClick:t,children:`Close`})]})]});return(0,B.jsxs)(`div`,{"data-testid":`dashboard`,className:`mx-auto flex max-w-[72rem] flex-col gap-4 px-4 py-6 sm:px-6`,children:[i,(0,B.jsxs)(`main`,{className:`contents`,children:[e.confidence!==`ok`&&e.reason?(0,B.jsx)(tg,{reason:e.reason,confidence:e.confidence}):null,(0,B.jsx)(ng,{model:e,onDrillIn:n}),e.comparability?(0,B.jsx)(Uh,{comparability:e.comparability,baselineLabel:e.baselineLabel,candidateLabel:e.candidateLabel}):null,(0,B.jsxs)(Bm,{title:`Metrics`,children:[(0,B.jsxs)(`p`,{className:`mb-3 text-xs text-muted-foreground`,children:[`Metrics and finding categories cover the whole run, and run totals count every task attempt, failed and speculative ones too. `,e.runtimeCoverage==null?`Neither run recorded executor run time, so no stages are paired by run time.`:`Per-stage skew below covers only the stages paired between the runs, which hold ${Math.floor(e.runtimeCoverage*100)}% of executor run time.`]}),(0,B.jsxs)(ym,{className:`trace-table`,children:[(0,B.jsx)(bm,{children:(0,B.jsxs)(Sm,{children:[(0,B.jsx)(Q,{className:`text-left`,children:`Metric`}),(0,B.jsx)(Q,{title:e.baselineLabel,children:`Baseline`}),(0,B.jsx)(Q,{title:e.candidateLabel,children:`Candidate`}),(0,B.jsx)(Q,{children:`Change`})]})}),(0,B.jsx)(xm,{children:e.metrics.map(e=>(0,B.jsx)(Yh,{m:e},e.key))})]})]}),e.findings.introduced.length>0||e.findings.resolved.length>0||r.length>0?(0,B.jsxs)(Bm,{title:`Findings by category`,children:[e.findings.introduced.length>0?(0,B.jsxs)(`div`,{className:`mb-4`,children:[(0,B.jsxs)(`h3`,{className:`trace-eyebrow mb-2`,children:[`More in candidate (`,e.candidateLabel,`)`]}),(0,B.jsx)($h,{items:e.findings.introduced})]}):null,e.findings.resolved.length>0?(0,B.jsxs)(`div`,{className:r.length>0?`mb-4`:void 0,children:[(0,B.jsxs)(`h3`,{className:`trace-eyebrow mb-2`,children:[`Fewer in candidate (`,e.candidateLabel,`)`]}),(0,B.jsx)($h,{items:e.findings.resolved})]}):null,r.length>0?(0,B.jsxs)(`div`,{children:[(0,B.jsxs)(`h3`,{className:`trace-eyebrow mb-2`,children:[`Impact changed in candidate (`,e.candidateLabel,`)`]}),(0,B.jsx)(eg,{items:r})]}):null]}):null,e.stagePairs?(0,B.jsx)(Dh,{model:{stagePairs:e.stagePairs,unmatched:e.unmatched??{baseStageIds:[],candStageIds:[]},replanned:e.replanned??[],baseStages:e.baseStages,candStages:e.candStages},baselineLabel:e.baselineLabel,candidateLabel:e.candidateLabel,onOpenStage:(e,t)=>n?.(e,t)}):null,e.stageSkew.length>0?(0,B.jsx)(Bm,{title:`Per-stage task skew (matched stages only)`,children:(0,B.jsxs)(ym,{className:`trace-table`,children:[(0,B.jsx)(bm,{children:(0,B.jsxs)(Sm,{children:[(0,B.jsx)(Q,{className:`text-left`,children:`Stage`}),(0,B.jsx)(Q,{children:`Baseline`}),(0,B.jsx)(Q,{children:`Candidate`})]})}),(0,B.jsx)(xm,{children:[...e.stageSkew].sort((e,t)=>Math.abs(t.delta??0)-Math.abs(e.delta??0)).map(e=>(0,B.jsxs)(Sm,{children:[(0,B.jsx)(Q,{scope:`row`,className:`text-left`,children:e.name}),(0,B.jsx)($,{children:e.baseline==null?`—`:Gh(e.baseline)}),(0,B.jsx)($,{children:e.candidate==null?`—`:Gh(e.candidate)})]},e.pairId))})]})}):null,(0,B.jsx)(vh,{baseStages:e.baseStages??[],candStages:e.candStages??[]})]})]})}var ig=(0,z.createContext)(null);function ag({children:e}){let[t,n]=(0,z.useState)(null),r=(0,z.useCallback)(e=>n(e),[]),i=(0,z.useCallback)(()=>n(null),[]),a=(0,z.useMemo)(()=>({stageId:t,openStage:r,close:i}),[t,r,i]);return(0,B.jsx)(ig.Provider,{value:a,children:e})}function og(){let e=(0,z.useContext)(ig);if(!e)throw Error(`useStageDetail outside StageDetailProvider`);return e}function sg(){let e=F(e=>e.planGraph.stageId),t=F(e=>e.planGraph.initialScope),n=F(e=>e.appModel),r=F(e=>e.catalog),i=F(e=>e.activeFileId),a=F(e=>e.closePlanGraph);return e==null?null:{stageId:e,initialScope:t,appModel:n,findings:r,activeFileId:i,onClose:a}}function cg(...e){for(let t of e){let e=t;try{e._init?.(e._payload)}catch{}}}var lg=`modulepreload`,ug=function(e,t){return new URL(e,t).href},dg={},fg=function(e){return e.pathname.endsWith(`.css`)},pg=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=o(t.map(t=>{t=ug(t,n);let r=s(t);if(r.href in dg)return;dg[r.href]=!0;let i=fg(r);if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((i?e.styles:e.all).has(r.href))return;let o=document.createElement(`link`);if(o.rel=i?`stylesheet`:lg,i||(o.as=`script`),o.crossOrigin=``,o.href=r.href,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),i)return new Promise((e,t)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>t(Error(`Unable to preload CSS for ${r}`)))})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},mg=(0,z.lazy)(()=>pg(async()=>{let{PlanGraphRoute:e}=await import(`./PlanGraphRoute-CIH9gBuR.js`);return{PlanGraphRoute:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),import.meta.url).then(({PlanGraphRoute:e})=>({default:e}))),hg=(0,z.lazy)(()=>pg(async()=>{let{Dashboard:e}=await import(`./Dashboard-DkUPrHKV.js`);return{Dashboard:e}},__vite__mapDeps([20,1,2,3,5,8,4,6,7,9,10,11,12,13,21,15,16,22,23,24,25,14,26,27,28,29,30]),import.meta.url).then(({Dashboard:e})=>({default:e})));function gg(){cg(hg),pg(async()=>{let{warmWidgetChunks:e}=await import(`./detector-registry-Bp8hrLua.js`);return{warmWidgetChunks:e}},__vite__mapDeps([22,1,2]),import.meta.url).then(({warmWidgetChunks:e})=>e())}function _g(){let e=F(e=>e.comparison),t=F(e=>e.closeComparison),{prepareComparison:n,drillIntoRun:r}=Uc(),{openStage:i}=og(),a=(0,z.useMemo)(()=>{let t=e.baselineId&&e.candidateId?n(e.baselineId,e.candidateId):null;return t?ed(t.baseline,t.candidate):null},[e.baselineId,e.candidateId,n]),o=!a;return(0,z.useEffect)(()=>{o&&t()},[o,t]),a?(0,B.jsx)(rg,{model:a,onClose:t,onDrillIn:(t,n)=>{let a=t===`baseline`?e.baselineId:e.candidateId;a&&(r(a),n!==void 0&&i(n))}}):null}function vg(){let e=sg();return e?(0,B.jsx)(z.Suspense,{fallback:(0,B.jsx)(`p`,{role:`status`,"aria-live":`polite`,"aria-label":`Loading plan graph`,className:`p-6 text-sm text-muted-foreground`,children:`Loading plan graph…`}),children:(0,B.jsx)(mg,{...e},e.stageId)}):null}function yg({label:e,onCancel:t}){let n=F(e=>e.parse),r=Math.round(n.pct*100),i=n.lines>0?` · ${n.lines.toLocaleString()} lines`:``,a=n.etaMs!=null&&n.etaMs>0?`About ${y(n.etaMs)} left. `:``;return(0,B.jsx)(`main`,{className:`flex min-h-screen flex-col items-center justify-center p-10`,children:(0,B.jsxs)(`div`,{className:`flex w-full max-w-md flex-col items-center gap-3 text-center`,children:[(0,B.jsx)(`p`,{className:`font-heading text-lg font-semibold`,children:`Reading the event log`}),(0,B.jsxs)(`p`,{role:`status`,"aria-live":`polite`,className:`text-sm text-muted-foreground`,children:[e,`… `,r,`%`,i]}),(0,B.jsx)(bt,{value:n.pct*100,className:`w-full`}),(0,B.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[a,`Parsing runs in your browser, so the log stays on this machine.`]}),t?(0,B.jsx)(R,{variant:`ghost`,size:`sm`,className:`tap-target-comfortable`,onClick:t,children:`Cancel`}):null]})})}function bg(){let e=F(e=>e.status),t=F(e=>e.errorMessage),n=F(e=>e.errorNonce),r=F(e=>e.shsParsing),{cancelParse:i}=Uc(),a=F(e=>e.planGraph.active),o=F(e=>e.comparison.active),s=F(e=>e.compareLoad);return(0,z.useEffect)(()=>{e===`parsing`&&gg()},[e]),s?(0,B.jsx)(yg,{label:`Parsing run ${s.current} of 2`}):a?(0,B.jsx)(vg,{}):o?(0,B.jsx)(_g,{}):e===`ready`?(0,B.jsx)(z.Suspense,{fallback:(0,B.jsx)(`p`,{role:`status`,"aria-live":`polite`,"aria-label":`Loading dashboard`,className:`p-6 text-sm text-muted-foreground`,children:`Loading dashboard…`}),children:(0,B.jsx)(hg,{})}):e===`parsing`&&!r?(0,B.jsx)(yg,{label:`Parsing`,onCancel:i}):(0,B.jsx)(`main`,{className:`min-h-screen px-4 py-6 sm:p-10`,children:(0,B.jsx)(Td,{errorMessage:e===`error`?t:null,errorNonce:n})})}function xg(){let e=F(e=>e.status),t=F(e=>e.planGraph.active),n=F(e=>e.comparison.active);return(0,B.jsx)(wt,{children:(0,B.jsx)(xe,{children:(0,B.jsxs)(ag,{children:[e===`ready`||t||n?null:(0,B.jsx)(`header`,{children:(0,B.jsx)(`h1`,{className:`sr-only`,children:`SparkForensics`})}),(0,B.jsx)(bg,{}),(0,B.jsx)(vm,{}),(0,B.jsx)(zn,{})]})})})}var Sg=[`PROCESS_LOCAL`,`NODE_LOCAL`,`RACK_LOCAL`,`NO_PREF`,`ANY`];function Cg(e,{bucketWidthMs:t=6e4,tiers:n=Sg}={}){let r=e.filter(e=>(e.completedAt??0)>(e.submittedAt??0)&&(e.executorRunTime??0)>0);if(r.length===0)return{labels:[],series:{},endTime:0};let i=r.reduce((e,t)=>Math.min(e,t.submittedAt??e),1/0),a=r.reduce((e,t)=>Math.max(e,t.completedAt??e),-1/0),o=Math.max(1,Math.ceil((a-i)/t)),s={};for(let e of n)s[e]=Array(o).fill(0);let c=Array(o).fill(0);for(let e of r){let n=e.completedAt??0,r=e.submittedAt??0,a=n-r,l=(e.executorRunTime??0)/a,u=(e.localityStats??[]).reduce((e,t)=>e+t.count,0)||1,d=new Map((e.localityStats??[]).map(e=>[e.locality,e.count/u]));for(let e=0;e<o;e++){let a=i+e*t,o=a+t,u=Math.min(n,o)-Math.max(r,a);if(u<=0)continue;let f=u/t;for(let[t,n]of d){let r=l*n*f;s[t]?s[t][e]+=r:c[e]+=r}}}c.some(e=>e>0)&&(s.OTHER=c);let l=Array(o).fill(0);for(let e of Object.keys(s))for(let t=0;t<o;t++)l[t]+=s[e][t];let u=l.reduce((e,t)=>Math.max(e,t),0);s.idle=l.map(e=>Math.max(0,u-e));let d=[];for(let e=0;e<o;e++)d.push(i+e*t);return{labels:d,series:s,endTime:a}}function wg(e,t,n=60){if(!e.some(e=>(e.executorRunTime??0)>0&&(e.completedAt??0)>(e.submittedAt??0)))return{hasActivity:!1};let r=t?.startTime??0,i=t?.endTime??r,a=Math.max(6e4,Math.ceil(Math.max(1,i-r)/n)),{labels:o,series:s,endTime:c}=Cg(e,{bucketWidthMs:a}),l=[...Sg.filter(e=>s[e]),...s.OTHER?[`OTHER`]:[],`idle`],u=o.map((e,t)=>{let n={t:Math.round((e-r)/1e3)},i=Math.min(a,c-e),o=a/i;for(let e of l)e!==`idle`&&(n[e]=(s[e]?.[t]??0)*o);return n}),d=l.filter(e=>e!==`idle`),f=e=>d.reduce((t,n)=>t+e[n],0),p=u.reduce((e,t)=>Math.max(e,f(t)),0);for(let e of u)e.idle=Math.max(0,p-f(e));return{hasActivity:!0,order:l,points:u,peakCores:p}}function Tg(e,t){let n=w(e),r=Ds.get(e);return!n||!r?`criteria not met`:n.thresholdSummary(Ls(r,t))}var Eg;function Dg(){if(!Eg){Eg=new Map;for(let e of Es)for(let t of e.emits){let n=Eg.get(t)??new Set;n.add(e.docAnchor),Eg.set(t,n)}}return Eg}function Og(e){let t=Dg().get(e)??new Set;if(t.size!==1)return;let[n]=t;return n&&le(n)?n:void 0}function kg(){let e={};for(let[t,{order:n,scope:r}]of Ds)e[t]={order:n,docAnchor:Og(t)??null,thresholdSummary:Tg(t),scope:r};return e}function Ag({app:e,stages:t,executorsAdded:n,executorsRemoved:r,runAggregates:i}){let a={app:e,stages:t,executors:{added:n,removed:r}},o=_r(a),s=o==null?0:vr(a,Wc(t))??0,c=(o??0)/36e5,l=Math.max(0,(o??0)-s)/36e5,u=i?.busyCoreMs??0,d=Math.max(0,s-u)/36e5,f=l+d,p=c>0?Math.round(f/c*100):null,m=0,h=i?.perStage??{};for(let e of Object.keys(h))m+=h[e].totalTaskDurationSum;let g=qn(e??{},n,r),_=g>0?m/g:0,v=null;return(l>0||d>0)&&(v=l>=d?`driver`:`executor`),{availableComputeHours:c,driverWasteHours:l,executorWasteHours:d,wastagePct:p,floorZeroSkewMs:_,dominantWaste:v}}function jg(e){let t={extract:0,transform:0,load:0};for(let n of e.values()){let e=Math.max(0,(n.completedAt??0)-(n.submittedAt??0));if(e===0)continue;let r=(n.shuffleReadBytes??0)>0||(n.shuffleWriteBytes??0)>0;(n.inputBytes??0)>0&&(n.shuffleReadBytes??0)===0&&(t.extract+=e),r&&(t.transform+=e),(n.outputBytes??0)>0&&(t.load+=e)}return t}function Mg(e){let t=e.rawWaste;return t&&e.basis===`resourceOnly`?b(t):t}function Ng(e){return e.basis===`resourceOnly`&&e.estimateMethod===`modeled`?` (modeled)`:``}function Pg(e){let t=e.impactEstimate;if(!t)return null;if(t.wallClock)return h(t.wallClock.low,t.wallClock.high);let n=Mg(t);if(n){let e=o(n);return v(e)?null:e}return null}function Fg(e){switch(e?.unit){case`mbSeconds`:return`of unused executor memory`;case`coreHours`:case`coreMs`:return e.idle?`of idle core capacity`:`of core time`;case`bytes`:return e.reread?`of input read by the repeated scans`:`of extra data written`;case`ms`:return`of task time`;default:return null}}function Ig(e){let t=e.impactEstimate;if(!t)return null;if(t.wallClock)return`of run time`;let n=Fg(t.rawWaste);return n&&`${n}${Ng(t)}`}function Lg(e){if(!e)return null;let t=e.wallClock&&e.wallClock.high>0?C(e.wallClock.high):null;if(t&&!v(t))return{text:h(e.wallClock.low,e.wallClock.high),meaning:`of run time`};let n=Mg(e),r=n&&n.value>0?o(n):null;if(r&&!v(r)){let t=Fg(e.rawWaste);return{text:r,meaning:t&&`${t}${Ng(e)}`}}return null}function Rg(e){if(!e)return null;if(e.wallClock){if(e.wallClock.high<=0)return null;let t=C(e.wallClock.high);return v(t)?null:t}let t=Mg(e);if(t){if(t.value<=0)return null;let n=o(t);return v(n)?null:`${n}${Ng(e)}`}return null}function zg(e){let t=Bg(e),n=e.impactEstimate?.assumptions;return!t||!n?t:`${t} ${n[0].toUpperCase()}${n.slice(1)}.`}function Bg(e){let t=e.impactEstimate;if(!t||t.estimateMethod===`none`)return null;let n=`${t.estimateMethod[0].toUpperCase()}${t.estimateMethod.slice(1)}`,r=Mg(t),i=r&&r.value>0?r:null,a=i&&!v(o(i))?o(i):null,s=t.wallClock;if(t.basis===`resourceOnly`)return a?`${n}; ${a} ${Fg(t.rawWaste)??`wasted`}, which may not shorten the run.`:null;if(!s||s.high<=0)return null;let c=h(s.high,s.high);if(v(c))return null;let l=``;if(a&&i.unit!==`ms`?l=` Resource waste measured: ${a}.`:a&&i.value>s.high&&a!==c&&(l=` Raw waste before the floor clipped it: ${a}.`),t.basis===`serial`)return`${n}; the stage ran alone, so this is close to a point estimate.${l}`;if(t.basis===`contended`){let e=h(s.low,s.low);return`${n}; the stage shared the cluster: ${e===c?`its floor and high agree`:`${e} is the floor, ${c} if the fix fully lands`}.${l}`}return null}function Vg(e){return typeof e?.startTime==`number`&&Number.isFinite(e.startTime)&&typeof e?.endTime==`number`&&Number.isFinite(e.endTime)&&e.endTime>e.startTime}function Hg(e){if(!Vg(e.app))return{efficiency:{value:null,unavailableReason:`application-timing`},wastage:{value:null,unavailableReason:`application-timing`}};let t=Gc(e.app,e.stages),n=Math.min(100,Math.round(t.stagesActive/t.total*100));if(!e.runAggregates)return{efficiency:{value:n,unavailableReason:null},wastage:{value:null,unavailableReason:`core-usage-summary`}};let r=Ag({app:e.app,stages:e.stages,executorsAdded:e.executors.added,executorsRemoved:e.executors.removed,runAggregates:e.runAggregates});return!Number.isFinite(r.availableComputeHours)||r.availableComputeHours<=0?{efficiency:{value:n,unavailableReason:null},wastage:{value:null,unavailableReason:`executor-capacity`}}:{efficiency:{value:n,unavailableReason:null},wastage:{value:r.wastagePct,unavailableReason:null}}}function Ug(e){let t=Vg(e.app),n=Hg(e),r=jg(e.stages),i=wg([...e.stages.values()],e.app);return{wallClockMs:t?Gc(e.app,e.stages).total:null,efficiencyPct:iu(e.stages)?n.efficiency.value:null,unusedCoreTimePct:n.wastage.value,etlPhasesMs:r.extract+r.transform+r.load>0?r:null,peakBusyCores:i.hasActivity?i.peakCores:null}}Object.fromEntries(Object.keys(te).map(e=>[e,te[e].name]));function Wg(e){return w(e)?.name??e}function Gg(e){return e.replace(/\b\w/g,e=>e.toUpperCase())}function Kg(e){return(typeof e.recommendation==`string`?e.recommendation.trim():``)||Wg(e.type)}function qg(e){let t=e.lastIndexOf(`: `);return t>0?{measured:e.slice(0,t),fix:e.slice(t+2)}:{measured:null,fix:e}}function Jg(e){return w(e.type)?.actionLabel(e)??Wg(e.type)}function Yg(e){return e!=null&&(Array.isArray(e)?e.length:e.size)>0}function Xg(e,t){return Array.isArray(e)?e.includes(t):e.has(t)}function Zg(e){return typeof e.stageId==`number`?e.stageId:e.stageIds&&e.stageIds.length===1?e.stageIds[0]:null}function Qg(e,t){if(Yg(t.impactBand)&&!Xg(t.impactBand,e.impactBand)||Yg(t.type)&&!Xg(t.type,e.type))return!1;let{stageId:n}=t;if(typeof n==`number`){if(e.stageId!==n)return!1}else if(Yg(n)&&(e.stageId==null||!Xg(n,e.stageId)))return!1;return!0}var $g=new Set([`memoryUtilization`,`utilization`,`coreLocality`,`cacheUtilization`]),e_=(()=>{let e=e=>+!!$g.has(e);return[...Ds.entries()].sort(([t,n],[r,i])=>e(t)-e(r)||n.order-i.order).map(([e])=>e)})(),t_=new Map(e_.map((e,t)=>[e,t]));function n_(e){return e.impactEstimate?.wallClock?.high??null}function r_(e){let t=typeof e.recommendation==`string`?e.recommendation.trim():``;return t_.has(e.type)&&t.length>0}function i_(e){let t=e.map((e,t)=>({finding:e,index:t})).filter(({finding:e})=>r_(e));return t.sort((e,t)=>{let n=n_(e.finding),r=n_(t.finding);return n!==null&&r!==null&&n!==r?r-n:n!==null==(r!==null)?(S[e.finding.impactBand]??9)-(S[t.finding.impactBand]??9)||(t_.get(e.finding.type)??2**53-1)-(t_.get(t.finding.type)??2**53-1)||e.index-t.index:n===null?1:-1}),t.map(({finding:e})=>e)}function a_(e){let t=e.map((e,t)=>({finding:e,index:t,coreTimeMs:e.impactEstimate?.coreTimeMs?.high})).filter(e=>r_(e.finding)&&typeof e.coreTimeMs==`number`&&Number.isFinite(e.coreTimeMs)&&e.coreTimeMs>0);return t.sort((e,t)=>t.coreTimeMs-e.coreTimeMs||(S[e.finding.impactBand]??9)-(S[t.finding.impactBand]??9)||(t_.get(e.finding.type)??2**53-1)-(t_.get(t.finding.type)??2**53-1)||e.index-t.index),t.map(({finding:e,coreTimeMs:t})=>({finding:e,coreTimeMs:t,figure:o({value:t,unit:`coreMs`})})).filter(e=>!v(e.figure))}function o_(e){let{wastedCoreHours:t,totalCoreHours:n}=Ys(e.app,e.executors.added,e.runAggregates,e.executors.removed);if(t==null||n==null||n<=0)return null;let r=o({value:t,unit:`coreHours`});if(v(r))return null;let i=Math.round(t/n*100);return{coreHours:t,allocatedCoreHours:n,pct:i,text:`${r} (${i}%) of the allocation ran no task.`}}function s_(e){let t=Zg(e);if(t!=null)return{key:`stage:${t}`,stageId:t};if(`stageIds`in e&&e.stageIds.length>1)return{key:`stages:${e.type}:${[...e.stageIds].sort((e,t)=>e-t).join(`,`)}`,stageId:null};let n=`variant`in e?e.variant:void 0;return{key:n?`app:${e.type}:${n}`:`app:${e.type}`,stageId:null}}function c_(e,t){return Zl.has(e.type)?typeof e.stageId==`number`&&t.has(e.stageId)?0:1:2}function l_(e,{failedJobStageIds:t}={}){let n=i_(e),r=t?[...n].sort((e,n)=>c_(e,t)-c_(n,t)):n,i=new Map;for(let e of r){let{key:t,stageId:n}=s_(e),r=i.get(t);if(!r){i.set(t,{key:t,lead:e,related:[],stageId:n});continue}new Set([r.lead.type,...r.related.map(e=>e.type)]).has(e.type)||r.related.push(e)}return[...i.values()]}function u_(e){return e.type===`utilization`||e.type===`memoryUtilization`&&e.variant===`idleCores`}function d_(e){return u_(e.lead)}function f_(e){return typeof e.value==`number`?e.type===`memoryUtilization`&&e.variant===`idleCores`?e.value:e.type===`utilization`?100-e.value:null:null}function p_(e,t){let n=e.find(d_);return(n?f_(n.lead):null)??t}function m_(e,t){return`${e} ${t}${e===1?``:`s`}`}function h_(e){return e.outcome.failedJobs>0}function g_({failedJobs:e,totalJobs:t}){return e<t?`${e} of ${t} jobs failed in this run`:t===1?`This run failed: its job did not finish`:`This run failed: all ${t} jobs did not finish`}function __(e){return/^[A-Z]{2}/.test(e)?e:e.charAt(0).toLowerCase()+e.slice(1)}function v_(e,t,n){if(h_(n))return g_(n.outcome);if(e.length===0&&n.incomplete)return`This log looks incomplete, so results cover only part of the run`;if(e.length===0&&n.noFinishedStages)return`This log has no finished stages to check`;if(e.length===0&&!n.clean)return`Nothing to fix, but some checks could not run on this log`;if(e.length===0)return`No findings to fix right now.`;if(t.length===0)return`${m_(e.length,`finding`)} to review`;let r=t[0];return d_(r)&&n.idlePct!=null?`Start with cluster size: ${n.idlePct}% of executor capacity sat idle`:r.stageId==null?`Start here: ${__(Jg(r.lead))}`:`Start with Stage ${r.stageId}`}function y_(e){return e?` The count leaves out ${m_(e,`note`)} on incomplete or missing log data.`:``}function b_(e,t,n){let r=[],{failedJobs:i,totalJobs:a}=n.outcome;if(i>0?e.some(e=>!Zl.has(e.type))&&r.push(`Fix the failure before tuning: the other findings cover only the work that ran.`):a>0&&!n.incomplete&&r.push(a===1?`Its one job succeeded.`:`All ${a} jobs succeeded.`),e.length===0){if(i>0)return r;n.clean&&r.push(`Every check passed for this run.`)}else if(t.length===0)r.push(`They are listed by impact under Findings.`);else{r.push(`${m_(e.length,`finding`)} in ${m_(t.length,`place`)}.${y_(n.uncounted)}`);let i=t[0].lead.impactEstimate?.wallClock;!d_(t[0])&&i&&n.runMs!=null&&r.push(`The first fix could save up to ${y(i.high)} of this ${y(n.runMs)} run.`),t.some(e=>e.related.length>0)&&r.push(`Findings on one stage are grouped, and their savings overlap.`)}return n.incomplete&&r.push(`The log has no end-of-run record, so these figures cover only the part of the run it captured.`),!(t.length>0&&d_(t[0]))&&n.idlePct!=null&&n.idlePct>=40&&r.push(t.some(d_)?`${n.idlePct}% of the executor capacity sat idle, so the cluster may be larger than this job needs.`:`${n.idlePct}% of the run's core time went unused, so the cluster may be larger than this job needs.`),r}var x_=`Open the driver log only if you need the full stack trace.`;function S_(e){let t=/[.!?]$/.test(e)?e:`${e}.`;return{shown:`Spark's recorded reason is quoted above. ${x_}`,copied:`Spark's recorded reason: ${t} ${x_}`}}function C_(e,t,n=null){let r=Pg(e),i=Ig(e),a=r&&i?`${r} ${i}`:r,o=n==null?``:` in Stage ${n}`,s=`${Jg(e)}${o}: ${t}`;return[/[.!?]$/.test(s)?s:`${s}.`,a?`Potential savings: ${a}`:null].filter(Boolean).join(` `)}function w_(e){let t=[e.runName?`Spark run ${e.runName}: ${e.title}`:e.title,``];return e.steps.forEach(({step:e,recommendation:n},r)=>{t.push(`${r+1}. ${C_(e.lead,n,e.stageId)}`)}),e.remaining>0&&t.push(``,`${m_(e.remaining,`more place`)} to look at in the full findings list.`),t.join(`
14
+ `)}function T_(e,t){return tu(e.lead,t)&&t.reason?S_(t.reason).copied:Kg(e.lead)}function E_(e,t){let n=t.filter(e=>be(e)&&t_.has(e.type)),r=eu(e.jobs,t),i=l_(n,r.failedJobs>0?{failedJobStageIds:r.failedJobStageIds}:{}),a={runMs:Vg(e.app)?Gc(e.app,e.stages).total:null,idlePct:p_(i,Hg(e).wastage.value),incomplete:t.some(e=>e.type===`incompleteRun`),clean:uu(e,t),outcome:r,noFinishedStages:!iu(e.stages),uncounted:t.length-n.length},o=v_(n,i,a),s=i.slice(0,3),c=i.length-s.length,l=s.length>0?w_({runName:e.app?.name??null,title:o,steps:s.map(e=>({step:e,recommendation:T_(e,r)})),remaining:c}):null;return{eligible:n,outcome:r,steps:i,facts:a,title:o,summary:b_(n,i,a),shown:s,remaining:c,copyText:l,costLane:a_(n).slice(0,3),idle:o_(e)}}function D_(e){let t=e?[...e.values()]:[],n=new Map,r=0;for(let e of t){if(e.submissionTime==null||e.completionTime==null)continue;let t=e.sqlExecutionId==null?`job:${e.id??r++}`:`sql:${e.sqlExecutionId}`,i=n.get(t);i?(i.start=Math.min(i.start,e.submissionTime),i.end=Math.max(i.end,e.completionTime)):n.set(t,{start:e.submissionTime,end:e.completionTime})}let i=[...n.entries()].sort((e,t)=>e[1].start-t[1].start),a=[];for(let e=1;e<i.length;e++)for(let t=0;t<e;t++){let[n,r]=i[t],[o,s]=i[e];s.start<r.end&&r.start<s.end&&a.push([n,o])}return{wallClockReliable:a.length===0,overlappingGroupIds:a}}function O_(e){return{figure:Pg(e),meaning:Ig(e),board:Lg(e.impactEstimate)?.text??null,compact:Rg(e.impactEstimate),provenance:zg(e)}}function k_(e){return e==null?null:e<75?`critical`:e<90?`warning`:null}function A_(e){return e==null?null:e>=70?`critical`:e>=40?`warning`:null}function j_(e){let{wallClockMs:t,efficiencyPct:n,unusedCoreTimePct:r}=Ug(e),i=Hg(e);return{wallClockMs:t,efficiencyPct:n,unusedCoreTimePct:r,efficiencyFlag:k_(n),unusedCoreTimeFlag:A_(r),unusedCoreTimeUnavailableReason:i.wastage.unavailableReason}}function M_(e){return e.runAggregates?Ag({app:e.app,stages:e.stages,executorsAdded:e.executors.added,executorsRemoved:e.executors.removed,runAggregates:e.runAggregates}):null}function N_(e,t){let n=!iu(e.stages),{notRunReason:r}=du(e.stages,t),i={};for(let e of e_){let t=r(e);t!=null&&(i[e]=t)}return{noFinishedStages:n,notRunReasons:i,gaps:lu(t,n)}}function P_(e,t,n){let r=new Map;for(let t of e){let{stageId:e}=s_(t);if(e==null)continue;let n=r.get(e)??[];n.push(t),r.set(e,n)}let i={};for(let[e,a]of r){let[r]=l_(a,n?{failedJobStageIds:n}:{}),o=r?[r.lead.type,...r.related.map(e=>e.type)]:[],s=e=>S[A(a.filter(t=>t.type===e))],c=[...new Set(a.map(e=>e.type))].filter(e=>!o.includes(e)).sort((e,t)=>s(e)-s(t));i[String(e)]={findingIndexes:a.map(e=>t.get(e)),typeOrder:[...o,...c]}}return i}var F_=new Set(e_);function I_(e,t,n){let r=[...t,...n],i=new Map(r.map((e,t)=>[e,t])),a=E_(e,r),{outcome:o}=a,s=o.failedJobs>0,c=r.filter(e=>be(e)&&F_.has(e.type)),l=a.shown.map(e=>{let t=tu(e.lead,o)&&o.reason?S_(o.reason):null;return{key:e.key,leadIndex:i.get(e.lead),stageId:e.stageId,relatedTypes:e.related.map(e=>e.type),recommendation:t?.shown??Kg(e.lead),copyText:C_(e.lead,t?.copied??Kg(e.lead))}});return{savings:r.map(O_),verdict:{title:a.title,summary:a.summary,failed:s,clean:a.facts.clean,failureReason:o.reason,steps:l,costSteps:a.costLane.map(({finding:e,figure:t})=>({leadIndex:i.get(e),stageId:Zg(e),figure:t})),idleLine:a.idle?.text??null,remaining:a.remaining,copyText:a.copyText},coverage:N_(e,r),runShape:j_(e),wallClock:Gc(e.app,e.stages),wastedCoreHours:Ys(e.app,e.executors.added,e.runAggregates,e.executors.removed),efficiency:M_(e),wallClockReliable:D_(e.jobs).wallClockReliable,etlPhases:jg(e.stages),coreLocality:{chart:wg([...e.stages.values()],e.app),ratio:ci([...e.stages.values()],{topN:1/0})},detectors:kg(),savingsRank:i_(r).map(e=>i.get(e)),stages:P_(t,i,s?o.failedJobStageIds:null),rollup:{eligibleIndexes:c.map(e=>i.get(e)),groups:Ce(c,e.stages).map(({members:e,...t})=>({...t,memberIndexes:e.map(e=>i.get(e))}))}}}function L_(e,t){return e.appModel!==t.appModel||e.catalog!==t.catalog||e.configFindings!==t.configFindings}function R_(e){if(e.exportMode)return;let{appModel:t,catalog:n,configFindings:r}=e;j.getState().setInterpretation({data:I_(t,n,r),findings:[...n,...r]})}function z_(){return R_(j.getState()),j.subscribe((e,t)=>{L_(e,t)&&R_(e)})}z_(),(0,yt.createRoot)(document.getElementById(`root`)).render((0,B.jsx)(z.StrictMode,{children:(0,B.jsx)(xg,{})}));export{Tc as $,Vm as A,Cm as B,ih as C,Ht as Ct,ch as D,lh as E,ct as Et,Pm as F,jd as G,Q as H,jm as I,td as J,Ld as K,wm as L,Rm as M,Am as N,uh as O,Nm as P,Uc as Q,ym as R,Wh as S,cn as St,dh as T,bt as Tt,bm as U,$ as V,Sm as W,du as X,Lu as Y,uu as Z,kg as _,An as _t,Qg as a,Rs as at,cg as b,gn as bt,Wg as c,Fs as ct,Gg as d,pa as dt,Ec as et,Ug as f,Qn as ft,Ig as g,In as gt,Pg as h,Rn as ht,C_ as i,Bs as it,Lm as j,Bm as k,qg as l,ca as lt,Lg as m,Gn as mt,E_ as n,uc as nt,Zg as o,Is as ot,zg as p,Zn as pt,nd as q,T_ as r,pc as rt,Jg as s,Vs as st,I_ as t,Oc as tt,Kg as u,ma as ut,Tg as v,Sn as vt,sh as w,Tt as wt,og as x,mn as xt,pg as y,vn as yt,xm as z};