sparkforensics-server 0.1.0 → 0.2.2
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.
- package/README.md +6 -0
- package/index.js +41 -50
- package/lib/static-files.js +15 -10
- package/package.json +23 -3
- package/public/assets/AutoscalingChurn-B96FKx97.js +1 -0
- package/public/assets/CacheUtilization-lKua3J1x.js +1 -0
- package/public/assets/CachingOpportunity-U0g-8HPV.js +1 -0
- package/public/assets/ColdStart-w8QYTNKo.js +1 -0
- package/public/assets/ConfigAudit-ClZp5BpV.js +1 -0
- package/public/assets/CoreUsageArea-o3kqQwyi.js +1 -0
- package/public/assets/Dashboard-Bjl-MYMm.js +1 -0
- package/public/assets/DuplicatePlanSubtree-Cm_UU3lY.js +1 -0
- package/public/assets/DurationHistogram-ltF-7M0A.js +1 -0
- package/public/assets/EmptyState-BCA3xioa.js +1 -0
- package/public/assets/ExecutorUtilization-Cn69i0uq.js +1 -0
- package/public/assets/GcPressure-CYsmU1d7.js +1 -0
- package/public/assets/ImpactEstimate-BGt-4WX5.js +1 -0
- package/public/assets/IncompleteRun-s6uQ8OLf.js +1 -0
- package/public/assets/JobFailures-DJ2dDvPA.js +1 -0
- package/public/assets/MemoryUtilization-C9G7P94X.js +1 -0
- package/public/assets/OverBroadcast-DYauoYWQ.js +1 -0
- package/public/assets/PartitionSizing-Cz_B0-uG.js +1 -0
- package/public/assets/PlanExplorer-_2oB5ouy.js +1 -0
- package/public/assets/PlanGraphRoute-Cj-GWM8W.js +1 -0
- package/public/assets/RetryWaste-D_m8ASwP.js +1 -0
- package/public/assets/RowPagination-BLsm8I6i.js +1 -0
- package/public/assets/ShuffleIO-pyDhxdaz.js +1 -0
- package/public/assets/Skew-BGLJuZZR.js +1 -0
- package/public/assets/SlowHost-ChdWVvGO.js +1 -0
- package/public/assets/SmallFiles-gTilBtjW.js +1 -0
- package/public/assets/SpeculationWaste-CVzgJnSj.js +1 -0
- package/public/assets/Spill-NGJGQaTB.js +1 -0
- package/public/assets/StageFailed-sGhki53z.js +1 -0
- package/public/assets/StageFindingGroup-AyI7BMd3.js +1 -0
- package/public/assets/StageHeader-BTzGkK8k.js +1 -0
- package/public/assets/StagePill-BlMOW_pU.js +1 -0
- package/public/assets/StageShape-DfOW93Z1.js +1 -0
- package/public/assets/StageSlowness-BMZ-K_5e.js +1 -0
- package/public/assets/Straggler-dffcAN7t.js +1 -0
- package/public/assets/TaskFailures-DGDwUK2A.js +1 -0
- package/public/assets/TinyTask-CfT8zZDr.js +1 -0
- package/public/assets/UnderBroadcast-CiOiJ0k1.js +1 -0
- package/public/assets/WidgetLeadSummary-BdUUi7L5.js +1 -0
- package/public/assets/charts-vendor-0VMaLVLN.js +59 -0
- package/public/assets/downsample-WmNM1qc9.js +1 -0
- package/public/assets/finding-anchor-DEV8JvgH.js +1 -0
- package/public/assets/impact-sort-DxaUheWV.js +1 -0
- package/public/assets/inbox-_QCYkBsP.js +1 -0
- package/public/assets/index-3vlFVNCg.js +9 -0
- package/public/assets/index-CjVklAdW.css +2 -0
- package/public/assets/parser-worker-B2bc0lWe.js +112 -0
- package/public/assets/plan-graph-vendor-B0sEms9Z.js +7 -0
- package/public/assets/plan-graph-vendor-DLioOiRN.css +1 -0
- package/public/assets/react-vendor-D2TLlSzI.js +9 -0
- package/public/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/public/assets/select-kuy1MiAo.js +1 -0
- package/public/assets/toggle-group-CUd-KWkp.js +1 -0
- package/public/assets/usePagedRows-jNUWgVTD.js +1 -0
- package/public/assets/useRecentFiles-D0OA_EOK.js +11 -0
- package/public/assets/useSortMode-BaeAA5cw.js +1 -0
- package/public/docs/404.html +3 -3
- package/public/docs/assets/{app.Bxy4_HVA.js → app.APoq_UBs.js} +1 -1
- package/public/docs/assets/aqe-loop.IwQSATHw.svg +1 -0
- package/public/docs/assets/aqe-loop.dark.DGbaxqJE.svg +1 -0
- package/public/docs/assets/broadcast-vs-shuffle.Db4WY1XK.svg +1 -0
- package/public/docs/assets/broadcast-vs-shuffle.dark.C7Bxs0mG.svg +1 -0
- package/public/docs/assets/cache-lifecycle.dark.B-hS7AgU.svg +1 -0
- package/public/docs/assets/cache-lifecycle.rEOVYQNU.svg +1 -0
- package/public/docs/assets/chunks/@localSearchIndexroot.CvM5fuxe.js +1 -0
- package/public/docs/assets/chunks/{VPLocalSearchBox.L5jNOIR3.js → VPLocalSearchBox.B3TPzlHq.js} +1 -1
- package/public/docs/assets/chunks/duplicate-plan-subtree.dark.Cdp70QhV.js +1 -0
- package/public/docs/assets/chunks/{framework.CNDaxUod.js → framework.DSg0KOwT.js} +1 -1
- package/public/docs/assets/chunks/retry-escalation-ladder.dark.DHipdJgZ.js +1 -0
- package/public/docs/assets/chunks/theme.PavXO_vz.js +2 -0
- package/public/docs/assets/cold-start-timeline.DxC_Sc7w.svg +1 -0
- package/public/docs/assets/cold-start-timeline.dark.CZ17YcAG.svg +1 -0
- package/public/docs/assets/columnar-layout.PghGeOEA.svg +1 -0
- package/public/docs/assets/columnar-layout.dark.BVNlz0ff.svg +1 -0
- package/public/docs/assets/container-memory.DIO0AnIm.svg +1 -0
- package/public/docs/assets/container-memory.dark.CP-5zuCl.svg +1 -0
- package/public/docs/assets/contributor-guide_architecture_board-widgets.md.CWpj01WU.js +1 -0
- package/public/docs/assets/contributor-guide_architecture_board-widgets.md.CWpj01WU.lean.js +1 -0
- package/public/docs/assets/contributor-guide_architecture_detector-contract.md.CgzUsQ6W.js +1 -0
- package/public/docs/assets/contributor-guide_architecture_detector-contract.md.CgzUsQ6W.lean.js +1 -0
- package/public/docs/assets/contributor-guide_architecture_drill-down.md.BtPdlM7r.js +1 -0
- package/public/docs/assets/contributor-guide_architecture_drill-down.md.BtPdlM7r.lean.js +1 -0
- package/public/docs/assets/{contributor-guide_architecture_impact-estimation.md.CzlXOnCq.js → contributor-guide_architecture_impact-estimation.md.CooslVJt.js} +1 -1
- package/public/docs/assets/{contributor-guide_architecture_impact-estimation.md.CzlXOnCq.lean.js → contributor-guide_architecture_impact-estimation.md.CooslVJt.lean.js} +1 -1
- package/public/docs/assets/{contributor-guide_architecture_index.md.94lNbF-4.js → contributor-guide_architecture_index.md.3TO9ic6w.js} +1 -1
- package/public/docs/assets/{contributor-guide_architecture_index.md.94lNbF-4.lean.js → contributor-guide_architecture_index.md.3TO9ic6w.lean.js} +1 -1
- package/public/docs/assets/{contributor-guide_architecture_overview.md.mQFlN66o.js → contributor-guide_architecture_overview.md.CehiRmGn.js} +1 -1
- package/public/docs/assets/{contributor-guide_architecture_overview.md.mQFlN66o.lean.js → contributor-guide_architecture_overview.md.CehiRmGn.lean.js} +1 -1
- package/public/docs/assets/contributor-guide_architecture_state-and-history.md.C-xxn0q7.js +1 -0
- package/public/docs/assets/contributor-guide_architecture_state-and-history.md.C-xxn0q7.lean.js +1 -0
- package/public/docs/assets/contributor-guide_architecture_widget-rendering.md.R27gQrgY.js +1 -0
- package/public/docs/assets/contributor-guide_architecture_widget-rendering.md.R27gQrgY.lean.js +1 -0
- package/public/docs/assets/{contributor-guide_architecture_worker-protocol.md.BaS_L10g.js → contributor-guide_architecture_worker-protocol.md.IbnfNrV3.js} +2 -2
- package/public/docs/assets/{contributor-guide_architecture_worker-protocol.md.BaS_L10g.lean.js → contributor-guide_architecture_worker-protocol.md.IbnfNrV3.lean.js} +1 -1
- package/public/docs/assets/contributor-guide_contributing.md.CvRsdr6J.js +1 -0
- package/public/docs/assets/contributor-guide_contributing.md.CvRsdr6J.lean.js +1 -0
- package/public/docs/assets/{contributor-guide_development-setup.md.CpUMVtIK.js → contributor-guide_development-setup.md.DvAN_9mK.js} +1 -1
- package/public/docs/assets/{contributor-guide_development-setup.md.CpUMVtIK.lean.js → contributor-guide_development-setup.md.DvAN_9mK.lean.js} +1 -1
- package/public/docs/assets/{contributor-guide_testing.md.C0q-BJfl.js → contributor-guide_testing.md.6rIKqSyY.js} +1 -1
- package/public/docs/assets/{contributor-guide_testing.md.C0q-BJfl.lean.js → contributor-guide_testing.md.6rIKqSyY.lean.js} +1 -1
- package/public/docs/assets/dag-stages.DSz_S937.svg +1 -0
- package/public/docs/assets/dag-stages.dark.F72UzxH4.svg +1 -0
- package/public/docs/assets/driver-executor.D5pQ7YN1.svg +1 -0
- package/public/docs/assets/driver-executor.dark.BmX9cPvh.svg +1 -0
- package/public/docs/assets/duplicate-plan-subtree.B4cvN6fj.svg +1 -0
- package/public/docs/assets/duplicate-plan-subtree.dark.Dw8wS0Ag.svg +1 -0
- package/public/docs/assets/{index.md.CETnDZzR.js → index.md.CHJVslga.js} +1 -1
- package/public/docs/assets/{index.md.CETnDZzR.lean.js → index.md.CHJVslga.lean.js} +1 -1
- package/public/docs/assets/join-strategy.C_FvrCEo.svg +1 -0
- package/public/docs/assets/join-strategy.dark.ChMLnNII.svg +1 -0
- package/public/docs/assets/memory-borrowing.BqQRJg0u.svg +1 -0
- package/public/docs/assets/memory-borrowing.dark.Yhh20O9C.svg +1 -0
- package/public/docs/assets/memory-regions.XHvO7jHG.svg +1 -0
- package/public/docs/assets/memory-regions.dark.D4TP9_08.svg +1 -0
- package/public/docs/assets/repartition-vs-coalesce.BovLRrpj.svg +1 -0
- package/public/docs/assets/repartition-vs-coalesce.dark.BhAczKZQ.svg +1 -0
- package/public/docs/assets/retry-escalation-ladder.DyTKJJmZ.svg +1 -0
- package/public/docs/assets/retry-escalation-ladder.dark.BdsabtU3.svg +1 -0
- package/public/docs/assets/shuffle-map-reduce.KuOEZVmg.svg +1 -0
- package/public/docs/assets/shuffle-map-reduce.dark.BgQZnFSb.svg +1 -0
- package/public/docs/assets/spill-classification.BU2euYDO.svg +1 -0
- package/public/docs/assets/spill-classification.dark.D7i1M40d.svg +1 -0
- package/public/docs/assets/{style.D2mY0HUs.css → style.DSixAiZE.css} +1 -1
- package/public/docs/assets/tuning-reference_anti-patterns.md.Df1YMIHu.js +1 -0
- package/public/docs/assets/tuning-reference_anti-patterns.md.Df1YMIHu.lean.js +1 -0
- package/public/docs/assets/tuning-reference_aqe.md.BIsCtLzm.js +1 -0
- package/public/docs/assets/tuning-reference_aqe.md.BIsCtLzm.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-broadcast-sizing.md.CEstB3Ia.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-broadcast-sizing.md.CEstB3Ia.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-cold-start.md.CEuy-72y.js +7 -0
- package/public/docs/assets/tuning-reference_bottleneck-cold-start.md.CEuy-72y.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-duplicate-plan-subtree.md.CIohQDfn.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-duplicate-plan-subtree.md.CIohQDfn.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-failures.md.4z5BXGJ2.js +6 -0
- package/public/docs/assets/tuning-reference_bottleneck-failures.md.4z5BXGJ2.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-gc.md.DSxzZRK7.js +6 -0
- package/public/docs/assets/tuning-reference_bottleneck-gc.md.DSxzZRK7.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-job-failure-rate.md.BaJl__1W.js +8 -0
- package/public/docs/assets/tuning-reference_bottleneck-job-failure-rate.md.BaJl__1W.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-memory-utilization.md.DbP-SJZc.js +7 -0
- package/public/docs/assets/tuning-reference_bottleneck-memory-utilization.md.DbP-SJZc.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-retry-waste.md.D5JMjVOt.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-retry-waste.md.D5JMjVOt.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-shuffle.md.CM-nTmIH.js +12 -0
- package/public/docs/assets/tuning-reference_bottleneck-shuffle.md.CM-nTmIH.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-skew.md.BdUwiDhn.js +14 -0
- package/public/docs/assets/tuning-reference_bottleneck-skew.md.BdUwiDhn.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-slow-host.md.BlIo6UDW.js +7 -0
- package/public/docs/assets/tuning-reference_bottleneck-slow-host.md.BlIo6UDW.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-small-files.md.B8kloyx8.js +5 -0
- package/public/docs/assets/tuning-reference_bottleneck-small-files.md.B8kloyx8.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-spill.md.PNH7mITt.js +6 -0
- package/public/docs/assets/tuning-reference_bottleneck-spill.md.PNH7mITt.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-straggler.md.DY36fHN5.js +7 -0
- package/public/docs/assets/tuning-reference_bottleneck-straggler.md.DY36fHN5.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-tiny-tasks.md.QTV7O8kU.js +8 -0
- package/public/docs/assets/tuning-reference_bottleneck-tiny-tasks.md.QTV7O8kU.lean.js +1 -0
- package/public/docs/assets/tuning-reference_bottleneck-utilization.md.DTiueZC3.js +5 -0
- package/public/docs/assets/tuning-reference_bottleneck-utilization.md.DTiueZC3.lean.js +1 -0
- package/public/docs/assets/tuning-reference_caching.md.B7aQ8asB.js +1 -0
- package/public/docs/assets/tuning-reference_caching.md.B7aQ8asB.lean.js +1 -0
- package/public/docs/assets/tuning-reference_cluster-config.md.ZVmDGsQ3.js +1 -0
- package/public/docs/assets/tuning-reference_cluster-config.md.ZVmDGsQ3.lean.js +1 -0
- package/public/docs/assets/tuning-reference_config.md.UvveiWG3.js +1 -0
- package/public/docs/assets/tuning-reference_config.md.UvveiWG3.lean.js +1 -0
- package/public/docs/assets/tuning-reference_data-formats.md.bjCAWH3N.js +1 -0
- package/public/docs/assets/tuning-reference_data-formats.md.bjCAWH3N.lean.js +1 -0
- package/public/docs/assets/tuning-reference_index.md.BQ_NooMV.js +1 -0
- package/public/docs/assets/tuning-reference_index.md.BQ_NooMV.lean.js +1 -0
- package/public/docs/assets/tuning-reference_intro.md.CobD-lGB.js +1 -0
- package/public/docs/assets/tuning-reference_intro.md.CobD-lGB.lean.js +1 -0
- package/public/docs/assets/tuning-reference_joins.md.BtKs_CuW.js +1 -0
- package/public/docs/assets/tuning-reference_joins.md.BtKs_CuW.lean.js +1 -0
- package/public/docs/assets/tuning-reference_memory-model.md.DhT-n4y3.js +1 -0
- package/public/docs/assets/tuning-reference_memory-model.md.DhT-n4y3.lean.js +1 -0
- package/public/docs/assets/tuning-reference_metrics.md.mLOh7Apj.js +1 -0
- package/public/docs/assets/tuning-reference_metrics.md.mLOh7Apj.lean.js +1 -0
- package/public/docs/assets/tuning-reference_partitioning.md.q0zKF_8X.js +1 -0
- package/public/docs/assets/tuning-reference_partitioning.md.q0zKF_8X.lean.js +1 -0
- package/public/docs/assets/tuning-reference_pyspark.md.DDCfvN9t.js +6 -0
- package/public/docs/assets/tuning-reference_pyspark.md.DDCfvN9t.lean.js +1 -0
- package/public/docs/assets/tuning-reference_shuffle.md.BZZ7R4Ix.js +1 -0
- package/public/docs/assets/tuning-reference_shuffle.md.BZZ7R4Ix.lean.js +1 -0
- package/public/docs/assets/tuning-reference_spark-architecture.md.Dwzm5avO.js +1 -0
- package/public/docs/assets/tuning-reference_spark-architecture.md.Dwzm5avO.lean.js +1 -0
- package/public/docs/assets/tuning-reference_table-formats.md.D6wj-2dX.js +1 -0
- package/public/docs/assets/tuning-reference_table-formats.md.D6wj-2dX.lean.js +1 -0
- package/public/docs/assets/udf-execution-models.BUFDICuG.svg +1 -0
- package/public/docs/assets/udf-execution-models.dark.YTNS6GDq.svg +1 -0
- package/public/docs/assets/user-guide_alternative-log-retrieval.md.B4tPGIal.js +1 -0
- package/public/docs/assets/user-guide_alternative-log-retrieval.md.B4tPGIal.lean.js +1 -0
- package/public/docs/assets/user-guide_getting-started.md.BJvwLEIM.js +3 -0
- package/public/docs/assets/user-guide_getting-started.md.BJvwLEIM.lean.js +1 -0
- package/public/docs/assets/{user-guide_mcp-tools.md.DwYI1d6C.js → user-guide_mcp-tools.md.Vi3RoflJ.js} +35 -5
- package/public/docs/assets/{user-guide_mcp-tools.md.DwYI1d6C.lean.js → user-guide_mcp-tools.md.Vi3RoflJ.lean.js} +1 -1
- package/public/docs/assets/user-guide_run-comparison.md.CQc1aoU8.js +1 -0
- package/public/docs/assets/user-guide_run-comparison.md.CQc1aoU8.lean.js +1 -0
- package/public/docs/assets/user-guide_understanding-findings.md.DL1UDhvR.js +1 -0
- package/public/docs/assets/user-guide_understanding-findings.md.DL1UDhvR.lean.js +1 -0
- package/public/docs/contributor-guide/architecture/board-widgets.html +7 -7
- package/public/docs/contributor-guide/architecture/detector-contract.html +7 -7
- package/public/docs/contributor-guide/architecture/drill-down.html +7 -7
- package/public/docs/contributor-guide/architecture/impact-estimation.html +7 -7
- package/public/docs/contributor-guide/architecture/index.html +7 -7
- package/public/docs/contributor-guide/architecture/overview.html +7 -7
- package/public/docs/contributor-guide/architecture/state-and-history.html +7 -7
- package/public/docs/contributor-guide/architecture/widget-rendering.html +7 -7
- package/public/docs/contributor-guide/architecture/worker-protocol.html +8 -8
- package/public/docs/contributor-guide/contributing.html +7 -7
- package/public/docs/contributor-guide/development-setup.html +7 -7
- package/public/docs/contributor-guide/testing.html +7 -7
- package/public/docs/hashmap.json +1 -1
- package/public/docs/index.html +7 -7
- package/public/docs/tuning-reference/anti-patterns.html +29 -0
- package/public/docs/tuning-reference/aqe.html +29 -0
- package/public/docs/tuning-reference/bottleneck-broadcast-sizing.html +29 -0
- package/public/docs/tuning-reference/bottleneck-cold-start.html +35 -0
- package/public/docs/tuning-reference/bottleneck-duplicate-plan-subtree.html +30 -0
- package/public/docs/tuning-reference/bottleneck-failures.html +35 -0
- package/public/docs/tuning-reference/bottleneck-gc.html +34 -0
- package/public/docs/tuning-reference/bottleneck-job-failure-rate.html +37 -0
- package/public/docs/tuning-reference/bottleneck-memory-utilization.html +35 -0
- package/public/docs/tuning-reference/bottleneck-retry-waste.html +30 -0
- package/public/docs/tuning-reference/bottleneck-shuffle.html +40 -0
- package/public/docs/tuning-reference/bottleneck-skew.html +42 -0
- package/public/docs/tuning-reference/bottleneck-slow-host.html +35 -0
- package/public/docs/tuning-reference/bottleneck-small-files.html +33 -0
- package/public/docs/tuning-reference/bottleneck-spill.html +34 -0
- package/public/docs/tuning-reference/bottleneck-straggler.html +35 -0
- package/public/docs/tuning-reference/bottleneck-tiny-tasks.html +36 -0
- package/public/docs/tuning-reference/bottleneck-utilization.html +34 -0
- package/public/docs/tuning-reference/caching.html +29 -0
- package/public/docs/tuning-reference/cluster-config.html +29 -0
- package/public/docs/tuning-reference/config.html +29 -0
- package/public/docs/tuning-reference/data-formats.html +29 -0
- package/public/docs/tuning-reference/index.html +29 -0
- package/public/docs/tuning-reference/intro.html +29 -0
- package/public/docs/tuning-reference/joins.html +29 -0
- package/public/docs/tuning-reference/memory-model.html +29 -0
- package/public/docs/tuning-reference/metrics.html +29 -0
- package/public/docs/tuning-reference/partitioning.html +29 -0
- package/public/docs/tuning-reference/pyspark.html +34 -0
- package/public/docs/tuning-reference/shuffle.html +29 -0
- package/public/docs/tuning-reference/spark-architecture.html +29 -0
- package/public/docs/tuning-reference/table-formats.html +29 -0
- package/public/docs/user-guide/alternative-log-retrieval.html +29 -0
- package/public/docs/user-guide/getting-started.html +8 -8
- package/public/docs/user-guide/mcp-tools.html +41 -11
- package/public/docs/user-guide/run-comparison.html +7 -7
- package/public/docs/user-guide/understanding-findings.html +7 -7
- package/public/index.html +8 -7
- package/public/sample-runs/sample-run.ndjson.gz +0 -0
- package/vendor-core/analyzer.js +74 -74
- package/vendor-core/cli/budgets.js +13 -27
- package/vendor-core/cli/collect-run.js +43 -19
- package/vendor-core/core-count.js +25 -27
- package/vendor-core/core-locality-ratio.js +4 -11
- package/vendor-core/core-time-series.js +6 -12
- package/vendor-core/core-usage-locality.js +3 -4
- package/vendor-core/detectors.js +395 -389
- package/vendor-core/docs-config.js +69 -21
- package/vendor-core/docs-content/chapters/01-intro.md +32 -0
- package/vendor-core/docs-content/chapters/02-spark-architecture.md +76 -0
- package/vendor-core/docs-content/chapters/03-memory-model.md +73 -0
- package/vendor-core/docs-content/chapters/04-partitioning.md +65 -0
- package/vendor-core/docs-content/chapters/05-joins.md +62 -0
- package/vendor-core/docs-content/chapters/06-shuffle.md +59 -0
- package/vendor-core/docs-content/chapters/07-data-formats.md +81 -0
- package/vendor-core/docs-content/chapters/07b-table-formats.md +56 -0
- package/vendor-core/docs-content/chapters/08-caching.md +58 -0
- package/vendor-core/docs-content/chapters/09-pyspark.md +78 -0
- package/vendor-core/docs-content/chapters/10-aqe.md +167 -0
- package/vendor-core/docs-content/chapters/11-cluster-config.md +170 -0
- package/vendor-core/docs-content/chapters/12-anti-patterns.md +171 -0
- package/vendor-core/docs-content/chapters/14-metrics.md +87 -0
- package/vendor-core/docs-content/chapters/15-config.md +93 -0
- package/vendor-core/docs-content/chapters/nav-index.json +370 -0
- package/vendor-core/docs-content/detection/cache.md +7 -0
- package/vendor-core/docs-content/detection/cfg.md +15 -0
- package/vendor-core/docs-content/detection/chrn.md +9 -0
- package/vendor-core/docs-content/detection/cold.md +4 -0
- package/vendor-core/docs-content/detection/cstor.md +4 -0
- package/vendor-core/docs-content/detection/fail.md +5 -0
- package/vendor-core/docs-content/detection/gc.md +4 -0
- package/vendor-core/docs-content/detection/host.md +5 -0
- package/vendor-core/docs-content/detection/incmp.md +6 -0
- package/vendor-core/docs-content/detection/jobs.md +4 -0
- package/vendor-core/docs-content/detection/local.md +6 -0
- package/vendor-core/docs-content/detection/mem.md +10 -0
- package/vendor-core/docs-content/detection/part.md +5 -0
- package/vendor-core/docs-content/detection/plan.md +14 -0
- package/vendor-core/docs-content/detection/retry.md +4 -0
- package/vendor-core/docs-content/detection/sfail.md +5 -0
- package/vendor-core/docs-content/detection/shape.md +5 -0
- package/vendor-core/docs-content/detection/shfl.md +4 -0
- package/vendor-core/docs-content/detection/skew.md +6 -0
- package/vendor-core/docs-content/detection/slow.md +6 -0
- package/vendor-core/docs-content/detection/spec.md +8 -0
- package/vendor-core/docs-content/detection/spill.md +7 -0
- package/vendor-core/docs-content/detection/strag.md +5 -0
- package/vendor-core/docs-content/detection/tiny.md +4 -0
- package/vendor-core/docs-content/detection/util.md +4 -0
- package/vendor-core/docs-content/diagrams/aqe-loop.dark.svg +1 -0
- package/vendor-core/docs-content/diagrams/aqe-loop.svg +1 -0
- package/vendor-core/docs-content/diagrams/broadcast-vs-shuffle.dark.svg +1 -0
- package/vendor-core/docs-content/diagrams/broadcast-vs-shuffle.svg +1 -0
- package/vendor-core/docs-content/diagrams/cache-lifecycle.dark.svg +1 -0
- package/vendor-core/docs-content/diagrams/cache-lifecycle.svg +1 -0
- package/vendor-core/docs-content/diagrams/cold-start-timeline.dark.svg +1 -0
- package/vendor-core/docs-content/diagrams/cold-start-timeline.svg +1 -0
- package/vendor-core/docs-content/diagrams/columnar-layout.dark.svg +1 -0
- package/vendor-core/docs-content/diagrams/columnar-layout.svg +1 -0
- package/vendor-core/docs-content/diagrams/container-memory.dark.svg +1 -0
- package/vendor-core/docs-content/diagrams/container-memory.svg +1 -0
- package/vendor-core/docs-content/diagrams/dag-stages.dark.svg +1 -0
- package/vendor-core/docs-content/diagrams/dag-stages.svg +1 -0
- package/vendor-core/docs-content/diagrams/driver-executor.dark.svg +1 -0
- package/vendor-core/docs-content/diagrams/driver-executor.svg +1 -0
- package/vendor-core/docs-content/diagrams/duplicate-plan-subtree.dark.svg +1 -0
- package/vendor-core/docs-content/diagrams/duplicate-plan-subtree.svg +1 -0
- package/vendor-core/docs-content/diagrams/join-strategy.dark.svg +1 -0
- package/vendor-core/docs-content/diagrams/join-strategy.svg +1 -0
- package/vendor-core/docs-content/diagrams/memory-borrowing.dark.svg +1 -0
- package/vendor-core/docs-content/diagrams/memory-borrowing.svg +1 -0
- package/vendor-core/docs-content/diagrams/memory-regions.dark.svg +1 -0
- package/vendor-core/docs-content/diagrams/memory-regions.svg +1 -0
- package/vendor-core/docs-content/diagrams/repartition-vs-coalesce.dark.svg +1 -0
- package/vendor-core/docs-content/diagrams/repartition-vs-coalesce.svg +1 -0
- package/vendor-core/docs-content/diagrams/retry-escalation-ladder.dark.svg +1 -0
- package/vendor-core/docs-content/diagrams/retry-escalation-ladder.svg +1 -0
- package/vendor-core/docs-content/diagrams/shuffle-map-reduce.dark.svg +1 -0
- package/vendor-core/docs-content/diagrams/shuffle-map-reduce.svg +1 -0
- package/vendor-core/docs-content/diagrams/spill-classification.dark.svg +1 -0
- package/vendor-core/docs-content/diagrams/spill-classification.svg +1 -0
- package/vendor-core/docs-content/diagrams/udf-execution-models.dark.svg +1 -0
- package/vendor-core/docs-content/diagrams/udf-execution-models.svg +1 -0
- package/vendor-core/docs-content/tuning/broadcast-sizing.md +78 -0
- package/vendor-core/docs-content/tuning/cold-start.md +81 -0
- package/vendor-core/docs-content/tuning/duplicate-plan-subtree.md +45 -0
- package/vendor-core/docs-content/tuning/failures.md +124 -0
- package/vendor-core/docs-content/tuning/gc.md +110 -0
- package/vendor-core/docs-content/tuning/job-failure-rate.md +101 -0
- package/vendor-core/docs-content/tuning/memory-utilization.md +58 -0
- package/vendor-core/docs-content/tuning/retry-waste.md +90 -0
- package/vendor-core/docs-content/tuning/shuffle.md +154 -0
- package/vendor-core/docs-content/tuning/skew.md +123 -0
- package/vendor-core/docs-content/tuning/slow-host.md +117 -0
- package/vendor-core/docs-content/tuning/small-files.md +99 -0
- package/vendor-core/docs-content/tuning/spill.md +114 -0
- package/vendor-core/docs-content/tuning/straggler.md +103 -0
- package/vendor-core/docs-content/tuning/tiny-tasks.md +94 -0
- package/vendor-core/docs-content/tuning/utilization.md +90 -0
- package/vendor-core/docs-site-config.js +10 -17
- package/vendor-core/efficiency-model.js +7 -13
- package/vendor-core/etl-phases.js +3 -5
- package/vendor-core/event-handlers.js +232 -134
- package/vendor-core/event-schemas.js +48 -114
- package/vendor-core/evidence-availability.js +5 -10
- package/vendor-core/evidence-report.js +73 -123
- package/vendor-core/export-data.js +48 -0
- package/vendor-core/finding-action-label.js +4 -10
- package/vendor-core/finding-filter-predicate.js +3 -7
- package/vendor-core/finding-generic-recommendation.js +112 -0
- package/vendor-core/finding-names.js +51 -0
- package/vendor-core/format-utils.js +112 -38
- package/vendor-core/impact-band.js +18 -24
- package/vendor-core/impact-estimator.js +38 -74
- package/vendor-core/ingest.js +7 -13
- package/vendor-core/job-groups.js +3 -6
- package/vendor-core/list-runs.js +278 -0
- package/vendor-core/load-vendored.js +6 -12
- package/vendor-core/log-header-peek.js +81 -0
- package/vendor-core/lz4-block.js +4 -6
- package/vendor-core/mcp-server-factory.js +38 -8
- package/vendor-core/mcp-tools.js +105 -76
- package/vendor-core/model-assembler.js +8 -16
- package/vendor-core/occupancy.js +5 -9
- package/vendor-core/parser-worker.js +20 -29
- package/vendor-core/plan-dot.js +2 -5
- package/vendor-core/plan-duration-attribution.js +78 -29
- package/vendor-core/plan-graph-model.js +126 -69
- package/vendor-core/plan-node-detail.js +31 -17
- package/vendor-core/plan-summary.js +19 -8
- package/vendor-core/recommendation-rollup.js +35 -39
- package/vendor-core/redact.js +72 -16
- package/vendor-core/rolling-log-reassembly.js +4 -6
- package/vendor-core/run-comparison.js +86 -72
- package/vendor-core/scaling-sim.js +5 -7
- package/vendor-core/session-snapshot.js +1 -1
- package/vendor-core/shs-fetch.js +4 -6
- package/vendor-core/shs-load.js +9 -13
- package/vendor-core/shs-request.js +1 -1
- package/vendor-core/stage-quantiles.js +14 -0
- package/vendor-core/types.js +78 -18
- package/vendor-core/wasted-core-hours.js +7 -12
- package/public/assets/AutoscalingChurn-CP5OjN6v.js +0 -1
- package/public/assets/CacheUtilization-BjyawXL6.js +0 -1
- package/public/assets/CachingOpportunity-DV2ABG2G.js +0 -1
- package/public/assets/ConfigAudit-DMiBhAoG.js +0 -1
- package/public/assets/CoreUsageArea-CGYIgPnt.js +0 -1
- package/public/assets/Dashboard-D1_IrWRs.js +0 -12
- package/public/assets/ExecutorTimeline-DkaAGqQT.js +0 -1
- package/public/assets/Failures-Crngoicu.js +0 -1
- package/public/assets/GcPressure-CFXm4BnA.js +0 -1
- package/public/assets/IncompleteRun-BWEJTb13.js +0 -1
- package/public/assets/JobFailures-BmjxCA-h.js +0 -1
- package/public/assets/MemoryUtilization-Bu2uQJbd.js +0 -1
- package/public/assets/PlanExplorer-DKUwF0uz.js +0 -1
- package/public/assets/PlanGraphRoute-BjPSugIG.js +0 -1
- package/public/assets/ShuffleIO--Rur3neu.js +0 -1
- package/public/assets/Spill-DIMpt8c2.js +0 -1
- package/public/assets/TaskSkew-BDr1DbeI.js +0 -1
- package/public/assets/charts-vendor-NMqKV0H4.js +0 -59
- package/public/assets/index-4id52G-A.js +0 -9
- package/public/assets/index-D9kwVYIO.css +0 -1
- package/public/assets/parser-worker-00O9WEQC.js +0 -65
- package/public/assets/plan-graph-vendor-BnuhLJ6X.css +0 -1
- package/public/assets/plan-graph-vendor-vZQHG2EJ.js +0 -7
- package/public/assets/react-vendor-u4pyvC5Y.js +0 -9
- package/public/assets/useRecentFiles-46iBU9zJ.js +0 -5
- package/public/docs/assets/chunks/@localSearchIndexroot.DclgKtlT.js +0 -1
- package/public/docs/assets/chunks/theme.CoT6y5bf.js +0 -2
- package/public/docs/assets/contributor-guide_architecture_board-widgets.md.BtjoE_1k.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_board-widgets.md.BtjoE_1k.lean.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_detector-contract.md.DQyCHQNM.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_detector-contract.md.DQyCHQNM.lean.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_drill-down.md.BKfyDQck.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_drill-down.md.BKfyDQck.lean.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_state-and-history.md.DaqttKgQ.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_state-and-history.md.DaqttKgQ.lean.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_widget-rendering.md.Bk6Iyj9S.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_widget-rendering.md.Bk6Iyj9S.lean.js +0 -1
- package/public/docs/assets/contributor-guide_contributing.md.C-lKs70I.js +0 -1
- package/public/docs/assets/contributor-guide_contributing.md.C-lKs70I.lean.js +0 -1
- package/public/docs/assets/user-guide_getting-started.md.BJdD7a7_.js +0 -3
- package/public/docs/assets/user-guide_getting-started.md.BJdD7a7_.lean.js +0 -1
- package/public/docs/assets/user-guide_run-comparison.md.5-oaOfTu.js +0 -1
- package/public/docs/assets/user-guide_run-comparison.md.5-oaOfTu.lean.js +0 -1
- package/public/docs/assets/user-guide_understanding-findings.md.CK2WZ0Tf.js +0 -1
- package/public/docs/assets/user-guide_understanding-findings.md.CK2WZ0Tf.lean.js +0 -1
- package/public/vendor/spark-doc/anchors.json +0 -205
- package/public/vendor/spark-doc/index.html +0 -4202
- package/public/vendor/spark-doc/landing.html +0 -418
- package/public/vendor/spark-doc/meta.html +0 -970
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./PlanGraphRoute-BjPSugIG.js","./react-vendor-u4pyvC5Y.js","./useRecentFiles-46iBU9zJ.js","./plan-graph-vendor-vZQHG2EJ.js","./plan-graph-vendor-BnuhLJ6X.css","./charts-vendor-NMqKV0H4.js","./Dashboard-D1_IrWRs.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{j as l,P as ea,e as ta,f as na,R as M,r as v,h as sa,B as oa,C as ra,i as aa,k as ia,b as la,D as ca,l as da,m as ua,n as fa,o as pa,p as ma,q as ha,s as ga}from"./react-vendor-u4pyvC5Y.js";import{c as po}from"./charts-vendor-NMqKV0H4.js";import"./plan-graph-vendor-vZQHG2EJ.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))s(o);new MutationObserver(o=>{for(const r of o)if(r.type==="childList")for(const a of r.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&s(a)}).observe(document,{childList:!0,subtree:!0});function n(o){const r={};return o.integrity&&(r.integrity=o.integrity),o.referrerPolicy&&(r.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?r.credentials="include":o.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function s(o){if(o.ep)return;o.ep=!0;const r=n(o);fetch(o.href,r)}})();const ba="modulepreload",xa=function(e,t){return new URL(e,t).href},ns={},mo=function(t,n,s){let o=Promise.resolve();if(n&&n.length>0){let d=function(p){return Promise.all(p.map(i=>Promise.resolve(i).then(f=>({status:"fulfilled",value:f}),f=>({status:"rejected",reason:f}))))};const a=document.getElementsByTagName("link"),c=document.querySelector("meta[property=csp-nonce]"),u=c?.nonce||c?.getAttribute("nonce");o=d(n.map(p=>{if(p=xa(p,s),p in ns)return;ns[p]=!0;const i=p.endsWith(".css"),f=i?'[rel="stylesheet"]':"";if(s)for(let g=a.length-1;g>=0;g--){const h=a[g];if(h.href===p&&(!i||h.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${p}"]${f}`))return;const m=document.createElement("link");if(m.rel=i?"stylesheet":ba,i||(m.as="script"),m.crossOrigin="",m.href=p,u&&m.setAttribute("nonce",u),document.head.appendChild(m),i)return new Promise((g,h)=>{m.addEventListener("load",g),m.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${p}`)))})}))}function r(a){const c=new Event("vite:preloadError",{cancelable:!0});if(c.payload=a,window.dispatchEvent(c),!c.defaultPrevented)throw a}return o.then(a=>{for(const c of a||[])c.status==="rejected"&&r(c.reason);return t().catch(r)})},va=(e,t)=>{const n=new Array(e.length+t.length);for(let s=0;s<e.length;s++)n[s]=e[s];for(let s=0;s<t.length;s++)n[e.length+s]=t[s];return n},ya=(e,t)=>({classGroupId:e,validator:t}),ho=(e=new Map,t=null,n)=>({nextPart:e,validators:t,classGroupId:n}),$t="-",ss=[],wa="arbitrary..",ka=e=>{const t=Ca(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:s}=e;return{getClassGroupId:a=>{if(a.startsWith("[")&&a.endsWith("]"))return Sa(a);const c=a.split($t),u=c[0]===""&&c.length>1?1:0;return go(c,u,t)},getConflictingClassGroupIds:(a,c)=>{if(c){const u=s[a],d=n[a];return u?d?va(d,u):u:d||ss}return n[a]||ss}}},go=(e,t,n)=>{if(e.length-t===0)return n.classGroupId;const o=e[t],r=n.nextPart.get(o);if(r){const d=go(e,t+1,r);if(d)return d}const a=n.validators;if(a===null)return;const c=t===0?e.join($t):e.slice(t).join($t),u=a.length;for(let d=0;d<u;d++){const p=a[d];if(p.validator(c))return p.classGroupId}},Sa=e=>e.slice(1,-1).indexOf(":")===-1?void 0:(()=>{const t=e.slice(1,-1),n=t.indexOf(":"),s=t.slice(0,n);return s?wa+s:void 0})(),Ca=e=>{const{theme:t,classGroups:n}=e;return Ma(n,t)},Ma=(e,t)=>{const n=ho();for(const s in e){const o=e[s];Mn(o,n,s,t)}return n},Mn=(e,t,n,s)=>{const o=e.length;for(let r=0;r<o;r++){const a=e[r];Ra(a,t,n,s)}},Ra=(e,t,n,s)=>{if(typeof e=="string"){ja(e,t,n);return}if(typeof e=="function"){Ea(e,t,n,s);return}Ia(e,t,n,s)},ja=(e,t,n)=>{const s=e===""?t:bo(t,e);s.classGroupId=n},Ea=(e,t,n,s)=>{if(Ta(e)){Mn(e(s),t,n,s);return}t.validators===null&&(t.validators=[]),t.validators.push(ya(n,e))},Ia=(e,t,n,s)=>{const o=Object.entries(e),r=o.length;for(let a=0;a<r;a++){const[c,u]=o[a];Mn(u,bo(t,c),n,s)}},bo=(e,t)=>{let n=e;const s=t.split($t),o=s.length;for(let r=0;r<o;r++){const a=s[r];let c=n.nextPart.get(a);c||(c=ho(),n.nextPart.set(a,c)),n=c}return n},Ta=e=>"isThemeGetter"in e&&e.isThemeGetter===!0,Na=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,n=Object.create(null),s=Object.create(null);const o=(r,a)=>{n[r]=a,t++,t>e&&(t=0,s=n,n=Object.create(null))};return{get(r){let a=n[r];if(a!==void 0)return a;if((a=s[r])!==void 0)return o(r,a),a},set(r,a){r in n?n[r]=a:o(r,a)}}},on="!",os=":",za=[],rs=(e,t,n,s,o)=>({modifiers:e,hasImportantModifier:t,baseClassName:n,maybePostfixModifierPosition:s,isExternal:o}),Aa=e=>{const{prefix:t,experimentalParseClassName:n}=e;let s=o=>{const r=[];let a=0,c=0,u=0,d;const p=o.length;for(let h=0;h<p;h++){const x=o[h];if(a===0&&c===0){if(x===os){r.push(o.slice(u,h)),u=h+1;continue}if(x==="/"){d=h;continue}}x==="["?a++:x==="]"?a--:x==="("?c++:x===")"&&c--}const i=r.length===0?o:o.slice(u);let f=i,m=!1;i.endsWith(on)?(f=i.slice(0,-1),m=!0):i.startsWith(on)&&(f=i.slice(1),m=!0);const g=d&&d>u?d-u:void 0;return rs(r,m,f,g)};if(t){const o=t+os,r=s;s=a=>a.startsWith(o)?r(a.slice(o.length)):rs(za,!1,a,void 0,!0)}if(n){const o=s;s=r=>n({className:r,parseClassName:o})}return s},Pa=e=>{const t=new Map;return e.orderSensitiveModifiers.forEach((n,s)=>{t.set(n,1e6+s)}),n=>{const s=[];let o=[];for(let r=0;r<n.length;r++){const a=n[r],c=a[0]==="[",u=t.has(a);c||u?(o.length>0&&(o.sort(),s.push(...o),o=[]),s.push(a)):o.push(a)}return o.length>0&&(o.sort(),s.push(...o)),s}},Ba=e=>({cache:Na(e.cacheSize),parseClassName:Aa(e),sortModifiers:Pa(e),postfixLookupClassGroupIds:La(e),...ka(e)}),La=e=>{const t=Object.create(null),n=e.postfixLookupClassGroups;if(n)for(let s=0;s<n.length;s++)t[n[s]]=!0;return t},Da=/\s+/,_a=(e,t)=>{const{parseClassName:n,getClassGroupId:s,getConflictingClassGroupIds:o,sortModifiers:r,postfixLookupClassGroupIds:a}=t,c=[],u=e.trim().split(Da);let d="";for(let p=u.length-1;p>=0;p-=1){const i=u[p],{isExternal:f,modifiers:m,hasImportantModifier:g,baseClassName:h,maybePostfixModifierPosition:x}=n(i);if(f){d=i+(d.length>0?" "+d:d);continue}let b=!!x,y;if(b){const I=h.substring(0,x);y=s(I);const C=y&&a[y]?s(h):void 0;C&&C!==y&&(y=C,b=!1)}else y=s(h);if(!y){if(!b){d=i+(d.length>0?" "+d:d);continue}if(y=s(h),!y){d=i+(d.length>0?" "+d:d);continue}b=!1}const w=m.length===0?"":m.length===1?m[0]:r(m).join(":"),k=g?w+on:w,S=k+y;if(c.indexOf(S)>-1)continue;c.push(S);const j=o(y,b);for(let I=0;I<j.length;++I){const C=j[I];c.push(k+C)}d=i+(d.length>0?" "+d:d)}return d},Fa=(...e)=>{let t=0,n,s,o="";for(;t<e.length;)(n=e[t++])&&(s=xo(n))&&(o&&(o+=" "),o+=s);return o},xo=e=>{if(typeof e=="string")return e;let t,n="";for(let s=0;s<e.length;s++)e[s]&&(t=xo(e[s]))&&(n&&(n+=" "),n+=t);return n},$a=(e,...t)=>{let n,s,o,r;const a=u=>{const d=t.reduce((p,i)=>i(p),e());return n=Ba(d),s=n.cache.get,o=n.cache.set,r=c,c(u)},c=u=>{const d=s(u);if(d)return d;const p=_a(u,n);return o(u,p),p};return r=a,(...u)=>r(Fa(...u))},Oa=[],ce=e=>{const t=n=>n[e]||Oa;return t.isThemeGetter=!0,t},vo=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,yo=/^\((?:(\w[\w-]*):)?(.+)\)$/i,Wa=/^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/,Ga=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Ua=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,Ha=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,qa=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Va=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,_e=e=>Wa.test(e),H=e=>!!e&&!Number.isNaN(Number(e)),Ie=e=>!!e&&Number.isInteger(Number(e)),Yt=e=>e.endsWith("%")&&H(e.slice(0,-1)),Be=e=>Ga.test(e),wo=()=>!0,Ya=e=>Ua.test(e)&&!Ha.test(e),Rn=()=>!1,Ja=e=>qa.test(e),Ka=e=>Va.test(e),Xa=e=>!T(e)&&!N(e),Za=e=>e.startsWith("@container")&&(e[10]==="/"&&e[11]!==void 0||e[11]==="s"&&e[16]!==void 0&&e.startsWith("-size/",10)||e[11]==="n"&&e[18]!==void 0&&e.startsWith("-normal/",10)),Qa=e=>He(e,Co,Rn),T=e=>vo.test(e),Ve=e=>He(e,Mo,Ya),as=e=>He(e,ii,H),ei=e=>He(e,jo,wo),ti=e=>He(e,Ro,Rn),is=e=>He(e,ko,Rn),ni=e=>He(e,So,Ka),zt=e=>He(e,Eo,Ja),N=e=>yo.test(e),vt=e=>nt(e,Mo),si=e=>nt(e,Ro),ls=e=>nt(e,ko),oi=e=>nt(e,Co),ri=e=>nt(e,So),At=e=>nt(e,Eo,!0),ai=e=>nt(e,jo,!0),He=(e,t,n)=>{const s=vo.exec(e);return s?s[1]?t(s[1]):n(s[2]):!1},nt=(e,t,n=!1)=>{const s=yo.exec(e);return s?s[1]?t(s[1]):n:!1},ko=e=>e==="position"||e==="percentage",So=e=>e==="image"||e==="url",Co=e=>e==="length"||e==="size"||e==="bg-size",Mo=e=>e==="length",ii=e=>e==="number",Ro=e=>e==="family-name",jo=e=>e==="number"||e==="weight",Eo=e=>e==="shadow",li=()=>{const e=ce("color"),t=ce("font"),n=ce("text"),s=ce("font-weight"),o=ce("tracking"),r=ce("leading"),a=ce("breakpoint"),c=ce("container"),u=ce("spacing"),d=ce("radius"),p=ce("shadow"),i=ce("inset-shadow"),f=ce("text-shadow"),m=ce("drop-shadow"),g=ce("blur"),h=ce("perspective"),x=ce("aspect"),b=ce("ease"),y=ce("animate"),w=()=>["auto","avoid","all","avoid-page","page","left","right","column"],k=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],S=()=>[...k(),N,T],j=()=>["auto","hidden","clip","visible","scroll"],I=()=>["auto","contain","none"],C=()=>[N,T,u],D=()=>[_e,"full","auto",...C()],ee=()=>[Ie,"none","subgrid",N,T],L=()=>["auto",{span:["full",Ie,N,T]},Ie,N,T],A=()=>[Ie,"auto",N,T],G=()=>["auto","min","max","fr",N,T],O=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],U=()=>["start","end","center","stretch","center-safe","end-safe"],B=()=>["auto",...C()],q=()=>[_e,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...C()],re=()=>[_e,"screen","full","dvw","lvw","svw","min","max","fit",...C()],ae=()=>[_e,"screen","full","lh","dvh","lvh","svh","min","max","fit",...C()],E=()=>[e,N,T],ie=()=>[...k(),ls,is,{position:[N,T]}],Ce=()=>["no-repeat",{repeat:["","x","y","space","round"]}],F=()=>["auto","cover","contain",oi,Qa,{size:[N,T]}],Y=()=>[Yt,vt,Ve],_=()=>["","none","full",d,N,T],W=()=>["",H,vt,Ve],K=()=>["solid","dashed","dotted","double"],V=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],R=()=>[H,Yt,ls,is],P=()=>["","none",g,N,T],Q=()=>["none",H,N,T],le=()=>["none",H,N,T],de=()=>[H,N,T],X=()=>[_e,"full",...C()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[Be],breakpoint:[Be],color:[wo],container:[Be],"drop-shadow":[Be],ease:["in","out","in-out"],font:[Xa],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[Be],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[Be],shadow:[Be],spacing:["px",H],text:[Be],"text-shadow":[Be],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",_e,T,N,x]}],container:["container"],"container-type":[{"@container":["","normal","size",N,T]}],"container-named":[Za],columns:[{columns:[H,T,N,c]}],"break-after":[{"break-after":w()}],"break-before":[{"break-before":w()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],sr:["sr-only","not-sr-only"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:S()}],overflow:[{overflow:j()}],"overflow-x":[{"overflow-x":j()}],"overflow-y":[{"overflow-y":j()}],overscroll:[{overscroll:I()}],"overscroll-x":[{"overscroll-x":I()}],"overscroll-y":[{"overscroll-y":I()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:D()}],"inset-x":[{"inset-x":D()}],"inset-y":[{"inset-y":D()}],start:[{"inset-s":D(),start:D()}],end:[{"inset-e":D(),end:D()}],"inset-bs":[{"inset-bs":D()}],"inset-be":[{"inset-be":D()}],top:[{top:D()}],right:[{right:D()}],bottom:[{bottom:D()}],left:[{left:D()}],visibility:["visible","invisible","collapse"],z:[{z:[Ie,"auto",N,T]}],basis:[{basis:[_e,"full","auto",c,...C()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[H,_e,"auto","initial","none",T]}],grow:[{grow:["",H,N,T]}],shrink:[{shrink:["",H,N,T]}],order:[{order:[Ie,"first","last","none",N,T]}],"grid-cols":[{"grid-cols":ee()}],"col-start-end":[{col:L()}],"col-start":[{"col-start":A()}],"col-end":[{"col-end":A()}],"grid-rows":[{"grid-rows":ee()}],"row-start-end":[{row:L()}],"row-start":[{"row-start":A()}],"row-end":[{"row-end":A()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":G()}],"auto-rows":[{"auto-rows":G()}],gap:[{gap:C()}],"gap-x":[{"gap-x":C()}],"gap-y":[{"gap-y":C()}],"justify-content":[{justify:[...O(),"normal"]}],"justify-items":[{"justify-items":[...U(),"normal"]}],"justify-self":[{"justify-self":["auto",...U()]}],"align-content":[{content:["normal",...O()]}],"align-items":[{items:[...U(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...U(),{baseline:["","last"]}]}],"place-content":[{"place-content":O()}],"place-items":[{"place-items":[...U(),"baseline"]}],"place-self":[{"place-self":["auto",...U()]}],p:[{p:C()}],px:[{px:C()}],py:[{py:C()}],ps:[{ps:C()}],pe:[{pe:C()}],pbs:[{pbs:C()}],pbe:[{pbe:C()}],pt:[{pt:C()}],pr:[{pr:C()}],pb:[{pb:C()}],pl:[{pl:C()}],m:[{m:B()}],mx:[{mx:B()}],my:[{my:B()}],ms:[{ms:B()}],me:[{me:B()}],mbs:[{mbs:B()}],mbe:[{mbe:B()}],mt:[{mt:B()}],mr:[{mr:B()}],mb:[{mb:B()}],ml:[{ml:B()}],"space-x":[{"space-x":C()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":C()}],"space-y-reverse":["space-y-reverse"],size:[{size:q()}],"inline-size":[{inline:["auto",...re()]}],"min-inline-size":[{"min-inline":["auto",...re()]}],"max-inline-size":[{"max-inline":["none",...re()]}],"block-size":[{block:["auto",...ae()]}],"min-block-size":[{"min-block":["auto",...ae()]}],"max-block-size":[{"max-block":["none",...ae()]}],w:[{w:[c,"screen",...q()]}],"min-w":[{"min-w":[c,"screen","none",...q()]}],"max-w":[{"max-w":[c,"screen","none","prose",{screen:[a]},...q()]}],h:[{h:["screen","lh",...q()]}],"min-h":[{"min-h":["screen","lh","none",...q()]}],"max-h":[{"max-h":["screen","lh",...q()]}],"font-size":[{text:["base",n,vt,Ve]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[s,ai,ei]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",Yt,T]}],"font-family":[{font:[si,ti,t]}],"font-features":[{"font-features":[T]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:[o,N,T]}],"line-clamp":[{"line-clamp":[H,"none",N,as]}],leading:[{leading:[r,...C()]}],"list-image":[{"list-image":["none",N,T]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",N,T]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:E()}],"text-color":[{text:E()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...K(),"wavy"]}],"text-decoration-thickness":[{decoration:[H,"from-font","auto",N,Ve]}],"text-decoration-color":[{decoration:E()}],"underline-offset":[{"underline-offset":[H,"auto",N,T]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:C()}],"tab-size":[{tab:[Ie,N,T]}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",N,T]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",N,T]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:ie()}],"bg-repeat":[{bg:Ce()}],"bg-size":[{bg:F()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},Ie,N,T],radial:["",N,T],conic:[Ie,N,T]},ri,ni]}],"bg-color":[{bg:E()}],"gradient-from-pos":[{from:Y()}],"gradient-via-pos":[{via:Y()}],"gradient-to-pos":[{to:Y()}],"gradient-from":[{from:E()}],"gradient-via":[{via:E()}],"gradient-to":[{to:E()}],rounded:[{rounded:_()}],"rounded-s":[{"rounded-s":_()}],"rounded-e":[{"rounded-e":_()}],"rounded-t":[{"rounded-t":_()}],"rounded-r":[{"rounded-r":_()}],"rounded-b":[{"rounded-b":_()}],"rounded-l":[{"rounded-l":_()}],"rounded-ss":[{"rounded-ss":_()}],"rounded-se":[{"rounded-se":_()}],"rounded-ee":[{"rounded-ee":_()}],"rounded-es":[{"rounded-es":_()}],"rounded-tl":[{"rounded-tl":_()}],"rounded-tr":[{"rounded-tr":_()}],"rounded-br":[{"rounded-br":_()}],"rounded-bl":[{"rounded-bl":_()}],"border-w":[{border:W()}],"border-w-x":[{"border-x":W()}],"border-w-y":[{"border-y":W()}],"border-w-s":[{"border-s":W()}],"border-w-e":[{"border-e":W()}],"border-w-bs":[{"border-bs":W()}],"border-w-be":[{"border-be":W()}],"border-w-t":[{"border-t":W()}],"border-w-r":[{"border-r":W()}],"border-w-b":[{"border-b":W()}],"border-w-l":[{"border-l":W()}],"divide-x":[{"divide-x":W()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":W()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...K(),"hidden","none"]}],"divide-style":[{divide:[...K(),"hidden","none"]}],"border-color":[{border:E()}],"border-color-x":[{"border-x":E()}],"border-color-y":[{"border-y":E()}],"border-color-s":[{"border-s":E()}],"border-color-e":[{"border-e":E()}],"border-color-bs":[{"border-bs":E()}],"border-color-be":[{"border-be":E()}],"border-color-t":[{"border-t":E()}],"border-color-r":[{"border-r":E()}],"border-color-b":[{"border-b":E()}],"border-color-l":[{"border-l":E()}],"divide-color":[{divide:E()}],"outline-style":[{outline:[...K(),"none","hidden"]}],"outline-offset":[{"outline-offset":[H,N,T]}],"outline-w":[{outline:["",H,vt,Ve]}],"outline-color":[{outline:E()}],shadow:[{shadow:["","none",p,At,zt]}],"shadow-color":[{shadow:E()}],"inset-shadow":[{"inset-shadow":["none",i,At,zt]}],"inset-shadow-color":[{"inset-shadow":E()}],"ring-w":[{ring:W()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:E()}],"ring-offset-w":[{"ring-offset":[H,Ve]}],"ring-offset-color":[{"ring-offset":E()}],"inset-ring-w":[{"inset-ring":W()}],"inset-ring-color":[{"inset-ring":E()}],"text-shadow":[{"text-shadow":["none",f,At,zt]}],"text-shadow-color":[{"text-shadow":E()}],opacity:[{opacity:[H,N,T]}],"mix-blend":[{"mix-blend":[...V(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":V()}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[H]}],"mask-image-linear-from-pos":[{"mask-linear-from":R()}],"mask-image-linear-to-pos":[{"mask-linear-to":R()}],"mask-image-linear-from-color":[{"mask-linear-from":E()}],"mask-image-linear-to-color":[{"mask-linear-to":E()}],"mask-image-t-from-pos":[{"mask-t-from":R()}],"mask-image-t-to-pos":[{"mask-t-to":R()}],"mask-image-t-from-color":[{"mask-t-from":E()}],"mask-image-t-to-color":[{"mask-t-to":E()}],"mask-image-r-from-pos":[{"mask-r-from":R()}],"mask-image-r-to-pos":[{"mask-r-to":R()}],"mask-image-r-from-color":[{"mask-r-from":E()}],"mask-image-r-to-color":[{"mask-r-to":E()}],"mask-image-b-from-pos":[{"mask-b-from":R()}],"mask-image-b-to-pos":[{"mask-b-to":R()}],"mask-image-b-from-color":[{"mask-b-from":E()}],"mask-image-b-to-color":[{"mask-b-to":E()}],"mask-image-l-from-pos":[{"mask-l-from":R()}],"mask-image-l-to-pos":[{"mask-l-to":R()}],"mask-image-l-from-color":[{"mask-l-from":E()}],"mask-image-l-to-color":[{"mask-l-to":E()}],"mask-image-x-from-pos":[{"mask-x-from":R()}],"mask-image-x-to-pos":[{"mask-x-to":R()}],"mask-image-x-from-color":[{"mask-x-from":E()}],"mask-image-x-to-color":[{"mask-x-to":E()}],"mask-image-y-from-pos":[{"mask-y-from":R()}],"mask-image-y-to-pos":[{"mask-y-to":R()}],"mask-image-y-from-color":[{"mask-y-from":E()}],"mask-image-y-to-color":[{"mask-y-to":E()}],"mask-image-radial":[{"mask-radial":[N,T]}],"mask-image-radial-from-pos":[{"mask-radial-from":R()}],"mask-image-radial-to-pos":[{"mask-radial-to":R()}],"mask-image-radial-from-color":[{"mask-radial-from":E()}],"mask-image-radial-to-color":[{"mask-radial-to":E()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":k()}],"mask-image-conic-pos":[{"mask-conic":[H]}],"mask-image-conic-from-pos":[{"mask-conic-from":R()}],"mask-image-conic-to-pos":[{"mask-conic-to":R()}],"mask-image-conic-from-color":[{"mask-conic-from":E()}],"mask-image-conic-to-color":[{"mask-conic-to":E()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:ie()}],"mask-repeat":[{mask:Ce()}],"mask-size":[{mask:F()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",N,T]}],filter:[{filter:["","none",N,T]}],blur:[{blur:P()}],brightness:[{brightness:[H,N,T]}],contrast:[{contrast:[H,N,T]}],"drop-shadow":[{"drop-shadow":["","none",m,At,zt]}],"drop-shadow-color":[{"drop-shadow":E()}],grayscale:[{grayscale:["",H,N,T]}],"hue-rotate":[{"hue-rotate":[H,N,T]}],invert:[{invert:["",H,N,T]}],saturate:[{saturate:[H,N,T]}],sepia:[{sepia:["",H,N,T]}],"backdrop-filter":[{"backdrop-filter":["","none",N,T]}],"backdrop-blur":[{"backdrop-blur":P()}],"backdrop-brightness":[{"backdrop-brightness":[H,N,T]}],"backdrop-contrast":[{"backdrop-contrast":[H,N,T]}],"backdrop-grayscale":[{"backdrop-grayscale":["",H,N,T]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[H,N,T]}],"backdrop-invert":[{"backdrop-invert":["",H,N,T]}],"backdrop-opacity":[{"backdrop-opacity":[H,N,T]}],"backdrop-saturate":[{"backdrop-saturate":[H,N,T]}],"backdrop-sepia":[{"backdrop-sepia":["",H,N,T]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":C()}],"border-spacing-x":[{"border-spacing-x":C()}],"border-spacing-y":[{"border-spacing-y":C()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",N,T]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[H,"initial",N,T]}],ease:[{ease:["linear","initial",b,N,T]}],delay:[{delay:[H,N,T]}],animate:[{animate:["none",y,N,T]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[h,N,T]}],"perspective-origin":[{"perspective-origin":S()}],rotate:[{rotate:Q()}],"rotate-x":[{"rotate-x":Q()}],"rotate-y":[{"rotate-y":Q()}],"rotate-z":[{"rotate-z":Q()}],scale:[{scale:le()}],"scale-x":[{"scale-x":le()}],"scale-y":[{"scale-y":le()}],"scale-z":[{"scale-z":le()}],"scale-3d":["scale-3d"],skew:[{skew:de()}],"skew-x":[{"skew-x":de()}],"skew-y":[{"skew-y":de()}],transform:[{transform:[N,T,"","none","gpu","cpu"]}],"transform-origin":[{origin:S()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:X()}],"translate-x":[{"translate-x":X()}],"translate-y":[{"translate-y":X()}],"translate-z":[{"translate-z":X()}],"translate-none":["translate-none"],zoom:[{zoom:[Ie,N,T]}],accent:[{accent:E()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:E()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",N,T]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scrollbar-thumb-color":[{"scrollbar-thumb":E()}],"scrollbar-track-color":[{"scrollbar-track":E()}],"scrollbar-gutter":[{"scrollbar-gutter":["auto","stable","both"]}],"scrollbar-w":[{scrollbar:["auto","thin","none"]}],"scroll-m":[{"scroll-m":C()}],"scroll-mx":[{"scroll-mx":C()}],"scroll-my":[{"scroll-my":C()}],"scroll-ms":[{"scroll-ms":C()}],"scroll-me":[{"scroll-me":C()}],"scroll-mbs":[{"scroll-mbs":C()}],"scroll-mbe":[{"scroll-mbe":C()}],"scroll-mt":[{"scroll-mt":C()}],"scroll-mr":[{"scroll-mr":C()}],"scroll-mb":[{"scroll-mb":C()}],"scroll-ml":[{"scroll-ml":C()}],"scroll-p":[{"scroll-p":C()}],"scroll-px":[{"scroll-px":C()}],"scroll-py":[{"scroll-py":C()}],"scroll-ps":[{"scroll-ps":C()}],"scroll-pe":[{"scroll-pe":C()}],"scroll-pbs":[{"scroll-pbs":C()}],"scroll-pbe":[{"scroll-pbe":C()}],"scroll-pt":[{"scroll-pt":C()}],"scroll-pr":[{"scroll-pr":C()}],"scroll-pb":[{"scroll-pb":C()}],"scroll-pl":[{"scroll-pl":C()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",N,T]}],fill:[{fill:["none",...E()]}],"stroke-w":[{stroke:[H,vt,Ve,as]}],stroke:[{stroke:["none",...E()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{"container-named":["container-type"],overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","inset-bs","inset-be","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pbs","pbe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mbs","mbe","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-x","border-w-y","border-w-s","border-w-e","border-w-bs","border-w-be","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-x","border-color-y","border-color-s","border-color-e","border-color-bs","border-color-be","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mbs","scroll-mbe","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pbs","scroll-pbe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]},postfixLookupClassGroups:["container-type"],orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}},ci=$a(li);function J(...e){return ci(po(e))}function cs({className:e,children:t,value:n,...s}){return l.jsxs(ea,{value:n,"data-slot":"progress",className:J("flex flex-wrap gap-3",e),...s,children:[t,l.jsx(di,{children:l.jsx(ui,{})})]})}function di({className:e,...t}){return l.jsx(ta,{className:J("relative flex h-1 w-full items-center overflow-x-hidden rounded-full bg-muted",e),"data-slot":"progress-track",...t})}function ui({className:e,...t}){return l.jsx(na,{"data-slot":"progress-indicator",className:J("h-full bg-primary transition-all",e),...t})}const ds=e=>{let t;const n=new Set,s=(d,p)=>{const i=typeof d=="function"?d(t):d;if(!Object.is(i,t)){const f=t;t=p??(typeof i!="object"||i===null)?i:Object.assign({},t,i),n.forEach(m=>m(t,f))}},o=()=>t,c={setState:s,getState:o,getInitialState:()=>u,subscribe:d=>(n.add(d),()=>n.delete(d))},u=t=e(s,o,c);return c},fi=(e=>e?ds(e):ds),pi=e=>e;function mi(e,t=pi){const n=M.useSyncExternalStore(e.subscribe,M.useCallback(()=>t(e.getState()),[e,t]),M.useCallback(()=>t(e.getInitialState()),[e,t]));return M.useDebugValue(n),n}const Io=1,To={observed:"Observed in this event log.",explicitlyDisabled:"Explicitly disabled in this event log.",noObservedExecutorMetrics:"Not emitted by this event log.",noObservedStageSubmission:"Not emitted by this event log.",noRddStorageSnapshot:"Stages were submitted without RDD storage snapshots.",noResolvedSqlPlan:"Not emitted by this event log.",noSqlExecution:"Not applicable to this event log.",noEnvironmentUpdate:"Not emitted by this event log.",noTaskRecords:"Not emitted by this event log.",noUsableCoreTimeAggregate:"No usable aggregate was emitted.",outsideEventLogScope:"Available outside local event-log scope.",parseIncomplete:"Cannot determine from an incomplete parse."};function yt(e,t,n){return{key:e,state:"present",reasonCode:"observed",summary:To.observed,evidence:{eventType:t,count:n}}}function Je(e,t,n){return{key:e,state:t,reasonCode:n,summary:To[n]}}function Fe(e,t){const n=e[t];return typeof n=="number"&&Number.isFinite(n)&&n>0?n:0}function hi(e){return e!=null&&e.schemaVersion===Io}function us(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function gi(e){const t=e?.perStage;return t!=null&&typeof t=="object"&&!Array.isArray(t)&&Object.values(t).some(n=>us(n?.taskCount)&&us(n?.totalTaskDurationSum))}function bi(e,t){return e!=null&&String(e).toLowerCase()===t}function lt(e,t,n){return n?Je(e,t==="noSqlExecution"?"notApplicable":"notEmitted",t):Je(e,"unknown","parseIncomplete")}function fs(e,{skippedLines:t=0}={}){const n=e?.app,s=n?.evidenceInputs??{},o=t===0&&Fe(s,"applicationEnds")>0,r=Fe(s,"executorMetricRows"),a=Fe(s,"stageSubmissions"),c=Fe(s,"rddStorageSnapshots"),u=Fe(s,"resolvedSqlPlans"),d=Fe(s,"sqlExecutions"),p=Fe(s,"environmentUpdates"),i=Fe(s,"taskRecords"),f=r>0?yt("executorMetrics","executorMetricRows",r):bi(n?.config?.["spark.eventLog.logStageExecutorMetrics"],"false")?Je("executorMetrics","disabled","explicitlyDisabled"):lt("executorMetrics","noObservedExecutorMetrics",o),m=c>0?yt("rddStorageSnapshots","rddStorageSnapshots",c):lt("rddStorageSnapshots",a===0?"noObservedStageSubmission":"noRddStorageSnapshot",o),g=u>0?yt("sqlPlan","resolvedSqlPlans",u):d>0&&o?Je("sqlPlan","notEmitted","noResolvedSqlPlan"):lt("sqlPlan","noSqlExecution",o),h=p>0?yt("sparkConfiguration","environmentUpdates",p):lt("sparkConfiguration","noEnvironmentUpdate",o),x=i===0?lt("taskCoreTime","noTaskRecords",o):gi(e?.runAggregates)?yt("taskCoreTime","taskRecords",i):lt("taskCoreTime","noUsableCoreTimeAggregate",o);return{schemaVersion:Io,entries:[f,m,g,h,x,Je("infrastructureContext","outsideEventLog","outsideEventLogScope"),Je("sourceContext","outsideEventLog","outsideEventLogScope"),Je("costContext","outsideEventLog","outsideEventLogScope")]}}function rn(e,t,n){return{app:e.app,stages:new Map(e.stages),executors:{added:[...e.executors.added],removed:[...e.executors.removed]},sql:new Map(e.sql),jobs:new Map(e.jobs),runAggregates:e.runAggregates,evidenceAvailability:e.evidenceAvailability,catalog:[...t],taskData:new Map(n)}}function ps(e,t,n){e.app=n.app,e.stages=new Map(n.stages),e.executors={added:[...n.executors.added],removed:[...n.executors.removed]},e.sql=new Map(n.sql),e.jobs=new Map(n.jobs),e.runAggregates=n.runAggregates??null,e.evidenceAvailability=hi(n.evidenceAvailability)?n.evidenceAvailability:null,t.clear();for(const[s,o]of n.taskData)t.set(s,o);return[...n.catalog]}function ms(){return{app:null,stages:new Map,executors:{added:[],removed:[]},sql:new Map,jobs:new Map,runAggregates:null,evidenceAvailability:null}}function xi(){if(typeof window>"u")return"dark";try{const e=window.localStorage.getItem("shuffle-works-theme");if(e==="light"||e==="dark")return e}catch{}return window.matchMedia?.("(prefers-color-scheme: light)").matches?"light":"dark"}const z=fi(e=>({appModel:ms(),catalog:[],configFindings:[],activeFileId:null,sessionCache:new Map,taskDataCache:new Map,parse:{pct:0,lines:0,etaMs:null},status:"idle",shsParsing:!1,errorMessage:null,theme:xi(),skippedLines:0,comparison:{active:!1,baselineId:null,candidateId:null},compareLoad:null,planGraph:{active:!1,stageId:null,initialScope:"segment"},modelResetCount:0,openComparison:(t,n)=>e(s=>(s.activeFileId!=null&&s.appModel.app&&s.sessionCache.set(s.activeFileId,rn(s.appModel,s.catalog,s.taskDataCache)),{comparison:{active:!0,baselineId:t,candidateId:n}})),setComparisonActive:t=>e(n=>({comparison:{...n.comparison,active:t}})),setCompareLoad:t=>e({compareLoad:t}),closeComparison:()=>e({comparison:{active:!1,baselineId:null,candidateId:null}}),openPlanGraph:(t,n)=>e({planGraph:{active:!0,stageId:t,initialScope:n?.initialScope??"segment"}}),closePlanGraph:()=>e({planGraph:{active:!1,stageId:null,initialScope:"segment"}}),resetModel:()=>e(t=>({appModel:ms(),catalog:[],configFindings:[],taskDataCache:new Map,status:"idle",shsParsing:!1,errorMessage:null,skippedLines:0,comparison:{active:!1,baselineId:null,candidateId:null},compareLoad:null,planGraph:{active:!1,stageId:null,initialScope:"segment"},modelResetCount:t.modelResetCount+1})),setStatus:t=>e({status:t}),setShsParsing:t=>e({shsParsing:t}),setParse:t=>e({parse:t}),setCatalog:t=>e({catalog:t}),setConfigFindings:t=>e({configFindings:t}),setTaskData:(t,n)=>e(s=>{const o=new Map(s.taskDataCache);return o.set(t,n),{taskDataCache:o}}),setActiveFile:t=>e({activeFileId:t}),setError:t=>e({errorMessage:t,status:t?"error":z.getState().status}),setTheme:t=>e({theme:t}),setSkippedLines:t=>e({skippedLines:t}),setEvidenceAvailability:t=>e(n=>({appModel:{...n.appModel,evidenceAvailability:t}}))}));function oe(e){return mi(z,e)}const No=v.createContext(null);function vi({children:e}){const t=oe(s=>s.theme);v.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]);const n=()=>z.getState().setTheme(t==="dark"?"light":"dark");return l.jsx(No.Provider,{value:{theme:t,toggle:n},children:e})}function jn(){const e=v.useContext(No);if(!e)throw new Error("useTheme outside ThemeProvider");return e}function yi(e){if(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))}const wi=e=>{switch(e){case"success":return Ci;case"info":return Ri;case"warning":return Mi;case"error":return ji;default:return null}},ki=Array(12).fill(0),Si=({visible:e,className:t})=>M.createElement("div",{className:["sonner-loading-wrapper",t].filter(Boolean).join(" "),"data-visible":e},M.createElement("div",{className:"sonner-spinner"},ki.map((n,s)=>M.createElement("div",{className:"sonner-loading-bar",key:`spinner-bar-${s}`})))),Ci=M.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},M.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"})),Mi=M.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",height:"20",width:"20"},M.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"})),Ri=M.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},M.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"})),ji=M.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},M.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"})),Ei=M.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"},M.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),M.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"})),Ii=()=>{const[e,t]=M.useState(document.hidden);return M.useEffect(()=>{const n=()=>{t(document.hidden)};return document.addEventListener("visibilitychange",n),()=>window.removeEventListener("visibilitychange",n)},[]),e};let an=1;class Ti{constructor(){this.subscribe=t=>(this.subscribers.push(t),()=>{const n=this.subscribers.indexOf(t);this.subscribers.splice(n,1)}),this.publish=t=>{this.subscribers.forEach(n=>n(t))},this.addToast=t=>{this.publish(t),this.toasts=[...this.toasts,t]},this.create=t=>{var n;const{message:s,...o}=t,r=typeof t?.id=="number"||((n=t.id)==null?void 0:n.length)>0?t.id:an++,a=this.toasts.find(u=>u.id===r),c=t.dismissible===void 0?!0:t.dismissible;return this.dismissedToasts.has(r)&&this.dismissedToasts.delete(r),a?this.toasts=this.toasts.map(u=>u.id===r?(this.publish({...u,...t,id:r,title:s}),{...u,...t,id:r,dismissible:c,title:s}):u):this.addToast({title:s,...o,dismissible:c,id:r}),r},this.dismiss=t=>(t?(this.dismissedToasts.add(t),requestAnimationFrame(()=>this.subscribers.forEach(n=>n({id:t,dismiss:!0})))):this.toasts.forEach(n=>{this.subscribers.forEach(s=>s({id:n.id,dismiss:!0}))}),t),this.message=(t,n)=>this.create({...n,message:t}),this.error=(t,n)=>this.create({...n,message:t,type:"error"}),this.success=(t,n)=>this.create({...n,type:"success",message:t}),this.info=(t,n)=>this.create({...n,type:"info",message:t}),this.warning=(t,n)=>this.create({...n,type:"warning",message:t}),this.loading=(t,n)=>this.create({...n,type:"loading",message:t}),this.promise=(t,n)=>{if(!n)return;let s;n.loading!==void 0&&(s=this.create({...n,promise:t,type:"loading",message:n.loading,description:typeof n.description!="function"?n.description:void 0}));const o=Promise.resolve(t instanceof Function?t():t);let r=s!==void 0,a;const c=o.then(async d=>{if(a=["resolve",d],M.isValidElement(d))r=!1,this.create({id:s,type:"default",message:d});else if(zi(d)&&!d.ok){r=!1;const i=typeof n.error=="function"?await n.error(`HTTP error! status: ${d.status}`):n.error,f=typeof n.description=="function"?await n.description(`HTTP error! status: ${d.status}`):n.description,g=typeof i=="object"&&!M.isValidElement(i)?i:{message:i};this.create({id:s,type:"error",description:f,...g})}else if(d instanceof Error){r=!1;const i=typeof n.error=="function"?await n.error(d):n.error,f=typeof n.description=="function"?await n.description(d):n.description,g=typeof i=="object"&&!M.isValidElement(i)?i:{message:i};this.create({id:s,type:"error",description:f,...g})}else if(n.success!==void 0){r=!1;const i=typeof n.success=="function"?await n.success(d):n.success,f=typeof n.description=="function"?await n.description(d):n.description,g=typeof i=="object"&&!M.isValidElement(i)?i:{message:i};this.create({id:s,type:"success",description:f,...g})}}).catch(async d=>{if(a=["reject",d],n.error!==void 0){r=!1;const p=typeof n.error=="function"?await n.error(d):n.error,i=typeof n.description=="function"?await n.description(d):n.description,m=typeof p=="object"&&!M.isValidElement(p)?p:{message:p};this.create({id:s,type:"error",description:i,...m})}}).finally(()=>{r&&(this.dismiss(s),s=void 0),n.finally==null||n.finally.call(n)}),u=()=>new Promise((d,p)=>c.then(()=>a[0]==="reject"?p(a[1]):d(a[1])).catch(p));return typeof s!="string"&&typeof s!="number"?{unwrap:u}:Object.assign(s,{unwrap:u})},this.custom=(t,n)=>{const s=n?.id||an++;return this.create({jsx:t(s),id:s,...n}),s},this.getActiveToasts=()=>this.toasts.filter(t=>!this.dismissedToasts.has(t.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}}const ve=new Ti,Ni=(e,t)=>{const n=t?.id||an++;return ve.addToast({title:e,...t,id:n}),n},zi=e=>e&&typeof e=="object"&&"ok"in e&&typeof e.ok=="boolean"&&"status"in e&&typeof e.status=="number",Ai=Ni,Pi=()=>ve.toasts,Bi=()=>ve.getActiveToasts(),Li=Object.assign(Ai,{success:ve.success,info:ve.info,warning:ve.warning,error:ve.error,custom:ve.custom,message:ve.message,promise:ve.promise,dismiss:ve.dismiss,loading:ve.loading},{getHistory:Pi,getToasts:Bi});yi("[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}[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(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);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]{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 Pt(e){return e.label!==void 0}const Di=3,_i="24px",Fi="16px",hs=4e3,$i=356,Oi=14,Wi=45,Gi=200;function Te(...e){return e.filter(Boolean).join(" ")}function Ui(e){const[t,n]=e.split("-"),s=[];return t&&s.push(t),n&&s.push(n),s}const Hi=e=>{var t,n,s,o,r,a,c,u,d;const{invert:p,toast:i,unstyled:f,interacting:m,setHeights:g,visibleToasts:h,heights:x,index:b,toasts:y,expanded:w,removeToast:k,defaultRichColors:S,closeButton:j,style:I,cancelButtonStyle:C,actionButtonStyle:D,className:ee="",descriptionClassName:L="",duration:A,position:G,gap:O,expandByDefault:U,classNames:B,icons:q,closeButtonAriaLabel:re="Close toast"}=e,[ae,E]=M.useState(null),[ie,Ce]=M.useState(null),[F,Y]=M.useState(!1),[_,W]=M.useState(!1),[K,V]=M.useState(!1),[R,P]=M.useState(!1),[Q,le]=M.useState(!1),[de,X]=M.useState(0),[Gr,Vn]=M.useState(0),xt=M.useRef(i.duration||A||hs),Yn=M.useRef(null),Pe=M.useRef(null),Ur=b===0,Hr=b+1<=h,we=i.type,rt=i.dismissible!==!1,qr=i.className||"",Vr=i.descriptionClassName||"",It=M.useMemo(()=>x.findIndex($=>$.toastId===i.id)||0,[x,i.id]),Yr=M.useMemo(()=>{var $;return($=i.closeButton)!=null?$:j},[i.closeButton,j]),Jn=M.useMemo(()=>i.duration||A||hs,[i.duration,A]),qt=M.useRef(0),at=M.useRef(0),Kn=M.useRef(0),it=M.useRef(null),[Jr,Kr]=G.split("-"),Xn=M.useMemo(()=>x.reduce(($,ue,he)=>he>=It?$:$+ue.height,0),[x,It]),Zn=Ii(),Xr=i.invert||p,Vt=we==="loading";at.current=M.useMemo(()=>It*O+Xn,[It,Xn]),M.useEffect(()=>{xt.current=Jn},[Jn]),M.useEffect(()=>{Y(!0)},[]),M.useEffect(()=>{const $=Pe.current;if($){const ue=$.getBoundingClientRect().height;return Vn(ue),g(he=>[{toastId:i.id,height:ue,position:i.position},...he]),()=>g(he=>he.filter(ke=>ke.toastId!==i.id))}},[g,i.id]),M.useLayoutEffect(()=>{if(!F)return;const $=Pe.current,ue=$.style.height;$.style.height="auto";const he=$.getBoundingClientRect().height;$.style.height=ue,Vn(he),g(ke=>ke.find(me=>me.toastId===i.id)?ke.map(me=>me.toastId===i.id?{...me,height:he}:me):[{toastId:i.id,height:he,position:i.position},...ke])},[F,i.title,i.description,g,i.id,i.jsx,i.action,i.cancel]);const De=M.useCallback(()=>{W(!0),X(at.current),g($=>$.filter(ue=>ue.toastId!==i.id)),setTimeout(()=>{k(i)},Gi)},[i,k,g,at]);M.useEffect(()=>{if(i.promise&&we==="loading"||i.duration===1/0||i.type==="loading")return;let $;return w||m||Zn?(()=>{if(Kn.current<qt.current){const ke=new Date().getTime()-qt.current;xt.current=xt.current-ke}Kn.current=new Date().getTime()})():xt.current!==1/0&&(qt.current=new Date().getTime(),$=setTimeout(()=>{i.onAutoClose==null||i.onAutoClose.call(i,i),De()},xt.current)),()=>clearTimeout($)},[w,m,i,we,Zn,De]),M.useEffect(()=>{i.delete&&(De(),i.onDismiss==null||i.onDismiss.call(i,i))},[De,i.delete]);function Zr(){var $;if(q?.loading){var ue;return M.createElement("div",{className:Te(B?.loader,i==null||(ue=i.classNames)==null?void 0:ue.loader,"sonner-loader"),"data-visible":we==="loading"},q.loading)}return M.createElement(Si,{className:Te(B?.loader,i==null||($=i.classNames)==null?void 0:$.loader),visible:we==="loading"})}const Qr=i.icon||q?.[we]||wi(we);var Qn,es;return M.createElement("li",{tabIndex:0,ref:Pe,className:Te(ee,qr,B?.toast,i==null||(t=i.classNames)==null?void 0:t.toast,B?.default,B?.[we],i==null||(n=i.classNames)==null?void 0:n[we]),"data-sonner-toast":"","data-rich-colors":(Qn=i.richColors)!=null?Qn:S,"data-styled":!(i.jsx||i.unstyled||f),"data-mounted":F,"data-promise":!!i.promise,"data-swiped":Q,"data-removed":_,"data-visible":Hr,"data-y-position":Jr,"data-x-position":Kr,"data-index":b,"data-front":Ur,"data-swiping":K,"data-dismissible":rt,"data-type":we,"data-invert":Xr,"data-swipe-out":R,"data-swipe-direction":ie,"data-expanded":!!(w||U&&F),"data-testid":i.testId,style:{"--index":b,"--toasts-before":b,"--z-index":y.length-b,"--offset":`${_?de:at.current}px`,"--initial-height":U?"auto":`${Gr}px`,...I,...i.style},onDragEnd:()=>{V(!1),E(null),it.current=null},onPointerDown:$=>{$.button!==2&&(Vt||!rt||(Yn.current=new Date,X(at.current),$.target.setPointerCapture($.pointerId),$.target.tagName!=="BUTTON"&&(V(!0),it.current={x:$.clientX,y:$.clientY})))},onPointerUp:()=>{var $,ue,he;if(R||!rt)return;it.current=null;const ke=Number((($=Pe.current)==null?void 0:$.style.getPropertyValue("--swipe-amount-x").replace("px",""))||0),Tt=Number(((ue=Pe.current)==null?void 0:ue.style.getPropertyValue("--swipe-amount-y").replace("px",""))||0),me=new Date().getTime()-((he=Yn.current)==null?void 0:he.getTime()),Me=ae==="x"?ke:Tt,Nt=Math.abs(Me)/me;if(Math.abs(Me)>=Wi||Nt>.11){X(at.current),i.onDismiss==null||i.onDismiss.call(i,i),Ce(ae==="x"?ke>0?"right":"left":Tt>0?"down":"up"),De(),P(!0);return}else{var Re,je;(Re=Pe.current)==null||Re.style.setProperty("--swipe-amount-x","0px"),(je=Pe.current)==null||je.style.setProperty("--swipe-amount-y","0px")}le(!1),V(!1),E(null)},onPointerMove:$=>{var ue,he,ke;if(!it.current||!rt||((ue=window.getSelection())==null?void 0:ue.toString().length)>0)return;const me=$.clientY-it.current.y,Me=$.clientX-it.current.x;var Nt;const Re=(Nt=e.swipeDirections)!=null?Nt:Ui(G);!ae&&(Math.abs(Me)>1||Math.abs(me)>1)&&E(Math.abs(Me)>Math.abs(me)?"x":"y");let je={x:0,y:0};const ts=qe=>1/(1.5+Math.abs(qe)/20);if(ae==="y"){if(Re.includes("top")||Re.includes("bottom"))if(Re.includes("top")&&me<0||Re.includes("bottom")&&me>0)je.y=me;else{const qe=me*ts(me);je.y=Math.abs(qe)<Math.abs(me)?qe:me}}else if(ae==="x"&&(Re.includes("left")||Re.includes("right")))if(Re.includes("left")&&Me<0||Re.includes("right")&&Me>0)je.x=Me;else{const qe=Me*ts(Me);je.x=Math.abs(qe)<Math.abs(Me)?qe:Me}(Math.abs(je.x)>0||Math.abs(je.y)>0)&&le(!0),(he=Pe.current)==null||he.style.setProperty("--swipe-amount-x",`${je.x}px`),(ke=Pe.current)==null||ke.style.setProperty("--swipe-amount-y",`${je.y}px`)}},Yr&&!i.jsx&&we!=="loading"?M.createElement("button",{"aria-label":re,"data-disabled":Vt,"data-close-button":!0,onClick:Vt||!rt?()=>{}:()=>{De(),i.onDismiss==null||i.onDismiss.call(i,i)},className:Te(B?.closeButton,i==null||(s=i.classNames)==null?void 0:s.closeButton)},(es=q?.close)!=null?es:Ei):null,(we||i.icon||i.promise)&&i.icon!==null&&(q?.[we]!==null||i.icon)?M.createElement("div",{"data-icon":"",className:Te(B?.icon,i==null||(o=i.classNames)==null?void 0:o.icon)},i.promise||i.type==="loading"&&!i.icon?i.icon||Zr():null,i.type!=="loading"?Qr:null):null,M.createElement("div",{"data-content":"",className:Te(B?.content,i==null||(r=i.classNames)==null?void 0:r.content)},M.createElement("div",{"data-title":"",className:Te(B?.title,i==null||(a=i.classNames)==null?void 0:a.title)},i.jsx?i.jsx:typeof i.title=="function"?i.title():i.title),i.description?M.createElement("div",{"data-description":"",className:Te(L,Vr,B?.description,i==null||(c=i.classNames)==null?void 0:c.description)},typeof i.description=="function"?i.description():i.description):null),M.isValidElement(i.cancel)?i.cancel:i.cancel&&Pt(i.cancel)?M.createElement("button",{"data-button":!0,"data-cancel":!0,style:i.cancelButtonStyle||C,onClick:$=>{Pt(i.cancel)&&rt&&(i.cancel.onClick==null||i.cancel.onClick.call(i.cancel,$),De())},className:Te(B?.cancelButton,i==null||(u=i.classNames)==null?void 0:u.cancelButton)},i.cancel.label):null,M.isValidElement(i.action)?i.action:i.action&&Pt(i.action)?M.createElement("button",{"data-button":!0,"data-action":!0,style:i.actionButtonStyle||D,onClick:$=>{Pt(i.action)&&(i.action.onClick==null||i.action.onClick.call(i.action,$),!$.defaultPrevented&&De())},className:Te(B?.actionButton,i==null||(d=i.classNames)==null?void 0:d.actionButton)},i.action.label):null)};function gs(){if(typeof window>"u"||typeof document>"u")return"ltr";const e=document.documentElement.getAttribute("dir");return e==="auto"||!e?window.getComputedStyle(document.documentElement).direction:e}function qi(e,t){const n={};return[e,t].forEach((s,o)=>{const r=o===1,a=r?"--mobile-offset":"--offset",c=r?Fi:_i;function u(d){["top","right","bottom","left"].forEach(p=>{n[`${a}-${p}`]=typeof d=="number"?`${d}px`:d})}typeof s=="number"||typeof s=="string"?u(s):typeof s=="object"?["top","right","bottom","left"].forEach(d=>{s[d]===void 0?n[`${a}-${d}`]=c:n[`${a}-${d}`]=typeof s[d]=="number"?`${s[d]}px`:s[d]}):u(c)}),n}const Vi=M.forwardRef(function(t,n){const{id:s,invert:o,position:r="bottom-right",hotkey:a=["altKey","KeyT"],expand:c,closeButton:u,className:d,offset:p,mobileOffset:i,theme:f="light",richColors:m,duration:g,style:h,visibleToasts:x=Di,toastOptions:b,dir:y=gs(),gap:w=Oi,icons:k,containerAriaLabel:S="Notifications"}=t,[j,I]=M.useState([]),C=M.useMemo(()=>s?j.filter(F=>F.toasterId===s):j.filter(F=>!F.toasterId),[j,s]),D=M.useMemo(()=>Array.from(new Set([r].concat(C.filter(F=>F.position).map(F=>F.position)))),[C,r]),[ee,L]=M.useState([]),[A,G]=M.useState(!1),[O,U]=M.useState(!1),[B,q]=M.useState(f!=="system"?f:typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),re=M.useRef(null),ae=a.join("+").replace(/Key/g,"").replace(/Digit/g,""),E=M.useRef(null),ie=M.useRef(!1),Ce=M.useCallback(F=>{I(Y=>{var _;return(_=Y.find(W=>W.id===F.id))!=null&&_.delete||ve.dismiss(F.id),Y.filter(({id:W})=>W!==F.id)})},[]);return M.useEffect(()=>ve.subscribe(F=>{if(F.dismiss){requestAnimationFrame(()=>{I(Y=>Y.map(_=>_.id===F.id?{..._,delete:!0}:_))});return}setTimeout(()=>{sa.flushSync(()=>{I(Y=>{const _=Y.findIndex(W=>W.id===F.id);return _!==-1?[...Y.slice(0,_),{...Y[_],...F},...Y.slice(_+1)]:[F,...Y]})})})}),[j]),M.useEffect(()=>{if(f!=="system"){q(f);return}if(f==="system"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?q("dark"):q("light")),typeof window>"u")return;const F=window.matchMedia("(prefers-color-scheme: dark)");try{F.addEventListener("change",({matches:Y})=>{q(Y?"dark":"light")})}catch{F.addListener(({matches:_})=>{try{q(_?"dark":"light")}catch(W){console.error(W)}})}},[f]),M.useEffect(()=>{j.length<=1&&G(!1)},[j]),M.useEffect(()=>{const F=Y=>{var _;if(a.every(V=>Y[V]||Y.code===V)){var K;G(!0),(K=re.current)==null||K.focus()}Y.code==="Escape"&&(document.activeElement===re.current||(_=re.current)!=null&&_.contains(document.activeElement))&&G(!1)};return document.addEventListener("keydown",F),()=>document.removeEventListener("keydown",F)},[a]),M.useEffect(()=>{if(re.current)return()=>{E.current&&(E.current.focus({preventScroll:!0}),E.current=null,ie.current=!1)}},[re.current]),M.createElement("section",{ref:n,"aria-label":`${S} ${ae}`,tabIndex:-1,"aria-live":"polite","aria-relevant":"additions text","aria-atomic":"false",suppressHydrationWarning:!0},D.map((F,Y)=>{var _;const[W,K]=F.split("-");return C.length?M.createElement("ol",{key:F,dir:y==="auto"?gs():y,tabIndex:-1,ref:re,className:d,"data-sonner-toaster":!0,"data-sonner-theme":B,"data-y-position":W,"data-x-position":K,style:{"--front-toast-height":`${((_=ee[0])==null?void 0:_.height)||0}px`,"--width":`${$i}px`,"--gap":`${w}px`,...h,...qi(p,i)},onBlur:V=>{ie.current&&!V.currentTarget.contains(V.relatedTarget)&&(ie.current=!1,E.current&&(E.current.focus({preventScroll:!0}),E.current=null))},onFocus:V=>{V.target instanceof HTMLElement&&V.target.dataset.dismissible==="false"||ie.current||(ie.current=!0,E.current=V.relatedTarget)},onMouseEnter:()=>G(!0),onMouseMove:()=>G(!0),onMouseLeave:()=>{O||G(!1)},onDragEnd:()=>G(!1),onPointerDown:V=>{V.target instanceof HTMLElement&&V.target.dataset.dismissible==="false"||U(!0)},onPointerUp:()=>U(!1)},C.filter(V=>!V.position&&Y===0||V.position===F).map((V,R)=>{var P,Q;return M.createElement(Hi,{key:V.id,icons:k,index:R,toast:V,defaultRichColors:m,duration:(P=b?.duration)!=null?P:g,className:b?.className,descriptionClassName:b?.descriptionClassName,invert:o,visibleToasts:x,closeButton:(Q=b?.closeButton)!=null?Q:u,interacting:O,position:F,style:b?.style,unstyled:b?.unstyled,classNames:b?.classNames,cancelButtonStyle:b?.cancelButtonStyle,actionButtonStyle:b?.actionButtonStyle,closeButtonAriaLabel:b?.closeButtonAriaLabel,removeToast:Ce,toasts:C.filter(le=>le.position==V.position),heights:ee.filter(le=>le.position==V.position),setHeights:L,expandByDefault:c,gap:w,expanded:A,swipeDirections:t.swipeDirections})})):null}))});const zo=(...e)=>e.filter((t,n,s)=>!!t&&t.trim()!==""&&s.indexOf(t)===n).join(" ").trim();const Yi=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();const Ji=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(t,n,s)=>s?s.toUpperCase():n.toLowerCase());const bs=e=>{const t=Ji(e);return t.charAt(0).toUpperCase()+t.slice(1)};var Jt={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const Ki=e=>{for(const t in e)if(t.startsWith("aria-")||t==="role"||t==="title")return!0;return!1},Xi=v.createContext({}),Zi=()=>v.useContext(Xi),Qi=v.forwardRef(({color:e,size:t,strokeWidth:n,absoluteStrokeWidth:s,className:o="",children:r,iconNode:a,...c},u)=>{const{size:d=24,strokeWidth:p=2,absoluteStrokeWidth:i=!1,color:f="currentColor",className:m=""}=Zi()??{},g=s??i?Number(n??p)*24/Number(t??d):n??p;return v.createElement("svg",{ref:u,...Jt,width:t??d??Jt.width,height:t??d??Jt.height,stroke:e??f,strokeWidth:g,className:zo("lucide",m,o),...!r&&!Ki(c)&&{"aria-hidden":"true"},...c},[...a.map(([h,x])=>v.createElement(h,x)),...Array.isArray(r)?r:[r]])});const pe=(e,t)=>{const n=v.forwardRef(({className:s,...o},r)=>v.createElement(Qi,{ref:r,iconNode:t,className:zo(`lucide-${Yi(bs(e))}`,`lucide-${e}`,s),...o}));return n.displayName=bs(e),n};const el=[["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"}]],tl=pe("activity",el);const nl=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]],ln=pe("arrow-right",nl);const sl=[["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"}]],Ao=pe("book-open",sl);const ol=[["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"}]],Po=pe("bot",ol);const rl=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],al=pe("chevron-down",rl);const il=[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]],ll=pe("chevron-up",il);const cl=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],dl=pe("circle-check",cl);const ul=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]],En=pe("file-text",ul);const fl=[["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"}]],Bo=pe("git-compare-arrows",fl);const pl=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]],ml=pe("info",pl);const hl=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],gl=pe("loader-circle",hl);const bl=[["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"}]],xl=pe("moon",bl);const vl=[["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"}]],yl=pe("octagon-x",vl);const wl=[["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"}]],kl=pe("shield-check",wl);const Sl=[["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"}]],Cl=pe("sun",Sl);const Ml=[["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"}]],Rl=pe("triangle-alert",Ml);const jl=[["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"}]],El=pe("upload",jl);const Il=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],Lo=pe("x",Il),Tl=({...e})=>{const{theme:t}=jn();return l.jsx(Vi,{theme:t,className:"toaster group",icons:{success:l.jsx(dl,{className:"size-4"}),info:l.jsx(ml,{className:"size-4"}),warning:l.jsx(Rl,{className:"size-4"}),error:l.jsx(yl,{className:"size-4"}),loading:l.jsx(gl,{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 Nl(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"done":{const{skippedLines:s}=e;t.onDone?.({skippedLines:s});break}case"error":t.onError?.(e);break;case"taskData":{const s=n?.get(e.reqId);s&&(s.resolve({metrics:e.metrics,fieldNames:e.fieldNames}),n.delete(e.reqId));break}}}function zl(){let e=null;const t=new Map;let n=0,s={};function o(){e=new Worker(new URL(""+new URL("parser-worker-00O9WEQC.js",import.meta.url).href,import.meta.url),{type:"module"}),e.onmessage=({data:i})=>Nl(i,s,t),e.onerror=i=>{s.onError?.(`Worker crashed: ${i.message}`),p()}}function r(i,f){s=f,o(),e.postMessage({type:"parse",file:i})}function a(i,f){s=f,o(),e.postMessage({type:"parseFromUrl",request:i})}function c(i,f){s=f,o(),e.postMessage({type:"parseFiles",files:i})}function u(i){return new Promise((f,m)=>{const g=String(n++);t.set(g,{resolve:f,reject:m}),e.postMessage({type:"getTaskData",stageId:i,reqId:g})})}async function d(i){return await Promise.all(i.map(m=>u(m).then(g=>({stageId:m,...g}))))}function p(){e?.terminate(),e=null;for(const{reject:i}of t.values())i(new Error("Worker terminated"));t.clear()}return{startParse:r,startParseFromUrl:a,startParseFiles:c,requestTaskData:u,prefetchFlaggedStages:d,terminate:p}}function xs(e,{onProgress:t,onDone:n,onError:s}){return{onProgress:t,onApp(o){e.app=o},onStage(o){const r=o;e.stages.set(r.id,r)},onSql(o){const r=o;e.sql.set(r.id,o);for(const a of r.stageIds??[]){const c=e.stages.get(a);c&&(c.sqlExecutionId=r.id)}},onSqlPlan(o){const r=o,a=e.sql.get(r.executionId);a&&(a.planTree=r.planTree)},onExecutor(o){const r=o;r.kind==="added"?e.executors.added.push(r):e.executors.removed.push(r)},onJob(o){const r=o;e.jobs.set(r.id,r)},onRunAggregates(o){e.runAggregates=o},onStageExecutorMetrics(o){if(!(o instanceof Map))return;const r=o;for(const[a,c]of r){const u=e.stages.get(a);u&&(u.executorMetrics=c)}},onDone:n,onError:s}}const Al=128*1024*1024,Pl=8e3,Bl=1.5,Ke=6,Ue={critical:0,warning:1,info:2},Ll={skew:"task-skew",slowHost:"task-skew",straggler:"task-skew",shuffle:"shuffle-io",spill:"spill",gc:"gc-pressure",failures:"failures",coldStart:"executor-timeline",utilization:"executor-timeline",speculationWaste:"executor-timeline"};function yf(e){const t=new Map;for(const s of e){if(s.stageId==null)continue;const o=Ll[s.type];o&&(t.has(s.stageId)||t.set(s.stageId,new Set),t.get(s.stageId).add(o))}const n=new Map;for(const[s,o]of t)n.set(s,o.size);return n}const Dl={skew:"SKEW",shuffle:"SHFL",spill:"SPILL",gc:"GC",coldStart:"COLD",utilization:"UTIL",memoryUtilization:"MEM",cacheUtilization:"CSTOR",coreLocality:"LOCAL",autoscalingChurn:"CHRN",slowHost:"HOST",failures:"FAIL",straggler:"STRAG",retryWaste:"RETRY",tinyTask:"TINY",stageFailed:"SFAIL",speculationWaste:"SPEC",partitionSizing:"PART",stageSlowness:"SLOW",stageShape:"SHAPE",cachingOpportunity:"CACHE",jobFailureRate:"JOBS",configAudit:"CFG",duplicatePlanSubtree:"PLAN",smallFiles:"PLAN",underBroadcast:"PLAN",overBroadcast:"PLAN",broadcastSizing:"PLAN",incompleteRun:"INCMP"};function In(e){return Dl[e]??e.toUpperCase()}const wf={skew:"Skew spill: a few heavy tasks spill while most do not; rebalance partitioning",volume:"Volume spill: most tasks spill because data exceeds memory; add partitions",unclassified:"Spill cause could not be classified"};function _l(e){let t;for(const n of e)(t===void 0||Ue[n.impactBand]<Ue[t])&&(t=n.impactBand);return t}function wt(e){const t=String(e),n=t.match(/((?:hdfs?|s3[an]?):\/\/\S+|\/[^\s,)]+)/i);if(!n)return t;const s=n[1].replace(/[/,]+$/,"").split("/").filter(Boolean);return s[s.length-1]||t}function vs(e){return e.split("::")[0]||e}function ne(e){return!e||e<=0?"—":e>=1e9?`${(e/1e9).toFixed(1)} GB`:e>=1e6?`${(e/1e6).toFixed(0)} MB`:`${(e/1e3).toFixed(0)} KB`}function Fl(e){return e/1e6}function Xe(e){return!e||e<=0?"—":e<1e3?`${Math.round(e)}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m ${Math.floor(e%6e4/1e3)}s`}function kf(e){const t=e.shuffleReadBytes??0;if(t<=0)return null;const n=Math.min(Pl,Math.ceil(t/Al)),s=e.taskCount??0;return n<=s*Bl?null:{recommended:n,current:s}}function Sf(e,t){if(e.length===0)return{labels:[],data:[]};let n=e[0],s=e[0];for(let c=1;c<e.length;c++)e[c]<n&&(n=e[c]),e[c]>s&&(s=e[c]);const o=(s-n)/t||1,r=new Array(t).fill(0);for(const c of e)r[Math.min(Math.floor((c-n)/o),t-1)]++;return{labels:r.map((c,u)=>Math.round(n+u*o)),data:r}}function ut(e,t,{dedupe:n=!1}={}){if(!e)return;const s=n?new Set:null,o=[{node:e,parent:null}];for(;o.length>0;){const{node:r,parent:a}=o.pop();if(s){if(s.has(r))continue;s.add(r)}t(r,a);const c=r.children??[];for(let u=c.length-1;u>=0;u--)o.push({node:c[u],parent:r})}}function cn(e){return e.trim().replace(/#\w+$/,"")}function Ot(e){return e.replace(/^\[|\]$/g,"").split(",").map(cn).filter(Boolean)}function dn(e){const t=[];let n=0,s=0;for(let o=0;o<e.length;o++)e[o]==="("?n++:e[o]===")"?n--:e[o]===","&&n===0&&(t.push(e.slice(s,o).trim()),s=o+1);return t.push(e.slice(s).trim()),t.filter(Boolean)}function Tn(e,t){e.warnings.push({type:"crossJoin",detail:`${t} detected: this can cause severe data explosion.`})}function Do(e,t){e.warnings.push({type:"longFilterCondition",detail:`Filter condition is ${t} characters: consider simplifying or pushing the filter down closer to the scan.`})}function Wt(e,t){let n=null,s=null;const o=e.match(/^Scan\s+(parquet|orc|csv|json)\s+(spark_catalog\.\S+)$/i);if(o)n=o[1].toLowerCase(),s=o[2];else{const a=t.match(/FileScan\s+(parquet|orc|csv|json)\s+(spark_catalog\.[^[\s]+)\[/i);a&&(n=a[1].toLowerCase(),s=a[2])}if(s)return/PreparedDeltaFileIndex/i.test(t)&&(n="delta"),`${n}:${s.replace(/^spark_catalog\./,"")}`;if(/_delta_log/.test(e)||/_delta_log/.test(t)||/DeltaLogFileIndex/i.test(e+t)||/checkpointMetadata#|sidecar#|commitInfo#/.test(e+t))return null;const r=t.match(/FileScan\s+(parquet|orc|csv|json)\b/i);if(r){const a=t.match(/Location:[^[]*\[([^\]]+)\]/);return a?`${r[1].toLowerCase()}:${wt(a[1].split(",")[0].trim())}`:null}if(/JDBCRelation/.test(t)){const a=_o(t).match(/\bFROM\s+(\(|[A-Za-z_][\w.]*)/i);return!a||a[1]==="("?null:`jdbc:${a[1].toLowerCase()}`}return null}function _o(e){const t=e.match(/JDBCRelation\(([\s\S]+?)\)\s*(?:SPARK_GEN_SUBQ_\d+\)?)?\s*\[numPartitions/),n=e.match(/JDBCRelation\(\(([\s\S]+?)\)\s*SPARK_GEN_SUBQ/);return(n?n[1]:t?t[1]:"").replace(/\s+/g," ").trim()}function Fo(e,t,n){const s=Wt(e,t);if(!s)return!1;const o=s.indexOf(":"),r=s.slice(0,o),a=s.slice(o+1);if(r==="jdbc")return n.scans.push({path:a,format:r,projectedColumns:[],pushedFilters:[],sql:_o(t)}),!0;const c=t.match(/FileScan\s+\w+\s+(\[[^\]]*\])/i)??t.match(/(\[[^\]]*\])/),u=t.match(/PushedFilters:\s*\[([^\]]*)\]/);return n.scans.push({path:a,format:r,projectedColumns:c?Ot(c[1]):[],pushedFilters:u&&u[1]?u[1].split(",").map(d=>d.trim()).filter(Boolean):[]}),!0}function $o(e,t,n){const s=t.match(/^(SortMergeJoin|BroadcastHashJoin|ShuffledHashJoin|BroadcastNestedLoopJoin)\s+(\[[^\]]*\]),\s*(\[[^\]]*\]),\s*(\w+)/);return s?(n.joins.push({joinType:s[1],leftKeys:Ot(s[2]),rightKeys:Ot(s[3])}),/^Cross$/i.test(s[4])&&Tn(n,"Cross join"),!0):!1}function Oo(e,t,n){const s=t.match(/(?:Object)?HashAggregate\(keys=(\[[^\]]*\]),\s*functions=(\[[\s\S]*\])\)/);if(!s)return!1;const o=s[2].replace(/^\[|\]$/g,"");if(/\bpartial_/.test(o))return!0;const r=dn(o).map(c=>c.replace(/#\w+/g,"").trim()).filter(Boolean).slice(0,8),a=Ot(s[1]);return(a.length||r.length)&&n.aggs.push({groupByKeys:a,aggregations:r}),!0}function Wo(e,t){const n=e.match(/hashpartitioning\((.+?),\s*(\d+)\)/i),s=e.match(/rangepartitioning\((.+?),\s*(\d+)\)/i);if(n)t.exchanges.push({partitioning:"hash",keys:dn(n[1]).map(o=>cn(o.replace(/\s+(ASC|DESC)(\s+NULLS\s+\w+)?/i,""))).filter(Boolean),numPartitions:parseInt(n[2],10)});else if(s)t.exchanges.push({partitioning:"range",keys:dn(s[1]).map(o=>cn(o.replace(/\s+(ASC|DESC)(\s+NULLS\s+\w+)?/i,""))).filter(Boolean),numPartitions:parseInt(s[2],10)});else if(/RoundRobinPartitioning/i.test(e)){const o=e.match(/RoundRobinPartitioning\((\d+)\)/i);t.exchanges.push({partitioning:"roundrobin",keys:[],numPartitions:o?parseInt(o[1],10):0})}else/SinglePartition/i.test(e)&&t.exchanges.push({partitioning:"single",keys:[],numPartitions:1})}function Cf(e){const t={scans:[],joins:[],aggs:[],exchanges:[],warnings:[]};return e&&ut(e,n=>{const s=n.name??"",o=n.detail??"";if(/CartesianProduct/i.test(s)||/CartesianProduct/i.test(o))Tn(t,"CartesianProduct");else if(!Fo(s,o,t)){if(!(/Join/i.test(s)&&$o(s,o,t))){if(!(/Aggregate/i.test(s)&&Oo(s,o,t))){if(/^Exchange/i.test(s))Wo(o,t);else if(/^Filter/i.test(s)){const r=o.match(/^Filter\s+([\s\S]+)/);r&&r[1].trim().length>1e3&&Do(t,r[1].trim().length)}}}}},{dedupe:!0}),t}function Mf(e){if(!e)return null;const t=e.name??"",n=e.detail??"",s={scans:[],joins:[],aggs:[],exchanges:[],warnings:[]};if(/CartesianProduct/i.test(t)||/CartesianProduct/i.test(n))Tn(s,"CartesianProduct");else if(!Fo(t,n,s)){if(!(/Join/i.test(t)&&$o(t,n,s))){if(!(/Aggregate/i.test(t)&&Oo(t,n,s))){if(/^Exchange/i.test(t))Wo(n,s);else if(/^Filter/i.test(t)){const c=n.match(/^Filter\s+([\s\S]+)/);c&&c[1].trim().length>1e3&&Do(s,c[1].trim().length)}}}}const o=s.scans[0]?"scan":s.joins[0]?"join":s.aggs[0]?"agg":s.exchanges[0]?"exchange":null,r=s.scans[0]??s.joins[0]??s.aggs[0]??s.exchanges[0]??null,a=s.warnings[0]??null;return!o&&!a?null:{kind:o,warning:a,...r??{}}}function ys(e,t){let n=t.reduce((s,o)=>s+(o.totalCores??0),0);if(n<=0){const s=e.resources?.executor?.cores??null;n=s!=null?t.length*s:0}return n}function ws(e){const t=[...e].sort((o,r)=>o.time-r.time||o.delta-r.delta);let n=0,s=0;for(const o of t)n+=o.delta,n>s&&(s=n);return s}function $l(e,t,n){const s=new Map,o=[],r=[];for(const d of t){const p=d.totalCores??0;s.set(d.executorId,p),o.push({time:d.timestamp,delta:p}),r.push({time:d.timestamp,delta:1})}for(const d of n){const p=s.get(d.executorId)??0;o.push({time:d.timestamp,delta:-p}),r.push({time:d.timestamp,delta:-1})}const a=ws(o);if(a>0)return a;const c=ws(r),u=e.resources?.executor?.cores??null;return u!=null?c*u:0}const Ol=new Set(["RACK_LOCAL","ANY"]),Wl=5,Gl=10,ks={totalTasks:null,nonLocalTasks:null,ratio:null,topStages:[]};function Ul(e,{minTasksPerStage:t=Gl,topN:n=Wl}={}){if(!Array.isArray(e)||e.length===0)return ks;let s=0,o=0;const r=[];for(const c of e){const u=c?.localityStats;if(!Array.isArray(u)||u.length===0)continue;let d=0,p=0;for(const{locality:i,count:f}of u)Number.isFinite(f)&&(d+=f,Ol.has(i)&&(p+=f));s+=d,o+=p,d>=t&&r.push({stageId:c.id,nonLocalTasks:p,taskCount:d,ratio:p/d})}if(s===0)return ks;const a=r.sort((c,u)=>u.nonLocalTasks-c.nonLocalTasks).slice(0,n);return{totalTasks:s,nonLocalTasks:o,ratio:o/s,topStages:a}}function Go(e){if(e.length===0)return[];const t=[...e].sort((s,o)=>s[0]-o[0]),n=[[t[0][0],t[0][1]]];for(let s=1;s<t.length;s++){const o=n[n.length-1],r=t[s];r[0]<=o[1]?o[1]=Math.max(o[1],r[1]):n.push([r[0],r[1]])}return n}function Ss(e,t){const n=e?.startTime??0,o=[...t.values()].filter(h=>h.submittedAt!=null&&h.completedAt!=null).map(h=>[h.submittedAt,h.completedAt]),a=e?.endTime??null??(o.length>0?o.reduce((h,x)=>Math.max(h,x[1]),-1/0):n),c=Math.max(0,a-n);if(o.length===0)return{total:c,startup:c,stagesActive:0,gaps:0,idle:0};const u=Go(o),d=u.reduce((h,[x,b])=>h+(b-x),0),p=u[0][0],i=Math.max(0,p-n);let f=0;for(let h=1;h<u.length;h++)f+=u[h][0]-u[h-1][1];const m=u[u.length-1][1],g=Math.max(0,a-m);return{total:c,startup:i,stagesActive:d,gaps:f,idle:g}}function Gt(e){return(e.completedAt??0)-(e.submittedAt??0)}function Hl(e){const t=Gt(e);return t>0?(e.executorRunTime??0)/t:0}function ql(e){const t=[...e.values()].filter(c=>Gt(c)>0),n=new Map;for(const c of t)n.set(c.id,0);if(t.length===0)return n;const s=[];for(const c of t){const u=Hl(c);s.push({time:c.submittedAt??0,id:c.id,weight:u,isStart:!0}),s.push({time:c.completedAt??0,id:c.id,weight:u,isStart:!1})}s.sort((c,u)=>c.time-u.time);const o=new Map;let r=s[0].time,a=0;for(;a<s.length;){const c=s[a].time;if(c>r&&o.size>0){const u=c-r;let d=0;for(const p of o.values())d+=p;for(const[p,i]of o){const f=d>0?i/d:1/o.size;n.set(p,(n.get(p)??0)+u*f)}}for(;a<s.length&&s[a].time===c;){const u=s[a];u.isStart?o.set(u.id,u.weight):o.delete(u.id),a++}r=c}return n}function Vl(e){const t=ql(e),n=new Map;for(const s of e.values()){const o=Gt(s);if(o<=0)continue;const r=t.get(s.id)??0;n.set(s.id,Math.min(1,r/o))}return n}function Yl(e,t){const n=e.taskDurationMax??0;if(t<=0)return n;const s=e.executorRunTime??0;return Math.max(n,s/t)}function Jl(e,t,n){const s=Math.max(0,Gt(t)-n);return Math.min(e,s)}function Uo(e,t){const n=Vl(e),s=new Map;for(const o of e.values()){const r=n.get(o.id);r!==void 0&&s.set(o.id,{gate:r,ceiling:Yl(o,t)})}return s}const Kl=.999;function Nn(e,t,n,s){const o=n.get(t),r=s.get(t);if(!o||!r)return null;const a=Jl(e,o,r.ceiling);return r.gate>=Kl?{basis:"serial",wallClock:{low:a,high:a}}:{basis:"contended",wallClock:{low:a*r.gate,high:a}}}function Ho(e,t,n,s){const o=[],r=[];for(const f of e){const m=Nn(t.get(f)??0,f,n,s);if(!m)continue;o.push(m);const g=n.get(f);r.push([g.submittedAt??0,g.completedAt??0])}if(o.length===0)return null;const a=o.reduce((f,m)=>f+m.wallClock.high,0),c=o.reduce((f,m)=>f+m.wallClock.low,0),u=Go(r).reduce((f,[m,g])=>f+(g-m),0),d=Math.min(a,u),p=Math.min(c,u);return{basis:o.every(f=>f.basis==="serial")?"serial":"contended",wallClock:{low:p,high:d}}}const Se=1024*1024,ye=1024*Se,Xl=1024*ye;function Zl(e,t){const{taskCount:n,spillDiskMax:s=0,spillMemMax:o=0,spillDiskP50:r=0,spillMemP50:a=0}=e;if(n===1){if(s>=t.singleTaskDiskGiB*ye||o>=t.singleTaskMemGiB*ye)return{magnitude:"severe"}}else{const c=n>0?s/n:0;if(s>=t.highDiskGiB*ye||c>=t.highTaskDiskMB*Se||o>=t.highMemGiB*ye)return{magnitude:"high"};if(s>=t.medDiskMB*Se||o>=t.medMemGiB*ye)return{magnitude:"medium"}}if(n>=t.skewMinTasks){if(r>0&&s/r>t.skewRatio&&s>=t.skewDiskFloorMB*Se)return{magnitude:"high"};if(a>0&&o/a>t.skewRatio&&o>=t.skewMemFloorMB*Se)return{magnitude:"medium"}}return null}function Ql(e){return!Array.isArray(e)||e.length===0?null:[...e].sort((t,n)=>n.count-t.count)[0].reason}function Kt(e,t){const n=[];for(const s of t.values())s.sqlExecutionId===e&&n.push(s.id);return n}function Bt(e,t){const n=new Set;for(const s of e)for(const o of s.stageIds??[])n.add(o);return n.size>0?[...n].sort((s,o)=>s-o):t}function ec(e,t={}){const{includeDetail:n=!1,normalizeDetail:s=c=>c}=t,o=new WeakMap,r=[];function a(c,u){r.push(c);const d=(c.children??[]).map(h=>a(h,!1)),p=1+d.reduce((h,x)=>h+x.size,0),i=(c.metrics??[]).map(h=>h.name).sort().join(","),f=d.map(h=>h.fingerprint).join(","),m=u&&n?`${c.name}[${i}]<${s(c.detail??"")}>{${f}}`:`${c.name}[${i}]{${f}}`,g={size:p,fingerprint:m};return o.set(c,g),g}return a(e,!0),{shapeOf:o,allNodes:r}}function qo(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_][\w.]*)\s*=\s*([A-Za-z_][\w.]*)/g,(n,s,o)=>{const[r,a]=[s,o].sort();return`${r} = ${a}`}),t}const tc=/Join/i;function nc(e){return tc.test(e)?"join":e==="Union"?"union":null}function sc(e){const t=[],n=[];function s(o){n.push(o);const r=(o.children??[]).map(s);n.pop();const a=(o.metrics??[]).map(f=>f.name).sort().join(","),c=r.map(f=>f.fingerprint).join(","),u=`${o.name}[${a}]{${c}}`,d=new Map,p=Wt(o.name??"",o.detail??"");if(p){const f=(o.metrics??[]).find(m=>m.name===un);d.set(p,(d.get(p)??0)+(f?f.value:0))}for(const f of r)for(const[m,g]of f.leafRelationBytes)d.set(m,(d.get(m)??0)+g);const i=nc(o.name??"");return i&&t.push({node:o,operator:i,fingerprint:`${o.name}[${a}]<${qo(o.detail??"")}>{${c}}`,leafRelationBytes:new Map(d),ancestorNodes:n.slice()}),{fingerprint:u,leafRelationBytes:d}}return s(e),t}function oc(e){let t=null;return ut(e,n=>{t||(t=Wt(n.name??"",n.detail??""))}),t}function rc(e,{minSubtreeSize:t,minOccurrences:n}){const{shapeOf:s,allNodes:o}=ec(e),r=o.filter(i=>s.get(i).size>=t),a=new Map;for(const i of r){const f=s.get(i).fingerprint;a.has(f)||a.set(f,[]),a.get(f).push(i)}const c=[...a.values()].filter(i=>i.length>=n).sort((i,f)=>s.get(f[0]).size-s.get(i[0]).size),u=new WeakSet,d=i=>{u.add(i);for(const f of i.children??[])d(f)},p=[];for(const i of c){const f=i.filter(m=>!u.has(m));if(!(f.length<n)){for(const m of f)d(m);p.push({rootName:f[0].name,subtreeSize:s.get(f[0]).size,occurrences:f.length,isExchangeRoot:/Exchange/i.test(f[0].name),sampleRelation:oc(f[0]),groupIndex:p.length,nodes:f})}}return p}const ac="number of files read",un="size of files read",ic="number of written files",lc="written output";function fn(e){const t=(e.metrics??[]).find(s=>s.name==="data size");if(t)return t.value;let n=0;for(const s of e.children??[])n+=fn(s);return n}function pn(e){if((e.metrics??[]).find(s=>s.name==="data size"))return[e];const n=[];for(const s of e.children??[])n.push(...pn(s));return n}function cc(e){if(e.length<3)return null;const t=e.map(o=>o.value).sort((o,r)=>o-r),n=t[Math.floor(t.length/2)];if(n<=0)return null;const s=e.reduce((o,r)=>r.value>o.value?r:o);return{key:s.key,ratio:s.value/n,value:s.value}}function Vo(){return zn.map(e=>({type:e.type,version:e.version??1,scope:e.scope,thresholds:e.thresholds,docAnchor:e.docAnchor}))}function dc(e,t){const{taskCount:n,taskDurationP50:s,taskDurationP95:o,taskDurationMax:r}=e;return s===0?null:(n??0)>=t?{ratio:o/s,metric:"P95/median"}:{ratio:r/s,metric:"max/median"}}function Cs(e){const t=e?.app;if(t?.startTime==null||t?.endTime==null)return null;const n=t.endTime-t.startTime;return n>0?n:null}function Xt(e,t,n){return t==null||e>=t*n}function Ms(e,t,n){if(!n)return e;const s=Nn(e,t,n.stages,n.occupancy);return s?s.wallClock.high:e}const Yo="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.";function Rs(e,t,n){const s=e.name||`RDD ${e.id}`,o=Math.round(t*100),r=100-o;return{type:"cacheUtilization",variant:"partialCache",stageId:null,rddId:e.id,rddName:s,impactBand:n,metric:"cachedRatio",value:o,confidence:"medium",validationRequired:Yo,memorySize:e.memorySize,diskSize:e.diskSize,numCachedPartitions:e.numCachedPartitions,numPartitions:e.numPartitions,recommendation:`RDD ${s} is ${r}% evicted from cache (${o}% of partitions cached). Increase executor memory or reduce the cached dataset size.`}}function js(e,t,n){const s=e.name||`RDD ${e.id}`,o=Math.round(t*100);return{type:"cacheUtilization",variant:"diskSpillover",stageId:null,rddId:e.id,rddName:s,impactBand:n,metric:"diskRatio",value:o,confidence:"medium",validationRequired:Yo,memorySize:e.memorySize,diskSize:e.diskSize,numCachedPartitions:e.numCachedPartitions,numPartitions:e.numPartitions,recommendation:`RDD ${s} is ${o}% spilled to disk despite requesting MEMORY_AND_DISK. Executor memory may be too small for this cached dataset.`}}const Jo=.005,Ko=.02,zn=[{type:"skew",scope:"stage",order:30,fixEffort:"code",version:1,docAnchor:"#bottleneck-skew",thresholds:{ratioWarn:3,minTasksForP95:20,floorPctWarn:.005},detect(e,t){const n=dc(e,this.thresholds.minTasksForP95);if(n===null)return null;const{ratio:s,metric:o}=n;if(s<=this.thresholds.ratioWarn)return null;const r=Math.max(0,o==="P95/median"?e.taskDurationP95-e.taskDurationP50:e.taskDurationMax-e.taskDurationP50),a=Cs(t),c=Ms(r,e.id,t);if(!Xt(c,a,this.thresholds.floorPctWarn))return null;const u=Math.round(s*10)/10;return{type:"skew",stageId:e.id,impactBand:"warning",metric:o,value:u,recommendation:`Task duration ratio (${o}) is ${u}×: for join-driven skew, enable AQE skew-join handling (spark.sql.adaptive.skewJoin.enabled); otherwise salt the key or repartition on a better key to reduce task skew.`}}},{type:"stageShape",scope:"stage",order:35,fixEffort:"code",version:1,docAnchor:"#bottleneck-stage-shape",thresholds:{pRatioMax:.5,oiRatioMax:10,skewWarn:3},detect(e,t){const n=[],s=(e.executorStats??[]).length,o=t?.app?.resources?.executor?.cores??1,r=s*o;if(r>0){const c=e.taskCount/r;c<this.thresholds.pRatioMax&&n.push({type:"stageShape",stageId:e.id,impactBand:"info",rule:"lowParallelism",metric:"pRatio",value:Math.round(c*100)/100,totalCores:r,recommendation:`This stage runs ${e.taskCount} ${e.taskCount===1?"task":"tasks"} across ~${r} cores, so it is under-parallelized and leaves cluster capacity idle.`})}if(e.inputBytes>0){const c=e.outputBytes/e.inputBytes;c>this.thresholds.oiRatioMax&&n.push({type:"stageShape",stageId:e.id,impactBand:"info",rule:"dataExplosion",metric:"oiRatio",value:Math.round(c*10)/10,recommendation:`This stage outputs ${Math.round(c)}× its input volume: check for an exploding join or a cross product.`})}const a=(e.completedAt??0)-(e.submittedAt??0);if(a>0){const c=e.taskDurationMax/a;c>this.thresholds.skewWarn&&n.push({type:"stageShape",stageId:e.id,impactBand:"info",rule:"taskStageSkew",metric:"taskStageSkew",value:Math.round(c*10)/10,totalCores:r,recommendation:`One task takes ${Math.round(c*10)/10}× this stage's wall-clock duration; a single straggler is gating the whole stage.`})}return n}},{type:"shuffle",scope:"stage",order:20,fixEffort:"config",version:1,docAnchor:"#bottleneck-shuffle",thresholds:{minBytes:50*Se},detect(e){const t=e.shuffleReadBytes;return t<=this.thresholds.minBytes?null:{type:"shuffle",stageId:e.id,impactBand:"info",metric:"shuffleReadBytes",value:t,recommendation:`${ne(t)} shuffled in this stage: consider increasing spark.sql.shuffle.partitions or adding a broadcast join.`}}},{type:"partitionSizing",scope:"stage",order:22,fixEffort:"config",version:1,docAnchor:"#bottleneck-shuffle",thresholds:{skewRatio:5,skewFloorBytes:256*Se,lowParTotalBytes:ye,lowParMaxTasks:7,maxPartBytes:5*ye},detect(e){const t=[],{shuffleReadP50:n,shuffleReadMax:s,shuffleReadBytes:o,taskCount:r}=e;if(s>this.thresholds.skewRatio*n&&s>this.thresholds.skewFloorBytes){const a=n>0?`${Math.round(s/n*10)/10}× the median (${ne(n)})`:`far larger than the median (${ne(n)}, effectively empty)`;t.push({type:"partitionSizing",stageId:e.id,impactBand:"warning",rule:"shufflePartitionSkew",metric:"shuffleReadMax",value:s,recommendation:`The largest shuffle partition (${ne(s)}) is ${a}: for join skew, enable AQE skew-join handling (spark.sql.adaptive.skewJoin.enabled); otherwise salt the key or repartition on a better key.`})}return o>=this.thresholds.lowParTotalBytes&&r<=this.thresholds.lowParMaxTasks&&t.push({type:"partitionSizing",stageId:e.id,impactBand:"warning",rule:"lowShuffleParallelism",metric:"taskCount",value:r,recommendation:`${Math.round(o/ye*10)/10} GB of shuffle spread over only ${r} tasks: raise spark.sql.shuffle.partitions so each partition is smaller.`}),s>=this.thresholds.maxPartBytes&&t.push({type:"partitionSizing",stageId:e.id,impactBand:"critical",rule:"maxPartitionTooBig",metric:"shuffleReadMax",value:s,recommendation:`A single shuffle partition (${ne(s)}) exceeds 5 GB: this will OOM or spill heavily. Repartition to break it up before this stage.`}),t}},{type:"spill",scope:"stage",order:10,fixEffort:"code",version:1,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},detect(e){if(e.memoryBytesSpilled===0)return null;const t=e.spillClassification,n=t==="skew"||t==="volume",s=Zl(e,this.thresholds);return{type:"spill",stageId:e.id,impactBand:"warning",spillMagnitude:s?.magnitude,metric:"memoryBytesSpilled",value:e.memoryBytesSpilled,confidence:n?"medium":"low",validationRequired:n?"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:t==="skew"?`${ne(e.memoryBytesSpilled)} spilled, skew-driven: fix task skew first; adding memory will not help.`:`${ne(e.memoryBytesSpilled)} spilled: raise spark.sql.shuffle.partitions or increase executor memory.`}}},{type:"gc",scope:"stage",order:50,fixEffort:"config",version:1,docAnchor:"#bottleneck-gc",thresholds:{warnPct100:10,lowInfoPct100:5,minRunTimeMs:1e4},detect(e){const t=e.gcPct;if((e.executorRunTime??0)>=this.thresholds.minRunTimeMs&&t>this.thresholds.warnPct100){const n=Math.round(t*10)/10;return{type:"gc",stageId:e.id,impactBand:"warning",metric:"gcPct",value:n,recommendation:`GC consumed ${n}% of executor run time: reduce object creation, use primitive types, avoid UDFs, increase executor memory.`}}if((e.executorRunTime??0)>=this.thresholds.minRunTimeMs&&t<this.thresholds.lowInfoPct100){const n=Math.round(t*10)/10;return{type:"gc",stageId:e.id,direction:"low",impactBand:"info",metric:"gcPct",value:n,recommendation:`GC consumed only ${n}% of executor run time: memory may be over-provisioned; consider reducing spark.executor.memory for cost savings.`}}return null}},{type:"slowHost",scope:"stage",order:60,fixEffort:"config",version:1,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*Se},detect(e){const t=e.hostStats??[],n=e.executorStats??[];if(t.length<this.thresholds.minHosts&&n.length<this.thresholds.minHosts||e.taskCount<this.thresholds.minTasks)return null;const s=[];if(t.length>=this.thresholds.minHosts){const i=t.map(h=>({host:h.host,taskCount:h.taskCount,mean:h.totalDuration/h.taskCount})),f=[...i].map(h=>h.mean).sort((h,x)=>h-x),m=f[Math.floor(f.length/2)];if(m>0)for(const h of i){const x=h.mean/m,b=h.taskCount/e.taskCount;x<this.thresholds.ratioWarn||b<this.thresholds.minShare||h.mean<this.thresholds.floorMs||s.push({type:"slowHost",stageId:e.id,impactBand:"warning",metric:"hostMeanRatio",value:Math.round(x*10)/10,hostMeanMs:h.mean,host:h.host,hostTaskShare:Math.round(b*100)/100,recommendation:`Check executor logs for ${h.host}: possible bad node, disk pressure, or NUMA misalignment.`})}const g=t.reduce((h,x)=>h+x.totalDuration,0);if(g>0)for(const h of t){const x=h.totalDuration/g,b=h.taskCount/e.taskCount;x>=this.thresholds.shareWarn&&b>=this.thresholds.taskShareWarn&&s.push({type:"slowHost",stageId:e.id,impactBand:"warning",variant:"durationShare",metric:"hostDurationShare",value:Math.round(x*100)/100,hostMeanMs:h.totalDuration/h.taskCount,host:h.host,hostTaskShare:Math.round(b*100)/100,recommendation:`${h.host} is doing ${Math.round(x*100)}% of this stage's total task time: check for data locality or partition assignment skewing work onto one node.`})}}const o=e.executorStats??[],r=this.thresholds.ratioTiers,a=i=>i>=r[3]?"critical":i>=r[1]?"warning":i>=r[0]?"info":null,c=this.thresholds.floorMs,u=this.thresholds.floorBytes,d=[{dimension:"taskTime",floor:c,samples:o.filter(i=>i.taskCount>0).map(i=>({key:i.executorId,value:i.totalDuration/i.taskCount}))},{dimension:"inputBytes",floor:u,samples:o.map(i=>({key:i.executorId,value:i.inputBytes??0}))},{dimension:"shuffleBytes",floor:u,samples:o.map(i=>({key:i.executorId,value:(i.shuffleReadBytes??0)+(i.shuffleWriteBytes??0)}))}],p=e.executorMetrics instanceof Map?e.executorMetrics:null;p&&p.size>=3&&d.push({dimension:"storageMemory",floor:u,samples:[...p.entries()].map(([i,f])=>({key:i,value:(f.onHeapStorageMemory??0)+(f.offHeapStorageMemory??0)}))});for(const i of d){const f=cc(i.samples);if(!f||f.value<i.floor)continue;const m=a(f.ratio);if(!m)continue;const g=i.dimension==="taskTime"?"info":m;s.push({type:"slowHost",stageId:e.id,impactBand:g,variant:"multiDim",dimension:i.dimension,metric:"execMaxMedianRatio",value:Math.round(f.ratio*10)/10,execMaxValue:f.value,executorId:f.key,recommendation:`Executor ${f.key} deviates ${Math.round(f.ratio*10)/10}× from the median on ${i.dimension}: investigate uneven partition assignment or a degraded executor.`})}return s}},{type:"stageSlowness",scope:"stage",order:65,fixEffort:"code",version:2,docAnchor:"#bottleneck-stage-slowness",thresholds:{infoMin:15},suppressWhen(e,t){return t.some(n=>n.type==="slowHost"&&n.stageId===e.stageId)},detect(e){const t=(e.completedAt??0)-(e.submittedAt??0);if(!(t>0))return null;const n=t/6e4,s=this.thresholds,o=n>=s.infoMin?"info":null;if(!o)return null;const r=Math.round(n*10)/10;return{type:"stageSlowness",stageId:e.id,impactBand:o,metric:"stageDurationMinutes",value:r,recommendation:`This stage ran ${r} minutes with no more specific cause flagged: profile its query plan and check for wide shuffles or expensive UDFs.`}}},{type:"stageFailed",scope:"stage",order:42,fixEffort:"code",version:1,docAnchor:"#bottleneck-failures",thresholds:{},detect(e){return e.stageFailureReason==null?null:{type:"stageFailed",stageId:e.id,impactBand:"critical",variant:"stageFailure",metric:"stageFailureReason",value:e.stageFailureReason,recommendation:"This stage attempt failed outright. Inspect the driver log for the failure reason and the job that triggered it."}}},{type:"failures",scope:"stage",order:40,fixEffort:"code",version:1,docAnchor:"#bottleneck-failures",thresholds:{minTasks:10,warnRate:.05,critRate:.2},detect(e){if(e.taskCount<this.thresholds.minTasks||!e.failedTasks)return null;const t=e.failedTasks/e.taskCount;if(t<=this.thresholds.warnRate)return null;const n=Math.round(t*1e3)/10,s=Ql(e.failureReasons);return{type:"failures",stageId:e.id,impactBand:t>this.thresholds.critRate?"critical":"warning",metric:"failureRate",value:n,failedTasks:e.failedTasks,dominantReason:s,recommendation:`${n}% of tasks failed${s?` (dominant reason: ${s})`:""}: investigate driver logs for executor instability or data-driven errors.`}}},{type:"straggler",scope:"stage",order:70,fixEffort:"code",version:1,docAnchor:"#bottleneck-straggler",thresholds:{minTasks:10,shareWarn:.05,warnPct:.1,critPct:.2,floorPctWarn:Jo,floorPctCrit:Ko},detect(e,t){if(e.taskCount<this.thresholds.minTasks)return null;const n=(e.stragglerCount??0)/e.taskCount;if((e.speculativeTasks??0)===0&&n<=this.thresholds.shareWarn)return null;const s=(e.speculativeTasks??0)>0,o=s?e.speculativeTasks/e.taskCount:0,r=Math.max(0,e.taskDurationMax-e.taskDurationP50),a=Cs(t),c=Ms(r,e.id,t),u=Xt(c,a,this.thresholds.floorPctWarn),d=Xt(c,a,this.thresholds.floorPctCrit),p=o>=this.thresholds.critPct&&d?"critical":o>=this.thresholds.warnPct&&u?"warning":"info",i=n>this.thresholds.shareWarn&&u?"warning":"info",f="info",m=s&&!(Ue[i]<Ue[p]),g=m?e.speculativeTasks:Math.round(n*100),h=m?`${g} speculative attempt${g===1?"":"s"} discarded`:`${g}% of tasks straggled`;return{type:"straggler",stageId:e.id,impactBand:f,metric:m?"speculativeTasks":"stragglerShare",value:g,unit:m?"count":"pct",speculativeTasks:e.speculativeTasks??0,stragglerCount:e.stragglerCount??0,recommendation:`${h}: investigate stragglers, likely candidates for AQE skewJoin or data locality issues.`}}},{type:"speculationWaste",scope:"stage",order:71,fixEffort:"config",version:1,docAnchor:"#bottleneck-straggler",confidence:"low",thresholds:{minWasted:5,minWasteMs:6e4},detect(e){const t=e.speculationWastedAttempts??0,n=e.speculationWasteMs??0;return t<this.thresholds.minWasted||n<this.thresholds.minWasteMs?null:{type:"speculationWaste",stageId:e.id,impactBand:"warning",metric:"speculationWasteMs",value:n,confidence:this.confidence,recommendation:`Speculative execution discarded ${Math.round(n/1e3)}s of executor time in this stage; if task durations are naturally variable rather than genuine stragglers, consider tuning spark.speculation.multiplier/quantile.`}}},{type:"retryWaste",scope:"stage",order:45,fixEffort:"code",version:1,docAnchor:"#bottleneck-retry-waste",thresholds:{minWasted:3,minWasteMs:3e4},detect(e){const t=e.wastedAttempts??0,n=e.retryWasteMs??0;return t<this.thresholds.minWasted||n<this.thresholds.minWasteMs?null:{type:"retryWaste",stageId:e.id,impactBand:"warning",metric:"retryWasteMs",value:n,recommendation:`Retried task attempts wasted ${Math.round(n/1e3)}s of executor time (${t} attempt${t===1?"":"s"}) even though the stage completed: investigate executor loss or fetch failures.`,extended:`${t} task attempts were superseded by a later retry, wasting ${Math.round(n/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.`}}},{type:"tinyTask",scope:"stage",order:80,fixEffort:"code",version:1,docAnchor:"#bottleneck-tiny-tasks",thresholds:{minTasks:100,maxP50:500,maxP95:1e3},detect(e){if(e.taskCount<this.thresholds.minTasks||e.taskDurationP50>this.thresholds.maxP50||e.taskDurationP95>this.thresholds.maxP95)return null;const t=Math.max(1,Math.round(e.taskCount/10)),n=e.shuffleReadBytes>0?`lower spark.sql.shuffle.partitions or .coalesce(${t})`:`.coalesce(${t})`;return{type:"tinyTask",stageId:e.id,impactBand:"info",metric:"taskDurationP50",value:Math.round(e.taskDurationP50),recommendation:`Many small tasks (${e.taskCount}, P50 ${Math.round(e.taskDurationP50)}ms): scheduler overhead may dominate. Try ${n}.`}}},{type:"incompleteRun",scope:"app",order:5,fixEffort:"code",version:1,thresholds:{},recommendation:"This event log never recorded an ApplicationEnd event: the capture stopped before the run finished (an in-flight job, a rotated-away log, or a cut-short capture). Findings and metrics elsewhere on this board reflect only what was captured up to that point, not the full run.",detect(e){return e.app.startTime==null||e.app.endTime!=null?null:{type:"incompleteRun",stageId:null,impactBand:"warning",metric:"applicationEnd",value:"missing",recommendation:this.recommendation}}},{type:"coldStart",scope:"app",order:90,fixEffort:"code",version:1,docAnchor:"#bottleneck-cold-start",thresholds:{gapSeconds:30},detect(e){const{app:t,stages:n}=e;if(!t.startTime||n.size===0)return null;let s=1/0;for(const a of n.values())a.submittedAt>0&&a.submittedAt<s&&(s=a.submittedAt);const o=(s-t.startTime)/1e3;if(o<=this.thresholds.gapSeconds)return null;const r=Math.round(o);return{type:"coldStart",stageId:null,impactBand:"warning",metric:"startupGapSeconds",value:r,recommendation:`Executor startup took ${r}s: consider pre-warming the cluster or using dynamic allocation.`}}},{type:"utilization",scope:"app",order:100,fixEffort:"config",version:1,docAnchor:"#bottleneck-utilization",thresholds:{minUtil:.6},detect(e){const{app:t,executorsAdded:n,executorsRemoved:s}=e;if(n.length===0||!t.startTime||!t.endTime)return null;const o=t.endTime-t.startTime;if(o<=0)return null;const r=n.length;let a=0;const c=new Map;for(const f of s)c.set(f.executorId,f.timestamp);for(const f of n){const m=Math.max(f.timestamp,t.startTime),g=c.has(f.executorId)?c.get(f.executorId):t.endTime;a+=Math.max(0,g-m)}const u=a/o/r;if(u>=this.thresholds.minUtil)return null;const d=ys(t,n);let p=null;if(d>0){let f=0;for(const m of e.stages.values())f+=Fl(m.executorCpuTime??0);p=Math.round(f/(o*d)*100)}const i=Math.round(u*100);return{type:"utilization",stageId:null,impactBand:"info",metric:"avgUtilization",value:i,utilizationFraction:u,appDurationMs:o,totalCores:d,cpuUtilizationPct:p,recommendation:`Average executor utilization was only ${i}%: consider reducing cluster size or enabling dynamic allocation.`}}},{type:"memoryUtilization",scope:"app",order:102,fixEffort:"config",version:1,docAnchor:"#bottleneck-memory-utilization",thresholds:{idleCoreWarn:.5,bandTooSmall:.95,bandTooHigh:.7,wasteBufferMultiplier:1.5},detect(e){const{app:t,executorsAdded:n,runAggregates:s,stages:o}=e,r=[];if(t?.startTime==null||t?.endTime==null)return r;const a=t.endTime-t.startTime;if(a<=0)return r;const c=n.length,u=ys(t,n),d=t.resources?.executor?.memoryMB??null;if(s&&u>0){const i=u*a,f=i>0?1-s.busyCoreMs/i:0;if(f>this.thresholds.idleCoreWarn){const m=Math.round(f*100);r.push({type:"memoryUtilization",variant:"idleCores",stageId:null,impactBand:"warning",metric:"idleCoreRate",value:m,idleRateFraction:f,allocatedMB:d,peakExecutors:c,appDurationMs:a,recommendation:`${m}% of allocated core-time ran no task: reduce cluster size or enable dynamic allocation.`})}}const p=new Map;for(const i of o.values()){const f=i.executorMetrics;if(f instanceof Map)for(const[m,g]of f){const h=g?.jvmHeapMemory??0;h>(p.get(m)??0)&&p.set(m,h)}}if(p.size===0)r.push({type:"memoryUtilization",variant:"memoryBand",stageId:null,impactBand:"info",metric:"memoryBand",dataUnavailable:!0,recommendation:"Per-executor memory usage requires spark.eventLog.logStageExecutorMetrics=true: not enabled for this run."});else if(d!=null&&d>0){const i=d*1024*1024;for(const[f,m]of p){const g=m/i;g>this.thresholds.bandTooSmall?r.push({type:"memoryUtilization",variant:"memoryBand",rule:"heapNearCapacity",stageId:null,executorId:f,impactBand:"warning",metric:"heapUsedRatio",value:Math.round(g*100),recommendation:`Executor ${f} peaked at ${Math.round(g*100)}% of allocated heap: memory may be too small; raise spark.executor.memory to avoid OOM/spill.`}):g<this.thresholds.bandTooHigh&&r.push({type:"memoryUtilization",variant:"memoryBand",rule:"heapOverProvisioned",stageId:null,executorId:f,impactBand:"info",metric:"heapUsedRatio",value:Math.round(g*100),allocatedBytes:i,heap:m,appDurationMs:a,recommendation:`Executor ${f} used only ${Math.round(g*100)}% of allocated heap: memory may be over-provisioned; consider reducing spark.executor.memory for cost savings.`})}}if(d!=null&&c>0){const i=c*d*(a/1e3);let f=0;for(const h of o.values())f+=h.executorRunTime??0;const m=d*(f/1e3),g=i-m;if(g>this.thresholds.wasteBufferMultiplier*m){const h=Math.round(g);r.push({type:"memoryUtilization",variant:"wasteModel",stageId:null,impactBand:"info",metric:"wastedMBSeconds",value:h,confidence:"low",validationRequired:"Memory-waste estimate uses allocated-vs-used memory-time and an unverified 1.5x buffer ported from Dr. Elephant: confirm against the Spark UI before acting.",recommendation:`Allocated executor memory sat largely idle over the run (~${h.toLocaleString("en-US")} MB-seconds wasted): review spark.executor.memory and executor count.`})}}return r}},{type:"cacheUtilization",scope:"app",order:103,fixEffort:"code",version:1,docAnchor:"#memory-model",thresholds:{cachedRatioWarn:.5,cachedRatioInfo:.9,diskRatioWarn:.4,diskRatioInfo:.15},detect(e){const t=e.app?.rddInfo;if(!(t instanceof Map))return null;const n=[];for(const s of t.values()){const o=s.storageLevel??{};if((o.useMemory||o.useDisk)&&(s.numCachedPartitions??0)>0){if((s.numPartitions??0)>0){const r=s.numCachedPartitions/s.numPartitions;r<this.thresholds.cachedRatioWarn?n.push(Rs(s,r,"warning")):r<this.thresholds.cachedRatioInfo&&n.push(Rs(s,r,"info"))}if(o.useMemory&&o.useDisk){const r=(s.memorySize??0)+(s.diskSize??0);if(r>0){const a=(s.diskSize??0)/r;a>this.thresholds.diskRatioWarn?n.push(js(s,a,"warning")):a>this.thresholds.diskRatioInfo&&n.push(js(s,a,"info"))}}}}return n}},{type:"coreLocality",scope:"app",order:103,fixEffort:"config",version:1,docAnchor:"#bottleneck-utilization",thresholds:{minTasks:50,warnRatio:.15,critRatio:.35},detect(e){const{totalTasks:t,nonLocalTasks:n,ratio:s}=Ul([...e.stages.values()]);if(t==null||t<this.thresholds.minTasks||s<this.thresholds.warnRatio)return null;const o=Math.round(s*100);return{type:"coreLocality",stageId:null,impactBand:s>=this.thresholds.critRatio?"critical":"warning",metric:"nonLocalRatio",value:o,nonLocalTaskCount:n,confidence:"low",validationRequired:"The 15%/35% non-local-ratio thresholds (and the 50-task minimum) are unvalidated design-spike values: no external tool publishes an equivalent metric to calibrate against. Confirm against known-good/known-bad real logs before trusting the impact-band split.",recommendation:`${o}% of tasks (${n}) ran without process- or node-local data placement: check spark.locality.wait settings and executor/data colocation.`}}},{type:"autoscalingChurn",scope:"app",order:103,fixEffort:"config",version:1,confidence:"low",thresholds:{shortLivedMs:12e4,warningPct:.3,criticalPct:.6,minExecutors:5},detect(e){const{app:t,executorsAdded:n,executorsRemoved:s}=e;if(n.length===0||t.endTime==null||n.length<this.thresholds.minExecutors)return null;const o=new Map;for(const d of s)o.set(d.executorId,d.timestamp);let r=0;for(const d of n)(o.has(d.executorId)?o.get(d.executorId):t.endTime)-d.timestamp<this.thresholds.shortLivedMs&&r++;const a=r/n.length,c=a>this.thresholds.criticalPct?"critical":a>this.thresholds.warningPct?"warning":null;if(!c)return null;const u=Math.round(a*100);return{type:"autoscalingChurn",stageId:null,impactBand:c,metric:"shortLivedExecutorPct",value:u,shortLivedExecutorCount:r,confidence:this.confidence,recommendation:`${u}% 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.`}}},{type:"cachingOpportunity",scope:"app",order:105,fixEffort:"code",version:1,docAnchor:"#bottleneck-utilization",thresholds:{minExecutions:2},detect(e){const t=e.sql;if(!(t instanceof Map)||t.size===0)return null;const n=new Map;for(const p of t.values()){if(!p.planTree)continue;const i=new Map;ut(p.planTree,f=>{const m=Wt(f.name??"",f.detail??"");if(!m)return;const g=(f.metrics??[]).find(h=>h.name===un);i.set(m,(i.get(m)??0)+(g?g.value:0))});for(const[f,m]of i){let g=n.get(f);if(!g){const h=f.indexOf(":");g={format:f.slice(0,h),relation:f.slice(h+1),executionIds:new Set,executionBytes:new Map},n.set(f,g)}g.executionIds.add(p.id),g.executionBytes.set(p.id,(g.executionBytes.get(p.id)??0)+m)}}const s=new Map;for(const p of t.values()){if(!p.planTree)continue;const i=sc(p.planTree),f=new Map(i.map(g=>[g.node,g.fingerprint])),m=new Map;for(const g of i){let h=m.get(g.fingerprint);h||(h={operator:g.operator,node:g.node,leafRelationBytes:new Map,ancestorFingerprints:new Set(g.ancestorNodes.map(x=>f.get(x)).filter(x=>!!x))},m.set(g.fingerprint,h));for(const[x,b]of g.leafRelationBytes)h.leafRelationBytes.set(x,(h.leafRelationBytes.get(x)??0)+b)}for(const[g,h]of m){let x=s.get(g);x||(x={operator:h.operator,exampleNode:h.node,executionIds:new Set,executionBytes:new Map,ancestorFingerprints:new Set,leafRelationRids:new Set},s.set(g,x)),x.executionIds.add(p.id);const b=[...h.leafRelationBytes.values()].reduce((y,w)=>y+w,0);x.executionBytes.set(p.id,(x.executionBytes.get(p.id)??0)+b);for(const y of h.ancestorFingerprints)x.ancestorFingerprints.add(y);for(const y of h.leafRelationBytes.keys())x.leafRelationRids.add(y)}}const o=p=>s.has(p)&&s.get(p).executionIds.size>=this.thresholds.minExecutions,r=new Map;for(const[p,i]of s){if(!o(p)){r.set(p,{finalExecutionIds:i.executionIds,suppressed:!0});continue}const f=[...i.ancestorFingerprints].filter(o).map(h=>s.get(h));if(f.length===0){r.set(p,{finalExecutionIds:i.executionIds,suppressed:!1});continue}const m=new Set(f.flatMap(h=>[...h.executionIds])),g=new Set([...i.executionIds].filter(h=>!m.has(h)));g.size===0?r.set(p,{finalExecutionIds:g,suppressed:!0}):g.size<this.thresholds.minExecutions?r.set(p,{finalExecutionIds:g,suppressed:!0}):r.set(p,{finalExecutionIds:g,suppressed:!1})}const a=p=>p.slice(p.indexOf(":")+1),c={join:["joined","join"],union:["unioned","union"]},u=[],d=new Map;for(const[p,i]of s){const f=r.get(p);if(f.suppressed)continue;const m=[...f.finalExecutionIds].sort((j,I)=>j-I),g=m.reduce((j,I)=>j+(i.executionBytes.get(I)??0),0),h=[...i.leafRelationRids].sort();if(h.length===0)continue;const x=h.map(j=>{const I=j.indexOf(":");return{relation:j.slice(I+1),format:j.slice(0,I)}}),[b,y]=c[i.operator],w=h.map(a).join(` ${y} `),k=m.length,S=g>=128*Se?`${b[0].toUpperCase()}${b.slice(1)} result read by ${k} queries (~${ne(g)}). Cache/persist the ${b} DataFrame so it is computed once.`:`${b[0].toUpperCase()}${b.slice(1)} result read by ${k} queries. Cache the ${b} DataFrame, or reconsider whether it needs to be recomputed each time.`;u.push({type:"cachingOpportunity",variant:"composite",stageId:null,impactBand:"info",metric:"executionReuse",value:k,format:"derived",relations:x,operator:i.operator,relation:w,executionIds:m,totalReadBytes:g,confidence:"low",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:S});for(const j of h){d.has(j)||d.set(j,new Set);for(const I of m)d.get(j).add(I)}}for(const[p,i]of n){const f=d.get(p),m=f?[...i.executionIds].filter(b=>!f.has(b)):[...i.executionIds];if(m.length<this.thresholds.minExecutions)continue;const g=m.length,h=m.reduce((b,y)=>b+(i.executionBytes.get(y)??0),0),x=h>=128*Se?`Read by ${g} queries (~${ne(h)}). Cache/persist the shared DataFrame so it is scanned once.`:`Read by ${g} queries. Cache the shared DataFrame, or broadcast it if it is a small join lookup.`;u.push({type:"cachingOpportunity",stageId:null,impactBand:"info",metric:"executionReuse",value:g,relation:i.relation,format:i.format,executionIds:m.sort((b,y)=>b-y),totalReadBytes:h,confidence:"low",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:x})}return u}},{type:"jobFailureRate",scope:"app",order:110,fixEffort:"code",version:1,docAnchor:"#bottleneck-job-failure-rate",thresholds:{infoRate:.1,warnRate:.3,critRate:.5},detect(e){const{jobs:t,stages:n}=e,o=(t?[...t.values()]:[]).filter(g=>g.result!=null);if(o.length===0)return null;const r=o.filter(g=>g.succeeded===!1),a=r.length,c=a/o.length;if(c<this.thresholds.infoRate)return null;let u=0,d=0;for(const g of n.values())u+=g.taskCount??0,d+=g.failedTasks??0;const p=u>0?d/u:0,i=r.filter(g=>g.submissionTime!=null&&g.completionTime!=null),f=i.length>0?i.reduce((g,h)=>g+(h.completionTime-h.submissionTime),0)/i.length:0,m=o.length;return{type:"jobFailureRate",stageId:null,impactBand:c>=this.thresholds.critRate?"critical":c>=this.thresholds.warnRate?"warning":"info",metric:"jobFailureRate",value:Math.round(c*1e3)/10,failedJobs:a,totalJobs:m,failedTasks:d,totalTasks:u,avgJobDurationMs:f,taskFailureRate:Math.round(p*1e3)/10,recommendation:`${a} of ${m} jobs never recovered: inspect the driver log for the failed job(s) and the stage failures that triggered them.`}}},{type:"configAudit",scope:"config",order:120,fixEffort:"config",version:1,inScorecard:!1,docAnchor:"#config-shuffle-service",thresholds:{},property:"spark.shuffle.service.enabled",detect(e){const t=e.app?.resources??null;return t?.dynamicAllocationEnabled===!0&&t?.shuffleServiceEnabled===!1?{type:"configAudit",property:"spark.shuffle.service.enabled",impactBand:"warning",metric:"config",value:"false",recommendation:"Dynamic allocation is on but the external shuffle service is off: set spark.shuffle.service.enabled=true so shuffle data survives executor removal."}:null}},{type:"configAudit",scope:"config",order:121,fixEffort:"config",version:1,inScorecard:!1,docAnchor:"#config-autoscale-bounds",thresholds:{},property:"spark.dynamicAllocation.maxExecutors",detect(e){const t=e.app,n=t?.config??{};if((t?.resources??null)?.dynamicAllocationEnabled!==!0)return null;const o=n["spark.dynamicAllocation.minExecutors"]!=null?parseInt(n["spark.dynamicAllocation.minExecutors"],10):null,r=n["spark.dynamicAllocation.maxExecutors"]!=null?parseInt(n["spark.dynamicAllocation.maxExecutors"],10):null;return o!=null&&r!=null&&o>r?{type:"configAudit",property:"spark.dynamicAllocation.minExecutors",impactBand:"critical",metric:"config",value:`${o} > ${r}`,recommendation:`Autoscaling bounds are inverted: spark.dynamicAllocation.minExecutors (${o}) exceeds maxExecutors (${r}). Set min ≤ max.`}:r==null?{type:"configAudit",property:"spark.dynamicAllocation.maxExecutors",impactBand:"info",metric:"config",value:"(unset)",recommendation:"Dynamic allocation is on with no upper bound: set spark.dynamicAllocation.maxExecutors to cap cluster growth."}:null}},{type:"configAudit",scope:"config",order:122,fixEffort:"config",version:1,inScorecard:!1,docAnchor:"#config-serializer",thresholds:{},property:"spark.serializer",detect(e){const t=e.app,n=t?.config??{},s=t?.resources??null;if(Object.keys(n).length===0)return null;const o=s?.serializer??n["spark.serializer"]??null;return typeof o=="string"&&/kryo/i.test(o)?null:{type:"configAudit",property:"spark.serializer",impactBand:"info",metric:"config",value:o??"(default JavaSerializer)",recommendation:`Current serializer is ${o??"the default JavaSerializer"}: consider spark.serializer=org.apache.spark.serializer.KryoSerializer for faster, smaller buffers.`}}},{type:"configAudit",scope:"config",order:123,fixEffort:"config",version:1,inScorecard:!1,docAnchor:"#config-memory-overhead",thresholds:{floorMB:384,floorPct:.1},property:"spark.executor.memoryOverhead",detect(e){const t=e.app?.resources??null,n=t?.executor?.memoryMB??null,s=t?.executor?.memoryOverheadMB??null;if(n==null||s==null)return null;const o=Math.max(this.thresholds.floorMB,Math.round(n*this.thresholds.floorPct));return s>=o?null:{type:"configAudit",property:"spark.executor.memoryOverhead",impactBand:"info",metric:"config",value:`${s} MiB`,recommendation:`Executor memoryOverhead (${s} MiB) is below Spark's default floor of ${o} MiB (max of 384 MiB or 10% of executor memory): raise it to avoid off-heap OOM-kills.`}}},{type:"duplicatePlanSubtree",scope:"sql",order:130,fixEffort:"code",version:2,docAnchor:"#bottleneck-duplicate-plan-subtree",thresholds:{minSubtreeSize:3,minOccurrences:2},detect(e,t){if(!e.planTree)return null;const n=rc(e.planTree,this.thresholds);if(n.length===0)return null;const s=Kt(e.id,t.stages);return n.map(o=>{const r=[];for(const u of o.nodes)ut(u,d=>r.push(d));const a=Bt(r,s),c=o.sampleRelation?` (touching ${o.sampleRelation})`:"";return{type:"duplicatePlanSubtree",executionId:e.id,stageIds:a,impactBand:"warning",metric:"subtreeOccurrences",value:o.occurrences,rootName:o.rootName,subtreeSize:o.subtreeSize,sampleRelation:o.sampleRelation,groupIndex:o.groupIndex,confidence:"medium",validationRequired:"Duplicate-subtree matching compares operator names and metric names only, not literal values or expr IDs: confirm the repeated work is real in the Spark SQL plan tab before acting.",recommendation:o.isExchangeRoot?`A ${o.subtreeSize}-node subtree rooted at ${wt(o.rootName)} repeats ${o.occurrences}x in this plan${c}: this looks like a possible missed exchange reuse; check whether the same shuffle could be computed once and reused.`:`A ${o.subtreeSize}-node subtree rooted at ${wt(o.rootName)} repeats ${o.occurrences}x in this plan${c}: consider caching/persisting the shared computation or check for a duplicated query branch.`}})}},{type:"smallFiles",scope:"sql",order:131,fixEffort:"config",version:2,docAnchor:"#bottleneck-small-files",thresholds:{minFiles:100,maxAvgFileSizeMB:3},detect(e,t){if(!e.planTree)return null;const{minFiles:n,maxAvgFileSizeMB:s}=this.thresholds,o=[];if(ut(e.planTree,a=>{const c=a.metrics??[],u=p=>c.find(i=>i.name===p),d=(p,i,f)=>{if(!p||!i||!(p.value>n))return;const m=i.value/p.value;m<s*Se&&o.push({direction:f,fileCount:p.value,avgBytes:m,nodeName:a.name,node:a})};d(u(ac),u(un),"read"),d(u(ic),u(lc),"write")}),o.length===0)return null;const r=Kt(e.id,t.stages);return o.map(a=>{const c=Bt([a.node],r);return{type:"smallFiles",executionId:e.id,stageIds:c,impactBand:"warning",metric:"avgFileSizeBytes",value:Math.round(a.avgBytes),fileCount:a.fileCount,direction:a.direction,nodeName:a.nodeName,recommendation:a.direction==="read"?`${a.fileCount} small files were read at ${wt(a.nodeName)}: consider compacting the upstream output so fewer, larger files are produced.`:`${a.fileCount} small files were written at ${wt(a.nodeName)}: repartition or coalesce before writing to raise the average file size.`}})}},{type:"broadcastSizing",scope:"sql",order:132,fixEffort:"config",version:2,docAnchor:"#bottleneck-broadcast-sizing",thresholds:{broadcastTiers:[10*Se,100*Se,ye,5*ye],comparisonTiers:[10*ye,300*ye,Xl],overBroadcastBytes:ye},detect(e,t){if(!e.planTree)return null;const{broadcastTiers:n,comparisonTiers:s,overBroadcastBytes:o}=this.thresholds,r=Kt(e.id,t.stages),a=[];return ut(e.planTree,c=>{if(c.name==="SortMergeJoin"&&(c.children??[]).length===2){const[u,d]=c.children,p=fn(u),i=fn(d),f=Math.min(p,i),m=Math.max(p,i);if(f>0&&(f<n[0]||f<n[1]&&m>s[0]||f<n[2]&&m>s[1]||f<n[3]&&m>s[2])){const h=[...pn(u),...pn(d)];a.push({type:"underBroadcast",executionId:e.id,stageIds:Bt(h,r),impactBand:"info",metric:"smallerSideBytes",value:f,largerSideBytes:m,recommendation:`The smaller input to this Sort Merge Join (${ne(f)}) is well under the broadcast threshold relative to the larger side (${ne(m)}): this could have been a broadcast join. Consider a broadcast() hint or raising spark.sql.autoBroadcastJoinThreshold.`})}}if(c.name==="BroadcastExchange"){const u=(c.metrics??[]).find(d=>d.name==="data size");if(u&&u.value>o){const d=(c.children??[])[0];a.push({type:"overBroadcast",executionId:e.id,stageIds:Bt(d?[d]:[],r),impactBand:"warning",metric:"broadcastBytes",value:u.value,recommendation:`This broadcast (${ne(u.value)}) exceeds the 1 GB threshold: check for a misapplied broadcast hint or a misconfigured spark.sql.autoBroadcastJoinThreshold.`})}}}),a.length?a:null}}];function uc(e){throw new Error(`Unreachable case: ${JSON.stringify(e)}`)}const Zt=125e6,fc=2e8,pc=128*1024*1024,mc=50,hc=10,Es=125e6,gc=20,bc=15e3,Is=125e6,xc=(()=>{const e=Vo().find(t=>t.type==="stageSlowness")?.thresholds?.infoMin;if(typeof e!="number")throw new Error("impact-estimator: stageSlowness detector's 'infoMin' threshold not found in detectorCatalog()");return e})();function te(e,t){return t?{basis:"resourceOnly",wallClock:null,estimateMethod:e,rawWaste:t}:{basis:"informational",wallClock:null,estimateMethod:e}}function Ee(e,t,n,s,o,r){const a=Nn(e,t,n,s);return a?{basis:a.basis,wallClock:a.wallClock,estimateMethod:o,rawWaste:r}:te(o,r)}function Qt(e,t,n,s){const o=e>0?{value:e,unit:"ms"}:void 0;if(!t||t.length===0)return te("modeled",o);const r=e/t.length,a=new Map(t.map(u=>[u,r])),c=Ho(t,a,n,s);return c?{basis:c.basis,wallClock:c.wallClock,estimateMethod:"modeled",rawWaste:o}:te("modeled",o)}function vc(e,t,n){switch(e.type){case"retryWaste":{if(e.stageId==null)return null;const s=t.get(e.stageId);if(!s)return null;const o=s.retryWasteMs??0;return Ee(o,e.stageId,t,n,"measured",{value:o,unit:"ms"})}case"speculationWaste":{if(e.stageId==null)return null;const s=t.get(e.stageId);if(!s)return null;const o=s.speculationWasteMs??0;return Ee(o,e.stageId,t,n,"measured",{value:o,unit:"ms"})}case"coldStart":{if(typeof e.value!="number")return null;const s=e.value*1e3;return{basis:"serial",wallClock:{low:s,high:s},estimateMethod:"measured"}}case"gc":{if(e.stageId==null)return null;const s=t.get(e.stageId);if(!s)return null;const o=(s.completedAt??0)-(s.submittedAt??0),r=s.executorRunTime??0,a=s.jvmGCTime??0,c={value:a,unit:"coreMs"};if(r<=0||o<=0)return te("modeled",c);const u=r/o,d=a/u;return Ee(d,e.stageId,t,n,"modeled",c)}case"skew":{if(e.stageId==null)return null;const s=t.get(e.stageId);if(!s)return null;const o=s.taskDurationP50??0,r=e.metric==="P95/median",a=Math.max(0,r?(s.taskDurationP95??0)-o:(s.taskDurationMax??0)-o);return Ee(a,e.stageId,t,n,"measured",{value:a,unit:"ms"})}case"straggler":case"stageShape":{if(e.type==="stageShape"){if(e.rule==="lowParallelism"){const r=t.get(e.stageId);if(!r)return null;const a=(r.completedAt??0)-(r.submittedAt??0),c=Math.max(0,(e.totalCores??0)-(r.taskCount??0))*a;return te("measured",{value:c,unit:"coreMs"})}if(e.rule==="dataExplosion"){const r=t.get(e.stageId);if(!r)return null;const a=Math.max(0,(r.outputBytes??0)-(r.inputBytes??0));return te("measured",{value:a,unit:"bytes"})}if(e.rule==="taskStageSkew"){const r=t.get(e.stageId);if(!r)return null;const a=e.totalCores??0,c=r.taskCount??0,u=Math.max(0,Math.min(a,c)-1)*Math.max(0,(r.taskDurationMax??0)-(r.taskDurationP50??0));return te("measured",{value:u,unit:"coreMs"})}return null}if(e.stageId==null)return null;const s=t.get(e.stageId);if(!s)return null;const o=Math.max(0,(s.taskDurationMax??0)-(s.taskDurationP50??0));return Ee(o,e.stageId,t,n,"measured",{value:o,unit:"ms"})}case"slowHost":{const s=e.metric==="hostMeanRatio"||e.variant==="durationShare"?e.hostMeanMs:e.variant==="multiDim"&&e.dimension==="taskTime"?e.execMaxValue:null;if(s==null)return te("none");if(e.stageId==null)return null;const o=t.get(e.stageId);if(!o)return null;const r=Math.max(0,s-(o.taskDurationP50??0));return Ee(r,e.stageId,t,n,"measured",{value:r,unit:"ms"})}case"duplicatePlanSubtree":{const s=e.stageIds;if(!s||s.length===0)return null;const o=typeof e.value=="number"?e.value:0;if(o<2)return te("none");const r=(o-1)/o,a=new Map;for(const p of s){const i=t.get(p);if(i){const f=Math.max(0,(i.completedAt??0)-(i.submittedAt??0));a.set(p,f*r)}}const u={value:[...a.values()].reduce((p,i)=>p+i,0),unit:"ms"},d=Ho(s,a,t,n);return d?{basis:d.basis,wallClock:d.wallClock,estimateMethod:"measured",rawWaste:u}:te("measured",u)}case"shuffle":{if(e.stageId==null)return null;const s=t.get(e.stageId);if(!s)return null;const o=s.shuffleReadBytes??0,r=o/Zt*1e3;return Ee(r,e.stageId,t,n,"modeled",{value:o,unit:"bytes"})}case"spill":{if(e.stageId==null)return null;const s=t.get(e.stageId);if(!s)return null;const o=s.diskBytesSpilled??0,r=o/fc*1e3;return Ee(r,e.stageId,t,n,"modeled",{value:o,unit:"bytes"})}case"stageSlowness":{if(e.stageId==null)return null;const s=t.get(e.stageId);if(!s)return null;const o=(s.completedAt??0)-(s.submittedAt??0),r=Math.max(0,o-xc*6e4);return Ee(r,e.stageId,t,n,"modeled",{value:r,unit:"ms"})}case"partitionSizing":{if(e.stageId==null)return null;const s=t.get(e.stageId);if(!s)return null;let o=0;if(e.rule==="maxPartitionTooBig")o=(s.shuffleReadMax??0)/Zt*1e3;else if(e.rule==="shufflePartitionSkew")o=Math.max(0,(s.shuffleReadMax??0)-(s.shuffleReadP50??0))/Zt*1e3;else if(e.rule==="lowShuffleParallelism"){const r=Math.ceil((s.shuffleReadBytes??0)/pc),a=s.taskCount??0;r>a&&a>0&&(o=Math.max(0,(s.completedAt??0)-(s.submittedAt??0))*(1-a/r))}else return null;return Ee(o,e.stageId,t,n,"modeled",{value:o,unit:"ms"})}case"tinyTask":{if(e.stageId==null)return null;const s=t.get(e.stageId);if(!s)return null;const o=s.taskCount??0,a=Math.max(0,o-Math.round(o/10))*mc;return Ee(a,e.stageId,t,n,"modeled",{value:a,unit:"ms"})}case"smallFiles":{const s=(e.fileCount??0)*hc;return Qt(s,e.stageIds,t,n)}case"overBroadcast":{const s=(e.value??0)/Es*1e3;return Qt(s,e.stageIds,t,n)}case"underBroadcast":{const s=(e.value??0)/Es*1e3;return Qt(s,e.stageIds,t,n)}case"memoryUtilization":{if(e.variant==="wasteModel"&&typeof e.value=="number")return te("measured",{value:e.value,unit:"mbSeconds"});if(e.variant==="idleCores"){const s=e.idleRateFraction,o=e.allocatedMB,r=e.peakExecutors,a=e.appDurationMs;if(s!=null&&o!=null&&r!=null&&a!=null){const c=s*o*r*(a/1e3);return te("modeled",{value:c,unit:"mbSeconds"})}return te("modeled")}if(e.variant==="memoryBand"&&e.rule==="heapOverProvisioned"){const s=e.allocatedBytes,o=e.heap,r=e.appDurationMs;if(s!=null&&o!=null&&r!=null){const c=(s-o)/1048576*(r/1e3);return te("modeled",{value:c,unit:"mbSeconds"})}}return te("modeled")}case"utilization":{const s=e.utilizationFraction,o=e.appDurationMs,r=e.totalCores;if(s==null||o==null||r==null)return te("measured");const a=(1-s)*o*r/36e5;return te("measured",{value:a,unit:"coreHours"})}case"coreLocality":{const o=(e.nonLocalTaskCount??0)*gc;return te("modeled",{value:o,unit:"coreMs"})}case"autoscalingChurn":{const o=(e.shortLivedExecutorCount??0)*bc/36e5;return te("modeled",{value:o,unit:"coreHours"})}case"configAudit":return te("none");case"jobFailureRate":{const s=e.failedJobs??0,o=e.avgJobDurationMs??0,r=s*o/36e5;return te("modeled",{value:r,unit:"coreHours"})}case"cachingOpportunity":{const o=(e.totalReadBytes??0)/Is*1e3;return te("modeled",{value:o,unit:"ms"})}case"cacheUtilization":{const s=e.memorySize??0,o=e.diskSize??0,r=e.numCachedPartitions??0,a=e.numPartitions??0,c=Math.max(0,a-r),u=s+o,i=((r>0?u/r*c:0)+o)/Is*1e3;return te("modeled",{value:i,unit:"ms"})}case"stageFailed":case"failures":case"incompleteRun":return te("none");default:return null}}function Xo(e,t,n=0){const s=Uo(t,n);for(const o of e){const r=vc(o,t,s);r&&(o.impactEstimate=r)}return e}const yc=Jo,wc=Ko;function kc(e){if(e?.startTime==null||e?.endTime==null)return null;const t=e.endTime-e.startTime;return t>0?t:null}function Zo(e,t){const n=kc(t);if(n==null)return e;for(const s of e){const o=s.impactEstimate?.wallClock?.high;if(o==null)continue;const r=o/n;s.impactBand=r>=wc?"critical":r>=yc?"warning":"info"}return e}function Sc(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")}function Cc(e){const t=e.stageId??e.executionId??e.property??"",n=e.type==="memoryUtilization"?void 0:e.rule,s=[e.host,e.executorId,n,e.variant,e.dimension,e.direction,e.nodeName,e.rootName,e.subtreeSize,e.groupIndex,e.largerSideBytes,e.rddId,e.relation,e.format,e.operator,e.executionIds?e.executionIds.join(","):""].map(o=>o??"").join("|");return Sc(`${e.type}|${t}|${e.metric??""}|${e.value??""}|${s}`)}function _t(e,t,n){if(!n)return;const s=t.version??1;for(const o of Array.isArray(n)?n:[n]){if(!o||t.suppressWhen&&t.suppressWhen(o,e))continue;const r={...o,docAnchor:o.docAnchor??t.docAnchor,detectorVersion:s},a=Cc(r);e.some(c=>c.id===a)||e.push({...r,id:a})}}function Ts(e,t,n,s,o,r=new Map,a=null){const c=$l(e??{},n,s),u=Uo(t,c),d={app:e,stages:t,executorsAdded:n,executorsRemoved:s,jobs:o,sql:r,runAggregates:a,occupancy:u},p=[];for(const i of zn)if(i.inScorecard!==!1)switch(i.scope){case"stage":for(const f of t.values())_t(p,i,i.detect(f,d));break;case"sql":for(const f of r.values())_t(p,i,i.detect(f,d));break;case"app":case"config":_t(p,i,i.detect(d));break;default:uc(i.scope)}return Xo(p,t,c),Zo(p,e),p.sort((i,f)=>Ue[i.impactBand]-Ue[f.impactBand]),p}function en(e){const t=[];for(const n of zn)n.scope==="config"&&_t(t,n,n.detect({app:e}));return Xo(t,new Map),Zo(t,e),t.map(n=>({...n,stageId:n.stageId??null}))}const Mc="sparkforensics",Rc=1,St="recentFiles",Ns=10;let tn=0;function Qo(){const e=Date.now();return e>tn?(tn=e,e):++tn}function zs(){return typeof window<"u"&&"showOpenFilePicker"in window}function jc(e){e.objectStoreNames.contains(St)&&e.deleteObjectStore(St),e.createObjectStore(St,{keyPath:"id"})}function ft(e,t,n){return`${e}::${t}::${n}`}function Et(){return new Promise((e,t)=>{const n=indexedDB.open(Mc,Rc);n.onupgradeneeded=()=>jc(n.result),n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}function Oe(e,t){return e.transaction(St,t).objectStore(St)}function We(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)})}async function er({handle:e,name:t,size:n,lastModified:s,appName:o=null,issueCount:r=null}){const a=await Et();try{const c={id:ft(t,n,s),name:t,size:n,lastModified:s,handle:e,appName:o,issueCount:r,lastOpenedAt:Qo()};await We(Oe(a,"readwrite").put(c));const u=await We(Oe(a,"readonly").getAll());if(u.length>Ns){u.sort((p,i)=>p.lastOpenedAt-i.lastOpenedAt);const d=u.slice(0,u.length-Ns);for(const p of d)await We(Oe(a,"readwrite").delete(p.id))}return c}finally{a.close()}}async function Ec(){const e=await Et();try{return(await We(Oe(e,"readonly").getAll())).sort((n,s)=>s.lastOpenedAt-n.lastOpenedAt)}finally{e.close()}}async function Ic(e){const t=await Et();try{const n=await We(Oe(t,"readonly").get(e));if(!n)return;n.lastOpenedAt=Qo(),await We(Oe(t,"readwrite").put(n))}finally{t.close()}}async function tr(e){const t=await Et();try{await We(Oe(t,"readwrite").delete(e))}finally{t.close()}}async function As(e){const t=await Et();try{const n=await We(Oe(t,"readonly").get(e));return n?n.handle:null}finally{t.close()}}async function Ps(e,t="read"){if(!e)return!1;const n=e,s={mode:t};return await n.queryPermission(s)==="granted"?!0:await n.requestPermission(s)==="granted"}const Tc=new Set(["local-server-unavailable","upstream-unreachable","application-not-found","access-or-upstream-failure","invalid-event-log"]),Nc=[/^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+$/],zc=/^(?!\.{1,2}$)[A-Za-z0-9][A-Za-z0-9._~-]*$/;function mn(e){return typeof e=="string"?e.trim():""}function Ac(e){const t=mn(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 Pc(e){return Nc.some(t=>t.test(e))}function Bc(e){return zc.test(e)}function Lc({baseUrl:e="",appId:t="",attemptId:n=""}={}){const s=Ac(e),o=mn(t),r=mn(n),a={baseUrl:s?null:"Enter an absolute HTTP(S) base URL without credentials, query, or fragment.",appId:Pc(o)?null:"Enter a supported Spark application ID.",attemptId:!r||Bc(r)?null:"Enter a URL-path-safe attempt ID."};return a.baseUrl||a.appId||a.attemptId?{request:null,errors:a}:{request:{baseUrl:s,appId:o,attemptId:r||null},errors:a}}function Bs(e){return e?.request!=null}function Dc(e){return typeof e=="string"&&Tc.has(e)}const se={current:null},nn={current:null};function An(e={}){const t=e.makeClient??zl,n=v.useCallback(async x=>{const b=z.getState().taskDataCache.get(x);if(b)return b;const y=await se.current.requestTaskData(x);return z.getState().setTaskData(x,y),y},[]),s=v.useCallback(async(x=0)=>{const b=z.getState().appModel,y=fs(b,{skippedLines:x});z.getState().setEvidenceAvailability(y);const w=Ts(b.app,b.stages,b.executors.added,b.executors.removed,b.jobs,b.sql,b.runAggregates);z.getState().setCatalog(w),z.getState().setConfigFindings(en(b.app)),z.getState().setSkippedLines(x),z.getState().setStatus("ready");const k=[...new Set(w.map(I=>I.stageId).filter(I=>I!=null))],S=await se.current.prefetchFlaggedStages(k);for(const{stageId:I,metrics:C,fieldNames:D}of S)z.getState().setTaskData(I,{metrics:C,fieldNames:D});const j=nn.current;if(j?.handle){const I=new Set(w.map(C=>C.stageId??`app:${C.type}`)).size;await er({handle:j.handle,name:j.name,size:j.size,lastModified:j.lastModified,appName:b.app?.name??null,issueCount:I})}},[]),o=v.useCallback(()=>{const x=z.getState();x.activeFileId!=null&&x.appModel.app&&x.sessionCache.set(x.activeFileId,rn(x.appModel,x.catalog,x.taskDataCache))},[]),r=v.useCallback(x=>(se.current?.terminate(),z.getState().resetModel(),z.getState().setStatus("parsing"),z.getState().setActiveFile(null),nn.current=null,se.current=t(),xs(z.getState().appModel,{onProgress:b=>z.getState().setParse({pct:b.pct??0,lines:b.linesProcessed??0,etaMs:b.etaMs??null}),onDone:b=>{s(b?.skippedLines??0)},onError:b=>{x?x(b):z.getState().setError(String(b?.message??b))}})),[t,s]),a=v.useCallback((x,b)=>{const y=r(),w=b?.id??ft(x.name,x.size,x.lastModified);z.getState().setActiveFile(w),b?.handle&&(nn.current={handle:b.handle,name:x.name,size:x.size,lastModified:x.lastModified}),se.current.startParse(x,y)},[r]),c=v.useCallback(x=>{const b=r();se.current.startParseFiles(Array.from(x),b)},[r]),u=v.useCallback((x,b)=>{const y=r(w=>{if(z.getState().setShsParsing(!1),w?.source==="shs"&&Dc(w.code)){z.getState().resetModel(),b(w);return}z.getState().setError(String(w?.message??w))});z.getState().setShsParsing(!0),se.current.startParseFromUrl(x,y)},[r]),d=v.useCallback(()=>{o(),se.current?.terminate(),z.getState().resetModel(),z.getState().setStatus("idle")},[o]),p=v.useCallback(async(x,b)=>{const y=z.getState();if(x===y.activeFileId)return"noop";const w=y.sessionCache.get(x);if(w){o(),se.current?.terminate(),se.current=null;const I=ps(y.appModel,y.taskDataCache,w);return z.getState().setCatalog(I),z.getState().setConfigFindings(en(y.appModel.app)),z.getState().setActiveFile(x),z.getState().setStatus("ready"),await Ic(x),"restored"}const k=b??await As(x);if(!k||!await Ps(k))return"gone";let j;try{j=await k.getFile()}catch(I){return I instanceof DOMException&&(I.name==="NotFoundError"||I.name==="NotAllowedError")&&(await tr(x).catch(()=>{}),y.sessionCache.delete(x)),"gone"}return o(),a(j,{handle:k,id:x}),"started"},[a,o]),i=v.useCallback((x,b)=>{const y=z.getState().sessionCache,w=y.get(x),k=y.get(b);return!w||!k?null:{baseline:{label:vs(x),snapshot:w},candidate:{label:vs(b),snapshot:k}}},[]),f=v.useCallback(async(x,b)=>{if(x.kind==="file")return{start:S=>se.current.startParse(x.file,S)};if(x.kind==="folder")return{start:S=>se.current.startParseFiles(x.files,S)};if(x.kind==="url")return{start:S=>se.current.startParseFromUrl(x.request,S)};const y=x.handle??await As(x.id);if(!y)return z.getState().setError(`Run ${b}: this recent file is no longer available.`),null;if(!await Ps(y))return z.getState().setError(`Run ${b}: permission to read this file was denied.`),null;let k;try{k=await y.getFile()}catch{return z.getState().setError(`Run ${b}: this recent file could not be read.`),null}return{start:S=>se.current.startParse(k,S)}},[]),m=v.useCallback((x,b=0)=>{const y=z.getState().appModel;z.getState().setEvidenceAvailability(fs(y,{skippedLines:b}));const w=z.getState().appModel,k=Ts(w.app,w.stages,w.executors.added,w.executors.removed,w.jobs,w.sql,w.runAggregates);z.getState().sessionCache.set(x,rn(w,k,z.getState().taskDataCache))},[]),g=v.useCallback((x,b)=>{const y=(k,S)=>{se.current?.terminate(),z.getState().setCompareLoad(null),z.getState().setComparisonActive(!1);const j=S?.message??String(S);z.getState().setError(`Run ${k}: ${j}`)},w=async(k,S,j)=>{se.current?.terminate(),z.getState().resetModel(),z.getState().setActiveFile(k.id),z.getState().setCompareLoad({current:S==="A"?1:2}),se.current=t();const I=await f(k,S);if(!I){se.current?.terminate(),z.getState().setCompareLoad(null),z.getState().setComparisonActive(!1);return}const C=xs(z.getState().appModel,{onProgress:D=>z.getState().setParse({pct:D.pct??0,lines:D.linesProcessed??0,etaMs:D.etaMs??null}),onDone:D=>j(D?.skippedLines??0),onError:D=>y(S,D)});I.start(C)};w(x,"A",k=>{m(x.id,k),w(b,"B",S=>{m(b.id,S),z.getState().setCompareLoad(null),z.getState().setActiveFile(null),z.getState().openComparison(x.id,b.id)})})},[t,f,m]),h=v.useCallback(x=>{const b=z.getState(),y=b.sessionCache.get(x);if(!y)return;se.current?.terminate(),se.current=null;const w=ps(b.appModel,b.taskDataCache,y);z.getState().setCatalog(w),z.getState().setConfigFindings(en(b.appModel.app)),z.getState().setActiveFile(x),z.getState().setStatus("ready"),z.getState().setComparisonActive(!1)},[]);return{startLoad:a,startLoadFolder:c,startLoadFromUrl:u,resetToDropZone:d,getTaskData:n,pickRecent:p,prepareComparison:i,startCompareLoad:g,drillIntoRun:h}}function nr(e){return String(e).toLowerCase().replace(/\b[0-9a-f]{8,}\b/g,"#").replace(/\d+/g,"#").replace(/\s+/g," ").trim()}function _c(e,t=0){let n=3735928559^t,s=1103547991^t;for(let o=0;o<e.length;o++){const r=e.charCodeAt(o);n=Math.imul(n^r,2654435761),s=Math.imul(s^r,1597334677)}return n=Math.imul(n^n>>>16,2246822507)^Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507)^Math.imul(n^n>>>13,3266489909),(4294967296*(2097151&s)+(n>>>0)).toString(16)}function Fc(e){if(!e)return null;function t(n){const s=(n.children??[]).map(t).sort();return _c(JSON.stringify([nr(n.name??""),qo(n.detail??""),s]))}return t(e)}function $c(e,t){const n=e.sqlExecutionId;return n==null?"":Fc(t.sql.get(n)?.planTree??null)??""}function Oc(e,t){return nr(e.name??"")+"§"+$c(e,t)}function Ls(e){const t=new Map;for(const[n,s]of e.stages){const o=Oc(s,e),r=t.get(o);r?r.push(n):t.set(o,[n])}return t}function Wc(e,t){const n=Ls(e),s=Ls(t),o=[],r=new Set,a=new Set;for(const d of[n,s])for(const[p,i]of d)i.length>1&&a.add(p);for(const d of[...n.keys()].sort()){if(!s.has(d))continue;const p=n.get(d),i=s.get(d);p.length>1||i.length>1||(o.push({identity:d,baseId:p[0],candId:i[0]}),r.add(d))}const c=e.stages.size+t.stages.size,u=c===0?0:2*o.length/c;return{pairs:o,matchedIdentities:r,collisionIdentities:a,coverage:u}}function Ds(e){if(e.length===0)return null;const t=[...e].sort((s,o)=>s-o),n=Math.ceil(.95*t.length)-1;return t[Math.min(t.length-1,Math.max(0,n))]}function $e(e,t){let n=0,s=!1;for(const o of e){const r=o[t];Number.isFinite(r)&&(n+=r,s=!0)}return{sum:n,present:s}}function hn(e){const t=(e.completedAt??0)-(e.submittedAt??0);return t>0&&Number.isFinite(e.taskDurationMax)?e.taskDurationMax/t:null}function _s(e){const t=[];for(const n of e){const s=hn(n);s!=null&&t.push(s)}return t}const sr=new Set(["inputBytes","outputBytes","taskCount","executorsAdded"]);function Gc(e,t,n){if(t==null||n==null)return"unavailable";if(sr.has(e))return n===t?"unchanged":"neutral";const s=n-t;return s<0?"improvement":s>0?"regression":"unchanged"}function ct(e,t,n,s,o={}){const r=Gc(e,n,s),a=n==null||s==null?null:s-n;return{key:e,label:t,baseline:n,candidate:s,delta:a,direction:r,...o}}function Uc(e,t){const n=[];n.push(ct("wallClock","Wall-clock duration",Ss(e.app,e.stages).total,Ss(t.app,t.stages).total));const s=$e([...e.stages.values()],"memoryBytesSpilled"),o=$e([...t.stages.values()],"memoryBytesSpilled");n.push(ct("shuffleSpill","Shuffle spill",s.present?s.sum:null,o.present?o.sum:null,{unavailableReason:s.present&&o.present?void 0:"No shuffle-spill data recorded for a run"}));const r=Ds(_s([...e.stages.values()])),a=Ds(_s([...t.stages.values()]));n.push(ct("taskSkew","Task skew (p95)",r,a,{unavailableReason:r!=null&&a!=null?void 0:"No stage had measurable duration for a run"}));const c=$e([...e.stages.values()],"taskCount"),u=$e([...t.stages.values()],"taskCount"),d=$e([...e.stages.values()],"failedTasks"),p=$e([...t.stages.values()],"failedTasks"),i=c.present&&c.sum>0&&d.present?d.sum/c.sum:null,f=u.present&&u.sum>0&&p.present?p.sum/u.sum:null;n.push(ct("failedTaskRate","Failed-task rate",i,f,{unavailableReason:i!=null&&f!=null?void 0:"No task or failure counts recorded for a run"}));const m=(b,y,w,k)=>{const S=$e([...e.stages.values()],w),j=$e([...t.stages.values()],w);n.push(ct(b,y,S.present?S.sum:null,j.present?j.sum:null,{unavailableReason:S.present&&j.present?void 0:k}))};m("diskSpill","Disk spill","diskBytesSpilled","No disk-spill data recorded for a run"),m("gcTime","GC time","jvmGCTime","No GC-time data recorded for a run"),m("inputBytes","Input read","inputBytes","No input-bytes data recorded for a run"),m("outputBytes","Output written","outputBytes","No output-bytes data recorded for a run"),m("executorRunTime","Executor run-time","executorRunTime","No executor run-time recorded for a run"),m("taskCount","Task count","taskCount","No task counts recorded for a run");const g=b=>Array.isArray(b.executors?.added)?b.executors.added.length:null,h=g(e),x=g(t);return n.push(ct("executorsAdded","Executors added",h,x,{unavailableReason:h!=null&&x!=null?void 0:"No executor events recorded for a run"})),n}function Hc(e,t){const n=c=>{const u=new Map;for(const d of c.catalog){const p=typeof d.rule=="string"?d.rule:d.type,i=d.impactBand??"unknown",f=`${p}§${i}`,m=u.get(f)??{rule:p,impactBand:i,count:0,stages:new Set};m.count++;const g=d.stageId!=null?c.stages.get(d.stageId):null;g?.name&&m.stages.add(g.name),u.set(f,m)}return u},s=n(e),o=n(t),r=[],a=[];for(const c of[...new Set([...s.keys(),...o.keys()])].sort()){const u=s.get(c),d=o.get(c),p=u?.count??0,i=d?.count??0;if(i===p)continue;const f=d??u,m=i>p?d:u,g={rule:f.rule,impactBand:f.impactBand,baseCount:p,candCount:i,delta:i-p,stages:[...m.stages].sort()};(i>p?r:a).push(g)}return{introduced:r,resolved:a}}function qc(e,t){return e?.name!=null&&t?.name!=null&&e.name!==t.name}function Vc(e,t,n){return n.pairs.map(s=>{const o=hn(e.stages.get(s.baseId)),r=hn(t.stages.get(s.candId));return{identity:s.identity,baseline:o,candidate:r,delta:o!=null&&r!=null?r-o:null}}).sort((s,o)=>s.identity<o.identity?-1:s.identity>o.identity?1:0)}function Yc(e){const t=s=>Number.isFinite(s)?s: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 Fs(e){return[...e.stages].map(([t,n])=>({id:t,name:n.name??`Stage ${t}`,metrics:Yc(n)}))}function Jc(e,t){const n=e.snapshot,s=t.snapshot,o=Wc(n,s),r=qc(n.app,s.app);return{baselineLabel:e.label,candidateLabel:t.label,confidence:r?"low":"ok",reason:r?"Run names differ, so deltas may compare different work.":null,matchedCoverage:o.coverage,metrics:Uc(n,s),findings:Hc(n,s),stageSkew:Vc(n,s,o),baseStages:Fs(n),candStages:Fs(s)}}const $s=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,Os=po,Ut=(e,t)=>n=>{var s;if(t?.variants==null)return Os(e,n?.class,n?.className);const{variants:o,defaultVariants:r}=t,a=Object.keys(o).map(d=>{const p=n?.[d],i=r?.[d];if(p===null)return null;const f=$s(p)||$s(i);return o[d][f]}),c=n&&Object.entries(n).reduce((d,p)=>{let[i,f]=p;return f===void 0||(d[i]=f),d},{}),u=t==null||(s=t.compoundVariants)===null||s===void 0?void 0:s.reduce((d,p)=>{let{class:i,className:f,...m}=p;return Object.entries(m).every(g=>{let[h,x]=g;return Array.isArray(x)?x.includes({...r,...c}[h]):{...r,...c}[h]===x})?[...d,i,f]:d},[]);return Os(e,a,u,n?.class,n?.className)},or=Ut("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function fe({className:e,variant:t="default",size:n="default",...s}){return l.jsx(oa,{"data-slot":"button",className:J(or({variant:t,size:n,className:e})),...s})}const Kc="vendor/spark-doc/index.html";function bt(e,t){const n=String(e).replace(/^#/,""),s=t?`?tok=${encodeURIComponent(t)}`:"";return`${Kc}${s}#${encodeURIComponent(n)}`}const Xc={"task-duration":"#metric-task-duration","shuffle-read-bytes":"#metric-shuffle-read-bytes","shuffle-write-bytes":"#metric-shuffle-write-bytes","memory-bytes-spilled":"#metric-memory-bytes-spilled","disk-bytes-spilled":"#metric-disk-bytes-spilled","jvm-gc-time":"#metric-jvm-gc-time",gcpct:"#metric-gcpct","executor-run-time":"#metric-executor-run-time","fetch-wait-time-ratio":"#metric-fetch-wait-time-ratio","input-bytes":"#metric-input-bytes","output-bytes":"#metric-output-bytes","io-ratio":"#metric-io-ratio","peak-execution-memory":"#metric-peak-execution-memory","failed-tasks":"#metric-failed-tasks","speculative-tasks":"#metric-speculative-tasks","first-stage-submitted-at":"#metric-first-stage-submitted-at","executor-count":"#metric-executor-count","stage-duration":"#metric-stage-duration"},Zc=new Set(["#intro","#spark-architecture","#memory-model","#partitioning","#joins","#shuffle","#data-formats","#table-formats","#caching","#pyspark","#aqe","#cluster-config","#anti-patterns","#metrics","#config","#bottleneck-cold-start","#bottleneck-failures","#bottleneck-gc","#bottleneck-job-failure-rate","#bottleneck-retry-waste","#bottleneck-shuffle","#bottleneck-skew","#bottleneck-slow-host","#bottleneck-spill","#bottleneck-straggler","#bottleneck-tiny-tasks","#bottleneck-utilization","#bottleneck-memory-utilization","#bottleneck-broadcast-sizing","#bottleneck-duplicate-plan-subtree","#bottleneck-small-files","#bottleneck-stage-shape","#bottleneck-stage-slowness","#config-autoscale-bounds","#config-memory-overhead","#config-serializer","#config-shuffle-service",...Object.values(Xc)]);function rr(e){return Zc.has(String(e))}function Qc({entries:e,activeId:t=null,onPick:n,onRemove:s}){return e.length?l.jsx("ul",{className:"flex flex-col gap-0.5",children:e.map(o=>{const r=o.appName||o.name,a=o.issueCount!=null?` · ${o.issueCount} issue${o.issueCount===1?"":"s"}`:"";return l.jsxs("li",{className:J("flex items-center gap-1 rounded-md",o.id===t&&"bg-accent"),children:[l.jsxs("button",{type:"button",className:"tap-target-comfortable flex min-w-0 flex-1 flex-col items-start gap-0.5 rounded-md px-1.5 py-1 text-left hover:bg-muted",onClick:()=>n?.(o.id),children:[l.jsx("span",{className:"w-full truncate text-sm font-medium",children:r}),l.jsxs("span",{className:"w-full truncate text-xs text-muted-foreground",children:[o.name," · ",ne(o.size),a]})]}),l.jsx(fe,{type:"button",variant:"ghost",size:"icon",className:"tap-target-comfortable","aria-label":"Remove from recent files",onClick:()=>s?.(o.id),children:l.jsx(Lo,{"aria-hidden":"true"})})]},o.id)})}):l.jsx("p",{className:"px-1.5 py-1 text-sm text-muted-foreground",children:"No recent files yet"})}function ed(e,t){const n=a=>a.match(/(\d+)|(\D+)/g)??[a],s=n(e),o=n(t),r=Math.max(s.length,o.length);for(let a=0;a<r;a++){const c=s[a]??"",u=o[a]??"";if(c===u)continue;const d=Number(c),p=Number(u);return!Number.isNaN(d)&&!Number.isNaN(p)?d-p:c<u?-1:1}return 0}function td(e){const n=e.filter(d=>!d.toLowerCase().startsWith("appstatus")).filter(d=>/^events_\d+_/.test(d)),s=d=>parseInt(d.match(/^events_(\d+)_/)[1],10),o=n.filter(d=>d.endsWith(".compact")).map(s),r=o.length>0?Math.max(...o):-1,c=n.filter(d=>{const p=s(d);return d.endsWith(".compact")?p===r:p>r}).sort(ed),u=c.map(s);for(let d=1;d<u.length;d++)if(u[d]!==u[d-1]+1)throw new Error(`Rolling event-log directory is missing file(s) between index ${u[d-1]} and ${u[d]}.`);return c}const nd={"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 sd(e){const t=e.createReader(),n=[];for(;;){const o=await new Promise((r,a)=>t.readEntries(r,a));if(o.length===0)break;n.push(...o)}const s=n.filter(o=>o.isFile);return Promise.all(s.map(o=>new Promise((r,a)=>o.file(r,a))))}function ar({onPick:e,compact:t=!1}={}){const{startLoad:n,startLoadFolder:s,startLoadFromUrl:o,pickRecent:r}=An(),a=oe(R=>R.shsParsing),c=v.useRef(null),u=v.useRef(null),[d,p]=v.useState(!1),[i,f]=v.useState([]),[m,g]=v.useState(""),[h,x]=v.useState(""),[b,y]=v.useState(""),[w,k]=v.useState(!1),[S,j]=v.useState(!1),[I,C]=v.useState({baseUrl:!1,appId:!1,attemptId:!1}),[D,ee]=v.useState(null),L=v.useRef(null),A=Lc({baseUrl:m,appId:h,attemptId:b}),G=S||a,O=w||a;v.useEffect(()=>{D&&L.current?.focus()},[D]);const U=v.useCallback(()=>{Ec().then(R=>f(R)).catch(()=>f([]))},[]);v.useEffect(()=>{U()},[U]);const B=v.useCallback(async()=>{if(zs()){let R;try{[R]=await window.showOpenFilePicker()}catch{return}try{const P=await R.getFile();e?e({kind:"file",id:ft(P.name,P.size,P.lastModified),label:P.name,file:P,handle:R}):n(P,{handle:R})}catch{z.getState().setError("Could not read the selected file.")}return}c.current?.click()},[n,e]),q=v.useCallback(R=>{const P=R.map(X=>X.name);if(!P.some(X=>/^events_\d+_/.test(X))){z.getState().setError("This isn't a Spark rolling event-log directory. Choose file to load a single event log.");return}let Q;try{Q=td(P)}catch(X){z.getState().setError(X.message);return}const le=new Map(R.map(X=>[X.name,X])),de=Q.map(X=>le.get(X));if(e){const X=de[0];e({kind:"folder",id:`folder:${X?.name??Q[0]}`,label:`${de.length}-file rolling log`,files:de});return}s(de)},[s,e]),re=v.useCallback(R=>{const P=R.target.files?.[0];P&&(e?e({kind:"file",id:ft(P.name,P.size,P.lastModified),label:P.name,file:P}):n(P)),R.target.value=""},[n,e]),ae=v.useCallback(R=>{const P=Array.from(R.target.files??[]);P.length&&q(P),R.target.value=""},[q]),E=v.useCallback(async R=>{const P=R.dataTransfer.files[0],Q=R.dataTransfer.items?.[0],le=Q?.webkitGetAsEntry?.();if(le&&le.isDirectory){try{const de=await sd(le);q(de)}catch{z.getState().setError("Could not read the dropped folder.")}return}if(zs()&&Q?.getAsFileSystemHandle)try{const de=await Q.getAsFileSystemHandle();if(de&&de.kind==="file"){const X=await de.getFile();e?e({kind:"file",id:ft(X.name,X.size,X.lastModified),label:X.name,file:X,handle:de}):n(X,{handle:de});return}}catch{z.getState().setError("Could not read the selected file.");return}P&&(e?e({kind:"file",id:ft(P.name,P.size,P.lastModified),label:P.name,file:P}):n(P))},[n,q,e]),ie=v.useCallback(R=>{R.preventDefault(),p(!1),E(R)},[E]),Ce=v.useCallback(async R=>{const P=i.find(le=>le.id===R);if(e){e({kind:"recent",id:R,label:P?.appName||P?.name||R,handle:P?.handle});return}const Q=await r(R,P?.handle);(Q==="restored"||Q==="gone")&&U()},[i,r,U,e]),F=v.useCallback(R=>{const P=i.find(Q=>Q.id===R);tr(R).catch(()=>{}).finally(U),P&&Li(`Removed "${P.appName||P.name}" from recent files`,{action:{label:"Undo",onClick:()=>{er(P).catch(()=>{}).finally(U)}}})},[i,U]),Y=v.useCallback((R,P)=>{R==="baseUrl"&&g(P),R==="appId"&&x(P),R==="attemptId"&&y(P),ee(null)},[]),_=v.useCallback(R=>{C(P=>({...P,[R]:!0}))},[]),W=v.useCallback(R=>{R.preventDefault(),C({baseUrl:!0,appId:!0,attemptId:!0}),ee(null);const P=A.request;if(!(!Bs(A)||!P)){if(e){const Q=P.attemptId?`${P.appId}/${P.attemptId}`:P.appId;e({kind:"url",id:Q,label:Q,request:P});return}o(P,Q=>{ee(Q.code)})}},[A,o,e]),K=R=>I[R]?A.errors[R]:null,V=l.jsxs("section",{className:"landing-history-server w-full text-left",children:[l.jsx("button",{type:"button",className:"tap-target-comfortable w-full rounded-md border border-border px-3 py-2 text-left text-sm font-medium hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring","aria-expanded":G,"aria-controls":"shs-fetch-panel",onClick:()=>j(R=>!R),children:"Fetch from Spark History Server"}),G?l.jsxs("div",{id:"shs-fetch-panel",className:"mt-3 rounded-md border border-border p-4",children:[l.jsx("p",{className:"mb-3 text-sm text-muted-foreground",children:"Requires local-server mode and a History Server reachable from this machine."}),l.jsxs("form",{onSubmit:W,className:"flex flex-col gap-3",children:[l.jsxs("div",{className:"grid gap-3 sm:grid-cols-3",children:[l.jsxs("label",{className:"flex flex-col gap-1 text-xs text-muted-foreground",children:["Base URL",l.jsx("input",{type:"text",value:m,onChange:R=>Y("baseUrl",R.target.value),onBlur:()=>_("baseUrl"),placeholder:"http://history-server:18080","aria-label":"Spark History Server base URL","aria-invalid":!!K("baseUrl"),"aria-describedby":K("baseUrl")?"shs-base-url-error":void 0,className:"tap-target-input rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground"}),K("baseUrl")?l.jsx("span",{id:"shs-base-url-error",className:"text-destructive",children:K("baseUrl")}):null]}),l.jsxs("label",{className:"flex flex-col gap-1 text-xs text-muted-foreground",children:["Application ID",l.jsx("input",{type:"text",value:h,onChange:R=>Y("appId",R.target.value),onBlur:()=>_("appId"),placeholder:"application_1234567890_0001","aria-label":"Application ID","aria-invalid":!!K("appId"),"aria-describedby":K("appId")?"shs-app-id-error":void 0,className:"tap-target-input rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground"}),K("appId")?l.jsx("span",{id:"shs-app-id-error",className:"text-destructive",children:K("appId")}):null]}),l.jsxs("label",{className:"flex flex-col gap-1 text-xs text-muted-foreground",children:["Attempt ID (optional)",l.jsx("input",{type:"text",value:b,onChange:R=>Y("attemptId",R.target.value),onBlur:()=>_("attemptId"),placeholder:"2","aria-label":"Attempt ID (optional)","aria-invalid":!!K("attemptId"),"aria-describedby":K("attemptId")?"shs-attempt-id-error":void 0,className:"tap-target-input rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground"}),K("attemptId")?l.jsx("span",{id:"shs-attempt-id-error",className:"text-destructive",children:K("attemptId")}):null]})]}),a?l.jsx("p",{role:"status","aria-live":"polite",className:"text-sm text-muted-foreground",children:"Fetching event log…"}):null,D?l.jsxs("p",{ref:L,role:"alert",tabIndex:-1,className:"text-sm text-destructive",children:[nd[D]," ","Edit the fields, review ",l.jsx("a",{href:bt("#intro"),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."]}):null,l.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[l.jsx(fe,{type:"submit",className:"tap-target-comfortable",disabled:!Bs(A)||a,children:"Fetch"}),l.jsx("span",{className:"text-xs text-muted-foreground",children:"Application IDs: application_…, local-…, app-…, spark-…, or driver-…"})]})]})]}):null]});return l.jsxs("div",{"data-testid":"drop-zone",role:"region","aria-label":"Drop Spark event log file here",className:J("mx-auto flex w-full flex-col items-center justify-center gap-6 rounded-xl border-2 border-dashed border-border p-6 text-center transition-colors",t?"max-w-full":"landing-drop-zone max-w-none p-6 sm:p-8",d&&"border-primary bg-primary/5"),onDragOver:R=>{R.preventDefault(),p(!0)},onDragLeave:()=>p(!1),onDrop:ie,children:[l.jsx(El,{"aria-hidden":"true",className:"size-10 text-primary"}),l.jsxs("div",{children:[l.jsx("p",{className:"font-heading text-lg font-semibold",children:"Choose a Spark event log"}),l.jsx("p",{className:"text-sm text-muted-foreground",children:"Drop an event log file here, or choose a file below."}),l.jsx("p",{className:"mt-1 max-w-xl text-xs text-muted-foreground",children:"Accepts a Spark event log file: newline-delimited JSON, one event per line, optionally gzip/Zstandard/LZ4/Snappy-compressed."})]}),l.jsx("div",{className:"flex flex-wrap items-center justify-center gap-2",children:l.jsx(fe,{type:"button",className:"tap-target-comfortable",onClick:()=>{B()},children:"Choose file"})}),l.jsx("input",{ref:c,type:"file",className:"hidden","data-testid":"file-input","aria-label":"Choose file",onChange:re}),l.jsx("input",{ref:u,type:"file",className:"hidden","data-testid":"folder-input","aria-label":"Choose rolling log folder",onChange:ae,webkitdirectory:"true",directory:"true"}),t?l.jsxs(l.Fragment,{children:[l.jsx(fe,{type:"button",variant:"outline",className:"tap-target-comfortable",onClick:()=>u.current?.click(),children:"Choose rolling-log folder"}),l.jsx("div",{className:"w-full max-w-2xl",children:V})]}):l.jsxs("section",{className:"landing-other-sources w-full max-w-2xl text-left",children:[l.jsx("button",{type:"button",className:"tap-target-comfortable w-full rounded-md border border-border px-3 py-2 text-left text-sm font-medium hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring","aria-expanded":O,"aria-controls":"other-sources-panel",onClick:()=>k(R=>!R),children:"Other sources"}),O?l.jsxs("div",{id:"other-sources-panel",className:"mt-3 flex flex-col gap-3 rounded-md border border-border p-4",children:[l.jsxs("p",{className:"text-sm text-muted-foreground",children:["Use these for a rolling ",l.jsx("code",{children:"eventlog_v2_*"})," directory or to fetch an application from a local Spark History Server."]}),l.jsx("div",{children:l.jsx(fe,{type:"button",variant:"outline",className:"tap-target-comfortable",onClick:()=>u.current?.click(),children:"Choose rolling-log folder"})}),V]}):null]}),i.length>0&&l.jsxs("div",{className:"w-full max-w-md text-left",children:[l.jsx("p",{className:"mb-1 px-1.5 text-xs font-medium tracking-wide text-muted-foreground uppercase",children:"Recent files"}),l.jsx(Qc,{entries:i,onPick:R=>{Ce(R)},onRemove:F})]})]})}function ir({...e}){return l.jsx(aa,{"data-slot":"collapsible",...e})}function lr({...e}){return l.jsx(ra,{"data-slot":"collapsible-trigger",...e})}function cr({className:e,...t}){return l.jsx(ia,{"data-slot":"collapsible-content",className:J("h-(--collapsible-panel-height) overflow-hidden transition-[height] duration-150 ease-out data-ending-style:h-0 data-starting-style:h-0 motion-reduce:transition-none",e),...t})}const od="npx --package=github:shuffle-works/sparkforensics sparkforensics-mcp",rd=`{
|
|
3
|
-
"mcpServers": {
|
|
4
|
-
"sparkforensics": {
|
|
5
|
-
"command": "npx",
|
|
6
|
-
"args": ["--package=github:shuffle-works/sparkforensics", "sparkforensics-mcp"]
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
}`;function ad(){return l.jsxs(ir,{className:"w-full",children:[l.jsx(lr,{className:J(or({variant:"outline"}),"tap-target-comfortable"),children:"Use with an AI assistant (MCP)"}),l.jsxs(cr,{className:"mt-2 flex w-full flex-col gap-2 text-sm",children:[l.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."}),l.jsx("pre",{"data-testid":"mcp-config-snippet",className:"overflow-x-auto rounded-md bg-muted p-2 text-xs whitespace-pre",children:od}),l.jsx("p",{className:"text-muted-foreground",children:"Or, in an MCP client config:"}),l.jsx("pre",{className:"overflow-x-auto rounded-md bg-muted p-2 text-xs whitespace-pre",children:rd})]})]})}const id="[data-shuffle-product-bar]";function ld(){return document.querySelector(id)}function cd({className:e,children:t}){const n=ld();return n?la.createPortal(l.jsx("div",{"data-shuffle-page-controls":!0,children:t}),n):l.jsx("div",{className:e,"data-shuffle-page-controls":!0,children:t})}function dd({label:e,onChange:t}){return l.jsxs("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-border p-4",children:[l.jsxs("span",{className:"min-w-0 truncate text-sm",children:[l.jsx("span",{"aria-hidden":"true",className:"mr-2 text-clean",children:"✓"}),e]}),l.jsx(fe,{type:"button",variant:"ghost",size:"sm",className:"tap-target-comfortable",onClick:t,children:"Change"})]})}function Ws({testId:e,ariaLabel:t,source:n,onPick:s,onChange:o}){return l.jsx("div",{"data-testid":e,"aria-label":t,className:"min-w-0 flex-1",children:n?l.jsx(dd,{label:n.label,onChange:o}):l.jsx(ar,{onPick:s,compact:!0})})}function ud({onClick:e}){return l.jsxs(fe,{type:"button",variant:"outline",className:"tap-target-comfortable",onClick:e,children:["Compare two runs ",l.jsx(ln,{"aria-hidden":"true"})]})}function fd(){return l.jsxs("div",{className:"landing-resources","aria-label":"SparkForensics resources",children:[l.jsxs("a",{href:"/docs/",target:"_blank",rel:"noopener noreferrer",className:"landing-resource-card",children:[l.jsx(En,{"aria-hidden":"true"}),l.jsxs("span",{children:[l.jsx("strong",{children:"Read the docs"}),l.jsx("span",{children:"How to load a log, read the board, and use every finding."})]}),l.jsx(ln,{"aria-hidden":"true",className:"landing-resource-arrow"})]}),l.jsxs("a",{href:bt("#intro"),target:"_blank",rel:"noopener noreferrer",className:"landing-resource-card",children:[l.jsx(Ao,{"aria-hidden":"true"}),l.jsxs("span",{children:[l.jsx("strong",{children:"Spark optimization reference"}),l.jsx("span",{children:"Architecture, memory, shuffle, and tuning notes behind every finding."})]}),l.jsx(ln,{"aria-hidden":"true",className:"landing-resource-arrow"})]})]})}function pd({onCompare:e}){return l.jsxs("section",{className:"landing-next-steps","aria-labelledby":"next-steps-title",children:[l.jsxs("div",{children:[l.jsx("p",{className:"landing-next-steps-label",children:"After your first run"}),l.jsx("h2",{id:"next-steps-title",children:"Go further with the evidence you already have."})]}),l.jsxs("div",{className:"landing-next-step-list",children:[l.jsxs("article",{children:[l.jsx(Bo,{"aria-hidden":"true"}),l.jsxs("div",{children:[l.jsx("h3",{children:"Compare two runs"}),l.jsx("p",{children:"Use a baseline and candidate log to see which structurally matched stages changed."}),l.jsx(ud,{onClick:e})]})]}),l.jsxs("article",{children:[l.jsx(Po,{"aria-hidden":"true"}),l.jsxs("div",{children:[l.jsx("h3",{children:"Use with an AI assistant"}),l.jsx("p",{children:"Connect MCP when you want an agent to inspect this evidence with you."}),l.jsx(ad,{})]})]})]})]})}function md(){const{startCompareLoad:e}=An(),{theme:t,toggle:n}=jn(),[s,o]=v.useState(!1),[r,a]=v.useState(null),[c,u]=v.useState(null);return s?l.jsxs("div",{className:"mx-auto flex w-full max-w-5xl flex-col gap-4",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h2",{className:"font-heading text-lg font-semibold",children:"Compare two runs"}),l.jsx(fe,{type:"button",variant:"ghost",size:"sm",className:"tap-target-comfortable",onClick:()=>{o(!1),a(null),u(null)},children:"Cancel"})]}),l.jsx("p",{className:"landing-compare-intro",children:"Use Run A as the baseline and Run B as the candidate. Compare structurally matched stages to review material changes in a shared stage-level context."}),l.jsxs("div",{className:"grid gap-4 lg:grid-cols-2",children:[l.jsxs("div",{children:[l.jsx("p",{className:"mb-2 text-sm font-medium text-muted-foreground",children:"Run A (baseline)"}),l.jsx(Ws,{testId:"compare-slot-a",ariaLabel:"Run A",source:r,onPick:a,onChange:()=>a(null)})]}),l.jsxs("div",{children:[l.jsx("p",{className:"mb-2 text-sm font-medium text-muted-foreground",children:"Run B (candidate)"}),l.jsx(Ws,{testId:"compare-slot-b",ariaLabel:"Run B",source:c,onPick:u,onChange:()=>u(null)})]})]}),l.jsx("div",{className:"flex justify-end",children:l.jsx(fe,{type:"button",className:"tap-target-comfortable",disabled:!r||!c,onClick:()=>{r&&c&&e(r,c)},children:"Compare"})})]}):l.jsxs("div",{className:"landing-shell mx-auto w-full max-w-6xl",children:[l.jsxs("section",{className:"landing-hero","aria-labelledby":"landing-title",children:[l.jsxs(cd,{className:"landing-identity",children:[l.jsx(tl,{"aria-hidden":"true",className:"size-4"}),l.jsx("span",{children:"SparkForensics"}),l.jsx("a",{href:bt("#intro"),target:"_blank",rel:"noopener noreferrer",className:"theme-toggle tap-target-comfortable","aria-label":"Spark tuning reference",title:"Spark tuning reference",children:l.jsx(Ao,{"aria-hidden":"true",className:"theme-icon"})}),l.jsx("a",{href:"/docs/",target:"_blank",rel:"noopener noreferrer",className:"theme-toggle tap-target-comfortable","aria-label":"SparkForensics docs",title:"SparkForensics docs",children:l.jsx(En,{"aria-hidden":"true",className:"theme-icon"})}),l.jsxs("button",{type:"button",className:"theme-toggle tap-target-comfortable","aria-label":"Toggle theme","aria-pressed":t==="light",title:"Toggle theme",onClick:n,children:[l.jsx(Cl,{"aria-hidden":"true",className:"theme-icon sun"}),l.jsx(xl,{"aria-hidden":"true",className:"theme-icon moon"})]})]}),l.jsxs("div",{className:"landing-hero-copy",children:[l.jsx("p",{className:"landing-kicker",children:"Private by default"}),l.jsx("h2",{id:"landing-title",children:"Analyze a Spark event log."}),l.jsx("p",{children:"Read stages, timelines, shuffle reads, and executor behavior from the log Spark already produced."})]}),l.jsxs("div",{className:"landing-proof","aria-label":"SparkForensics guarantees",children:[l.jsxs("span",{children:[l.jsx(kl,{"aria-hidden":"true"})," Nothing leaves your machine"]}),l.jsxs("span",{children:[l.jsx(Po,{"aria-hidden":"true"})," Bring your AI into the investigation"]}),l.jsxs("span",{children:[l.jsx(Bo,{"aria-hidden":"true"})," Compare one run against another"]})]}),l.jsx(fd,{})]}),l.jsxs("section",{className:"landing-intake","aria-labelledby":"start-investigation-title",children:[l.jsx("div",{className:"landing-section-heading",children:l.jsx("div",{children:l.jsx("h2",{id:"start-investigation-title",children:"Analyze a single run first."})})}),l.jsx(ar,{})]}),l.jsx(pd,{onCompare:()=>o(!0)})]})}const Gs="#intro",Pn=v.createContext(null);function hd({children:e}){const[t,n]=v.useState(!1),[s,o]=v.useState({kind:"vendor",anchor:Gs}),r=v.useCallback((d=Gs)=>{o({kind:"vendor",anchor:d}),n(!0)},[]),a=v.useCallback(d=>{o({kind:"site",path:d}),n(!0)},[]),c=v.useCallback(()=>n(!1),[]),u=v.useMemo(()=>({open:r,openSite:a,close:c,isOpen:t,target:s}),[r,a,c,t,s]);return l.jsx(Pn.Provider,{value:u,children:e})}function dr(){const e=v.useContext(Pn);if(!e)throw new Error("useDocs outside DocsProvider");return e}function gd(){return v.useContext(Pn)}function bd({anchor:e,children:t}){const{open:n}=dr();return rr(e)?l.jsx("a",{href:bt(e),className:"text-primary underline-offset-4 hover:underline",onClick:s=>{s.metaKey||s.ctrlKey||s.shiftKey||s.altKey||s.button!==0||(s.preventDefault(),n(e))},children:t}):null}function xd(e,t){const n=getComputedStyle(e),s=parseFloat(n.fontSize);return t*s}function vd(e,t){const n=getComputedStyle(e.ownerDocument.documentElement),s=parseFloat(n.fontSize);return t*s}function yd(e){return e/100*window.innerHeight}function wd(e){return e/100*window.innerWidth}function kd(e){switch(typeof e){case"number":return[e,"px"];case"string":{const 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,"%"]}}}function kt({groupSize:e,panelElement:t,styleProp:n}){let s;const[o,r]=kd(n);switch(r){case"%":{s=o/100*e;break}case"px":{s=o;break}case"rem":{s=vd(t,o);break}case"em":{s=xd(t,o);break}case"vh":{s=yd(o);break}case"vw":{s=wd(o);break}}return s}function xe(e){return parseFloat(e.toFixed(3))}function gt({group:e}){const{orientation:t,panels:n}=e;return n.reduce((s,o)=>(s+=t==="horizontal"?o.element.offsetWidth:o.element.offsetHeight,s),0)}function gn(e){const{panels:t}=e,n=gt({group:e});return n===0?t.map(s=>({groupResizeBehavior:s.panelConstraints.groupResizeBehavior,collapsedSize:0,collapsible:s.panelConstraints.collapsible===!0,defaultSize:void 0,disabled:s.panelConstraints.disabled,minSize:0,maxSize:100,panelId:s.id})):t.map(s=>{const{element:o,panelConstraints:r}=s;let a=0;if(r.collapsedSize!==void 0){const p=kt({groupSize:n,panelElement:o,styleProp:r.collapsedSize});a=xe(p/n*100)}let c;if(r.defaultSize!==void 0){const p=kt({groupSize:n,panelElement:o,styleProp:r.defaultSize});c=xe(p/n*100)}let u=0;if(r.minSize!==void 0){const p=kt({groupSize:n,panelElement:o,styleProp:r.minSize});u=xe(p/n*100)}let d=100;if(r.maxSize!==void 0){const p=kt({groupSize:n,panelElement:o,styleProp:r.maxSize});d=xe(p/n*100)}return{groupResizeBehavior:r.groupResizeBehavior,collapsedSize:a,collapsible:r.collapsible===!0,defaultSize:c,disabled:r.disabled,minSize:u,maxSize:d,panelId:s.id}})}function Z(e,t="Assertion error"){if(!e)throw Error(t)}function bn(e,t){return Array.from(t).sort(e==="horizontal"?Sd:Cd)}function Sd(e,t){const n=e.element.offsetLeft-t.element.offsetLeft;return n!==0?n:e.element.offsetWidth-t.element.offsetWidth}function Cd(e,t){const n=e.element.offsetTop-t.element.offsetTop;return n!==0?n:e.element.offsetHeight-t.element.offsetHeight}function ur(e){return e!==null&&typeof e=="object"&&"nodeType"in e&&e.nodeType===Node.ELEMENT_NODE}function fr(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 Md({orientation:e,rects:t,targetRect:n}){const s={x:n.x+n.width/2,y:n.y+n.height/2};let o,r=Number.MAX_VALUE;for(const a of t){const{x:c,y:u}=fr(s,a),d=e==="horizontal"?c:u;d<r&&(r=d,o=a)}return Z(o,"No rect found"),o}let Lt;function Rd(){return Lt===void 0&&(typeof matchMedia=="function"?Lt=!!matchMedia("(pointer:coarse)").matches:Lt=!1),Lt}function pr(e){const{element:t,orientation:n,panels:s,separators:o}=e,r=bn(n,Array.from(t.children).filter(ur).map(g=>({element:g}))).map(({element:g})=>g),a=[];let c=!1,u=!1,d=-1,p=-1,i=0,f,m=[];{let g=-1;for(const h of r)h.hasAttribute("data-panel")&&(g++,h.hasAttribute("data-disabled")||(i++,d===-1&&(d=g),p=g))}if(i>1){let g=-1;for(const h of r)if(h.hasAttribute("data-panel")){g++;const x=s.find(b=>b.element===h);if(x){if(f){const b=f.element.getBoundingClientRect(),y=h.getBoundingClientRect();let w;if(u){const k=n==="horizontal"?new DOMRect(b.right,b.top,0,b.height):new DOMRect(b.left,b.bottom,b.width,0),S=n==="horizontal"?new DOMRect(y.left,y.top,0,y.height):new DOMRect(y.left,y.top,y.width,0);switch(m.length){case 0:{w=[k,S];break}case 1:{const j=m[0],I=Md({orientation:n,rects:[b,y],targetRect:j.element.getBoundingClientRect()});w=[j,I===b?S:k];break}default:{w=m;break}}}else m.length?w=m:w=[n==="horizontal"?new DOMRect(b.right,y.top,y.left-b.right,y.height):new DOMRect(y.left,b.bottom,y.width,y.top-b.bottom)];for(const k of w){let S="width"in k?k:k.element.getBoundingClientRect();const j=Rd()?e.resizeTargetMinimumSize.coarse:e.resizeTargetMinimumSize.fine;if(S.width<j){const C=j-S.width;S=new DOMRect(S.x-C/2,S.y,S.width+C,S.height)}if(S.height<j){const C=j-S.height;S=new DOMRect(S.x,S.y-C/2,S.width,S.height+C)}const I=g<=d||g>p;!c&&!I&&a.push({group:e,groupSize:gt({group:e}),panels:[f,x],separator:"width"in k?void 0:k,rect:S}),c=!1}}u=!1,f=x,m=[]}}else if(h.hasAttribute("data-separator")){h.ariaDisabled!==null&&(c=!0);const x=o.find(b=>b.element===h);x?m.push(x):(f=void 0,m=[])}else u=!0}return a}class mr{#e={};addListener(t,n){const s=this.#e[t];return s===void 0?this.#e[t]=[n]:s.includes(n)||s.push(n),()=>{this.removeListener(t,n)}}emit(t,n){const s=this.#e[t];if(s!==void 0)if(s.length===1)s[0].call(null,n);else{let o=!1,r=null;const a=Array.from(s);for(let c=0;c<a.length;c++){const u=a[c];try{u.call(null,n)}catch(d){r===null&&(o=!0,r=d)}}if(o)throw r}}removeAllListeners(){this.#e={}}removeListener(t,n){const s=this.#e[t];if(s!==void 0){const o=s.indexOf(n);o>=0&&s.splice(o,1)}}}let mt={cursorFlags:0,state:"inactive"};const Bn=new mr;function Qe(){return mt}function jd(e){return Bn.addListener("change",e)}function Ed(e){const t=mt,n={...mt};n.cursorFlags=e,mt=n,Bn.emit("change",{prev:t,next:n})}function ht(e){const t=mt;mt=e,Bn.emit("change",{prev:t,next:e})}const Id=e=>e,sn=()=>{},hr=1,gr=2,br=4,xr=8,Us=3,Hs=12;let Dt;function qs(){return Dt===void 0&&(Dt=!1,typeof window<"u"&&(window.navigator.userAgent.includes("Chrome")||window.navigator.userAgent.includes("Firefox"))&&(Dt=!0)),Dt}function Td({cursorFlags:e,groups:t,state:n}){let s=0,o=0;switch(n){case"active":case"hover":t.forEach(r=>{if(!r.mutableState.disableCursor)switch(r.orientation){case"horizontal":{s++;break}case"vertical":{o++;break}}})}if(!(s===0&&o===0)){switch(n){case"active":{if(e&&qs()){const r=(e&hr)!==0,a=(e&gr)!==0,c=(e&br)!==0,u=(e&xr)!==0;if(r)return c?"se-resize":u?"ne-resize":"e-resize";if(a)return c?"sw-resize":u?"nw-resize":"w-resize";if(c)return"s-resize";if(u)return"n-resize"}break}}return qs()?s>0&&o>0?"move":s>0?"ew-resize":"ns-resize":s>0&&o>0?"grab":s>0?"col-resize":"row-resize"}}const Vs=new WeakMap;function Ln(e){if(e.defaultView===null||e.defaultView===void 0)return;let{prevStyle:t,styleSheet:n}=Vs.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]));const s=Qe();switch(s.state){case"active":case"hover":{const o=Td({cursorFlags:s.cursorFlags,groups:s.hitRegions.map(a=>a.group),state:s.state}),r=`*, *:hover {cursor: ${o} !important; }`;if(t===r)return;t=r,o?n.cssRules.length===0?n.insertRule(r):n.replaceSync(r):n.cssRules.length===1&&n.deleteRule(0);break}case"inactive":{t=void 0,n.cssRules.length===1&&n.deleteRule(0);break}}Vs.set(e,{prevStyle:t,styleSheet:n})}let ze=new Map;const vr=new mr;function Nd(e){ze=new Map(ze),ze.delete(e)}function Ys(e,t){for(const[n]of ze)if(n.id===e)return n}function Ge(e,t){for(const[n,s]of ze)if(n.id===e)return s;if(t)throw Error(`Could not find data for Group with id ${e}`)}function st(){return ze}function Dn(e,t){return vr.addListener("groupChange",n=>{n.group.id===e&&t(n)})}function Le(e,t,n){const s=ze.get(e);ze=new Map(ze),ze.set(e,t),vr.emit("groupChange",{group:e,isUserInteraction:n?.isUserInteraction===!0,prev:s,next:t})}function yr(e){const t=Qe();let n=!1;return t.state==="active"&&(ht({cursorFlags:0,state:"inactive"}),t.hitRegions.length>0&&(Ln(e),n=!0,t.hitRegions.forEach(s=>{const o=Ge(s.group.id,!0);Le(s.group,o,{isUserInteraction:!0})}))),n}function Js(e){e.defaultPrevented||yr(e.currentTarget)}function zd(e,t,n){let s,o={x:1/0,y:1/0};for(const r of t){const a=fr(n,r.rect);switch(e){case"horizontal":{a.x<=o.x&&(s=r,o=a);break}case"vertical":{a.y<=o.y&&(s=r,o=a);break}}}return s?{distance:o,hitRegion:s}:void 0}function Ad(e){return e!==null&&typeof e=="object"&&"nodeType"in e&&e.nodeType===Node.DOCUMENT_FRAGMENT_NODE}function Pd(e,t){if(e===t)throw new Error("Cannot compare node with itself");const n={a:Zs(e),b:Zs(t)};let s;for(;n.a.at(-1)===n.b.at(-1);)s=n.a.pop(),n.b.pop();Z(s,"Stacking order can only be calculated for elements with a common ancestor");const o={a:Xs(Ks(n.a)),b:Xs(Ks(n.b))};if(o.a===o.b){const r=s.childNodes,a={a:n.a.at(-1),b:n.b.at(-1)};let c=r.length;for(;c--;){const u=r[c];if(u===a.a)return 1;if(u===a.b)return-1}}return Math.sign(o.a-o.b)}const Bd=/\b(?:position|zIndex|opacity|transform|webkitTransform|mixBlendMode|filter|webkitFilter|isolation)\b/;function Ld(e){const t=getComputedStyle(wr(e)??e).display;return t==="flex"||t==="inline-flex"}function Dd(e){const t=getComputedStyle(e);return!!(t.position==="fixed"||t.zIndex!=="auto"&&(t.position!=="static"||Ld(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"||Bd.test(t.willChange)||t.webkitOverflowScrolling==="touch")}function Ks(e){let t=e.length;for(;t--;){const n=e[t];if(Z(n,"Missing node"),Dd(n))return n}return null}function Xs(e){return e&&Number(getComputedStyle(e).zIndex)||0}function Zs(e){const t=[];for(;e;)t.push(e),e=wr(e);return t}function wr(e){const{parentNode:t}=e;return Ad(t)?t.host:t}function _d(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 Fd({groupElement:e,hitRegion:t,pointerEventTarget:n}){if(!ur(n)||n.contains(e)||e.contains(n))return!0;if(Pd(n,e)>0){let s=n;for(;s;){if(s.contains(e))return!0;if(_d(s.getBoundingClientRect(),t))return!1;s=s.parentElement}}return!0}function _n(e,t){const n=[];return t.forEach((s,o)=>{if(o.disabled)return;const r=pr(o),a=zd(o.orientation,r,{x:e.clientX,y:e.clientY});a&&a.distance.x<=0&&a.distance.y<=0&&Fd({groupElement:o.element,hitRegion:a.hitRegion.rect,pointerEventTarget:e.target})&&n.push(a.hitRegion)}),n}function $d(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 ge(e,t,n=0){return Math.abs(xe(e)-xe(t))<=n}function Ne(e,t){return ge(e,t)?0:e>t?1:-1}function pt({overrideDisabledPanels:e,panelConstraints:t,prevSize:n,size:s}){const{collapsedSize:o=0,collapsible:r,disabled:a,maxSize:c=100,minSize:u=0}=t;if(a&&!e)return n;if(Ne(s,u)<0)if(r){const d=(o+u)/2;Ne(s,d)<0?s=o:s=u}else s=u;return s=Math.min(c,s),s=xe(s),s}function jt({delta:e,initialLayout:t,panelConstraints:n,pivotIndices:s,prevLayout:o,trigger:r}){if(ge(e,0))return t;const a=r==="imperative-api",c=Object.values(t),u=Object.values(o),d=[...c],[p,i]=s;Z(p!=null,"Invalid first pivot index"),Z(i!=null,"Invalid second pivot index");let f=0;switch(r){case"keyboard":{{const h=e<0?i:p,x=n[h];Z(x,`Panel constraints not found for index ${h}`);const{collapsedSize:b=0,collapsible:y,minSize:w=0}=x;if(y){const k=c[h];if(Z(k!=null,`Previous layout not found for panel index ${h}`),ge(k,b)){const S=w-k;Ne(S,Math.abs(e))>0&&(e=e<0?0-S:S)}}}{const h=e<0?p:i,x=n[h];Z(x,`No panel constraints found for index ${h}`);const{collapsedSize:b=0,collapsible:y,minSize:w=0}=x;if(y){const k=c[h];if(Z(k!=null,`Previous layout not found for panel index ${h}`),ge(k,w)){const S=k-b;Ne(S,Math.abs(e))>0&&(e=e<0?0-S:S)}}}break}default:{const h=e<0?i:p,x=n[h];Z(x,`Panel constraints not found for index ${h}`);const b=c[h],{collapsible:y,collapsedSize:w,minSize:k}=x;if(y&&Ne(b,k)<0)if(e>0){const S=k-w,j=S/2,I=b+e;Ne(I,k)<0&&(e=Ne(e,j)<=0?0:S)}else{const S=k-w,j=100-S/2,I=b-e;Ne(I,k)<0&&(e=Ne(100+e,j)>0?0:-S)}break}}{const h=e<0?1:-1;let x=e<0?i:p,b=0;for(;;){const w=c[x];Z(w!=null,`Previous layout not found for panel index ${x}`);const k=pt({overrideDisabledPanels:a,panelConstraints:n[x],prevSize:w,size:100})-w;if(b+=k,x+=h,x<0||x>=n.length)break}const y=Math.min(Math.abs(e),Math.abs(b));e=e<0?0-y:y}{let h=e<0?p:i;for(;h>=0&&h<n.length;){const x=Math.abs(e)-Math.abs(f),b=c[h];Z(b!=null,`Previous layout not found for panel index ${h}`);const y=b-x,w=pt({overrideDisabledPanels:a,panelConstraints:n[h],prevSize:b,size:y});if(!ge(b,w)&&(f+=b-w,d[h]=w,f.toFixed(3).localeCompare(Math.abs(e).toFixed(3),void 0,{numeric:!0})>=0))break;e<0?h--:h++}}if($d(u,d))return o;{const h=e<0?i:p,x=c[h];Z(x!=null,`Previous layout not found for panel index ${h}`);const b=x+f,y=pt({overrideDisabledPanels:a,panelConstraints:n[h],prevSize:x,size:b});if(d[h]=y,!ge(y,b)){let w=b-y,k=e<0?i:p;for(;k>=0&&k<n.length;){const S=d[k];Z(S!=null,`Previous layout not found for panel index ${k}`);const j=S+w,I=pt({overrideDisabledPanels:a,panelConstraints:n[k],prevSize:S,size:j});if(ge(S,I)||(w-=I-S,d[k]=I),ge(w,0))break;e>0?k--:k++}}}const m=Object.values(d).reduce((h,x)=>x+h,0);if(!ge(m,100,.1))return o;const g=Object.keys(o);return d.reduce((h,x,b)=>(h[g[b]]=x,h),{})}function et(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(t[n]===void 0||Ne(e[n],t[n])!==0)return!1;return!0}function tt({layout:e,panelConstraints:t}){const n=Object.values(e),s=[...n],o=s.reduce((c,u)=>c+u,0);if(s.length!==t.length)throw Error(`Invalid ${t.length} panel layout: ${s.map(c=>`${c}%`).join(", ")}`);if(!ge(o,100)&&s.length>0)for(let c=0;c<t.length;c++){const u=s[c];Z(u!=null,`No layout data found for index ${c}`);const d=100/o*u;s[c]=d}let r=0;for(let c=0;c<t.length;c++){const u=n[c];Z(u!=null,`No layout data found for index ${c}`);const d=s[c];Z(d!=null,`No layout data found for index ${c}`);const p=pt({overrideDisabledPanels:!0,panelConstraints:t[c],prevSize:u,size:d});d!=p&&(r+=d-p,s[c]=p)}if(!ge(r,0))for(let c=0;c<t.length;c++){const u=s[c];Z(u!=null,`No layout data found for index ${c}`);const d=u+r,p=pt({overrideDisabledPanels:!0,panelConstraints:t[c],prevSize:u,size:d});if(u!==p&&(r-=p-u,s[c]=p,ge(r,0)))break}const a=Object.keys(e);return s.reduce((c,u,d)=>(c[a[d]]=u,c),{})}function kr({groupId:e,panelId:t}){const n=()=>{const u=st();for(const[d,{defaultLayoutDeferred:p,derivedPanelConstraints:i,layout:f,groupSize:m,separatorToPanels:g}]of u)if(d.id===e)return{defaultLayoutDeferred:p,derivedPanelConstraints:i,group:d,groupSize:m,layout:f,separatorToPanels:g};throw Error(`Group ${e} not found`)},s=()=>{const u=n().derivedPanelConstraints.find(d=>d.panelId===t);if(u!==void 0)return u;throw Error(`Panel constraints not found for Panel ${t}`)},o=()=>{const u=n().group.panels.find(d=>d.id===t);if(u!==void 0)return u;throw Error(`Layout not found for Panel ${t}`)},r=()=>{const u=n().layout[t];if(u!==void 0)return u;throw Error(`Layout not found for Panel ${t}`)},a=({nextSize:u,panels:d,prevLayout:p,derivedPanelConstraints:i})=>{const f=r(),m=d.findIndex(x=>x.id===t),g=m===0,h=m===d.length-1;if(h&&u<f&&(g||d.slice(0,m).every((x,b)=>{const y=i[b];return y?.collapsible&&ge(y.collapsedSize,p[y.panelId])}))){const x=d.slice(0,m).reduce((b,y)=>b+p[y.id],0);return{...p,[t]:xe(100-x)}}return jt({delta:h?f-u:u-f,initialLayout:p,panelConstraints:i,pivotIndices:h?[m-1,m]:[m,m+1],prevLayout:p,trigger:"imperative-api"})},c=u=>{const d=r();if(u===d)return;const{defaultLayoutDeferred:p,derivedPanelConstraints:i,group:f,groupSize:m,layout:g,separatorToPanels:h}=n(),x=a({nextSize:u,panels:f.panels,prevLayout:g,derivedPanelConstraints:i}),b=tt({layout:x,panelConstraints:i});et(g,b)||Le(f,{defaultLayoutDeferred:p,derivedPanelConstraints:i,groupSize:m,layout:b,separatorToPanels:h})};return{collapse:()=>{const{collapsible:u,collapsedSize:d}=s(),{mutableValues:p}=o(),i=r();u&&i!==d&&(p.expandToSize=i,c(d))},expand:()=>{const{collapsible:u,collapsedSize:d,minSize:p}=s(),{mutableValues:i}=o(),f=r();if(u&&f===d){let m=i.expandToSize??p;m===0&&(m=1),c(m)}},getSize:()=>{const{group:u}=n(),d=r(),{element:p}=o(),i=u.orientation==="horizontal"?p.offsetWidth:p.offsetHeight;return{asPercentage:d,inPixels:i}},isCollapsed:()=>{const{collapsible:u,collapsedSize:d}=s(),p=r();return u&&ge(d,p)},resize:u=>{const{group:d}=n(),{element:p}=o(),i=gt({group:d}),f=kt({groupSize:i,panelElement:p,styleProp:u}),m=xe(f/i*100);c(m)}}}function Qs(e){if(e.defaultPrevented)return;const t=st();_n(e,t).forEach(n=>{if(n.separator&&!n.separator.disableDoubleClick){const s=n.panels.find(o=>o.panelConstraints.defaultSize!==void 0);if(s){const o=s.panelConstraints.defaultSize,r=kr({groupId:n.group.id,panelId:s.id});r&&o!==void 0&&(r.resize(o),e.preventDefault())}}})}function Ft(e){const t=st();for(const[n]of t)if(n.separators.some(s=>s.element===e))return n;throw Error("Could not find parent Group for separator element")}function Sr({groupId:e}){const t=()=>{const n=st();for(const[s,o]of n)if(s.id===e)return{group:s,...o};throw Error(`Could not find Group with id "${e}"`)};return{getLayout(){const{defaultLayoutDeferred:n,layout:s}=t();return n?{}:s},setLayout(n){const{defaultLayoutDeferred:s,derivedPanelConstraints:o,group:r,groupSize:a,layout:c,separatorToPanels:u}=t(),d=tt({layout:n,panelConstraints:o});return s?c:(et(c,d)||Le(r,{defaultLayoutDeferred:s,derivedPanelConstraints:o,groupSize:a,layout:d,separatorToPanels:u}),d)}}}function Ye(e,t){const n=Ft(e),s=Ge(n.id,!0),o=n.separators.find(p=>p.element===e);Z(o,"Matching separator not found");const r=s.separatorToPanels.get(o);Z(r,"Matching panels not found");const a=r.map(p=>n.panels.indexOf(p)),c=Sr({groupId:n.id}).getLayout(),u=jt({delta:t,initialLayout:c,panelConstraints:s.derivedPanelConstraints,pivotIndices:a,prevLayout:c,trigger:"keyboard"}),d=tt({layout:u,panelConstraints:s.derivedPanelConstraints});et(c,d)||Le(n,{defaultLayoutDeferred:s.defaultLayoutDeferred,derivedPanelConstraints:s.derivedPanelConstraints,groupSize:s.groupSize,layout:d,separatorToPanels:s.separatorToPanels},{isUserInteraction:!0})}function eo(e){if(e.defaultPrevented)return;const t=e.currentTarget,n=Ft(t);if(!n.disabled)switch(e.key){case"ArrowDown":{e.preventDefault(),n.orientation==="vertical"&&Ye(t,5);break}case"ArrowLeft":{e.preventDefault(),n.orientation==="horizontal"&&Ye(t,-5);break}case"ArrowRight":{e.preventDefault(),n.orientation==="horizontal"&&Ye(t,5);break}case"ArrowUp":{e.preventDefault(),n.orientation==="vertical"&&Ye(t,-5);break}case"End":{e.preventDefault(),Ye(t,100);break}case"Enter":{e.preventDefault();const s=Ft(t),o=Ge(s.id,!0),{derivedPanelConstraints:r,layout:a,separatorToPanels:c}=o,u=s.separators.find(f=>f.element===t);Z(u,"Matching separator not found");const d=c.get(u);Z(d,"Matching panels not found");const p=d[0],i=r.find(f=>f.panelId===p.id);if(Z(i,"Panel metadata not found"),i.collapsible){const f=a[p.id],m=i.collapsedSize===f?s.mutableState.expandedPanelSizes[p.id]??i.minSize:i.collapsedSize;Ye(t,m-f)}break}case"F6":{e.preventDefault();const s=Ft(t).separators.map(a=>a.element),o=Array.from(s).findIndex(a=>a===e.currentTarget);Z(o!==null,"Index not found");const r=e.shiftKey?o>0?o-1:s.length-1:o+1<s.length?o+1:0;s[r].focus({preventScroll:!0});break}case"Home":{e.preventDefault(),Ye(t,-100);break}}}function to(e){if(e.defaultPrevented||e.pointerType==="mouse"&&e.button>0)return;const t=st(),n=_n(e,t),s=new Map;let o=!1;n.forEach(r=>{r.separator&&(o||(o=!0,r.separator.element.focus({focusVisible:!1,preventScroll:!0})));const a=t.get(r.group);a&&s.set(r.group,a.layout)}),ht({cursorFlags:0,hitRegions:n,initialLayoutMap:s,pointerDownAtPoint:{x:e.clientX,y:e.clientY},state:"active"}),n.length&&e.preventDefault()}function Cr({document:e,event:t,hitRegions:n,initialLayoutMap:s,mountedGroups:o,pointerDownAtPoint:r,prevCursorFlags:a}){let c=0;n.forEach(d=>{const{group:p,groupSize:i}=d,{orientation:f,panels:m}=p,{disableCursor:g}=p.mutableState;let h=0;r?f==="horizontal"?h=(t.clientX-r.x)/i*100:h=(t.clientY-r.y)/i*100:f==="horizontal"?h=t.clientX<0?-100:100:h=t.clientY<0?-100:100;const x=s.get(p),b=o.get(p);if(!x||!b)return;const{defaultLayoutDeferred:y,derivedPanelConstraints:w,groupSize:k,layout:S,separatorToPanels:j}=b;if(w&&S&&j){const I=jt({delta:h,initialLayout:x,panelConstraints:w,pivotIndices:d.panels.map(C=>m.indexOf(C)),prevLayout:S,trigger:"mouse-or-touch"});if(et(I,S)){if(h!==0&&!g)switch(f){case"horizontal":{c|=h<0?hr:gr;break}case"vertical":{c|=h<0?br:xr;break}}}else Le(d.group,{defaultLayoutDeferred:y,derivedPanelConstraints:w,groupSize:k,layout:I,separatorToPanels:j})}});let u=0;t.movementX===0?u|=a&Us:u|=c&Us,t.movementY===0?u|=a&Hs:u|=c&Hs,Ed(u),Ln(e)}function no(e){const t=st(),n=Qe();n.state==="active"&&Cr({document:e.currentTarget,event:e,hitRegions:n.hitRegions,initialLayoutMap:n.initialLayoutMap,mountedGroups:t,prevCursorFlags:n.cursorFlags})}function so(e){if(e.defaultPrevented)return;const t=Qe(),n=st();switch(t.state){case"active":{if(e.buttons===0){ht({cursorFlags:0,state:"inactive"}),t.hitRegions.forEach(s=>{const o=Ge(s.group.id,!0);Le(s.group,o,{isUserInteraction:!0})});return}for(const s of t.hitRegions)if(s.separator){const{element:o}=s.separator;o.hasPointerCapture?.(e.pointerId)||o.setPointerCapture?.(e.pointerId)}Cr({document:e.currentTarget,event:e,hitRegions:t.hitRegions,initialLayoutMap:t.initialLayoutMap,mountedGroups:n,pointerDownAtPoint:t.pointerDownAtPoint,prevCursorFlags:t.cursorFlags});break}default:{const s=_n(e,n);s.length===0?t.state!=="inactive"&&ht({cursorFlags:0,state:"inactive"}):ht({cursorFlags:0,hitRegions:s,state:"hover"}),Ln(e.currentTarget);break}}}function oo(e){e.relatedTarget instanceof HTMLIFrameElement&&Qe().state==="hover"&&ht({cursorFlags:0,state:"inactive"})}function ro(e){e.defaultPrevented||e.pointerType==="mouse"&&e.button>0||yr(e.currentTarget)&&e.preventDefault()}function ao(e){let t=0,n=0;const s={};for(const r of e)if(r.defaultSize!==void 0){t++;const a=xe(r.defaultSize);n+=a,s[r.panelId]=a}else s[r.panelId]=void 0;const o=e.length-t;if(o!==0){const r=xe((100-n)/o);for(const a of e)a.defaultSize===void 0&&(s[a.panelId]=r)}return s}function Od(e,t,n){if(!n[0])return;const s=e.panels.find(u=>u.element===t);if(!s||!s.onResize)return;const o=gt({group:e}),r=e.orientation==="horizontal"?s.element.offsetWidth:s.element.offsetHeight,a=s.mutableValues.prevSize,c={asPercentage:xe(r/o*100),inPixels:r};s.mutableValues.prevSize=c,s.onResize(c,s.id,a)}function Wd(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(e[n]!==t[n])return!1;return!0}function Gd({group:e,nextGroupSize:t,prevGroupSize:n,prevLayout:s}){if(n<=0||t<=0||n===t)return s;let o=0,r=0,a=!1;const c=new Map,u=[];for(const i of e.panels){const f=s[i.id]??0;if(i.panelConstraints.groupResizeBehavior==="preserve-pixel-size"){a=!0;const m=f/100*n,g=xe(m/t*100);c.set(i.id,g),o+=g}else u.push(i.id),r+=f}if(!a||u.length===0)return s;const d=100-o,p={...s};if(c.forEach((i,f)=>{p[f]=i}),r>0)for(const i of u){const f=s[i]??0;p[i]=xe(f/r*d)}else{const i=xe(d/u.length);for(const f of u)p[f]=i}return p}function Ud(e,t){const n=e.map(o=>o.id),s=Object.keys(t);if(n.length!==s.length)return!1;for(const o of n)if(!s.includes(o))return!1;return!0}const dt=new Map;function Hd(e){let t=!0;Z(e.element.ownerDocument.defaultView,"Cannot register an unmounted Group");const n=e.element.ownerDocument.defaultView.ResizeObserver,s=new Set,o=new Set,r=new n(g=>{for(const h of g){const{borderBoxSize:x,target:b}=h;if(b===e.element){if(t){const y=gt({group:e});if(y===0)return;const w=Ge(e.id);if(!w)return;const k=gn(e),S=w.defaultLayoutDeferred?ao(k):w.layout,j=Gd({group:e,nextGroupSize:y,prevGroupSize:w.groupSize,prevLayout:S}),I=tt({layout:j,panelConstraints:k});if(!w.defaultLayoutDeferred&&et(w.layout,I)&&Wd(w.derivedPanelConstraints,k)&&w.groupSize===y)return;Le(e,{defaultLayoutDeferred:!1,derivedPanelConstraints:k,groupSize:y,layout:I,separatorToPanels:w.separatorToPanels})}}else Od(e,b,x)}});r.observe(e.element),e.panels.forEach(g=>{Z(!s.has(g.id),`Panel ids must be unique; id "${g.id}" was used more than once`),s.add(g.id),g.onResize&&r.observe(g.element)});const a=gt({group:e}),c=gn(e),u=e.panels.map(({id:g})=>g).join(",");let d=e.mutableState.defaultLayout;d&&(Ud(e.panels,d)||(d=void 0));const p=e.mutableState.layouts[u]??d??ao(c),i=tt({layout:p,panelConstraints:c}),f=e.element.ownerDocument;dt.set(f,(dt.get(f)??0)+1);const m=new Map;return pr(e).forEach(g=>{g.separator&&m.set(g.separator,g.panels)}),Le(e,{defaultLayoutDeferred:a===0,derivedPanelConstraints:c,groupSize:a,layout:i,separatorToPanels:m}),e.separators.forEach(g=>{Z(!o.has(g.id),`Separator ids must be unique; id "${g.id}" was used more than once`),o.add(g.id),g.element.addEventListener("keydown",eo)}),dt.get(f)===1&&(f.addEventListener("contextmenu",Js,!0),f.addEventListener("dblclick",Qs,!0),f.addEventListener("pointerdown",to,!0),f.addEventListener("pointerleave",no),f.addEventListener("pointermove",so),f.addEventListener("pointerout",oo),f.addEventListener("pointerup",ro,!0)),function(){t=!1,dt.set(f,Math.max(0,(dt.get(f)??0)-1)),Nd(e),e.separators.forEach(g=>{g.element.removeEventListener("keydown",eo)}),dt.get(f)||(f.removeEventListener("contextmenu",Js,!0),f.removeEventListener("dblclick",Qs,!0),f.removeEventListener("pointerdown",to,!0),f.removeEventListener("pointerleave",no),f.removeEventListener("pointermove",so),f.removeEventListener("pointerout",oo),f.removeEventListener("pointerup",ro,!0)),r.disconnect()}}function qd(){const[e,t]=v.useState({}),n=v.useCallback(()=>t({}),[]);return[e,n]}function Fn(e){const t=v.useId();return`${e??t}`}const ot=typeof window<"u"?v.useLayoutEffect:v.useEffect;function Ct(e){const t=v.useRef(e);return ot(()=>{t.current=e},[e]),v.useCallback((...n)=>t.current?.(...n),[t])}function $n(...e){return Ct(t=>{e.forEach(n=>{if(n)switch(typeof n){case"function":{n(t);break}case"object":{n.current=t;break}}})})}function On(e){const t=v.useRef({...e});return ot(()=>{for(const n in e)t.current[n]=e[n]},[e]),t.current}const Mr=v.createContext(null);function Vd(e,t){const n=v.useRef({getLayout:()=>({}),setLayout:Id});v.useImperativeHandle(t,()=>n.current,[]),ot(()=>{Object.assign(n.current,Sr({groupId:e}))})}function Rr({children:e,className:t,defaultLayout:n,disableCursor:s,disabled:o,elementRef:r,groupRef:a,id:c,onLayoutChange:u,onLayoutChanged:d,orientation:p="horizontal",resizeTargetMinimumSize:i={coarse:20,fine:10},style:f,...m}){const g=v.useRef({onLayoutChange:{},onLayoutChanged:{}}),h=Ct(L=>{et(g.current.onLayoutChange,L)||(g.current.onLayoutChange=L,u?.(L))}),x=Ct((L,A)=>{et(g.current.onLayoutChanged,L)||(g.current.onLayoutChanged=L,d?.(L,{isUserInteraction:A}))}),b=Fn(c),y=v.useRef(null),[w,k]=qd(),S=v.useRef({lastExpandedPanelSizes:{},layouts:{},panels:[],resizeTargetMinimumSize:i,separators:[]}),j=$n(y,r);Vd(b,a);const I=Ct((L,A)=>{const G=Qe(),O=Ys(L),U=Ge(L);if(U){let B=!1;return G.state==="active"&&(B=G.hitRegions.some(q=>q.group===O)),{flexGrow:U.layout[A]??1,pointerEvents:B?"none":void 0}}if(n?.[A])return{flexGrow:n?.[A]}}),C=On({defaultLayout:n,disableCursor:s}),D=v.useMemo(()=>({get disableCursor(){return!!C.disableCursor},getPanelStyles:I,id:b,orientation:p,registerPanel:L=>{const A=S.current;return A.panels=bn(p,[...A.panels,L]),k(),()=>{A.panels=A.panels.filter(G=>G!==L),k()}},registerSeparator:L=>{const A=S.current;return A.separators=bn(p,[...A.separators,L]),k(),()=>{A.separators=A.separators.filter(G=>G!==L),k()}},updatePanelProps:(L,{disabled:A})=>{const G=S.current.panels.find(B=>B.id===L);G&&(G.panelConstraints.disabled=A);const O=Ys(b),U=Ge(b);O&&U&&Le(O,{...U,derivedPanelConstraints:gn(O)})},updateSeparatorProps:(L,{disabled:A,disableDoubleClick:G})=>{const O=S.current.separators.find(U=>U.id===L);O&&(O.disabled=A,O.disableDoubleClick=G)}}),[I,b,k,p,C]),ee=v.useRef(null);return ot(()=>{const L=y.current;if(L===null)return;const A=S.current;let G;if(C.defaultLayout!==void 0&&Object.keys(C.defaultLayout).length===A.panels.length){G={};for(const E of A.panels){const ie=C.defaultLayout[E.id];ie!==void 0&&(G[E.id]=ie)}}const O={disabled:!!o,element:L,id:b,mutableState:{defaultLayout:G,disableCursor:!!C.disableCursor,expandedPanelSizes:S.current.lastExpandedPanelSizes,layouts:S.current.layouts},orientation:p,panels:A.panels,resizeTargetMinimumSize:A.resizeTargetMinimumSize,separators:A.separators};ee.current=O;const U=Hd(O),{defaultLayoutDeferred:B,derivedPanelConstraints:q,layout:re}=Ge(O.id,!0);!B&&q.length>0&&(h(re),x(re,!1));const ae=Dn(b,E=>{const{defaultLayoutDeferred:ie,derivedPanelConstraints:Ce,layout:F}=E.next;if(ie||Ce.length===0)return;const Y=O.panels.map(({id:W})=>W).join(",");O.mutableState.layouts[Y]=F,Ce.forEach(W=>{if(W.collapsible){const{layout:K}=E.prev??{};if(K){const V=ge(W.collapsedSize,F[W.panelId]),R=ge(W.collapsedSize,K[W.panelId]);V&&!R&&(O.mutableState.expandedPanelSizes[W.panelId]=K[W.panelId])}}});const _=Qe().state!=="active";h(F),_&&x(F,E.isUserInteraction)});return()=>{ee.current=null,U(),ae()}},[o,b,x,h,p,w,C]),v.useEffect(()=>{const L=ee.current;L&&(L.mutableState.defaultLayout=n,L.mutableState.disableCursor=!!s)}),l.jsx(Mr.Provider,{value:D,children:l.jsx("div",{...m,className:t,"data-group":!0,"data-testid":b,id:b,ref:j,style:{height:"100%",width:"100%",overflow:"hidden",...f,display:"flex",flexDirection:p==="horizontal"?"row":"column",flexWrap:"nowrap",touchAction:p==="horizontal"?"pan-y":"pan-x"},children:e})})}Rr.displayName="Group";function Wn(){const e=v.useContext(Mr);return Z(e,"Group Context not found; did you render a Panel or Separator outside of a Group?"),e}function Yd(e,t){const{id:n}=Wn(),s=v.useRef({collapse:sn,expand:sn,getSize:()=>({asPercentage:0,inPixels:0}),isCollapsed:()=>!1,resize:sn});v.useImperativeHandle(t,()=>s.current,[]),ot(()=>{Object.assign(s.current,kr({groupId:n,panelId:e}))})}function xn({children:e,className:t,collapsedSize:n="0%",collapsible:s=!1,defaultSize:o,disabled:r,elementRef:a,groupResizeBehavior:c="preserve-relative-size",id:u,maxSize:d="100%",minSize:p="0%",onResize:i,panelRef:f,style:m,...g}){const h=!!u,x=Fn(u),b=On({disabled:r}),y=v.useRef(null),w=$n(y,a),{getPanelStyles:k,id:S,orientation:j,registerPanel:I,updatePanelProps:C}=Wn(),D=i!==null,ee=Ct((O,U,B)=>{i?.(O,u,B)});ot(()=>{const O=y.current;if(O!==null){const U={element:O,id:x,idIsStable:h,mutableValues:{expandToSize:void 0,prevSize:void 0},onResize:D?ee:void 0,panelConstraints:{groupResizeBehavior:c,collapsedSize:n,collapsible:s,defaultSize:o,disabled:b.disabled,maxSize:d,minSize:p}};return I(U)}},[c,n,s,o,D,x,h,d,p,ee,I,b]),v.useEffect(()=>{C(x,{disabled:r})},[r,x,C]),Yd(x,f);const L=()=>{const O=k(S,x);if(O)return JSON.stringify(O)},A=v.useSyncExternalStore(O=>Dn(S,O),L,L);let G;return A?G=JSON.parse(A):o!==void 0?G={flexGrow:void 0,flexShrink:void 0,flexBasis:o}:G={flexGrow:1},l.jsx("div",{...g,"data-disabled":r||void 0,"data-panel":!0,"data-testid":x,id:x,ref:w,style:{...Jd,display:"flex",flexBasis:0,flexShrink:1,overflow:"visible",...G},children:l.jsx("div",{className:t,style:{maxHeight:"100%",maxWidth:"100%",flexGrow:1,overflow:"auto",...m,touchAction:j==="horizontal"?"pan-y":"pan-x"},children:e})})}xn.displayName="Panel";const Jd={minHeight:0,maxHeight:"100%",height:"auto",minWidth:0,maxWidth:"100%",width:"auto",border:"none",borderWidth:0,padding:0,margin:0};function Kd({layout:e,panelConstraints:t,panelId:n,panelIndex:s}){let o,r;const a=e[n],c=t.find(u=>u.panelId===n);if(c){const u=c.maxSize,d=c.collapsible?c.collapsedSize:c.minSize,p=[s,s+1];r=tt({layout:jt({delta:d-a,initialLayout:e,panelConstraints:t,pivotIndices:p,prevLayout:e}),panelConstraints:t})[n],o=tt({layout:jt({delta:u-a,initialLayout:e,panelConstraints:t,pivotIndices:p,prevLayout:e}),panelConstraints:t})[n]}return{valueControls:n,valueMax:o,valueMin:r,valueNow:a}}function jr({children:e,className:t,disabled:n,disableDoubleClick:s,elementRef:o,id:r,style:a,...c}){const u=Fn(r),d=On({disabled:n,disableDoubleClick:s}),[p,i]=v.useState({}),[f,m]=v.useState("inactive"),[g,h]=v.useState(!1),x=v.useRef(null),b=$n(x,o),{disableCursor:y,id:w,orientation:k,registerSeparator:S,updateSeparatorProps:j}=Wn(),I=k==="horizontal"?"vertical":"horizontal";ot(()=>{const ee=x.current;if(ee!==null){const L={disabled:d.disabled,disableDoubleClick:d.disableDoubleClick,element:ee,id:u},A=S(L),G=jd(U=>{m(U.next.state!=="inactive"&&U.next.hitRegions.some(B=>B.separator===L)?U.next.state:"inactive")}),O=Dn(w,U=>{const{derivedPanelConstraints:B,layout:q,separatorToPanels:re}=U.next,ae=re.get(L);if(ae){const E=ae[0],ie=ae.indexOf(E);i(Kd({layout:q,panelConstraints:B,panelId:E.id,panelIndex:ie}))}});return()=>{G(),O(),A()}}},[w,u,S,d]),v.useEffect(()=>{j(u,{disabled:n,disableDoubleClick:s})},[n,s,u,j]);let C;n&&!y&&(C="not-allowed");let D;return n?D="disabled":f==="active"?D="active":g?D="focus":D=f,l.jsx("div",{...c,"aria-controls":p.valueControls,"aria-disabled":n||void 0,"aria-orientation":I,"aria-valuemax":p.valueMax,"aria-valuemin":p.valueMin,"aria-valuenow":p.valueNow,children:e,className:t,"data-separator":D,"data-testid":u,id:u,onBlur:()=>h(!1),onFocus:()=>h(!0),ref:b,role:"separator",style:{flexBasis:"auto",cursor:C,...a,flexGrow:0,flexShrink:0,touchAction:"none"},tabIndex:n?void 0:0})}jr.displayName="Separator";const Xd=6,Zd=320,Qd=.9;function eu(e){return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)}function tu(){return Math.min(Zd,Math.floor(window.innerWidth*Qd))}function nu(e,t){const n=e.indexOf("#"),s=n===-1?e:e.slice(0,n),o=n===-1?"":e.slice(n),r=s.includes("?")?"&":"?";return`${s}${r}t=${t}${o}`}function su({post:e,genTok:t=()=>crypto.randomUUID()}={}){const{isOpen:n,target:s,close:o}=dr(),{theme:r}=jn(),a=v.useSyncExternalStore(eu,tu),c=v.useRef(null),u=v.useRef(!1),d=v.useRef(!1),p=v.useRef(null),i=v.useRef(null),[f,m]=v.useState(null),g=v.useRef(null),h=v.useCallback(y=>{if(g.current?.disconnect(),g.current=null,!y){document.documentElement.style.setProperty("--docs-inset","0px");return}const w=()=>document.documentElement.style.setProperty("--docs-inset",`${y.getBoundingClientRect().width+Xd}px`),k=new ResizeObserver(w);k.observe(y),w(),g.current=k},[]),x=v.useCallback(y=>{const w={...y,tok:i.current};if(e){e(w);return}c.current?.contentWindow?.postMessage(w,"*")},[e]);v.useEffect(()=>{if(!n){d.current=!1,u.current=!1,p.current=null,i.current=null,m(null);return}if(s.kind==="site"){const y=p.current;if(y?.kind==="site"&&y.path===s.path&&y.theme===r)return;d.current=!0,u.current=!1,i.current=null,p.current={kind:"site",path:s.path,theme:r},m(nu(s.path,r));return}if(!d.current||p.current?.kind!=="vendor"){d.current=!0,u.current=!1,p.current={kind:"vendor",anchor:s.anchor};const y=t();i.current=y,m(bt(s.anchor,y));return}s.anchor!==p.current.anchor&&(p.current={kind:"vendor",anchor:s.anchor},x({type:"navigate",anchor:s.anchor}))},[n,s,r,x,t]),v.useEffect(()=>{n&&s.kind==="vendor"&&u.current&&x({type:"theme",theme:r})},[r,n,s.kind,x]),v.useEffect(()=>{function y(w){const k=w.data;!k||typeof k!="object"||k.type!=="ready"||k.tok===i.current&&(u.current=!0,x({type:"theme",theme:r}))}return window.addEventListener("message",y),()=>window.removeEventListener("message",y)},[x,r]);const b=s.kind==="vendor"?"Reference":"Guide";return l.jsx(ca,{open:n,modal:!1,disablePointerDismissal:!0,onOpenChange:y=>{y||o()},children:l.jsx(da,{children:l.jsx(ua,{"data-slot":"docs-panel",className:"pointer-events-none fixed inset-0 z-[60]",children:l.jsxs(Rr,{orientation:"horizontal",className:"h-full w-full",children:[l.jsx(xn,{minSize:"10%",className:"pointer-events-none"}),l.jsx(jr,{"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"}),l.jsx(xn,{defaultSize:576,minSize:a,maxSize:"90vw",className:"pointer-events-auto",children:l.jsxs("div",{ref:h,className:"flex h-full flex-col border-l border-border bg-popover text-sm text-popover-foreground shadow-lg",children:[l.jsxs("div",{className:"flex items-center justify-between border-b border-border p-4",children:[l.jsx(fa,{className:"font-heading text-base font-medium text-foreground",children:b}),l.jsxs(pa,{render:l.jsx(fe,{variant:"ghost",size:"icon-sm"}),children:[l.jsx(Lo,{"aria-hidden":"true"}),l.jsx("span",{className:"sr-only",children:"Close"})]})]}),l.jsx("iframe",{ref:c,src:f??void 0,title:b,className:"w-full flex-1 border-0"})]})})]})})})})}function vn({className:e,...t}){return l.jsx("div",{"data-slot":"table-container",className:"relative w-full overflow-x-auto",tabIndex:0,children:l.jsx("table",{"data-slot":"table",className:J("w-full caption-bottom text-sm",e),...t})})}function yn({className:e,...t}){return l.jsx("thead",{"data-slot":"table-header",className:J("[&_tr]:border-b",e),...t})}function wn({className:e,...t}){return l.jsx("tbody",{"data-slot":"table-body",className:J("[&_tr:last-child]:border-0",e),...t})}function Ze({className:e,...t}){return l.jsx("tr",{"data-slot":"table-row",className:J("border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted",e),...t})}function be({className:e,...t}){return l.jsx("th",{"data-slot":"table-head",className:J("h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0",e),...t})}function Ae({className:e,...t}){return l.jsx("td",{"data-slot":"table-cell",className:J("p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0",e),...t})}function Rf({className:e,...t}){return l.jsx("caption",{"data-slot":"table-caption",className:J("mt-4 text-sm text-muted-foreground",e),...t})}const ou=Ut("group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",secondary:"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",destructive:"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",outline:"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",ghost:"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",link:"text-primary underline-offset-4 hover:underline"}},defaultVariants:{variant:"default"}});function Er({className:e,variant:t="default",render:n,...s}){return ma({defaultTagName:"span",props:ha({className:J(ou({variant:t}),e)},s),render:n,state:{slot:"badge",variant:t}})}function ru(e){return`/docs/user-guide/understanding-findings.html#${In(e).toLowerCase()}`}const au={INCMP:{expansion:"Incomplete run",description:"This event log never recorded an application-end event, so other findings and metrics reflect only what was captured."},SKEW:{expansion:"Task skew",description:"A small number of tasks take much longer than their peers."},SHFL:{expansion:"Shuffle I/O",description:"Tasks are moving a large amount of intermediate data between stages."},SPILL:{expansion:"Memory and disk spill",description:"Tasks are writing data out of memory, which slows execution."},GC:{expansion:"Garbage collection pressure",description:"Tasks are spending an unusually large share of time reclaiming memory."},COLD:{expansion:"Executor cold start",description:"New executors are taking time to become available for work."},UTIL:{expansion:"Low utilization",description:"Allocated executors are idle for a large share of the application run."},MEM:{expansion:"Memory utilization",description:"Executor memory or core capacity may be over- or under-provisioned."},LOCAL:{expansion:"Core usage locality",description:"Tasks are running without process- or node-local data placement more than expected."},HOST:{expansion:"Slow host",description:"One executor is substantially slower than its peers."},FAIL:{expansion:"Failed tasks",description:"Tasks are failing often enough to affect the stage."},STRAG:{expansion:"Straggler tasks",description:"A few tasks are much slower than the rest of their stage."},SPEC:{expansion:"Speculation waste",description:"Speculative task attempts used a lot of executor time without confirming a genuine straggler."},RETRY:{expansion:"Retry waste",description:"Repeated task attempts are consuming avoidable execution time."},TINY:{expansion:"Tiny tasks",description:"Many very short tasks are adding scheduling overhead."},SFAIL:{expansion:"Failed stage",description:"A stage attempt failed outright."},PART:{expansion:"Partition sizing",description:"Shuffle partitions are too large, too uneven, or too few for the work."},SLOW:{expansion:"Stage slowness",description:"A stage is slow overall without a more specific diagnosed cause."},SHAPE:{expansion:"Stage shape",description:"The stage has an inefficient task count, output shape, or task-to-stage balance."},CACHE:{expansion:"Caching opportunity",description:"A reusable dataset may benefit from being persisted between stages."},CSTOR:{expansion:"Cache storage",description:"A persisted dataset is not fully cached in memory or is spilling to disk."},CHRN:{expansion:"Autoscaling churn",description:"Executors are being stood up and torn down again before they can do useful work."},JOBS:{expansion:"Job failure rate",description:"A large share of completed jobs did not succeed."},CFG:{expansion:"Configuration audit",description:"Configuration settings may cause reliability or efficiency problems."},PLAN:{expansion:"Plan advisor",description:"The SQL execution plan has a pattern worth reviewing."},BROADCASTSIZING:{expansion:"Broadcast sizing",description:"A broadcast join threshold or hint may be misconfigured for this query."}},iu={underBroadcast:"broadcastSizing",overBroadcast:"broadcastSizing"};function lu(e){const t=iu[e]??e,n=new Set(Vo().filter(o=>o.type===t).map(o=>o.docAnchor));if(n.size!==1)return;const[s]=n;return s&&rr(s)?s:void 0}const cu=Ut("inline-block size-2 shrink-0 rounded-full",{variants:{impactBand:{critical:"bg-critical",warning:"bg-warning",info:"bg-info"}},defaultVariants:{impactBand:"info"}}),kn=Ut("gap-1.5 border-transparent",{variants:{impactBand:{critical:"bg-critical/10 text-critical",warning:"bg-warning/10 text-warning",info:"bg-info/10 text-info"}},defaultVariants:{impactBand:"info"}});function Ir({impactBand:e,className:t}){return l.jsx("span",{"aria-hidden":"true",className:J(cu({impactBand:e}),t)})}function Gn({type:e,impactBand:t,className:n,plainBadge:s}){const o=gd(),r=In(e),a=au[r],c=s?void 0:a?`${a.expansion}: ${a.description}`:void 0,u=s?void 0:lu(e),d=a?.expansion??r,p=l.jsxs(Er,{title:c,className:J(kn({impactBand:t}),"h-6",s?n:J("rounded-r-none",n)),render:u?l.jsx("a",{href:bt(u),onClick:f=>{!o||f.metaKey||f.ctrlKey||f.shiftKey||f.altKey||f.button!==0||(f.preventDefault(),o.open(u))}}):void 0,children:[l.jsx(Ir,{impactBand:t}),r]});if(s)return p;const i=ru(e);return l.jsxs("span",{className:"inline-flex items-center",children:[p,l.jsx("a",{href:i,target:"_blank",rel:"noopener noreferrer","aria-label":`SparkForensics guide: ${d}`,title:`SparkForensics guide: ${d}`,onClick:f=>{!o||f.metaKey||f.ctrlKey||f.shiftKey||f.altKey||f.button!==0||(f.preventDefault(),o.openSite(i))},className:J("tap-target-comfortable tap-target-comfortable--sm inline-flex h-6 shrink-0 items-center rounded-r-4xl border border-transparent py-0.5 pr-2 pl-1 text-xs font-medium whitespace-nowrap transition-colors",kn({impactBand:t}),n,"text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50"),children:l.jsx(En,{"aria-hidden":"true",className:"size-3"})})]})}function jf({label:e,impactBand:t,title:n,className:s}){return l.jsx(Er,{title:n,className:J(kn({impactBand:t}),"font-mono",s),children:e})}function Tr({className:e,size:t="default",...n}){return l.jsx("div",{"data-slot":"card","data-size":t,className:J("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-foreground/10 [--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 Sn({className:e,...t}){return l.jsx("div",{"data-slot":"card-content",className:J("px-(--card-spacing)",e),...t})}const Nr=v.createContext(!0),Ef=()=>v.useContext(Nr),zr=v.createContext(null),Ar=v.createContext(null),Pr=v.createContext(null),Br=v.createContext(null);function If({children:e,registerWidget:t,registerFindingAnchor:n,reportWidgetOpen:s,clearRouteFocus:o,focusedWidgetId:r,activeRouteTarget:a,flashedFinding:c}){const u=v.useMemo(()=>({registerWidget:t,registerFindingAnchor:n,reportWidgetOpen:s,clearRouteFocus:o}),[t,n,s,o]);return l.jsx(zr.Provider,{value:u,children:l.jsx(Ar.Provider,{value:r,children:l.jsx(Pr.Provider,{value:a,children:l.jsx(Br.Provider,{value:c,children:e})})})})}function Lr(){return v.useContext(zr)}function du(){return v.useContext(Ar)}function uu(){return v.useContext(Pr)}function fu(){return v.useContext(Br)}const Un=v.createContext(null);function pu(){return v.useContext(Un)}function Tf({children:e,className:t}){return l.jsx("div",{className:J("grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3",t),children:e})}function Nf({cardId:e,widgetId:t,children:n,className:s,collapsedTile:o=!1}){const r=Lr(),a=du(),[c,u]=v.useState(0),[d,p]=v.useState(!1),i=v.useRef(null),f=v.useRef(null),m=v.useMemo(()=>({openRequestGeneration:c,reportOpen:g=>{p(g),t&&r?.reportWidgetOpen(t,g)},setDisclosureButton:g=>{f.current=g},onDisclosureBlur:()=>{t&&r?.clearRouteFocus(t)},routeFocused:t?a===t:!1,collapsedTile:o}),[r,c,t,a,o]);return v.useLayoutEffect(()=>{if(!(!r||!t||!i.current))return r.registerWidget(t,{wrapperElement:i.current,open:()=>{u(g=>g+1)},getDisclosureButton:()=>f.current})},[r,t]),l.jsx(Un.Provider,{value:m,children:l.jsx("div",{ref:i,"data-testid":`widget-grid-item-${e}`,className:J("empty:hidden",t&&"scroll-mt-20",d&&"md:col-span-2 xl:col-span-3",s),children:n})})}function io({children:e}){return l.jsx(Un.Provider,{value:null,children:e})}const mu={critical:"border-critical",warning:"border-warning",info:"border-info"};function Mt({title:e,impactBand:t,badges:n,summary:s,defaultCollapsed:o=!1,collapsible:r=!0,open:a,onOpenChange:c,compact:u=!1,routeFocused:d,disclosureButtonRef:p,children:i,id:f}){const m=pu(),g=v.useRef(null),h=m?.collapsedTile??!1,[x,b]=v.useState(h?!1:!o),y=a??x,w=d??m?.routeFocused??!1,[k,S]=v.useState(w),j=v.useRef(0);v.useLayoutEffect(()=>{m?.reportOpen(y)},[m,y]),v.useLayoutEffect(()=>{const A=m?.openRequestGeneration??0;A===0||A===j.current||(j.current=A,y||(a!==void 0?c?.(!0):b(!0)))},[a,m?.openRequestGeneration,c,y]),v.useLayoutEffect(()=>{S(w)},[w]);const I=A=>{a!==void 0?c?.(A):b(A)},C=A=>{m?.setDisclosureButton(A),typeof p=="function"?p(A):p&&(p.current=A)},D=A=>{A.relatedTarget&&g.current?.contains(A.relatedTarget)||(S(!1),m?.onDisclosureBlur())},ee=l.jsxs("div",{className:"flex flex-col gap-2 px-(--card-spacing) sm:flex-row sm:flex-wrap sm:items-center sm:justify-between",children:[r?l.jsxs(lr,{ref:C,"aria-expanded":String(y),"data-route-focused":k?"":void 0,className:J("tap-target-comfortable tap-target-comfortable--sm flex min-w-0 items-center gap-2 bg-transparent text-left sm:flex-1",k&&"border-ring ring-[3px] ring-ring/50 focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"),onBlur:D,children:[l.jsx("h3",{className:"font-heading text-base leading-snug font-bold",children:e}),y?l.jsx(ll,{"aria-hidden":"true",className:"size-4 shrink-0 text-muted-foreground"}):l.jsx(al,{"aria-hidden":"true",className:"size-4 shrink-0 text-muted-foreground"})]}):l.jsx("h3",{className:"min-w-0 font-heading text-base leading-snug font-bold sm:flex-1",children:e}),n?l.jsx("div",{className:"flex shrink-0 flex-wrap items-center gap-1",children:n}):null]}),L=l.jsx(io,{children:l.jsx(Sn,{children:i})});return l.jsx(Tr,{ref:g,id:f,size:u?"sm":"default",className:J("border-l-4",t?mu[t]:"border-transparent",h&&!y&&"min-h-[6.5rem]"),children:r?l.jsxs(ir,{open:y,onOpenChange:I,children:[ee,s&&!y?l.jsx("div",{className:"px-(--card-spacing) pb-(--card-spacing)",children:s}):null,l.jsx(io,{children:l.jsx(cr,{keepMounted:!0,children:l.jsx(Nr.Provider,{value:y,children:l.jsx(Sn,{children:i})})})})]}):l.jsxs(l.Fragment,{children:[ee,L]})})}function zf(){return l.jsx(Tr,{className:"border-l-4 border-transparent","aria-hidden":"true",children:l.jsx(Sn,{children:l.jsx("div",{className:"h-5 w-1/3 animate-pulse rounded-md bg-muted motion-reduce:animate-none"})})})}const lo=e=>String(e),hu=[{key:"duration",label:"Duration",fmt:Xe},{key:"executorRunTime",label:"Executor run-time",fmt:Xe},{key:"jvmGCTime",label:"GC time",fmt:Xe},{key:"memoryBytesSpilled",label:"Memory spill",fmt:ne},{key:"diskBytesSpilled",label:"Disk spill",fmt:ne},{key:"inputBytes",label:"Input read",fmt:ne},{key:"outputBytes",label:"Output written",fmt:ne},{key:"taskCount",label:"Task count",fmt:lo},{key:"failedTasks",label:"Failed tasks",fmt:lo}];function co(e,t){return e==null?"—":t(e)}function gu({base:e,cand:t,fmt:n}){if(e==null||t==null)return l.jsx(Ae,{className:"text-muted-foreground",children:"—"});const s=t-e,o=s===0?"unchanged":(s<0?"-":"+")+n(Math.abs(s)),r=s===0?"text-muted-foreground":s<0?"text-clean":"text-critical";return l.jsx(Ae,{className:J("font-medium",r),children:o})}function bu({base:e,cand:t}){return l.jsxs(vn,{children:[l.jsx(yn,{children:l.jsxs(Ze,{children:[l.jsx(be,{className:"text-left",children:"Metric"}),l.jsx(be,{children:"Baseline"}),l.jsx(be,{children:"Candidate"}),l.jsx(be,{children:"Δ"})]})}),l.jsx(wn,{children:hu.map(n=>l.jsxs(Ze,{"aria-label":n.label,children:[l.jsx(be,{scope:"row",className:"text-left",children:n.label}),l.jsx(Ae,{children:co(e.metrics[n.key],n.fmt)}),l.jsx(Ae,{children:co(t.metrics[n.key],n.fmt)}),l.jsx(gu,{base:e.metrics[n.key],cand:t.metrics[n.key],fmt:n.fmt})]},n.key))})]})}function xu({baseStages:e,candStages:t}){const[n,s]=v.useState(""),[o,r]=v.useState(""),[a,c]=v.useState([]);if(e.length===0||t.length===0)return null;const u=f=>e.find(m=>m.id===f),d=f=>t.find(m=>m.id===f),p=()=>{n===""||o===""||c(f=>[...f,{baseId:Number(n),candId:Number(o)}])},i=f=>c(m=>m.filter((g,h)=>h!==f));return l.jsxs(Mt,{title:"Pinned per-stage deltas",collapsible:!1,children:[l.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."}),l.jsxs("div",{className:"mb-4 flex flex-wrap items-end gap-3",children:[l.jsxs("label",{className:"flex flex-col gap-1 text-xs text-muted-foreground",children:["Baseline stage",l.jsxs("select",{className:"rounded border border-border bg-background px-2 py-1 text-sm text-foreground",value:n,onChange:f=>s(f.target.value),children:[l.jsx("option",{value:"",children:"Select…"}),e.map(f=>l.jsx("option",{value:String(f.id),children:f.name},f.id))]})]}),l.jsxs("label",{className:"flex flex-col gap-1 text-xs text-muted-foreground",children:["Candidate stage",l.jsxs("select",{className:"rounded border border-border bg-background px-2 py-1 text-sm text-foreground",value:o,onChange:f=>r(f.target.value),children:[l.jsx("option",{value:"",children:"Select…"}),t.map(f=>l.jsx("option",{value:String(f.id),children:f.name},f.id))]})]}),l.jsx(fe,{type:"button",size:"sm",disabled:n===""||o==="",onClick:p,children:"Pin pair"})]}),l.jsx("div",{className:"flex flex-col gap-4",children:a.map((f,m)=>{const g=u(f.baseId),h=d(f.candId);return!g||!h?null:l.jsxs("div",{className:"rounded border border-border p-3",children:[l.jsxs("div",{className:"mb-2 flex items-center justify-between gap-2",children:[l.jsxs("span",{className:"text-sm font-medium",children:[g.name," → ",h.name]}),l.jsx(fe,{type:"button",variant:"ghost",size:"sm",onClick:()=>i(m),children:"Remove"})]}),l.jsx(bu,{base:g,cand:h})]},m)})})]})}function vu({expanded:e,onClick:t,label:n,controlsId:s}){return l.jsxs("button",{type:"button","aria-expanded":e,"aria-controls":s,"aria-label":`${e?"Collapse":"Expand"} details for ${n}`,onClick:t,className:"tap-target-comfortable tap-target-comfortable--sm text-xs font-medium text-primary underline underline-offset-2",children:[e?"Collapse":"Expand"," details"]})}const yu={executorMetrics:"Executor metrics",rddStorageSnapshots:"RDD storage snapshots",sqlPlan:"SQL plan",sparkConfiguration:"Spark configuration",taskCoreTime:"Task and core time",infrastructureContext:"Infrastructure context",sourceContext:"Source context",costContext:"Cost context"};function wu(e){return yu[e]}const ku={referenceOpen:!1,setReferenceOpen:()=>{},evidenceCardOpen:!0,setEvidenceCardOpen:()=>{},revealEvidence:()=>{},registerRow:()=>{}},Hn=v.createContext(null);function Af({children:e}){const[t,n]=v.useState(!1),[s,o]=v.useState(!1),r=v.useRef(null),[a,c]=v.useState(0),u=v.useRef(new Map),d=v.useCallback((f,m)=>{m?u.current.set(f,m):u.current.delete(f)},[]),p=v.useCallback(f=>{r.current=f,n(!0),o(!0),c(m=>m+1)},[]);v.useLayoutEffect(()=>{const f=r.current;!f||a===0||queueMicrotask(()=>{u.current.get(f)?.focus()})},[a]);const i=v.useMemo(()=>({referenceOpen:t,setReferenceOpen:n,evidenceCardOpen:s,setEvidenceCardOpen:o,revealEvidence:p,registerRow:d}),[t,s,p,d]);return l.jsx(Hn.Provider,{value:i,children:e})}function qn(){return v.useContext(Hn)??ku}function Su(){const{revealEvidence:e}=qn();return{revealEvidence:e}}function Pf(){const{referenceOpen:e,setReferenceOpen:t,evidenceCardOpen:n,setEvidenceCardOpen:s}=qn();return{referenceOpen:e,setReferenceOpen:t,evidenceCardOpen:n,setEvidenceCardOpen:s}}function Bf(){const{registerRow:e}=qn();return e}function Cu({evidenceKey:e}){const t=v.useContext(Hn),{revealEvidence:n}=Su();return t?l.jsxs("button",{type:"button",className:"text-xs text-muted-foreground underline underline-offset-3 hover:text-foreground",onClick:()=>n(e),children:["Evidence: ",wu(e)]}):null}function Rt(e){return e===0?"0s":Xe(e)}function Mu(e,t){return e===t?Rt(t):`${Rt(e)}-${Rt(t)}`}function Dr(e){const t=Math.round(e.value*10)/10;switch(e.unit){case"bytes":return ne(e.value);case"ms":return Rt(e.value);case"mbSeconds":return`${t.toLocaleString("en-US")} MB-s`;case"coreHours":return`${t.toFixed(1)} core-h`;case"coreMs":return`${t.toLocaleString("en-US")} core-ms`;default:return String(e.value)}}function Lf(e){return e?e.wallClock?Rt(e.wallClock.high):e.rawWaste?Dr(e.rawWaste):null:null}function Ru({finding:e}){const t=v.useId(),n=e.impactEstimate;if(!n)return null;const s=n.wallClock?Mu(n.wallClock.low,n.wallClock.high):null,o=!s&&n.rawWaste?Dr(n.rawWaste):null,r=s??o;if(!r)return null;const a=`Estimate method: ${n.estimateMethod}`;return l.jsxs("span",{className:"impact-estimate text-xs text-muted-foreground",title:a,tabIndex:0,"aria-describedby":t,children:["Potential savings: ",l.jsx("strong",{children:r}),l.jsx("span",{id:t,className:"sr-only",children:a})]})}function ju(e){return e.map(t=>`${t.type}:${t.stageId}`).join(",")}function Eu(e){const t=Lr(),n=ju(e),s=v.useRef([]);return v.useCallback(o=>{s.current.forEach(r=>r()),s.current=[],o&&t&&(s.current=e.map(r=>t.registerFindingAnchor(r,o)))},[n,t])}function Iu(e){const t=fu();return t!==null&&e.includes(t)}function Tu(e){return e?"bg-primary/10 ring-2 ring-primary rounded-md":""}const _r=v.createContext(null);function Nu({children:e}){const[t,n]=v.useState(null),s=v.useCallback(a=>n(a),[]),o=v.useCallback(()=>n(null),[]),r=v.useMemo(()=>({stageId:t,openStage:s,close:o}),[t,s,o]);return l.jsx(_r.Provider,{value:r,children:e})}function zu(){const e=v.useContext(_r);if(!e)throw new Error("useStageDetail outside StageDetailProvider");return e}const Fr="inline-flex h-7 shrink-0 items-center gap-1 rounded-full border border-border bg-background px-2.5 text-xs font-medium whitespace-nowrap outline-none transition-colors hover:bg-muted focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50";function Au({stageId:e,label:t,className:n}){const{openStage:s}=zu();return l.jsxs("button",{type:"button",className:J(Fr,n),title:`Open details for Stage ${e}`,"aria-label":`Open details for Stage ${e}`,onClick:()=>s(e),children:["S",l.jsx("b",{children:e}),t?` ${t}`:""]})}const Pu=30;function Bu(e,{limit:t=Ke,chunk:n=Pu,dataset:s=e}={}){const[o,r]=v.useState({dataset:s,revealed:0}),a=!Object.is(o.dataset,s);a&&r({dataset:s,revealed:0});const c=a?0:o.revealed,u=t+c,d=e.slice(0,u),p=Math.max(0,e.length-u);return{visible:d,remaining:p,revealMore:()=>r(m=>({dataset:s,revealed:(Object.is(m.dataset,s)?m.revealed:0)+n})),revealThrough:m=>r(g=>{const h=Object.is(g.dataset,s)?g.revealed:0,x=Math.max(h,m-t+1);return x>h?{dataset:s,revealed:x}:g})}}function Lu({pills:e,visibleLimit:t=Ke}){const n=new Set,s=e.filter(d=>n.has(d.id)?!1:(n.add(d.id),!0)),o=JSON.stringify(s.map(({id:d,label:p})=>[d,p??null])),{visible:r,remaining:a,revealMore:c}=Bu(s,{limit:t,dataset:o}),u=s.slice(r.length);return l.jsxs("div",{className:"flex flex-wrap items-center gap-1.5",children:[r.map(d=>l.jsx(Au,{stageId:d.id,label:d.label},d.id)),a>0&&l.jsxs("button",{type:"button",className:J(Fr,"bg-muted"),title:`Also flagged: Stage ${u.map(d=>d.id).join(", Stage ")}`,"aria-label":`Show ${a} more stage${a===1?"":"s"}`,onClick:c,children:["+",a]})]})}function Du({value:e,context:t,pills:n}){return l.jsxs("div",{className:"space-y-2",children:[l.jsxs("p",{className:"flex items-baseline gap-2",children:[l.jsx("span",{className:"text-2xl font-semibold tracking-tight",children:e}),l.jsx("span",{className:"text-xs text-muted-foreground",children:t})]}),n&&n.length>0?l.jsx(Lu,{pills:n}):null]})}function uo(e){let t=0,n=!1;for(const s of e){const o=s.impactEstimate?.wallClock;o&&(n=!0,t+=o.low)}return n?t:null}function _u(e){return e.some(t=>t.impactEstimate?.wallClock!=null)}function Fu(e){return(t,n)=>{const s=uo(e(t)),o=uo(e(n));return s==null&&o==null?0:s==null?1:o==null?-1:o-s}}function $r(e){return e.stageId!=null?e.stageId:e.stageIds&&e.stageIds.length>0?Math.min(...e.stageIds):null}function $u(e){const t=e.map($r).filter(n=>n!=null);return t.length>0?Math.min(...t):null}function Ou(e){return(t,n)=>{const s=e(t),o=e(n);return s==null&&o==null?0:s==null?1:o==null?-1:s-o}}function Wu({mode:e,onChange:t,alternateOrderLabel:n}){const s=e==="impact";return l.jsx(fe,{type:"button",variant:"outline",size:"sm",className:"tap-target-comfortable tap-target-comfortable--sm","aria-pressed":s,onClick:()=>t(s?"stage":"impact"),children:s?n:"Sort by potential savings"})}function Gu(e="impact"){const[t,n]=v.useState(e);function s(o,r,a){return t==="impact"?[...o].sort(Fu(r)):[...o].sort(Ou(a))}return{sortMode:t,setSortMode:n,orderBy:s}}function Uu(e){const[t,n]=v.useState(!1),[s,o]=v.useState(null),[r,a]=v.useState(!1),[c,u]=v.useState(!1),[d,p]=v.useState(!1);return{expanded:t,data:s,loading:r,error:c,toggle:()=>{const f=!t;n(f),f&&e&&!d&&!r&&(a(!0),e().then(m=>o(m)).catch(()=>u(!0)).finally(()=>{p(!0),a(!1)}))}}}function Hu(e,t,n,s=null){const o=Math.ceil(e.length/Ke),r=Math.min(t,Math.max(0,o-1)),a=s==null||s===-1?r:Math.floor(s/Ke),c=e.slice(a*Ke,(a+1)*Ke);return v.useLayoutEffect(()=>{if(s==null||s===-1)return;const u=Math.floor(s/Ke);n(d=>d===u?d:u)},[s]),{totalPages:o,effectivePage:a,visible:c}}function qu({page:e,totalPages:t,onPrev:n,onNext:s,renderJumpControl:o}){return t<=1?null:l.jsxs("div",{className:`flex flex-wrap items-center gap-2 text-xs ${o?"justify-between":"justify-end"}`,children:[o?.(),l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(fe,{type:"button",variant:"ghost",size:"sm",className:"tap-target-comfortable tap-target-comfortable--sm",onClick:n,disabled:e===0,children:"Previous"}),l.jsxs("span",{className:"text-muted-foreground",children:["Page ",e+1," of ",t]}),l.jsx(fe,{type:"button",variant:"ghost",size:"sm",className:"tap-target-comfortable tap-target-comfortable--sm",onClick:s,disabled:e===t-1,children:"Next"})]})]})}const Vu=["duplicatePlanSubtree","smallFiles","underBroadcast","overBroadcast"],Ht="bg-plan-aggregate/8 text-plan-aggregate",Or={duplicatePlanSubtree:"Duplicate plan subtree",smallFiles:"Small files",underBroadcast:"Missed broadcast",overBroadcast:"Oversized broadcast"};function Yu(e){return Vu.includes(e.type)}function Ju(e){return!e||e.length===0?null:e.length===1?`Stage ${e[0]}`:`Stages ${e.join(", ")}`}function Ku({finding:e}){const t=Eu([e]),n=Iu([e]),{expanded:s,toggle:o}=Uu(),r=Ju(e.stageIds),a=r??"this finding";return l.jsxs("li",{ref:t,tabIndex:-1,"data-flashed":n?"true":"false",className:`space-y-1 transition-colors ${Tu(n)}`,children:[l.jsxs("p",{children:[r?l.jsxs("strong",{children:[r,":"]}):null," ",e.recommendation," ",l.jsx(Ru,{finding:e})]}),l.jsx(vu,{expanded:s,onClick:o,label:a}),s?l.jsx("p",{className:"pt-1",children:l.jsx(Cu,{evidenceKey:"sqlPlan"})}):null]})}function Wr({confidence:e,validationRequired:t}){const n=v.useId();return!e||e==="high"?null:l.jsxs("span",{className:"text-muted-foreground text-xs italic",title:t,tabIndex:0,"aria-describedby":n,children:[e," confidence: verify",l.jsx("span",{id:n,className:"sr-only",children:t})]})}function Xu({type:e,items:t}){const[n,s]=v.useState(0),o=_l(t)??t[0].impactBand,r=uu(),a=r?t.findIndex(p=>p===r.finding):null,{totalPages:c,effectivePage:u,visible:d}=Hu(t,n,s,a);return l.jsxs("div",{className:"space-y-1.5",children:[l.jsxs("h4",{className:"flex flex-wrap items-center gap-1.5 font-heading text-sm font-medium",children:[l.jsx(Ir,{impactBand:o}),Or[e],l.jsx(Gn,{type:e,impactBand:o,className:Ht}),l.jsxs("span",{className:"text-muted-foreground text-xs font-normal",children:["(",t.length,")"]}),l.jsx(Wr,{confidence:t[0].confidence,validationRequired:t[0].validationRequired})]}),l.jsx("ul",{className:"space-y-1 text-sm",children:d.map(p=>l.jsx(Ku,{finding:p},p.id))}),l.jsx(qu,{page:u,totalPages:c,onPrev:()=>s(p=>p-1),onNext:()=>s(p=>p+1)}),t[0].docAnchor?l.jsx(bd,{anchor:t[0].docAnchor,children:"Learn more →"}):null]})}const Zu=v.memo(function({catalog:t,defaultCollapsed:n=!0}){const{sortMode:s,setSortMode:o,orderBy:r}=Gu(),[a,c]=v.useState(!n),{findings:u,sorted:d,groupEntries:p,groupCount:i}=v.useMemo(()=>{const m=t.filter(Yu);if(m.length===0)return{findings:m,sorted:[],groupEntries:[],groupCount:0};const g=[...m].sort((b,y)=>(Ue[b.impactBand]??9)-(Ue[y.impactBand]??9)),h=new Map;for(const b of g)h.has(b.type)||h.set(b.type,[]),h.get(b.type).push(b);let x=[...h.entries()].map(([b,y])=>[b,r(y,w=>[w],$r)]);return x=r(x,([,b])=>b,([,b])=>$u(b)),{findings:m,sorted:g,groupEntries:x,groupCount:h.size}},[t,s]);if(u.length===0)return null;const f=d[0].impactBand;return l.jsx(Mt,{title:"Plan Advisor",impactBand:f,badges:l.jsxs(l.Fragment,{children:[l.jsx(Gn,{type:"duplicatePlanSubtree",impactBand:f,className:Ht}),_u(u)&&u.length>1&&a?l.jsx(Wu,{mode:s,onChange:o,alternateOrderLabel:"By stage"}):null]}),open:a,onOpenChange:c,summary:l.jsx(Du,{value:Or[d[0].type],context:`${d.length} finding${d.length===1?"":"s"} across ${i} type${i===1?"":"s"}`}),children:l.jsx("div",{className:"space-y-4",children:p.map(([m,g])=>l.jsx(Xu,{type:m,items:g},m))})})}),Df=Object.freeze(Object.defineProperty({__proto__:null,ConfidenceMarker:Wr,PLAN_TAG_CLASS:Ht,PlanFindings:Zu},Symbol.toStringTag,{value:"Module"})),Cn=e=>`${e.toFixed(2)}×`,Qu=e=>`${(e*100).toFixed(1)}%`,ef={wallClock:Xe,shuffleSpill:ne,taskSkew:Cn,failedTaskRate:Qu,diskSpill:ne,gcTime:Xe,inputBytes:ne,outputBytes:ne,executorRunTime:Xe},tf=e=>ef[e]??(t=>Intl.NumberFormat().format(t)),nf={regression:"text-critical",improvement:"text-clean",unchanged:"text-muted-foreground",neutral:"text-muted-foreground",unavailable:"text-muted-foreground"};function sf({m:e}){if(e.direction==="unavailable")return l.jsxs(Ze,{"aria-label":e.label,"data-direction":"unavailable",children:[l.jsx(be,{scope:"row",className:"text-left",children:e.label}),l.jsxs(Ae,{colSpan:3,className:"text-muted-foreground",children:["Unavailable: ",e.unavailableReason]})]});const t=tf(e.key),n=r=>r==null?"—":t(r),s=r=>r==null?"—":r===0?"unchanged":(r<0?"-":"+")+t(Math.abs(r)),o=sr.has(e.key)?"text-muted-foreground":nf[e.direction];return l.jsxs(Ze,{"aria-label":e.label,"data-direction":e.direction,children:[l.jsx(be,{scope:"row",className:"text-left",children:e.label}),l.jsx(Ae,{children:n(e.baseline)}),l.jsx(Ae,{children:n(e.candidate)}),l.jsx(Ae,{className:J("font-medium",o),children:s(e.delta)})]})}const of=["critical","warning","info"],rf=e=>of.includes(e)?e:"info";function af({stages:e}){return e.length===0?null:l.jsx("div",{className:"mt-1 flex flex-wrap gap-1",children:e.map(t=>l.jsx("span",{className:"rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground",children:t},t))})}function fo({items:e}){return l.jsx("ul",{className:"flex flex-col gap-2",children:e.map(t=>l.jsxs("li",{className:"flex flex-col gap-1 border-b border-border pb-2 last:border-0 last:pb-0",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(Gn,{type:t.rule,impactBand:rf(t.impactBand),className:In(t.rule)==="PLAN"?Ht:void 0}),l.jsxs("span",{className:"text-sm text-muted-foreground",children:[t.baseCount," → ",t.candCount]})]}),l.jsx(af,{stages:t.stages})]},`${t.rule}§${t.impactBand}`))})}function lf({reason:e}){const[t,n]=v.useState(!1);return t?null:l.jsxs("div",{role:"alert",className:"mb-4 flex items-start justify-between gap-3 rounded border border-warning/40 bg-warning/10 px-3 py-2 text-sm text-warning",children:[l.jsx("span",{children:e}),l.jsx("button",{type:"button",onClick:()=>n(!0),"aria-label":"Dismiss warning",className:"shrink-0 rounded px-1 text-muted-foreground hover:text-foreground",children:"Dismiss"})]})}function cf({model:e,onClose:t,onDrillIn:n}){const s=Math.round(e.matchedCoverage*100);v.useEffect(()=>{const r=a=>{a.key==="Escape"&&t()};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[t]);const o=l.jsxs("header",{className:"mb-4 flex items-center justify-between gap-3",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"font-heading text-lg font-semibold",children:"Run comparison"}),l.jsxs("p",{className:"text-sm text-muted-foreground",children:["Baseline ",l.jsx("strong",{children:e.baselineLabel})," vs candidate ",l.jsx("strong",{children:e.candidateLabel})]})]}),l.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[n?l.jsxs(l.Fragment,{children:[l.jsx(fe,{variant:"outline",size:"sm",onClick:()=>n("baseline"),children:"View run A dashboard"}),l.jsx(fe,{variant:"outline",size:"sm",onClick:()=>n("candidate"),children:"View run B dashboard"})]}):null,l.jsx(fe,{variant:"ghost",size:"sm",onClick:t,children:"Close"})]})]});return l.jsxs("div",{className:"mx-auto flex max-w-4xl flex-col gap-6 p-6",children:[o,l.jsxs("main",{className:"contents",children:[l.jsx("h2",{className:"sr-only",children:"Comparison results"}),e.confidence==="low"&&e.reason?l.jsx(lf,{reason:e.reason}):null,l.jsxs(Mt,{title:"Metrics",collapsible:!1,children:[l.jsxs("p",{className:"mb-3 text-xs text-muted-foreground",children:["Metrics and finding categories cover the whole run. Per-stage skew below covers only the ",s,"% of stages that matched by unique identity."]}),l.jsxs(vn,{children:[l.jsx(yn,{children:l.jsxs(Ze,{children:[l.jsx(be,{className:"text-left",children:"Metric"}),l.jsxs(be,{children:["Baseline (",e.baselineLabel,")"]}),l.jsxs(be,{children:["Candidate (",e.candidateLabel,")"]}),l.jsx(be,{children:"Δ"})]})}),l.jsx(wn,{children:e.metrics.map(r=>l.jsx(sf,{m:r},r.key))})]})]}),e.findings.introduced.length>0||e.findings.resolved.length>0?l.jsxs(Mt,{title:"Findings by category",collapsible:!1,children:[e.findings.introduced.length>0?l.jsxs("div",{className:"mb-4",children:[l.jsxs("h3",{className:"mb-2 text-xs font-semibold text-muted-foreground",children:["More in candidate (",e.candidateLabel,")"]}),l.jsx(fo,{items:e.findings.introduced})]}):null,e.findings.resolved.length>0?l.jsxs("div",{children:[l.jsxs("h3",{className:"mb-2 text-xs font-semibold text-muted-foreground",children:["Fewer in candidate (",e.candidateLabel,")"]}),l.jsx(fo,{items:e.findings.resolved})]}):null]}):null,e.stageSkew.length>0?l.jsx(Mt,{title:"Per-stage task skew (matched stages only)",collapsible:!1,children:l.jsxs(vn,{children:[l.jsx(yn,{children:l.jsxs(Ze,{children:[l.jsx(be,{className:"text-left",children:"Stage"}),l.jsx(be,{children:"Baseline"}),l.jsx(be,{children:"Candidate"})]})}),l.jsx(wn,{children:[...e.stageSkew].sort((r,a)=>Math.abs(a.delta??0)-Math.abs(r.delta??0)).map(r=>l.jsxs(Ze,{children:[l.jsx(be,{scope:"row",className:"text-left",children:r.identity.split("§")[0]}),l.jsx(Ae,{children:r.baseline==null?"—":Cn(r.baseline)}),l.jsx(Ae,{children:r.candidate==null?"—":Cn(r.candidate)})]},r.identity))})]})}):null,l.jsx(xu,{baseStages:e.baseStages??[],candStages:e.candStages??[]})]})]})}const df=v.lazy(()=>mo(async()=>{const{PlanGraphRoute:e}=await import("./PlanGraphRoute-BjPSugIG.js");return{PlanGraphRoute:e}},__vite__mapDeps([0,1,2,3,4,5]),import.meta.url).then(({PlanGraphRoute:e})=>({default:e}))),uf=v.lazy(()=>mo(async()=>{const{Dashboard:e}=await import("./Dashboard-D1_IrWRs.js").then(t=>t.b);return{Dashboard:e}},__vite__mapDeps([6,1,2,5,3,4]),import.meta.url).then(({Dashboard:e})=>({default:e})));function ff(){const e=oe(a=>a.comparison),t=oe(a=>a.closeComparison),{prepareComparison:n,drillIntoRun:s}=An(),o=v.useMemo(()=>{const a=e.baselineId&&e.candidateId?n(e.baselineId,e.candidateId):null;return a?Jc(a.baseline,a.candidate):null},[e.baselineId,e.candidateId,n]),r=!o;return v.useEffect(()=>{r&&t()},[r,t]),o?l.jsx(cf,{model:o,onClose:t,onDrillIn:a=>{const c=a==="baseline"?e.baselineId:e.candidateId;c&&s(c)}}):null}function pf(){const e=oe(a=>a.planGraph.stageId),t=oe(a=>a.planGraph.initialScope),n=oe(a=>a.appModel),s=oe(a=>a.catalog),o=oe(a=>a.activeFileId),r=oe(a=>a.closePlanGraph);return e==null?null:l.jsx(v.Suspense,{fallback:l.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:l.jsx(df,{stageId:e,initialScope:t,appModel:n,findings:s,activeFileId:o,onClose:r},e)})}function mf(){const e=oe(c=>c.status),t=oe(c=>c.errorMessage),n=oe(c=>c.parse),s=oe(c=>c.shsParsing),o=oe(c=>c.planGraph.active),r=oe(c=>c.comparison.active),a=oe(c=>c.compareLoad);if(a){const c=Math.round(n.pct*100);return l.jsxs("main",{className:"flex min-h-screen flex-col items-center justify-center gap-4 p-10",children:[l.jsxs("p",{role:"status","aria-live":"polite",className:"text-sm text-muted-foreground",children:["Parsing run ",a.current," of 2… ",c,"%"]}),l.jsx(cs,{value:n.pct*100,className:"w-full max-w-md"})]})}if(o)return l.jsx(pf,{});if(r)return l.jsx(ff,{});if(e==="ready")return l.jsx(v.Suspense,{fallback:l.jsx("p",{role:"status","aria-live":"polite","aria-label":"Loading dashboard",className:"p-6 text-sm text-muted-foreground",children:"Loading dashboard…"}),children:l.jsx(uf,{})});if(e==="parsing"&&!s){const c=Math.round(n.pct*100),u=n.lines>0?` · ${n.lines.toLocaleString()} lines`:"";return l.jsxs("main",{className:"flex min-h-screen flex-col items-center justify-center gap-4 p-10",children:[l.jsxs("p",{role:"status","aria-live":"polite",className:"text-sm text-muted-foreground",children:["Parsing… ",c,"%",u]}),l.jsx(cs,{value:n.pct*100,className:"w-full max-w-md"})]})}return l.jsxs("main",{className:"min-h-screen p-6 sm:p-10",children:[e==="error"&&t?l.jsx("p",{role:"alert",className:"mb-4 text-sm text-destructive",children:t}):null,l.jsx(md,{})]})}function hf(){const e=oe(o=>o.status),t=oe(o=>o.planGraph.active),n=oe(o=>o.comparison.active),s=e==="ready"||t||n;return l.jsx(vi,{children:l.jsx(hd,{children:l.jsxs(Nu,{children:[s?null:l.jsx("header",{children:l.jsx("h1",{className:"sr-only",children:"SparkForensics"})}),l.jsx(mf,{}),l.jsx(su,{}),l.jsx(Tl,{})]})})})}ga.createRoot(document.getElementById("root")).render(l.jsx(v.StrictMode,{children:l.jsx(hf,{})}));export{Lf as $,Sn as A,fe as B,jf as C,bd as D,Cu as E,ll as F,zn as G,dl as H,Ir as I,_l as J,Ue as K,Tf as L,Nf as M,zf as N,Mu as O,Dr as P,Lu as Q,qu as R,Au as S,Gn as T,wt as U,Sf as V,Mt as W,Lo as X,zu as Y,ne as Z,mo as _,An as a,Ru as a0,yf as a1,wf as a2,Pf as a3,Bf as a4,wu as a5,Af as a6,oe as a7,If as a8,Cf as a9,Tu as aA,Ke as aB,kf as aC,ir as aD,lr as aE,cr as aF,Wr as aG,Ul as aH,Df as aI,Ht as aa,Mf as ab,Go as ac,Ts as ad,en as ae,Vo as af,Qc as ag,jn as ah,gd as ai,Ao as aj,En as ak,Cl as al,xl as am,Ec as an,tr as ao,Li as ap,er as aq,Gu as ar,uu as as,Hu as at,_u as au,Wu as av,Uu as aw,Eu as ax,Iu as ay,vu as az,z as b,pe as c,J as d,Ut as e,Xe as f,al as g,or as h,Ef as i,vn as j,Rf as k,yn as l,Ze as m,be as n,wn as o,Ae as p,Du as q,ys as r,Kt as s,In as t,dr as u,Ss as v,ut as w,Er as x,gi as y,Tr as z};
|