sparkforensics-server 0.5.1 → 0.5.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/package.json +1 -1
- package/public/assets/{AutoscalingChurn-5hDGIXi4.js → AutoscalingChurn-8t3U3isq.js} +1 -1
- package/public/assets/{CacheUtilization-CT2SCnJJ.js → CacheUtilization-CJs9tTum.js} +1 -1
- package/public/assets/CachingOpportunity-D1NcHs0V.js +1 -0
- package/public/assets/{ColdStart-B38OiAOp.js → ColdStart-CdRJ9gD8.js} +1 -1
- package/public/assets/{ConfigAudit-BoplryCH.js → ConfigAudit-B5Gbe5js.js} +1 -1
- package/public/assets/CoreUsageArea-a--NTRGY.js +1 -0
- package/public/assets/{Dashboard-BgKodJl2.js → Dashboard-C1hNeX49.js} +2 -2
- package/public/assets/DisclosureContext-ZpE6CkHx.js +1 -0
- package/public/assets/{DuplicatePlanSubtree-BqS2A2j4.js → DuplicatePlanSubtree-dobXdz7E.js} +1 -1
- package/public/assets/{ExecutorUtilization-Dp52QGWo.js → ExecutorUtilization-D9grwi7t.js} +1 -1
- package/public/assets/{GcPressure-CT1yzR_s.js → GcPressure-8-G2ri10.js} +1 -1
- package/public/assets/{IncompleteRun-C7Qkjtjn.js → IncompleteRun-B91lky7a.js} +1 -1
- package/public/assets/{JobFailures-WHl3ELfh.js → JobFailures-BsWvBMyJ.js} +1 -1
- package/public/assets/{MemoryUtilization-D8IUDHJI.js → MemoryUtilization-BM5schZI.js} +1 -1
- package/public/assets/{OverBroadcast-6oSSAQ_R.js → OverBroadcast-DdN8JIJH.js} +1 -1
- package/public/assets/{PartitionSizing-BwdFL-mw.js → PartitionSizing-CY5HDYtp.js} +1 -1
- package/public/assets/{PlanExplorer-DcxmiQWL.js → PlanExplorer-DgHCDBD_.js} +1 -1
- package/public/assets/PlanGraphRoute-DH3KJb8j.js +1 -0
- package/public/assets/{RetryWaste-BTbeHkJc.js → RetryWaste-DOnE9vGF.js} +1 -1
- package/public/assets/{ShuffleIO-CRhrYNE0.js → ShuffleIO-MMnDESkF.js} +1 -1
- package/public/assets/{Skew-DSNXRG9V.js → Skew-BmZZJ5ms.js} +1 -1
- package/public/assets/{SlowHost-B7Lwu2EU.js → SlowHost-CsJzfEqo.js} +1 -1
- package/public/assets/{SmallFiles-C082c2rd.js → SmallFiles-BoK3R1Ex.js} +1 -1
- package/public/assets/{SpeculationWaste-BS2vpadr.js → SpeculationWaste-CnVxB5AJ.js} +1 -1
- package/public/assets/Spill-BhNicyBy.js +1 -0
- package/public/assets/{StageFailed-D3ac9Sou.js → StageFailed-mAhHU4l_.js} +1 -1
- package/public/assets/StageFindingGroup-BEtPWcT0.js +1 -0
- package/public/assets/{StageHeader-pI1nTwVf.js → StageHeader-DJkYkrsU.js} +1 -1
- package/public/assets/{StageShape-eO5le8iG.js → StageShape-BDxRknLp.js} +1 -1
- package/public/assets/{StageSlowness-BaNyfNvL.js → StageSlowness-BPRw-otN.js} +1 -1
- package/public/assets/{Straggler-D5Fnok_y.js → Straggler-CZCbnOWP.js} +1 -1
- package/public/assets/{TaskFailures-BWnC-K_G.js → TaskFailures-C57YcLFQ.js} +1 -1
- package/public/assets/{TinyTask-8_5lpq_2.js → TinyTask-Bi84qU7n.js} +1 -1
- package/public/assets/{UnderBroadcast-DJ0XSwth.js → UnderBroadcast-DdQV7htE.js} +1 -1
- package/public/assets/{finding-anchor-Cys8Z6Yn.js → finding-anchor-Cl6_5hfV.js} +1 -1
- package/public/assets/{impact-sort-BTQndbof.js → impact-sort-CssZ6MT2.js} +1 -1
- package/public/assets/index-2h_TgUAb.css +2 -0
- package/public/assets/index-B-03mG7K.js +14 -0
- package/public/assets/{parser-worker-DmeCnLWU.js → parser-worker-CA5RxqKc.js} +8 -8
- package/public/assets/{select-DIYN6D3y.js → select-CQjNhprm.js} +1 -1
- package/public/assets/{usePagedRows-BxvdFnPk.js → usePagedRows-Dyl6T8Ok.js} +1 -1
- package/public/assets/useRecentFiles-XZEnLlal.js +11 -0
- package/public/assets/{useSortMode-B8SRfAoG.js → useSortMode-Dhvit8dt.js} +1 -1
- package/public/docs/404.html +2 -2
- package/public/docs/assets/{app.D2GqAkhy.js → app.eYTPqTeq.js} +1 -1
- package/public/docs/assets/chunks/@localSearchIndexroot.u_e5bQz4.js +1 -0
- package/public/docs/assets/chunks/{VPLocalSearchBox.BS4cSmtW.js → VPLocalSearchBox.DsZrQKQR.js} +1 -1
- package/public/docs/assets/chunks/{theme.BuxVpb0H.js → theme.DsTNE2pE.js} +2 -2
- package/public/docs/assets/contributor-guide_architecture_detector-contract_threshold-tables.md.CKjWG56Y.js +1 -0
- package/public/docs/assets/contributor-guide_architecture_state-and-history_run-comparison-internals.md.CZA0JLtV.js +1 -0
- package/public/docs/assets/{contributor-guide_architecture_state-and-history_run-comparison-internals.md.uuAKpY0Y.lean.js → contributor-guide_architecture_state-and-history_run-comparison-internals.md.CZA0JLtV.lean.js} +1 -1
- package/public/docs/assets/contributor-guide_architecture_worker-protocol_cli-and-mcp.md.DC1YqXBp.js +1 -0
- package/public/docs/assets/{user-guide_getting-started_ci-and-automation.md.DpnfKz3x.js → user-guide_getting-started_ci-and-automation.md.OUQqw3mI.js} +5 -4
- package/public/docs/assets/user-guide_getting-started_ci-and-automation.md.OUQqw3mI.lean.js +1 -0
- package/public/docs/assets/{user-guide_mcp-tools_compare-runs.md.CPowlb2q.js → user-guide_mcp-tools_compare-runs.md.Cc_gLoix.js} +3 -2
- package/public/docs/assets/{user-guide_mcp-tools_compare-runs.md.CPowlb2q.lean.js → user-guide_mcp-tools_compare-runs.md.Cc_gLoix.lean.js} +1 -1
- package/public/docs/assets/{user-guide_mcp-tools_evaluate-budgets.md.Dq5Azk8G.js → user-guide_mcp-tools_evaluate-budgets.md.BB0nDY3Z.js} +2 -2
- package/public/docs/assets/{user-guide_mcp-tools_evaluate-budgets.md.Dq5Azk8G.lean.js → user-guide_mcp-tools_evaluate-budgets.md.BB0nDY3Z.lean.js} +1 -1
- package/public/docs/assets/user-guide_run-comparison.md.BUALkohi.js +1 -0
- package/public/docs/assets/user-guide_run-comparison.md.BUALkohi.lean.js +1 -0
- package/public/docs/assets/user-guide_run-comparison_how-stages-are-matched.md.DSXGu2tA.js +1 -0
- package/public/docs/assets/user-guide_run-comparison_how-stages-are-matched.md.DSXGu2tA.lean.js +1 -0
- package/public/docs/assets/user-guide_understanding-findings.md.C9YRruMT.js +1 -0
- package/public/docs/assets/user-guide_understanding-findings.md.C9YRruMT.lean.js +1 -0
- package/public/docs/contributor-guide/architecture/board-widgets/caching-and-memory.html +3 -3
- package/public/docs/contributor-guide/architecture/board-widgets/plan-advisor.html +3 -3
- package/public/docs/contributor-guide/architecture/board-widgets/visual-system-and-templating.html +3 -3
- package/public/docs/contributor-guide/architecture/board-widgets.html +3 -3
- package/public/docs/contributor-guide/architecture/detector-contract/plan-attribution.html +3 -3
- package/public/docs/contributor-guide/architecture/detector-contract/threshold-tables.html +5 -5
- package/public/docs/contributor-guide/architecture/detector-contract.html +3 -3
- package/public/docs/contributor-guide/architecture/drill-down/plan-graph.html +3 -3
- package/public/docs/contributor-guide/architecture/drill-down.html +3 -3
- package/public/docs/contributor-guide/architecture/impact-estimation/caveats-tuning-and-coverage.html +3 -3
- package/public/docs/contributor-guide/architecture/impact-estimation/stage-union-rollup.html +3 -3
- package/public/docs/contributor-guide/architecture/impact-estimation.html +3 -3
- package/public/docs/contributor-guide/architecture/index.html +3 -3
- package/public/docs/contributor-guide/architecture/overview.html +3 -3
- package/public/docs/contributor-guide/architecture/state-and-history/history-server-intake.html +3 -3
- package/public/docs/contributor-guide/architecture/state-and-history/run-comparison-internals.html +5 -5
- package/public/docs/contributor-guide/architecture/state-and-history.html +3 -3
- package/public/docs/contributor-guide/architecture/widget-rendering/findings-tab.html +3 -3
- package/public/docs/contributor-guide/architecture/widget-rendering/investigation-routing.html +3 -3
- package/public/docs/contributor-guide/architecture/widget-rendering/list-sort-mode.html +3 -3
- package/public/docs/contributor-guide/architecture/widget-rendering/reference-section.html +3 -3
- package/public/docs/contributor-guide/architecture/widget-rendering/row-expand-contract.html +3 -3
- package/public/docs/contributor-guide/architecture/widget-rendering.html +3 -3
- package/public/docs/contributor-guide/architecture/worker-protocol/cli-and-mcp.html +5 -5
- package/public/docs/contributor-guide/architecture/worker-protocol/core-and-event-validation.html +3 -3
- package/public/docs/contributor-guide/architecture/worker-protocol/evidence-availability.html +3 -3
- package/public/docs/contributor-guide/architecture/worker-protocol/evidence-report.html +3 -3
- package/public/docs/contributor-guide/architecture/worker-protocol.html +3 -3
- package/public/docs/contributor-guide/contributing.html +3 -3
- package/public/docs/contributor-guide/development-setup.html +3 -3
- package/public/docs/contributor-guide/testing.html +3 -3
- package/public/docs/hashmap.json +1 -1
- package/public/docs/index.html +3 -3
- package/public/docs/tuning-reference/anti-patterns.html +3 -3
- package/public/docs/tuning-reference/aqe.html +3 -3
- package/public/docs/tuning-reference/bottleneck-broadcast-sizing.html +3 -3
- package/public/docs/tuning-reference/bottleneck-cold-start.html +3 -3
- package/public/docs/tuning-reference/bottleneck-duplicate-plan-subtree.html +3 -3
- package/public/docs/tuning-reference/bottleneck-failures.html +3 -3
- package/public/docs/tuning-reference/bottleneck-gc.html +3 -3
- package/public/docs/tuning-reference/bottleneck-job-failure-rate.html +3 -3
- package/public/docs/tuning-reference/bottleneck-memory-utilization.html +3 -3
- package/public/docs/tuning-reference/bottleneck-retry-waste.html +3 -3
- package/public/docs/tuning-reference/bottleneck-shuffle.html +3 -3
- package/public/docs/tuning-reference/bottleneck-skew.html +3 -3
- package/public/docs/tuning-reference/bottleneck-slow-host.html +3 -3
- package/public/docs/tuning-reference/bottleneck-small-files.html +3 -3
- package/public/docs/tuning-reference/bottleneck-spill.html +3 -3
- package/public/docs/tuning-reference/bottleneck-straggler.html +3 -3
- package/public/docs/tuning-reference/bottleneck-tiny-tasks.html +3 -3
- package/public/docs/tuning-reference/bottleneck-utilization.html +3 -3
- package/public/docs/tuning-reference/caching.html +3 -3
- package/public/docs/tuning-reference/cluster-config.html +3 -3
- package/public/docs/tuning-reference/config.html +3 -3
- package/public/docs/tuning-reference/data-formats.html +3 -3
- package/public/docs/tuning-reference/index.html +3 -3
- package/public/docs/tuning-reference/intro.html +3 -3
- package/public/docs/tuning-reference/joins.html +3 -3
- package/public/docs/tuning-reference/memory-model.html +3 -3
- package/public/docs/tuning-reference/metrics.html +3 -3
- package/public/docs/tuning-reference/partitioning.html +3 -3
- package/public/docs/tuning-reference/pyspark.html +3 -3
- package/public/docs/tuning-reference/shuffle.html +3 -3
- package/public/docs/tuning-reference/spark-architecture.html +3 -3
- package/public/docs/tuning-reference/table-formats.html +3 -3
- package/public/docs/user-guide/alternative-log-retrieval/managed-platforms.html +3 -3
- package/public/docs/user-guide/alternative-log-retrieval/ssh-bastion.html +3 -3
- package/public/docs/user-guide/alternative-log-retrieval.html +3 -3
- package/public/docs/user-guide/getting-started/ci-and-automation.html +8 -7
- package/public/docs/user-guide/getting-started/reading-the-dashboard.html +3 -3
- package/public/docs/user-guide/getting-started/regression-metric-keys.html +3 -3
- package/public/docs/user-guide/getting-started/tuning-thresholds.html +3 -3
- package/public/docs/user-guide/getting-started.html +3 -3
- package/public/docs/user-guide/mcp-tools/compare-runs.html +7 -6
- package/public/docs/user-guide/mcp-tools/diagnose-run.html +3 -3
- package/public/docs/user-guide/mcp-tools/evaluate-budgets.html +5 -5
- package/public/docs/user-guide/mcp-tools/get-finding-documentation.html +3 -3
- package/public/docs/user-guide/mcp-tools/get-finding-evidence.html +3 -3
- package/public/docs/user-guide/mcp-tools/get-reference-doc.html +3 -3
- package/public/docs/user-guide/mcp-tools/get-run-summary.html +3 -3
- package/public/docs/user-guide/mcp-tools/list-runs.html +3 -3
- package/public/docs/user-guide/mcp-tools.html +3 -3
- package/public/docs/user-guide/run-comparison/how-stages-are-matched.html +5 -5
- package/public/docs/user-guide/run-comparison.html +5 -5
- package/public/docs/user-guide/understanding-findings.html +5 -5
- package/public/export-template.html +3 -3
- package/public/index.html +3 -3
- package/vendor-core/cli/budgets.js +62 -2
- package/vendor-core/cli/regression-budgets.js +35 -0
- package/vendor-core/comparison-output.js +2 -1
- package/vendor-core/core-source-hash.txt +1 -1
- package/vendor-core/detectors.js +219 -56
- package/vendor-core/docs-content/detection/chrn.md +3 -1
- package/vendor-core/docs-content/detection/cold.md +2 -1
- package/vendor-core/docs-content/detection/plan.md +9 -2
- package/vendor-core/docs-content/detection/shfl.md +8 -2
- package/vendor-core/docs-content/detection/skew.md +11 -5
- package/vendor-core/docs-content/detection/slow.md +6 -2
- package/vendor-core/docs-content/detection/spill.md +4 -1
- package/vendor-core/docs-content/detection/strag.md +5 -3
- package/vendor-core/docs-content/detection/tiny.md +3 -2
- package/vendor-core/evidence-report.js +11 -11
- package/vendor-core/finding-presentation.js +39 -13
- package/vendor-core/finding-types.js +50 -6
- package/vendor-core/mcp-server-factory.js +6 -2
- package/vendor-core/mcp-tools.js +10 -1
- package/vendor-core/median.js +8 -0
- package/vendor-core/run-comparison.js +2 -0
- package/vendor-core/sequence-alignment.js +83 -0
- package/vendor-core/stage-alignment.js +387 -63
- package/vendor-core/stage-quantiles.js +3 -1
- package/vendor-core/stage-structure.js +83 -0
- package/public/assets/CachingOpportunity-D_O_WkbH.js +0 -1
- package/public/assets/CoreUsageArea-csgwNxkl.js +0 -1
- package/public/assets/DisclosureContext-B0siMVdg.js +0 -1
- package/public/assets/PlanGraphRoute-pqnHTt4i.js +0 -1
- package/public/assets/Spill-B4DVKHXx.js +0 -1
- package/public/assets/StageFindingGroup-D9naK109.js +0 -1
- package/public/assets/index-BcqTLKFp.css +0 -2
- package/public/assets/index-DCeWge12.js +0 -13
- package/public/assets/useRecentFiles-C3Ov47U7.js +0 -11
- package/public/docs/assets/chunks/@localSearchIndexroot.D4OdkQjy.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_detector-contract_threshold-tables.md.fkPBXsU2.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_state-and-history_run-comparison-internals.md.uuAKpY0Y.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_worker-protocol_cli-and-mcp.md.Dk08VS7n.js +0 -1
- package/public/docs/assets/user-guide_getting-started_ci-and-automation.md.DpnfKz3x.lean.js +0 -1
- package/public/docs/assets/user-guide_run-comparison.md.B6aNtDYF.js +0 -1
- package/public/docs/assets/user-guide_run-comparison.md.B6aNtDYF.lean.js +0 -1
- package/public/docs/assets/user-guide_run-comparison_how-stages-are-matched.md.XBzQ1oEU.js +0 -1
- package/public/docs/assets/user-guide_run-comparison_how-stages-are-matched.md.XBzQ1oEU.lean.js +0 -1
- package/public/docs/assets/user-guide_understanding-findings.md.Dqt2H_C1.js +0 -1
- package/public/docs/assets/user-guide_understanding-findings.md.Dqt2H_C1.lean.js +0 -1
- /package/public/docs/assets/{contributor-guide_architecture_detector-contract_threshold-tables.md.fkPBXsU2.lean.js → contributor-guide_architecture_detector-contract_threshold-tables.md.CKjWG56Y.lean.js} +0 -0
- /package/public/docs/assets/{contributor-guide_architecture_worker-protocol_cli-and-mcp.md.Dk08VS7n.lean.js → contributor-guide_architecture_worker-protocol_cli-and-mcp.md.DC1YqXBp.lean.js} +0 -0
package/public/docs/assets/chunks/{VPLocalSearchBox.BS4cSmtW.js → VPLocalSearchBox.DsZrQKQR.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var Ot=Object.defineProperty;var At=(a,e,t)=>e in a?Ot(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Me=(a,e,t)=>At(a,typeof e!="symbol"?e+"":e,t);import{V as Ct,q as Be,ak as Mt,h as be,al as nt,am as Lt,an as Dt,ao as Pt,G as ce,d as zt,ap as rt,p as he,aq as Vt,ar as jt,s as $t,as as Bt,v as Le,P as ve,O as xe,a2 as Wt,at as Kt,W as Jt,R as qt,$ as Ut,o as q,b as Ht,j as T,a0 as Gt,k as P,a3 as Qt,a4 as Yt,au as Zt,c as Q,n as it,e as _e,B as st,F as at,a as pe,t as me,av as Xt,aw as ot,ax as en,a9 as tn,ae as nn,ay as rn,_ as sn}from"./framework.DSg0KOwT.js";import{u as an,c as on}from"./theme.
|
|
1
|
+
var Ot=Object.defineProperty;var At=(a,e,t)=>e in a?Ot(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Me=(a,e,t)=>At(a,typeof e!="symbol"?e+"":e,t);import{V as Ct,q as Be,ak as Mt,h as be,al as nt,am as Lt,an as Dt,ao as Pt,G as ce,d as zt,ap as rt,p as he,aq as Vt,ar as jt,s as $t,as as Bt,v as Le,P as ve,O as xe,a2 as Wt,at as Kt,W as Jt,R as qt,$ as Ut,o as q,b as Ht,j as T,a0 as Gt,k as P,a3 as Qt,a4 as Yt,au as Zt,c as Q,n as it,e as _e,B as st,F as at,a as pe,t as me,av as Xt,aw as ot,ax as en,a9 as tn,ae as nn,ay as rn,_ as sn}from"./framework.DSg0KOwT.js";import{u as an,c as on}from"./theme.DsTNE2pE.js";const ln={root:()=>Ct(()=>import("./@localSearchIndexroot.u_e5bQz4.js"),[])};/*!
|
|
2
2
|
* tabbable 6.5.0
|
|
3
3
|
* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE
|
|
4
4
|
*/var gt=["input:not([inert]):not([inert] *)","select:not([inert]):not([inert] *)","textarea:not([inert]):not([inert] *)","a[href]:not([inert]):not([inert] *)","area[href]:not([inert]):not([inert] *)","button:not([inert]):not([inert] *)","[tabindex]:not(slot):not([inert]):not([inert] *)","audio[controls]:not([inert]):not([inert] *)","video[controls]:not([inert]):not([inert] *)",'[contenteditable]:not([contenteditable="false"]):not([inert]):not([inert] *)',"details>summary:first-of-type:not([inert]):not([inert] *)","details:not([inert]):not([inert] *)"],ke=gt.join(","),bt=typeof Element>"u",ae=bt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ne=!bt&&Element.prototype.getRootNode?function(a){var e;return a==null||(e=a.getRootNode)===null||e===void 0?void 0:e.call(a)}:function(a){return a==null?void 0:a.ownerDocument},Fe=function(e,t){var n;t===void 0&&(t=!0);var r=e==null||(n=e.getAttribute)===null||n===void 0?void 0:n.call(e,"inert"),s=r===""||r==="true",i=s||t&&e&&(typeof e.closest=="function"?e.closest("[inert]"):Fe(e.parentNode));return i},cn=function(e){var t,n=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return n===""||n==="true"},yt=function(e,t,n){if(Fe(e))return[];var r=Array.prototype.slice.apply(e.querySelectorAll(ke));return t&&ae.call(e,ke)&&r.unshift(e),r=r.filter(n),r},Re=function(e,t,n){for(var r=[],s=Array.from(e);s.length;){var i=s.shift();if(!Fe(i,!1))if(i.tagName==="SLOT"){var o=i.assignedElements(),l=o.length?o:i.children,c=Re(l,!0,n);n.flatten?r.push.apply(r,c):r.push({scopeParent:i,candidates:c})}else{var h=ae.call(i,ke);h&&n.filter(i)&&(t||!e.includes(i))&&r.push(i);var m=i.shadowRoot||typeof n.getShadowRoot=="function"&&n.getShadowRoot(i),p=!Fe(m,!1)&&(!n.shadowRootFilter||n.shadowRootFilter(i));if(m&&p){var b=Re(m===!0?i.children:m.children,!0,n);n.flatten?r.push.apply(r,b):r.push({scopeParent:i,candidates:b})}else s.unshift.apply(s,i.children)}}return r},wt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},se=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||cn(e))&&!wt(e)?0:e.tabIndex},un=function(e,t){var n=se(e);return n<0&&t&&!wt(e)?0:n},dn=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},St=function(e){return e.tagName==="INPUT"},fn=function(e){return St(e)&&e.type==="hidden"},hn=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(n){return n.tagName==="SUMMARY"});return t},vn=function(e,t){for(var n=0;n<e.length;n++)if(e[n].checked&&e[n].form===t)return e[n]},pn=function(e){if(!e.name)return!0;var t=e.form||Ne(e),n=function(o){return t.querySelectorAll('input[type="radio"][name="'+o+'"]')},r;if(typeof window<"u"&&typeof window.CSS<"u"&&typeof window.CSS.escape=="function")r=n(window.CSS.escape(e.name));else try{r=n(e.name)}catch(i){return console.error("Looks like you have a radio button with a name attribute containing invalid CSS selector characters and need the CSS.escape polyfill: %s",i.message),!1}var s=vn(r,e.form);return!s||s===e},mn=function(e){return St(e)&&e.type==="radio"},gn=function(e){return mn(e)&&!pn(e)},bn=function(e){var t,n=e&&Ne(e),r=(t=n)===null||t===void 0?void 0:t.host,s=!1;if(n&&n!==e){var i,o,l;for(s=!!((i=r)!==null&&i!==void 0&&(o=i.ownerDocument)!==null&&o!==void 0&&o.contains(r)||e!=null&&(l=e.ownerDocument)!==null&&l!==void 0&&l.contains(e));!s&&r;){var c,h,m;n=Ne(r),r=(c=n)===null||c===void 0?void 0:c.host,s=!!((h=r)!==null&&h!==void 0&&(m=h.ownerDocument)!==null&&m!==void 0&&m.contains(r))}}return s},lt=function(e){var t=e.getBoundingClientRect(),n=t.width,r=t.height;return n===0&&r===0},yn=function(e,t){var n=t.displayCheck,r=t.getShadowRoot;if(n==="full-native"&&"checkVisibility"in e){var s=e.checkVisibility({checkOpacity:!1,opacityProperty:!1,contentVisibilityAuto:!0,visibilityProperty:!0,checkVisibilityCSS:!0});return!s}var i=getComputedStyle(e),o=i.visibility;if(o==="hidden"||o==="collapse")return!0;var l=ae.call(e,"details>summary:first-of-type"),c=l?e.parentElement:e;if(ae.call(c,"details:not([open]) *"))return!0;if(!n||n==="full"||n==="full-native"||n==="legacy-full"){if(typeof r=="function"){for(var h=e;e;){var m=e.parentElement,p=Ne(e);if(m&&!m.shadowRoot&&r(m)===!0)return lt(e);e.assignedSlot?e=e.assignedSlot:!m&&p!==e.ownerDocument?e=p.host:e=m}e=h}if(bn(e))return!e.getClientRects().length;if(n!=="legacy-full")return!0}else if(n==="non-zero-area")return lt(e);return!1},wn=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var n=0;n<t.children.length;n++){var r=t.children.item(n);if(r.tagName==="LEGEND")return ae.call(t,"fieldset[disabled] *")?!0:!r.contains(e)}return!0}t=t.parentElement}return!1},Oe=function(e,t){return!(t.disabled||fn(t)||yn(t,e)||hn(t)||wn(t))},We=function(e,t){return!(gn(t)||se(t)<0||!Oe(e,t))},Sn=function(e){var t=parseInt(e.getAttribute("tabindex"),10);return!!(isNaN(t)||t>=0)},xt=function(e){var t=[],n=[];return e.forEach(function(r,s){var i=!!r.scopeParent,o=i?r.scopeParent:r,l=un(o,i),c=i?xt(r.candidates):o;l===0?i?t.push.apply(t,c):t.push(o):n.push({documentOrder:s,tabIndex:l,item:r,isScope:i,content:c})}),n.sort(dn).reduce(function(r,s){return s.isScope?r.push.apply(r,s.content):r.push(s.content),r},[]).concat(t)},xn=function(e,t){t=t||{};var n;return t.getShadowRoot?n=Re([e],t.includeContainer,{filter:We.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:Sn}):n=yt(e,t.includeContainer,We.bind(null,t)),xt(n)},_n=function(e,t){t=t||{};var n;return t.getShadowRoot?n=Re([e],t.includeContainer,{filter:Oe.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):n=yt(e,t.includeContainer,Oe.bind(null,t)),n},oe=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,ke)===!1?!1:We(t,e)},Tn=gt.concat("iframe:not([inert]):not([inert] *)").join(","),De=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,Tn)===!1?!1:Oe(t,e)};/*!
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.
|
|
2
|
-
import{d as p,c as d,r as u,n as T,o as r,a as B,t as x,b as g,w as m,T as _e,e as h,_ as k,u as Be,i as Ye,f as Xe,g as O,h as $,j as i,k as l,l as K,m as me,p as V,q as U,s as se,v as z,x as ye,y as $e,z as Ze,A as et,F as M,B as E,C as W,D as ie,E as b,G as He,H as D,I as Oe,J as re,K as R,L as le,M as tt,N as Fe,O as he,P as ne,Q as De,R as X,S as nt,U as at,V as ot,W as je,X as Ue,Y as st,Z as it,$ as rt,a0 as qe,a1 as lt,a2 as ct,a3 as ut,a4 as dt,a5 as xe}from"./framework.DSg0KOwT.js";const vt=p({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,n)=>(r(),d("span",{class:T(["VPBadge",e.type])},[u(t.$slots,"default",{},()=>[B(x(e.text),1)])],2))}}),ft={key:0,class:"VPBackdrop"},mt=p({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(r(),g(_e,{name:"fade"},{default:m(()=>[e.show?(r(),d("div",ft)):h("",!0)]),_:1}))}}),ht=k(mt,[["__scopeId","data-v-c79a1216"]]),L=Be;function pt(e,t){let n,a=!1;return()=>{n&&clearTimeout(n),a?n=setTimeout(e,t):(e(),(a=!0)&&setTimeout(()=>a=!1,t))}}function pe(e){return e.startsWith("/")?e:`/${e}`}function Pe(e){const{pathname:t,search:n,hash:a,protocol:o}=new URL(e,"http://a.com");if(Ye(e)||e.startsWith("#")||!o.startsWith("http")||!Xe(t))return e;const{site:c}=L(),s=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,c.value.cleanUrls?"":".html")}${n}${a}`);return O(s)}function Z({correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:a,theme:o,hash:c}=L(),s=$(()=>{var v,y;return{label:(v=t.value.locales[n.value])==null?void 0:v.label,link:((y=t.value.locales[n.value])==null?void 0:y.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:$(()=>Object.entries(t.value.locales).flatMap(([v,y])=>s.value.label===y.label?[]:{text:y.label,link:bt(y.link||(v==="root"?"/":`/${v}/`),o.value.i18nRouting!==!1&&e,a.value.relativePath.slice(s.value.link.length-1),!t.value.cleanUrls)+c.value})),currentLang:s}}function bt(e,t,n,a){return t?e.replace(/\/$/,"")+pe(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,a?".html":"")):e}const gt={class:"NotFound"},kt={class:"code"},_t={class:"title"},yt={class:"quote"},$t={class:"action"},Pt=["href","aria-label"],Lt=p({__name:"NotFound",setup(e){const{theme:t}=L(),{currentLang:n}=Z();return(a,o)=>{var c,s,f,v,y;return r(),d("div",gt,[i("p",kt,x(((c=l(t).notFound)==null?void 0:c.code)??"404"),1),i("h1",_t,x(((s=l(t).notFound)==null?void 0:s.title)??"PAGE NOT FOUND"),1),o[0]||(o[0]=i("div",{class:"divider"},null,-1)),i("blockquote",yt,x(((f=l(t).notFound)==null?void 0:f.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),i("div",$t,[i("a",{class:"link",href:l(O)(l(n).link),"aria-label":((v=l(t).notFound)==null?void 0:v.linkLabel)??"go to home"},x(((y=l(t).notFound)==null?void 0:y.linkText)??"Take me home"),9,Pt)])])}}}),St=k(Lt,[["__scopeId","data-v-d6be1790"]]);function Ge(e,t){if(Array.isArray(e))return ee(e);if(e==null)return[];t=pe(t);const n=Object.keys(e).sort((o,c)=>c.split("/").length-o.split("/").length).find(o=>t.startsWith(pe(o))),a=n?e[n]:[];return Array.isArray(a)?ee(a):ee(a.items,a.base)}function Vt(e){const t=[];let n=0;for(const a in e){const o=e[a];if(o.items){n=t.push(o);continue}t[n]||t.push({items:[]}),t[n].items.push(o)}return t}function wt(e){const t=[];function n(a){for(const o of a)o.text&&o.link&&t.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&n(o.items)}return n(e),t}function be(e,t){return Array.isArray(t)?t.some(n=>be(e,n)):K(e,t.link)?!0:t.items?be(e,t.items):!1}function ee(e,t){return[...e].map(n=>{const a={...n},o=a.base||t;return o&&a.link&&(a.link=o+a.link),a.items&&(a.items=ee(a.items,o)),a})}function q(){const{frontmatter:e,page:t,theme:n}=L(),a=me("(min-width: 960px)"),o=V(!1),c=$(()=>{const A=n.value.sidebar,H=t.value.relativePath;return A?Ge(A,H):[]}),s=V(c.value);U(c,(A,H)=>{JSON.stringify(A)!==JSON.stringify(H)&&(s.value=c.value)});const f=$(()=>e.value.sidebar!==!1&&s.value.length>0&&e.value.layout!=="home"),v=$(()=>y?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),y=$(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),S=$(()=>f.value&&a.value),_=$(()=>f.value?Vt(s.value):[]);function P(){o.value=!0}function w(){o.value=!1}function N(){o.value?w():P()}return{isOpen:o,sidebar:s,sidebarGroups:_,hasSidebar:f,hasAside:y,leftAside:v,isSidebarEnabled:S,open:P,close:w,toggle:N}}function Tt(e,t){let n;se(()=>{n=e.value?document.activeElement:void 0}),z(()=>{window.addEventListener("keyup",a)}),ye(()=>{window.removeEventListener("keyup",a)});function a(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function xt(e){const{page:t,hash:n}=L(),a=V(!1),o=$(()=>e.value.collapsed!=null),c=$(()=>!!e.value.link),s=V(!1),f=()=>{s.value=K(t.value.relativePath,e.value.link)};U([t,e,n],f),z(f);const v=$(()=>s.value?!0:e.value.items?be(t.value.relativePath,e.value.items):!1),y=$(()=>!!(e.value.items&&e.value.items.length));se(()=>{a.value=!!(o.value&&e.value.collapsed)}),$e(()=>{(s.value||v.value)&&(a.value=!1)});function S(){o.value&&(a.value=!a.value)}return{collapsed:a,collapsible:o,isLink:c,isActiveLink:s,hasActiveLink:v,hasChildren:y,toggle:S}}function Mt(){const{hasSidebar:e}=q(),t=me("(min-width: 960px)"),n=me("(min-width: 1280px)");return{isAsideEnabled:$(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const Nt=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,ge=[];function Re(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function Le(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const a=Number(n.tagName[1]);return{element:n,title:At(n),link:"#"+n.id,level:a}});return It(t,e)}function At(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(Nt.test(n.className))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function It(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[a,o]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;return Bt(e,a,o)}function Ct(e,t){const{isAsideEnabled:n}=Mt(),a=pt(c,100);let o=null;z(()=>{requestAnimationFrame(c),window.addEventListener("scroll",a)}),Ze(()=>{s(location.hash)}),ye(()=>{window.removeEventListener("scroll",a)});function c(){if(!n.value)return;const f=window.scrollY,v=window.innerHeight,y=document.body.offsetHeight,S=Math.abs(f+v-y)<1,_=ge.map(({element:w,link:N})=>({link:N,top:Et(w)})).filter(({top:w})=>!Number.isNaN(w)).sort((w,N)=>w.top-N.top);if(!_.length){s(null);return}if(f<1){s(null);return}if(S){s(_[_.length-1].link);return}let P=null;for(const{link:w,top:N}of _){if(N>f+et()+4)break;P=w}s(P)}function s(f){o&&o.classList.remove("active"),f==null?o=null:o=e.value.querySelector(`a[href="${decodeURIComponent(f)}"]`);const v=o;v?(v.classList.add("active"),t.value.style.top=v.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function Et(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}function Bt(e,t,n){ge.length=0;const a=[],o=[];return e.forEach(c=>{const s={...c,children:[]};let f=o[o.length-1];for(;f&&f.level>=s.level;)o.pop(),f=o[o.length-1];if(s.element.classList.contains("ignore-header")||f&&"shouldIgnore"in f){o.push({level:s.level,shouldIgnore:!0});return}s.level>n||s.level<t||(ge.push({element:s.element,link:s.link}),f?f.children.push(s):a.push(s),o.push(s))}),a}const Ht=["href","title"],Ot=p({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(e){function t({target:n}){const a=n.href.split("#")[1],o=document.getElementById(decodeURIComponent(a));o==null||o.focus({preventScroll:!0})}return(n,a)=>{const o=W("VPDocOutlineItem",!0);return r(),d("ul",{class:T(["VPDocOutlineItem",e.root?"root":"nested"])},[(r(!0),d(M,null,E(e.headers,({children:c,link:s,title:f})=>(r(),d("li",null,[i("a",{class:"outline-link",href:s,onClick:t,title:f},x(f),9,Ht),c!=null&&c.length?(r(),g(o,{key:0,headers:c},null,8,["headers"])):h("",!0)]))),256))],2)}}}),ze=k(Ot,[["__scopeId","data-v-b933a997"]]),Ft={class:"content"},Dt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},jt=p({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=L(),a=He([]);ie(()=>{a.value=Le(t.value.outline??n.value.outline)});const o=V(),c=V();return Ct(o,c),(s,f)=>(r(),d("nav",{"aria-labelledby":"doc-outline-aria-label",class:T(["VPDocAsideOutline",{"has-outline":a.value.length>0}]),ref_key:"container",ref:o},[i("div",Ft,[i("div",{class:"outline-marker",ref_key:"marker",ref:c},null,512),i("div",Dt,x(l(Re)(l(n))),1),b(ze,{headers:a.value,root:!0},null,8,["headers"])])],2))}}),Ut=k(jt,[["__scopeId","data-v-a5bbad30"]]),qt={class:"VPDocAsideCarbonAds"},Gt=p({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,a)=>(r(),d("div",qt,[b(l(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),Rt={class:"VPDocAside"},zt=p({__name:"VPDocAside",setup(e){const{theme:t}=L();return(n,a)=>(r(),d("div",Rt,[u(n.$slots,"aside-top",{},void 0,!0),u(n.$slots,"aside-outline-before",{},void 0,!0),b(Ut),u(n.$slots,"aside-outline-after",{},void 0,!0),a[0]||(a[0]=i("div",{class:"spacer"},null,-1)),u(n.$slots,"aside-ads-before",{},void 0,!0),l(t).carbonAds?(r(),g(Gt,{key:0,"carbon-ads":l(t).carbonAds},null,8,["carbon-ads"])):h("",!0),u(n.$slots,"aside-ads-after",{},void 0,!0),u(n.$slots,"aside-bottom",{},void 0,!0)]))}}),Kt=k(zt,[["__scopeId","data-v-3f215769"]]);function Wt(){const{theme:e,page:t}=L();return $(()=>{const{text:n="Edit this page",pattern:a=""}=e.value.editLink||{};let o;return typeof a=="function"?o=a(t.value):o=a.replace(/:path/g,t.value.filePath),{url:o,text:n}})}function Jt(){const{page:e,theme:t,frontmatter:n}=L();return $(()=>{var y,S,_,P,w,N,A,H;const a=Ge(t.value.sidebar,e.value.relativePath),o=wt(a),c=Qt(o,F=>F.link.replace(/[?#].*$/,"")),s=c.findIndex(F=>K(e.value.relativePath,F.link)),f=((y=t.value.docFooter)==null?void 0:y.prev)===!1&&!n.value.prev||n.value.prev===!1,v=((S=t.value.docFooter)==null?void 0:S.next)===!1&&!n.value.next||n.value.next===!1;return{prev:f?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((_=c[s-1])==null?void 0:_.docFooterText)??((P=c[s-1])==null?void 0:P.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((w=c[s-1])==null?void 0:w.link)},next:v?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((N=c[s+1])==null?void 0:N.docFooterText)??((A=c[s+1])==null?void 0:A.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((H=c[s+1])==null?void 0:H.link)}}})}function Qt(e,t){const n=new Set;return e.filter(a=>{const o=t(a);return n.has(o)?!1:n.add(o)})}const j=p({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=$(()=>t.tag??(t.href?"a":"span")),a=$(()=>t.href&&Oe.test(t.href)||t.target==="_blank");return(o,c)=>(r(),g(D(n.value),{class:T(["VPLink",{link:e.href,"vp-external-link-icon":a.value,"no-icon":e.noIcon}]),href:e.href?l(Pe)(e.href):void 0,target:e.target??(a.value?"_blank":void 0),rel:e.rel??(a.value?"noreferrer":void 0)},{default:m(()=>[u(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Yt={class:"VPLastUpdated"},Xt=["datetime"],Zt=p({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,lang:a}=L(),o=$(()=>new Date(n.value.lastUpdated)),c=$(()=>o.value.toISOString()),s=V("");return z(()=>{se(()=>{var f,v,y;s.value=new Intl.DateTimeFormat((v=(f=t.value.lastUpdated)==null?void 0:f.formatOptions)!=null&&v.forceLocale?a.value:void 0,((y=t.value.lastUpdated)==null?void 0:y.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(o.value)})}),(f,v)=>{var y;return r(),d("p",Yt,[B(x(((y=l(t).lastUpdated)==null?void 0:y.text)||l(t).lastUpdatedText||"Last updated")+": ",1),i("time",{datetime:c.value},x(s.value),9,Xt)])}}}),en=k(Zt,[["__scopeId","data-v-e98dd255"]]),tn={key:0,class:"VPDocFooter"},nn={key:0,class:"edit-info"},an={key:0,class:"edit-link"},on={key:1,class:"last-updated"},sn={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},rn={class:"pager"},ln=["innerHTML"],cn=["innerHTML"],un={class:"pager"},dn=["innerHTML"],vn=["innerHTML"],fn=p({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:a}=L(),o=Wt(),c=Jt(),s=$(()=>t.value.editLink&&a.value.editLink!==!1),f=$(()=>n.value.lastUpdated),v=$(()=>s.value||f.value||c.value.prev||c.value.next);return(y,S)=>{var _,P,w,N;return v.value?(r(),d("footer",tn,[u(y.$slots,"doc-footer-before",{},void 0,!0),s.value||f.value?(r(),d("div",nn,[s.value?(r(),d("div",an,[b(j,{class:"edit-link-button",href:l(o).url,"no-icon":!0},{default:m(()=>[S[0]||(S[0]=i("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),B(" "+x(l(o).text),1)]),_:1},8,["href"])])):h("",!0),f.value?(r(),d("div",on,[b(en)])):h("",!0)])):h("",!0),(_=l(c).prev)!=null&&_.link||(P=l(c).next)!=null&&P.link?(r(),d("nav",sn,[S[1]||(S[1]=i("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),i("div",rn,[(w=l(c).prev)!=null&&w.link?(r(),g(j,{key:0,class:"pager-link prev",href:l(c).prev.link},{default:m(()=>{var A;return[i("span",{class:"desc",innerHTML:((A=l(t).docFooter)==null?void 0:A.prev)||"Previous page"},null,8,ln),i("span",{class:"title",innerHTML:l(c).prev.text},null,8,cn)]}),_:1},8,["href"])):h("",!0)]),i("div",un,[(N=l(c).next)!=null&&N.link?(r(),g(j,{key:0,class:"pager-link next",href:l(c).next.link},{default:m(()=>{var A;return[i("span",{class:"desc",innerHTML:((A=l(t).docFooter)==null?void 0:A.next)||"Next page"},null,8,dn),i("span",{class:"title",innerHTML:l(c).next.text},null,8,vn)]}),_:1},8,["href"])):h("",!0)])])):h("",!0)])):h("",!0)}}}),mn=k(fn,[["__scopeId","data-v-e257564d"]]),hn={class:"container"},pn={class:"aside-container"},bn={class:"aside-content"},gn={class:"content"},kn={class:"content-container"},_n={class:"main"},yn=p({__name:"VPDoc",setup(e){const{theme:t}=L(),n=re(),{hasSidebar:a,hasAside:o,leftAside:c}=q(),s=$(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(f,v)=>{const y=W("Content");return r(),d("div",{class:T(["VPDoc",{"has-sidebar":l(a),"has-aside":l(o)}])},[u(f.$slots,"doc-top",{},void 0,!0),i("div",hn,[l(o)?(r(),d("div",{key:0,class:T(["aside",{"left-aside":l(c)}])},[v[0]||(v[0]=i("div",{class:"aside-curtain"},null,-1)),i("div",pn,[i("div",bn,[b(Kt,null,{"aside-top":m(()=>[u(f.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":m(()=>[u(f.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":m(()=>[u(f.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":m(()=>[u(f.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":m(()=>[u(f.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":m(()=>[u(f.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),i("div",gn,[i("div",kn,[u(f.$slots,"doc-before",{},void 0,!0),i("main",_n,[b(y,{class:T(["vp-doc",[s.value,l(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),b(mn,null,{"doc-footer-before":m(()=>[u(f.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),u(f.$slots,"doc-after",{},void 0,!0)])])]),u(f.$slots,"doc-bottom",{},void 0,!0)],2)}}}),$n=k(yn,[["__scopeId","data-v-39a288b8"]]),Pn=p({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(e){const t=e,n=$(()=>t.href&&Oe.test(t.href)),a=$(()=>t.tag||(t.href?"a":"button"));return(o,c)=>(r(),g(D(a.value),{class:T(["VPButton",[e.size,e.theme]]),href:e.href?l(Pe)(e.href):void 0,target:t.target??(n.value?"_blank":void 0),rel:t.rel??(n.value?"noreferrer":void 0)},{default:m(()=>[B(x(e.text),1)]),_:1},8,["class","href","target","rel"]))}}),Ln=k(Pn,[["__scopeId","data-v-fa7799d5"]]),Sn=["src","alt"],Vn=p({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const a=W("VPImage",!0);return e.image?(r(),d(M,{key:0},[typeof e.image=="string"||"src"in e.image?(r(),d("img",R({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:l(O)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,Sn)):(r(),d(M,{key:1},[b(a,R({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),b(a,R({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}}),ae=k(Vn,[["__scopeId","data-v-8426fc1a"]]),wn={class:"container"},Tn={class:"main"},xn={class:"heading"},Mn=["innerHTML"],Nn=["innerHTML"],An=["innerHTML"],In={key:0,class:"actions"},Cn={key:0,class:"image"},En={class:"image-container"},Bn=p({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=le("hero-image-slot-exists");return(n,a)=>(r(),d("div",{class:T(["VPHero",{"has-image":e.image||l(t)}])},[i("div",wn,[i("div",Tn,[u(n.$slots,"home-hero-info-before",{},void 0,!0),u(n.$slots,"home-hero-info",{},()=>[i("h1",xn,[e.name?(r(),d("span",{key:0,innerHTML:e.name,class:"name clip"},null,8,Mn)):h("",!0),e.text?(r(),d("span",{key:1,innerHTML:e.text,class:"text"},null,8,Nn)):h("",!0)]),e.tagline?(r(),d("p",{key:0,innerHTML:e.tagline,class:"tagline"},null,8,An)):h("",!0)],!0),u(n.$slots,"home-hero-info-after",{},void 0,!0),e.actions?(r(),d("div",In,[(r(!0),d(M,null,E(e.actions,o=>(r(),d("div",{key:o.link,class:"action"},[b(Ln,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):h("",!0),u(n.$slots,"home-hero-actions-after",{},void 0,!0)]),e.image||l(t)?(r(),d("div",Cn,[i("div",En,[a[0]||(a[0]=i("div",{class:"image-bg"},null,-1)),u(n.$slots,"home-hero-image",{},()=>[e.image?(r(),g(ae,{key:0,class:"image-src",image:e.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}}),Hn=k(Bn,[["__scopeId","data-v-4f9c455b"]]),On=p({__name:"VPHomeHero",setup(e){const{frontmatter:t}=L();return(n,a)=>l(t).hero?(r(),g(Hn,{key:0,class:"VPHomeHero",name:l(t).hero.name,text:l(t).hero.text,tagline:l(t).hero.tagline,image:l(t).hero.image,actions:l(t).hero.actions},{"home-hero-info-before":m(()=>[u(n.$slots,"home-hero-info-before")]),"home-hero-info":m(()=>[u(n.$slots,"home-hero-info")]),"home-hero-info-after":m(()=>[u(n.$slots,"home-hero-info-after")]),"home-hero-actions-after":m(()=>[u(n.$slots,"home-hero-actions-after")]),"home-hero-image":m(()=>[u(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),Fn={class:"box"},Dn={key:0,class:"icon"},jn=["innerHTML"],Un=["innerHTML"],qn=["innerHTML"],Gn={key:4,class:"link-text"},Rn={class:"link-text-value"},zn=p({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(r(),g(j,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:m(()=>[i("article",Fn,[typeof e.icon=="object"&&e.icon.wrap?(r(),d("div",Dn,[b(ae,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(r(),g(ae,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(r(),d("div",{key:2,class:"icon",innerHTML:e.icon},null,8,jn)):h("",!0),i("h2",{class:"title",innerHTML:e.title},null,8,Un),e.details?(r(),d("p",{key:3,class:"details",innerHTML:e.details},null,8,qn)):h("",!0),e.linkText?(r(),d("div",Gn,[i("p",Rn,[B(x(e.linkText)+" ",1),n[0]||(n[0]=i("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Kn=k(zn,[["__scopeId","data-v-a3976bdc"]]),Wn={key:0,class:"VPFeatures"},Jn={class:"container"},Qn={class:"items"},Yn=p({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=$(()=>{const a=t.features.length;if(a){if(a===2)return"grid-2";if(a===3)return"grid-3";if(a%3===0)return"grid-6";if(a>3)return"grid-4"}else return});return(a,o)=>e.features?(r(),d("div",Wn,[i("div",Jn,[i("div",Qn,[(r(!0),d(M,null,E(e.features,c=>(r(),d("div",{key:c.title,class:T(["item",[n.value]])},[b(Kn,{icon:c.icon,title:c.title,details:c.details,link:c.link,"link-text":c.linkText,rel:c.rel,target:c.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):h("",!0)}}),Xn=k(Yn,[["__scopeId","data-v-a6181336"]]),Zn=p({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=L();return(n,a)=>l(t).features?(r(),g(Xn,{key:0,class:"VPHomeFeatures",features:l(t).features},null,8,["features"])):h("",!0)}}),ea=p({__name:"VPHomeContent",setup(e){const{width:t}=tt({initialWidth:0,includeScrollbar:!1});return(n,a)=>(r(),d("div",{class:"vp-doc container",style:Fe(l(t)?{"--vp-offset":`calc(50% - ${l(t)/2}px)`}:{})},[u(n.$slots,"default",{},void 0,!0)],4))}}),ta=k(ea,[["__scopeId","data-v-8e2d4988"]]),na=p({__name:"VPHome",setup(e){const{frontmatter:t,theme:n}=L();return(a,o)=>{const c=W("Content");return r(),d("div",{class:T(["VPHome",{"external-link-icon-enabled":l(n).externalLinkIcon}])},[u(a.$slots,"home-hero-before",{},void 0,!0),b(On,null,{"home-hero-info-before":m(()=>[u(a.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":m(()=>[u(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":m(()=>[u(a.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":m(()=>[u(a.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":m(()=>[u(a.$slots,"home-hero-image",{},void 0,!0)]),_:3}),u(a.$slots,"home-hero-after",{},void 0,!0),u(a.$slots,"home-features-before",{},void 0,!0),b(Zn),u(a.$slots,"home-features-after",{},void 0,!0),l(t).markdownStyles!==!1?(r(),g(ta,{key:0},{default:m(()=>[b(c)]),_:1})):(r(),g(c,{key:1}))],2)}}}),aa=k(na,[["__scopeId","data-v-8b561e3d"]]),oa={},sa={class:"VPPage"};function ia(e,t){const n=W("Content");return r(),d("div",sa,[u(e.$slots,"page-top"),b(n),u(e.$slots,"page-bottom")])}const ra=k(oa,[["render",ia]]),la=p({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=L(),{hasSidebar:a}=q();return(o,c)=>(r(),d("div",{class:T(["VPContent",{"has-sidebar":l(a),"is-home":l(n).layout==="home"}]),id:"VPContent"},[l(t).isNotFound?u(o.$slots,"not-found",{},()=>[b(St)],!0,0):l(n).layout==="page"?(r(),g(ra,{key:1},{"page-top":m(()=>[u(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":m(()=>[u(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):l(n).layout==="home"?(r(),g(aa,{key:2},{"home-hero-before":m(()=>[u(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":m(()=>[u(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":m(()=>[u(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":m(()=>[u(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":m(()=>[u(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":m(()=>[u(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":m(()=>[u(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":m(()=>[u(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":m(()=>[u(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):l(n).layout&&l(n).layout!=="doc"?(r(),g(D(l(n).layout),{key:3})):(r(),g($n,{key:4},{"doc-top":m(()=>[u(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":m(()=>[u(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":m(()=>[u(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":m(()=>[u(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":m(()=>[u(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":m(()=>[u(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":m(()=>[u(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":m(()=>[u(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":m(()=>[u(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":m(()=>[u(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":m(()=>[u(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),ca=k(la,[["__scopeId","data-v-1428d186"]]),ua={class:"container"},da=["innerHTML"],va=["innerHTML"],fa=p({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=q();return(o,c)=>l(t).footer&&l(n).footer!==!1?(r(),d("footer",{key:0,class:T(["VPFooter",{"has-sidebar":l(a)}])},[i("div",ua,[l(t).footer.message?(r(),d("p",{key:0,class:"message",innerHTML:l(t).footer.message},null,8,da)):h("",!0),l(t).footer.copyright?(r(),d("p",{key:1,class:"copyright",innerHTML:l(t).footer.copyright},null,8,va)):h("",!0)])],2)):h("",!0)}}),ma=k(fa,[["__scopeId","data-v-e315a0ad"]]);function ha(){const{theme:e,frontmatter:t}=L(),n=He([]),a=$(()=>n.value.length>0);return ie(()=>{n.value=Le(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:a}}const pa={class:"menu-text"},ba={class:"header"},ga={class:"outline"},ka=p({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=L(),a=V(!1),o=V(0),c=V(),s=V();function f(_){var P;(P=c.value)!=null&&P.contains(_.target)||(a.value=!1)}U(a,_=>{if(_){document.addEventListener("click",f);return}document.removeEventListener("click",f)}),he("Escape",()=>{a.value=!1}),ie(()=>{a.value=!1});function v(){a.value=!a.value,o.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function y(_){_.target.classList.contains("outline-link")&&(s.value&&(s.value.style.transition="none"),ne(()=>{a.value=!1}))}function S(){a.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(_,P)=>(r(),d("div",{class:"VPLocalNavOutlineDropdown",style:Fe({"--vp-vh":o.value+"px"}),ref_key:"main",ref:c},[e.headers.length>0?(r(),d("button",{key:0,onClick:v,class:T({open:a.value})},[i("span",pa,x(l(Re)(l(n))),1),P[0]||(P[0]=i("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(r(),d("button",{key:1,onClick:S},x(l(n).returnToTopLabel||"Return to top"),1)),b(_e,{name:"flyout"},{default:m(()=>[a.value?(r(),d("div",{key:0,ref_key:"items",ref:s,class:"items",onClick:y},[i("div",ba,[i("a",{class:"top-link",href:"#",onClick:S},x(l(n).returnToTopLabel||"Return to top"),1)]),i("div",ga,[b(ze,{headers:e.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}}),_a=k(ka,[["__scopeId","data-v-8a42e2b4"]]),ya={class:"container"},$a=["aria-expanded"],Pa={class:"menu-text"},La=p({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=q(),{headers:o}=ha(),{y:c}=De(),s=V(0);z(()=>{s.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),ie(()=>{o.value=Le(n.value.outline??t.value.outline)});const f=$(()=>o.value.length===0),v=$(()=>f.value&&!a.value),y=$(()=>({VPLocalNav:!0,"has-sidebar":a.value,empty:f.value,fixed:v.value}));return(S,_)=>l(n).layout!=="home"&&(!v.value||l(c)>=s.value)?(r(),d("div",{key:0,class:T(y.value)},[i("div",ya,[l(a)?(r(),d("button",{key:0,class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:_[0]||(_[0]=P=>S.$emit("open-menu"))},[_[1]||(_[1]=i("span",{class:"vpi-align-left menu-icon"},null,-1)),i("span",Pa,x(l(t).sidebarMenuLabel||"Menu"),1)],8,$a)):h("",!0),b(_a,{headers:l(o),navHeight:s.value},null,8,["headers","navHeight"])])],2)):h("",!0)}}),Sa=k(La,[["__scopeId","data-v-a6f0e41e"]]);function Va(){const e=V(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function a(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const c=re();return U(()=>c.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:a}}const wa={},Ta={class:"VPSwitch",type:"button",role:"switch"},xa={class:"check"},Ma={key:0,class:"icon"};function Na(e,t){return r(),d("button",Ta,[i("span",xa,[e.$slots.default?(r(),d("span",Ma,[u(e.$slots,"default",{},void 0,!0)])):h("",!0)])])}const Aa=k(wa,[["render",Na],["__scopeId","data-v-1d5665e3"]]),Ia=p({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=L(),a=le("toggle-appearance",()=>{t.value=!t.value}),o=V("");return $e(()=>{o.value=t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme"}),(c,s)=>(r(),g(Aa,{title:o.value,class:"VPSwitchAppearance","aria-checked":l(t),onClick:l(a)},{default:m(()=>[...s[0]||(s[0]=[i("span",{class:"vpi-sun sun"},null,-1),i("span",{class:"vpi-moon moon"},null,-1)])]),_:1},8,["title","aria-checked","onClick"]))}}),Se=k(Ia,[["__scopeId","data-v-5337faa4"]]),Ca={key:0,class:"VPNavBarAppearance"},Ea=p({__name:"VPNavBarAppearance",setup(e){const{site:t}=L();return(n,a)=>l(t).appearance&&l(t).appearance!=="force-dark"&&l(t).appearance!=="force-auto"?(r(),d("div",Ca,[b(Se)])):h("",!0)}}),Ba=k(Ea,[["__scopeId","data-v-6c893767"]]),Ve=V();let Ke=!1,ve=0;function Ha(e){const t=V(!1);if(X){!Ke&&Oa(),ve++;const n=U(Ve,a=>{var o,c,s;a===e.el.value||(o=e.el.value)!=null&&o.contains(a)?(t.value=!0,(c=e.onFocus)==null||c.call(e)):(t.value=!1,(s=e.onBlur)==null||s.call(e))});ye(()=>{n(),ve--,ve||Fa()})}return nt(t)}function Oa(){document.addEventListener("focusin",We),Ke=!0,Ve.value=document.activeElement}function Fa(){document.removeEventListener("focusin",We)}function We(){Ve.value=document.activeElement}const Da={class:"VPMenuLink"},ja=["innerHTML"],Ua=p({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(r(),d("div",Da,[b(j,{class:T({active:l(K)(l(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon},{default:m(()=>[i("span",{innerHTML:e.item.text},null,8,ja)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),ce=k(Ua,[["__scopeId","data-v-35975db6"]]),qa={class:"VPMenuGroup"},Ga={key:0,class:"title"},Ra=p({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(r(),d("div",qa,[e.text?(r(),d("p",Ga,x(e.text),1)):h("",!0),(r(!0),d(M,null,E(e.items,a=>(r(),d(M,null,["link"in a?(r(),g(ce,{key:0,item:a},null,8,["item"])):h("",!0)],64))),256))]))}}),za=k(Ra,[["__scopeId","data-v-69e747b5"]]),Ka={class:"VPMenu"},Wa={key:0,class:"items"},Ja=p({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(r(),d("div",Ka,[e.items?(r(),d("div",Wa,[(r(!0),d(M,null,E(e.items,a=>(r(),d(M,{key:JSON.stringify(a)},["link"in a?(r(),g(ce,{key:0,item:a},null,8,["item"])):"component"in a?(r(),g(D(a.component),R({key:1,ref_for:!0},a.props),null,16)):(r(),g(za,{key:2,text:a.text,items:a.items},null,8,["text","items"]))],64))),128))])):h("",!0),u(t.$slots,"default",{},void 0,!0)]))}}),Qa=k(Ja,[["__scopeId","data-v-b98bc113"]]),Ya=["aria-expanded","aria-label"],Xa={key:0,class:"text"},Za=["innerHTML"],eo={key:1,class:"vpi-more-horizontal icon"},to={class:"menu"},no=p({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=V(!1),n=V();Ha({el:n,onBlur:a});function a(){t.value=!1}return(o,c)=>(r(),d("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:c[1]||(c[1]=s=>t.value=!0),onMouseleave:c[2]||(c[2]=s=>t.value=!1)},[i("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:c[0]||(c[0]=s=>t.value=!t.value)},[e.button||e.icon?(r(),d("span",Xa,[e.icon?(r(),d("span",{key:0,class:T([e.icon,"option-icon"])},null,2)):h("",!0),e.button?(r(),d("span",{key:1,innerHTML:e.button},null,8,Za)):h("",!0),c[3]||(c[3]=i("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(r(),d("span",eo))],8,Ya),i("div",to,[b(Qa,{items:e.items},{default:m(()=>[u(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),we=k(no,[["__scopeId","data-v-cf11d7a2"]]),ao=["href","aria-label","innerHTML"],oo=p({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,n=V();z(async()=>{var c;await ne();const o=(c=n.value)==null?void 0:c.children[0];o instanceof HTMLElement&&o.className.startsWith("vpi-social-")&&(getComputedStyle(o).maskImage||getComputedStyle(o).webkitMaskImage)==="none"&&o.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${t.icon}.svg')`)});const a=$(()=>typeof t.icon=="object"?t.icon.svg:`<span class="vpi-social-${t.icon}"></span>`);return(o,c)=>(r(),d("a",{ref_key:"el",ref:n,class:"VPSocialLink no-icon",href:e.link,"aria-label":e.ariaLabel??(typeof e.icon=="string"?e.icon:""),target:"_blank",rel:"noopener",innerHTML:a.value},null,8,ao))}}),so=k(oo,[["__scopeId","data-v-bd121fe5"]]),io={class:"VPSocialLinks"},ro=p({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,n)=>(r(),d("div",io,[(r(!0),d(M,null,E(e.links,({link:a,icon:o,ariaLabel:c})=>(r(),g(so,{key:a,icon:o,link:a,ariaLabel:c},null,8,["icon","link","ariaLabel"]))),128))]))}}),Te=k(ro,[["__scopeId","data-v-7bc22406"]]),lo={key:0,class:"group translations"},co={class:"trans-title"},uo={key:1,class:"group"},vo={class:"item appearance"},fo={class:"label"},mo={class:"appearance-action"},ho={key:2,class:"group"},po={class:"item social-links"},bo=p({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=L(),{localeLinks:a,currentLang:o}=Z({correspondingLink:!0}),c=$(()=>a.value.length&&o.value.label||t.value.appearance||n.value.socialLinks);return(s,f)=>c.value?(r(),g(we,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:m(()=>[l(a).length&&l(o).label?(r(),d("div",lo,[i("p",co,x(l(o).label),1),(r(!0),d(M,null,E(l(a),v=>(r(),g(ce,{key:v.link,item:v},null,8,["item"]))),128))])):h("",!0),l(t).appearance&&l(t).appearance!=="force-dark"&&l(t).appearance!=="force-auto"?(r(),d("div",uo,[i("div",vo,[i("p",fo,x(l(n).darkModeSwitchLabel||"Appearance"),1),i("div",mo,[b(Se)])])])):h("",!0),l(n).socialLinks?(r(),d("div",ho,[i("div",po,[b(Te,{class:"social-links-list",links:l(n).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}}),go=k(bo,[["__scopeId","data-v-bb2aa2f0"]]),ko=["aria-expanded"],_o=p({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(r(),d("button",{type:"button",class:T(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=a=>t.$emit("click"))},[...n[1]||(n[1]=[i("span",{class:"container"},[i("span",{class:"top"}),i("span",{class:"middle"}),i("span",{class:"bottom"})],-1)])],10,ko))}}),yo=k(_o,[["__scopeId","data-v-e5dd9c1c"]]),$o=["innerHTML"],Po=p({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(r(),g(j,{class:T({VPNavBarMenuLink:!0,active:l(K)(l(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,tabindex:"0"},{default:m(()=>[i("span",{innerHTML:e.item.text},null,8,$o)]),_:1},8,["class","href","target","rel","no-icon"]))}}),Lo=k(Po,[["__scopeId","data-v-e56f3d57"]]),So=p({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=L(),a=c=>"component"in c?!1:"link"in c?K(n.value.relativePath,c.link,!!t.item.activeMatch):c.items.some(a),o=$(()=>a(t.item));return(c,s)=>(r(),g(we,{class:T({VPNavBarMenuGroup:!0,active:l(K)(l(n).relativePath,e.item.activeMatch,!!e.item.activeMatch)||o.value}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),Vo={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},wo=p({__name:"VPNavBarMenu",setup(e){const{theme:t}=L();return(n,a)=>l(t).nav?(r(),d("nav",Vo,[a[0]||(a[0]=i("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(r(!0),d(M,null,E(l(t).nav,o=>(r(),d(M,{key:JSON.stringify(o)},["link"in o?(r(),g(Lo,{key:0,item:o},null,8,["item"])):"component"in o?(r(),g(D(o.component),R({key:1,ref_for:!0},o.props),null,16)):(r(),g(So,{key:2,item:o},null,8,["item"]))],64))),128))])):h("",!0)}}),To=k(wo,[["__scopeId","data-v-dc692963"]]);function xo(e){const{localeIndex:t,theme:n}=L();function a(o){var N,A,H;const c=o.split("."),s=(N=n.value.search)==null?void 0:N.options,f=s&&typeof s=="object",v=f&&((H=(A=s.locales)==null?void 0:A[t.value])==null?void 0:H.translations)||null,y=f&&s.translations||null;let S=v,_=y,P=e;const w=c.pop();for(const F of c){let G=null;const J=P==null?void 0:P[F];J&&(G=P=J);const ue=_==null?void 0:_[F];ue&&(G=_=ue);const de=S==null?void 0:S[F];de&&(G=S=de),J||(P=G),ue||(_=G),de||(S=G)}return(S==null?void 0:S[w])??(_==null?void 0:_[w])??(P==null?void 0:P[w])??""}return a}const Mo=["aria-label"],No={class:"DocSearch-Button-Container"},Ao={class:"DocSearch-Button-Placeholder"},Me=p({__name:"VPNavBarSearchButton",setup(e){const n=xo({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(a,o)=>(r(),d("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":l(n)("button.buttonAriaLabel")},[i("span",No,[o[0]||(o[0]=i("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),i("span",Ao,x(l(n)("button.buttonText")),1)]),o[1]||(o[1]=i("span",{class:"DocSearch-Button-Keys"},[i("kbd",{class:"DocSearch-Button-Key"}),i("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,Mo))}}),Io={class:"VPNavBarSearch"},Co={id:"local-search"},Eo={key:1,id:"docsearch"},Bo=p({__name:"VPNavBarSearch",setup(e){const t=at(()=>ot(()=>import("./VPLocalSearchBox.BS4cSmtW.js"),__vite__mapDeps([0,1]))),n=()=>null,{theme:a}=L(),o=V(!1),c=V(!1);z(()=>{});function s(){o.value||(o.value=!0,setTimeout(f,16))}function f(){const _=new Event("keydown");_.key="k",_.metaKey=!0,window.dispatchEvent(_),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||f()},16)}function v(_){const P=_.target,w=P.tagName;return P.isContentEditable||w==="INPUT"||w==="SELECT"||w==="TEXTAREA"}const y=V(!1);he("k",_=>{(_.ctrlKey||_.metaKey)&&(_.preventDefault(),y.value=!0)}),he("/",_=>{v(_)||(_.preventDefault(),y.value=!0)});const S="local";return(_,P)=>{var w;return r(),d("div",Io,[l(S)==="local"?(r(),d(M,{key:0},[y.value?(r(),g(l(t),{key:0,onClose:P[0]||(P[0]=N=>y.value=!1)})):h("",!0),i("div",Co,[b(Me,{onClick:P[1]||(P[1]=N=>y.value=!0)})])],64)):l(S)==="algolia"?(r(),d(M,{key:1},[o.value?(r(),g(l(n),{key:0,algolia:((w=l(a).search)==null?void 0:w.options)??l(a).algolia,onVnodeBeforeMount:P[2]||(P[2]=N=>c.value=!0)},null,8,["algolia"])):h("",!0),c.value?h("",!0):(r(),d("div",Eo,[b(Me,{onClick:s})]))],64)):h("",!0)])}}}),Ho=p({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>l(t).socialLinks?(r(),g(Te,{key:0,class:"VPNavBarSocialLinks",links:l(t).socialLinks},null,8,["links"])):h("",!0)}}),Oo=k(Ho,[["__scopeId","data-v-0394ad82"]]),Fo=["href","rel","target"],Do=["innerHTML"],jo={key:2},Uo=p({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=L(),{hasSidebar:a}=q(),{currentLang:o}=Z(),c=$(()=>{var v;return typeof n.value.logoLink=="string"?n.value.logoLink:(v=n.value.logoLink)==null?void 0:v.link}),s=$(()=>{var v;return typeof n.value.logoLink=="string"||(v=n.value.logoLink)==null?void 0:v.rel}),f=$(()=>{var v;return typeof n.value.logoLink=="string"||(v=n.value.logoLink)==null?void 0:v.target});return(v,y)=>(r(),d("div",{class:T(["VPNavBarTitle",{"has-sidebar":l(a)}])},[i("a",{class:"title",href:c.value??l(Pe)(l(o).link),rel:s.value,target:f.value},[u(v.$slots,"nav-bar-title-before",{},void 0,!0),l(n).logo?(r(),g(ae,{key:0,class:"logo",image:l(n).logo},null,8,["image"])):h("",!0),l(n).siteTitle?(r(),d("span",{key:1,innerHTML:l(n).siteTitle},null,8,Do)):l(n).siteTitle===void 0?(r(),d("span",jo,x(l(t).title),1)):h("",!0),u(v.$slots,"nav-bar-title-after",{},void 0,!0)],8,Fo)],2))}}),qo=k(Uo,[["__scopeId","data-v-1168a8e4"]]),Go={class:"items"},Ro={class:"title"},zo=p({__name:"VPNavBarTranslations",setup(e){const{theme:t}=L(),{localeLinks:n,currentLang:a}=Z({correspondingLink:!0});return(o,c)=>l(n).length&&l(a).label?(r(),g(we,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:l(t).langMenuLabel||"Change language"},{default:m(()=>[i("div",Go,[i("p",Ro,x(l(a).label),1),(r(!0),d(M,null,E(l(n),s=>(r(),g(ce,{key:s.link,item:s},null,8,["item"]))),128))])]),_:1},8,["label"])):h("",!0)}}),Ko=k(zo,[["__scopeId","data-v-88af2de4"]]),Wo={class:"wrapper"},Jo={class:"container"},Qo={class:"title"},Yo={class:"content"},Xo={class:"content-body"},Zo=p({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const t=e,{y:n}=De(),{hasSidebar:a}=q(),{frontmatter:o}=L(),c=V({});return $e(()=>{c.value={"has-sidebar":a.value,home:o.value.layout==="home",top:n.value===0,"screen-open":t.isScreenOpen}}),(s,f)=>(r(),d("div",{class:T(["VPNavBar",c.value])},[i("div",Wo,[i("div",Jo,[i("div",Qo,[b(qo,null,{"nav-bar-title-before":m(()=>[u(s.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":m(()=>[u(s.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),i("div",Yo,[i("div",Xo,[u(s.$slots,"nav-bar-content-before",{},void 0,!0),b(Bo,{class:"search"}),b(To,{class:"menu"}),b(Ko,{class:"translations"}),b(Ba,{class:"appearance"}),b(Oo,{class:"social-links"}),b(go,{class:"extra"}),u(s.$slots,"nav-bar-content-after",{},void 0,!0),b(yo,{class:"hamburger",active:e.isScreenOpen,onClick:f[0]||(f[0]=v=>s.$emit("toggle-screen"))},null,8,["active"])])])])]),f[1]||(f[1]=i("div",{class:"divider"},[i("div",{class:"divider-line"})],-1))],2))}}),es=k(Zo,[["__scopeId","data-v-6aa21345"]]),ts={key:0,class:"VPNavScreenAppearance"},ns={class:"text"},as=p({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=L();return(a,o)=>l(t).appearance&&l(t).appearance!=="force-dark"&&l(t).appearance!=="force-auto"?(r(),d("div",ts,[i("p",ns,x(l(n).darkModeSwitchLabel||"Appearance"),1),b(Se)])):h("",!0)}}),os=k(as,[["__scopeId","data-v-b44890b2"]]),ss=["innerHTML"],is=p({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=le("close-screen");return(n,a)=>(r(),g(j,{class:"VPNavScreenMenuLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:l(t)},{default:m(()=>[i("span",{innerHTML:e.item.text},null,8,ss)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),rs=k(is,[["__scopeId","data-v-df37e6dd"]]),ls=["innerHTML"],cs=p({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=le("close-screen");return(n,a)=>(r(),g(j,{class:"VPNavScreenMenuGroupLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:l(t)},{default:m(()=>[i("span",{innerHTML:e.item.text},null,8,ls)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Je=k(cs,[["__scopeId","data-v-3e9c20e4"]]),us={class:"VPNavScreenMenuGroupSection"},ds={key:0,class:"title"},vs=p({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(r(),d("div",us,[e.text?(r(),d("p",ds,x(e.text),1)):h("",!0),(r(!0),d(M,null,E(e.items,a=>(r(),g(Je,{key:a.text,item:a},null,8,["item"]))),128))]))}}),fs=k(vs,[["__scopeId","data-v-8133b170"]]),ms=["aria-controls","aria-expanded"],hs=["innerHTML"],ps=["id"],bs={key:0,class:"item"},gs={key:1,class:"item"},ks={key:2,class:"group"},_s=p({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=V(!1),a=$(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(c,s)=>(r(),d("div",{class:T(["VPNavScreenMenuGroup",{open:n.value}])},[i("button",{class:"button","aria-controls":a.value,"aria-expanded":n.value,onClick:o},[i("span",{class:"button-text",innerHTML:e.text},null,8,hs),s[0]||(s[0]=i("span",{class:"vpi-plus button-icon"},null,-1))],8,ms),i("div",{id:a.value,class:"items"},[(r(!0),d(M,null,E(e.items,f=>(r(),d(M,{key:JSON.stringify(f)},["link"in f?(r(),d("div",bs,[b(Je,{item:f},null,8,["item"])])):"component"in f?(r(),d("div",gs,[(r(),g(D(f.component),R({ref_for:!0},f.props,{"screen-menu":""}),null,16))])):(r(),d("div",ks,[b(fs,{text:f.text,items:f.items},null,8,["text","items"])]))],64))),128))],8,ps)],2))}}),ys=k(_s,[["__scopeId","data-v-b9ab8c58"]]),$s={key:0,class:"VPNavScreenMenu"},Ps=p({__name:"VPNavScreenMenu",setup(e){const{theme:t}=L();return(n,a)=>l(t).nav?(r(),d("nav",$s,[(r(!0),d(M,null,E(l(t).nav,o=>(r(),d(M,{key:JSON.stringify(o)},["link"in o?(r(),g(rs,{key:0,item:o},null,8,["item"])):"component"in o?(r(),g(D(o.component),R({key:1,ref_for:!0},o.props,{"screen-menu":""}),null,16)):(r(),g(ys,{key:2,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),Ls=p({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>l(t).socialLinks?(r(),g(Te,{key:0,class:"VPNavScreenSocialLinks",links:l(t).socialLinks},null,8,["links"])):h("",!0)}}),Ss={class:"list"},Vs=p({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=Z({correspondingLink:!0}),a=V(!1);function o(){a.value=!a.value}return(c,s)=>l(t).length&&l(n).label?(r(),d("div",{key:0,class:T(["VPNavScreenTranslations",{open:a.value}])},[i("button",{class:"title",onClick:o},[s[0]||(s[0]=i("span",{class:"vpi-languages icon lang"},null,-1)),B(" "+x(l(n).label)+" ",1),s[1]||(s[1]=i("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),i("ul",Ss,[(r(!0),d(M,null,E(l(t),f=>(r(),d("li",{key:f.link,class:"item"},[b(j,{class:"link",href:f.link},{default:m(()=>[B(x(f.text),1)]),_:2},1032,["href"])]))),128))])],2)):h("",!0)}}),ws=k(Vs,[["__scopeId","data-v-858fe1a4"]]),Ts={class:"container"},xs=p({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=V(null),n=je(X?document.body:null);return(a,o)=>(r(),g(_e,{name:"fade",onEnter:o[0]||(o[0]=c=>n.value=!0),onAfterLeave:o[1]||(o[1]=c=>n.value=!1)},{default:m(()=>[e.open?(r(),d("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[i("div",Ts,[u(a.$slots,"nav-screen-content-before",{},void 0,!0),b(Ps,{class:"menu"}),b(ws,{class:"translations"}),b(os,{class:"appearance"}),b(Ls,{class:"social-links"}),u(a.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):h("",!0)]),_:3}))}}),Ms=k(xs,[["__scopeId","data-v-f2779853"]]),Ns={key:0,class:"VPNav"},As=p({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:a}=Va(),{frontmatter:o}=L(),c=$(()=>o.value.navbar!==!1);return Ue("close-screen",n),se(()=>{X&&document.documentElement.classList.toggle("hide-nav",!c.value)}),(s,f)=>c.value?(r(),d("header",Ns,[b(es,{"is-screen-open":l(t),onToggleScreen:l(a)},{"nav-bar-title-before":m(()=>[u(s.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":m(()=>[u(s.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":m(()=>[u(s.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":m(()=>[u(s.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),b(Ms,{open:l(t)},{"nav-screen-content-before":m(()=>[u(s.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":m(()=>[u(s.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}}),Is=k(As,[["__scopeId","data-v-ae24b3ad"]]),Cs=["role","tabindex"],Es={key:1,class:"items"},Bs=p({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:a,isLink:o,isActiveLink:c,hasActiveLink:s,hasChildren:f,toggle:v}=xt($(()=>t.item)),y=$(()=>f.value?"section":"div"),S=$(()=>o.value?"a":"div"),_=$(()=>f.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),P=$(()=>o.value?void 0:"button"),w=$(()=>[[`level-${t.depth}`],{collapsible:a.value},{collapsed:n.value},{"is-link":o.value},{"is-active":c.value},{"has-active":s.value}]);function N(H){"key"in H&&H.key!=="Enter"||!t.item.link&&v()}function A(){t.item.link&&v()}return(H,F)=>{const G=W("VPSidebarItem",!0);return r(),g(D(y.value),{class:T(["VPSidebarItem",w.value])},{default:m(()=>[e.item.text?(r(),d("div",R({key:0,class:"item",role:P.value},st(e.item.items?{click:N,keydown:N}:{},!0),{tabindex:e.item.items&&0}),[F[1]||(F[1]=i("div",{class:"indicator"},null,-1)),e.item.link?(r(),g(j,{key:0,tag:S.value,class:"link",href:e.item.link,rel:e.item.rel,target:e.item.target},{default:m(()=>[(r(),g(D(_.value),{class:"text",innerHTML:e.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(r(),g(D(_.value),{key:1,class:"text",innerHTML:e.item.text},null,8,["innerHTML"])),e.item.collapsed!=null&&e.item.items&&e.item.items.length?(r(),d("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:A,onKeydown:it(A,["enter"]),tabindex:"0"},[...F[0]||(F[0]=[i("span",{class:"vpi-chevron-right caret-icon"},null,-1)])],32)):h("",!0)],16,Cs)):h("",!0),e.item.items&&e.item.items.length?(r(),d("div",Es,[e.depth<5?(r(!0),d(M,{key:0},E(e.item.items,J=>(r(),g(G,{key:J.text,item:J,depth:e.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}}),Hs=k(Bs,[["__scopeId","data-v-b3fd67f8"]]),Os=p({__name:"VPSidebarGroup",props:{items:{}},setup(e){const t=V(!0);let n=null;return z(()=>{n=setTimeout(()=>{n=null,t.value=!1},300)}),rt(()=>{n!=null&&(clearTimeout(n),n=null)}),(a,o)=>(r(!0),d(M,null,E(e.items,c=>(r(),d("div",{key:c.text,class:T(["group",{"no-transition":t.value}])},[b(Hs,{item:c,depth:0},null,8,["item"])],2))),128))}}),Fs=k(Os,[["__scopeId","data-v-c40bc020"]]),Ds={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},js=p({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:n}=q(),a=e,o=V(null),c=je(X?document.body:null);U([a,o],()=>{var f;a.open?(c.value=!0,(f=o.value)==null||f.focus()):c.value=!1},{immediate:!0,flush:"post"});const s=V(0);return U(t,()=>{s.value+=1},{deep:!0}),(f,v)=>l(n)?(r(),d("aside",{key:0,class:T(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:o,onClick:v[0]||(v[0]=qe(()=>{},["stop"]))},[v[2]||(v[2]=i("div",{class:"curtain"},null,-1)),i("nav",Ds,[v[1]||(v[1]=i("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),u(f.$slots,"sidebar-nav-before",{},void 0,!0),(r(),g(Fs,{items:l(t),key:s.value},null,8,["items"])),u(f.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}}),Us=k(js,[["__scopeId","data-v-319d5ca6"]]),qs=p({__name:"VPSkipLink",setup(e){const{theme:t}=L(),n=re(),a=V();U(()=>n.path,()=>a.value.focus());function o({target:c}){const s=document.getElementById(decodeURIComponent(c.hash).slice(1));if(s){const f=()=>{s.removeAttribute("tabindex"),s.removeEventListener("blur",f)};s.setAttribute("tabindex","-1"),s.addEventListener("blur",f),s.focus(),window.scrollTo(0,0)}}return(c,s)=>(r(),d(M,null,[i("span",{ref_key:"backToTop",ref:a,tabindex:"-1"},null,512),i("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o},x(l(t).skipToContentLabel||"Skip to content"),1)],64))}}),Gs=k(qs,[["__scopeId","data-v-0b0ada53"]]),Rs=p({__name:"Layout",setup(e){const{isOpen:t,open:n,close:a}=q(),o=re();U(()=>o.path,a),Tt(t,a);const{frontmatter:c}=L(),s=lt(),f=$(()=>!!s["home-hero-image"]);return Ue("hero-image-slot-exists",f),(v,y)=>{const S=W("Content");return l(c).layout!==!1?(r(),d("div",{key:0,class:T(["Layout",l(c).pageClass])},[u(v.$slots,"layout-top",{},void 0,!0),b(Gs),b(ht,{class:"backdrop",show:l(t),onClick:l(a)},null,8,["show","onClick"]),b(Is,null,{"nav-bar-title-before":m(()=>[u(v.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":m(()=>[u(v.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":m(()=>[u(v.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":m(()=>[u(v.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":m(()=>[u(v.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":m(()=>[u(v.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),b(Sa,{open:l(t),onOpenMenu:l(n)},null,8,["open","onOpenMenu"]),b(Us,{open:l(t)},{"sidebar-nav-before":m(()=>[u(v.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":m(()=>[u(v.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),b(ca,null,{"page-top":m(()=>[u(v.$slots,"page-top",{},void 0,!0)]),"page-bottom":m(()=>[u(v.$slots,"page-bottom",{},void 0,!0)]),"not-found":m(()=>[u(v.$slots,"not-found",{},void 0,!0)]),"home-hero-before":m(()=>[u(v.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":m(()=>[u(v.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":m(()=>[u(v.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":m(()=>[u(v.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":m(()=>[u(v.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":m(()=>[u(v.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":m(()=>[u(v.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":m(()=>[u(v.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":m(()=>[u(v.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":m(()=>[u(v.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":m(()=>[u(v.$slots,"doc-before",{},void 0,!0)]),"doc-after":m(()=>[u(v.$slots,"doc-after",{},void 0,!0)]),"doc-top":m(()=>[u(v.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":m(()=>[u(v.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":m(()=>[u(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":m(()=>[u(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":m(()=>[u(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":m(()=>[u(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":m(()=>[u(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":m(()=>[u(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),b(ma),u(v.$slots,"layout-bottom",{},void 0,!0)],2)):(r(),g(S,{key:1}))}}}),zs=k(Rs,[["__scopeId","data-v-5d98c3a5"]]),Ks={Layout:zs,enhanceApp:({app:e})=>{e.component("Badge",vt)}},Ws={id:"main-content",class:"tuning-landing"},Js={class:"hero","aria-labelledby":"page-title"},Qs={class:"container hero-grid"},Ys={class:"hero-copy"},Xs={class:"hero-actions"},Zs=["href"],ei={class:"known-term-row"},ti={class:"signal-board","aria-label":"Example symptom paths"},ni={class:"signal-list"},ai=["href"],oi=["href"],si=["href"],ii={class:"section",id:"symptoms","aria-labelledby":"symptoms-title"},ri={class:"container"},li={class:"symptom-grid"},ci={class:"symptom"},ui=["href"],di={class:"symptom"},vi=["href"],fi={class:"symptom"},mi=["href"],hi={class:"symptom"},pi=["href"],bi={class:"symptom"},gi=["href"],ki=p({__name:"TuningLanding",setup(e){const t=ct(),n=V(""),a={memory:"memory-model","memory-model":"memory-model",spill:"memory-model","spark.memory.fraction":"memory-model",shuffle:"shuffle","spark.sql.shuffle.partitions":"shuffle",joins:"joins",join:"joins","spark.sql.autobroadcastjointhreshold":"joins",aqe:"aqe","spark.sql.adaptive.enabled":"aqe",config:"config"};function o(){const c=n.value.trim().toLowerCase(),s=a[c]||"config";t.go(O(`/tuning-reference/${s}`))}return(c,s)=>(r(),d("main",Ws,[i("section",Js,[i("div",Qs,[i("div",Ys,[s[6]||(s[6]=i("p",{class:"eyebrow"},"Practical mechanics, stable references",-1)),s[7]||(s[7]=i("h1",{id:"page-title"},"Spark tuning reference",-1)),s[8]||(s[8]=i("p",{class:"hero-summary"}," Move from a job symptom to the Spark mechanics and settings that can change its outcome without treating a tuning guess as evidence. ",-1)),i("div",Xs,[i("a",{class:"button button-primary",href:l(O)("/tuning-reference/intro")},[...s[1]||(s[1]=[B("Browse the full reference ",-1),i("span",{class:"arrow","aria-hidden":"true"},"→",-1)])],8,Zs),s[5]||(s[5]=i("a",{class:"button button-secondary",href:"#symptoms"},"Choose a symptom",-1)),i("form",{class:"known-term",onSubmit:qe(o,["prevent"])},[s[3]||(s[3]=i("label",{for:"known-term-input"},"Know the term or config key?",-1)),i("div",ei,[ut(i("input",{id:"known-term-input","onUpdate:modelValue":s[0]||(s[0]=f=>n.value=f),name:"term",type:"search",list:"known-term-options",placeholder:"e.g. spark.sql.shuffle.partitions",autocomplete:"off"},null,512),[[dt,n.value]]),s[2]||(s[2]=i("button",{class:"button button-secondary",type:"submit"},"Jump to topic",-1))]),s[4]||(s[4]=xe('<small data-v-5d65fdb9>Known routes: memory, shuffle, joins, AQE, and config. Other terms open the configuration reference.</small><datalist id="known-term-options" data-v-5d65fdb9><option value="memory" data-v-5d65fdb9></option><option value="shuffle" data-v-5d65fdb9></option><option value="joins" data-v-5d65fdb9></option><option value="AQE" data-v-5d65fdb9></option><option value="config" data-v-5d65fdb9></option><option value="spark.memory.fraction" data-v-5d65fdb9></option><option value="spark.sql.shuffle.partitions" data-v-5d65fdb9></option><option value="spark.sql.adaptive.enabled" data-v-5d65fdb9></option><option value="spark.sql.autoBroadcastJoinThreshold" data-v-5d65fdb9></option></datalist>',2))],32)])]),i("aside",ti,[s[12]||(s[12]=i("div",{class:"board-label"},"evidence → mechanic → lever",-1)),i("ul",ni,[i("li",null,[i("a",{class:"signal-link",href:l(O)("/tuning-reference/memory-model")},[...s[9]||(s[9]=[i("span",{class:"signal-marker","aria-hidden":"true"},null,-1),i("span",{class:"signal-title"},"Executor memory pressure",-1),i("span",{class:"signal-destination"},"#memory-model",-1)])],8,ai)]),i("li",null,[i("a",{class:"signal-link",href:l(O)("/tuning-reference/shuffle")},[...s[10]||(s[10]=[i("span",{class:"signal-marker","aria-hidden":"true"},null,-1),i("span",{class:"signal-title"},"Slow, wide stages",-1),i("span",{class:"signal-destination"},"#shuffle",-1)])],8,oi)]),i("li",null,[i("a",{class:"signal-link",href:l(O)("/tuning-reference/joins")},[...s[11]||(s[11]=[i("span",{class:"signal-marker","aria-hidden":"true"},null,-1),i("span",{class:"signal-title"},"Join strategy drift",-1),i("span",{class:"signal-destination"},"#joins",-1)])],8,si)])])])])]),i("section",ii,[i("div",ri,[s[23]||(s[23]=i("div",{class:"section-heading"},[i("h2",{id:"symptoms-title"},"Symptoms, mapped to the right lever"),i("p",null,"Each path stays on the canonical reference document, so existing links and saved anchors continue to work."),i("p",{class:"decision-note"},[i("strong",null,"How to use this:"),B(" SparkForensics reads your Spark event log and surfaces evidence; this reference explains the mechanics and settings behind it. Diagnose the symptom, change one informed lever, then validate against the next run's evidence. Confirm behavior and defaults against your deployed Spark version and distribution. ")])],-1)),i("div",li,[i("article",ci,[s[14]||(s[14]=i("div",null,[i("h3",null,"Spill or GC pressure"),i("p",null,"Trace executor memory, object lifetime, and the trade-offs behind changing memory settings.")],-1)),i("a",{href:l(O)("/tuning-reference/memory-model")},[...s[13]||(s[13]=[B("Open memory model ",-1),i("span",{"aria-hidden":"true"},"→",-1)])],8,ui)]),i("article",di,[s[16]||(s[16]=i("div",null,[i("h3",null,"Shuffle-heavy stages"),i("p",null,"Understand write/read costs, partition size, and why moving data becomes the bottleneck.")],-1)),i("a",{href:l(O)("/tuning-reference/shuffle")},[...s[15]||(s[15]=[B("Open shuffle guide ",-1),i("span",{"aria-hidden":"true"},"→",-1)])],8,vi)]),i("article",fi,[s[18]||(s[18]=i("div",null,[i("h3",null,"Slow or skewed joins"),i("p",null,"Compare join mechanics before changing broadcast thresholds or reshaping a plan.")],-1)),i("a",{href:l(O)("/tuning-reference/joins")},[...s[17]||(s[17]=[B("Open join optimization ",-1),i("span",{"aria-hidden":"true"},"→",-1)])],8,mi)]),i("article",hi,[s[20]||(s[20]=i("div",null,[i("h3",null,"Plan adapts poorly"),i("p",null,"Use AQE's runtime choices as an inspectable mechanism, not a checkbox to enable blindly.")],-1)),i("a",{href:l(O)("/tuning-reference/aqe")},[...s[19]||(s[19]=[B("Open AQE guide ",-1),i("span",{"aria-hidden":"true"},"→",-1)])],8,pi)]),i("article",bi,[s[22]||(s[22]=i("div",null,[i("h3",null,"Need the exact setting"),i("p",null,"Check a setting's scope, default, and interaction before applying it to a cluster.")],-1)),i("a",{href:l(O)("/tuning-reference/config")},[...s[21]||(s[21]=[B("Open config reference ",-1),i("span",{"aria-hidden":"true"},"→",-1)])],8,gi)])])])]),s[24]||(s[24]=xe('<section class="section workflow" aria-labelledby="workflow-title" data-v-5d65fdb9><div class="container workflow-grid" data-v-5d65fdb9><div class="workflow-copy" data-v-5d65fdb9><h2 id="workflow-title" data-v-5d65fdb9>Let SparkForensics surface the evidence. Use this reference to reason about it.</h2><p data-v-5d65fdb9>The two tools stay deliberately separate: SparkForensics reads the event log; this static reference explains the mechanics and settings behind what you find.</p></div><ol class="steps" data-v-5d65fdb9><li data-v-5d65fdb9><span class="step-label" data-v-5d65fdb9>Observe</span><div data-v-5d65fdb9><strong data-v-5d65fdb9>Read the stage or executor behavior</strong><span data-v-5d65fdb9>Start with the event log, metrics, and plan details Spark already produces.</span></div></li><li data-v-5d65fdb9><span class="step-label" data-v-5d65fdb9>Explain</span><div data-v-5d65fdb9><strong data-v-5d65fdb9>Name the mechanism at work</strong><span data-v-5d65fdb9>Use the stable reference anchors to connect symptoms to memory, shuffle, joins, AQE, or configuration.</span></div></li><li data-v-5d65fdb9><span class="step-label" data-v-5d65fdb9>Test</span><div data-v-5d65fdb9><strong data-v-5d65fdb9>Change one informed lever</strong><span data-v-5d65fdb9>Make a measured change, then compare the evidence again rather than carrying a tuning superstition forward.</span></div></li></ol></div></section>',1))]))}}),_i=k(ki,[["__scopeId","data-v-5d65fdb9"]]),Ne="citation-chip",Ae="citation-popover",yi=150;let I=null,C=null,Q=!1,te=null,Ie=!1;function $i(){const e=new Map;return document.querySelectorAll("section.footnotes li.footnote-item[id]").forEach(t=>{const n=t.cloneNode(!0);n.querySelectorAll("a.footnote-backref").forEach(o=>o.remove());const a=n.querySelector("a[href]");e.set(t.id,{href:a?a.getAttribute("href"):null,title:(n.textContent??"").trim()})}),e}function oe(){te!==null&&(clearTimeout(te),te=null)}function ke(){oe(),te=setTimeout(()=>{Q||Y()},yi)}function Y(){oe(),I==null||I.remove(),I=null,C==null||C.removeAttribute("aria-describedby"),C==null||C.setAttribute("aria-expanded","false"),C=null,Q=!1}function Pi(e,t){const n=t.getBoundingClientRect(),a=6,{width:o,height:c}=e.getBoundingClientRect();let s=n.bottom+a;s+c>window.innerHeight-8&&(s=n.top-c-a);const f=window.innerWidth-o-8;e.style.top=`${Math.max(8,s)}px`,e.style.left=`${Math.min(Math.max(8,n.left),Math.max(8,f))}px`}function fe(e,t,n){oe();const a=C===e;if(a||C==null||C.setAttribute("aria-expanded","false"),I||(I=document.createElement("div"),I.id=Ae,I.className="citation-popover",I.setAttribute("role","tooltip"),I.addEventListener("mouseenter",oe),I.addEventListener("mouseleave",ke),document.body.appendChild(I)),I.replaceChildren(),t.href){const o=document.createElement("a");o.href=t.href,o.target="_blank",o.rel="noreferrer",o.textContent=t.title,I.appendChild(o)}else I.textContent=t.title;e.setAttribute("aria-describedby",Ae),e.setAttribute("aria-expanded","true"),C=e,n?Q=!0:a||(Q=!1),Pi(I,e)}function Li(e,t){if(e.classList.contains(Ne))return;const n=(e.getAttribute("href")??"").replace(/^#/,""),a=t.get(n);if(!a)return;e.removeAttribute("href"),e.setAttribute("role","button"),e.tabIndex=0,e.classList.add(Ne),e.setAttribute("aria-haspopup","true"),e.setAttribute("aria-expanded","false"),e.textContent=n.replace(/^fn/,"");const o=()=>{C===e&&Q?Y():fe(e,a,!0)};e.addEventListener("mouseenter",()=>fe(e,a,!1)),e.addEventListener("mouseleave",ke),e.addEventListener("focus",()=>fe(e,a,!1)),e.addEventListener("blur",ke),e.addEventListener("click",o),e.addEventListener("keydown",c=>{(c.key==="Enter"||c.key===" ")&&(c.preventDefault(),o())})}function Si(){Ie||(Ie=!0,document.addEventListener("click",e=>{if(!Q||!C)return;const t=e.target;C.contains(t)||I!=null&&I.contains(t)||Y()}),document.addEventListener("keydown",e=>{e.key==="Escape"&&Y()}))}function Ce(){Y(),Si();const e=$i();document.querySelectorAll("sup.footnote-ref > a[href]").forEach(t=>{Li(t,e)})}const Qe="shuffle-works-theme";function Vi(){try{const e=window.localStorage.getItem(Qe);return e==="light"||e==="dark"?e:null}catch{return null}}function Ee(e){const t=e?"dark":"light";try{window.localStorage.setItem(Qe,t)}catch{}document.documentElement.dataset.theme=t}function wi(){if(!location.hash)return;let e=null;try{e=document.getElementById(decodeURIComponent(location.hash.slice(1)))}catch{return}e==null||e.scrollIntoView()}const xi={extends:Ks,enhanceApp({app:e,router:t}){if(e.component("TuningLanding",_i),!X)return;t.onAfterRouteChange=()=>{ne(()=>Ce())};const n=e.mount.bind(e);e.mount=(...a)=>{const o=n(...a);return ne(()=>{Ce(),requestAnimationFrame(wi)}),o},e.runWithContext(()=>{const{isDark:a}=Be(),o=Vi();o&&(a.value=o==="dark"),Ee(a.value),U(a,v=>Ee(v)),new MutationObserver(()=>{const v=document.documentElement.dataset.theme;if(v==="light"||v==="dark"){const y=v==="dark";a.value!==y&&(a.value=y)}}).observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]});const s=()=>{document.querySelectorAll(".VPNavBarAppearance, .VPNavScreenAppearance, .VPNavBarExtra .appearance-action").forEach(v=>{v.hasAttribute("data-shuffle-page-controls")||v.setAttribute("data-shuffle-page-controls","")})};s(),new MutationObserver(s).observe(document.documentElement,{childList:!0,subtree:!0})})}};export{xo as c,xi as t,L as u};
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.DsZrQKQR.js","assets/chunks/framework.DSg0KOwT.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{d as p,c as d,r as u,n as T,o as r,a as B,t as x,b as g,w as m,T as _e,e as h,_ as k,u as Be,i as Ye,f as Xe,g as O,h as $,j as i,k as l,l as K,m as me,p as V,q as U,s as se,v as z,x as ye,y as $e,z as Ze,A as et,F as M,B as E,C as W,D as ie,E as b,G as He,H as D,I as Oe,J as re,K as R,L as le,M as tt,N as Fe,O as he,P as ne,Q as De,R as X,S as nt,U as at,V as ot,W as je,X as Ue,Y as st,Z as it,$ as rt,a0 as qe,a1 as lt,a2 as ct,a3 as ut,a4 as dt,a5 as xe}from"./framework.DSg0KOwT.js";const vt=p({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,n)=>(r(),d("span",{class:T(["VPBadge",e.type])},[u(t.$slots,"default",{},()=>[B(x(e.text),1)])],2))}}),ft={key:0,class:"VPBackdrop"},mt=p({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(r(),g(_e,{name:"fade"},{default:m(()=>[e.show?(r(),d("div",ft)):h("",!0)]),_:1}))}}),ht=k(mt,[["__scopeId","data-v-c79a1216"]]),L=Be;function pt(e,t){let n,a=!1;return()=>{n&&clearTimeout(n),a?n=setTimeout(e,t):(e(),(a=!0)&&setTimeout(()=>a=!1,t))}}function pe(e){return e.startsWith("/")?e:`/${e}`}function Pe(e){const{pathname:t,search:n,hash:a,protocol:o}=new URL(e,"http://a.com");if(Ye(e)||e.startsWith("#")||!o.startsWith("http")||!Xe(t))return e;const{site:c}=L(),s=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,c.value.cleanUrls?"":".html")}${n}${a}`);return O(s)}function Z({correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:a,theme:o,hash:c}=L(),s=$(()=>{var v,y;return{label:(v=t.value.locales[n.value])==null?void 0:v.label,link:((y=t.value.locales[n.value])==null?void 0:y.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:$(()=>Object.entries(t.value.locales).flatMap(([v,y])=>s.value.label===y.label?[]:{text:y.label,link:bt(y.link||(v==="root"?"/":`/${v}/`),o.value.i18nRouting!==!1&&e,a.value.relativePath.slice(s.value.link.length-1),!t.value.cleanUrls)+c.value})),currentLang:s}}function bt(e,t,n,a){return t?e.replace(/\/$/,"")+pe(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,a?".html":"")):e}const gt={class:"NotFound"},kt={class:"code"},_t={class:"title"},yt={class:"quote"},$t={class:"action"},Pt=["href","aria-label"],Lt=p({__name:"NotFound",setup(e){const{theme:t}=L(),{currentLang:n}=Z();return(a,o)=>{var c,s,f,v,y;return r(),d("div",gt,[i("p",kt,x(((c=l(t).notFound)==null?void 0:c.code)??"404"),1),i("h1",_t,x(((s=l(t).notFound)==null?void 0:s.title)??"PAGE NOT FOUND"),1),o[0]||(o[0]=i("div",{class:"divider"},null,-1)),i("blockquote",yt,x(((f=l(t).notFound)==null?void 0:f.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),i("div",$t,[i("a",{class:"link",href:l(O)(l(n).link),"aria-label":((v=l(t).notFound)==null?void 0:v.linkLabel)??"go to home"},x(((y=l(t).notFound)==null?void 0:y.linkText)??"Take me home"),9,Pt)])])}}}),St=k(Lt,[["__scopeId","data-v-d6be1790"]]);function Ge(e,t){if(Array.isArray(e))return ee(e);if(e==null)return[];t=pe(t);const n=Object.keys(e).sort((o,c)=>c.split("/").length-o.split("/").length).find(o=>t.startsWith(pe(o))),a=n?e[n]:[];return Array.isArray(a)?ee(a):ee(a.items,a.base)}function Vt(e){const t=[];let n=0;for(const a in e){const o=e[a];if(o.items){n=t.push(o);continue}t[n]||t.push({items:[]}),t[n].items.push(o)}return t}function wt(e){const t=[];function n(a){for(const o of a)o.text&&o.link&&t.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&n(o.items)}return n(e),t}function be(e,t){return Array.isArray(t)?t.some(n=>be(e,n)):K(e,t.link)?!0:t.items?be(e,t.items):!1}function ee(e,t){return[...e].map(n=>{const a={...n},o=a.base||t;return o&&a.link&&(a.link=o+a.link),a.items&&(a.items=ee(a.items,o)),a})}function q(){const{frontmatter:e,page:t,theme:n}=L(),a=me("(min-width: 960px)"),o=V(!1),c=$(()=>{const A=n.value.sidebar,H=t.value.relativePath;return A?Ge(A,H):[]}),s=V(c.value);U(c,(A,H)=>{JSON.stringify(A)!==JSON.stringify(H)&&(s.value=c.value)});const f=$(()=>e.value.sidebar!==!1&&s.value.length>0&&e.value.layout!=="home"),v=$(()=>y?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),y=$(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),S=$(()=>f.value&&a.value),_=$(()=>f.value?Vt(s.value):[]);function P(){o.value=!0}function w(){o.value=!1}function N(){o.value?w():P()}return{isOpen:o,sidebar:s,sidebarGroups:_,hasSidebar:f,hasAside:y,leftAside:v,isSidebarEnabled:S,open:P,close:w,toggle:N}}function Tt(e,t){let n;se(()=>{n=e.value?document.activeElement:void 0}),z(()=>{window.addEventListener("keyup",a)}),ye(()=>{window.removeEventListener("keyup",a)});function a(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function xt(e){const{page:t,hash:n}=L(),a=V(!1),o=$(()=>e.value.collapsed!=null),c=$(()=>!!e.value.link),s=V(!1),f=()=>{s.value=K(t.value.relativePath,e.value.link)};U([t,e,n],f),z(f);const v=$(()=>s.value?!0:e.value.items?be(t.value.relativePath,e.value.items):!1),y=$(()=>!!(e.value.items&&e.value.items.length));se(()=>{a.value=!!(o.value&&e.value.collapsed)}),$e(()=>{(s.value||v.value)&&(a.value=!1)});function S(){o.value&&(a.value=!a.value)}return{collapsed:a,collapsible:o,isLink:c,isActiveLink:s,hasActiveLink:v,hasChildren:y,toggle:S}}function Mt(){const{hasSidebar:e}=q(),t=me("(min-width: 960px)"),n=me("(min-width: 1280px)");return{isAsideEnabled:$(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const Nt=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,ge=[];function Re(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function Le(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const a=Number(n.tagName[1]);return{element:n,title:At(n),link:"#"+n.id,level:a}});return It(t,e)}function At(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(Nt.test(n.className))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function It(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[a,o]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;return Bt(e,a,o)}function Ct(e,t){const{isAsideEnabled:n}=Mt(),a=pt(c,100);let o=null;z(()=>{requestAnimationFrame(c),window.addEventListener("scroll",a)}),Ze(()=>{s(location.hash)}),ye(()=>{window.removeEventListener("scroll",a)});function c(){if(!n.value)return;const f=window.scrollY,v=window.innerHeight,y=document.body.offsetHeight,S=Math.abs(f+v-y)<1,_=ge.map(({element:w,link:N})=>({link:N,top:Et(w)})).filter(({top:w})=>!Number.isNaN(w)).sort((w,N)=>w.top-N.top);if(!_.length){s(null);return}if(f<1){s(null);return}if(S){s(_[_.length-1].link);return}let P=null;for(const{link:w,top:N}of _){if(N>f+et()+4)break;P=w}s(P)}function s(f){o&&o.classList.remove("active"),f==null?o=null:o=e.value.querySelector(`a[href="${decodeURIComponent(f)}"]`);const v=o;v?(v.classList.add("active"),t.value.style.top=v.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function Et(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}function Bt(e,t,n){ge.length=0;const a=[],o=[];return e.forEach(c=>{const s={...c,children:[]};let f=o[o.length-1];for(;f&&f.level>=s.level;)o.pop(),f=o[o.length-1];if(s.element.classList.contains("ignore-header")||f&&"shouldIgnore"in f){o.push({level:s.level,shouldIgnore:!0});return}s.level>n||s.level<t||(ge.push({element:s.element,link:s.link}),f?f.children.push(s):a.push(s),o.push(s))}),a}const Ht=["href","title"],Ot=p({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(e){function t({target:n}){const a=n.href.split("#")[1],o=document.getElementById(decodeURIComponent(a));o==null||o.focus({preventScroll:!0})}return(n,a)=>{const o=W("VPDocOutlineItem",!0);return r(),d("ul",{class:T(["VPDocOutlineItem",e.root?"root":"nested"])},[(r(!0),d(M,null,E(e.headers,({children:c,link:s,title:f})=>(r(),d("li",null,[i("a",{class:"outline-link",href:s,onClick:t,title:f},x(f),9,Ht),c!=null&&c.length?(r(),g(o,{key:0,headers:c},null,8,["headers"])):h("",!0)]))),256))],2)}}}),ze=k(Ot,[["__scopeId","data-v-b933a997"]]),Ft={class:"content"},Dt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},jt=p({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=L(),a=He([]);ie(()=>{a.value=Le(t.value.outline??n.value.outline)});const o=V(),c=V();return Ct(o,c),(s,f)=>(r(),d("nav",{"aria-labelledby":"doc-outline-aria-label",class:T(["VPDocAsideOutline",{"has-outline":a.value.length>0}]),ref_key:"container",ref:o},[i("div",Ft,[i("div",{class:"outline-marker",ref_key:"marker",ref:c},null,512),i("div",Dt,x(l(Re)(l(n))),1),b(ze,{headers:a.value,root:!0},null,8,["headers"])])],2))}}),Ut=k(jt,[["__scopeId","data-v-a5bbad30"]]),qt={class:"VPDocAsideCarbonAds"},Gt=p({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,a)=>(r(),d("div",qt,[b(l(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),Rt={class:"VPDocAside"},zt=p({__name:"VPDocAside",setup(e){const{theme:t}=L();return(n,a)=>(r(),d("div",Rt,[u(n.$slots,"aside-top",{},void 0,!0),u(n.$slots,"aside-outline-before",{},void 0,!0),b(Ut),u(n.$slots,"aside-outline-after",{},void 0,!0),a[0]||(a[0]=i("div",{class:"spacer"},null,-1)),u(n.$slots,"aside-ads-before",{},void 0,!0),l(t).carbonAds?(r(),g(Gt,{key:0,"carbon-ads":l(t).carbonAds},null,8,["carbon-ads"])):h("",!0),u(n.$slots,"aside-ads-after",{},void 0,!0),u(n.$slots,"aside-bottom",{},void 0,!0)]))}}),Kt=k(zt,[["__scopeId","data-v-3f215769"]]);function Wt(){const{theme:e,page:t}=L();return $(()=>{const{text:n="Edit this page",pattern:a=""}=e.value.editLink||{};let o;return typeof a=="function"?o=a(t.value):o=a.replace(/:path/g,t.value.filePath),{url:o,text:n}})}function Jt(){const{page:e,theme:t,frontmatter:n}=L();return $(()=>{var y,S,_,P,w,N,A,H;const a=Ge(t.value.sidebar,e.value.relativePath),o=wt(a),c=Qt(o,F=>F.link.replace(/[?#].*$/,"")),s=c.findIndex(F=>K(e.value.relativePath,F.link)),f=((y=t.value.docFooter)==null?void 0:y.prev)===!1&&!n.value.prev||n.value.prev===!1,v=((S=t.value.docFooter)==null?void 0:S.next)===!1&&!n.value.next||n.value.next===!1;return{prev:f?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((_=c[s-1])==null?void 0:_.docFooterText)??((P=c[s-1])==null?void 0:P.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((w=c[s-1])==null?void 0:w.link)},next:v?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((N=c[s+1])==null?void 0:N.docFooterText)??((A=c[s+1])==null?void 0:A.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((H=c[s+1])==null?void 0:H.link)}}})}function Qt(e,t){const n=new Set;return e.filter(a=>{const o=t(a);return n.has(o)?!1:n.add(o)})}const j=p({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=$(()=>t.tag??(t.href?"a":"span")),a=$(()=>t.href&&Oe.test(t.href)||t.target==="_blank");return(o,c)=>(r(),g(D(n.value),{class:T(["VPLink",{link:e.href,"vp-external-link-icon":a.value,"no-icon":e.noIcon}]),href:e.href?l(Pe)(e.href):void 0,target:e.target??(a.value?"_blank":void 0),rel:e.rel??(a.value?"noreferrer":void 0)},{default:m(()=>[u(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Yt={class:"VPLastUpdated"},Xt=["datetime"],Zt=p({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,lang:a}=L(),o=$(()=>new Date(n.value.lastUpdated)),c=$(()=>o.value.toISOString()),s=V("");return z(()=>{se(()=>{var f,v,y;s.value=new Intl.DateTimeFormat((v=(f=t.value.lastUpdated)==null?void 0:f.formatOptions)!=null&&v.forceLocale?a.value:void 0,((y=t.value.lastUpdated)==null?void 0:y.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(o.value)})}),(f,v)=>{var y;return r(),d("p",Yt,[B(x(((y=l(t).lastUpdated)==null?void 0:y.text)||l(t).lastUpdatedText||"Last updated")+": ",1),i("time",{datetime:c.value},x(s.value),9,Xt)])}}}),en=k(Zt,[["__scopeId","data-v-e98dd255"]]),tn={key:0,class:"VPDocFooter"},nn={key:0,class:"edit-info"},an={key:0,class:"edit-link"},on={key:1,class:"last-updated"},sn={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},rn={class:"pager"},ln=["innerHTML"],cn=["innerHTML"],un={class:"pager"},dn=["innerHTML"],vn=["innerHTML"],fn=p({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:a}=L(),o=Wt(),c=Jt(),s=$(()=>t.value.editLink&&a.value.editLink!==!1),f=$(()=>n.value.lastUpdated),v=$(()=>s.value||f.value||c.value.prev||c.value.next);return(y,S)=>{var _,P,w,N;return v.value?(r(),d("footer",tn,[u(y.$slots,"doc-footer-before",{},void 0,!0),s.value||f.value?(r(),d("div",nn,[s.value?(r(),d("div",an,[b(j,{class:"edit-link-button",href:l(o).url,"no-icon":!0},{default:m(()=>[S[0]||(S[0]=i("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),B(" "+x(l(o).text),1)]),_:1},8,["href"])])):h("",!0),f.value?(r(),d("div",on,[b(en)])):h("",!0)])):h("",!0),(_=l(c).prev)!=null&&_.link||(P=l(c).next)!=null&&P.link?(r(),d("nav",sn,[S[1]||(S[1]=i("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),i("div",rn,[(w=l(c).prev)!=null&&w.link?(r(),g(j,{key:0,class:"pager-link prev",href:l(c).prev.link},{default:m(()=>{var A;return[i("span",{class:"desc",innerHTML:((A=l(t).docFooter)==null?void 0:A.prev)||"Previous page"},null,8,ln),i("span",{class:"title",innerHTML:l(c).prev.text},null,8,cn)]}),_:1},8,["href"])):h("",!0)]),i("div",un,[(N=l(c).next)!=null&&N.link?(r(),g(j,{key:0,class:"pager-link next",href:l(c).next.link},{default:m(()=>{var A;return[i("span",{class:"desc",innerHTML:((A=l(t).docFooter)==null?void 0:A.next)||"Next page"},null,8,dn),i("span",{class:"title",innerHTML:l(c).next.text},null,8,vn)]}),_:1},8,["href"])):h("",!0)])])):h("",!0)])):h("",!0)}}}),mn=k(fn,[["__scopeId","data-v-e257564d"]]),hn={class:"container"},pn={class:"aside-container"},bn={class:"aside-content"},gn={class:"content"},kn={class:"content-container"},_n={class:"main"},yn=p({__name:"VPDoc",setup(e){const{theme:t}=L(),n=re(),{hasSidebar:a,hasAside:o,leftAside:c}=q(),s=$(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(f,v)=>{const y=W("Content");return r(),d("div",{class:T(["VPDoc",{"has-sidebar":l(a),"has-aside":l(o)}])},[u(f.$slots,"doc-top",{},void 0,!0),i("div",hn,[l(o)?(r(),d("div",{key:0,class:T(["aside",{"left-aside":l(c)}])},[v[0]||(v[0]=i("div",{class:"aside-curtain"},null,-1)),i("div",pn,[i("div",bn,[b(Kt,null,{"aside-top":m(()=>[u(f.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":m(()=>[u(f.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":m(()=>[u(f.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":m(()=>[u(f.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":m(()=>[u(f.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":m(()=>[u(f.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),i("div",gn,[i("div",kn,[u(f.$slots,"doc-before",{},void 0,!0),i("main",_n,[b(y,{class:T(["vp-doc",[s.value,l(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),b(mn,null,{"doc-footer-before":m(()=>[u(f.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),u(f.$slots,"doc-after",{},void 0,!0)])])]),u(f.$slots,"doc-bottom",{},void 0,!0)],2)}}}),$n=k(yn,[["__scopeId","data-v-39a288b8"]]),Pn=p({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(e){const t=e,n=$(()=>t.href&&Oe.test(t.href)),a=$(()=>t.tag||(t.href?"a":"button"));return(o,c)=>(r(),g(D(a.value),{class:T(["VPButton",[e.size,e.theme]]),href:e.href?l(Pe)(e.href):void 0,target:t.target??(n.value?"_blank":void 0),rel:t.rel??(n.value?"noreferrer":void 0)},{default:m(()=>[B(x(e.text),1)]),_:1},8,["class","href","target","rel"]))}}),Ln=k(Pn,[["__scopeId","data-v-fa7799d5"]]),Sn=["src","alt"],Vn=p({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const a=W("VPImage",!0);return e.image?(r(),d(M,{key:0},[typeof e.image=="string"||"src"in e.image?(r(),d("img",R({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:l(O)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,Sn)):(r(),d(M,{key:1},[b(a,R({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),b(a,R({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}}),ae=k(Vn,[["__scopeId","data-v-8426fc1a"]]),wn={class:"container"},Tn={class:"main"},xn={class:"heading"},Mn=["innerHTML"],Nn=["innerHTML"],An=["innerHTML"],In={key:0,class:"actions"},Cn={key:0,class:"image"},En={class:"image-container"},Bn=p({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=le("hero-image-slot-exists");return(n,a)=>(r(),d("div",{class:T(["VPHero",{"has-image":e.image||l(t)}])},[i("div",wn,[i("div",Tn,[u(n.$slots,"home-hero-info-before",{},void 0,!0),u(n.$slots,"home-hero-info",{},()=>[i("h1",xn,[e.name?(r(),d("span",{key:0,innerHTML:e.name,class:"name clip"},null,8,Mn)):h("",!0),e.text?(r(),d("span",{key:1,innerHTML:e.text,class:"text"},null,8,Nn)):h("",!0)]),e.tagline?(r(),d("p",{key:0,innerHTML:e.tagline,class:"tagline"},null,8,An)):h("",!0)],!0),u(n.$slots,"home-hero-info-after",{},void 0,!0),e.actions?(r(),d("div",In,[(r(!0),d(M,null,E(e.actions,o=>(r(),d("div",{key:o.link,class:"action"},[b(Ln,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):h("",!0),u(n.$slots,"home-hero-actions-after",{},void 0,!0)]),e.image||l(t)?(r(),d("div",Cn,[i("div",En,[a[0]||(a[0]=i("div",{class:"image-bg"},null,-1)),u(n.$slots,"home-hero-image",{},()=>[e.image?(r(),g(ae,{key:0,class:"image-src",image:e.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}}),Hn=k(Bn,[["__scopeId","data-v-4f9c455b"]]),On=p({__name:"VPHomeHero",setup(e){const{frontmatter:t}=L();return(n,a)=>l(t).hero?(r(),g(Hn,{key:0,class:"VPHomeHero",name:l(t).hero.name,text:l(t).hero.text,tagline:l(t).hero.tagline,image:l(t).hero.image,actions:l(t).hero.actions},{"home-hero-info-before":m(()=>[u(n.$slots,"home-hero-info-before")]),"home-hero-info":m(()=>[u(n.$slots,"home-hero-info")]),"home-hero-info-after":m(()=>[u(n.$slots,"home-hero-info-after")]),"home-hero-actions-after":m(()=>[u(n.$slots,"home-hero-actions-after")]),"home-hero-image":m(()=>[u(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),Fn={class:"box"},Dn={key:0,class:"icon"},jn=["innerHTML"],Un=["innerHTML"],qn=["innerHTML"],Gn={key:4,class:"link-text"},Rn={class:"link-text-value"},zn=p({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(r(),g(j,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:m(()=>[i("article",Fn,[typeof e.icon=="object"&&e.icon.wrap?(r(),d("div",Dn,[b(ae,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(r(),g(ae,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(r(),d("div",{key:2,class:"icon",innerHTML:e.icon},null,8,jn)):h("",!0),i("h2",{class:"title",innerHTML:e.title},null,8,Un),e.details?(r(),d("p",{key:3,class:"details",innerHTML:e.details},null,8,qn)):h("",!0),e.linkText?(r(),d("div",Gn,[i("p",Rn,[B(x(e.linkText)+" ",1),n[0]||(n[0]=i("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Kn=k(zn,[["__scopeId","data-v-a3976bdc"]]),Wn={key:0,class:"VPFeatures"},Jn={class:"container"},Qn={class:"items"},Yn=p({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=$(()=>{const a=t.features.length;if(a){if(a===2)return"grid-2";if(a===3)return"grid-3";if(a%3===0)return"grid-6";if(a>3)return"grid-4"}else return});return(a,o)=>e.features?(r(),d("div",Wn,[i("div",Jn,[i("div",Qn,[(r(!0),d(M,null,E(e.features,c=>(r(),d("div",{key:c.title,class:T(["item",[n.value]])},[b(Kn,{icon:c.icon,title:c.title,details:c.details,link:c.link,"link-text":c.linkText,rel:c.rel,target:c.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):h("",!0)}}),Xn=k(Yn,[["__scopeId","data-v-a6181336"]]),Zn=p({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=L();return(n,a)=>l(t).features?(r(),g(Xn,{key:0,class:"VPHomeFeatures",features:l(t).features},null,8,["features"])):h("",!0)}}),ea=p({__name:"VPHomeContent",setup(e){const{width:t}=tt({initialWidth:0,includeScrollbar:!1});return(n,a)=>(r(),d("div",{class:"vp-doc container",style:Fe(l(t)?{"--vp-offset":`calc(50% - ${l(t)/2}px)`}:{})},[u(n.$slots,"default",{},void 0,!0)],4))}}),ta=k(ea,[["__scopeId","data-v-8e2d4988"]]),na=p({__name:"VPHome",setup(e){const{frontmatter:t,theme:n}=L();return(a,o)=>{const c=W("Content");return r(),d("div",{class:T(["VPHome",{"external-link-icon-enabled":l(n).externalLinkIcon}])},[u(a.$slots,"home-hero-before",{},void 0,!0),b(On,null,{"home-hero-info-before":m(()=>[u(a.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":m(()=>[u(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":m(()=>[u(a.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":m(()=>[u(a.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":m(()=>[u(a.$slots,"home-hero-image",{},void 0,!0)]),_:3}),u(a.$slots,"home-hero-after",{},void 0,!0),u(a.$slots,"home-features-before",{},void 0,!0),b(Zn),u(a.$slots,"home-features-after",{},void 0,!0),l(t).markdownStyles!==!1?(r(),g(ta,{key:0},{default:m(()=>[b(c)]),_:1})):(r(),g(c,{key:1}))],2)}}}),aa=k(na,[["__scopeId","data-v-8b561e3d"]]),oa={},sa={class:"VPPage"};function ia(e,t){const n=W("Content");return r(),d("div",sa,[u(e.$slots,"page-top"),b(n),u(e.$slots,"page-bottom")])}const ra=k(oa,[["render",ia]]),la=p({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=L(),{hasSidebar:a}=q();return(o,c)=>(r(),d("div",{class:T(["VPContent",{"has-sidebar":l(a),"is-home":l(n).layout==="home"}]),id:"VPContent"},[l(t).isNotFound?u(o.$slots,"not-found",{},()=>[b(St)],!0,0):l(n).layout==="page"?(r(),g(ra,{key:1},{"page-top":m(()=>[u(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":m(()=>[u(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):l(n).layout==="home"?(r(),g(aa,{key:2},{"home-hero-before":m(()=>[u(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":m(()=>[u(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":m(()=>[u(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":m(()=>[u(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":m(()=>[u(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":m(()=>[u(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":m(()=>[u(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":m(()=>[u(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":m(()=>[u(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):l(n).layout&&l(n).layout!=="doc"?(r(),g(D(l(n).layout),{key:3})):(r(),g($n,{key:4},{"doc-top":m(()=>[u(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":m(()=>[u(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":m(()=>[u(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":m(()=>[u(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":m(()=>[u(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":m(()=>[u(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":m(()=>[u(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":m(()=>[u(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":m(()=>[u(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":m(()=>[u(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":m(()=>[u(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),ca=k(la,[["__scopeId","data-v-1428d186"]]),ua={class:"container"},da=["innerHTML"],va=["innerHTML"],fa=p({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=q();return(o,c)=>l(t).footer&&l(n).footer!==!1?(r(),d("footer",{key:0,class:T(["VPFooter",{"has-sidebar":l(a)}])},[i("div",ua,[l(t).footer.message?(r(),d("p",{key:0,class:"message",innerHTML:l(t).footer.message},null,8,da)):h("",!0),l(t).footer.copyright?(r(),d("p",{key:1,class:"copyright",innerHTML:l(t).footer.copyright},null,8,va)):h("",!0)])],2)):h("",!0)}}),ma=k(fa,[["__scopeId","data-v-e315a0ad"]]);function ha(){const{theme:e,frontmatter:t}=L(),n=He([]),a=$(()=>n.value.length>0);return ie(()=>{n.value=Le(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:a}}const pa={class:"menu-text"},ba={class:"header"},ga={class:"outline"},ka=p({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=L(),a=V(!1),o=V(0),c=V(),s=V();function f(_){var P;(P=c.value)!=null&&P.contains(_.target)||(a.value=!1)}U(a,_=>{if(_){document.addEventListener("click",f);return}document.removeEventListener("click",f)}),he("Escape",()=>{a.value=!1}),ie(()=>{a.value=!1});function v(){a.value=!a.value,o.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function y(_){_.target.classList.contains("outline-link")&&(s.value&&(s.value.style.transition="none"),ne(()=>{a.value=!1}))}function S(){a.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(_,P)=>(r(),d("div",{class:"VPLocalNavOutlineDropdown",style:Fe({"--vp-vh":o.value+"px"}),ref_key:"main",ref:c},[e.headers.length>0?(r(),d("button",{key:0,onClick:v,class:T({open:a.value})},[i("span",pa,x(l(Re)(l(n))),1),P[0]||(P[0]=i("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(r(),d("button",{key:1,onClick:S},x(l(n).returnToTopLabel||"Return to top"),1)),b(_e,{name:"flyout"},{default:m(()=>[a.value?(r(),d("div",{key:0,ref_key:"items",ref:s,class:"items",onClick:y},[i("div",ba,[i("a",{class:"top-link",href:"#",onClick:S},x(l(n).returnToTopLabel||"Return to top"),1)]),i("div",ga,[b(ze,{headers:e.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}}),_a=k(ka,[["__scopeId","data-v-8a42e2b4"]]),ya={class:"container"},$a=["aria-expanded"],Pa={class:"menu-text"},La=p({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=q(),{headers:o}=ha(),{y:c}=De(),s=V(0);z(()=>{s.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),ie(()=>{o.value=Le(n.value.outline??t.value.outline)});const f=$(()=>o.value.length===0),v=$(()=>f.value&&!a.value),y=$(()=>({VPLocalNav:!0,"has-sidebar":a.value,empty:f.value,fixed:v.value}));return(S,_)=>l(n).layout!=="home"&&(!v.value||l(c)>=s.value)?(r(),d("div",{key:0,class:T(y.value)},[i("div",ya,[l(a)?(r(),d("button",{key:0,class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:_[0]||(_[0]=P=>S.$emit("open-menu"))},[_[1]||(_[1]=i("span",{class:"vpi-align-left menu-icon"},null,-1)),i("span",Pa,x(l(t).sidebarMenuLabel||"Menu"),1)],8,$a)):h("",!0),b(_a,{headers:l(o),navHeight:s.value},null,8,["headers","navHeight"])])],2)):h("",!0)}}),Sa=k(La,[["__scopeId","data-v-a6f0e41e"]]);function Va(){const e=V(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function a(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const c=re();return U(()=>c.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:a}}const wa={},Ta={class:"VPSwitch",type:"button",role:"switch"},xa={class:"check"},Ma={key:0,class:"icon"};function Na(e,t){return r(),d("button",Ta,[i("span",xa,[e.$slots.default?(r(),d("span",Ma,[u(e.$slots,"default",{},void 0,!0)])):h("",!0)])])}const Aa=k(wa,[["render",Na],["__scopeId","data-v-1d5665e3"]]),Ia=p({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=L(),a=le("toggle-appearance",()=>{t.value=!t.value}),o=V("");return $e(()=>{o.value=t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme"}),(c,s)=>(r(),g(Aa,{title:o.value,class:"VPSwitchAppearance","aria-checked":l(t),onClick:l(a)},{default:m(()=>[...s[0]||(s[0]=[i("span",{class:"vpi-sun sun"},null,-1),i("span",{class:"vpi-moon moon"},null,-1)])]),_:1},8,["title","aria-checked","onClick"]))}}),Se=k(Ia,[["__scopeId","data-v-5337faa4"]]),Ca={key:0,class:"VPNavBarAppearance"},Ea=p({__name:"VPNavBarAppearance",setup(e){const{site:t}=L();return(n,a)=>l(t).appearance&&l(t).appearance!=="force-dark"&&l(t).appearance!=="force-auto"?(r(),d("div",Ca,[b(Se)])):h("",!0)}}),Ba=k(Ea,[["__scopeId","data-v-6c893767"]]),Ve=V();let Ke=!1,ve=0;function Ha(e){const t=V(!1);if(X){!Ke&&Oa(),ve++;const n=U(Ve,a=>{var o,c,s;a===e.el.value||(o=e.el.value)!=null&&o.contains(a)?(t.value=!0,(c=e.onFocus)==null||c.call(e)):(t.value=!1,(s=e.onBlur)==null||s.call(e))});ye(()=>{n(),ve--,ve||Fa()})}return nt(t)}function Oa(){document.addEventListener("focusin",We),Ke=!0,Ve.value=document.activeElement}function Fa(){document.removeEventListener("focusin",We)}function We(){Ve.value=document.activeElement}const Da={class:"VPMenuLink"},ja=["innerHTML"],Ua=p({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(r(),d("div",Da,[b(j,{class:T({active:l(K)(l(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon},{default:m(()=>[i("span",{innerHTML:e.item.text},null,8,ja)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),ce=k(Ua,[["__scopeId","data-v-35975db6"]]),qa={class:"VPMenuGroup"},Ga={key:0,class:"title"},Ra=p({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(r(),d("div",qa,[e.text?(r(),d("p",Ga,x(e.text),1)):h("",!0),(r(!0),d(M,null,E(e.items,a=>(r(),d(M,null,["link"in a?(r(),g(ce,{key:0,item:a},null,8,["item"])):h("",!0)],64))),256))]))}}),za=k(Ra,[["__scopeId","data-v-69e747b5"]]),Ka={class:"VPMenu"},Wa={key:0,class:"items"},Ja=p({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(r(),d("div",Ka,[e.items?(r(),d("div",Wa,[(r(!0),d(M,null,E(e.items,a=>(r(),d(M,{key:JSON.stringify(a)},["link"in a?(r(),g(ce,{key:0,item:a},null,8,["item"])):"component"in a?(r(),g(D(a.component),R({key:1,ref_for:!0},a.props),null,16)):(r(),g(za,{key:2,text:a.text,items:a.items},null,8,["text","items"]))],64))),128))])):h("",!0),u(t.$slots,"default",{},void 0,!0)]))}}),Qa=k(Ja,[["__scopeId","data-v-b98bc113"]]),Ya=["aria-expanded","aria-label"],Xa={key:0,class:"text"},Za=["innerHTML"],eo={key:1,class:"vpi-more-horizontal icon"},to={class:"menu"},no=p({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=V(!1),n=V();Ha({el:n,onBlur:a});function a(){t.value=!1}return(o,c)=>(r(),d("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:c[1]||(c[1]=s=>t.value=!0),onMouseleave:c[2]||(c[2]=s=>t.value=!1)},[i("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:c[0]||(c[0]=s=>t.value=!t.value)},[e.button||e.icon?(r(),d("span",Xa,[e.icon?(r(),d("span",{key:0,class:T([e.icon,"option-icon"])},null,2)):h("",!0),e.button?(r(),d("span",{key:1,innerHTML:e.button},null,8,Za)):h("",!0),c[3]||(c[3]=i("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(r(),d("span",eo))],8,Ya),i("div",to,[b(Qa,{items:e.items},{default:m(()=>[u(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),we=k(no,[["__scopeId","data-v-cf11d7a2"]]),ao=["href","aria-label","innerHTML"],oo=p({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,n=V();z(async()=>{var c;await ne();const o=(c=n.value)==null?void 0:c.children[0];o instanceof HTMLElement&&o.className.startsWith("vpi-social-")&&(getComputedStyle(o).maskImage||getComputedStyle(o).webkitMaskImage)==="none"&&o.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${t.icon}.svg')`)});const a=$(()=>typeof t.icon=="object"?t.icon.svg:`<span class="vpi-social-${t.icon}"></span>`);return(o,c)=>(r(),d("a",{ref_key:"el",ref:n,class:"VPSocialLink no-icon",href:e.link,"aria-label":e.ariaLabel??(typeof e.icon=="string"?e.icon:""),target:"_blank",rel:"noopener",innerHTML:a.value},null,8,ao))}}),so=k(oo,[["__scopeId","data-v-bd121fe5"]]),io={class:"VPSocialLinks"},ro=p({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,n)=>(r(),d("div",io,[(r(!0),d(M,null,E(e.links,({link:a,icon:o,ariaLabel:c})=>(r(),g(so,{key:a,icon:o,link:a,ariaLabel:c},null,8,["icon","link","ariaLabel"]))),128))]))}}),Te=k(ro,[["__scopeId","data-v-7bc22406"]]),lo={key:0,class:"group translations"},co={class:"trans-title"},uo={key:1,class:"group"},vo={class:"item appearance"},fo={class:"label"},mo={class:"appearance-action"},ho={key:2,class:"group"},po={class:"item social-links"},bo=p({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=L(),{localeLinks:a,currentLang:o}=Z({correspondingLink:!0}),c=$(()=>a.value.length&&o.value.label||t.value.appearance||n.value.socialLinks);return(s,f)=>c.value?(r(),g(we,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:m(()=>[l(a).length&&l(o).label?(r(),d("div",lo,[i("p",co,x(l(o).label),1),(r(!0),d(M,null,E(l(a),v=>(r(),g(ce,{key:v.link,item:v},null,8,["item"]))),128))])):h("",!0),l(t).appearance&&l(t).appearance!=="force-dark"&&l(t).appearance!=="force-auto"?(r(),d("div",uo,[i("div",vo,[i("p",fo,x(l(n).darkModeSwitchLabel||"Appearance"),1),i("div",mo,[b(Se)])])])):h("",!0),l(n).socialLinks?(r(),d("div",ho,[i("div",po,[b(Te,{class:"social-links-list",links:l(n).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}}),go=k(bo,[["__scopeId","data-v-bb2aa2f0"]]),ko=["aria-expanded"],_o=p({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(r(),d("button",{type:"button",class:T(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=a=>t.$emit("click"))},[...n[1]||(n[1]=[i("span",{class:"container"},[i("span",{class:"top"}),i("span",{class:"middle"}),i("span",{class:"bottom"})],-1)])],10,ko))}}),yo=k(_o,[["__scopeId","data-v-e5dd9c1c"]]),$o=["innerHTML"],Po=p({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(r(),g(j,{class:T({VPNavBarMenuLink:!0,active:l(K)(l(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,tabindex:"0"},{default:m(()=>[i("span",{innerHTML:e.item.text},null,8,$o)]),_:1},8,["class","href","target","rel","no-icon"]))}}),Lo=k(Po,[["__scopeId","data-v-e56f3d57"]]),So=p({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=L(),a=c=>"component"in c?!1:"link"in c?K(n.value.relativePath,c.link,!!t.item.activeMatch):c.items.some(a),o=$(()=>a(t.item));return(c,s)=>(r(),g(we,{class:T({VPNavBarMenuGroup:!0,active:l(K)(l(n).relativePath,e.item.activeMatch,!!e.item.activeMatch)||o.value}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),Vo={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},wo=p({__name:"VPNavBarMenu",setup(e){const{theme:t}=L();return(n,a)=>l(t).nav?(r(),d("nav",Vo,[a[0]||(a[0]=i("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(r(!0),d(M,null,E(l(t).nav,o=>(r(),d(M,{key:JSON.stringify(o)},["link"in o?(r(),g(Lo,{key:0,item:o},null,8,["item"])):"component"in o?(r(),g(D(o.component),R({key:1,ref_for:!0},o.props),null,16)):(r(),g(So,{key:2,item:o},null,8,["item"]))],64))),128))])):h("",!0)}}),To=k(wo,[["__scopeId","data-v-dc692963"]]);function xo(e){const{localeIndex:t,theme:n}=L();function a(o){var N,A,H;const c=o.split("."),s=(N=n.value.search)==null?void 0:N.options,f=s&&typeof s=="object",v=f&&((H=(A=s.locales)==null?void 0:A[t.value])==null?void 0:H.translations)||null,y=f&&s.translations||null;let S=v,_=y,P=e;const w=c.pop();for(const F of c){let G=null;const J=P==null?void 0:P[F];J&&(G=P=J);const ue=_==null?void 0:_[F];ue&&(G=_=ue);const de=S==null?void 0:S[F];de&&(G=S=de),J||(P=G),ue||(_=G),de||(S=G)}return(S==null?void 0:S[w])??(_==null?void 0:_[w])??(P==null?void 0:P[w])??""}return a}const Mo=["aria-label"],No={class:"DocSearch-Button-Container"},Ao={class:"DocSearch-Button-Placeholder"},Me=p({__name:"VPNavBarSearchButton",setup(e){const n=xo({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(a,o)=>(r(),d("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":l(n)("button.buttonAriaLabel")},[i("span",No,[o[0]||(o[0]=i("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),i("span",Ao,x(l(n)("button.buttonText")),1)]),o[1]||(o[1]=i("span",{class:"DocSearch-Button-Keys"},[i("kbd",{class:"DocSearch-Button-Key"}),i("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,Mo))}}),Io={class:"VPNavBarSearch"},Co={id:"local-search"},Eo={key:1,id:"docsearch"},Bo=p({__name:"VPNavBarSearch",setup(e){const t=at(()=>ot(()=>import("./VPLocalSearchBox.DsZrQKQR.js"),__vite__mapDeps([0,1]))),n=()=>null,{theme:a}=L(),o=V(!1),c=V(!1);z(()=>{});function s(){o.value||(o.value=!0,setTimeout(f,16))}function f(){const _=new Event("keydown");_.key="k",_.metaKey=!0,window.dispatchEvent(_),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||f()},16)}function v(_){const P=_.target,w=P.tagName;return P.isContentEditable||w==="INPUT"||w==="SELECT"||w==="TEXTAREA"}const y=V(!1);he("k",_=>{(_.ctrlKey||_.metaKey)&&(_.preventDefault(),y.value=!0)}),he("/",_=>{v(_)||(_.preventDefault(),y.value=!0)});const S="local";return(_,P)=>{var w;return r(),d("div",Io,[l(S)==="local"?(r(),d(M,{key:0},[y.value?(r(),g(l(t),{key:0,onClose:P[0]||(P[0]=N=>y.value=!1)})):h("",!0),i("div",Co,[b(Me,{onClick:P[1]||(P[1]=N=>y.value=!0)})])],64)):l(S)==="algolia"?(r(),d(M,{key:1},[o.value?(r(),g(l(n),{key:0,algolia:((w=l(a).search)==null?void 0:w.options)??l(a).algolia,onVnodeBeforeMount:P[2]||(P[2]=N=>c.value=!0)},null,8,["algolia"])):h("",!0),c.value?h("",!0):(r(),d("div",Eo,[b(Me,{onClick:s})]))],64)):h("",!0)])}}}),Ho=p({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>l(t).socialLinks?(r(),g(Te,{key:0,class:"VPNavBarSocialLinks",links:l(t).socialLinks},null,8,["links"])):h("",!0)}}),Oo=k(Ho,[["__scopeId","data-v-0394ad82"]]),Fo=["href","rel","target"],Do=["innerHTML"],jo={key:2},Uo=p({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=L(),{hasSidebar:a}=q(),{currentLang:o}=Z(),c=$(()=>{var v;return typeof n.value.logoLink=="string"?n.value.logoLink:(v=n.value.logoLink)==null?void 0:v.link}),s=$(()=>{var v;return typeof n.value.logoLink=="string"||(v=n.value.logoLink)==null?void 0:v.rel}),f=$(()=>{var v;return typeof n.value.logoLink=="string"||(v=n.value.logoLink)==null?void 0:v.target});return(v,y)=>(r(),d("div",{class:T(["VPNavBarTitle",{"has-sidebar":l(a)}])},[i("a",{class:"title",href:c.value??l(Pe)(l(o).link),rel:s.value,target:f.value},[u(v.$slots,"nav-bar-title-before",{},void 0,!0),l(n).logo?(r(),g(ae,{key:0,class:"logo",image:l(n).logo},null,8,["image"])):h("",!0),l(n).siteTitle?(r(),d("span",{key:1,innerHTML:l(n).siteTitle},null,8,Do)):l(n).siteTitle===void 0?(r(),d("span",jo,x(l(t).title),1)):h("",!0),u(v.$slots,"nav-bar-title-after",{},void 0,!0)],8,Fo)],2))}}),qo=k(Uo,[["__scopeId","data-v-1168a8e4"]]),Go={class:"items"},Ro={class:"title"},zo=p({__name:"VPNavBarTranslations",setup(e){const{theme:t}=L(),{localeLinks:n,currentLang:a}=Z({correspondingLink:!0});return(o,c)=>l(n).length&&l(a).label?(r(),g(we,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:l(t).langMenuLabel||"Change language"},{default:m(()=>[i("div",Go,[i("p",Ro,x(l(a).label),1),(r(!0),d(M,null,E(l(n),s=>(r(),g(ce,{key:s.link,item:s},null,8,["item"]))),128))])]),_:1},8,["label"])):h("",!0)}}),Ko=k(zo,[["__scopeId","data-v-88af2de4"]]),Wo={class:"wrapper"},Jo={class:"container"},Qo={class:"title"},Yo={class:"content"},Xo={class:"content-body"},Zo=p({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const t=e,{y:n}=De(),{hasSidebar:a}=q(),{frontmatter:o}=L(),c=V({});return $e(()=>{c.value={"has-sidebar":a.value,home:o.value.layout==="home",top:n.value===0,"screen-open":t.isScreenOpen}}),(s,f)=>(r(),d("div",{class:T(["VPNavBar",c.value])},[i("div",Wo,[i("div",Jo,[i("div",Qo,[b(qo,null,{"nav-bar-title-before":m(()=>[u(s.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":m(()=>[u(s.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),i("div",Yo,[i("div",Xo,[u(s.$slots,"nav-bar-content-before",{},void 0,!0),b(Bo,{class:"search"}),b(To,{class:"menu"}),b(Ko,{class:"translations"}),b(Ba,{class:"appearance"}),b(Oo,{class:"social-links"}),b(go,{class:"extra"}),u(s.$slots,"nav-bar-content-after",{},void 0,!0),b(yo,{class:"hamburger",active:e.isScreenOpen,onClick:f[0]||(f[0]=v=>s.$emit("toggle-screen"))},null,8,["active"])])])])]),f[1]||(f[1]=i("div",{class:"divider"},[i("div",{class:"divider-line"})],-1))],2))}}),es=k(Zo,[["__scopeId","data-v-6aa21345"]]),ts={key:0,class:"VPNavScreenAppearance"},ns={class:"text"},as=p({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=L();return(a,o)=>l(t).appearance&&l(t).appearance!=="force-dark"&&l(t).appearance!=="force-auto"?(r(),d("div",ts,[i("p",ns,x(l(n).darkModeSwitchLabel||"Appearance"),1),b(Se)])):h("",!0)}}),os=k(as,[["__scopeId","data-v-b44890b2"]]),ss=["innerHTML"],is=p({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=le("close-screen");return(n,a)=>(r(),g(j,{class:"VPNavScreenMenuLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:l(t)},{default:m(()=>[i("span",{innerHTML:e.item.text},null,8,ss)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),rs=k(is,[["__scopeId","data-v-df37e6dd"]]),ls=["innerHTML"],cs=p({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=le("close-screen");return(n,a)=>(r(),g(j,{class:"VPNavScreenMenuGroupLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:l(t)},{default:m(()=>[i("span",{innerHTML:e.item.text},null,8,ls)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Je=k(cs,[["__scopeId","data-v-3e9c20e4"]]),us={class:"VPNavScreenMenuGroupSection"},ds={key:0,class:"title"},vs=p({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(r(),d("div",us,[e.text?(r(),d("p",ds,x(e.text),1)):h("",!0),(r(!0),d(M,null,E(e.items,a=>(r(),g(Je,{key:a.text,item:a},null,8,["item"]))),128))]))}}),fs=k(vs,[["__scopeId","data-v-8133b170"]]),ms=["aria-controls","aria-expanded"],hs=["innerHTML"],ps=["id"],bs={key:0,class:"item"},gs={key:1,class:"item"},ks={key:2,class:"group"},_s=p({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=V(!1),a=$(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(c,s)=>(r(),d("div",{class:T(["VPNavScreenMenuGroup",{open:n.value}])},[i("button",{class:"button","aria-controls":a.value,"aria-expanded":n.value,onClick:o},[i("span",{class:"button-text",innerHTML:e.text},null,8,hs),s[0]||(s[0]=i("span",{class:"vpi-plus button-icon"},null,-1))],8,ms),i("div",{id:a.value,class:"items"},[(r(!0),d(M,null,E(e.items,f=>(r(),d(M,{key:JSON.stringify(f)},["link"in f?(r(),d("div",bs,[b(Je,{item:f},null,8,["item"])])):"component"in f?(r(),d("div",gs,[(r(),g(D(f.component),R({ref_for:!0},f.props,{"screen-menu":""}),null,16))])):(r(),d("div",ks,[b(fs,{text:f.text,items:f.items},null,8,["text","items"])]))],64))),128))],8,ps)],2))}}),ys=k(_s,[["__scopeId","data-v-b9ab8c58"]]),$s={key:0,class:"VPNavScreenMenu"},Ps=p({__name:"VPNavScreenMenu",setup(e){const{theme:t}=L();return(n,a)=>l(t).nav?(r(),d("nav",$s,[(r(!0),d(M,null,E(l(t).nav,o=>(r(),d(M,{key:JSON.stringify(o)},["link"in o?(r(),g(rs,{key:0,item:o},null,8,["item"])):"component"in o?(r(),g(D(o.component),R({key:1,ref_for:!0},o.props,{"screen-menu":""}),null,16)):(r(),g(ys,{key:2,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),Ls=p({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>l(t).socialLinks?(r(),g(Te,{key:0,class:"VPNavScreenSocialLinks",links:l(t).socialLinks},null,8,["links"])):h("",!0)}}),Ss={class:"list"},Vs=p({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=Z({correspondingLink:!0}),a=V(!1);function o(){a.value=!a.value}return(c,s)=>l(t).length&&l(n).label?(r(),d("div",{key:0,class:T(["VPNavScreenTranslations",{open:a.value}])},[i("button",{class:"title",onClick:o},[s[0]||(s[0]=i("span",{class:"vpi-languages icon lang"},null,-1)),B(" "+x(l(n).label)+" ",1),s[1]||(s[1]=i("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),i("ul",Ss,[(r(!0),d(M,null,E(l(t),f=>(r(),d("li",{key:f.link,class:"item"},[b(j,{class:"link",href:f.link},{default:m(()=>[B(x(f.text),1)]),_:2},1032,["href"])]))),128))])],2)):h("",!0)}}),ws=k(Vs,[["__scopeId","data-v-858fe1a4"]]),Ts={class:"container"},xs=p({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=V(null),n=je(X?document.body:null);return(a,o)=>(r(),g(_e,{name:"fade",onEnter:o[0]||(o[0]=c=>n.value=!0),onAfterLeave:o[1]||(o[1]=c=>n.value=!1)},{default:m(()=>[e.open?(r(),d("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[i("div",Ts,[u(a.$slots,"nav-screen-content-before",{},void 0,!0),b(Ps,{class:"menu"}),b(ws,{class:"translations"}),b(os,{class:"appearance"}),b(Ls,{class:"social-links"}),u(a.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):h("",!0)]),_:3}))}}),Ms=k(xs,[["__scopeId","data-v-f2779853"]]),Ns={key:0,class:"VPNav"},As=p({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:a}=Va(),{frontmatter:o}=L(),c=$(()=>o.value.navbar!==!1);return Ue("close-screen",n),se(()=>{X&&document.documentElement.classList.toggle("hide-nav",!c.value)}),(s,f)=>c.value?(r(),d("header",Ns,[b(es,{"is-screen-open":l(t),onToggleScreen:l(a)},{"nav-bar-title-before":m(()=>[u(s.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":m(()=>[u(s.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":m(()=>[u(s.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":m(()=>[u(s.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),b(Ms,{open:l(t)},{"nav-screen-content-before":m(()=>[u(s.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":m(()=>[u(s.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}}),Is=k(As,[["__scopeId","data-v-ae24b3ad"]]),Cs=["role","tabindex"],Es={key:1,class:"items"},Bs=p({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:a,isLink:o,isActiveLink:c,hasActiveLink:s,hasChildren:f,toggle:v}=xt($(()=>t.item)),y=$(()=>f.value?"section":"div"),S=$(()=>o.value?"a":"div"),_=$(()=>f.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),P=$(()=>o.value?void 0:"button"),w=$(()=>[[`level-${t.depth}`],{collapsible:a.value},{collapsed:n.value},{"is-link":o.value},{"is-active":c.value},{"has-active":s.value}]);function N(H){"key"in H&&H.key!=="Enter"||!t.item.link&&v()}function A(){t.item.link&&v()}return(H,F)=>{const G=W("VPSidebarItem",!0);return r(),g(D(y.value),{class:T(["VPSidebarItem",w.value])},{default:m(()=>[e.item.text?(r(),d("div",R({key:0,class:"item",role:P.value},st(e.item.items?{click:N,keydown:N}:{},!0),{tabindex:e.item.items&&0}),[F[1]||(F[1]=i("div",{class:"indicator"},null,-1)),e.item.link?(r(),g(j,{key:0,tag:S.value,class:"link",href:e.item.link,rel:e.item.rel,target:e.item.target},{default:m(()=>[(r(),g(D(_.value),{class:"text",innerHTML:e.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(r(),g(D(_.value),{key:1,class:"text",innerHTML:e.item.text},null,8,["innerHTML"])),e.item.collapsed!=null&&e.item.items&&e.item.items.length?(r(),d("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:A,onKeydown:it(A,["enter"]),tabindex:"0"},[...F[0]||(F[0]=[i("span",{class:"vpi-chevron-right caret-icon"},null,-1)])],32)):h("",!0)],16,Cs)):h("",!0),e.item.items&&e.item.items.length?(r(),d("div",Es,[e.depth<5?(r(!0),d(M,{key:0},E(e.item.items,J=>(r(),g(G,{key:J.text,item:J,depth:e.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}}),Hs=k(Bs,[["__scopeId","data-v-b3fd67f8"]]),Os=p({__name:"VPSidebarGroup",props:{items:{}},setup(e){const t=V(!0);let n=null;return z(()=>{n=setTimeout(()=>{n=null,t.value=!1},300)}),rt(()=>{n!=null&&(clearTimeout(n),n=null)}),(a,o)=>(r(!0),d(M,null,E(e.items,c=>(r(),d("div",{key:c.text,class:T(["group",{"no-transition":t.value}])},[b(Hs,{item:c,depth:0},null,8,["item"])],2))),128))}}),Fs=k(Os,[["__scopeId","data-v-c40bc020"]]),Ds={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},js=p({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:n}=q(),a=e,o=V(null),c=je(X?document.body:null);U([a,o],()=>{var f;a.open?(c.value=!0,(f=o.value)==null||f.focus()):c.value=!1},{immediate:!0,flush:"post"});const s=V(0);return U(t,()=>{s.value+=1},{deep:!0}),(f,v)=>l(n)?(r(),d("aside",{key:0,class:T(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:o,onClick:v[0]||(v[0]=qe(()=>{},["stop"]))},[v[2]||(v[2]=i("div",{class:"curtain"},null,-1)),i("nav",Ds,[v[1]||(v[1]=i("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),u(f.$slots,"sidebar-nav-before",{},void 0,!0),(r(),g(Fs,{items:l(t),key:s.value},null,8,["items"])),u(f.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}}),Us=k(js,[["__scopeId","data-v-319d5ca6"]]),qs=p({__name:"VPSkipLink",setup(e){const{theme:t}=L(),n=re(),a=V();U(()=>n.path,()=>a.value.focus());function o({target:c}){const s=document.getElementById(decodeURIComponent(c.hash).slice(1));if(s){const f=()=>{s.removeAttribute("tabindex"),s.removeEventListener("blur",f)};s.setAttribute("tabindex","-1"),s.addEventListener("blur",f),s.focus(),window.scrollTo(0,0)}}return(c,s)=>(r(),d(M,null,[i("span",{ref_key:"backToTop",ref:a,tabindex:"-1"},null,512),i("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o},x(l(t).skipToContentLabel||"Skip to content"),1)],64))}}),Gs=k(qs,[["__scopeId","data-v-0b0ada53"]]),Rs=p({__name:"Layout",setup(e){const{isOpen:t,open:n,close:a}=q(),o=re();U(()=>o.path,a),Tt(t,a);const{frontmatter:c}=L(),s=lt(),f=$(()=>!!s["home-hero-image"]);return Ue("hero-image-slot-exists",f),(v,y)=>{const S=W("Content");return l(c).layout!==!1?(r(),d("div",{key:0,class:T(["Layout",l(c).pageClass])},[u(v.$slots,"layout-top",{},void 0,!0),b(Gs),b(ht,{class:"backdrop",show:l(t),onClick:l(a)},null,8,["show","onClick"]),b(Is,null,{"nav-bar-title-before":m(()=>[u(v.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":m(()=>[u(v.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":m(()=>[u(v.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":m(()=>[u(v.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":m(()=>[u(v.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":m(()=>[u(v.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),b(Sa,{open:l(t),onOpenMenu:l(n)},null,8,["open","onOpenMenu"]),b(Us,{open:l(t)},{"sidebar-nav-before":m(()=>[u(v.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":m(()=>[u(v.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),b(ca,null,{"page-top":m(()=>[u(v.$slots,"page-top",{},void 0,!0)]),"page-bottom":m(()=>[u(v.$slots,"page-bottom",{},void 0,!0)]),"not-found":m(()=>[u(v.$slots,"not-found",{},void 0,!0)]),"home-hero-before":m(()=>[u(v.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":m(()=>[u(v.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":m(()=>[u(v.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":m(()=>[u(v.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":m(()=>[u(v.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":m(()=>[u(v.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":m(()=>[u(v.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":m(()=>[u(v.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":m(()=>[u(v.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":m(()=>[u(v.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":m(()=>[u(v.$slots,"doc-before",{},void 0,!0)]),"doc-after":m(()=>[u(v.$slots,"doc-after",{},void 0,!0)]),"doc-top":m(()=>[u(v.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":m(()=>[u(v.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":m(()=>[u(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":m(()=>[u(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":m(()=>[u(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":m(()=>[u(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":m(()=>[u(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":m(()=>[u(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),b(ma),u(v.$slots,"layout-bottom",{},void 0,!0)],2)):(r(),g(S,{key:1}))}}}),zs=k(Rs,[["__scopeId","data-v-5d98c3a5"]]),Ks={Layout:zs,enhanceApp:({app:e})=>{e.component("Badge",vt)}},Ws={id:"main-content",class:"tuning-landing"},Js={class:"hero","aria-labelledby":"page-title"},Qs={class:"container hero-grid"},Ys={class:"hero-copy"},Xs={class:"hero-actions"},Zs=["href"],ei={class:"known-term-row"},ti={class:"signal-board","aria-label":"Example symptom paths"},ni={class:"signal-list"},ai=["href"],oi=["href"],si=["href"],ii={class:"section",id:"symptoms","aria-labelledby":"symptoms-title"},ri={class:"container"},li={class:"symptom-grid"},ci={class:"symptom"},ui=["href"],di={class:"symptom"},vi=["href"],fi={class:"symptom"},mi=["href"],hi={class:"symptom"},pi=["href"],bi={class:"symptom"},gi=["href"],ki=p({__name:"TuningLanding",setup(e){const t=ct(),n=V(""),a={memory:"memory-model","memory-model":"memory-model",spill:"memory-model","spark.memory.fraction":"memory-model",shuffle:"shuffle","spark.sql.shuffle.partitions":"shuffle",joins:"joins",join:"joins","spark.sql.autobroadcastjointhreshold":"joins",aqe:"aqe","spark.sql.adaptive.enabled":"aqe",config:"config"};function o(){const c=n.value.trim().toLowerCase(),s=a[c]||"config";t.go(O(`/tuning-reference/${s}`))}return(c,s)=>(r(),d("main",Ws,[i("section",Js,[i("div",Qs,[i("div",Ys,[s[6]||(s[6]=i("p",{class:"eyebrow"},"Practical mechanics, stable references",-1)),s[7]||(s[7]=i("h1",{id:"page-title"},"Spark tuning reference",-1)),s[8]||(s[8]=i("p",{class:"hero-summary"}," Move from a job symptom to the Spark mechanics and settings that can change its outcome without treating a tuning guess as evidence. ",-1)),i("div",Xs,[i("a",{class:"button button-primary",href:l(O)("/tuning-reference/intro")},[...s[1]||(s[1]=[B("Browse the full reference ",-1),i("span",{class:"arrow","aria-hidden":"true"},"→",-1)])],8,Zs),s[5]||(s[5]=i("a",{class:"button button-secondary",href:"#symptoms"},"Choose a symptom",-1)),i("form",{class:"known-term",onSubmit:qe(o,["prevent"])},[s[3]||(s[3]=i("label",{for:"known-term-input"},"Know the term or config key?",-1)),i("div",ei,[ut(i("input",{id:"known-term-input","onUpdate:modelValue":s[0]||(s[0]=f=>n.value=f),name:"term",type:"search",list:"known-term-options",placeholder:"e.g. spark.sql.shuffle.partitions",autocomplete:"off"},null,512),[[dt,n.value]]),s[2]||(s[2]=i("button",{class:"button button-secondary",type:"submit"},"Jump to topic",-1))]),s[4]||(s[4]=xe('<small data-v-5d65fdb9>Known routes: memory, shuffle, joins, AQE, and config. Other terms open the configuration reference.</small><datalist id="known-term-options" data-v-5d65fdb9><option value="memory" data-v-5d65fdb9></option><option value="shuffle" data-v-5d65fdb9></option><option value="joins" data-v-5d65fdb9></option><option value="AQE" data-v-5d65fdb9></option><option value="config" data-v-5d65fdb9></option><option value="spark.memory.fraction" data-v-5d65fdb9></option><option value="spark.sql.shuffle.partitions" data-v-5d65fdb9></option><option value="spark.sql.adaptive.enabled" data-v-5d65fdb9></option><option value="spark.sql.autoBroadcastJoinThreshold" data-v-5d65fdb9></option></datalist>',2))],32)])]),i("aside",ti,[s[12]||(s[12]=i("div",{class:"board-label"},"evidence → mechanic → lever",-1)),i("ul",ni,[i("li",null,[i("a",{class:"signal-link",href:l(O)("/tuning-reference/memory-model")},[...s[9]||(s[9]=[i("span",{class:"signal-marker","aria-hidden":"true"},null,-1),i("span",{class:"signal-title"},"Executor memory pressure",-1),i("span",{class:"signal-destination"},"#memory-model",-1)])],8,ai)]),i("li",null,[i("a",{class:"signal-link",href:l(O)("/tuning-reference/shuffle")},[...s[10]||(s[10]=[i("span",{class:"signal-marker","aria-hidden":"true"},null,-1),i("span",{class:"signal-title"},"Slow, wide stages",-1),i("span",{class:"signal-destination"},"#shuffle",-1)])],8,oi)]),i("li",null,[i("a",{class:"signal-link",href:l(O)("/tuning-reference/joins")},[...s[11]||(s[11]=[i("span",{class:"signal-marker","aria-hidden":"true"},null,-1),i("span",{class:"signal-title"},"Join strategy drift",-1),i("span",{class:"signal-destination"},"#joins",-1)])],8,si)])])])])]),i("section",ii,[i("div",ri,[s[23]||(s[23]=i("div",{class:"section-heading"},[i("h2",{id:"symptoms-title"},"Symptoms, mapped to the right lever"),i("p",null,"Each path stays on the canonical reference document, so existing links and saved anchors continue to work."),i("p",{class:"decision-note"},[i("strong",null,"How to use this:"),B(" SparkForensics reads your Spark event log and surfaces evidence; this reference explains the mechanics and settings behind it. Diagnose the symptom, change one informed lever, then validate against the next run's evidence. Confirm behavior and defaults against your deployed Spark version and distribution. ")])],-1)),i("div",li,[i("article",ci,[s[14]||(s[14]=i("div",null,[i("h3",null,"Spill or GC pressure"),i("p",null,"Trace executor memory, object lifetime, and the trade-offs behind changing memory settings.")],-1)),i("a",{href:l(O)("/tuning-reference/memory-model")},[...s[13]||(s[13]=[B("Open memory model ",-1),i("span",{"aria-hidden":"true"},"→",-1)])],8,ui)]),i("article",di,[s[16]||(s[16]=i("div",null,[i("h3",null,"Shuffle-heavy stages"),i("p",null,"Understand write/read costs, partition size, and why moving data becomes the bottleneck.")],-1)),i("a",{href:l(O)("/tuning-reference/shuffle")},[...s[15]||(s[15]=[B("Open shuffle guide ",-1),i("span",{"aria-hidden":"true"},"→",-1)])],8,vi)]),i("article",fi,[s[18]||(s[18]=i("div",null,[i("h3",null,"Slow or skewed joins"),i("p",null,"Compare join mechanics before changing broadcast thresholds or reshaping a plan.")],-1)),i("a",{href:l(O)("/tuning-reference/joins")},[...s[17]||(s[17]=[B("Open join optimization ",-1),i("span",{"aria-hidden":"true"},"→",-1)])],8,mi)]),i("article",hi,[s[20]||(s[20]=i("div",null,[i("h3",null,"Plan adapts poorly"),i("p",null,"Use AQE's runtime choices as an inspectable mechanism, not a checkbox to enable blindly.")],-1)),i("a",{href:l(O)("/tuning-reference/aqe")},[...s[19]||(s[19]=[B("Open AQE guide ",-1),i("span",{"aria-hidden":"true"},"→",-1)])],8,pi)]),i("article",bi,[s[22]||(s[22]=i("div",null,[i("h3",null,"Need the exact setting"),i("p",null,"Check a setting's scope, default, and interaction before applying it to a cluster.")],-1)),i("a",{href:l(O)("/tuning-reference/config")},[...s[21]||(s[21]=[B("Open config reference ",-1),i("span",{"aria-hidden":"true"},"→",-1)])],8,gi)])])])]),s[24]||(s[24]=xe('<section class="section workflow" aria-labelledby="workflow-title" data-v-5d65fdb9><div class="container workflow-grid" data-v-5d65fdb9><div class="workflow-copy" data-v-5d65fdb9><h2 id="workflow-title" data-v-5d65fdb9>Let SparkForensics surface the evidence. Use this reference to reason about it.</h2><p data-v-5d65fdb9>The two tools stay deliberately separate: SparkForensics reads the event log; this static reference explains the mechanics and settings behind what you find.</p></div><ol class="steps" data-v-5d65fdb9><li data-v-5d65fdb9><span class="step-label" data-v-5d65fdb9>Observe</span><div data-v-5d65fdb9><strong data-v-5d65fdb9>Read the stage or executor behavior</strong><span data-v-5d65fdb9>Start with the event log, metrics, and plan details Spark already produces.</span></div></li><li data-v-5d65fdb9><span class="step-label" data-v-5d65fdb9>Explain</span><div data-v-5d65fdb9><strong data-v-5d65fdb9>Name the mechanism at work</strong><span data-v-5d65fdb9>Use the stable reference anchors to connect symptoms to memory, shuffle, joins, AQE, or configuration.</span></div></li><li data-v-5d65fdb9><span class="step-label" data-v-5d65fdb9>Test</span><div data-v-5d65fdb9><strong data-v-5d65fdb9>Change one informed lever</strong><span data-v-5d65fdb9>Make a measured change, then compare the evidence again rather than carrying a tuning superstition forward.</span></div></li></ol></div></section>',1))]))}}),_i=k(ki,[["__scopeId","data-v-5d65fdb9"]]),Ne="citation-chip",Ae="citation-popover",yi=150;let I=null,C=null,Q=!1,te=null,Ie=!1;function $i(){const e=new Map;return document.querySelectorAll("section.footnotes li.footnote-item[id]").forEach(t=>{const n=t.cloneNode(!0);n.querySelectorAll("a.footnote-backref").forEach(o=>o.remove());const a=n.querySelector("a[href]");e.set(t.id,{href:a?a.getAttribute("href"):null,title:(n.textContent??"").trim()})}),e}function oe(){te!==null&&(clearTimeout(te),te=null)}function ke(){oe(),te=setTimeout(()=>{Q||Y()},yi)}function Y(){oe(),I==null||I.remove(),I=null,C==null||C.removeAttribute("aria-describedby"),C==null||C.setAttribute("aria-expanded","false"),C=null,Q=!1}function Pi(e,t){const n=t.getBoundingClientRect(),a=6,{width:o,height:c}=e.getBoundingClientRect();let s=n.bottom+a;s+c>window.innerHeight-8&&(s=n.top-c-a);const f=window.innerWidth-o-8;e.style.top=`${Math.max(8,s)}px`,e.style.left=`${Math.min(Math.max(8,n.left),Math.max(8,f))}px`}function fe(e,t,n){oe();const a=C===e;if(a||C==null||C.setAttribute("aria-expanded","false"),I||(I=document.createElement("div"),I.id=Ae,I.className="citation-popover",I.setAttribute("role","tooltip"),I.addEventListener("mouseenter",oe),I.addEventListener("mouseleave",ke),document.body.appendChild(I)),I.replaceChildren(),t.href){const o=document.createElement("a");o.href=t.href,o.target="_blank",o.rel="noreferrer",o.textContent=t.title,I.appendChild(o)}else I.textContent=t.title;e.setAttribute("aria-describedby",Ae),e.setAttribute("aria-expanded","true"),C=e,n?Q=!0:a||(Q=!1),Pi(I,e)}function Li(e,t){if(e.classList.contains(Ne))return;const n=(e.getAttribute("href")??"").replace(/^#/,""),a=t.get(n);if(!a)return;e.removeAttribute("href"),e.setAttribute("role","button"),e.tabIndex=0,e.classList.add(Ne),e.setAttribute("aria-haspopup","true"),e.setAttribute("aria-expanded","false"),e.textContent=n.replace(/^fn/,"");const o=()=>{C===e&&Q?Y():fe(e,a,!0)};e.addEventListener("mouseenter",()=>fe(e,a,!1)),e.addEventListener("mouseleave",ke),e.addEventListener("focus",()=>fe(e,a,!1)),e.addEventListener("blur",ke),e.addEventListener("click",o),e.addEventListener("keydown",c=>{(c.key==="Enter"||c.key===" ")&&(c.preventDefault(),o())})}function Si(){Ie||(Ie=!0,document.addEventListener("click",e=>{if(!Q||!C)return;const t=e.target;C.contains(t)||I!=null&&I.contains(t)||Y()}),document.addEventListener("keydown",e=>{e.key==="Escape"&&Y()}))}function Ce(){Y(),Si();const e=$i();document.querySelectorAll("sup.footnote-ref > a[href]").forEach(t=>{Li(t,e)})}const Qe="shuffle-works-theme";function Vi(){try{const e=window.localStorage.getItem(Qe);return e==="light"||e==="dark"?e:null}catch{return null}}function Ee(e){const t=e?"dark":"light";try{window.localStorage.setItem(Qe,t)}catch{}document.documentElement.dataset.theme=t}function wi(){if(!location.hash)return;let e=null;try{e=document.getElementById(decodeURIComponent(location.hash.slice(1)))}catch{return}e==null||e.scrollIntoView()}const xi={extends:Ks,enhanceApp({app:e,router:t}){if(e.component("TuningLanding",_i),!X)return;t.onAfterRouteChange=()=>{ne(()=>Ce())};const n=e.mount.bind(e);e.mount=(...a)=>{const o=n(...a);return ne(()=>{Ce(),requestAnimationFrame(wi)}),o},e.runWithContext(()=>{const{isDark:a}=Be(),o=Vi();o&&(a.value=o==="dark"),Ee(a.value),U(a,v=>Ee(v)),new MutationObserver(()=>{const v=document.documentElement.dataset.theme;if(v==="light"||v==="dark"){const y=v==="dark";a.value!==y&&(a.value=y)}}).observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]});const s=()=>{document.querySelectorAll(".VPNavBarAppearance, .VPNavScreenAppearance, .VPNavBarExtra .appearance-action").forEach(v=>{v.hasAttribute("data-shuffle-page-controls")||v.setAttribute("data-shuffle-page-controls","")})};s(),new MutationObserver(s).observe(document.documentElement,{childList:!0,subtree:!0})})}};export{xo as c,xi as t,L as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as t,o,c as d,a5 as a}from"./chunks/framework.DSg0KOwT.js";const u=JSON.parse('{"title":"Threshold tables","description":"","frontmatter":{},"headers":[],"relativePath":"contributor-guide/architecture/detector-contract/threshold-tables.md","filePath":"contributor-guide/architecture/detector-contract/threshold-tables.md"}'),s={name:"contributor-guide/architecture/detector-contract/threshold-tables.md"};function r(i,e,c,n,l,h){return o(),d("div",null,[...e[0]||(e[0]=[a('<h1 id="threshold-tables" tabindex="-1">Threshold tables <a class="header-anchor" href="#threshold-tables" aria-label="Permalink to "Threshold tables""></a></h1><p>The threshold tables for every bottleneck detector, and where each finding's impact band comes from.</p><h2 id="bottleneck-thresholds" tabindex="-1">Bottleneck thresholds <a class="header-anchor" href="#bottleneck-thresholds" aria-label="Permalink to "Bottleneck thresholds""></a></h2><p>Every change to <code>packages/core/src/detectors.ts</code> should reference this table.</p><p>Every finding's <code>impactBand</code> comes from one of two places. For any finding whose <code>impactEstimate</code> carries a <code>wallClock</code> estimate (the common case for most rules below), <code>analyzer.ts</code> calls <code>deriveImpactBand()</code> (<code>packages/core/src/impact-band.ts</code>) immediately after <code>estimateImpact()</code>, which sets <code>.impactBand</code> purely from <code>wallClock.high</code> as a fraction of the app's total duration (<code>>= 2%</code> critical, <code>>= 0.5%</code> warning, else info: <code>IMPACT_FLOOR_PCT_CRIT</code>/ <code>IMPACT_FLOOR_PCT_WARN</code>, which <code>skew</code>'s <code>floorPctWarn</code> and <code>straggler</code>'s <code>floorPctWarn</code>/<code>floorPctCrit</code> default to, so a tail those gates admit grades at least warning; a tuned <code>skew</code> or <code>straggler</code> floor also grades that entry's own findings, see <a href="./../detector-contract.html#tuning-thresholds">Tuning thresholds</a>). For those rules, the table below documents their firing gate plus their fixed fallback constant, which surfaces only when this run's finding of that type didn't get a wallClock estimate (a stage excluded from the occupancy sweep). For rules whose finding type never gets a wallClock estimate (<code>resourceOnly</code>/<code>informational</code> basis, e.g. <code>configAudit</code>, or a rule that keeps its own ratio-tiered classification, e.g. <code>failures</code>), the full threshold table below is the real, displayed classification: <code>detectors.ts</code> sets <code>impactBand</code> directly and nothing overwrites it. <code>partitionSizing</code>'s <code>maxPartitionTooBig</code> rule is a third case: it does carry a <code>wallClock</code> estimate but is explicitly exempted in <code>deriveImpactBand()</code> because it's a hardcoded-critical OOM/crash-risk safety signal, not a time-recovery one, so <code>detectors.ts</code>'s own classification stands regardless of how small that estimate is relative to the run.</p><h3 id="fixed-fallback-only-usually-wallclock-derived-instead" tabindex="-1">Fixed fallback only (usually wallClock-derived instead) <a class="header-anchor" href="#fixed-fallback-only-usually-wallclock-derived-instead" aria-label="Permalink to "Fixed fallback only (usually wallClock-derived instead)""></a></h3><p>These rules have no <em>band</em> tiers in <code>packages/core/src/detectors.ts</code> (<code>deriveImpactBand</code> sets the band whenever a wallClock estimate is available); the constant in the last column is only a floor-case fallback. Their <em>firing</em> gate lives in each entry's <code>thresholds</code> object: it decides whether the rule reports anything, so it stays documented here in full.</p><table tabindex="0"><thead><tr><th>Rule</th><th>Fires when</th><th>Fallback</th></tr></thead><tbody><tr><td>Task skew</td><td><code>taskDurationP95 / taskDurationP50 > 3×</code> (<code>taskDurationP50</code> and the other P50 fields are the textbook median: the mean of the two middle values on an even count; P95 stays nearest-rank) (<code>taskDurationMax / P50</code> for stages under <code>minTasksForP95</code> = 20 tasks), <strong>and</strong> the occupancy-clipped tail recovery (<code>tailRecoveryMs</code>: <code>finalizeStage</code>'s task-level replay of the stage with every task over 4× P50 capped at P50) is ≥ <code>floorPctWarn</code> = 0.5% of app runtime. The clip floors the claim at the longest task the fix leaves, not the current one, and at the core work the fix leaves over every core (see impact-estimation.md's occupancy section); <code>straggler</code>'s floors use the same clip</td><td><code>warning</code></td></tr><tr><td>Shuffle read</td><td><code>shuffleReadBytes > minBytes</code> = 50 MiB, on a stage that isn't shorter than <code>stageFloorPct</code> = 0.5% of the run (a zero-length stage or an unknown run duration passes; the claim is clipped to the stage, so a shorter one would grade <code>info</code>, the shuffle itself still there)</td><td><code>info</code></td></tr><tr><td>Partition sizing: skew</td><td><code>shuffleReadMax > 5×</code> <code>shuffleReadP50</code> <strong>and</strong> <code>shuffleReadMax > 256 MiB</code></td><td><code>warning</code></td></tr><tr><td>Partition sizing: low parallelism</td><td><code>shuffleReadBytes ≥ 1 GiB</code> <strong>and</strong> <code>taskCount ≤ 7</code></td><td><code>warning</code></td></tr><tr><td>Partition sizing: oversized partition</td><td><code>shuffleReadMax ≥ 5 GiB</code></td><td><code>critical</code></td></tr><tr><td>GC</td><td><code>executorRunTime ≥ minRunTimeMs</code> = 10 s <strong>and</strong> <code>gcPct > 10%</code></td><td><code>warning</code></td></tr><tr><td>GC (low / cost)</td><td><code>executorRunTime ≥ 10 s</code> <strong>and</strong> <code>gcPct < lowInfoPct100</code> = 5% (checked only when the GC row above did not fire) <strong>and</strong> the stage lasts ≥ <code>lowInfoFloorPct</code> = 0.5% of the run (passes when the run's duration is unknown or the stage has zero length, such as one with no completion time). Gets no wall-clock estimate (an over-provisioning signal), so this band always stands. The floor drops low-GC notes from stages that barely ran: low GC is still true on those stages, but a memory-sizing note from a stage that barely ran adds nothing</td><td><code>info</code></td></tr><tr><td>Spill</td><td>any non-zero <code>memoryBytesSpilled</code>, on a stage that isn't shorter than <code>stageFloorPct</code> = 0.5% of the run (as for shuffle read: a shorter stage would grade <code>info</code>). The magnitude sub-table below classifies <em>how much</em>, but does not gate firing</td><td><code>warning</code></td></tr><tr><td>Cold start</td><td><code>firstExecutorAddedAt − firstStageSubmittedAt > gapSeconds</code> = 30 s (no finding without executor-added events): the time a runnable stage waited for its first executor. An executor added before the first stage and still alive at submission means no wait and no finding; one removed at or before submission is ignored, so the gap runs to the next executor added after it.</td><td><code>warning</code></td></tr><tr><td>Slow host: mean-duration ratio</td><td>stage has ≥ <code>minHosts</code> = 3 hosts (or executors) and ≥ <code>minTasks</code> = 15 tasks, and lasts ≥ <code>stageFloorPct</code> = 0.5% of the run (passes when the run's duration is unknown or the stage has zero length, which gets no estimate and keeps its fallback band; every slow-host finding on a shorter stage would grade <code>info</code>, the imbalance itself still true; this gate covers every slowHost row); then per host: mean task duration / overall median ≥ <code>ratioWarn</code> = 2.0× <strong>and</strong> host task-share ≥ <code>minShare</code> = 20% <strong>and</strong> host mean ≥ <code>floorMs</code> = 1000 ms (absolute-magnitude floor, rules out sub-second noise)</td><td><code>warning</code></td></tr><tr><td>Slow host: duration-share</td><td>same stage gate as the row above; then per host: ≥ <code>shareWarn</code> = 75% of the stage's total task-duration <strong>and</strong> ≥ <code>taskShareWarn</code> = 50% of its task count</td><td><code>warning</code></td></tr><tr><td>Stage slowness: absolute fallback, suppressed when <code>slowHost</code> already fired</td><td>stage wall-clock duration ≥ <code>infoMin</code> = 15 min. The band then comes from the partitioning-headroom estimate (see impact-estimation.md), not the duration</td><td><code>info</code></td></tr><tr><td>Straggler / speculative-execution</td><td><code>taskCount ≥ minTasks</code> = 10, <strong>and</strong> the stage lasts ≥ <code>floorPctWarn</code> = 0.5% of the run (passes when the run's duration is unknown or the stage has zero length, such as one with no completion time; a shorter stage's tail can't cost more than its own duration, so every finding there would grade <code>info</code>, the slow tail itself still true), <strong>and</strong> either any speculative task ran, <strong>or</strong> straggler share > <code>shareWarn</code> = 5%, <strong>or</strong> straggler share > <code>shareWarnAtFloor</code> = 2.5% with the occupancy-clipped tail recovery (<code>tailRecoveryMs</code>, as for skew) already ≥ <code>floorPctWarn</code> (0.5% of app runtime). Skew's <code>ratioWarn</code> = 3 and the 0.5% floor are the values the task-level tail replay was tuned against. <code>warnPct</code>/<code>critPct</code> (10%/20% speculative share) and <code>floorPctWarn</code>/<code>floorPctCrit</code> (0.5%/2% of app runtime) do not set the band; they rank the straggler-vs-speculative tiers that pick which <em>metric</em> the finding reports</td><td><code>info</code></td></tr><tr><td>Speculation waste</td><td><code>speculationWastedAttempts ≥ minWasted</code> = 5 <strong>and</strong> <code>speculationWasteMs ≥ minWasteMs</code> = 60 s</td><td><code>warning</code></td></tr><tr><td>Retry waste</td><td><code>wastedAttempts ≥ minWasted</code> = 3 <strong>and</strong> <code>retryWasteMs ≥ minWasteMs</code> = 30 s (attempts superseded by a later retry of the same task)</td><td><code>warning</code></td></tr><tr><td>Tiny tasks</td><td><code>taskCount ≥ minTasks</code> = 100 <strong>and</strong> <code>taskDurationP50 ≤ maxP50</code> = 500 ms <strong>and</strong> <code>taskDurationP95 ≤ maxP95</code> = 1000 ms <strong>and</strong> the stage lasts ≥ <code>stageFloorPct</code> = 0.5% of the run (passes when the run's duration is unknown or the stage has zero length; coalescing can't save more than the stage's own duration, so every finding on a shorter stage would grade <code>info</code>, the tasks still tiny). Checked against each stage's measured per-task overhead (task wall time minus executor run time, the estimate's own input): a stage with 100+ tasks outside the P50/P95 gate would not save 0.5% of its run by coalescing, while one inside it can, and grades above <code>info</code></td><td><code>info</code></td></tr><tr><td>Duplicate plan subtree</td><td>a subtree of ≥ <code>minSubtreeSize</code> = 3 nodes whose shape fingerprint repeats ≥ <code>minOccurrences</code> = 2× in the plan, unless its linked stages together lasted less than <code>stageFloorPct</code> = 0.5% of the run (a repeat with no linked stage time, or an unknown run duration, is kept; the claim counts at most each stage's own task-active time, so such a repeat would grade <code>info</code>, the repeat still in the plan). <code>occurrencesIdentical</code> records whether the repeats also agree node-for-node on normalized detail, ignoring AQE query-stage numbers; when they don't (same shape over another table, filter or projection) the finding is <code>info</code> with confidence <code>low</code> and no time claim. <code>stageShares</code> gives, per stage, the repeated operators' share of the stage's operators (WholeStageCodegen wrappers and Exchange write halves not counted); with no attributed stage the finding is <code>info</code></td><td><code>warning</code></td></tr><tr><td>Small files read/write</td><td>per read/write side: file count > <code>minFiles</code> = 100 <strong>and</strong> average file size < <code>maxAvgFileSizeMB</code> = 3 MiB</td><td><code>warning</code></td></tr><tr><td>Broadcast sizing: missed</td><td>a 2-child <code>SortMergeJoin</code> whose smaller side is < 10 MiB (unconditional), or < 100 MiB with the larger side > 10 GiB, or < 1 GiB with larger > 300 GiB, or < 5 GiB with larger > 1 TiB (<code>broadcastTiers</code> × <code>comparisonTiers</code>)</td><td><code>info</code></td></tr><tr><td>Broadcast sizing: oversized</td><td>a <code>BroadcastExchange</code> node whose <code>data size</code> metric > <code>overBroadcastBytes</code> = 1 GiB</td><td><code>warning</code></td></tr></tbody></table><h4 id="spill-magnitude-tiers" tabindex="-1">Spill magnitude tiers <a class="header-anchor" href="#spill-magnitude-tiers" aria-label="Permalink to "Spill magnitude tiers""></a></h4><p>The spill row's band is a fixed <code>warning</code> fallback, but <code>computeSpillMagnitude</code> (<code>packages/core/src/detectors.ts</code>) runs on every spill finding and sets its <code>spillMagnitude</code> field, which the Spill widget displays. Its tiers, in evaluation order (first match wins, <code>null</code> when nothing matches):</p><table tabindex="0"><thead><tr><th>Condition</th><th>Magnitude</th></tr></thead><tbody><tr><td>Single-task stage: <code>spillDiskMax ≥ singleTaskDiskGiB</code> = 1 GiB <strong>or</strong> <code>spillMemMax ≥ singleTaskMemGiB</code> = 4 GiB</td><td><code>severe</code></td></tr><tr><td>Multi-task stage: <code>spillDiskMax ≥ highDiskGiB</code> = 1 GiB, <strong>or</strong> <code>spillDiskMax / taskCount ≥ highTaskDiskMB</code> = 512 MiB (per-task proxy), <strong>or</strong> <code>spillMemMax ≥ highMemGiB</code> = 4 GiB</td><td><code>high</code></td></tr><tr><td>Multi-task stage: <code>spillDiskMax ≥ medDiskMB</code> = 256 MiB <strong>or</strong> <code>spillMemMax ≥ medMemGiB</code> = 1 GiB</td><td><code>medium</code></td></tr><tr><td>Skew (<code>taskCount ≥ skewMinTasks</code> = 10): <code>spillDiskMax / spillDiskP50 > skewRatio</code> = 5× <strong>and</strong> <code>spillDiskMax ≥ skewDiskFloorMB</code> = 128 MiB</td><td><code>high</code></td></tr><tr><td>Skew (<code>taskCount ≥ 10</code>): <code>spillMemMax / spillMemP50 > 5×</code> <strong>and</strong> <code>spillMemMax ≥ skewMemFloorMB</code> = 256 MiB</td><td><code>medium</code></td></tr></tbody></table><p>Disk spill is weighted worse than memory spill by design: the memory thresholds sit well above their disk counterparts at every tier.</p><h3 id="full-threshold-table-never-wallclock-derived" tabindex="-1">Full threshold table (never wallClock-derived) <a class="header-anchor" href="#full-threshold-table-never-wallclock-derived" aria-label="Permalink to "Full threshold table (never wallClock-derived)""></a></h3><table tabindex="0"><thead><tr><th>Rule</th><th>Warning</th><th>Critical</th></tr></thead><tbody><tr><td>Stage shape: PRatio</td><td><code>taskCount / totalCores < 0.5</code> (info, under-parallelized), on a stage lasting ≥ <code>lowParallelismFloorPct</code> = 0.5% of the run (passes when the run's duration is unknown or the stage has zero length): parallelizing can't save more than the stage's duration, so a shorter stage would fire below the floor</td><td>none</td></tr><tr><td>Stage shape: OIRatio</td><td><code>outputBytes / inputBytes > 10×</code> (info, data explosion)</td><td>none</td></tr><tr><td>Stage shape: TaskStageSkew</td><td><code>taskDurationMax / stageDuration > stageShareMin</code> = 0.5 <strong>and</strong> <code>taskDurationMax / taskDurationP50 > skewWarn</code> = 3× (info), on a multi-task stage lasting ≥ <code>taskStageSkewFloorPct</code> = 0.5% of the run. A task runs inside its stage, so the share is at most 1; the median gate is needed because on a single wave of even tasks the longest one spans the whole stage too</td><td>none</td></tr><tr><td>Failed tasks</td><td>failure rate > 5% (min 10 tasks)</td><td>> 20%</td></tr><tr><td>Stage failed outright</td><td>none</td><td>any <code>stageFailureReason</code> present</td></tr><tr><td>Slow host: multi-dimensional</td><td>max/median ratio across taskTime/inputBytes/shuffleBytes/storageMemory ≥ 1.33× (info); each dimension's sample must also clear an absolute floor (1000 ms for taskTime, 64 MiB for the byte dimensions). A stage lasting under <code>stageFloorPct</code> = 0.5% of the run is skipped (see the mean-duration row): a byte dimension there has no time estimate and would otherwise keep its ratio tier (a shorter stage's byte dimension would otherwise keep a warning or critical tier). The taskTime dimension falls back to <code>info</code> and takes its band from its wall-clock estimate; the byte dimensions get no time estimate and keep the ratio tier</td><td>≥ <code>ratioTiers[1]</code> = 1.78× warning, ≥ <code>ratioTiers[3]</code> = 10× critical (<code>ratioTiers[2]</code> = 3.16 is not read)</td></tr><tr><td>Utilization</td><td>avg active executors / peak < 60% (info)</td><td>none</td></tr><tr><td>Autoscaling churn: short-lived executors</td><td>> 30% of executors alive under 2 min (min 5 executors)</td><td>> 60%</td></tr><tr><td>Job failure rate</td><td>≥ 30% (≥ 10% info)</td><td>≥ 50%</td></tr><tr><td>Idle cores</td><td>busy-core-time / (peak cores × wall-clock) idle > 50% (warning)</td><td>none</td></tr><tr><td>Memory band</td><td>peak heap / allocated > 95% too-small (warning); < 70% over-provisioned (info)</td><td>none</td></tr><tr><td>Caching opportunity</td><td>same input relation (or join/union subtree) scanned by ≥ <code>minExecutions</code> = 2 SQL executions in one run</td><td>none (single tier, info)</td></tr><tr><td>Cache utilization: partial caching</td><td><code>numCachedPartitions / numPartitions < 0.90</code> (info)</td><td><code>< 0.50</code> (warning)</td></tr><tr><td>Cache utilization: disk spillover</td><td><code>diskSize / (memorySize + diskSize) > 0.15</code> (info), <code>MEMORY_AND_DISK*</code> only</td><td><code>> 0.40</code> (warning)</td></tr><tr><td>Cache utilization: storage unobserved</td><td>persisted RDDs, but no <code>SparkListenerBlockUpdated</code> for any <code>rdd_*</code> block and every RDD Info figure 0 (<code>spark.eventLog.logBlockUpdates.enabled</code> off on Spark 2.3+): a missing-evidence caveat, not a threshold</td><td>none (single tier, info)</td></tr><tr><td>Core locality</td><td>non-local task ratio ≥ <code>warnRatio</code> = 15% (min <code>minTasks</code> = 50 tasks)</td><td>≥ <code>critRatio</code> = 35%</td></tr><tr><td>Config: memory overhead</td><td><code>spark.executor.memoryOverhead</code> below max(<code>floorMB</code> = 384 MiB, <code>floorPct</code> = 10% of executor memory) (info)</td><td>none</td></tr></tbody></table><p>The RDD Info cache figures on stage events (<code>Number of Cached Partitions</code>, <code>Memory Size</code>, <code>Disk Size</code>) are always 0 since Spark 2.3; Spark 1.x fills them only on <code>StageCompleted</code>. Real cache evidence is <code>SparkListenerBlockUpdated</code>, written only with <code>spark.eventLog.logBlockUpdates.enabled=true</code> (<code>recordBlockUpdate</code> in <code>event-handlers.ts</code>); the corpus <code>cache-memory-only</code>/<code>cache-memory-and-disk</code> logs carry it. Count a block's sizes only where its storage level says it lives: a drop to disk still reports the dropped bytes as <code>Memory Size</code>.</p><p>Spill classification: ≥80% tasks with zero spill → <code>skew</code>; <20% zero → <code>volume</code>; else <code>unclassified</code>. The classification badge is always shown in both compact and expanded spill widget states. This is independent of the magnitude tiers above: classification says <em>what kind</em> of spill, magnitude says <em>how much</em>.</p><h4 id="evidence-fields-stagefailed-retrywaste" tabindex="-1">Evidence fields (<code>stageFailed</code> / <code>retryWaste</code>) <a class="header-anchor" href="#evidence-fields-stagefailed-retrywaste" aria-label="Permalink to "Evidence fields (`stageFailed` / `retryWaste`)""></a></h4><p>Beyond a scalar <code>metric</code>/<code>value</code>, both entries' <code>detect()</code> attach to the finding:</p><ul><li><code>numTasks</code>: <code>stage.taskCount</code> at detection time.</li><li><code>memoryBytesSpilled</code>: <code>stage.memoryBytesSpilled</code> at detection time.</li><li><code>stageFailed</code> only: <code>failedTaskDetails</code>: up to 20 <code>FailedTaskSample</code> records (<code>taskId</code>, <code>attemptNumber</code>, <code>host</code>, <code>executorId</code>, <code>reason</code>, <code>peakExecMem</code>, <code>memSpilled</code>, <code>shuffleWrite</code>) for tasks still marked failed when the stage was finalized (<code>finalizeStage</code>, <code>stage-quantiles.ts</code>).</li><li><code>retryWaste</code> only: <code>retriedTaskDetails</code>: up to 20 <code>FailedTaskSample</code> records for attempts discarded by the retry-dedup logic in <code>accumulateTask</code> (<code>event-handlers.ts</code>): captured at the moment they'd otherwise be thrown away, since by finalize time only the winning attempt survives.</li></ul><p>Both sample arrays are capped at 20 entries, filled in first-encountered order (finalize order for <code>failedTaskDetails</code>, discard order for <code>retriedTaskDetails</code>), not spread across distinct hosts/executors: a stage with failures clustered on one bad host could fill the cap before a more informative failure elsewhere in the stage is ever sampled.</p><h4 id="evidence-fields-failures" tabindex="-1">Evidence fields (<code>failures</code>) <a class="header-anchor" href="#evidence-fields-failures" aria-label="Permalink to "Evidence fields (`failures`)""></a></h4><ul><li><code>dominantReason</code>: the most frequent end-reason tag (<code>ExceptionFailure</code>, <code>ExecutorLostFailure</code>, ...) among tasks still failed at finalize.</li><li><code>dominantError</code>: the error behind that tag, from its largest failure group: the exception class, or <code><tag>: <loss reason></code>; falls back to the tag. The recommendation names it and never embeds a message.</li><li><code>failureGroups</code>: up to 5 <code>TaskFailureGroup</code>s (<code>reason</code>, <code>className</code>, <code>message</code>, <code>lossReason</code>, <code>stackExcerpt</code>, <code>count</code>), most frequent first: one group per distinct tag, class, message and loss reason, one excerpt each.</li><li><code>otherFailedTasks</code>: failed tasks that no shown group covers.</li></ul><p><code>packages/core/src/task-failure.ts</code> reads the details from <code>Task End Reason</code> (<code>Class Name</code>, <code>Description</code>, <code>Full Stack Trace</code>, <code>Loss Reason</code>, FetchFailed <code>Message</code>, <code>Kill Reason</code>) and bounds them at ingest: a message or loss reason to its first line (for a Python traceback, its final error line), 300 characters; an excerpt to the header, 8 frames, a Python traceback's error line and the last <code>Caused by:</code> line, 2000 characters in all. While parsing, a stage keeps at most 50 distinct failures (<code>StageRecord.failureDetails</code>, freed at finalize); later ones count only toward the tag. Redaction (<code>redact.ts</code>) replaces every <code>failureGroups[].message</code> and strips message text from <code>stackExcerpt</code>.</p>',23)])])}const m=t(s,[["render",r]]);export{u as __pageData,m as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as o,o as t,c as a,a5 as s}from"./chunks/framework.DSg0KOwT.js";const u=JSON.parse('{"title":"Run comparison internals","description":"","frontmatter":{},"headers":[],"relativePath":"contributor-guide/architecture/state-and-history/run-comparison-internals.md","filePath":"contributor-guide/architecture/state-and-history/run-comparison-internals.md"}'),n={name:"contributor-guide/architecture/state-and-history/run-comparison-internals.md"};function i(c,e,d,r,l,h){return t(),a("div",null,[...e[0]||(e[0]=[s('<h1 id="run-comparison-internals" tabindex="-1">Run comparison internals <a class="header-anchor" href="#run-comparison-internals" aria-label="Permalink to "Run comparison internals""></a></h1><p>How the A/B comparison engine matches stages and builds a comparison.</p><h2 id="run-comparison" tabindex="-1">Run comparison <a class="header-anchor" href="#run-comparison" aria-label="Permalink to "Run comparison""></a></h2><p><code>packages/core/src/run-comparison.ts</code> is the whole A/B engine. The entry point <code>compareRuns(baseline, candidate)</code> takes two <code>{ label, snapshot }</code> run records (each <code>snapshot</code> a <code>SessionSnapshot</code>: <code>app</code>, <code>stages</code>, <code>executors</code>, <code>sql</code>, <code>jobs</code>, <code>runAggregates</code>, <code>evidenceAvailability</code>, <code>catalog</code>, <code>taskData</code>) and returns one plain object the view renders. It runs on already-parsed snapshots, with no worker involved.</p><ul><li><p><code>stageIdentity(stage, snapshot)</code> is a run-independent key: <code>normalizeStageName</code> (lowercased, digit-runs and long hex ids collapsed to <code>#</code>) joined with the stage's SQL-execution plan identity. That identity is scoped to only the plan nodes this stage's tasks were attributed to (<code>node.stageIds</code>), not the whole tree, so two stages sharing one SQL execution (e.g. a self-join's two Exchange stages) don't collapse onto one identity; it falls back to a bottom-up structural fingerprint of the whole resolved <code>planTree</code> (<code>planTreeIdentity</code>, <code>normalizeDetail</code>-normalized: the same normalizer <code>cachingOpportunity</code> uses in <code>packages/core/src/detectors.ts</code>) when a stage has no such attribution. The stage-to-plan mapping itself is <code>planNodesOfStage</code> in <code>packages/core/src/stage-plan-nodes.ts</code>, shared with <code>isPythonStage</code> (<code>python-stage.ts</code>), which the CLI's <code>metrics</code> block (<code>run-metrics.ts</code>) and the <code>tasksMostlyIdle</code> check both read. The CLI keys its per-stage metrics rows by this identity. <code>matchStages(baseSnap, candSnap)</code> indexes each run by that identity and pairs identities that map to exactly one stage on both sides. An identity colliding equally on both sides (same count) is also paired, positionally by sorted stage id: exact when comparing a run against itself (every stage matches itself), a best-effort guess otherwise (two unrelated same-named stages with no SQL/attribution could get cross-paired). Collisions are still recorded in <code>collisionIdentities</code> even when resolved this way; a differing count leaves them there unpaired. <code>coverage</code> reports the matched fraction.</p></li><li><p><code>metricDeltas</code> computes whole-run aggregate deltas (wall-clock, spill, task skew p95, failed-task rate, GC, I/O bytes, executor count, ...) as plain sums over all stages, deliberately not gated on stage matching, since matching is unreliable on real logs. Each metric carries a <code>direction</code> (improvement/regression/unchanged) and an <code>unavailableReason</code> when a side lacks the field.</p></li><li><p><code>findingsDelta</code> tallies each run's <code>catalog</code> by <code>(rule × impact band)</code> and reports <code>introduced</code> vs <code>resolved</code> categories: a count diff, also matching-free.</p></li><li><p><code>alignStages(baseSnap, candSnap, { normalizePath })</code> in <code>packages/core/src/stage-alignment.ts</code> is the aligner: a pure function from two snapshots to the stage pairs, the unmatched stages, the replanned groups, the Delta bookkeeping stages, the runtime coverage and the execution alignment. <code>compareRuns</code> calls it and does not contain it, and every consumer of a comparison reads its <code>stagePairs</code> instead of comparing stage keys. It pairs in two levels.</p><ul><li>Keys. The exact key is <code>comparisonIdentity</code>, the <code>stageIdentity</code> recipe (shared in <code>packages/core/src/stage-identity.ts</code>) run with the comparison normalizer: <code>normalizeDetail</code>, then the targeted patches in <code>COMPARISON_PATCHES</code> (staging directories, dates, <code>IN</code> lists, file-index counts), with any caller-supplied patterns (<code>compileNormalizePatterns</code>) applied first to the text as Spark printed it. The structural key (<code>structuralKey</code> in <code>packages/core/src/stage-structure.ts</code>) folds the attributed nodes into a forest, each node as its normalized name, its sorted attribute names (<code>name#id</code> references without the id, so a literal never enters it) and its children's digests; codegen and input-adapter nodes are skipped. <code>stageIdentity</code> stays the exact key the CLI's per-stage metrics rows use, and <code>normalizeDetail</code> stays untouched, so findings do not move. Blanket numeric or path stripping is not part of the normalizer: it fused distinct stages of one run.</li><li>Executions first. <code>indexRun</code> groups each run's non-bookkeeping stages by SQL execution (stages with no execution form one pseudo-execution) and gives each execution its plan structure, call-site frames and description tokens. <code>alignSequences</code> (<code>packages/core/src/sequence-alignment.ts</code>) runs the order-preserving weighted LCS over the executions in id order, scored by <code>executionSimilarity</code> (weights 4, 2 and 1 for structure, frames and description; a part one side lacks drops out) with <code>EXECUTION_MATCH_MIN</code> 0.55. It prefers matching where matching is optimal and otherwise skips the execution with the higher id, which makes the result deterministic and mirror-symmetric. Up to <code>FULL_ALIGNMENT_MAX_CELLS</code> (1,000,000) the table is full; above it the table is a band of half-width <code>BAND_BASE_HALF_WIDTH</code> (100) plus half of the length difference, and <code>executionAlignment.bounded</code> says so. If fewer than <code>MIN_EXECUTION_AGREEMENT</code> (0.5) of the smaller run's executions pair, no stage pairs (<code>executionAlignment.accepted</code> is false).</li><li>Stages second (<code>alignWithin</code>). In each aligned execution pair: equal exact key (<code>exact</code>, pairing off in stage-id order as many as both sides have), equal structural key (<code>structural</code>), detail-token Jaccard of at least <code>ALIGNED_MIN_SIMILARITY</code> (0.6, best pair first; <code>aligned</code>), and plan-less stages by position among those of one name (<code>aligned</code>, <code>POSITIONAL_SCORE</code>). Stages outside any execution key on their call-site text too.</li><li>Re-plan fallback. When an aligned SQL execution pair holds different numbers of non-bookkeeping stages and stages are left over, they form one <code>ReplannedGroup</code> (both execution ids, the leftover ids per side, <code>deltas</code> totalled per side). Equal counts leave them unmatched. With <code>REPLANNED_COUNTS_TOWARD_COVERAGE</code> the replanned run time counts in the numerator of <code>runtimeCoverage</code>; set it to false and it counts in the denominator only.</li></ul><p>Stages whose scans only read the Delta log (<code>isDeltaBookkeepingStage</code>, built on <code>isDeltaLogRead</code> in <code>plan-summary.ts</code>) are set aside before pairing. A pair's <code>deltas</code> sum every attempt of the stage, the sums <code>withEarlierAttempts</code> gives the run totals. The result is <code>comparisonSchemaVersion</code> 1.</p></li><li><p>The per-stage skew deltas (<code>stageSkewDeltas</code>) read the aligner's pairs, the same ones the banner's coverage figure counts, and the pinned-stage panel reads <code>baseStages</code>/<code>candStages</code>. The old <code>matchStages</code> pairs still feed <code>matchedCoverage</code>, which keeps its count-based meaning and decides nothing.</p></li></ul><p><code>compareRuns</code> sets <code>confidence</code> from <code>runtimeCoverage</code>: <code>insufficient</code> when it is null (neither run recorded executor run time), <code>low</code> when it is under 0.9 (<code>RUNTIME_COVERAGE_THRESHOLD</code>) or the two app names differ (either condition alone is enough; both are weak signals, not a hard gate), <code>ok</code> otherwise. It is computed in <code>compareRuns</code>, not in <code>buildComparison</code>, so the dashboard, which calls <code>compareRuns</code> directly, gets the same result as the CLI and MCP. The view lives in <code>src/view/RunComparison.tsx</code> (the comparison page), <code>CompareLanding.tsx</code> (the two-slot baseline / candidate intake off the landing), and <code>PinnedStageDeltas.tsx</code> (the manual per-stage pinning panel fed by <code>baseStages</code>/<code>candStages</code>).</p>',6)])])}const g=o(n,[["render",i]]);export{u as __pageData,g as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as o,o as t,c as a,a5 as s}from"./chunks/framework.DSg0KOwT.js";const
|
|
1
|
+
import{_ as o,o as t,c as a,a5 as s}from"./chunks/framework.DSg0KOwT.js";const u=JSON.parse('{"title":"Run comparison internals","description":"","frontmatter":{},"headers":[],"relativePath":"contributor-guide/architecture/state-and-history/run-comparison-internals.md","filePath":"contributor-guide/architecture/state-and-history/run-comparison-internals.md"}'),n={name:"contributor-guide/architecture/state-and-history/run-comparison-internals.md"};function i(c,e,d,r,l,h){return t(),a("div",null,[...e[0]||(e[0]=[s("",6)])])}const g=o(n,[["render",i]]);export{u as __pageData,g as default};
|
package/public/docs/assets/contributor-guide_architecture_worker-protocol_cli-and-mcp.md.DC1YqXBp.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as o,o as c,c as d,a5 as a}from"./chunks/framework.DSg0KOwT.js";const p=JSON.parse('{"title":"CLI and MCP server","description":"","frontmatter":{},"headers":[],"relativePath":"contributor-guide/architecture/worker-protocol/cli-and-mcp.md","filePath":"contributor-guide/architecture/worker-protocol/cli-and-mcp.md"}'),t={name:"contributor-guide/architecture/worker-protocol/cli-and-mcp.md"};function s(r,e,n,i,l,h){return c(),d("div",null,[...e[0]||(e[0]=[a('<h1 id="cli-and-mcp-server" tabindex="-1">CLI and MCP server <a class="header-anchor" href="#cli-and-mcp-server" aria-label="Permalink to "CLI and MCP server""></a></h1><p>The headless analysis CLI and the MCP server, which run the same parser and detectors outside the browser.</p><h2 id="headless-analysis-cli" tabindex="-1">Headless analysis CLI <a class="header-anchor" href="#headless-analysis-cli" aria-label="Permalink to "Headless analysis CLI""></a></h2><p><code>packages/cli/bin/sparkforensics-analyze.mjs</code> runs the same parser + detector contracts outside the browser, for CI. It accepts a single event-log file or a rolling-log directory, drives <code>runParse</code>/<code>runParseFiles</code> (<code>packages/core/src/parser-worker.ts</code>) with a Node-only File-like shim (<code>nodeFileFromPath</code> in <code>packages/core/src/cli/collect-run.ts</code>), and writes the exact <code>buildEvidenceReport</code> JSON schema described above: one format, not a second. The shim reads each requested slice with a positioned <code>readSync</code>, so a local log is never loaded whole and has no 2 GiB size limit; <code>collectRun</code> closes every descriptor it opened once parsing settles, on success and on error. Alternatively, <code>--shs-base-url <url> --app-id <id> [--attempt-id <id>]</code> fetches the run from a Spark History Server instead (mutually exclusive with the positional file/directory argument), calling <code>resolveFromShs</code> (<code>packages/core/src/shs-load.ts</code>, shared with the MCP server's SHS source path below) directly; no dependency on the <code>packages/server</code> package. The three flags are checked first with <code>validateShsRequest</code> (<code>packages/core/src/shs-request.js</code>), and a malformed one is a usage error (exit <code>2</code>) before any fetch. A failed SHS fetch reports its message to <code>stderr</code> and exits <code>4</code>, same as a candidate file that can't be parsed.</p><p>Regression budgets beyond the <code>--max-regression-pct</code> pair come from repeated <code>--regression-budget <metric>:<pct></code> flags and a <code>--budgets</code> file, parsed in <code>packages/core/src/cli/regression-budgets.ts</code> and passed to <code>evaluateBudgets()</code> as <code>regressionBudgets</code>; the legacy pair is one more budget, and a metric budgeted twice is a usage error. Per-stage budgets (<code>--stage-regression-budget</code>, <code>--stage-quality</code>; <code>stageRegressionBudgets</code> and <code>stageQualities</code> on MCP) read the aligner's <code>stagePairs</code> through <code>checkStageRegression</code> in <code>cli/budgets.ts</code> and never match stages themselves; <code>parseStageRegressionBudgetFlag</code> refuses the neutral <code>inputBytes</code> and <code>outputBytes</code>. With two or more positional candidates (or <code>--format ndjson</code>), the CLI's <code>runMultiLog</code> parses and analyzes the baseline once, then evaluates each candidate in turn and writes one NDJSON line per candidate (<code>log</code>, <code>status</code>, <code>exitCode</code>, <code>error</code>, <code>budgets</code>, <code>candidate</code>, <code>comparison</code>). A candidate that can't be read or parsed gets a <code>status: "error"</code> line with <code>exitCode</code> <code>4</code> (<code>6</code> for an internal failure on that candidate); the exit code is the worst line (<code>6</code> > <code>5</code> > <code>4</code> > <code>1</code> > <code>3</code> > <code>0</code>, <code>EXIT_SEVERITY</code>). A baseline that can't be read exits <code>5</code> with no lines. Under <code>--redact</code>, <code>log</code> and the <code>stderr</code> prefixes are <code>candidate-<n></code> (1-based argument position) and an error line's message is generic, so no candidate path, which usually carries the app id, reaches the output. In both modes <code>--redact</code> also swaps the <code>stderr</code> text of a baseline or candidate failure (SHS fetch included) for <code>redactedFailure</code>'s role-only message.</p><p>Optional CLI-flag budgets (<code>--max-runtime <ms></code>, <code>--max-spill <gb></code>, <code>--max-skew <ratio></code>, <code>--max-failed-task-rate <pct></code>, <code>--min-efficiency <pct></code>) are evaluated in <code>packages/core/src/cli/budgets.ts</code> against the existing finding catalog (<code>analyze()</code>) and <code>computeEfficiencyModel</code>; there is no second rule engine. <code>--min-efficiency</code> compares <code>100 - wastagePct</code> (busy core time, the complement of the dashboard's Unused core time) and says so in its detail ("Busy core time 26% below budget 90%."); it is not the Scorecard's Efficiency tile (<code>stagesActive / total</code>). A budget whose required evidence is missing (e.g. the run never emitted <code>ApplicationEnd</code>, or has no usable per-task <code>runAggregates</code>) is reported as inconclusive (<code>stderr</code> warning) rather than silently passing, and gets its own exit code distinct from both pass and violation. Exit codes: <code>0</code> pass, <code>1</code> a configured budget was violated, <code>2</code> a usage error (unknown or value-less flag, unknown <code>--regression-metric</code> key, an unreadable or invalid <code>--thresholds</code> or <code>--budgets</code> file), <code>3</code> no violations but at least one budget was inconclusive, <code>4</code> the candidate could not be read or parsed (or its SHS fetch failed), <code>5</code> the <code>--baseline</code> could not be read or parsed, <code>6</code> an internal error (an unhandled failure, a failed <code>--export-html</code> export). <code>main</code> catches anything unhandled and exits <code>6</code> rather than letting Node exit <code>1</code>, which would read as a violation. When several apply the worst wins: <code>6</code>, <code>5</code>, <code>4</code>, <code>1</code>, <code>3</code>, <code>0</code>; a violation always wins over an inconclusive result in the same run (exit <code>1</code>, not <code>3</code>). <code>evaluateBudgets()</code> also always adds an inconclusive <code>run-complete</code> result when the catalog has an <code>incompleteRun</code> finding, so a run with no <code>ApplicationEnd</code> exits <code>3</code> even with no budget flags. With <code>--baseline</code>, the absolute budgets and this check apply to the candidate run; the MCP <code>evaluate_budgets</code> tool below uses the same function with the same roles.</p><h2 id="mcp-server" tabindex="-1">MCP server <a class="header-anchor" href="#mcp-server" aria-label="Permalink to "MCP server""></a></h2><p><code>packages/core/src/mcp-server-factory.ts</code>'s <code>createMcpServer()</code> registers 8 tools: <code>list_runs</code> (candidate runs in a local directory or on a Spark History Server, to pick one before diagnosing it), <code>diagnose_run</code> (thresholded findings + remediation text), <code>get_run_summary</code> (app/stage/job/sql counts and duration, no findings), <code>compare_runs</code> (the comparison verdict from <code>comparisonVerdict</code> in <code>packages/core/src/comparison-verdict.ts</code>, the dashboard comparison page's own headline, plus categorized findings delta + metric deltas between two runs; <code>CompareRunsResult.jobOutcomes</code> carries each run's failed jobs and incomplete flag for it), <code>evaluate_budgets</code> (pass/fail budget thresholds against one run, optionally with a second run for regression/fail-on-introduced budgets: the MCP side of the CLI's <code>evaluateBudgets()</code> gating), <code>get_finding_evidence</code> (raw evidence bundle for one finding, for drill-down after <code>diagnose_run</code>), <code>get_finding_documentation</code> (detection/tuning reference docs for one finding type, independent of any run), and <code>get_reference_doc</code> (a full tuning-reference chapter or bottleneck page by doc anchor, e.g. <code>#joins</code>). None re-implement detector logic: <code>list_runs</code> lists candidates (<code>packages/core/src/list-runs.ts</code>), and the rest repackage <code>analyze</code>/<code>buildEvidenceReport</code>/<code>compareRuns</code>/<code>captureSnapshot</code>/<code>evaluateBudgets</code> from <code>packages/core/src/mcp-tools.ts</code>, which resolves a <code>source</code> (event-log <code>path</code>, or an SHS <code>shsBaseUrl</code>/<code>appId</code>/<code>attemptId</code> triple) into a cached <code>AppModel</code>. The SHS source path calls <code>resolveFromShs</code> (<code>packages/core/src/shs-load.ts</code>, also used directly by the CLI's <code>--shs-base-url</code> mode above), which reuses two extractions shared with the browser ingestion flow: <code>fetchShsEventLog</code> (<code>packages/core/src/proxy.js</code>, the same upstream fetch the local server's <code>/shs-proxy</code> route uses) fetches the zip, and <code>decodeShsArchive</code> (<code>packages/core/src/shs-fetch.ts</code>, re-exported from <code>parser-worker.ts</code>'s barrel) streams it through the parser as worker messages, which <code>collectViaDispatch</code> assembles into an <code>AppModel</code>. <code>runParseFromUrl</code> calls the same <code>decodeShsArchive</code> after fetching through the proxy.</p><p>Two transports connect to that one factory: <code>packages/mcp/bin/sparkforensics-mcp.mjs</code> (stdio, for local MCP clients) and <code>packages/server/index.js</code>'s <code>/mcp</code> route (streamable HTTP, for the local server). The run cache (<code>packages/core/src/mcp-tools.ts</code>) is a module-level LRU (cap 8 and 15-minute idle TTL by default, overridable via <code>SPARKFORENSICS_MCP_CACHE_CAP</code> and <code>SPARKFORENSICS_MCP_CACHE_TTL_MS</code>, lazily swept on access) keyed by resolved source (path plus mtime, ctime and size, or SHS baseUrl+appId+attemptId), so a client mints a <code>runId</code> once via <code>resolveOrCreateRun</code> and reuses it across subsequent tool calls instead of re-parsing.</p><h3 id="one-output-builder-for-the-cli-and-mcp" tabindex="-1">One output builder for the CLI and MCP <a class="header-anchor" href="#one-output-builder-for-the-cli-and-mcp" aria-label="Permalink to "One output builder for the CLI and MCP""></a></h3><p>Neither surface lists the fields of a run or a comparison by hand. The CLI's JSON and the MCP tools call the same core functions:</p><ul><li><code>buildComparisonOutput()</code> in <code>packages/core/src/comparison-output.ts</code> diffs the two runs, applies <code>--redact</code>/<code>redact</code> itself (so no surface can budget or report an unredacted comparison by skipping it), and returns the redacted <code>CompareRunsResult</code> for the budget checks and the Markdown renderer, plus <code>comparisonOutput()</code>'s projection: <code>verdict</code>, <code>confidence</code>, <code>reason</code>, <code>matchedCoverage</code>, <code>runtimeCoverage</code>, <code>metrics</code>, <code>findings</code>, and the comparison block <code>comparisonSchemaVersion</code>, <code>stagePairs</code>, <code>unmatched</code>, <code>replanned</code>, <code>bookkeepingStageIds</code>, <code>executionAlignment</code> (built by the aligner, see <a href="./../state-and-history/run-comparison-internals.html">Run comparison internals</a>). <code>comparisonOutput()</code> takes a <code>view</code>: <code>full</code> (the CLI) carries every field, <code>summary</code> (MCP's default) leaves out <code>stagePairs</code>, which <code>compare_runs</code> adds back for <code>include: ['stagePairs']</code>. <code>buildComparisonOutput()</code> also takes <code>normalizePath</code>, the CLI's repeatable <code>--normalize-path</code> and <code>compare_runs</code>' <code>normalizePath</code>: it reaches <code>compareRuns</code> the way <code>thresholds</code> reaches <code>analyze()</code> and stays out of the run cache key, because it only affects the comparison. The CLI validates the patterns before any log is parsed (exit 2) and MCP before any run is resolved. That projection is the CLI's <code>comparison</code> object and the shared part of <code>compare_runs</code>. <code>compare_runs</code> also returns <code>metricDeltas</code> and <code>findingsDelta</code>, deprecated aliases of <code>metrics</code> and <code>findings</code> kept for one release.</li><li><code>runOutputBlocks()</code> in <code>packages/core/src/run-output.ts</code> builds the report's <code>metrics</code> and <code>effectiveConf</code> blocks, redacted from the redacted run, for both the CLI report and <code>diagnose_run</code>, which also returns the report's <code>writeTargets</code>.</li></ul><p>Neither surface wraps the other: MCP handlers hold a run cache and report errors by code, while the CLI maps failures to exit codes and owns stdout. Adding a field to the projection adds it to both. <code>packages/cli/test/parity.test.js</code> runs the CLI's <code>main()</code> and the MCP tools through an in-memory client on public corpus logs, flattens both outputs and diffs their key sets and values. The differences that stay (the MCP run handles, the deprecated aliases, the CLI's <code>schemaVersion</code>) are in a commented allowlist in that file, and an entry that explains no difference fails the test.</p><p>Every tool failure comes back as <code>{isError: true, content: [...], structuredContent: {code}}</code>, never an HTTP-status-shaped error; <code>code</code> is one of the 5 existing SHS codes (<code>SHS_ERROR_CODES</code>, <code>packages/core/src/shs-request.js</code>) plus <code>run-not-found</code>, <code>finding-not-found</code>, <code>invalid-event-log</code> (also covers a nonexistent <code>path</code> source), <code>archive-too-large</code> (SHS archive over the <code>SPARKFORENSICS_MAX_ARCHIVE_BYTES</code> byte cap, default 1 GiB, because the MCP path buffers the whole archive in memory, unlike the streaming <code>/shs-proxy</code> route), <code>invalid-type</code>, <code>invalid-anchor</code> (documentation tools), <code>directory-not-found</code>, <code>invalid-date-filter</code>, and <code>invalid-shs-base-url</code> (<code>list_runs</code>). An error without a code reports <code>access-or-upstream-failure</code>. A stalled SHS archive body fails as <code>upstream-unreachable</code> after <code>SPARKFORENSICS_SHS_TIMEOUT_MS</code> (default 30 s) without data.</p><p><code>scripts/vendor-core.mjs</code> (shared by <code>packages/cli</code>, <code>packages/mcp</code>, and <code>packages/server</code>'s <code>prepack</code> scripts) vendors <code>packages/core/src/</code> wholesale into each package's own <code>vendor-core/</code> at pack time, pre-stripping TypeScript to plain <code>.js</code> (Node's native TS stripping refuses to run on <code>.ts</code> files under <code>node_modules</code>, which is exactly where a published <code>vendor-core/</code> lands). Each package's bin/entry point resolves its needed module through <code>packages/core/src/load-vendored.js</code>: from <code>vendor-core/</code> if present, else from the real <code>packages/core/src/</code> sibling loaded as <code>.ts</code> directly. In a monorepo checkout a leftover <code>vendor-core/</code> is used only while its <code>core-source-hash.txt</code> (written by <code>vendor-core.mjs</code>) matches <code>packages/core/src</code>; otherwise the bin warns on stderr and loads <code>packages/core/src</code> (<code>packages/server/index.js</code> mirrors <code>resolveStaticRoot</code>'s <code>public/</code>-vs-<code>../dist</code> pattern for this same fallback).</p>',15)])])}const g=o(t,[["render",s]]);export{p as __pageData,g as default};
|