From 05449987c19f4d60589dba30c3064fef7b1c9207 Mon Sep 17 00:00:00 2001 From: Rightup Date: Fri, 3 Jul 2026 21:21:20 +0100 Subject: [PATCH] feat: update packet detail screen to lookup repeater names --- ...tion-CVNgGJZz.js => CADCalibration-sDbWdeGJ.js} | 2 +- ...ChartCard-DSqBTrdz.js => ChartCard-D5XCldya.js} | 2 +- ...mpanions-BvYFdYvx.js => Companions-CdUuekpd.js} | 2 +- ...ation-D-blm0qZ.js => Configuration-DRX-sbaI.js} | 2 +- ...Dashboard-BdHklAFz.js => Dashboard-DhSJn9HX.js} | 2 +- ...tics-DkqSbCiV.js => GPSDiagnostics-C9LIlcS7.js} | 2 +- ...cker-BfCGxfpG.js => LocationPicker-DEowGt6S.js} | 2 +- .../{Login-BShabpmj.js => Login-B6KB1F1E.js} | 2 +- .../assets/{Logs-CrHzoPRp.js => Logs-CNUMuKWB.js} | 2 +- ...Neighbors-DjY7zrgE.js => Neighbors-s6MU6vjM.js} | 2 +- .../html/assets/PacketDetailsModal-BIJCmKzB.css | 1 + .../web/html/assets/PacketDetailsModal-CeDGHosS.js | 2 -- .../web/html/assets/PacketDetailsModal-Cp96QhHp.js | 2 ++ .../html/assets/PacketDetailsModal-DOmYHvNq.css | 1 - ...ByArBbzJ.js => RfHealthCorrelation-Hq8s45i4.js} | 2 +- ...Servers-BUo8HwN-.js => RoomServers-t1qcIom6.js} | 2 +- .../{Sensors-CT9xtj3s.js => Sensors-CjVXAi_E.js} | 2 +- .../{Sessions-ChyQpfIh.js => Sessions-BjPFjtvX.js} | 2 +- .../{Setup-DDZDo4fU.js => Setup-CZMqH1nV.js} | 2 +- ...gnalBars-Ca14Gu_3.js => SignalBars-CwCyvrs-.js} | 2 +- ...Sparkline-DrzfaDAP.js => Sparkline-CrqucW0n.js} | 2 +- ...atistics-BayfSP13.js => Statistics-DE7FhmLr.js} | 2 +- ...emStats-B9UYM5oW.js => SystemStats-CPdf4wwy.js} | 2 +- .../{Terminal-DHlSG9CP.js => Terminal-H1Bfe4_c.js} | 2 +- ...-D8HswuZ5.js => TxPowerNoticeModal-qNJ1X_8Q.js} | 2 +- .../assets/{api-CP9MgmUS.js => api-EpLa-SS4.js} | 4 ++-- ...js => chartjs-adapter-date-fns.esm-kFk3lIdz.js} | 2 +- ...Service-CodM3OZh.js => dataService-C8lExiaM.js} | 2 +- repeater/web/html/assets/dataService-D3_w8go8.js | 1 + repeater/web/html/assets/dataService-k29cfBQr.js | 1 - repeater/web/html/assets/index-BC2aJf7r.css | 1 - repeater/web/html/assets/index-CCly9bPx.css | 1 + .../{index-Cl4Dij8v.js => index-DF5glAZc.js} | 2 +- repeater/web/html/assets/packets-BZHES11w.js | 1 - .../{packets-DqaKkuHX.js => packets-CItQO6OO.js} | 2 +- repeater/web/html/assets/packets-CdVyfwIj.js | 1 + repeater/web/html/assets/system-BoPgpwO9.js | 1 - repeater/web/html/assets/system-CXXVlRna.js | 1 + .../{system-CGj1WgG8.js => system-CuO1gaHr.js} | 2 +- ...websocket-CWIil-yT.js => websocket-D8vz2gnn.js} | 2 +- repeater/web/html/assets/websocket-Kj_Cut-p.js | 1 - repeater/web/html/assets/websocket-e8oZXVGT.js | 1 + repeater/web/html/index.html | 14 +++++++------- 43 files changed, 44 insertions(+), 44 deletions(-) rename repeater/web/html/assets/{CADCalibration-CVNgGJZz.js => CADCalibration-sDbWdeGJ.js} (98%) rename repeater/web/html/assets/{ChartCard-DSqBTrdz.js => ChartCard-D5XCldya.js} (99%) rename repeater/web/html/assets/{Companions-BvYFdYvx.js => Companions-CdUuekpd.js} (99%) rename repeater/web/html/assets/{Configuration-D-blm0qZ.js => Configuration-DRX-sbaI.js} (99%) rename repeater/web/html/assets/{Dashboard-BdHklAFz.js => Dashboard-DhSJn9HX.js} (99%) rename repeater/web/html/assets/{GPSDiagnostics-DkqSbCiV.js => GPSDiagnostics-C9LIlcS7.js} (99%) rename repeater/web/html/assets/{LocationPicker-BfCGxfpG.js => LocationPicker-DEowGt6S.js} (96%) rename repeater/web/html/assets/{Login-BShabpmj.js => Login-B6KB1F1E.js} (98%) rename repeater/web/html/assets/{Logs-CrHzoPRp.js => Logs-CNUMuKWB.js} (99%) rename repeater/web/html/assets/{Neighbors-DjY7zrgE.js => Neighbors-s6MU6vjM.js} (99%) create mode 100644 repeater/web/html/assets/PacketDetailsModal-BIJCmKzB.css delete mode 100644 repeater/web/html/assets/PacketDetailsModal-CeDGHosS.js create mode 100644 repeater/web/html/assets/PacketDetailsModal-Cp96QhHp.js delete mode 100644 repeater/web/html/assets/PacketDetailsModal-DOmYHvNq.css rename repeater/web/html/assets/{RfHealthCorrelation-ByArBbzJ.js => RfHealthCorrelation-Hq8s45i4.js} (99%) rename repeater/web/html/assets/{RoomServers-BUo8HwN-.js => RoomServers-t1qcIom6.js} (99%) rename repeater/web/html/assets/{Sensors-CT9xtj3s.js => Sensors-CjVXAi_E.js} (96%) rename repeater/web/html/assets/{Sessions-ChyQpfIh.js => Sessions-BjPFjtvX.js} (99%) rename repeater/web/html/assets/{Setup-DDZDo4fU.js => Setup-CZMqH1nV.js} (99%) rename repeater/web/html/assets/{SignalBars-Ca14Gu_3.js => SignalBars-CwCyvrs-.js} (93%) rename repeater/web/html/assets/{Sparkline-DrzfaDAP.js => Sparkline-CrqucW0n.js} (97%) rename repeater/web/html/assets/{Statistics-BayfSP13.js => Statistics-DE7FhmLr.js} (98%) rename repeater/web/html/assets/{SystemStats-B9UYM5oW.js => SystemStats-CPdf4wwy.js} (97%) rename repeater/web/html/assets/{Terminal-DHlSG9CP.js => Terminal-H1Bfe4_c.js} (99%) rename repeater/web/html/assets/{TxPowerNoticeModal-D8HswuZ5.js => TxPowerNoticeModal-qNJ1X_8Q.js} (98%) rename repeater/web/html/assets/{api-CP9MgmUS.js => api-EpLa-SS4.js} (97%) rename repeater/web/html/assets/{chartjs-adapter-date-fns.esm-DfIbzYql.js => chartjs-adapter-date-fns.esm-kFk3lIdz.js} (99%) rename repeater/web/html/assets/{dataService-CodM3OZh.js => dataService-C8lExiaM.js} (96%) create mode 100644 repeater/web/html/assets/dataService-D3_w8go8.js delete mode 100644 repeater/web/html/assets/dataService-k29cfBQr.js delete mode 100644 repeater/web/html/assets/index-BC2aJf7r.css create mode 100644 repeater/web/html/assets/index-CCly9bPx.css rename repeater/web/html/assets/{index-Cl4Dij8v.js => index-DF5glAZc.js} (99%) delete mode 100644 repeater/web/html/assets/packets-BZHES11w.js rename repeater/web/html/assets/{packets-DqaKkuHX.js => packets-CItQO6OO.js} (98%) create mode 100644 repeater/web/html/assets/packets-CdVyfwIj.js delete mode 100644 repeater/web/html/assets/system-BoPgpwO9.js create mode 100644 repeater/web/html/assets/system-CXXVlRna.js rename repeater/web/html/assets/{system-CGj1WgG8.js => system-CuO1gaHr.js} (96%) rename repeater/web/html/assets/{websocket-CWIil-yT.js => websocket-D8vz2gnn.js} (93%) delete mode 100644 repeater/web/html/assets/websocket-Kj_Cut-p.js create mode 100644 repeater/web/html/assets/websocket-e8oZXVGT.js diff --git a/repeater/web/html/assets/CADCalibration-CVNgGJZz.js b/repeater/web/html/assets/CADCalibration-sDbWdeGJ.js similarity index 98% rename from repeater/web/html/assets/CADCalibration-CVNgGJZz.js rename to repeater/web/html/assets/CADCalibration-sDbWdeGJ.js index f7d7b70..177b506 100644 --- a/repeater/web/html/assets/CADCalibration-CVNgGJZz.js +++ b/repeater/web/html/assets/CADCalibration-sDbWdeGJ.js @@ -1 +1 @@ -import{r as e}from"./chunk-DECur_0Z.js";import{C as t,T as n,U as r,_t as i,f as a,gt as o,h as s,l as c,m as l,o as u,p as d,r as f,s as p,u as m,w as ee}from"./runtime-core.esm-bundler-CINEgm0a.js";import{l as h,t as g}from"./api-CP9MgmUS.js";import{t as _}from"./system-CGj1WgG8.js";import{d as v,r as y}from"./index-Cl4Dij8v.js";import{t as b}from"./plotly.min-BmxIBpZZ.js";var x=e(b(),1),te={class:`p-6 space-y-6`},ne={class:`glass-card rounded-[15px] p-6`},re={class:`flex justify-center`},ie={class:`flex gap-4`},ae=[`disabled`],oe=[`disabled`],se={class:`glass-card rounded-[15px] p-6 space-y-4`},ce={class:`text-content-primary`},le={class:`flex items-center justify-between gap-4 px-4 bg-primary/opacity-light border border-primary/opacity-medium rounded-lg h-[52px] overflow-hidden`},ue={key:0,class:`text-content-primary dark:text-primary text-sm`},de={key:1,class:`text-content-muted text-sm italic`},fe={key:2,class:`text-content-primary text-sm`},pe={key:3,class:`text-content-secondary dark:text-content-muted text-sm`},me={class:`space-y-2`},he={class:`w-full bg-white/opacity-light rounded-full h-2`},ge={class:`text-content-secondary dark:text-content-muted text-sm`},S={class:`grid grid-cols-2 md:grid-cols-4 gap-4`},C={class:`glass-card rounded-[15px] p-4 text-center`},w={class:`text-2xl font-bold text-primary`},T={class:`glass-card rounded-[15px] p-4 text-center`},E={class:`text-2xl font-bold text-primary`},D={class:`glass-card rounded-[15px] p-4 text-center`},O={class:`text-2xl font-bold text-primary`},k={class:`glass-card rounded-[15px] p-4 text-center`},A={class:`text-2xl font-bold text-primary`},j=v(s({name:`CADCalibrationView`,__name:`CADCalibration`,setup(e){let s=_(),v=u(()=>document.documentElement.classList.contains(`dark`)),b=(e,t)=>typeof window>`u`?t:window.getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t,j=(e,t)=>{let n=e.trim(),r=Math.max(0,Math.min(1,t)),i=n.match(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/);if(i){let e=i[1],t=e.length===3?e.split(``).map(e=>e+e).join(``):e,n=Number.parseInt(t,16);return`rgba(${n>>16&255}, ${n>>8&255}, ${n&255}, ${r})`}let a=n.match(/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i);if(a){let[,e,t,n]=a;return`rgba(${e}, ${t}, ${n}, ${r})`}let o=n.match(/^rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([0-9.]+)\s*\)$/i);if(o){let[,e,t,n]=o;return`rgba(${e}, ${t}, ${n}, ${r})`}return n},M=()=>{let e=v.value,t=b(`--color-text-primary`,e?`#f9fafb`:`#111827`),n=b(`--color-text-muted`,e?`#9ca3af`:`#6b7280`),r=b(`--color-text-secondary`,e?`#d1d5db`:`#374151`),i=b(`--color-border-subtle`,e?`#4b5563`:`#d1d5db`),a=b(`--color-accent-cyan`,`#06b6d4`),o=b(`--color-accent-green`,`#10b981`);return{title:t,subtitle:n,axis:r,tick:n,grid:j(i,e?.3:.4),zeroline:j(i,e?.45:.55),line:j(i,e?.6:.7),colorbarBorder:j(i,e?.55:.65),markerLine:j(i,e?.55:.65),heatmapZero:j(n,.4),heatmapLow:j(a,.3),heatmapMid:j(a,.6),heatmapHigh:j(o,.9)}},N=r(!1),P=r(null),F=r(null),I=r({}),L=r(null),_e=r([]),ve=r({}),R=r(`Ready to start calibration`),z=r(0),B=r(0),V=r(0),H=r(0),U=r(0),W=r(0),G=r(null),K=r(!1),q=r(!1),J=r(!1),Y=r(!1),X=null,ye={responsive:!0,displayModeBar:!0,modeBarButtonsToRemove:[`pan2d`,`select2d`,`lasso2d`,`autoScale2d`],displaylogo:!1,toImageButtonOptions:{format:`png`,filename:`cad-calibration-heatmap`,height:600,width:800,scale:2}};function be(){let e=M(),t=[{x:[],y:[],z:[],mode:`markers`,type:`scatter`,marker:{size:12,color:[],colorscale:[[0,e.heatmapZero],[.1,e.heatmapLow],[.5,e.heatmapMid],[1,e.heatmapHigh]],showscale:!0,colorbar:{title:{text:`Detection Rate (%)`,font:{color:e.axis,size:14}},tickfont:{color:e.tick},bgcolor:`transparent`,bordercolor:e.colorbarBorder,borderwidth:1,thickness:15},line:{color:e.markerLine,width:1}},hovertemplate:`Peak: %{x}
Min: %{y}
Detection Rate: %{marker.color:.1f}%
`,name:`Test Results`}],n={title:{text:`CAD Detection Rate
Channel Activity Detection Calibration`,font:{color:e.title,size:18},x:.5},xaxis:{title:{text:`CAD Peak Threshold`,font:{color:e.axis,size:14}},tickfont:{color:e.tick},gridcolor:e.grid,zerolinecolor:e.zeroline,linecolor:e.line},yaxis:{title:{text:`CAD Min Threshold`,font:{color:e.axis,size:14}},tickfont:{color:e.tick},gridcolor:e.grid,zerolinecolor:e.zeroline,linecolor:e.line},plot_bgcolor:`transparent`,paper_bgcolor:`transparent`,font:{color:e.title,family:`Inter, system-ui, sans-serif`},margin:{l:80,r:80,t:100,b:80},showlegend:!1};x.default.newPlot(`plotly-chart`,t,n,ye)}function xe(){if(Object.keys(I.value).length===0)return;let e=Object.values(I.value),t=[],n=[],r=[];for(let i of e)t.push(i.det_peak),n.push(i.det_min),r.push(i.detection_rate);let i={x:[t],y:[n],"marker.color":[r],hovertemplate:`Peak: %{x}
Min: %{y}
Detection Rate: %{marker.color:.1f}%
Status: Tested
`};x.default.restyle(`plotly-chart`,i,[0])}async function Se(){try{let e=await g.post(`/cad-calibration-start`,{samples:10,delay_ms:50});if(e.success)N.value=!0,P.value=Date.now(),s.setCadCalibrationRunning(!0),I.value={},_e.value=[],ve.value={},L.value=null,K.value=!1,q.value=!1,J.value=!1,Y.value=!1,V.value=0,H.value=0,U.value=0,W.value=0,z.value=0,B.value=0,X=setInterval(()=>{P.value&&(W.value=Math.floor((Date.now()-P.value)/1e3))},1e3),Ce();else throw Error(e.error||`Failed to start calibration`)}catch(e){R.value=`Error: ${e instanceof Error?e.message:`Unknown error`}`}}async function Z(){try{(await g.post(`/cad-calibration-stop`)).success&&(N.value=!1,s.setCadCalibrationRunning(!1),F.value&&=(F.value.close(),null),X&&=(clearInterval(X),null))}catch(e){console.error(`Failed to stop calibration:`,e)}}function Ce(){F.value&&F.value.close();let e=h(),t=e?`?token=${encodeURIComponent(e)}`:``;F.value=new EventSource(`/api/cad-calibration-stream${t}`),F.value.onmessage=function(e){try{we(JSON.parse(e.data))}catch(e){console.error(`Failed to parse SSE data:`,e)}},F.value.onerror=function(e){console.error(`SSE connection error:`,e),N.value||(F.value&&=(F.value.close(),null))}}function we(e){switch(e.type){case`status`:R.value=e.message||`Status update`,e.test_ranges&&(G.value=e.test_ranges,K.value=!0);break;case`progress`:z.value=e.current||0,B.value=e.total||0,V.value=e.current||0;break;case`result`:if(e.det_peak!==void 0&&e.det_min!==void 0&&e.detection_rate!==void 0&&e.detections!==void 0&&e.samples!==void 0){let t=`${e.det_peak}_${e.det_min}`;I.value[t]={det_peak:e.det_peak,det_min:e.det_min,detection_rate:e.detection_rate,detections:e.detections,samples:e.samples},xe(),Q()}break;case`complete`:case`completed`:N.value=!1,R.value=e.message||`Calibration completed`,s.setCadCalibrationRunning(!1),Te(),F.value&&=(F.value.close(),null),X&&=(clearInterval(X),null);break;case`error`:R.value=`Error: ${e.message}`,s.setCadCalibrationRunning(!1),Z();break}}function Q(){let e=Object.values(I.value).map(e=>e.detection_rate);e.length!==0&&(H.value=Math.max(...e),U.value=e.reduce((e,t)=>e+t,0)/e.length)}function Te(){q.value=!0;let e=null,t=0;for(let n of Object.values(I.value))n.detection_rate>t&&(t=n.detection_rate,e=n);L.value=e,e&&t>0?(J.value=!0,Y.value=!1):(J.value=!1,Y.value=!0)}let $=r(!1);async function Ee(){if(!L.value){R.value=`Error: No calibration results to save`;return}try{let e=await g.post(`/save_cad_settings`,{peak:L.value.det_peak,min_val:L.value.det_min,detection_rate:L.value.detection_rate});if(e.success)$.value=!0;else throw Error(e.error||`Failed to save settings`)}catch(e){R.value=`Error: Failed to save settings: ${e instanceof Error?e.message:`Unknown error`}`}}return t(()=>{be()}),ee(()=>{F.value&&F.value.close(),X&&clearInterval(X),s.setCadCalibrationRunning(!1),document.getElementById(`plotly-chart`)&&x.default.purge(`plotly-chart`)}),(e,t)=>(n(),m(f,null,[p(`div`,te,[t[13]||=p(`div`,null,[p(`h1`,{class:`text-2xl font-bold text-content-primary`},` CAD Calibration Tool `),p(`p`,{class:`text-content-secondary dark:text-content-muted mt-2`},` Channel Activity Detection calibration `)],-1),p(`div`,ne,[p(`div`,re,[p(`div`,ie,[p(`button`,{onClick:Se,disabled:N.value,class:`flex items-center gap-3 px-6 py-3 bg-accent-green/opacity-light hover:bg-accent-green/opacity-medium disabled:bg-background-mute/opacity-light text-accent-green disabled:text-content-muted rounded-lg border border-accent-green/opacity-medium disabled:border-stroke-subtle/20 transition-colors disabled:cursor-not-allowed`},[...t[1]||=[a(`
Start Calibration
Begin testing
`,2)]],8,ae),p(`button`,{onClick:Z,disabled:!N.value,class:`flex items-center gap-3 px-6 py-3 bg-accent-red/opacity-light hover:bg-accent-red/opacity-medium disabled:bg-background-mute/opacity-light text-accent-red disabled:text-content-muted rounded-lg border border-accent-red/opacity-medium disabled:border-stroke-subtle/20 transition-colors disabled:cursor-not-allowed`},[...t[2]||=[a(`
Stop
Halt calibration
`,2)]],8,oe)])])]),p(`div`,se,[p(`div`,ce,i(R.value),1),p(`div`,le,[!q.value&&K.value&&G.value?(n(),m(`div`,ue,[t[3]||=p(`strong`,null,`Configuration:`,-1),d(` SF`+i(G.value.spreading_factor)+` | Peak: `+i(G.value.peak_min)+`–`+i(G.value.peak_max)+` | Min: `+i(G.value.min_min)+`–`+i(G.value.min_max)+` | `+i((G.value.peak_max-G.value.peak_min+1)*(G.value.min_max-G.value.min_min+1))+` tests `,1)])):q.value?J.value&&L.value?(n(),m(`div`,fe,[t[4]||=p(`span`,{class:`text-accent-green font-medium`},`Optimal settings found — `,-1),t[5]||=d(` Peak: `,-1),p(`strong`,null,i(L.value.det_peak),1),t[6]||=d(`, Min: `,-1),p(`strong`,null,i(L.value.det_min),1),t[7]||=d(`, Rate: `,-1),p(`strong`,null,i(L.value.detection_rate.toFixed(1))+`%`,1)])):Y.value?(n(),m(`div`,pe,` No optimal settings found. Consider running calibration again. `)):c(``,!0):(n(),m(`div`,de,` Awaiting calibration… `)),J.value&&L.value?(n(),m(`button`,{key:4,onClick:Ee,class:`btn-primary flex-shrink-0 flex items-center gap-2`},[...t[8]||=[p(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[p(`path`,{d:`M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z`})],-1),d(` Save Settings `,-1)]])):c(``,!0)]),p(`div`,me,[p(`div`,he,[p(`div`,{class:`bg-gradient-to-r from-primary to-accent-green h-2 rounded-full transition-all duration-300`,style:o({width:B.value>0?`${z.value/B.value*100}%`:`0%`})},null,4)]),p(`div`,ge,i(z.value)+` / `+i(B.value)+` tests completed `,1)])]),p(`div`,S,[p(`div`,C,[p(`div`,w,i(V.value),1),t[9]||=p(`div`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Tests Completed`,-1)]),p(`div`,T,[p(`div`,E,i(H.value.toFixed(1))+`%`,1),t[10]||=p(`div`,{class:`text-content-secondary dark:text-content-muted text-sm`},` Best Detection Rate `,-1)]),p(`div`,D,[p(`div`,O,i(U.value.toFixed(1))+`%`,1),t[11]||=p(`div`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Average Rate`,-1)]),p(`div`,k,[p(`div`,A,i(W.value)+`s`,1),t[12]||=p(`div`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Elapsed Time`,-1)])]),t[14]||=p(`div`,{class:`glass-card rounded-[15px] p-6`},[p(`div`,{id:`plotly-chart`,class:`w-full h-96`})],-1)]),l(y,{modelValue:$.value,"onUpdate:modelValue":t[0]||=e=>$.value=e,title:`CAD Calibration Saved: Restart Required`,message:`In order for the CAD Calibration settings to take effect and the noise floor to return to normal, the service needs to be restarted.`},null,8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-f8312427`]]);export{j as default}; \ No newline at end of file +import{r as e}from"./chunk-DECur_0Z.js";import{C as t,T as n,U as r,_t as i,f as a,gt as o,h as s,l as c,m as l,o as u,p as d,r as f,s as p,u as m,w as ee}from"./runtime-core.esm-bundler-CINEgm0a.js";import{l as h,t as g}from"./api-EpLa-SS4.js";import{t as _}from"./system-CuO1gaHr.js";import{d as v,r as y}from"./index-DF5glAZc.js";import{t as b}from"./plotly.min-BmxIBpZZ.js";var x=e(b(),1),te={class:`p-6 space-y-6`},ne={class:`glass-card rounded-[15px] p-6`},re={class:`flex justify-center`},ie={class:`flex gap-4`},ae=[`disabled`],oe=[`disabled`],se={class:`glass-card rounded-[15px] p-6 space-y-4`},ce={class:`text-content-primary`},le={class:`flex items-center justify-between gap-4 px-4 bg-primary/opacity-light border border-primary/opacity-medium rounded-lg h-[52px] overflow-hidden`},ue={key:0,class:`text-content-primary dark:text-primary text-sm`},de={key:1,class:`text-content-muted text-sm italic`},fe={key:2,class:`text-content-primary text-sm`},pe={key:3,class:`text-content-secondary dark:text-content-muted text-sm`},me={class:`space-y-2`},he={class:`w-full bg-white/opacity-light rounded-full h-2`},ge={class:`text-content-secondary dark:text-content-muted text-sm`},S={class:`grid grid-cols-2 md:grid-cols-4 gap-4`},C={class:`glass-card rounded-[15px] p-4 text-center`},w={class:`text-2xl font-bold text-primary`},T={class:`glass-card rounded-[15px] p-4 text-center`},E={class:`text-2xl font-bold text-primary`},D={class:`glass-card rounded-[15px] p-4 text-center`},O={class:`text-2xl font-bold text-primary`},k={class:`glass-card rounded-[15px] p-4 text-center`},A={class:`text-2xl font-bold text-primary`},j=v(s({name:`CADCalibrationView`,__name:`CADCalibration`,setup(e){let s=_(),v=u(()=>document.documentElement.classList.contains(`dark`)),b=(e,t)=>typeof window>`u`?t:window.getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t,j=(e,t)=>{let n=e.trim(),r=Math.max(0,Math.min(1,t)),i=n.match(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/);if(i){let e=i[1],t=e.length===3?e.split(``).map(e=>e+e).join(``):e,n=Number.parseInt(t,16);return`rgba(${n>>16&255}, ${n>>8&255}, ${n&255}, ${r})`}let a=n.match(/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i);if(a){let[,e,t,n]=a;return`rgba(${e}, ${t}, ${n}, ${r})`}let o=n.match(/^rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([0-9.]+)\s*\)$/i);if(o){let[,e,t,n]=o;return`rgba(${e}, ${t}, ${n}, ${r})`}return n},M=()=>{let e=v.value,t=b(`--color-text-primary`,e?`#f9fafb`:`#111827`),n=b(`--color-text-muted`,e?`#9ca3af`:`#6b7280`),r=b(`--color-text-secondary`,e?`#d1d5db`:`#374151`),i=b(`--color-border-subtle`,e?`#4b5563`:`#d1d5db`),a=b(`--color-accent-cyan`,`#06b6d4`),o=b(`--color-accent-green`,`#10b981`);return{title:t,subtitle:n,axis:r,tick:n,grid:j(i,e?.3:.4),zeroline:j(i,e?.45:.55),line:j(i,e?.6:.7),colorbarBorder:j(i,e?.55:.65),markerLine:j(i,e?.55:.65),heatmapZero:j(n,.4),heatmapLow:j(a,.3),heatmapMid:j(a,.6),heatmapHigh:j(o,.9)}},N=r(!1),P=r(null),F=r(null),I=r({}),L=r(null),_e=r([]),ve=r({}),R=r(`Ready to start calibration`),z=r(0),B=r(0),V=r(0),H=r(0),U=r(0),W=r(0),G=r(null),K=r(!1),q=r(!1),J=r(!1),Y=r(!1),X=null,ye={responsive:!0,displayModeBar:!0,modeBarButtonsToRemove:[`pan2d`,`select2d`,`lasso2d`,`autoScale2d`],displaylogo:!1,toImageButtonOptions:{format:`png`,filename:`cad-calibration-heatmap`,height:600,width:800,scale:2}};function be(){let e=M(),t=[{x:[],y:[],z:[],mode:`markers`,type:`scatter`,marker:{size:12,color:[],colorscale:[[0,e.heatmapZero],[.1,e.heatmapLow],[.5,e.heatmapMid],[1,e.heatmapHigh]],showscale:!0,colorbar:{title:{text:`Detection Rate (%)`,font:{color:e.axis,size:14}},tickfont:{color:e.tick},bgcolor:`transparent`,bordercolor:e.colorbarBorder,borderwidth:1,thickness:15},line:{color:e.markerLine,width:1}},hovertemplate:`Peak: %{x}
Min: %{y}
Detection Rate: %{marker.color:.1f}%
`,name:`Test Results`}],n={title:{text:`CAD Detection Rate
Channel Activity Detection Calibration`,font:{color:e.title,size:18},x:.5},xaxis:{title:{text:`CAD Peak Threshold`,font:{color:e.axis,size:14}},tickfont:{color:e.tick},gridcolor:e.grid,zerolinecolor:e.zeroline,linecolor:e.line},yaxis:{title:{text:`CAD Min Threshold`,font:{color:e.axis,size:14}},tickfont:{color:e.tick},gridcolor:e.grid,zerolinecolor:e.zeroline,linecolor:e.line},plot_bgcolor:`transparent`,paper_bgcolor:`transparent`,font:{color:e.title,family:`Inter, system-ui, sans-serif`},margin:{l:80,r:80,t:100,b:80},showlegend:!1};x.default.newPlot(`plotly-chart`,t,n,ye)}function xe(){if(Object.keys(I.value).length===0)return;let e=Object.values(I.value),t=[],n=[],r=[];for(let i of e)t.push(i.det_peak),n.push(i.det_min),r.push(i.detection_rate);let i={x:[t],y:[n],"marker.color":[r],hovertemplate:`Peak: %{x}
Min: %{y}
Detection Rate: %{marker.color:.1f}%
Status: Tested
`};x.default.restyle(`plotly-chart`,i,[0])}async function Se(){try{let e=await g.post(`/cad-calibration-start`,{samples:10,delay_ms:50});if(e.success)N.value=!0,P.value=Date.now(),s.setCadCalibrationRunning(!0),I.value={},_e.value=[],ve.value={},L.value=null,K.value=!1,q.value=!1,J.value=!1,Y.value=!1,V.value=0,H.value=0,U.value=0,W.value=0,z.value=0,B.value=0,X=setInterval(()=>{P.value&&(W.value=Math.floor((Date.now()-P.value)/1e3))},1e3),Ce();else throw Error(e.error||`Failed to start calibration`)}catch(e){R.value=`Error: ${e instanceof Error?e.message:`Unknown error`}`}}async function Z(){try{(await g.post(`/cad-calibration-stop`)).success&&(N.value=!1,s.setCadCalibrationRunning(!1),F.value&&=(F.value.close(),null),X&&=(clearInterval(X),null))}catch(e){console.error(`Failed to stop calibration:`,e)}}function Ce(){F.value&&F.value.close();let e=h(),t=e?`?token=${encodeURIComponent(e)}`:``;F.value=new EventSource(`/api/cad-calibration-stream${t}`),F.value.onmessage=function(e){try{we(JSON.parse(e.data))}catch(e){console.error(`Failed to parse SSE data:`,e)}},F.value.onerror=function(e){console.error(`SSE connection error:`,e),N.value||(F.value&&=(F.value.close(),null))}}function we(e){switch(e.type){case`status`:R.value=e.message||`Status update`,e.test_ranges&&(G.value=e.test_ranges,K.value=!0);break;case`progress`:z.value=e.current||0,B.value=e.total||0,V.value=e.current||0;break;case`result`:if(e.det_peak!==void 0&&e.det_min!==void 0&&e.detection_rate!==void 0&&e.detections!==void 0&&e.samples!==void 0){let t=`${e.det_peak}_${e.det_min}`;I.value[t]={det_peak:e.det_peak,det_min:e.det_min,detection_rate:e.detection_rate,detections:e.detections,samples:e.samples},xe(),Q()}break;case`complete`:case`completed`:N.value=!1,R.value=e.message||`Calibration completed`,s.setCadCalibrationRunning(!1),Te(),F.value&&=(F.value.close(),null),X&&=(clearInterval(X),null);break;case`error`:R.value=`Error: ${e.message}`,s.setCadCalibrationRunning(!1),Z();break}}function Q(){let e=Object.values(I.value).map(e=>e.detection_rate);e.length!==0&&(H.value=Math.max(...e),U.value=e.reduce((e,t)=>e+t,0)/e.length)}function Te(){q.value=!0;let e=null,t=0;for(let n of Object.values(I.value))n.detection_rate>t&&(t=n.detection_rate,e=n);L.value=e,e&&t>0?(J.value=!0,Y.value=!1):(J.value=!1,Y.value=!0)}let $=r(!1);async function Ee(){if(!L.value){R.value=`Error: No calibration results to save`;return}try{let e=await g.post(`/save_cad_settings`,{peak:L.value.det_peak,min_val:L.value.det_min,detection_rate:L.value.detection_rate});if(e.success)$.value=!0;else throw Error(e.error||`Failed to save settings`)}catch(e){R.value=`Error: Failed to save settings: ${e instanceof Error?e.message:`Unknown error`}`}}return t(()=>{be()}),ee(()=>{F.value&&F.value.close(),X&&clearInterval(X),s.setCadCalibrationRunning(!1),document.getElementById(`plotly-chart`)&&x.default.purge(`plotly-chart`)}),(e,t)=>(n(),m(f,null,[p(`div`,te,[t[13]||=p(`div`,null,[p(`h1`,{class:`text-2xl font-bold text-content-primary`},` CAD Calibration Tool `),p(`p`,{class:`text-content-secondary dark:text-content-muted mt-2`},` Channel Activity Detection calibration `)],-1),p(`div`,ne,[p(`div`,re,[p(`div`,ie,[p(`button`,{onClick:Se,disabled:N.value,class:`flex items-center gap-3 px-6 py-3 bg-accent-green/opacity-light hover:bg-accent-green/opacity-medium disabled:bg-background-mute/opacity-light text-accent-green disabled:text-content-muted rounded-lg border border-accent-green/opacity-medium disabled:border-stroke-subtle/20 transition-colors disabled:cursor-not-allowed`},[...t[1]||=[a(`
Start Calibration
Begin testing
`,2)]],8,ae),p(`button`,{onClick:Z,disabled:!N.value,class:`flex items-center gap-3 px-6 py-3 bg-accent-red/opacity-light hover:bg-accent-red/opacity-medium disabled:bg-background-mute/opacity-light text-accent-red disabled:text-content-muted rounded-lg border border-accent-red/opacity-medium disabled:border-stroke-subtle/20 transition-colors disabled:cursor-not-allowed`},[...t[2]||=[a(`
Stop
Halt calibration
`,2)]],8,oe)])])]),p(`div`,se,[p(`div`,ce,i(R.value),1),p(`div`,le,[!q.value&&K.value&&G.value?(n(),m(`div`,ue,[t[3]||=p(`strong`,null,`Configuration:`,-1),d(` SF`+i(G.value.spreading_factor)+` | Peak: `+i(G.value.peak_min)+`–`+i(G.value.peak_max)+` | Min: `+i(G.value.min_min)+`–`+i(G.value.min_max)+` | `+i((G.value.peak_max-G.value.peak_min+1)*(G.value.min_max-G.value.min_min+1))+` tests `,1)])):q.value?J.value&&L.value?(n(),m(`div`,fe,[t[4]||=p(`span`,{class:`text-accent-green font-medium`},`Optimal settings found — `,-1),t[5]||=d(` Peak: `,-1),p(`strong`,null,i(L.value.det_peak),1),t[6]||=d(`, Min: `,-1),p(`strong`,null,i(L.value.det_min),1),t[7]||=d(`, Rate: `,-1),p(`strong`,null,i(L.value.detection_rate.toFixed(1))+`%`,1)])):Y.value?(n(),m(`div`,pe,` No optimal settings found. Consider running calibration again. `)):c(``,!0):(n(),m(`div`,de,` Awaiting calibration… `)),J.value&&L.value?(n(),m(`button`,{key:4,onClick:Ee,class:`btn-primary flex-shrink-0 flex items-center gap-2`},[...t[8]||=[p(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[p(`path`,{d:`M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z`})],-1),d(` Save Settings `,-1)]])):c(``,!0)]),p(`div`,me,[p(`div`,he,[p(`div`,{class:`bg-gradient-to-r from-primary to-accent-green h-2 rounded-full transition-all duration-300`,style:o({width:B.value>0?`${z.value/B.value*100}%`:`0%`})},null,4)]),p(`div`,ge,i(z.value)+` / `+i(B.value)+` tests completed `,1)])]),p(`div`,S,[p(`div`,C,[p(`div`,w,i(V.value),1),t[9]||=p(`div`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Tests Completed`,-1)]),p(`div`,T,[p(`div`,E,i(H.value.toFixed(1))+`%`,1),t[10]||=p(`div`,{class:`text-content-secondary dark:text-content-muted text-sm`},` Best Detection Rate `,-1)]),p(`div`,D,[p(`div`,O,i(U.value.toFixed(1))+`%`,1),t[11]||=p(`div`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Average Rate`,-1)]),p(`div`,k,[p(`div`,A,i(W.value)+`s`,1),t[12]||=p(`div`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Elapsed Time`,-1)])]),t[14]||=p(`div`,{class:`glass-card rounded-[15px] p-6`},[p(`div`,{id:`plotly-chart`,class:`w-full h-96`})],-1)]),l(y,{modelValue:$.value,"onUpdate:modelValue":t[0]||=e=>$.value=e,title:`CAD Calibration Saved: Restart Required`,message:`In order for the CAD Calibration settings to take effect and the noise floor to return to normal, the service needs to be restarted.`},null,8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-f8312427`]]);export{j as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/ChartCard-DSqBTrdz.js b/repeater/web/html/assets/ChartCard-D5XCldya.js similarity index 99% rename from repeater/web/html/assets/ChartCard-DSqBTrdz.js rename to repeater/web/html/assets/ChartCard-D5XCldya.js index 1a66a59..dbf9a74 100644 --- a/repeater/web/html/assets/ChartCard-DSqBTrdz.js +++ b/repeater/web/html/assets/ChartCard-D5XCldya.js @@ -1,3 +1,3 @@ -import{O as e,T as t,U as n,_t as r,h as i,j as a,l as o,m as s,s as c,u as l,x as u}from"./runtime-core.esm-bundler-CINEgm0a.js";import{t as d}from"./api-CP9MgmUS.js";import{t as f}from"./Spinner-CMJUE3iy.js";function p(e){return e+.5|0}var m=(e,t,n)=>Math.max(Math.min(e,n),t);function h(e){return m(p(e*2.55),0,255)}function g(e){return m(p(e*255),0,255)}function _(e){return m(p(e/2.55)/100,0,1)}function v(e){return m(p(e*100),0,100)}var y={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},b=[...`0123456789ABCDEF`],x=e=>b[e&15],S=e=>b[(e&240)>>4]+b[e&15],C=e=>(e&240)>>4==(e&15),w=e=>C(e.r)&&C(e.g)&&C(e.b)&&C(e.a);function T(e){var t=e.length,n;return e[0]===`#`&&(t===4||t===5?n={r:255&y[e[1]]*17,g:255&y[e[2]]*17,b:255&y[e[3]]*17,a:t===5?y[e[4]]*17:255}:(t===7||t===9)&&(n={r:y[e[1]]<<4|y[e[2]],g:y[e[3]]<<4|y[e[4]],b:y[e[5]]<<4|y[e[6]],a:t===9?y[e[7]]<<4|y[e[8]]:255})),n}var E=(e,t)=>e<255?t(e):``;function D(e){var t=w(e)?x:S;return e?`#`+t(e.r)+t(e.g)+t(e.b)+E(e.a,t):void 0}var ee=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function O(e,t,n){let r=t*Math.min(n,1-n),i=(t,i=(t+e/30)%12)=>n-r*Math.max(Math.min(i-3,9-i,1),-1);return[i(0),i(8),i(4)]}function te(e,t,n){let r=(r,i=(r+e/60)%6)=>n-n*t*Math.max(Math.min(i,4-i,1),0);return[r(5),r(3),r(1)]}function ne(e,t,n){let r=O(e,1,.5),i;for(t+n>1&&(i=1/(t+n),t*=i,n*=i),i=0;i<3;i++)r[i]*=1-t-n,r[i]+=t;return r}function re(e,t,n,r,i){return e===i?(t-n)/r+(t.5?l/(2-i-a):l/(i+a),s=re(t,n,r,l,i),s=s*60+.5),[s|0,c||0,o]}function ae(e,t,n,r){return(Array.isArray(t)?e(t[0],t[1],t[2]):e(t,n,r)).map(g)}function oe(e,t,n){return ae(O,e,t,n)}function se(e,t,n){return ae(ne,e,t,n)}function ce(e,t,n){return ae(te,e,t,n)}function le(e){return(e%360+360)%360}function ue(e){let t=ee.exec(e),n=255,r;if(!t)return;t[5]!==r&&(n=t[6]?h(+t[5]):g(+t[5]));let i=le(+t[2]),a=t[3]/100,o=t[4]/100;return r=t[1]===`hwb`?se(i,a,o):t[1]===`hsv`?ce(i,a,o):oe(i,a,o),{r:r[0],g:r[1],b:r[2],a:n}}function de(e,t){var n=ie(e);n[0]=le(n[0]+t),n=oe(n),e.r=n[0],e.g=n[1],e.b=n[2]}function fe(e){if(!e)return;let t=ie(e),n=t[0],r=v(t[1]),i=v(t[2]);return e.a<255?`hsla(${n}, ${r}%, ${i}%, ${_(e.a)})`:`hsl(${n}, ${r}%, ${i}%)`}var pe={x:`dark`,Z:`light`,Y:`re`,X:`blu`,W:`gr`,V:`medium`,U:`slate`,A:`ee`,T:`ol`,S:`or`,B:`ra`,C:`lateg`,D:`ights`,R:`in`,Q:`turquois`,E:`hi`,P:`ro`,O:`al`,N:`le`,M:`de`,L:`yello`,F:`en`,K:`ch`,G:`arks`,H:`ea`,I:`ightg`,J:`wh`},me={OiceXe:`f0f8ff`,antiquewEte:`faebd7`,aqua:`ffff`,aquamarRe:`7fffd4`,azuY:`f0ffff`,beige:`f5f5dc`,bisque:`ffe4c4`,black:`0`,blanKedOmond:`ffebcd`,Xe:`ff`,XeviTet:`8a2be2`,bPwn:`a52a2a`,burlywood:`deb887`,caMtXe:`5f9ea0`,KartYuse:`7fff00`,KocTate:`d2691e`,cSO:`ff7f50`,cSnflowerXe:`6495ed`,cSnsilk:`fff8dc`,crimson:`dc143c`,cyan:`ffff`,xXe:`8b`,xcyan:`8b8b`,xgTMnPd:`b8860b`,xWay:`a9a9a9`,xgYF:`6400`,xgYy:`a9a9a9`,xkhaki:`bdb76b`,xmagFta:`8b008b`,xTivegYF:`556b2f`,xSange:`ff8c00`,xScEd:`9932cc`,xYd:`8b0000`,xsOmon:`e9967a`,xsHgYF:`8fbc8f`,xUXe:`483d8b`,xUWay:`2f4f4f`,xUgYy:`2f4f4f`,xQe:`ced1`,xviTet:`9400d3`,dAppRk:`ff1493`,dApskyXe:`bfff`,dimWay:`696969`,dimgYy:`696969`,dodgerXe:`1e90ff`,fiYbrick:`b22222`,flSOwEte:`fffaf0`,foYstWAn:`228b22`,fuKsia:`ff00ff`,gaRsbSo:`dcdcdc`,ghostwEte:`f8f8ff`,gTd:`ffd700`,gTMnPd:`daa520`,Way:`808080`,gYF:`8000`,gYFLw:`adff2f`,gYy:`808080`,honeyMw:`f0fff0`,hotpRk:`ff69b4`,RdianYd:`cd5c5c`,Rdigo:`4b0082`,ivSy:`fffff0`,khaki:`f0e68c`,lavFMr:`e6e6fa`,lavFMrXsh:`fff0f5`,lawngYF:`7cfc00`,NmoncEffon:`fffacd`,ZXe:`add8e6`,ZcSO:`f08080`,Zcyan:`e0ffff`,ZgTMnPdLw:`fafad2`,ZWay:`d3d3d3`,ZgYF:`90ee90`,ZgYy:`d3d3d3`,ZpRk:`ffb6c1`,ZsOmon:`ffa07a`,ZsHgYF:`20b2aa`,ZskyXe:`87cefa`,ZUWay:`778899`,ZUgYy:`778899`,ZstAlXe:`b0c4de`,ZLw:`ffffe0`,lime:`ff00`,limegYF:`32cd32`,lRF:`faf0e6`,magFta:`ff00ff`,maPon:`800000`,VaquamarRe:`66cdaa`,VXe:`cd`,VScEd:`ba55d3`,VpurpN:`9370db`,VsHgYF:`3cb371`,VUXe:`7b68ee`,VsprRggYF:`fa9a`,VQe:`48d1cc`,VviTetYd:`c71585`,midnightXe:`191970`,mRtcYam:`f5fffa`,mistyPse:`ffe4e1`,moccasR:`ffe4b5`,navajowEte:`ffdead`,navy:`80`,Tdlace:`fdf5e6`,Tive:`808000`,TivedBb:`6b8e23`,Sange:`ffa500`,SangeYd:`ff4500`,ScEd:`da70d6`,pOegTMnPd:`eee8aa`,pOegYF:`98fb98`,pOeQe:`afeeee`,pOeviTetYd:`db7093`,papayawEp:`ffefd5`,pHKpuff:`ffdab9`,peru:`cd853f`,pRk:`ffc0cb`,plum:`dda0dd`,powMrXe:`b0e0e6`,purpN:`800080`,YbeccapurpN:`663399`,Yd:`ff0000`,Psybrown:`bc8f8f`,PyOXe:`4169e1`,saddNbPwn:`8b4513`,sOmon:`fa8072`,sandybPwn:`f4a460`,sHgYF:`2e8b57`,sHshell:`fff5ee`,siFna:`a0522d`,silver:`c0c0c0`,skyXe:`87ceeb`,UXe:`6a5acd`,UWay:`708090`,UgYy:`708090`,snow:`fffafa`,sprRggYF:`ff7f`,stAlXe:`4682b4`,tan:`d2b48c`,teO:`8080`,tEstN:`d8bfd8`,tomato:`ff6347`,Qe:`40e0d0`,viTet:`ee82ee`,JHt:`f5deb3`,wEte:`ffffff`,wEtesmoke:`f5f5f5`,Lw:`ffff00`,LwgYF:`9acd32`};function he(){let e={},t=Object.keys(me),n=Object.keys(pe),r,i,a,o,s;for(r=0;r>16&255,a>>8&255,a&255]}return e}var ge;function _e(e){ge||(ge=he(),ge.transparent=[0,0,0,0]);let t=ge[e.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}var ve=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function ye(e){let t=ve.exec(e),n=255,r,i,a;if(t){if(t[7]!==r){let e=+t[7];n=t[8]?h(e):m(e*255,0,255)}return r=+t[1],i=+t[3],a=+t[5],r=255&(t[2]?h(r):m(r,0,255)),i=255&(t[4]?h(i):m(i,0,255)),a=255&(t[6]?h(a):m(a,0,255)),{r,g:i,b:a,a:n}}}function be(e){return e&&(e.a<255?`rgba(${e.r}, ${e.g}, ${e.b}, ${_(e.a)})`:`rgb(${e.r}, ${e.g}, ${e.b})`)}var xe=e=>e<=.0031308?e*12.92:e**(1/2.4)*1.055-.055,Se=e=>e<=.04045?e/12.92:((e+.055)/1.055)**2.4;function Ce(e,t,n){let r=Se(_(e.r)),i=Se(_(e.g)),a=Se(_(e.b));return{r:g(xe(r+n*(Se(_(t.r))-r))),g:g(xe(i+n*(Se(_(t.g))-i))),b:g(xe(a+n*(Se(_(t.b))-a))),a:e.a+n*(t.a-e.a)}}function we(e,t,n){if(e){let r=ie(e);r[t]=Math.max(0,Math.min(r[t]+r[t]*n,t===0?360:1)),r=oe(r),e.r=r[0],e.g=r[1],e.b=r[2]}}function Te(e,t){return e&&Object.assign(t||{},e)}function Ee(e){var t={r:0,g:0,b:0,a:255};return Array.isArray(e)?e.length>=3&&(t={r:e[0],g:e[1],b:e[2],a:255},e.length>3&&(t.a=g(e[3]))):(t=Te(e,{r:0,g:0,b:0,a:1}),t.a=g(t.a)),t}function De(e){return e.charAt(0)===`r`?ye(e):ue(e)}var Oe=class e{constructor(t){if(t instanceof e)return t;let n=typeof t,r;n===`object`?r=Ee(t):n===`string`&&(r=T(t)||_e(t)||De(t)),this._rgb=r,this._valid=!!r}get valid(){return this._valid}get rgb(){var e=Te(this._rgb);return e&&(e.a=_(e.a)),e}set rgb(e){this._rgb=Ee(e)}rgbString(){return this._valid?be(this._rgb):void 0}hexString(){return this._valid?D(this._rgb):void 0}hslString(){return this._valid?fe(this._rgb):void 0}mix(e,t){if(e){let n=this.rgb,r=e.rgb,i,a=t===i?.5:t,o=2*a-1,s=n.a-r.a,c=((o*s===-1?o:(o+s)/(1+o*s))+1)/2;i=1-c,n.r=255&c*n.r+i*r.r+.5,n.g=255&c*n.g+i*r.g+.5,n.b=255&c*n.b+i*r.b+.5,n.a=a*n.a+(1-a)*r.a,this.rgb=n}return this}interpolate(e,t){return e&&(this._rgb=Ce(this._rgb,e._rgb,t)),this}clone(){return new e(this.rgb)}alpha(e){return this._rgb.a=g(e),this}clearer(e){let t=this._rgb;return t.a*=1-e,this}greyscale(){let e=this._rgb;return e.r=e.g=e.b=p(e.r*.3+e.g*.59+e.b*.11),this}opaquer(e){let t=this._rgb;return t.a*=1+e,this}negate(){let e=this._rgb;return e.r=255-e.r,e.g=255-e.g,e.b=255-e.b,this}lighten(e){return we(this._rgb,2,e),this}darken(e){return we(this._rgb,2,-e),this}saturate(e){return we(this._rgb,1,e),this}desaturate(e){return we(this._rgb,1,-e),this}rotate(e){return de(this._rgb,e),this}};function ke(){}var Ae=(()=>{let e=0;return()=>e++})();function k(e){return e==null}function A(e){if(Array.isArray&&Array.isArray(e))return!0;let t=Object.prototype.toString.call(e);return t.slice(0,7)===`[object`&&t.slice(-6)===`Array]`}function j(e){return e!==null&&Object.prototype.toString.call(e)===`[object Object]`}function M(e){return(typeof e==`number`||e instanceof Number)&&isFinite(+e)}function N(e,t){return M(e)?e:t}function P(e,t){return e===void 0?t:e}var je=(e,t)=>typeof e==`string`&&e.endsWith(`%`)?parseFloat(e)/100:+e/t,Me=(e,t)=>typeof e==`string`&&e.endsWith(`%`)?parseFloat(e)/100*t:+e;function F(e,t,n){if(e&&typeof e.call==`function`)return e.apply(n,t)}function I(e,t,n,r){let i,a,o;if(A(e))if(a=e.length,r)for(i=a-1;i>=0;i--)t.call(n,e[i],i);else for(i=0;ie,x:e=>e.x,y:e=>e.y};function Ve(e){let t=e.split(`.`),n=[],r=``;for(let e of t)r+=e,r.endsWith(`\\`)?r=r.slice(0,-1)+`.`:(n.push(r),r=``);return n}function He(e){let t=Ve(e);return e=>{for(let n of t){if(n===``)break;e&&=e[n]}return e}}function Ue(e,t){return(Be[t]||(Be[t]=He(t)))(e)}function We(e){return e.charAt(0).toUpperCase()+e.slice(1)}var Ge=e=>e!==void 0,Ke=e=>typeof e==`function`,qe=(e,t)=>{if(e.size!==t.size)return!1;for(let n of e)if(!t.has(n))return!1;return!0};function Je(e){return e.type===`mouseup`||e.type===`click`||e.type===`contextmenu`}var L=Math.PI,R=2*L,Ye=R+L,Xe=1/0,Ze=L/180,z=L/2,Qe=L/4,$e=L*2/3,et=Math.log10,B=Math.sign;function tt(e,t,n){return Math.abs(e-t)e-t).pop(),t}function it(e){return typeof e==`symbol`||typeof e==`object`&&!!e&&!(Symbol.toPrimitive in e||`toString`in e||`valueOf`in e)}function at(e){return!it(e)&&!isNaN(parseFloat(e))&&isFinite(e)}function ot(e,t){let n=Math.round(e);return n-t<=e&&n+t>=e}function st(e,t,n){let r,i,a;for(r=0,i=e.length;rc&&l=Math.min(t,n)-r&&e<=Math.max(t,n)+r}function ht(e,t,n){n||=(n=>e[n]1;)a=i+r>>1,n(a)?i=a:r=a;return{lo:i,hi:r}}var gt=(e,t,n,r)=>ht(e,n,r?r=>{let i=e[r][t];return ie[r][t]ht(e,n,r=>e[r][t]>=n);function vt(e,t,n){let r=0,i=e.length;for(;rr&&e[i-1]>n;)i--;return r>0||i{let n=`_onData`+We(t),r=e[t];Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value(...t){let i=r.apply(this,t);return e._chartjs.listeners.forEach(e=>{typeof e[n]==`function`&&e[n](...t)}),i}})})}function xt(e,t){let n=e._chartjs;if(!n)return;let r=n.listeners,i=r.indexOf(t);i!==-1&&r.splice(i,1),!(r.length>0)&&(yt.forEach(t=>{delete e[t]}),delete e._chartjs)}function St(e){let t=new Set(e);return t.size===e.length?e:Array.from(t)}var Ct=function(){return typeof window>`u`?function(e){return e()}:window.requestAnimationFrame}();function wt(e,t){let n=[],r=!1;return function(...i){n=i,r||(r=!0,Ct.call(window,()=>{r=!1,e.apply(t,n)}))}}function Tt(e,t){let n;return function(...r){return t?(clearTimeout(n),n=setTimeout(e,t,r)):e.apply(this,r),t}}var Et=e=>e===`start`?`left`:e===`end`?`right`:`center`,G=(e,t,n)=>e===`start`?t:e===`end`?n:(t+n)/2,Dt=(e,t,n,r)=>e===(r?`left`:`right`)?n:e===`center`?(t+n)/2:t;function Ot(e,t,n){let r=t.length,i=0,a=r;if(e._sorted){let{iScale:o,vScale:s,_parsed:c}=e,l=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null,u=o.axis,{min:d,max:f,minDefined:p,maxDefined:m}=o.getUserBounds();if(p){if(i=Math.min(gt(c,u,d).lo,n?r:gt(t,u,o.getPixelForValue(d)).lo),l){let e=c.slice(0,i+1).reverse().findIndex(e=>!k(e[s.axis]));i-=Math.max(0,e)}i=U(i,0,r-1)}if(m){let e=Math.max(gt(c,o.axis,f,!0).hi+1,n?0:gt(t,u,o.getPixelForValue(f),!0).hi+1);if(l){let t=c.slice(e-1).findIndex(e=>!k(e[s.axis]));e+=Math.max(0,t)}a=U(e,i,r)-i}else a=r-i}return{start:i,count:a}}function kt(e){let{xScale:t,yScale:n,_scaleRanges:r}=e,i={xmin:t.min,xmax:t.max,ymin:n.min,ymax:n.max};if(!r)return e._scaleRanges=i,!0;let a=r.xmin!==t.min||r.xmax!==t.max||r.ymin!==n.min||r.ymax!==n.max;return Object.assign(r,i),a}var At=e=>e===0||e===1,jt=(e,t,n)=>-(2**(10*--e)*Math.sin((e-t)*R/n)),Mt=(e,t,n)=>2**(-10*e)*Math.sin((e-t)*R/n)+1,Nt={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>-e*(e-2),easeInOutQuad:e=>(e/=.5)<1?.5*e*e:-.5*(--e*(e-2)-1),easeInCubic:e=>e*e*e,easeOutCubic:e=>--e*e*e+1,easeInOutCubic:e=>(e/=.5)<1?.5*e*e*e:.5*((e-=2)*e*e+2),easeInQuart:e=>e*e*e*e,easeOutQuart:e=>-(--e*e*e*e-1),easeInOutQuart:e=>(e/=.5)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2),easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>--e*e*e*e*e+1,easeInOutQuint:e=>(e/=.5)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2),easeInSine:e=>-Math.cos(e*z)+1,easeOutSine:e=>Math.sin(e*z),easeInOutSine:e=>-.5*(Math.cos(L*e)-1),easeInExpo:e=>e===0?0:2**(10*(e-1)),easeOutExpo:e=>e===1?1:-(2**(-10*e))+1,easeInOutExpo:e=>At(e)?e:e<.5?.5*2**(10*(e*2-1)):.5*(-(2**(-10*(e*2-1)))+2),easeInCirc:e=>e>=1?e:-(Math.sqrt(1-e*e)-1),easeOutCirc:e=>Math.sqrt(1- --e*e),easeInOutCirc:e=>(e/=.5)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1),easeInElastic:e=>At(e)?e:jt(e,.075,.3),easeOutElastic:e=>At(e)?e:Mt(e,.075,.3),easeInOutElastic(e){let t=.1125,n=.45;return At(e)?e:e<.5?.5*jt(e*2,t,n):.5+.5*Mt(e*2-1,t,n)},easeInBack(e){let t=1.70158;return e*e*((t+1)*e-t)},easeOutBack(e){let t=1.70158;return--e*e*((t+1)*e+t)+1},easeInOutBack(e){let t=1.70158;return(e/=.5)<1?.5*(e*e*(((t*=1.525)+1)*e-t)):.5*((e-=2)*e*(((t*=1.525)+1)*e+t)+2)},easeInBounce:e=>1-Nt.easeOutBounce(1-e),easeOutBounce(e){let t=7.5625,n=2.75;return e<1/n?t*e*e:e<2/n?t*(e-=1.5/n)*e+.75:e<2.5/n?t*(e-=2.25/n)*e+.9375:t*(e-=2.625/n)*e+.984375},easeInOutBounce:e=>e<.5?Nt.easeInBounce(e*2)*.5:Nt.easeOutBounce(e*2-1)*.5+.5};function Pt(e){if(e&&typeof e==`object`){let t=e.toString();return t===`[object CanvasPattern]`||t===`[object CanvasGradient]`}return!1}function Ft(e){return Pt(e)?e:new Oe(e)}function It(e){return Pt(e)?e:new Oe(e).saturate(.5).darken(.1).hexString()}var Lt=[`x`,`y`,`borderWidth`,`radius`,`tension`],Rt=[`color`,`borderColor`,`backgroundColor`];function zt(e){e.set(`animation`,{delay:void 0,duration:1e3,easing:`easeOutQuart`,fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),e.describe(`animation`,{_fallback:!1,_indexable:!1,_scriptable:e=>e!==`onProgress`&&e!==`onComplete`&&e!==`fn`}),e.set(`animations`,{colors:{type:`color`,properties:Rt},numbers:{type:`number`,properties:Lt}}),e.describe(`animations`,{_fallback:`animation`}),e.set(`transitions`,{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:`transparent`},visible:{type:`boolean`,duration:0}}},hide:{animations:{colors:{to:`transparent`},visible:{type:`boolean`,easing:`linear`,fn:e=>e|0}}}})}function Bt(e){e.set(`layout`,{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}var Vt=new Map;function Ht(e,t){t||={};let n=e+JSON.stringify(t),r=Vt.get(n);return r||(r=new Intl.NumberFormat(e,t),Vt.set(n,r)),r}function Ut(e,t,n){return Ht(t,n).format(e)}var Wt={values(e){return A(e)?e:``+e},numeric(e,t,n){if(e===0)return`0`;let r=this.chart.options.locale,i,a=e;if(n.length>1){let t=Math.max(Math.abs(n[0].value),Math.abs(n[n.length-1].value));(t<1e-4||t>0x38d7ea4c68000)&&(i=`scientific`),a=Gt(e,n)}let o=et(Math.abs(a)),s=isNaN(o)?1:Math.max(Math.min(-1*Math.floor(o),20),0),c={notation:i,minimumFractionDigits:s,maximumFractionDigits:s};return Object.assign(c,this.options.ticks.format),Ut(e,r,c)},logarithmic(e,t,n){if(e===0)return`0`;let r=n[t].significand||e/10**Math.floor(et(e));return[1,2,3,5,10,15].includes(r)||t>.8*n.length?Wt.numeric.call(this,e,t,n):``}};function Gt(e,t){let n=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(n)>=1&&e!==Math.floor(e)&&(n=e-Math.floor(e)),n}var Kt={formatters:Wt};function qt(e){e.set(`scale`,{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:`ticks`,clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(e,t)=>t.lineWidth,tickColor:(e,t)=>t.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:``,padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:``,padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Kt.formatters.values,minor:{},major:{},align:`center`,crossAlign:`near`,showLabelBackdrop:!1,backdropColor:`rgba(255, 255, 255, 0.75)`,backdropPadding:2}}),e.route(`scale.ticks`,`color`,``,`color`),e.route(`scale.grid`,`color`,``,`borderColor`),e.route(`scale.border`,`color`,``,`borderColor`),e.route(`scale.title`,`color`,``,`color`),e.describe(`scale`,{_fallback:!1,_scriptable:e=>!e.startsWith(`before`)&&!e.startsWith(`after`)&&e!==`callback`&&e!==`parser`,_indexable:e=>e!==`borderDash`&&e!==`tickBorderDash`&&e!==`dash`}),e.describe(`scales`,{_fallback:`scale`}),e.describe(`scale.ticks`,{_scriptable:e=>e!==`backdropPadding`&&e!==`callback`,_indexable:e=>e!==`backdropPadding`})}var Jt=Object.create(null),Yt=Object.create(null);function Xt(e,t){if(!t)return e;let n=t.split(`.`);for(let t=0,r=n.length;te.chart.platform.getDevicePixelRatio(),this.elements={},this.events=[`mousemove`,`mouseout`,`click`,`touchstart`,`touchmove`],this.font={family:`'Helvetica Neue', 'Helvetica', 'Arial', sans-serif`,size:12,style:`normal`,lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(e,t)=>It(t.backgroundColor),this.hoverBorderColor=(e,t)=>It(t.borderColor),this.hoverColor=(e,t)=>It(t.color),this.indexAxis=`x`,this.interaction={mode:`nearest`,intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(e),this.apply(t)}set(e,t){return Zt(this,e,t)}get(e){return Xt(this,e)}describe(e,t){return Zt(Yt,e,t)}override(e,t){return Zt(Jt,e,t)}route(e,t,n,r){let i=Xt(this,e),a=Xt(this,n),o=`_`+t;Object.defineProperties(i,{[o]:{value:i[t],writable:!0},[t]:{enumerable:!0,get(){let e=this[o],t=a[r];return j(e)?Object.assign({},t,e):P(e,t)},set(e){this[o]=e}}})}apply(e){e.forEach(e=>e(this))}}({_scriptable:e=>!e.startsWith(`on`),_indexable:e=>e!==`events`,hover:{_fallback:`interaction`},interaction:{_scriptable:!1,_indexable:!1}},[zt,Bt,qt]);function Qt(e){return!e||k(e.size)||k(e.family)?null:(e.style?e.style+` `:``)+(e.weight?e.weight+` `:``)+e.size+`px `+e.family}function $t(e,t,n,r,i){let a=t[i];return a||(a=t[i]=e.measureText(i).width,n.push(i)),a>r&&(r=a),r}function en(e,t,n,r){r||={};let i=r.data=r.data||{},a=r.garbageCollect=r.garbageCollect||[];r.font!==t&&(i=r.data={},a=r.garbageCollect=[],r.font=t),e.save(),e.font=t;let o=0,s=n.length,c,l,u,d,f;for(c=0;cn.length){for(c=0;c0&&e.stroke()}}function on(e,t,n){return n||=.5,!t||e&&e.x>t.left-n&&e.xt.top-n&&e.y0&&a.strokeColor!==``,c,l;for(e.save(),e.font=i.string,dn(e,a),c=0;c+e||0;function bn(e,t){let n={},r=j(t),i=r?Object.keys(t):t,a=j(e)?r?n=>P(e[n],e[t[n]]):t=>e[t]:()=>e;for(let e of i)n[e]=yn(a(e));return n}function xn(e){return bn(e,{top:`y`,right:`x`,bottom:`y`,left:`x`})}function Sn(e){return bn(e,[`topLeft`,`topRight`,`bottomLeft`,`bottomRight`])}function q(e){let t=xn(e);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function J(e,t){e||={},t||=K.font;let n=P(e.size,t.size);typeof n==`string`&&(n=parseInt(n,10));let r=P(e.style,t.style);r&&!(``+r).match(_n)&&(console.warn(`Invalid font style specified: "`+r+`"`),r=void 0);let i={family:P(e.family,t.family),lineHeight:vn(P(e.lineHeight,t.lineHeight),n),size:n,style:r,weight:P(e.weight,t.weight),string:``};return i.string=Qt(i),i}function Cn(e,t,n,r){let i=!0,a,o,s;for(a=0,o=e.length;an&&e===0?0:e+t;return{min:o(r,-Math.abs(a)),max:o(i,a)}}function Tn(e,t){return Object.assign(Object.create(e),t)}function En(e,t=[``],n,r,i=()=>e[0]){let a=n||e;return r===void 0&&(r=Hn(`_fallback`,e)),new Proxy({[Symbol.toStringTag]:`Object`,_cacheable:!0,_scopes:e,_rootScopes:a,_fallback:r,_getTarget:i,override:n=>En([n,...e],t,a,r)},{deleteProperty(t,n){return delete t[n],delete t._keys,delete e[0][n],!0},get(n,r){return jn(n,r,()=>Vn(r,t,e,n))},getOwnPropertyDescriptor(e,t){return Reflect.getOwnPropertyDescriptor(e._scopes[0],t)},getPrototypeOf(){return Reflect.getPrototypeOf(e[0])},has(e,t){return Un(e).includes(t)},ownKeys(e){return Un(e)},set(e,t,n){let r=e._storage||=i();return e[t]=r[t]=n,delete e._keys,!0}})}function Dn(e,t,n,r){let i={_cacheable:!1,_proxy:e,_context:t,_subProxy:n,_stack:new Set,_descriptors:On(e,r),setContext:t=>Dn(e,t,n,r),override:i=>Dn(e.override(i),t,n,r)};return new Proxy(i,{deleteProperty(t,n){return delete t[n],delete e[n],!0},get(e,t,n){return jn(e,t,()=>Mn(e,t,n))},getOwnPropertyDescriptor(t,n){return t._descriptors.allKeys?Reflect.has(e,n)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(e,n)},getPrototypeOf(){return Reflect.getPrototypeOf(e)},has(t,n){return Reflect.has(e,n)},ownKeys(){return Reflect.ownKeys(e)},set(t,n,r){return e[n]=r,delete t[n],!0}})}function On(e,t={scriptable:!0,indexable:!0}){let{_scriptable:n=t.scriptable,_indexable:r=t.indexable,_allKeys:i=t.allKeys}=e;return{allKeys:i,scriptable:n,indexable:r,isScriptable:Ke(n)?n:()=>n,isIndexable:Ke(r)?r:()=>r}}var kn=(e,t)=>e?e+We(t):t,An=(e,t)=>j(t)&&e!==`adapters`&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function jn(e,t,n){if(Object.prototype.hasOwnProperty.call(e,t)||t===`constructor`)return e[t];let r=n();return e[t]=r,r}function Mn(e,t,n){let{_proxy:r,_context:i,_subProxy:a,_descriptors:o}=e,s=r[t];return Ke(s)&&o.isScriptable(t)&&(s=Nn(t,s,e,n)),A(s)&&s.length&&(s=Pn(t,s,e,o.isIndexable)),An(t,s)&&(s=Dn(s,i,a&&a[t],o)),s}function Nn(e,t,n,r){let{_proxy:i,_context:a,_subProxy:o,_stack:s}=n;if(s.has(e))throw Error(`Recursion detected: `+Array.from(s).join(`->`)+`->`+e);s.add(e);let c=t(a,o||r);return s.delete(e),An(e,c)&&(c=Rn(i._scopes,i,e,c)),c}function Pn(e,t,n,r){let{_proxy:i,_context:a,_subProxy:o,_descriptors:s}=n;if(a.index!==void 0&&r(e))return t[a.index%t.length];if(j(t[0])){let n=t,r=i._scopes.filter(e=>e!==n);t=[];for(let c of n){let n=Rn(r,i,e,c);t.push(Dn(n,a,o&&o[e],s))}}return t}function Fn(e,t,n){return Ke(e)?e(t,n):e}var In=(e,t)=>e===!0?t:typeof e==`string`?Ue(t,e):void 0;function Ln(e,t,n,r,i){for(let a of t){let t=In(n,a);if(t){e.add(t);let a=Fn(t._fallback,n,i);if(a!==void 0&&a!==n&&a!==r)return a}else if(t===!1&&r!==void 0&&n!==r)return null}return!1}function Rn(e,t,n,r){let i=t._rootScopes,a=Fn(t._fallback,n,r),o=[...e,...i],s=new Set;s.add(r);let c=zn(s,o,n,a||n,r);return c===null||a!==void 0&&a!==n&&(c=zn(s,o,a,c,r),c===null)?!1:En(Array.from(s),[``],i,a,()=>Bn(t,n,r))}function zn(e,t,n,r,i){for(;n;)n=Ln(e,t,n,r,i);return n}function Bn(e,t,n){let r=e._getTarget();t in r||(r[t]={});let i=r[t];return A(i)&&j(n)?n:i||{}}function Vn(e,t,n,r){let i;for(let a of t)if(i=Hn(kn(a,e),n),i!==void 0)return An(e,i)?Rn(n,r,e,i):i}function Hn(e,t){for(let n of t){if(!n)continue;let t=n[e];if(t!==void 0)return t}}function Un(e){let t=e._keys;return t||=e._keys=Wn(e._scopes),t}function Wn(e){let t=new Set;for(let n of e)for(let e of Object.keys(n).filter(e=>!e.startsWith(`_`)))t.add(e);return Array.from(t)}var Gn=2**-52||1e-14,Kn=(e,t)=>te===`x`?`y`:`x`;function Jn(e,t,n,r){let i=e.skip?t:e,a=t,o=n.skip?t:n,s=dt(a,i),c=dt(o,a),l=s/(s+c),u=c/(s+c);l=isNaN(l)?0:l,u=isNaN(u)?0:u;let d=r*l,f=r*u;return{previous:{x:a.x-d*(o.x-i.x),y:a.y-d*(o.y-i.y)},next:{x:a.x+f*(o.x-i.x),y:a.y+f*(o.y-i.y)}}}function Yn(e,t,n){let r=e.length,i,a,o,s,c,l=Kn(e,0);for(let u=0;u!e.skip)),t.cubicInterpolationMode===`monotone`)Zn(e,i);else{let n=r?e[e.length-1]:e[0];for(a=0,o=e.length;ae.ownerDocument.defaultView.getComputedStyle(e,null);function ar(e,t){return ir(e).getPropertyValue(t)}var or=[`top`,`right`,`bottom`,`left`];function sr(e,t,n){let r={};n=n?`-`+n:``;for(let i=0;i<4;i++){let a=or[i];r[a]=parseFloat(e[t+`-`+a+n])||0}return r.width=r.left+r.right,r.height=r.top+r.bottom,r}var cr=(e,t,n)=>(e>0||t>0)&&(!n||!n.shadowRoot);function lr(e,t){let n=e.touches,r=n&&n.length?n[0]:e,{offsetX:i,offsetY:a}=r,o=!1,s,c;if(cr(i,a,e.target))s=i,c=a;else{let e=t.getBoundingClientRect();s=r.clientX-e.left,c=r.clientY-e.top,o=!0}return{x:s,y:c,box:o}}function ur(e,t){if(`native`in e)return e;let{canvas:n,currentDevicePixelRatio:r}=t,i=ir(n),a=i.boxSizing===`border-box`,o=sr(i,`padding`),s=sr(i,`border`,`width`),{x:c,y:l,box:u}=lr(e,n),d=o.left+(u&&s.left),f=o.top+(u&&s.top),{width:p,height:m}=t;return a&&(p-=o.width+s.width,m-=o.height+s.height),{x:Math.round((c-d)/p*n.width/r),y:Math.round((l-f)/m*n.height/r)}}function dr(e,t,n){let r,i;if(t===void 0||n===void 0){let a=e&&nr(e);if(!a)t=e.clientWidth,n=e.clientHeight;else{let e=a.getBoundingClientRect(),o=ir(a),s=sr(o,`border`,`width`),c=sr(o,`padding`);t=e.width-c.width-s.width,n=e.height-c.height-s.height,r=rr(o.maxWidth,a,`clientWidth`),i=rr(o.maxHeight,a,`clientHeight`)}}return{width:t,height:n,maxWidth:r||Xe,maxHeight:i||Xe}}var fr=e=>Math.round(e*10)/10;function pr(e,t,n,r){let i=ir(e),a=sr(i,`margin`),o=rr(i.maxWidth,e,`clientWidth`)||Xe,s=rr(i.maxHeight,e,`clientHeight`)||Xe,c=dr(e,t,n),{width:l,height:u}=c;if(i.boxSizing===`content-box`){let e=sr(i,`border`,`width`),t=sr(i,`padding`);l-=t.width+e.width,u-=t.height+e.height}return l=Math.max(0,l-a.width),u=Math.max(0,r?l/r:u-a.height),l=fr(Math.min(l,o,c.maxWidth)),u=fr(Math.min(u,s,c.maxHeight)),l&&!u&&(u=fr(l/2)),(t!==void 0||n!==void 0)&&r&&c.height&&u>c.height&&(u=c.height,l=fr(Math.floor(u*r))),{width:l,height:u}}function mr(e,t,n){let r=t||1,i=fr(e.height*r),a=fr(e.width*r);e.height=fr(e.height),e.width=fr(e.width);let o=e.canvas;return o.style&&(n||!o.style.height&&!o.style.width)&&(o.style.height=`${e.height}px`,o.style.width=`${e.width}px`),e.currentDevicePixelRatio!==r||o.height!==i||o.width!==a?(e.currentDevicePixelRatio=r,o.height=i,o.width=a,e.ctx.setTransform(r,0,0,r,0,0),!0):!1}var hr=function(){let e=!1;try{let t={get passive(){return e=!0,!1}};tr()&&(window.addEventListener(`test`,null,t),window.removeEventListener(`test`,null,t))}catch{}return e}();function gr(e,t){let n=ar(e,t),r=n&&n.match(/^(\d+)(\.\d+)?px$/);return r?+r[1]:void 0}function _r(e,t,n,r){return{x:e.x+n*(t.x-e.x),y:e.y+n*(t.y-e.y)}}function vr(e,t,n,r){return{x:e.x+n*(t.x-e.x),y:r===`middle`?n<.5?e.y:t.y:r===`after`?n<1?e.y:t.y:n>0?t.y:e.y}}function yr(e,t,n,r){let i={x:e.cp2x,y:e.cp2y},a={x:t.cp1x,y:t.cp1y},o=_r(e,i,n),s=_r(i,a,n),c=_r(a,t,n);return _r(_r(o,s,n),_r(s,c,n),n)}var br=function(e,t){return{x(n){return e+e+t-n},setWidth(e){t=e},textAlign(e){return e===`center`?e:e===`right`?`left`:`right`},xPlus(e,t){return e-t},leftForLtr(e,t){return e-t}}},xr=function(){return{x(e){return e},setWidth(e){},textAlign(e){return e},xPlus(e,t){return e+t},leftForLtr(e,t){return e}}};function Sr(e,t,n){return e?br(t,n):xr()}function Cr(e,t){let n,r;(t===`ltr`||t===`rtl`)&&(n=e.canvas.style,r=[n.getPropertyValue(`direction`),n.getPropertyPriority(`direction`)],n.setProperty(`direction`,t,`important`),e.prevTextDirection=r)}function wr(e,t){t!==void 0&&(delete e.prevTextDirection,e.canvas.style.setProperty(`direction`,t[0],t[1]))}function Tr(e){return e===`angle`?{between:pt,compare:ft,normalize:H}:{between:W,compare:(e,t)=>e-t,normalize:e=>e}}function Er({start:e,end:t,count:n,loop:r,style:i}){return{start:e%n,end:t%n,loop:r&&(t-e+1)%n===0,style:i}}function Dr(e,t,n){let{property:r,start:i,end:a}=n,{between:o,normalize:s}=Tr(r),c=t.length,{start:l,end:u,loop:d}=e,f,p;if(d){for(l+=c,u+=c,f=0,p=c;fc(i,y,_)&&s(i,y)!==0,x=()=>s(a,_)===0||c(a,y,_),S=()=>h||b(),C=()=>!h||x();for(let e=u,n=u;e<=d;++e)v=t[e%o],!v.skip&&(_=l(v[r]),_!==y&&(h=c(_,i,a),g===null&&S()&&(g=s(_,i)===0?e:n),g!==null&&C()&&(m.push(Er({start:g,end:e,loop:f,count:o,style:p})),g=null),n=e,y=_));return g!==null&&m.push(Er({start:g,end:d,loop:f,count:o,style:p})),m}function kr(e,t){let n=[],r=e.segments;for(let i=0;ii&&e[a%t].skip;)a--;return a%=t,{start:i,end:a}}function jr(e,t,n,r){let i=e.length,a=[],o=t,s=e[t],c;for(c=t+1;c<=n;++c){let n=e[c%i];n.skip||n.stop?s.skip||(r=!1,a.push({start:t%i,end:(c-1)%i,loop:r}),t=o=n.stop?c:null):(o=c,s.skip&&(t=c)),s=n}return o!==null&&a.push({start:t%i,end:o%i,loop:r}),a}function Mr(e,t){let n=e.points,r=e.options.spanGaps,i=n.length;if(!i)return[];let a=!!e._loop,{start:o,end:s}=Ar(n,i,a,r);return r===!0?Nr(e,[{start:o,end:s,loop:a}],n,t):Nr(e,jr(n,o,sr({chart:e,initial:t.initial,numSteps:a,currentStep:Math.min(n-t.start,a)}))}_refresh(){this._request||=(this._running=!0,Ct.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(e=Date.now()){let t=0;this._charts.forEach((n,r)=>{if(!n.running||!n.items.length)return;let i=n.items,a=i.length-1,o=!1,s;for(;a>=0;--a)s=i[a],s._active?(s._total>n.duration&&(n.duration=s._total),s.tick(e),o=!0):(i[a]=i[i.length-1],i.pop());o&&(r.draw(),this._notify(r,n,e,`progress`)),i.length||(n.running=!1,this._notify(r,n,e,`complete`),n.initial=!1),t+=i.length}),this._lastDate=e,t===0&&(this._running=!1)}_getAnims(e){let t=this._charts,n=t.get(e);return n||(n={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},t.set(e,n)),n}listen(e,t,n){this._getAnims(e).listeners[t].push(n)}add(e,t){!t||!t.length||this._getAnims(e).items.push(...t)}has(e){return this._getAnims(e).items.length>0}start(e){let t=this._charts.get(e);t&&(t.running=!0,t.start=Date.now(),t.duration=t.items.reduce((e,t)=>Math.max(e,t._duration),0),this._refresh())}running(e){if(!this._running)return!1;let t=this._charts.get(e);return!(!t||!t.running||!t.items.length)}stop(e){let t=this._charts.get(e);if(!t||!t.items.length)return;let n=t.items,r=n.length-1;for(;r>=0;--r)n[r].cancel();t.items=[],this._notify(e,t,Date.now(),`complete`)}remove(e){return this._charts.delete(e)}},Vr=`transparent`,Hr={boolean(e,t,n){return n>.5?t:e},color(e,t,n){let r=Ft(e||Vr),i=r.valid&&Ft(t||Vr);return i&&i.valid?i.mix(r,n).hexString():t},number(e,t,n){return e+(t-e)*n}},Ur=class{constructor(e,t,n,r){let i=t[n];r=Cn([e.to,r,i,e.from]);let a=Cn([e.from,i,r]);this._active=!0,this._fn=e.fn||Hr[e.type||typeof a],this._easing=Nt[e.easing]||Nt.linear,this._start=Math.floor(Date.now()+(e.delay||0)),this._duration=this._total=Math.floor(e.duration),this._loop=!!e.loop,this._target=t,this._prop=n,this._from=a,this._to=r,this._promises=void 0}active(){return this._active}update(e,t,n){if(this._active){this._notify(!1);let r=this._target[this._prop],i=n-this._start,a=this._duration-i;this._start=n,this._duration=Math.floor(Math.max(a,e.duration)),this._total+=i,this._loop=!!e.loop,this._to=Cn([e.to,t,r,e.from]),this._from=Cn([e.from,r,t])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(e){let t=e-this._start,n=this._duration,r=this._prop,i=this._from,a=this._loop,o=this._to,s;if(this._active=i!==o&&(a||t1?2-s:s,s=this._easing(Math.min(1,Math.max(0,s))),this._target[r]=this._fn(i,o,s)}wait(){let e=this._promises||=[];return new Promise((t,n)=>{e.push({res:t,rej:n})})}_notify(e){let t=e?`res`:`rej`,n=this._promises||[];for(let e=0;e{let i=e[r];if(!j(i))return;let a={};for(let e of t)a[e]=i[e];(A(i.properties)&&i.properties||[r]).forEach(e=>{(e===r||!n.has(e))&&n.set(e,a)})})}_animateOptions(e,t){let n=t.options,r=Kr(e,n);if(!r)return[];let i=this._createAnimations(r,n);return n.$shared&&Gr(e.options.$animations,n).then(()=>{e.options=n},()=>{}),i}_createAnimations(e,t){let n=this._properties,r=[],i=e.$animations||={},a=Object.keys(t),o=Date.now(),s;for(s=a.length-1;s>=0;--s){let c=a[s];if(c.charAt(0)===`$`)continue;if(c===`options`){r.push(...this._animateOptions(e,t));continue}let l=t[c],u=i[c],d=n.get(c);if(u)if(d&&u.active()){u.update(d,l,o);continue}else u.cancel();if(!d||!d.duration){e[c]=l;continue}i[c]=u=new Ur(d,e,c,l),r.push(u)}return r}update(e,t){if(this._properties.size===0){Object.assign(e,t);return}let n=this._createAnimations(e,t);if(n.length)return Br.add(this._chart,n),!0}};function Gr(e,t){let n=[],r=Object.keys(t);for(let t=0;t0||!n&&t<0)return i.index}return null}function ii(e,t){let{chart:n,_cachedMeta:r}=e,i=n._stacks||={},{iScale:a,vScale:o,index:s}=r,c=a.axis,l=o.axis,u=ei(a,o,r),d=t.length,f;for(let e=0;en[e].axis===t).shift()}function oi(e,t){return Tn(e,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:`default`,type:`dataset`})}function si(e,t,n){return Tn(e,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:n,index:t,mode:`default`,type:`data`})}function ci(e,t){let n=e.controller.index,r=e.vScale&&e.vScale.axis;if(r){t||=e._parsed;for(let e of t){let t=e._stacks;if(!t||t[r]===void 0||t[r][n]===void 0)return;delete t[r][n],t[r]._visualValues!==void 0&&t[r]._visualValues[n]!==void 0&&delete t[r]._visualValues[n]}}}var li=e=>e===`reset`||e===`none`,ui=(e,t)=>t?e:Object.assign({},e),di=(e,t,n)=>e&&!t.hidden&&t._stacked&&{keys:Xr(n,!0),values:null},fi=class{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(e,t){this.chart=e,this._ctx=e.ctx,this.index=t,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){let e=this._cachedMeta;this.configure(),this.linkScales(),e._stacked=$r(e.vScale,e),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled(`filler`)&&console.warn(`Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options`)}updateIndex(e){this.index!==e&&ci(this._cachedMeta),this.index=e}linkScales(){let e=this.chart,t=this._cachedMeta,n=this.getDataset(),r=(e,t,n,r)=>e===`x`?t:e===`r`?r:n,i=t.xAxisID=P(n.xAxisID,ai(e,`x`)),a=t.yAxisID=P(n.yAxisID,ai(e,`y`)),o=t.rAxisID=P(n.rAxisID,ai(e,`r`)),s=t.indexAxis,c=t.iAxisID=r(s,i,a,o),l=t.vAxisID=r(s,a,i,o);t.xScale=this.getScaleForId(i),t.yScale=this.getScaleForId(a),t.rScale=this.getScaleForId(o),t.iScale=this.getScaleForId(c),t.vScale=this.getScaleForId(l)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(e){return this.chart.scales[e]}_getOtherScale(e){let t=this._cachedMeta;return e===t.iScale?t.vScale:t.iScale}reset(){this._update(`reset`)}_destroy(){let e=this._cachedMeta;this._data&&xt(this._data,this),e._stacked&&ci(e)}_dataCheck(){let e=this.getDataset(),t=e.data||=[],n=this._data;if(j(t)){let e=this._cachedMeta;this._data=Qr(t,e)}else if(n!==t){if(n){xt(n,this);let e=this._cachedMeta;ci(e),e._parsed=[]}t&&Object.isExtensible(t)&&bt(t,this),this._syncList=[],this._data=t}}addElements(){let e=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(e.dataset=new this.datasetElementType)}buildOrUpdateElements(e){let t=this._cachedMeta,n=this.getDataset(),r=!1;this._dataCheck();let i=t._stacked;t._stacked=$r(t.vScale,t),t.stack!==n.stack&&(r=!0,ci(t),t.stack=n.stack),this._resyncElements(e),(r||i!==t._stacked)&&(ii(this,t._parsed),t._stacked=$r(t.vScale,t))}configure(){let e=this.chart.config,t=e.datasetScopeKeys(this._type),n=e.getOptionScopes(this.getDataset(),t,!0);this.options=e.createResolver(n,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(e,t){let{_cachedMeta:n,_data:r}=this,{iScale:i,_stacked:a}=n,o=i.axis,s=e===0&&t===r.length?!0:n._sorted,c=e>0&&n._parsed[e-1],l,u,d;if(this._parsing===!1)n._parsed=r,n._sorted=!0,d=r;else{d=A(r[e])?this.parseArrayData(n,r,e,t):j(r[e])?this.parseObjectData(n,r,e,t):this.parsePrimitiveData(n,r,e,t);let i=()=>u[o]===null||c&&u[o]t||u=0;--d)if(!p()){this.updateRangeFromParsed(c,e,f,s);break}}return c}getAllParsedValues(e){let t=this._cachedMeta._parsed,n=[],r,i,a;for(r=0,i=t.length;r=0&&ethis.getContext(n,r,t),u);return p.$shared&&(p.$shared=s,i[a]=Object.freeze(ui(p,s))),p}_resolveAnimations(e,t,n){let r=this.chart,i=this._cachedDataOpts,a=`animation-${t}`,o=i[a];if(o)return o;let s;if(r.options.animation!==!1){let r=this.chart.config,i=r.datasetAnimationScopeKeys(this._type,t),a=r.getOptionScopes(this.getDataset(),i);s=r.createResolver(a,this.getContext(e,n,t))}let c=new Wr(r,s&&s.animations);return s&&s._cacheable&&(i[a]=Object.freeze(c)),c}getSharedOptions(e){if(e.$shared)return this._sharedOptions||=Object.assign({},e)}includeOptions(e,t){return!t||li(e)||this.chart._animationsDisabled}_getSharedOptions(e,t){let n=this.resolveDataElementOptions(e,t),r=this._sharedOptions,i=this.getSharedOptions(n),a=this.includeOptions(t,i)||i!==r;return this.updateSharedOptions(i,t,n),{sharedOptions:i,includeOptions:a}}updateElement(e,t,n,r){li(r)?Object.assign(e,n):this._resolveAnimations(t,r).update(e,n)}updateSharedOptions(e,t,n){e&&!li(t)&&this._resolveAnimations(void 0,t).update(e,n)}_setStyle(e,t,n,r){e.active=r;let i=this.getStyle(t,r);this._resolveAnimations(t,n,r).update(e,{options:!r&&this.getSharedOptions(i)||i})}removeHoverStyle(e,t,n){this._setStyle(e,n,`active`,!1)}setHoverStyle(e,t,n){this._setStyle(e,n,`active`,!0)}_removeDatasetHoverStyle(){let e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,`active`,!1)}_setDatasetHoverStyle(){let e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,`active`,!0)}_resyncElements(e){let t=this._data,n=this._cachedMeta.data;for(let[e,t,n]of this._syncList)this[e](t,n);this._syncList=[];let r=n.length,i=t.length,a=Math.min(i,r);a&&this.parse(0,a),i>r?this._insertElements(r,i-r,e):i{for(e.length+=t,o=e.length-1;o>=a;o--)e[o]=e[o-t]};for(s(i),o=e;oe-t))}return e._cache.$bar}function mi(e){let t=e.iScale,n=pi(t,e.type),r=t._length,i,a,o,s,c=()=>{o===32767||o===-32768||(Ge(s)&&(r=Math.min(r,Math.abs(o-s)||r)),s=o)};for(i=0,a=n.length;i0?i[e-1]:null,s=eMath.abs(s)&&(c=s,l=o),t[n.axis]=l,t._custom={barStart:c,barEnd:l,start:i,end:a,min:o,max:s}}function vi(e,t,n,r){return A(e)?_i(e,t,n,r):t[n.axis]=n.parse(e,r),t}function yi(e,t,n,r){let i=e.iScale,a=e.vScale,o=i.getLabels(),s=i===a,c=[],l,u,d,f;for(l=n,u=n+r;l=n?1:-1):B(e)}function Si(e){let t,n,r,i,a;return e.horizontal?(t=e.base>e.x,n=`left`,r=`right`):(t=e.basee.controller.options.grouped),i=n.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(t),s=o&&o[n.axis],c=e=>{let t=e._parsed.find(e=>e[n.axis]===s),r=t&&t[e.vScale.axis];if(k(r)||isNaN(r))return!0};for(let n of r)if(!(t!==void 0&&c(n))&&((i===!1||a.indexOf(n.stack)===-1||i===void 0&&n.stack===void 0)&&a.push(n.stack),n.index===e))break;return a.length||a.push(void 0),a}_getStackCount(e){return this._getStacks(void 0,e).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){let e=this.chart.scales,t=this.chart.options.indexAxis;return Object.keys(e).filter(n=>e[n].axis===t).shift()}_getAxis(){let e={},t=this.getFirstScaleIdForIndexAxis();for(let n of this.chart.data.datasets)e[P(this.chart.options.indexAxis===`x`?n.xAxisID:n.yAxisID,t)]=!0;return Object.keys(e)}_getStackIndex(e,t,n){let r=this._getStacks(e,n),i=t===void 0?-1:r.indexOf(t);return i===-1?r.length-1:i}_getRuler(){let e=this.options,t=this._cachedMeta,n=t.iScale,r=[],i,a;for(i=0,a=t.data.length;ipt(e,s,c,!0)?1:Math.max(t,t*n,r,r*n),m=(e,t,r)=>pt(e,s,c,!0)?-1:Math.min(t,t*n,r,r*n),h=p(0,l,d),g=p(z,u,f),_=m(L,l,d),v=m(L+z,u,f);r=(h-_)/2,i=(g-v)/2,a=-(h+_)/2,o=-(g+v)/2}return{ratioX:r,ratioY:i,offsetX:a,offsetY:o}}var Ai=class extends fi{static id=`doughnut`;static defaults={datasetElementType:!1,dataElementType:`arc`,animation:{animateRotate:!0,animateScale:!1},animations:{numbers:{type:`number`,properties:[`circumference`,`endAngle`,`innerRadius`,`outerRadius`,`startAngle`,`x`,`y`,`offset`,`borderWidth`,`spacing`]}},cutout:`50%`,rotation:0,circumference:360,radius:`100%`,spacing:0,indexAxis:`r`};static descriptors={_scriptable:e=>e!==`spacing`,_indexable:e=>e!==`spacing`&&!e.startsWith(`borderDash`)&&!e.startsWith(`hoverBorderDash`)};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){let t=e.data,{labels:{pointStyle:n,textAlign:r,color:i,useBorderRadius:a,borderRadius:o}}=e.legend.options;return t.labels.length&&t.datasets.length?t.labels.map((t,s)=>{let c=e.getDatasetMeta(0).controller.getStyle(s);return{text:t,fillStyle:c.backgroundColor,fontColor:i,hidden:!e.getDataVisibility(s),lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:c.borderWidth,strokeStyle:c.borderColor,textAlign:r,pointStyle:n,borderRadius:a&&(o||c.borderRadius),index:s}}):[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}}};constructor(e,t){super(e,t),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(e,t){let n=this.getDataset().data,r=this._cachedMeta;if(this._parsing===!1)r._parsed=n;else{let i=e=>+n[e];if(j(n[e])){let{key:e=`value`}=this._parsing;i=t=>+Ue(n[t],e)}let a,o;for(a=e,o=e+t;a0&&!isNaN(e)?Math.abs(e)/t*R:0}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart,r=n.data.labels||[],i=Ut(t._parsed[e],n.options.locale);return{label:r[e]||``,value:i}}getMaxBorderWidth(e){let t=0,n=this.chart,r,i,a,o,s;if(!e){for(r=0,i=n.data.datasets.length;r0&&this.getParsed(t-1);for(let n=0;n=_){v.skip=!0;continue}let b=this.getParsed(n),x=k(b[f]),S=v[d]=a.getPixelForValue(b[d],n),C=v[f]=i||x?o.getBasePixel():o.getPixelForValue(s?this.applyStack(o,b,s):b[f],n);v.skip=isNaN(S)||isNaN(C)||x,v.stop=n>0&&Math.abs(b[d]-y[d])>h,m&&(v.parsed=b,v.raw=c.data[n]),u&&(v.options=l||this.resolveDataElementOptions(n,p.active?`active`:r)),g||this.updateElement(p,n,v,r),y=b}}getMaxOverflow(){let e=this._cachedMeta,t=e.dataset,n=t.options&&t.options.borderWidth||0,r=e.data||[];if(!r.length)return n;let i=r[0].size(this.resolveDataElementOptions(0)),a=r[r.length-1].size(this.resolveDataElementOptions(r.length-1));return Math.max(n,i,a)/2}draw(){let e=this._cachedMeta;e.dataset.updateControlPoints(this.chart.chartArea,e.iScale.axis),super.draw()}},Mi=class extends fi{static id=`scatter`;static defaults={datasetElementType:!1,dataElementType:`point`,showLine:!1,fill:!1};static overrides={interaction:{mode:`point`},scales:{x:{type:`linear`},y:{type:`linear`}}};getLabelAndValue(e){let t=this._cachedMeta,n=this.chart.data.labels||[],{xScale:r,yScale:i}=t,a=this.getParsed(e),o=r.getLabelForValue(a.x),s=i.getLabelForValue(a.y);return{label:n[e]||``,value:`(`+o+`, `+s+`)`}}update(e){let t=this._cachedMeta,{data:n=[]}=t,r=this.chart._animationsDisabled,{start:i,count:a}=Ot(t,n,r);if(this._drawStart=i,this._drawCount=a,kt(t)&&(i=0,a=n.length),this.options.showLine){this.datasetElementType||this.addElements();let{dataset:i,_dataset:a}=t;i._chart=this.chart,i._datasetIndex=this.index,i._decimated=!!a._decimated,i.points=n;let o=this.resolveDatasetElementOptions(e);o.segment=this.options.segment,this.updateElement(i,void 0,{animated:!r,options:o},e)}else this.datasetElementType&&=(delete t.dataset,!1);this.updateElements(n,i,a,e)}addElements(){let{showLine:e}=this.options;!this.datasetElementType&&e&&(this.datasetElementType=this.chart.registry.getElement(`line`)),super.addElements()}updateElements(e,t,n,r){let i=r===`reset`,{iScale:a,vScale:o,_stacked:s,_dataset:c}=this._cachedMeta,l=this.resolveDataElementOptions(t,r),u=this.getSharedOptions(l),d=this.includeOptions(r,u),f=a.axis,p=o.axis,{spanGaps:m,segment:h}=this.options,g=at(m)?m:1/0,_=this.chart._animationsDisabled||i||r===`none`,v=t>0&&this.getParsed(t-1);for(let l=t;l0&&Math.abs(n[f]-v[f])>g,h&&(m.parsed=n,m.raw=c.data[l]),d&&(m.options=u||this.resolveDataElementOptions(l,t.active?`active`:r)),_||this.updateElement(t,l,m,r),v=n}this.updateSharedOptions(u,r,l)}getMaxOverflow(){let e=this._cachedMeta,t=e.data||[];if(!this.options.showLine){let e=0;for(let n=t.length-1;n>=0;--n)e=Math.max(e,t[n].size(this.resolveDataElementOptions(n))/2);return e>0&&e}let n=e.dataset,r=n.options&&n.options.borderWidth||0;if(!t.length)return r;let i=t[0].size(this.resolveDataElementOptions(0)),a=t[t.length-1].size(this.resolveDataElementOptions(t.length-1));return Math.max(r,i,a)/2}};function Ni(){throw Error(`This method is not implemented: Check that a complete date adapter is provided.`)}var Pi={_date:class e{static override(t){Object.assign(e.prototype,t)}options;constructor(e){this.options=e||{}}init(){}formats(){return Ni()}parse(){return Ni()}format(){return Ni()}add(){return Ni()}diff(){return Ni()}startOf(){return Ni()}endOf(){return Ni()}}};function Fi(e,t,n,r){let{controller:i,data:a,_sorted:o}=e,s=i._cachedMeta.iScale,c=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null;if(s&&t===s.axis&&t!==`r`&&o&&a.length){let o=s._reversePixels?_t:gt;if(!r){let r=o(a,t,n);if(c){let{vScale:t}=i._cachedMeta,{_parsed:n}=e,a=n.slice(0,r.lo+1).reverse().findIndex(e=>!k(e[t.axis]));r.lo-=Math.max(0,a);let o=n.slice(r.hi).findIndex(e=>!k(e[t.axis]));r.hi+=Math.max(0,o)}return r}else if(i._sharedOptions){let e=a[0],r=typeof e.getRange==`function`&&e.getRange(t);if(r){let e=o(a,t,n-r),i=o(a,t,n+r);return{lo:e.lo,hi:i.hi}}}}return{lo:0,hi:a.length-1}}function Ii(e,t,n,r,i){let a=e.getSortedVisibleDatasetMetas(),o=n[t];for(let e=0,n=a.length;e{e[o]&&e[o](t[n],i)&&(a.push({element:e,datasetIndex:r,index:c}),s||=e.inRange(t.x,t.y,i))}),r&&!s?[]:a}var Ui={evaluateInteractionItems:Ii,modes:{index(e,t,n,r){let i=ur(t,e),a=n.axis||`x`,o=n.includeInvisible||!1,s=n.intersect?Ri(e,i,a,r,o):Vi(e,i,a,!1,r,o),c=[];return s.length?(e.getSortedVisibleDatasetMetas().forEach(e=>{let t=s[0].index,n=e.data[t];n&&!n.skip&&c.push({element:n,datasetIndex:e.index,index:t})}),c):[]},dataset(e,t,n,r){let i=ur(t,e),a=n.axis||`xy`,o=n.includeInvisible||!1,s=n.intersect?Ri(e,i,a,r,o):Vi(e,i,a,!1,r,o);if(s.length>0){let t=s[0].datasetIndex,n=e.getDatasetMeta(t).data;s=[];for(let e=0;ee.pos===t)}function Ki(e,t){return e.filter(e=>Wi.indexOf(e.pos)===-1&&e.box.axis===t)}function qi(e,t){return e.sort((e,n)=>{let r=t?n:e,i=t?e:n;return r.weight===i.weight?r.index-i.index:r.weight-i.weight})}function Ji(e){let t=[],n,r,i,a,o,s;for(n=0,r=(e||[]).length;ne.box.fullSize),!0),r=qi(Gi(t,`left`),!0),i=qi(Gi(t,`right`)),a=qi(Gi(t,`top`),!0),o=qi(Gi(t,`bottom`)),s=Ki(t,`x`),c=Ki(t,`y`);return{fullSize:n,leftAndTop:r.concat(a),rightAndBottom:i.concat(c).concat(o).concat(s),chartArea:Gi(t,`chartArea`),vertical:r.concat(i).concat(c),horizontal:a.concat(o).concat(s)}}function Qi(e,t,n,r){return Math.max(e[n],t[n])+Math.max(e[r],t[r])}function $i(e,t){e.top=Math.max(e.top,t.top),e.left=Math.max(e.left,t.left),e.bottom=Math.max(e.bottom,t.bottom),e.right=Math.max(e.right,t.right)}function ea(e,t,n,r){let{pos:i,box:a}=n,o=e.maxPadding;if(!j(i)){n.size&&(e[i]-=n.size);let t=r[n.stack]||{size:0,count:1};t.size=Math.max(t.size,n.horizontal?a.height:a.width),n.size=t.size/t.count,e[i]+=n.size}a.getPadding&&$i(o,a.getPadding());let s=Math.max(0,t.outerWidth-Qi(o,e,`left`,`right`)),c=Math.max(0,t.outerHeight-Qi(o,e,`top`,`bottom`)),l=s!==e.w,u=c!==e.h;return e.w=s,e.h=c,n.horizontal?{same:l,other:u}:{same:u,other:l}}function ta(e){let t=e.maxPadding;function n(n){let r=Math.max(t[n]-e[n],0);return e[n]+=r,r}e.y+=n(`top`),e.x+=n(`left`),n(`right`),n(`bottom`)}function na(e,t){let n=t.maxPadding;function r(e){let r={left:0,top:0,right:0,bottom:0};return e.forEach(e=>{r[e]=Math.max(t[e],n[e])}),r}return r(e?[`left`,`right`]:[`top`,`bottom`])}function ra(e,t,n,r){let i=[],a,o,s,c,l,u;for(a=0,o=e.length,l=0;a{typeof e.beforeLayout==`function`&&e.beforeLayout()});let u=c.reduce((e,t)=>t.box.options&&t.box.options.display===!1?e:e+1,0)||1,d=Object.freeze({outerWidth:t,outerHeight:n,padding:i,availableWidth:a,availableHeight:o,vBoxMaxWidth:a/2/u,hBoxMaxHeight:o/2}),f=Object.assign({},i);$i(f,q(r));let p=Object.assign({maxPadding:f,w:a,h:o,x:i.left,y:i.top},i),m=Xi(c.concat(l),d);ra(s.fullSize,p,d,m),ra(c,p,d,m),ra(l,p,d,m)&&ra(c,p,d,m),ta(p),aa(s.leftAndTop,p,d,m),p.x+=p.w,p.y+=p.h,aa(s.rightAndBottom,p,d,m),e.chartArea={left:p.left,top:p.top,right:p.left+p.w,bottom:p.top+p.h,height:p.h,width:p.w},I(s.chartArea,t=>{let n=t.box;Object.assign(n,e.chartArea),n.update(p.w,p.h,{left:0,top:0,right:0,bottom:0})})}},oa=class{acquireContext(e,t){}releaseContext(e){return!1}addEventListener(e,t,n){}removeEventListener(e,t,n){}getDevicePixelRatio(){return 1}getMaximumSize(e,t,n,r){return t=Math.max(0,t||e.width),n||=e.height,{width:t,height:Math.max(0,r?Math.floor(t/r):n)}}isAttached(e){return!0}updateConfig(e){}},sa=class extends oa{acquireContext(e){return e&&e.getContext&&e.getContext(`2d`)||null}updateConfig(e){e.options.animation=!1}},ca=`$chartjs`,la={touchstart:`mousedown`,touchmove:`mousemove`,touchend:`mouseup`,pointerenter:`mouseenter`,pointerdown:`mousedown`,pointermove:`mousemove`,pointerup:`mouseup`,pointerleave:`mouseout`,pointerout:`mouseout`},ua=e=>e===null||e===``;function da(e,t){let n=e.style,r=e.getAttribute(`height`),i=e.getAttribute(`width`);if(e[ca]={initial:{height:r,width:i,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||`block`,n.boxSizing=n.boxSizing||`border-box`,ua(i)){let t=gr(e,`width`);t!==void 0&&(e.width=t)}if(ua(r))if(e.style.height===``)e.height=e.width/(t||2);else{let t=gr(e,`height`);t!==void 0&&(e.height=t)}return e}var fa=hr?{passive:!0}:!1;function pa(e,t,n){e&&e.addEventListener(t,n,fa)}function ma(e,t,n){e&&e.canvas&&e.canvas.removeEventListener(t,n,fa)}function ha(e,t){let n=la[e.type]||e.type,{x:r,y:i}=ur(e,t);return{type:n,chart:t,native:e,x:r===void 0?null:r,y:i===void 0?null:i}}function ga(e,t){for(let n of e)if(n===t||n.contains(t))return!0}function _a(e,t,n){let r=e.canvas,i=new MutationObserver(e=>{let t=!1;for(let n of e)t||=ga(n.addedNodes,r),t&&=!ga(n.removedNodes,r);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}function va(e,t,n){let r=e.canvas,i=new MutationObserver(e=>{let t=!1;for(let n of e)t||=ga(n.removedNodes,r),t&&=!ga(n.addedNodes,r);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}var ya=new Map,ba=0;function xa(){let e=window.devicePixelRatio;e!==ba&&(ba=e,ya.forEach((t,n)=>{n.currentDevicePixelRatio!==e&&t()}))}function Sa(e,t){ya.size||window.addEventListener(`resize`,xa),ya.set(e,t)}function Ca(e){ya.delete(e),ya.size||window.removeEventListener(`resize`,xa)}function wa(e,t,n){let r=e.canvas,i=r&&nr(r);if(!i)return;let a=wt((e,t)=>{let r=i.clientWidth;n(e,t),r{let t=e[0],n=t.contentRect.width,r=t.contentRect.height;n===0&&r===0||a(n,r)});return o.observe(i),Sa(e,a),o}function Ta(e,t,n){n&&n.disconnect(),t===`resize`&&Ca(e)}function Ea(e,t,n){let r=e.canvas,i=wt(t=>{e.ctx!==null&&n(ha(t,e))},e);return pa(r,t,i),i}var Da=class extends oa{acquireContext(e,t){let n=e&&e.getContext&&e.getContext(`2d`);return n&&n.canvas===e?(da(e,t),n):null}releaseContext(e){let t=e.canvas;if(!t[ca])return!1;let n=t[ca].initial;[`height`,`width`].forEach(e=>{let r=n[e];k(r)?t.removeAttribute(e):t.setAttribute(e,r)});let r=n.style||{};return Object.keys(r).forEach(e=>{t.style[e]=r[e]}),t.width=t.width,delete t[ca],!0}addEventListener(e,t,n){this.removeEventListener(e,t);let r=e.$proxies||={};r[t]=({attach:_a,detach:va,resize:wa}[t]||Ea)(e,t,n)}removeEventListener(e,t){let n=e.$proxies||={},r=n[t];r&&(({attach:Ta,detach:Ta,resize:Ta}[t]||ma)(e,t,r),n[t]=void 0)}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(e,t,n,r){return pr(e,t,n,r)}isAttached(e){let t=e&&nr(e);return!!(t&&t.isConnected)}};function Oa(e){return!tr()||typeof OffscreenCanvas<`u`&&e instanceof OffscreenCanvas?sa:Da}var ka=class{static defaults={};static defaultRoutes=void 0;x;y;active=!1;options;$animations;tooltipPosition(e){let{x:t,y:n}=this.getProps([`x`,`y`],e);return{x:t,y:n}}hasValue(){return at(this.x)&&at(this.y)}getProps(e,t){let n=this.$animations;if(!t||!n)return this;let r={};return e.forEach(e=>{r[e]=n[e]&&n[e].active()?n[e]._to:this[e]}),r}};function Aa(e,t){let n=e.options.ticks,r=ja(e),i=Math.min(n.maxTicksLimit||r,r),a=n.major.enabled?Na(t):[],o=a.length,s=a[0],c=a[o-1],l=[];if(o>i)return Pa(t,l,a,o/i),l;let u=Ma(a,t,i);if(o>0){let e,n,r=o>1?Math.round((c-s)/(o-1)):null;for(Fa(t,l,u,k(r)?0:s-r,s),e=0,n=o-1;ei)return t}return Math.max(i,1)}function Na(e){let t=[],n,r;for(n=0,r=e.length;ne===`left`?`right`:e===`right`?`left`:e,Ra=(e,t,n)=>t===`top`||t===`left`?e[t]+n:e[t]-n,za=(e,t)=>Math.min(t||e,e);function Ba(e,t){let n=[],r=e.length/t,i=e.length,a=0;for(;ao+s)))return c}function Ha(e,t){I(e,e=>{let n=e.gc,r=n.length/2,i;if(r>t){for(i=0;in?n:t,n=r&&t>n?t:n,{min:N(t,N(n,t)),max:N(n,N(t,n))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){let e=this.chart.data;return this.options.labels||(this.isHorizontal()?e.xLabels:e.yLabels)||e.labels||[]}getLabelItems(e=this.chart.chartArea){return this._labelItems||=this._computeLabelItems(e)}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){F(this.options.beforeUpdate,[this])}update(e,t,n){let{beginAtZero:r,grace:i,ticks:a}=this.options,o=a.sampleSize;this.beforeUpdate(),this.maxWidth=e,this.maxHeight=t,this._margins=n=Object.assign({left:0,right:0,top:0,bottom:0},n),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+n.left+n.right:this.height+n.top+n.bottom,this._dataLimitsCached||=(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=wn(this,i,r),!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();let s=o=i||n<=1||!this.isHorizontal()){this.labelRotation=r;return}let l=this._getLabelSizes(),u=l.widest.width,d=l.highest.height,f=U(this.chart.width-u,0,this.maxWidth);o=e.offset?this.maxWidth/n:f/(n-1),u+6>o&&(o=f/(n-(e.offset?.5:1)),s=this.maxHeight-Ua(e.grid)-t.padding-Wa(e.title,this.chart.options.font),c=Math.sqrt(u*u+d*d),a=ct(Math.min(Math.asin(U((l.highest.height+6)/o,-1,1)),Math.asin(U(s/c,-1,1))-Math.asin(U(d/c,-1,1)))),a=Math.max(r,Math.min(i,a))),this.labelRotation=a}afterCalculateLabelRotation(){F(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){F(this.options.beforeFit,[this])}fit(){let e={width:0,height:0},{chart:t,options:{ticks:n,title:r,grid:i}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){let a=Wa(r,t.options.font);if(o?(e.width=this.maxWidth,e.height=Ua(i)+a):(e.height=this.maxHeight,e.width=Ua(i)+a),n.display&&this.ticks.length){let{first:t,last:r,widest:i,highest:a}=this._getLabelSizes(),s=n.padding*2,c=V(this.labelRotation),l=Math.cos(c),u=Math.sin(c);if(o){let t=n.mirror?0:u*i.width+l*a.height;e.height=Math.min(this.maxHeight,e.height+t+s)}else{let t=n.mirror?0:l*i.width+u*a.height;e.width=Math.min(this.maxWidth,e.width+t+s)}this._calculatePadding(t,r,u,l)}}this._handleMargins(),o?(this.width=this._length=t.width-this._margins.left-this._margins.right,this.height=e.height):(this.width=e.width,this.height=this._length=t.height-this._margins.top-this._margins.bottom)}_calculatePadding(e,t,n,r){let{ticks:{align:i,padding:a},position:o}=this.options,s=this.labelRotation!==0,c=o!==`top`&&this.axis===`x`;if(this.isHorizontal()){let o=this.getPixelForTick(0)-this.left,l=this.right-this.getPixelForTick(this.ticks.length-1),u=0,d=0;s?c?(u=r*e.width,d=n*t.height):(u=n*e.height,d=r*t.width):i===`start`?d=t.width:i===`end`?u=e.width:i!==`inner`&&(u=e.width/2,d=t.width/2),this.paddingLeft=Math.max((u-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((d-l+a)*this.width/(this.width-l),0)}else{let n=t.height/2,r=e.height/2;i===`start`?(n=0,r=e.height):i===`end`&&(n=t.height,r=0),this.paddingTop=n+a,this.paddingBottom=r+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){F(this.options.afterFit,[this])}isHorizontal(){let{axis:e,position:t}=this.options;return t===`top`||t===`bottom`||e===`x`}isFullSize(){return this.options.fullSize}_convertTicksToLabels(e){this.beforeTickToLabelConversion(),this.generateTickLabels(e);let t,n;for(t=0,n=e.length;t({width:a[e]||0,height:o[e]||0});return{first:C(0),last:C(t-1),widest:C(x),highest:C(S),widths:a,heights:o}}getLabelForValue(e){return e}getPixelForValue(e,t){return NaN}getValueForPixel(e){}getPixelForTick(e){let t=this.ticks;return e<0||e>t.length-1?null:this.getPixelForValue(t[e].value)}getPixelForDecimal(e){this._reversePixels&&(e=1-e);let t=this._startPixel+e*this._length;return mt(this._alignToPixels?tn(this.chart,t,0):t)}getDecimalForPixel(e){let t=(e-this._startPixel)/this._length;return this._reversePixels?1-t:t}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){let{min:e,max:t}=this;return e<0&&t<0?t:e>0&&t>0?e:0}getContext(e){let t=this.ticks||[];if(e>=0&&eo*r?o/n:s/r:s*r0:!!e}_computeGridLineItems(e){let t=this.axis,n=this.chart,r=this.options,{grid:i,position:a,border:o}=r,s=i.offset,c=this.isHorizontal(),l=this.ticks.length+(s?1:0),u=Ua(i),d=[],f=o.setContext(this.getContext()),p=f.display?f.width:0,m=p/2,h=function(e){return tn(n,e,p)},g,_,v,y,b,x,S,C,w,T,E,D;if(a===`top`)g=h(this.bottom),x=this.bottom-u,C=g-m,T=h(e.top)+m,D=e.bottom;else if(a===`bottom`)g=h(this.top),T=e.top,D=h(e.bottom)-m,x=g+m,C=this.top+u;else if(a===`left`)g=h(this.right),b=this.right-u,S=g-m,w=h(e.left)+m,E=e.right;else if(a===`right`)g=h(this.left),w=e.left,E=h(e.right)-m,b=g+m,S=this.left+u;else if(t===`x`){if(a===`center`)g=h((e.top+e.bottom)/2+.5);else if(j(a)){let e=Object.keys(a)[0],t=a[e];g=h(this.chart.scales[e].getPixelForValue(t))}T=e.top,D=e.bottom,x=g+m,C=x+u}else if(t===`y`){if(a===`center`)g=h((e.left+e.right)/2);else if(j(a)){let e=Object.keys(a)[0],t=a[e];g=h(this.chart.scales[e].getPixelForValue(t))}b=g-m,S=b-u,w=e.left,E=e.right}let ee=P(r.ticks.maxTicksLimit,l),O=Math.max(1,Math.ceil(l/ee));for(_=0;_0&&(a-=r/2);break}f={left:a,top:i,width:r+t.width,height:n+t.height,color:e.backdropColor}}h.push({label:y,font:w,textOffset:D,options:{rotation:m,color:n,strokeColor:s,strokeWidth:l,textAlign:d,textBaseline:ee,translation:[b,x],backdrop:f}})}return h}_getXAxisLabelAlignment(){let{position:e,ticks:t}=this.options;if(-V(this.labelRotation))return e===`top`?`left`:`right`;let n=`center`;return t.align===`start`?n=`left`:t.align===`end`?n=`right`:t.align===`inner`&&(n=`inner`),n}_getYAxisLabelAlignment(e){let{position:t,ticks:{crossAlign:n,mirror:r,padding:i}}=this.options,a=this._getLabelSizes(),o=e+i,s=a.widest.width,c,l;return t===`left`?r?(l=this.right+i,n===`near`?c=`left`:n===`center`?(c=`center`,l+=s/2):(c=`right`,l+=s)):(l=this.right-o,n===`near`?c=`right`:n===`center`?(c=`center`,l-=s/2):(c=`left`,l=this.left)):t===`right`?r?(l=this.left+i,n===`near`?c=`right`:n===`center`?(c=`center`,l-=s/2):(c=`left`,l-=s)):(l=this.left+o,n===`near`?c=`left`:n===`center`?(c=`center`,l+=s/2):(c=`right`,l=this.right)):c=`right`,{textAlign:c,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;let e=this.chart,t=this.options.position;if(t===`left`||t===`right`)return{top:0,left:this.left,bottom:e.height,right:this.right};if(t===`top`||t===`bottom`)return{top:this.top,left:0,bottom:this.bottom,right:e.width}}drawBackground(){let{ctx:e,options:{backgroundColor:t},left:n,top:r,width:i,height:a}=this;t&&(e.save(),e.fillStyle=t,e.fillRect(n,r,i,a),e.restore())}getLineWidthForValue(e){let t=this.options.grid;if(!this._isVisible()||!t.display)return 0;let n=this.ticks.findIndex(t=>t.value===e);return n>=0?t.setContext(this.getContext(n)).lineWidth:0}drawGrid(e){let t=this.options.grid,n=this.ctx,r=this._gridLineItems||=this._computeGridLineItems(e),i,a,o=(e,t,r)=>{!r.width||!r.color||(n.save(),n.lineWidth=r.width,n.strokeStyle=r.color,n.setLineDash(r.borderDash||[]),n.lineDashOffset=r.borderDashOffset,n.beginPath(),n.moveTo(e.x,e.y),n.lineTo(t.x,t.y),n.stroke(),n.restore())};if(t.display)for(i=0,a=r.length;i{this.draw(e)}}]:[{z:r,draw:e=>{this.drawBackground(),this.drawGrid(e),this.drawTitle()}},{z:i,draw:()=>{this.drawBorder()}},{z:n,draw:e=>{this.drawLabels(e)}}]}getMatchingVisibleMetas(e){let t=this.chart.getSortedVisibleDatasetMetas(),n=this.axis+`AxisID`,r=[],i,a;for(i=0,a=t.length;i{let r=n.split(`.`),i=r.pop(),a=[e].concat(r).join(`.`),o=t[n].split(`.`),s=o.pop(),c=o.join(`.`);K.route(a,i,c,s)})}function $a(e){return`id`in e&&`defaults`in e}var X=new class{constructor(){this.controllers=new Xa(fi,`datasets`,!0),this.elements=new Xa(ka,`elements`),this.plugins=new Xa(Object,`plugins`),this.scales=new Xa(Ya,`scales`),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...e){this._each(`register`,e)}remove(...e){this._each(`unregister`,e)}addControllers(...e){this._each(`register`,e,this.controllers)}addElements(...e){this._each(`register`,e,this.elements)}addPlugins(...e){this._each(`register`,e,this.plugins)}addScales(...e){this._each(`register`,e,this.scales)}getController(e){return this._get(e,this.controllers,`controller`)}getElement(e){return this._get(e,this.elements,`element`)}getPlugin(e){return this._get(e,this.plugins,`plugin`)}getScale(e){return this._get(e,this.scales,`scale`)}removeControllers(...e){this._each(`unregister`,e,this.controllers)}removeElements(...e){this._each(`unregister`,e,this.elements)}removePlugins(...e){this._each(`unregister`,e,this.plugins)}removeScales(...e){this._each(`unregister`,e,this.scales)}_each(e,t,n){[...t].forEach(t=>{let r=n||this._getRegistryForType(t);n||r.isForType(t)||r===this.plugins&&t.id?this._exec(e,r,t):I(t,t=>{let r=n||this._getRegistryForType(t);this._exec(e,r,t)})})}_exec(e,t,n){let r=We(e);F(n[`before`+r],[],n),t[e](n),F(n[`after`+r],[],n)}_getRegistryForType(e){for(let t=0;te.filter(e=>!t.some(t=>e.plugin.id===t.plugin.id));this._notify(r(t,n),e,`stop`),this._notify(r(n,t),e,`start`)}};function to(e){let t={},n=[],r=Object.keys(X.plugins.items);for(let e=0;e1&&co(e[0].toLowerCase());if(t)return t}throw Error(`Cannot determine type of '${e}' axis. Please provide 'axis' or 'position' option.`)}function fo(e,t,n){if(n[t+`AxisID`]===e)return{axis:t}}function po(e,t){if(t.data&&t.data.datasets){let n=t.data.datasets.filter(t=>t.xAxisID===e||t.yAxisID===e);if(n.length)return fo(e,`x`,n[0])||fo(e,`y`,n[0])}return{}}function mo(e,t){let n=Jt[e.type]||{scales:{}},r=t.scales||{},i=ao(e.type,t),a=Object.create(null);return Object.keys(r).forEach(t=>{let o=r[t];if(!j(o))return console.error(`Invalid scale configuration for scale: ${t}`);if(o._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);let s=uo(t,o,po(t,e),K.scales[o.type]),c=so(s,i),l=n.scales||{};a[t]=Re(Object.create(null),[{axis:s},o,l[s],l[c]])}),e.data.datasets.forEach(n=>{let i=n.type||e.type,o=n.indexAxis||ao(i,t),s=(Jt[i]||{}).scales||{};Object.keys(s).forEach(e=>{let t=oo(e,o),i=n[t+`AxisID`]||t;a[i]=a[i]||Object.create(null),Re(a[i],[{axis:t},r[i],s[e]])})}),Object.keys(a).forEach(e=>{let t=a[e];Re(t,[K.scales[t.type],K.scale])}),a}function ho(e){let t=e.options||={};t.plugins=P(t.plugins,{}),t.scales=mo(e,t)}function go(e){return e||={},e.datasets=e.datasets||[],e.labels=e.labels||[],e}function _o(e){return e||={},e.data=go(e.data),ho(e),e}var vo=new Map,yo=new Set;function bo(e,t){let n=vo.get(e);return n||(n=t(),vo.set(e,n),yo.add(n)),n}var xo=(e,t,n)=>{let r=Ue(t,n);r!==void 0&&e.add(r)},So=class{constructor(e){this._config=_o(e),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(e){this._config.type=e}get data(){return this._config.data}set data(e){this._config.data=go(e)}get options(){return this._config.options}set options(e){this._config.options=e}get plugins(){return this._config.plugins}update(){let e=this._config;this.clearCache(),ho(e)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(e){return bo(e,()=>[[`datasets.${e}`,``]])}datasetAnimationScopeKeys(e,t){return bo(`${e}.transition.${t}`,()=>[[`datasets.${e}.transitions.${t}`,`transitions.${t}`],[`datasets.${e}`,``]])}datasetElementScopeKeys(e,t){return bo(`${e}-${t}`,()=>[[`datasets.${e}.elements.${t}`,`datasets.${e}`,`elements.${t}`,``]])}pluginScopeKeys(e){let t=e.id,n=this.type;return bo(`${n}-plugin-${t}`,()=>[[`plugins.${t}`,...e.additionalOptionScopes||[]]])}_cachedScopes(e,t){let n=this._scopeCache,r=n.get(e);return(!r||t)&&(r=new Map,n.set(e,r)),r}getOptionScopes(e,t,n){let{options:r,type:i}=this,a=this._cachedScopes(e,n),o=a.get(t);if(o)return o;let s=new Set;t.forEach(t=>{e&&(s.add(e),t.forEach(t=>xo(s,e,t))),t.forEach(e=>xo(s,r,e)),t.forEach(e=>xo(s,Jt[i]||{},e)),t.forEach(e=>xo(s,K,e)),t.forEach(e=>xo(s,Yt,e))});let c=Array.from(s);return c.length===0&&c.push(Object.create(null)),yo.has(t)&&a.set(t,c),c}chartOptionScopes(){let{options:e,type:t}=this;return[e,Jt[t]||{},K.datasets[t]||{},{type:t},K,Yt]}resolveNamedOptions(e,t,n,r=[``]){let i={$shared:!0},{resolver:a,subPrefixes:o}=Co(this._resolverCache,e,r),s=a;if(To(a,t)){i.$shared=!1,n=Ke(n)?n():n;let t=this.createResolver(e,n,o);s=Dn(a,n,t)}for(let e of t)i[e]=s[e];return i}createResolver(e,t,n=[``],r){let{resolver:i}=Co(this._resolverCache,e,n);return j(t)?Dn(i,t,void 0,r):i}};function Co(e,t,n){let r=e.get(t);r||(r=new Map,e.set(t,r));let i=n.join(),a=r.get(i);return a||(a={resolver:En(t,n),subPrefixes:n.filter(e=>!e.toLowerCase().includes(`hover`))},r.set(i,a)),a}var wo=e=>j(e)&&Object.getOwnPropertyNames(e).some(t=>Ke(e[t]));function To(e,t){let{isScriptable:n,isIndexable:r}=On(e);for(let i of t){let t=n(i),a=r(i),o=(a||t)&&e[i];if(t&&(Ke(o)||wo(o))||a&&A(o))return!0}return!1}var Eo=`4.5.1`,Do=[`top`,`bottom`,`left`,`right`,`chartArea`];function Oo(e,t){return e===`top`||e===`bottom`||Do.indexOf(e)===-1&&t===`x`}function ko(e,t){return function(n,r){return n[e]===r[e]?n[t]-r[t]:n[e]-r[e]}}function Ao(e){let t=e.chart,n=t.options.animation;t.notifyPlugins(`afterRender`),F(n&&n.onComplete,[e],t)}function jo(e){let t=e.chart,n=t.options.animation;F(n&&n.onProgress,[e],t)}function Mo(e){return tr()&&typeof e==`string`?e=document.getElementById(e):e&&e.length&&(e=e[0]),e&&e.canvas&&(e=e.canvas),e}var No={},Po=e=>{let t=Mo(e);return Object.values(No).filter(e=>e.canvas===t).pop()};function Fo(e,t,n){let r=Object.keys(e);for(let i of r){let r=+i;if(r>=t){let a=e[i];delete e[i],(n>0||r>t)&&(e[r+n]=a)}}}function Io(e,t,n,r){return!n||e.type===`mouseout`?null:r?t:e}var Lo=class{static defaults=K;static instances=No;static overrides=Jt;static registry=X;static version=Eo;static getChart=Po;static register(...e){X.add(...e),Ro()}static unregister(...e){X.remove(...e),Ro()}constructor(e,t){let n=this.config=new So(t),r=Mo(e),i=Po(r);if(i)throw Error(`Canvas is already in use. Chart with ID '`+i.id+`' must be destroyed before the canvas with ID '`+i.canvas.id+`' can be reused.`);let a=n.createResolver(n.chartOptionScopes(),this.getContext());this.platform=new(n.platform||(Oa(r))),this.platform.updateConfig(n);let o=this.platform.acquireContext(r,a.aspectRatio),s=o&&o.canvas,c=s&&s.height,l=s&&s.width;if(this.id=Ae(),this.ctx=o,this.canvas=s,this.width=l,this.height=c,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new eo,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=Tt(e=>this.update(e),a.resizeDelay||0),this._dataChanges=[],No[this.id]=this,!o||!s){console.error(`Failed to create chart: can't acquire context from the given item`);return}Br.listen(this,`complete`,Ao),Br.listen(this,`progress`,jo),this._initialize(),this.attached&&this.update()}get aspectRatio(){let{options:{aspectRatio:e,maintainAspectRatio:t},width:n,height:r,_aspectRatio:i}=this;return k(e)?t&&i?i:r?n/r:null:e}get data(){return this.config.data}set data(e){this.config.data=e}get options(){return this._options}set options(e){this.config.options=e}get registry(){return X}_initialize(){return this.notifyPlugins(`beforeInit`),this.options.responsive?this.resize():mr(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins(`afterInit`),this}clear(){return nn(this.canvas,this.ctx),this}stop(){return Br.stop(this),this}resize(e,t){Br.running(this)?this._resizeBeforeDraw={width:e,height:t}:this._resize(e,t)}_resize(e,t){let n=this.options,r=this.canvas,i=n.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(r,e,t,i),o=n.devicePixelRatio||this.platform.getDevicePixelRatio(),s=this.width?`resize`:`attach`;this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,mr(this,o,!0)&&(this.notifyPlugins(`resize`,{size:a}),F(n.onResize,[this,a],this),this.attached&&this._doResize(s)&&this.render())}ensureScalesHaveIDs(){I(this.options.scales||{},(e,t)=>{e.id=t})}buildOrUpdateScales(){let e=this.options,t=e.scales,n=this.scales,r=Object.keys(n).reduce((e,t)=>(e[t]=!1,e),{}),i=[];t&&(i=i.concat(Object.keys(t).map(e=>{let n=t[e],r=uo(e,n),i=r===`r`,a=r===`x`;return{options:n,dposition:i?`chartArea`:a?`bottom`:`left`,dtype:i?`radialLinear`:a?`category`:`linear`}}))),I(i,t=>{let i=t.options,a=i.id,o=uo(a,i),s=P(i.type,t.dtype);(i.position===void 0||Oo(i.position,o)!==Oo(t.dposition))&&(i.position=t.dposition),r[a]=!0;let c=null;a in n&&n[a].type===s?c=n[a]:(c=new(X.getScale(s))({id:a,type:s,ctx:this.ctx,chart:this}),n[c.id]=c),c.init(i,e)}),I(r,(e,t)=>{e||delete n[t]}),I(n,e=>{Y.configure(this,e,e.options),Y.addBox(this,e)})}_updateMetasets(){let e=this._metasets,t=this.data.datasets.length,n=e.length;if(e.sort((e,t)=>e.index-t.index),n>t){for(let e=t;et.length&&delete this._stacks,e.forEach((e,n)=>{t.filter(t=>t===e._dataset).length===0&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){let e=[],t=this.data.datasets,n,r;for(this._removeUnreferencedMetasets(),n=0,r=t.length;n{this.getDatasetMeta(t).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins(`reset`)}update(e){let t=this.config;t.update();let n=this._options=t.createResolver(t.chartOptionScopes(),this.getContext()),r=this._animationsDisabled=!n.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins(`beforeUpdate`,{mode:e,cancelable:!0})===!1)return;let i=this.buildOrUpdateControllers();this.notifyPlugins(`beforeElementsUpdate`);let a=0;for(let e=0,t=this.data.datasets.length;e{e.reset()}),this._updateDatasets(e),this.notifyPlugins(`afterUpdate`,{mode:e}),this._layers.sort(ko(`z`,`_idx`));let{_active:o,_lastEvent:s}=this;s?this._eventHandler(s,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){I(this.scales,e=>{Y.removeBox(this,e)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){let e=this.options;(!qe(new Set(Object.keys(this._listeners)),new Set(e.events))||!!this._responsiveListeners!==e.responsive)&&(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){let{_hiddenIndices:e}=this,t=this._getUniformDataChanges()||[];for(let{method:n,start:r,count:i}of t)Fo(e,r,n===`_removeElements`?-i:i)}_getUniformDataChanges(){let e=this._dataChanges;if(!e||!e.length)return;this._dataChanges=[];let t=this.data.datasets.length,n=t=>new Set(e.filter(e=>e[0]===t).map((e,t)=>t+`,`+e.splice(1).join(`,`))),r=n(0);for(let e=1;ee.split(`,`)).map(e=>({method:e[1],start:+e[2],count:+e[3]}))}_updateLayout(e){if(this.notifyPlugins(`beforeLayout`,{cancelable:!0})===!1)return;Y.update(this,this.width,this.height,e);let t=this.chartArea,n=t.width<=0||t.height<=0;this._layers=[],I(this.boxes,e=>{n&&e.position===`chartArea`||(e.configure&&e.configure(),this._layers.push(...e._layers()))},this),this._layers.forEach((e,t)=>{e._idx=t}),this.notifyPlugins(`afterLayout`)}_updateDatasets(e){if(this.notifyPlugins(`beforeDatasetsUpdate`,{mode:e,cancelable:!0})!==!1){for(let e=0,t=this.data.datasets.length;e=0;--t)this._drawDataset(e[t]);this.notifyPlugins(`afterDatasetsDraw`)}_drawDataset(e){let t=this.ctx,n={meta:e,index:e.index,cancelable:!0},r=zr(this,e);this.notifyPlugins(`beforeDatasetDraw`,n)!==!1&&(r&&sn(t,r),e.controller.draw(),r&&cn(t),n.cancelable=!1,this.notifyPlugins(`afterDatasetDraw`,n))}isPointInArea(e){return on(e,this.chartArea,this._minPadding)}getElementsAtEventForMode(e,t,n,r){let i=Ui.modes[t];return typeof i==`function`?i(this,e,n,r):[]}getDatasetMeta(e){let t=this.data.datasets[e],n=this._metasets,r=n.filter(e=>e&&e._dataset===t).pop();return r||(r={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:t&&t.order||0,index:e,_dataset:t,_parsed:[],_sorted:!1},n.push(r)),r}getContext(){return this.$context||=Tn(null,{chart:this,type:`chart`})}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(e){let t=this.data.datasets[e];if(!t)return!1;let n=this.getDatasetMeta(e);return typeof n.hidden==`boolean`?!n.hidden:!t.hidden}setDatasetVisibility(e,t){let n=this.getDatasetMeta(e);n.hidden=!t}toggleDataVisibility(e){this._hiddenIndices[e]=!this._hiddenIndices[e]}getDataVisibility(e){return!this._hiddenIndices[e]}_updateVisibility(e,t,n){let r=n?`show`:`hide`,i=this.getDatasetMeta(e),a=i.controller._resolveAnimations(void 0,r);Ge(t)?(i.data[t].hidden=!n,this.update()):(this.setDatasetVisibility(e,n),a.update(i,{visible:n}),this.update(t=>t.datasetIndex===e?r:void 0))}hide(e,t){this._updateVisibility(e,t,!1)}show(e,t){this._updateVisibility(e,t,!0)}_destroyDatasetMeta(e){let t=this._metasets[e];t&&t.controller&&t.controller._destroy(),delete this._metasets[e]}_stop(){let e,t;for(this.stop(),Br.remove(this),e=0,t=this.data.datasets.length;e{t.addEventListener(this,n,r),e[n]=r},r=(e,t,n)=>{e.offsetX=t,e.offsetY=n,this._eventHandler(e)};I(this.options.events,e=>n(e,r))}bindResponsiveEvents(){this._responsiveListeners||={};let e=this._responsiveListeners,t=this.platform,n=(n,r)=>{t.addEventListener(this,n,r),e[n]=r},r=(n,r)=>{e[n]&&(t.removeEventListener(this,n,r),delete e[n])},i=(e,t)=>{this.canvas&&this.resize(e,t)},a,o=()=>{r(`attach`,o),this.attached=!0,this.resize(),n(`resize`,i),n(`detach`,a)};a=()=>{this.attached=!1,r(`resize`,i),this._stop(),this._resize(0,0),n(`attach`,o)},t.isAttached(this.canvas)?o():a()}unbindEvents(){I(this._listeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._listeners={},I(this._responsiveListeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._responsiveListeners=void 0}updateHoverStyle(e,t,n){let r=n?`set`:`remove`,i,a,o,s;for(t===`dataset`&&(i=this.getDatasetMeta(e[0].datasetIndex),i.controller[`_`+r+`DatasetHoverStyle`]()),o=0,s=e.length;o{let n=this.getDatasetMeta(e);if(!n)throw Error(`No dataset found at index `+e);return{datasetIndex:e,element:n.data[t],index:t}});Ne(n,t)||(this._active=n,this._lastEvent=null,this._updateHoverStyles(n,t))}notifyPlugins(e,t,n){return this._plugins.notify(this,e,t,n)}isPluginEnabled(e){return this._plugins._cache.filter(t=>t.plugin.id===e).length===1}_updateHoverStyles(e,t,n){let r=this.options.hover,i=(e,t)=>e.filter(e=>!t.some(t=>e.datasetIndex===t.datasetIndex&&e.index===t.index)),a=i(t,e),o=n?e:i(e,t);a.length&&this.updateHoverStyle(a,r.mode,!1),o.length&&r.mode&&this.updateHoverStyle(o,r.mode,!0)}_eventHandler(e,t){let n={event:e,replay:t,cancelable:!0,inChartArea:this.isPointInArea(e)},r=t=>(t.options.events||this.options.events).includes(e.native.type);if(this.notifyPlugins(`beforeEvent`,n,r)===!1)return;let i=this._handleEvent(e,t,n.inChartArea);return n.cancelable=!1,this.notifyPlugins(`afterEvent`,n,r),(i||n.changed)&&this.render(),this}_handleEvent(e,t,n){let{_active:r=[],options:i}=this,a=t,o=this._getActiveElements(e,r,n,a),s=Je(e),c=Io(e,this._lastEvent,n,s);n&&(this._lastEvent=null,F(i.onHover,[e,o,this],this),s&&F(i.onClick,[e,o,this],this));let l=!Ne(o,r);return(l||t)&&(this._active=o,this._updateHoverStyles(o,r,t)),this._lastEvent=c,l}_getActiveElements(e,t,n,r){if(e.type===`mouseout`)return[];if(!n)return t;let i=this.options.hover;return this.getElementsAtEventForMode(e,i.mode,i,r)}};function Ro(){return I(Lo.instances,e=>e._plugins.invalidate())}function zo(e,t,n){let{startAngle:r,x:i,y:a,outerRadius:o,innerRadius:s,options:c}=t,{borderWidth:l,borderJoinStyle:u}=c,d=Math.min(l/o,H(r-n));if(e.beginPath(),e.arc(i,a,o-l/2,r+d/2,n-d/2),s>0){let t=Math.min(l/s,H(r-n));e.arc(i,a,s+l/2,n-t/2,r+t/2,!0)}else{let t=Math.min(l/2,o*H(r-n));if(u===`round`)e.arc(i,a,t,n-L/2,r+L/2,!0);else if(u===`bevel`){let o=2*t*t,s=-o*Math.cos(n+L/2)+i,c=-o*Math.sin(n+L/2)+a,l=o*Math.cos(r+L/2)+i,u=o*Math.sin(r+L/2)+a;e.lineTo(s,c),e.lineTo(l,u)}}e.closePath(),e.moveTo(0,0),e.rect(0,0,e.canvas.width,e.canvas.height),e.clip(`evenodd`)}function Bo(e,t,n){let{startAngle:r,pixelMargin:i,x:a,y:o,outerRadius:s,innerRadius:c}=t,l=i/s;e.beginPath(),e.arc(a,o,s,r-l,n+l),c>i?(l=i/c,e.arc(a,o,c,n+l,r-l,!0)):e.arc(a,o,i,n+z,r-z),e.closePath(),e.clip()}function Vo(e){return bn(e,[`outerStart`,`outerEnd`,`innerStart`,`innerEnd`])}function Ho(e,t,n,r){let i=Vo(e.options.borderRadius),a=(n-t)/2,o=Math.min(a,r*t/2),s=e=>{let t=(n-Math.min(a,e))*r/2;return U(e,0,Math.min(a,t))};return{outerStart:s(i.outerStart),outerEnd:s(i.outerEnd),innerStart:U(i.innerStart,0,o),innerEnd:U(i.innerEnd,0,o)}}function Uo(e,t,n,r){return{x:n+e*Math.cos(t),y:r+e*Math.sin(t)}}function Wo(e,t,n,r,i,a){let{x:o,y:s,startAngle:c,pixelMargin:l,innerRadius:u}=t,d=Math.max(t.outerRadius+r+n-l,0),f=u>0?u+r+n+l:0,p=0,m=i-c;if(r){let e=((u>0?u-r:0)+(d>0?d-r:0))/2;p=(m-(e===0?m:m*e/(e+r)))/2}let h=(m-Math.max(.001,m*d-n/L)/d)/2,g=c+h+p,_=i-h-p,{outerStart:v,outerEnd:y,innerStart:b,innerEnd:x}=Ho(t,f,d,_-g),S=d-v,C=d-y,w=g+v/S,T=_-y/C,E=f+b,D=f+x,ee=g+b/E,O=_-x/D;if(e.beginPath(),a){let t=(w+T)/2;if(e.arc(o,s,d,w,t),e.arc(o,s,d,t,T),y>0){let t=Uo(C,T,o,s);e.arc(t.x,t.y,y,T,_+z)}let n=Uo(D,_,o,s);if(e.lineTo(n.x,n.y),x>0){let t=Uo(D,O,o,s);e.arc(t.x,t.y,x,_+z,O+Math.PI)}let r=(_-x/f+(g+b/f))/2;if(e.arc(o,s,f,_-x/f,r,!0),e.arc(o,s,f,r,g+b/f,!0),b>0){let t=Uo(E,ee,o,s);e.arc(t.x,t.y,b,ee+Math.PI,g-z)}let i=Uo(S,g,o,s);if(e.lineTo(i.x,i.y),v>0){let t=Uo(S,w,o,s);e.arc(t.x,t.y,v,g-z,w)}}else{e.moveTo(o,s);let t=Math.cos(w)*d+o,n=Math.sin(w)*d+s;e.lineTo(t,n);let r=Math.cos(T)*d+o,i=Math.sin(T)*d+s;e.lineTo(r,i)}e.closePath()}function Go(e,t,n,r,i){let{fullCircles:a,startAngle:o,circumference:s}=t,c=t.endAngle;if(a){Wo(e,t,n,r,c,i);for(let t=0;t=L&&p===0&&u!==`miter`&&zo(e,t,h),a||(Wo(e,t,n,r,h,i),e.stroke())}var qo=class extends ka{static id=`arc`;static defaults={borderAlign:`center`,borderColor:`#fff`,borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1};static defaultRoutes={backgroundColor:`backgroundColor`};static descriptors={_scriptable:!0,_indexable:e=>e!==`borderDash`};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(e){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,e&&Object.assign(this,e)}inRange(e,t,n){let{angle:r,distance:i}=ut(this.getProps([`x`,`y`],n),{x:e,y:t}),{startAngle:a,endAngle:o,innerRadius:s,outerRadius:c,circumference:l}=this.getProps([`startAngle`,`endAngle`,`innerRadius`,`outerRadius`,`circumference`],n),u=(this.options.spacing+this.options.borderWidth)/2,d=P(l,o-a),f=pt(r,a,o)&&a!==o,p=d>=R||f,m=W(i,s+u,c+u);return p&&m}getCenterPoint(e){let{x:t,y:n,startAngle:r,endAngle:i,innerRadius:a,outerRadius:o}=this.getProps([`x`,`y`,`startAngle`,`endAngle`,`innerRadius`,`outerRadius`],e),{offset:s,spacing:c}=this.options,l=(r+i)/2,u=(a+o+c+s)/2;return{x:t+Math.cos(l)*u,y:n+Math.sin(l)*u}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){let{options:t,circumference:n}=this,r=(t.offset||0)/4,i=(t.spacing||0)/2,a=t.circular;if(this.pixelMargin=t.borderAlign===`inner`?.33:0,this.fullCircles=n>R?Math.floor(n/R):0,n===0||this.innerRadius<0||this.outerRadius<0)return;e.save();let o=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(o)*r,Math.sin(o)*r);let s=r*(1-Math.sin(Math.min(L,n||0)));e.fillStyle=t.backgroundColor,e.strokeStyle=t.borderColor,Go(e,this,s,i,a),Ko(e,this,s,i,a),e.restore()}};function Jo(e,t,n=t){e.lineCap=P(n.borderCapStyle,t.borderCapStyle),e.setLineDash(P(n.borderDash,t.borderDash)),e.lineDashOffset=P(n.borderDashOffset,t.borderDashOffset),e.lineJoin=P(n.borderJoinStyle,t.borderJoinStyle),e.lineWidth=P(n.borderWidth,t.borderWidth),e.strokeStyle=P(n.borderColor,t.borderColor)}function Yo(e,t,n){e.lineTo(n.x,n.y)}function Xo(e){return e.stepped?ln:e.tension||e.cubicInterpolationMode===`monotone`?un:Yo}function Zo(e,t,n={}){let r=e.length,{start:i=0,end:a=r-1}=n,{start:o,end:s}=t,c=Math.max(i,o),l=Math.min(a,s),u=is&&a>s;return{count:r,start:c,loop:t.loop,ilen:l(o+(l?s-e:e))%a,y=()=>{h!==g&&(e.lineTo(u,g),e.lineTo(u,h),e.lineTo(u,_))};for(c&&(p=i[v(0)],e.moveTo(p.x,p.y)),f=0;f<=s;++f){if(p=i[v(f)],p.skip)continue;let t=p.x,n=p.y,r=t|0;r===m?(ng&&(g=n),u=(d*u+t)/++d):(y(),e.lineTo(t,n),m=r,d=0,h=g=n),_=n}y()}function es(e){let t=e.options,n=t.borderDash&&t.borderDash.length;return!e._decimated&&!e._loop&&!t.tension&&t.cubicInterpolationMode!==`monotone`&&!t.stepped&&!n?$o:Qo}function ts(e){return e.stepped?vr:e.tension||e.cubicInterpolationMode===`monotone`?yr:_r}function ns(e,t,n,r){let i=t._path;i||(i=t._path=new Path2D,t.path(i,n,r)&&i.closePath()),Jo(e,t.options),e.stroke(i)}function rs(e,t,n,r){let{segments:i,options:a}=t,o=es(t);for(let s of i)Jo(e,a,s.style),e.beginPath(),o(e,t,s,{start:n,end:n+r-1})&&e.closePath(),e.stroke()}var is=typeof Path2D==`function`;function as(e,t,n,r){is&&!t.options.segment?ns(e,t,n,r):rs(e,t,n,r)}var os=class extends ka{static id=`line`;static defaults={borderCapStyle:`butt`,borderDash:[],borderDashOffset:0,borderJoinStyle:`miter`,borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:`default`,fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:`backgroundColor`,borderColor:`borderColor`};static descriptors={_scriptable:!0,_indexable:e=>e!==`borderDash`&&e!==`fill`};constructor(e){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,e&&Object.assign(this,e)}updateControlPoints(e,t){let n=this.options;if((n.tension||n.cubicInterpolationMode===`monotone`)&&!n.stepped&&!this._pointsUpdated){let r=n.spanGaps?this._loop:this._fullLoop;er(this._points,n,e,r,t),this._pointsUpdated=!0}}set points(e){this._points=e,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||=Mr(this,this.options.segment)}first(){let e=this.segments,t=this.points;return e.length&&t[e[0].start]}last(){let e=this.segments,t=this.points,n=e.length;return n&&t[e[n-1].end]}interpolate(e,t){let n=this.options,r=e[t],i=this.points,a=kr(this,{property:t,start:r,end:r});if(!a.length)return;let o=[],s=ts(n),c,l;for(c=0,l=a.length;c{t=Ss(e,t,i);let o=i[e],s=i[t];r===null?n!==null&&(a.push({x:n,y:o.y}),a.push({x:n,y:s.y})):(a.push({x:o.x,y:r}),a.push({x:s.x,y:r}))}),a}function Ss(e,t,n){for(;t>e;t--){let e=n[t];if(!isNaN(e.x)&&!isNaN(e.y))break}return t}function Cs(e,t,n,r){return e&&t?r(e[n],t[n]):e?e[n]:t?t[n]:0}function ws(e,t){let n=[],r=!1;return A(e)?(r=!0,n=e):n=xs(e,t),n.length?new os({points:n,options:{tension:0},_loop:r,_fullLoop:r}):null}function Ts(e){return e&&e.fill!==!1}function Es(e,t,n){let r=e[t].fill,i=[t],a;if(!n)return r;for(;r!==!1&&i.indexOf(r)===-1;){if(!M(r))return r;if(a=e[r],!a)return!1;if(a.visible)return r;i.push(r),r=a.fill}return!1}function Ds(e,t,n){let r=js(e);if(j(r))return isNaN(r.value)?!1:r;let i=parseFloat(r);return M(i)&&Math.floor(i)===i?Os(r[0],t,i,n):[`origin`,`start`,`end`,`stack`,`shape`].indexOf(r)>=0&&r}function Os(e,t,n,r){return(e===`-`||e===`+`)&&(n=t+n),n===t||n<0||n>=r?!1:n}function ks(e,t){let n=null;return e===`start`?n=t.bottom:e===`end`?n=t.top:j(e)?n=t.getPixelForValue(e.value):t.getBasePixel&&(n=t.getBasePixel()),n}function As(e,t,n){let r;return r=e===`start`?n:e===`end`?t.options.reverse?t.min:t.max:j(e)?e.value:t.getBaseValue(),r}function js(e){let t=e.options,n=t.fill,r=P(n&&n.target,n);return r===void 0&&(r=!!t.backgroundColor),r===!1||r===null?!1:r===!0?`origin`:r}function Ms(e){let{scale:t,index:n,line:r}=e,i=[],a=r.segments,o=r.points,s=Ns(t,n);s.push(ws({x:null,y:t.bottom},r));for(let e=0;e=0;--t){let n=i[t].$filler;n&&(n.line.updateControlPoints(a,n.axis),r&&n.fill&&Hs(e.ctx,n,a))}},beforeDatasetsDraw(e,t,n){if(n.drawTime!==`beforeDatasetsDraw`)return;let r=e.getSortedVisibleDatasetMetas();for(let t=r.length-1;t>=0;--t){let n=r[t].$filler;Ts(n)&&Hs(e.ctx,n,e.chartArea)}},beforeDatasetDraw(e,t,n){let r=t.meta.$filler;!Ts(r)||n.drawTime!==`beforeDatasetDraw`||Hs(e.ctx,r,e.chartArea)},defaults:{propagate:!0,drawTime:`beforeDatasetDraw`}},Xs=(e,t)=>{let{boxHeight:n=t,boxWidth:r=t}=e;return e.usePointStyle&&(n=Math.min(n,t),r=e.pointStyleWidth||Math.min(r,t)),{boxWidth:r,boxHeight:n,itemHeight:Math.max(t,n)}},Zs=(e,t)=>e!==null&&t!==null&&e.datasetIndex===t.datasetIndex&&e.index===t.index,Qs=class extends ka{constructor(e){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=e.chart,this.options=e.options,this.ctx=e.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(e,t,n){this.maxWidth=e,this.maxHeight=t,this._margins=n,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){let e=this.options.labels||{},t=F(e.generateLabels,[this.chart],this)||[];e.filter&&(t=t.filter(t=>e.filter(t,this.chart.data))),e.sort&&(t=t.sort((t,n)=>e.sort(t,n,this.chart.data))),this.options.reverse&&t.reverse(),this.legendItems=t}fit(){let{options:e,ctx:t}=this;if(!e.display){this.width=this.height=0;return}let n=e.labels,r=J(n.font),i=r.size,a=this._computeTitleHeight(),{boxWidth:o,itemHeight:s}=Xs(n,i),c,l;t.font=r.string,this.isHorizontal()?(c=this.maxWidth,l=this._fitRows(a,i,o,s)+10):(l=this.maxHeight,c=this._fitCols(a,r,o,s)+10),this.width=Math.min(c,e.maxWidth||this.maxWidth),this.height=Math.min(l,e.maxHeight||this.maxHeight)}_fitRows(e,t,n,r){let{ctx:i,maxWidth:a,options:{labels:{padding:o}}}=this,s=this.legendHitBoxes=[],c=this.lineWidths=[0],l=r+o,u=e;i.textAlign=`left`,i.textBaseline=`middle`;let d=-1,f=-l;return this.legendItems.forEach((e,p)=>{let m=n+t/2+i.measureText(e.text).width;(p===0||c[c.length-1]+m+2*o>a)&&(u+=l,c[c.length-(p>0?0:1)]=0,f+=l,d++),s[p]={left:0,top:f,row:d,width:m,height:r},c[c.length-1]+=m+o}),u}_fitCols(e,t,n,r){let{ctx:i,maxHeight:a,options:{labels:{padding:o}}}=this,s=this.legendHitBoxes=[],c=this.columnSizes=[],l=a-e,u=o,d=0,f=0,p=0,m=0;return this.legendItems.forEach((e,a)=>{let{itemWidth:h,itemHeight:g}=$s(n,t,i,e,r);a>0&&f+g+2*o>l&&(u+=d+o,c.push({width:d,height:f}),p+=d+o,m++,d=f=0),s[a]={left:p,top:f,col:m,width:h,height:g},d=Math.max(d,h),f+=g+o}),u+=d,c.push({width:d,height:f}),u}adjustHitBoxes(){if(!this.options.display)return;let e=this._computeTitleHeight(),{legendHitBoxes:t,options:{align:n,labels:{padding:r},rtl:i}}=this,a=Sr(i,this.left,this.width);if(this.isHorizontal()){let i=0,o=G(n,this.left+r,this.right-this.lineWidths[i]);for(let s of t)i!==s.row&&(i=s.row,o=G(n,this.left+r,this.right-this.lineWidths[i])),s.top+=this.top+e+r,s.left=a.leftForLtr(a.x(o),s.width),o+=s.width+r}else{let i=0,o=G(n,this.top+e+r,this.bottom-this.columnSizes[i].height);for(let s of t)s.col!==i&&(i=s.col,o=G(n,this.top+e+r,this.bottom-this.columnSizes[i].height)),s.top=o,s.left+=this.left+r,s.left=a.leftForLtr(a.x(s.left),s.width),o+=s.height+r}}isHorizontal(){return this.options.position===`top`||this.options.position===`bottom`}draw(){if(this.options.display){let e=this.ctx;sn(e,this),this._draw(),cn(e)}}_draw(){let{options:e,columnSizes:t,lineWidths:n,ctx:r}=this,{align:i,labels:a}=e,o=K.color,s=Sr(e.rtl,this.left,this.width),c=J(a.font),{padding:l}=a,u=c.size,d=u/2,f;this.drawTitle(),r.textAlign=s.textAlign(`left`),r.textBaseline=`middle`,r.lineWidth=.5,r.font=c.string;let{boxWidth:p,boxHeight:m,itemHeight:h}=Xs(a,u),g=function(e,t,n){if(isNaN(p)||p<=0||isNaN(m)||m<0)return;r.save();let i=P(n.lineWidth,1);if(r.fillStyle=P(n.fillStyle,o),r.lineCap=P(n.lineCap,`butt`),r.lineDashOffset=P(n.lineDashOffset,0),r.lineJoin=P(n.lineJoin,`miter`),r.lineWidth=i,r.strokeStyle=P(n.strokeStyle,o),r.setLineDash(P(n.lineDash,[])),a.usePointStyle)an(r,{radius:m*Math.SQRT2/2,pointStyle:n.pointStyle,rotation:n.rotation,borderWidth:i},s.xPlus(e,p/2),t+d,a.pointStyleWidth&&p);else{let a=t+Math.max((u-m)/2,0),o=s.leftForLtr(e,p),c=Sn(n.borderRadius);r.beginPath(),Object.values(c).some(e=>e!==0)?hn(r,{x:o,y:a,w:p,h:m,radius:c}):r.rect(o,a,p,m),r.fill(),i!==0&&r.stroke()}r.restore()},_=function(e,t,n){mn(r,n.text,e,t+h/2,c,{strikethrough:n.hidden,textAlign:s.textAlign(n.textAlign)})},v=this.isHorizontal(),y=this._computeTitleHeight();f=v?{x:G(i,this.left+l,this.right-n[0]),y:this.top+l+y,line:0}:{x:this.left+l,y:G(i,this.top+y+l,this.bottom-t[0].height),line:0},Cr(this.ctx,e.textDirection);let b=h+l;this.legendItems.forEach((o,u)=>{r.strokeStyle=o.fontColor,r.fillStyle=o.fontColor;let m=r.measureText(o.text).width,h=s.textAlign(o.textAlign||=a.textAlign),x=p+d+m,S=f.x,C=f.y;if(s.setWidth(this.width),v?u>0&&S+x+l>this.right&&(C=f.y+=b,f.line++,S=f.x=G(i,this.left+l,this.right-n[f.line])):u>0&&C+b>this.bottom&&(S=f.x=S+t[f.line].width+l,f.line++,C=f.y=G(i,this.top+y+l,this.bottom-t[f.line].height)),g(s.x(S),C,o),S=Dt(h,S+p+d,v?S+x:this.right,e.rtl),_(s.x(S),C,o),v)f.x+=x+l;else if(typeof o.text!=`string`){let e=c.lineHeight;f.y+=nc(o,e)+l}else f.y+=b}),wr(this.ctx,e.textDirection)}drawTitle(){let e=this.options,t=e.title,n=J(t.font),r=q(t.padding);if(!t.display)return;let i=Sr(e.rtl,this.left,this.width),a=this.ctx,o=t.position,s=n.size/2,c=r.top+s,l,u=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),l=this.top+c,u=G(e.align,u,this.right-d);else{let t=this.columnSizes.reduce((e,t)=>Math.max(e,t.height),0);l=c+G(e.align,this.top,this.bottom-t-e.labels.padding-this._computeTitleHeight())}let f=G(o,u,u+d);a.textAlign=i.textAlign(Et(o)),a.textBaseline=`middle`,a.strokeStyle=t.color,a.fillStyle=t.color,a.font=n.string,mn(a,t.text,f,l,n)}_computeTitleHeight(){let e=this.options.title,t=J(e.font),n=q(e.padding);return e.display?t.lineHeight+n.height:0}_getLegendItemAt(e,t){let n,r,i;if(W(e,this.left,this.right)&&W(t,this.top,this.bottom)){for(i=this.legendHitBoxes,n=0;ne.length>t.length?e:t)),t+n.size/2+r.measureText(i).width}function tc(e,t,n){let r=e;return typeof t.text!=`string`&&(r=nc(t,n)),r}function nc(e,t){return t*(e.text?e.text.length:0)}function rc(e,t){return!!((e===`mousemove`||e===`mouseout`)&&(t.onHover||t.onLeave)||t.onClick&&(e===`click`||e===`mouseup`))}var ic={id:`legend`,_element:Qs,start(e,t,n){let r=e.legend=new Qs({ctx:e.ctx,options:n,chart:e});Y.configure(e,r,n),Y.addBox(e,r)},stop(e){Y.removeBox(e,e.legend),delete e.legend},beforeUpdate(e,t,n){let r=e.legend;Y.configure(e,r,n),r.options=n},afterUpdate(e){let t=e.legend;t.buildLabels(),t.adjustHitBoxes()},afterEvent(e,t){t.replay||e.legend.handleEvent(t.event)},defaults:{display:!0,position:`top`,align:`center`,fullSize:!0,reverse:!1,weight:1e3,onClick(e,t,n){let r=t.datasetIndex,i=n.chart;i.isDatasetVisible(r)?(i.hide(r),t.hidden=!0):(i.show(r),t.hidden=!1)},onHover:null,onLeave:null,labels:{color:e=>e.chart.options.color,boxWidth:40,padding:10,generateLabels(e){let t=e.data.datasets,{labels:{usePointStyle:n,pointStyle:r,textAlign:i,color:a,useBorderRadius:o,borderRadius:s}}=e.legend.options;return e._getSortedDatasetMetas().map(e=>{let c=e.controller.getStyle(n?0:void 0),l=q(c.borderWidth);return{text:t[e.index].label,fillStyle:c.backgroundColor,fontColor:a,hidden:!e.visible,lineCap:c.borderCapStyle,lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:(l.width+l.height)/4,strokeStyle:c.borderColor,pointStyle:r||c.pointStyle,rotation:c.rotation,textAlign:i||c.textAlign,borderRadius:o&&(s||c.borderRadius),datasetIndex:e.index}},this)}},title:{color:e=>e.chart.options.color,display:!1,position:`center`,text:``}},descriptors:{_scriptable:e=>!e.startsWith(`on`),labels:{_scriptable:e=>![`generateLabels`,`filter`,`sort`].includes(e)}}},ac=class extends ka{constructor(e){super(),this.chart=e.chart,this.options=e.options,this.ctx=e.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(e,t){let n=this.options;if(this.left=0,this.top=0,!n.display){this.width=this.height=this.right=this.bottom=0;return}this.width=this.right=e,this.height=this.bottom=t;let r=A(n.text)?n.text.length:1;this._padding=q(n.padding);let i=r*J(n.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=i:this.width=i}isHorizontal(){let e=this.options.position;return e===`top`||e===`bottom`}_drawArgs(e){let{top:t,left:n,bottom:r,right:i,options:a}=this,o=a.align,s=0,c,l,u;return this.isHorizontal()?(l=G(o,n,i),u=t+e,c=i-n):(a.position===`left`?(l=n+e,u=G(o,r,t),s=L*-.5):(l=i-e,u=G(o,t,r),s=L*.5),c=r-t),{titleX:l,titleY:u,maxWidth:c,rotation:s}}draw(){let e=this.ctx,t=this.options;if(!t.display)return;let n=J(t.font),r=n.lineHeight/2+this._padding.top,{titleX:i,titleY:a,maxWidth:o,rotation:s}=this._drawArgs(r);mn(e,t.text,0,0,n,{color:t.color,maxWidth:o,rotation:s,textAlign:Et(t.align),textBaseline:`middle`,translation:[i,a]})}};function oc(e,t){let n=new ac({ctx:e.ctx,options:t,chart:e});Y.configure(e,n,t),Y.addBox(e,n),e.titleBlock=n}var sc={id:`title`,_element:ac,start(e,t,n){oc(e,n)},stop(e){let t=e.titleBlock;Y.removeBox(e,t),delete e.titleBlock},beforeUpdate(e,t,n){let r=e.titleBlock;Y.configure(e,r,n),r.options=n},defaults:{align:`center`,display:!1,font:{weight:`bold`},fullSize:!0,padding:10,position:`top`,text:``,weight:2e3},defaultRoutes:{color:`color`},descriptors:{_scriptable:!0,_indexable:!1}},cc={average(e){if(!e.length)return!1;let t,n,r=new Set,i=0,a=0;for(t=0,n=e.length;te+t)/r.size,y:i/a}},nearest(e,t){if(!e.length)return!1;let n=t.x,r=t.y,i=1/0,a,o,s;for(a=0,o=e.length;aMath.max(Math.min(e,n),t);function h(e){return m(p(e*2.55),0,255)}function g(e){return m(p(e*255),0,255)}function _(e){return m(p(e/2.55)/100,0,1)}function v(e){return m(p(e*100),0,100)}var y={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},b=[...`0123456789ABCDEF`],x=e=>b[e&15],S=e=>b[(e&240)>>4]+b[e&15],C=e=>(e&240)>>4==(e&15),w=e=>C(e.r)&&C(e.g)&&C(e.b)&&C(e.a);function T(e){var t=e.length,n;return e[0]===`#`&&(t===4||t===5?n={r:255&y[e[1]]*17,g:255&y[e[2]]*17,b:255&y[e[3]]*17,a:t===5?y[e[4]]*17:255}:(t===7||t===9)&&(n={r:y[e[1]]<<4|y[e[2]],g:y[e[3]]<<4|y[e[4]],b:y[e[5]]<<4|y[e[6]],a:t===9?y[e[7]]<<4|y[e[8]]:255})),n}var E=(e,t)=>e<255?t(e):``;function D(e){var t=w(e)?x:S;return e?`#`+t(e.r)+t(e.g)+t(e.b)+E(e.a,t):void 0}var ee=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function O(e,t,n){let r=t*Math.min(n,1-n),i=(t,i=(t+e/30)%12)=>n-r*Math.max(Math.min(i-3,9-i,1),-1);return[i(0),i(8),i(4)]}function te(e,t,n){let r=(r,i=(r+e/60)%6)=>n-n*t*Math.max(Math.min(i,4-i,1),0);return[r(5),r(3),r(1)]}function ne(e,t,n){let r=O(e,1,.5),i;for(t+n>1&&(i=1/(t+n),t*=i,n*=i),i=0;i<3;i++)r[i]*=1-t-n,r[i]+=t;return r}function re(e,t,n,r,i){return e===i?(t-n)/r+(t.5?l/(2-i-a):l/(i+a),s=re(t,n,r,l,i),s=s*60+.5),[s|0,c||0,o]}function ae(e,t,n,r){return(Array.isArray(t)?e(t[0],t[1],t[2]):e(t,n,r)).map(g)}function oe(e,t,n){return ae(O,e,t,n)}function se(e,t,n){return ae(ne,e,t,n)}function ce(e,t,n){return ae(te,e,t,n)}function le(e){return(e%360+360)%360}function ue(e){let t=ee.exec(e),n=255,r;if(!t)return;t[5]!==r&&(n=t[6]?h(+t[5]):g(+t[5]));let i=le(+t[2]),a=t[3]/100,o=t[4]/100;return r=t[1]===`hwb`?se(i,a,o):t[1]===`hsv`?ce(i,a,o):oe(i,a,o),{r:r[0],g:r[1],b:r[2],a:n}}function de(e,t){var n=ie(e);n[0]=le(n[0]+t),n=oe(n),e.r=n[0],e.g=n[1],e.b=n[2]}function fe(e){if(!e)return;let t=ie(e),n=t[0],r=v(t[1]),i=v(t[2]);return e.a<255?`hsla(${n}, ${r}%, ${i}%, ${_(e.a)})`:`hsl(${n}, ${r}%, ${i}%)`}var pe={x:`dark`,Z:`light`,Y:`re`,X:`blu`,W:`gr`,V:`medium`,U:`slate`,A:`ee`,T:`ol`,S:`or`,B:`ra`,C:`lateg`,D:`ights`,R:`in`,Q:`turquois`,E:`hi`,P:`ro`,O:`al`,N:`le`,M:`de`,L:`yello`,F:`en`,K:`ch`,G:`arks`,H:`ea`,I:`ightg`,J:`wh`},me={OiceXe:`f0f8ff`,antiquewEte:`faebd7`,aqua:`ffff`,aquamarRe:`7fffd4`,azuY:`f0ffff`,beige:`f5f5dc`,bisque:`ffe4c4`,black:`0`,blanKedOmond:`ffebcd`,Xe:`ff`,XeviTet:`8a2be2`,bPwn:`a52a2a`,burlywood:`deb887`,caMtXe:`5f9ea0`,KartYuse:`7fff00`,KocTate:`d2691e`,cSO:`ff7f50`,cSnflowerXe:`6495ed`,cSnsilk:`fff8dc`,crimson:`dc143c`,cyan:`ffff`,xXe:`8b`,xcyan:`8b8b`,xgTMnPd:`b8860b`,xWay:`a9a9a9`,xgYF:`6400`,xgYy:`a9a9a9`,xkhaki:`bdb76b`,xmagFta:`8b008b`,xTivegYF:`556b2f`,xSange:`ff8c00`,xScEd:`9932cc`,xYd:`8b0000`,xsOmon:`e9967a`,xsHgYF:`8fbc8f`,xUXe:`483d8b`,xUWay:`2f4f4f`,xUgYy:`2f4f4f`,xQe:`ced1`,xviTet:`9400d3`,dAppRk:`ff1493`,dApskyXe:`bfff`,dimWay:`696969`,dimgYy:`696969`,dodgerXe:`1e90ff`,fiYbrick:`b22222`,flSOwEte:`fffaf0`,foYstWAn:`228b22`,fuKsia:`ff00ff`,gaRsbSo:`dcdcdc`,ghostwEte:`f8f8ff`,gTd:`ffd700`,gTMnPd:`daa520`,Way:`808080`,gYF:`8000`,gYFLw:`adff2f`,gYy:`808080`,honeyMw:`f0fff0`,hotpRk:`ff69b4`,RdianYd:`cd5c5c`,Rdigo:`4b0082`,ivSy:`fffff0`,khaki:`f0e68c`,lavFMr:`e6e6fa`,lavFMrXsh:`fff0f5`,lawngYF:`7cfc00`,NmoncEffon:`fffacd`,ZXe:`add8e6`,ZcSO:`f08080`,Zcyan:`e0ffff`,ZgTMnPdLw:`fafad2`,ZWay:`d3d3d3`,ZgYF:`90ee90`,ZgYy:`d3d3d3`,ZpRk:`ffb6c1`,ZsOmon:`ffa07a`,ZsHgYF:`20b2aa`,ZskyXe:`87cefa`,ZUWay:`778899`,ZUgYy:`778899`,ZstAlXe:`b0c4de`,ZLw:`ffffe0`,lime:`ff00`,limegYF:`32cd32`,lRF:`faf0e6`,magFta:`ff00ff`,maPon:`800000`,VaquamarRe:`66cdaa`,VXe:`cd`,VScEd:`ba55d3`,VpurpN:`9370db`,VsHgYF:`3cb371`,VUXe:`7b68ee`,VsprRggYF:`fa9a`,VQe:`48d1cc`,VviTetYd:`c71585`,midnightXe:`191970`,mRtcYam:`f5fffa`,mistyPse:`ffe4e1`,moccasR:`ffe4b5`,navajowEte:`ffdead`,navy:`80`,Tdlace:`fdf5e6`,Tive:`808000`,TivedBb:`6b8e23`,Sange:`ffa500`,SangeYd:`ff4500`,ScEd:`da70d6`,pOegTMnPd:`eee8aa`,pOegYF:`98fb98`,pOeQe:`afeeee`,pOeviTetYd:`db7093`,papayawEp:`ffefd5`,pHKpuff:`ffdab9`,peru:`cd853f`,pRk:`ffc0cb`,plum:`dda0dd`,powMrXe:`b0e0e6`,purpN:`800080`,YbeccapurpN:`663399`,Yd:`ff0000`,Psybrown:`bc8f8f`,PyOXe:`4169e1`,saddNbPwn:`8b4513`,sOmon:`fa8072`,sandybPwn:`f4a460`,sHgYF:`2e8b57`,sHshell:`fff5ee`,siFna:`a0522d`,silver:`c0c0c0`,skyXe:`87ceeb`,UXe:`6a5acd`,UWay:`708090`,UgYy:`708090`,snow:`fffafa`,sprRggYF:`ff7f`,stAlXe:`4682b4`,tan:`d2b48c`,teO:`8080`,tEstN:`d8bfd8`,tomato:`ff6347`,Qe:`40e0d0`,viTet:`ee82ee`,JHt:`f5deb3`,wEte:`ffffff`,wEtesmoke:`f5f5f5`,Lw:`ffff00`,LwgYF:`9acd32`};function he(){let e={},t=Object.keys(me),n=Object.keys(pe),r,i,a,o,s;for(r=0;r>16&255,a>>8&255,a&255]}return e}var ge;function _e(e){ge||(ge=he(),ge.transparent=[0,0,0,0]);let t=ge[e.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}var ve=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function ye(e){let t=ve.exec(e),n=255,r,i,a;if(t){if(t[7]!==r){let e=+t[7];n=t[8]?h(e):m(e*255,0,255)}return r=+t[1],i=+t[3],a=+t[5],r=255&(t[2]?h(r):m(r,0,255)),i=255&(t[4]?h(i):m(i,0,255)),a=255&(t[6]?h(a):m(a,0,255)),{r,g:i,b:a,a:n}}}function be(e){return e&&(e.a<255?`rgba(${e.r}, ${e.g}, ${e.b}, ${_(e.a)})`:`rgb(${e.r}, ${e.g}, ${e.b})`)}var xe=e=>e<=.0031308?e*12.92:e**(1/2.4)*1.055-.055,Se=e=>e<=.04045?e/12.92:((e+.055)/1.055)**2.4;function Ce(e,t,n){let r=Se(_(e.r)),i=Se(_(e.g)),a=Se(_(e.b));return{r:g(xe(r+n*(Se(_(t.r))-r))),g:g(xe(i+n*(Se(_(t.g))-i))),b:g(xe(a+n*(Se(_(t.b))-a))),a:e.a+n*(t.a-e.a)}}function we(e,t,n){if(e){let r=ie(e);r[t]=Math.max(0,Math.min(r[t]+r[t]*n,t===0?360:1)),r=oe(r),e.r=r[0],e.g=r[1],e.b=r[2]}}function Te(e,t){return e&&Object.assign(t||{},e)}function Ee(e){var t={r:0,g:0,b:0,a:255};return Array.isArray(e)?e.length>=3&&(t={r:e[0],g:e[1],b:e[2],a:255},e.length>3&&(t.a=g(e[3]))):(t=Te(e,{r:0,g:0,b:0,a:1}),t.a=g(t.a)),t}function De(e){return e.charAt(0)===`r`?ye(e):ue(e)}var Oe=class e{constructor(t){if(t instanceof e)return t;let n=typeof t,r;n===`object`?r=Ee(t):n===`string`&&(r=T(t)||_e(t)||De(t)),this._rgb=r,this._valid=!!r}get valid(){return this._valid}get rgb(){var e=Te(this._rgb);return e&&(e.a=_(e.a)),e}set rgb(e){this._rgb=Ee(e)}rgbString(){return this._valid?be(this._rgb):void 0}hexString(){return this._valid?D(this._rgb):void 0}hslString(){return this._valid?fe(this._rgb):void 0}mix(e,t){if(e){let n=this.rgb,r=e.rgb,i,a=t===i?.5:t,o=2*a-1,s=n.a-r.a,c=((o*s===-1?o:(o+s)/(1+o*s))+1)/2;i=1-c,n.r=255&c*n.r+i*r.r+.5,n.g=255&c*n.g+i*r.g+.5,n.b=255&c*n.b+i*r.b+.5,n.a=a*n.a+(1-a)*r.a,this.rgb=n}return this}interpolate(e,t){return e&&(this._rgb=Ce(this._rgb,e._rgb,t)),this}clone(){return new e(this.rgb)}alpha(e){return this._rgb.a=g(e),this}clearer(e){let t=this._rgb;return t.a*=1-e,this}greyscale(){let e=this._rgb;return e.r=e.g=e.b=p(e.r*.3+e.g*.59+e.b*.11),this}opaquer(e){let t=this._rgb;return t.a*=1+e,this}negate(){let e=this._rgb;return e.r=255-e.r,e.g=255-e.g,e.b=255-e.b,this}lighten(e){return we(this._rgb,2,e),this}darken(e){return we(this._rgb,2,-e),this}saturate(e){return we(this._rgb,1,e),this}desaturate(e){return we(this._rgb,1,-e),this}rotate(e){return de(this._rgb,e),this}};function ke(){}var Ae=(()=>{let e=0;return()=>e++})();function k(e){return e==null}function A(e){if(Array.isArray&&Array.isArray(e))return!0;let t=Object.prototype.toString.call(e);return t.slice(0,7)===`[object`&&t.slice(-6)===`Array]`}function j(e){return e!==null&&Object.prototype.toString.call(e)===`[object Object]`}function M(e){return(typeof e==`number`||e instanceof Number)&&isFinite(+e)}function N(e,t){return M(e)?e:t}function P(e,t){return e===void 0?t:e}var je=(e,t)=>typeof e==`string`&&e.endsWith(`%`)?parseFloat(e)/100:+e/t,Me=(e,t)=>typeof e==`string`&&e.endsWith(`%`)?parseFloat(e)/100*t:+e;function F(e,t,n){if(e&&typeof e.call==`function`)return e.apply(n,t)}function I(e,t,n,r){let i,a,o;if(A(e))if(a=e.length,r)for(i=a-1;i>=0;i--)t.call(n,e[i],i);else for(i=0;ie,x:e=>e.x,y:e=>e.y};function Ve(e){let t=e.split(`.`),n=[],r=``;for(let e of t)r+=e,r.endsWith(`\\`)?r=r.slice(0,-1)+`.`:(n.push(r),r=``);return n}function He(e){let t=Ve(e);return e=>{for(let n of t){if(n===``)break;e&&=e[n]}return e}}function Ue(e,t){return(Be[t]||(Be[t]=He(t)))(e)}function We(e){return e.charAt(0).toUpperCase()+e.slice(1)}var Ge=e=>e!==void 0,Ke=e=>typeof e==`function`,qe=(e,t)=>{if(e.size!==t.size)return!1;for(let n of e)if(!t.has(n))return!1;return!0};function Je(e){return e.type===`mouseup`||e.type===`click`||e.type===`contextmenu`}var L=Math.PI,R=2*L,Ye=R+L,Xe=1/0,Ze=L/180,z=L/2,Qe=L/4,$e=L*2/3,et=Math.log10,B=Math.sign;function tt(e,t,n){return Math.abs(e-t)e-t).pop(),t}function it(e){return typeof e==`symbol`||typeof e==`object`&&!!e&&!(Symbol.toPrimitive in e||`toString`in e||`valueOf`in e)}function at(e){return!it(e)&&!isNaN(parseFloat(e))&&isFinite(e)}function ot(e,t){let n=Math.round(e);return n-t<=e&&n+t>=e}function st(e,t,n){let r,i,a;for(r=0,i=e.length;rc&&l=Math.min(t,n)-r&&e<=Math.max(t,n)+r}function ht(e,t,n){n||=(n=>e[n]1;)a=i+r>>1,n(a)?i=a:r=a;return{lo:i,hi:r}}var gt=(e,t,n,r)=>ht(e,n,r?r=>{let i=e[r][t];return ie[r][t]ht(e,n,r=>e[r][t]>=n);function vt(e,t,n){let r=0,i=e.length;for(;rr&&e[i-1]>n;)i--;return r>0||i{let n=`_onData`+We(t),r=e[t];Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value(...t){let i=r.apply(this,t);return e._chartjs.listeners.forEach(e=>{typeof e[n]==`function`&&e[n](...t)}),i}})})}function xt(e,t){let n=e._chartjs;if(!n)return;let r=n.listeners,i=r.indexOf(t);i!==-1&&r.splice(i,1),!(r.length>0)&&(yt.forEach(t=>{delete e[t]}),delete e._chartjs)}function St(e){let t=new Set(e);return t.size===e.length?e:Array.from(t)}var Ct=function(){return typeof window>`u`?function(e){return e()}:window.requestAnimationFrame}();function wt(e,t){let n=[],r=!1;return function(...i){n=i,r||(r=!0,Ct.call(window,()=>{r=!1,e.apply(t,n)}))}}function Tt(e,t){let n;return function(...r){return t?(clearTimeout(n),n=setTimeout(e,t,r)):e.apply(this,r),t}}var Et=e=>e===`start`?`left`:e===`end`?`right`:`center`,G=(e,t,n)=>e===`start`?t:e===`end`?n:(t+n)/2,Dt=(e,t,n,r)=>e===(r?`left`:`right`)?n:e===`center`?(t+n)/2:t;function Ot(e,t,n){let r=t.length,i=0,a=r;if(e._sorted){let{iScale:o,vScale:s,_parsed:c}=e,l=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null,u=o.axis,{min:d,max:f,minDefined:p,maxDefined:m}=o.getUserBounds();if(p){if(i=Math.min(gt(c,u,d).lo,n?r:gt(t,u,o.getPixelForValue(d)).lo),l){let e=c.slice(0,i+1).reverse().findIndex(e=>!k(e[s.axis]));i-=Math.max(0,e)}i=U(i,0,r-1)}if(m){let e=Math.max(gt(c,o.axis,f,!0).hi+1,n?0:gt(t,u,o.getPixelForValue(f),!0).hi+1);if(l){let t=c.slice(e-1).findIndex(e=>!k(e[s.axis]));e+=Math.max(0,t)}a=U(e,i,r)-i}else a=r-i}return{start:i,count:a}}function kt(e){let{xScale:t,yScale:n,_scaleRanges:r}=e,i={xmin:t.min,xmax:t.max,ymin:n.min,ymax:n.max};if(!r)return e._scaleRanges=i,!0;let a=r.xmin!==t.min||r.xmax!==t.max||r.ymin!==n.min||r.ymax!==n.max;return Object.assign(r,i),a}var At=e=>e===0||e===1,jt=(e,t,n)=>-(2**(10*--e)*Math.sin((e-t)*R/n)),Mt=(e,t,n)=>2**(-10*e)*Math.sin((e-t)*R/n)+1,Nt={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>-e*(e-2),easeInOutQuad:e=>(e/=.5)<1?.5*e*e:-.5*(--e*(e-2)-1),easeInCubic:e=>e*e*e,easeOutCubic:e=>--e*e*e+1,easeInOutCubic:e=>(e/=.5)<1?.5*e*e*e:.5*((e-=2)*e*e+2),easeInQuart:e=>e*e*e*e,easeOutQuart:e=>-(--e*e*e*e-1),easeInOutQuart:e=>(e/=.5)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2),easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>--e*e*e*e*e+1,easeInOutQuint:e=>(e/=.5)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2),easeInSine:e=>-Math.cos(e*z)+1,easeOutSine:e=>Math.sin(e*z),easeInOutSine:e=>-.5*(Math.cos(L*e)-1),easeInExpo:e=>e===0?0:2**(10*(e-1)),easeOutExpo:e=>e===1?1:-(2**(-10*e))+1,easeInOutExpo:e=>At(e)?e:e<.5?.5*2**(10*(e*2-1)):.5*(-(2**(-10*(e*2-1)))+2),easeInCirc:e=>e>=1?e:-(Math.sqrt(1-e*e)-1),easeOutCirc:e=>Math.sqrt(1- --e*e),easeInOutCirc:e=>(e/=.5)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1),easeInElastic:e=>At(e)?e:jt(e,.075,.3),easeOutElastic:e=>At(e)?e:Mt(e,.075,.3),easeInOutElastic(e){let t=.1125,n=.45;return At(e)?e:e<.5?.5*jt(e*2,t,n):.5+.5*Mt(e*2-1,t,n)},easeInBack(e){let t=1.70158;return e*e*((t+1)*e-t)},easeOutBack(e){let t=1.70158;return--e*e*((t+1)*e+t)+1},easeInOutBack(e){let t=1.70158;return(e/=.5)<1?.5*(e*e*(((t*=1.525)+1)*e-t)):.5*((e-=2)*e*(((t*=1.525)+1)*e+t)+2)},easeInBounce:e=>1-Nt.easeOutBounce(1-e),easeOutBounce(e){let t=7.5625,n=2.75;return e<1/n?t*e*e:e<2/n?t*(e-=1.5/n)*e+.75:e<2.5/n?t*(e-=2.25/n)*e+.9375:t*(e-=2.625/n)*e+.984375},easeInOutBounce:e=>e<.5?Nt.easeInBounce(e*2)*.5:Nt.easeOutBounce(e*2-1)*.5+.5};function Pt(e){if(e&&typeof e==`object`){let t=e.toString();return t===`[object CanvasPattern]`||t===`[object CanvasGradient]`}return!1}function Ft(e){return Pt(e)?e:new Oe(e)}function It(e){return Pt(e)?e:new Oe(e).saturate(.5).darken(.1).hexString()}var Lt=[`x`,`y`,`borderWidth`,`radius`,`tension`],Rt=[`color`,`borderColor`,`backgroundColor`];function zt(e){e.set(`animation`,{delay:void 0,duration:1e3,easing:`easeOutQuart`,fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),e.describe(`animation`,{_fallback:!1,_indexable:!1,_scriptable:e=>e!==`onProgress`&&e!==`onComplete`&&e!==`fn`}),e.set(`animations`,{colors:{type:`color`,properties:Rt},numbers:{type:`number`,properties:Lt}}),e.describe(`animations`,{_fallback:`animation`}),e.set(`transitions`,{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:`transparent`},visible:{type:`boolean`,duration:0}}},hide:{animations:{colors:{to:`transparent`},visible:{type:`boolean`,easing:`linear`,fn:e=>e|0}}}})}function Bt(e){e.set(`layout`,{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}var Vt=new Map;function Ht(e,t){t||={};let n=e+JSON.stringify(t),r=Vt.get(n);return r||(r=new Intl.NumberFormat(e,t),Vt.set(n,r)),r}function Ut(e,t,n){return Ht(t,n).format(e)}var Wt={values(e){return A(e)?e:``+e},numeric(e,t,n){if(e===0)return`0`;let r=this.chart.options.locale,i,a=e;if(n.length>1){let t=Math.max(Math.abs(n[0].value),Math.abs(n[n.length-1].value));(t<1e-4||t>0x38d7ea4c68000)&&(i=`scientific`),a=Gt(e,n)}let o=et(Math.abs(a)),s=isNaN(o)?1:Math.max(Math.min(-1*Math.floor(o),20),0),c={notation:i,minimumFractionDigits:s,maximumFractionDigits:s};return Object.assign(c,this.options.ticks.format),Ut(e,r,c)},logarithmic(e,t,n){if(e===0)return`0`;let r=n[t].significand||e/10**Math.floor(et(e));return[1,2,3,5,10,15].includes(r)||t>.8*n.length?Wt.numeric.call(this,e,t,n):``}};function Gt(e,t){let n=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(n)>=1&&e!==Math.floor(e)&&(n=e-Math.floor(e)),n}var Kt={formatters:Wt};function qt(e){e.set(`scale`,{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:`ticks`,clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(e,t)=>t.lineWidth,tickColor:(e,t)=>t.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:``,padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:``,padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:Kt.formatters.values,minor:{},major:{},align:`center`,crossAlign:`near`,showLabelBackdrop:!1,backdropColor:`rgba(255, 255, 255, 0.75)`,backdropPadding:2}}),e.route(`scale.ticks`,`color`,``,`color`),e.route(`scale.grid`,`color`,``,`borderColor`),e.route(`scale.border`,`color`,``,`borderColor`),e.route(`scale.title`,`color`,``,`color`),e.describe(`scale`,{_fallback:!1,_scriptable:e=>!e.startsWith(`before`)&&!e.startsWith(`after`)&&e!==`callback`&&e!==`parser`,_indexable:e=>e!==`borderDash`&&e!==`tickBorderDash`&&e!==`dash`}),e.describe(`scales`,{_fallback:`scale`}),e.describe(`scale.ticks`,{_scriptable:e=>e!==`backdropPadding`&&e!==`callback`,_indexable:e=>e!==`backdropPadding`})}var Jt=Object.create(null),Yt=Object.create(null);function Xt(e,t){if(!t)return e;let n=t.split(`.`);for(let t=0,r=n.length;te.chart.platform.getDevicePixelRatio(),this.elements={},this.events=[`mousemove`,`mouseout`,`click`,`touchstart`,`touchmove`],this.font={family:`'Helvetica Neue', 'Helvetica', 'Arial', sans-serif`,size:12,style:`normal`,lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(e,t)=>It(t.backgroundColor),this.hoverBorderColor=(e,t)=>It(t.borderColor),this.hoverColor=(e,t)=>It(t.color),this.indexAxis=`x`,this.interaction={mode:`nearest`,intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(e),this.apply(t)}set(e,t){return Zt(this,e,t)}get(e){return Xt(this,e)}describe(e,t){return Zt(Yt,e,t)}override(e,t){return Zt(Jt,e,t)}route(e,t,n,r){let i=Xt(this,e),a=Xt(this,n),o=`_`+t;Object.defineProperties(i,{[o]:{value:i[t],writable:!0},[t]:{enumerable:!0,get(){let e=this[o],t=a[r];return j(e)?Object.assign({},t,e):P(e,t)},set(e){this[o]=e}}})}apply(e){e.forEach(e=>e(this))}}({_scriptable:e=>!e.startsWith(`on`),_indexable:e=>e!==`events`,hover:{_fallback:`interaction`},interaction:{_scriptable:!1,_indexable:!1}},[zt,Bt,qt]);function Qt(e){return!e||k(e.size)||k(e.family)?null:(e.style?e.style+` `:``)+(e.weight?e.weight+` `:``)+e.size+`px `+e.family}function $t(e,t,n,r,i){let a=t[i];return a||(a=t[i]=e.measureText(i).width,n.push(i)),a>r&&(r=a),r}function en(e,t,n,r){r||={};let i=r.data=r.data||{},a=r.garbageCollect=r.garbageCollect||[];r.font!==t&&(i=r.data={},a=r.garbageCollect=[],r.font=t),e.save(),e.font=t;let o=0,s=n.length,c,l,u,d,f;for(c=0;cn.length){for(c=0;c0&&e.stroke()}}function on(e,t,n){return n||=.5,!t||e&&e.x>t.left-n&&e.xt.top-n&&e.y0&&a.strokeColor!==``,c,l;for(e.save(),e.font=i.string,dn(e,a),c=0;c+e||0;function bn(e,t){let n={},r=j(t),i=r?Object.keys(t):t,a=j(e)?r?n=>P(e[n],e[t[n]]):t=>e[t]:()=>e;for(let e of i)n[e]=yn(a(e));return n}function xn(e){return bn(e,{top:`y`,right:`x`,bottom:`y`,left:`x`})}function Sn(e){return bn(e,[`topLeft`,`topRight`,`bottomLeft`,`bottomRight`])}function q(e){let t=xn(e);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function J(e,t){e||={},t||=K.font;let n=P(e.size,t.size);typeof n==`string`&&(n=parseInt(n,10));let r=P(e.style,t.style);r&&!(``+r).match(_n)&&(console.warn(`Invalid font style specified: "`+r+`"`),r=void 0);let i={family:P(e.family,t.family),lineHeight:vn(P(e.lineHeight,t.lineHeight),n),size:n,style:r,weight:P(e.weight,t.weight),string:``};return i.string=Qt(i),i}function Cn(e,t,n,r){let i=!0,a,o,s;for(a=0,o=e.length;an&&e===0?0:e+t;return{min:o(r,-Math.abs(a)),max:o(i,a)}}function Tn(e,t){return Object.assign(Object.create(e),t)}function En(e,t=[``],n,r,i=()=>e[0]){let a=n||e;return r===void 0&&(r=Hn(`_fallback`,e)),new Proxy({[Symbol.toStringTag]:`Object`,_cacheable:!0,_scopes:e,_rootScopes:a,_fallback:r,_getTarget:i,override:n=>En([n,...e],t,a,r)},{deleteProperty(t,n){return delete t[n],delete t._keys,delete e[0][n],!0},get(n,r){return jn(n,r,()=>Vn(r,t,e,n))},getOwnPropertyDescriptor(e,t){return Reflect.getOwnPropertyDescriptor(e._scopes[0],t)},getPrototypeOf(){return Reflect.getPrototypeOf(e[0])},has(e,t){return Un(e).includes(t)},ownKeys(e){return Un(e)},set(e,t,n){let r=e._storage||=i();return e[t]=r[t]=n,delete e._keys,!0}})}function Dn(e,t,n,r){let i={_cacheable:!1,_proxy:e,_context:t,_subProxy:n,_stack:new Set,_descriptors:On(e,r),setContext:t=>Dn(e,t,n,r),override:i=>Dn(e.override(i),t,n,r)};return new Proxy(i,{deleteProperty(t,n){return delete t[n],delete e[n],!0},get(e,t,n){return jn(e,t,()=>Mn(e,t,n))},getOwnPropertyDescriptor(t,n){return t._descriptors.allKeys?Reflect.has(e,n)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(e,n)},getPrototypeOf(){return Reflect.getPrototypeOf(e)},has(t,n){return Reflect.has(e,n)},ownKeys(){return Reflect.ownKeys(e)},set(t,n,r){return e[n]=r,delete t[n],!0}})}function On(e,t={scriptable:!0,indexable:!0}){let{_scriptable:n=t.scriptable,_indexable:r=t.indexable,_allKeys:i=t.allKeys}=e;return{allKeys:i,scriptable:n,indexable:r,isScriptable:Ke(n)?n:()=>n,isIndexable:Ke(r)?r:()=>r}}var kn=(e,t)=>e?e+We(t):t,An=(e,t)=>j(t)&&e!==`adapters`&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function jn(e,t,n){if(Object.prototype.hasOwnProperty.call(e,t)||t===`constructor`)return e[t];let r=n();return e[t]=r,r}function Mn(e,t,n){let{_proxy:r,_context:i,_subProxy:a,_descriptors:o}=e,s=r[t];return Ke(s)&&o.isScriptable(t)&&(s=Nn(t,s,e,n)),A(s)&&s.length&&(s=Pn(t,s,e,o.isIndexable)),An(t,s)&&(s=Dn(s,i,a&&a[t],o)),s}function Nn(e,t,n,r){let{_proxy:i,_context:a,_subProxy:o,_stack:s}=n;if(s.has(e))throw Error(`Recursion detected: `+Array.from(s).join(`->`)+`->`+e);s.add(e);let c=t(a,o||r);return s.delete(e),An(e,c)&&(c=Rn(i._scopes,i,e,c)),c}function Pn(e,t,n,r){let{_proxy:i,_context:a,_subProxy:o,_descriptors:s}=n;if(a.index!==void 0&&r(e))return t[a.index%t.length];if(j(t[0])){let n=t,r=i._scopes.filter(e=>e!==n);t=[];for(let c of n){let n=Rn(r,i,e,c);t.push(Dn(n,a,o&&o[e],s))}}return t}function Fn(e,t,n){return Ke(e)?e(t,n):e}var In=(e,t)=>e===!0?t:typeof e==`string`?Ue(t,e):void 0;function Ln(e,t,n,r,i){for(let a of t){let t=In(n,a);if(t){e.add(t);let a=Fn(t._fallback,n,i);if(a!==void 0&&a!==n&&a!==r)return a}else if(t===!1&&r!==void 0&&n!==r)return null}return!1}function Rn(e,t,n,r){let i=t._rootScopes,a=Fn(t._fallback,n,r),o=[...e,...i],s=new Set;s.add(r);let c=zn(s,o,n,a||n,r);return c===null||a!==void 0&&a!==n&&(c=zn(s,o,a,c,r),c===null)?!1:En(Array.from(s),[``],i,a,()=>Bn(t,n,r))}function zn(e,t,n,r,i){for(;n;)n=Ln(e,t,n,r,i);return n}function Bn(e,t,n){let r=e._getTarget();t in r||(r[t]={});let i=r[t];return A(i)&&j(n)?n:i||{}}function Vn(e,t,n,r){let i;for(let a of t)if(i=Hn(kn(a,e),n),i!==void 0)return An(e,i)?Rn(n,r,e,i):i}function Hn(e,t){for(let n of t){if(!n)continue;let t=n[e];if(t!==void 0)return t}}function Un(e){let t=e._keys;return t||=e._keys=Wn(e._scopes),t}function Wn(e){let t=new Set;for(let n of e)for(let e of Object.keys(n).filter(e=>!e.startsWith(`_`)))t.add(e);return Array.from(t)}var Gn=2**-52||1e-14,Kn=(e,t)=>te===`x`?`y`:`x`;function Jn(e,t,n,r){let i=e.skip?t:e,a=t,o=n.skip?t:n,s=dt(a,i),c=dt(o,a),l=s/(s+c),u=c/(s+c);l=isNaN(l)?0:l,u=isNaN(u)?0:u;let d=r*l,f=r*u;return{previous:{x:a.x-d*(o.x-i.x),y:a.y-d*(o.y-i.y)},next:{x:a.x+f*(o.x-i.x),y:a.y+f*(o.y-i.y)}}}function Yn(e,t,n){let r=e.length,i,a,o,s,c,l=Kn(e,0);for(let u=0;u!e.skip)),t.cubicInterpolationMode===`monotone`)Zn(e,i);else{let n=r?e[e.length-1]:e[0];for(a=0,o=e.length;ae.ownerDocument.defaultView.getComputedStyle(e,null);function ar(e,t){return ir(e).getPropertyValue(t)}var or=[`top`,`right`,`bottom`,`left`];function sr(e,t,n){let r={};n=n?`-`+n:``;for(let i=0;i<4;i++){let a=or[i];r[a]=parseFloat(e[t+`-`+a+n])||0}return r.width=r.left+r.right,r.height=r.top+r.bottom,r}var cr=(e,t,n)=>(e>0||t>0)&&(!n||!n.shadowRoot);function lr(e,t){let n=e.touches,r=n&&n.length?n[0]:e,{offsetX:i,offsetY:a}=r,o=!1,s,c;if(cr(i,a,e.target))s=i,c=a;else{let e=t.getBoundingClientRect();s=r.clientX-e.left,c=r.clientY-e.top,o=!0}return{x:s,y:c,box:o}}function ur(e,t){if(`native`in e)return e;let{canvas:n,currentDevicePixelRatio:r}=t,i=ir(n),a=i.boxSizing===`border-box`,o=sr(i,`padding`),s=sr(i,`border`,`width`),{x:c,y:l,box:u}=lr(e,n),d=o.left+(u&&s.left),f=o.top+(u&&s.top),{width:p,height:m}=t;return a&&(p-=o.width+s.width,m-=o.height+s.height),{x:Math.round((c-d)/p*n.width/r),y:Math.round((l-f)/m*n.height/r)}}function dr(e,t,n){let r,i;if(t===void 0||n===void 0){let a=e&&nr(e);if(!a)t=e.clientWidth,n=e.clientHeight;else{let e=a.getBoundingClientRect(),o=ir(a),s=sr(o,`border`,`width`),c=sr(o,`padding`);t=e.width-c.width-s.width,n=e.height-c.height-s.height,r=rr(o.maxWidth,a,`clientWidth`),i=rr(o.maxHeight,a,`clientHeight`)}}return{width:t,height:n,maxWidth:r||Xe,maxHeight:i||Xe}}var fr=e=>Math.round(e*10)/10;function pr(e,t,n,r){let i=ir(e),a=sr(i,`margin`),o=rr(i.maxWidth,e,`clientWidth`)||Xe,s=rr(i.maxHeight,e,`clientHeight`)||Xe,c=dr(e,t,n),{width:l,height:u}=c;if(i.boxSizing===`content-box`){let e=sr(i,`border`,`width`),t=sr(i,`padding`);l-=t.width+e.width,u-=t.height+e.height}return l=Math.max(0,l-a.width),u=Math.max(0,r?l/r:u-a.height),l=fr(Math.min(l,o,c.maxWidth)),u=fr(Math.min(u,s,c.maxHeight)),l&&!u&&(u=fr(l/2)),(t!==void 0||n!==void 0)&&r&&c.height&&u>c.height&&(u=c.height,l=fr(Math.floor(u*r))),{width:l,height:u}}function mr(e,t,n){let r=t||1,i=fr(e.height*r),a=fr(e.width*r);e.height=fr(e.height),e.width=fr(e.width);let o=e.canvas;return o.style&&(n||!o.style.height&&!o.style.width)&&(o.style.height=`${e.height}px`,o.style.width=`${e.width}px`),e.currentDevicePixelRatio!==r||o.height!==i||o.width!==a?(e.currentDevicePixelRatio=r,o.height=i,o.width=a,e.ctx.setTransform(r,0,0,r,0,0),!0):!1}var hr=function(){let e=!1;try{let t={get passive(){return e=!0,!1}};tr()&&(window.addEventListener(`test`,null,t),window.removeEventListener(`test`,null,t))}catch{}return e}();function gr(e,t){let n=ar(e,t),r=n&&n.match(/^(\d+)(\.\d+)?px$/);return r?+r[1]:void 0}function _r(e,t,n,r){return{x:e.x+n*(t.x-e.x),y:e.y+n*(t.y-e.y)}}function vr(e,t,n,r){return{x:e.x+n*(t.x-e.x),y:r===`middle`?n<.5?e.y:t.y:r===`after`?n<1?e.y:t.y:n>0?t.y:e.y}}function yr(e,t,n,r){let i={x:e.cp2x,y:e.cp2y},a={x:t.cp1x,y:t.cp1y},o=_r(e,i,n),s=_r(i,a,n),c=_r(a,t,n);return _r(_r(o,s,n),_r(s,c,n),n)}var br=function(e,t){return{x(n){return e+e+t-n},setWidth(e){t=e},textAlign(e){return e===`center`?e:e===`right`?`left`:`right`},xPlus(e,t){return e-t},leftForLtr(e,t){return e-t}}},xr=function(){return{x(e){return e},setWidth(e){},textAlign(e){return e},xPlus(e,t){return e+t},leftForLtr(e,t){return e}}};function Sr(e,t,n){return e?br(t,n):xr()}function Cr(e,t){let n,r;(t===`ltr`||t===`rtl`)&&(n=e.canvas.style,r=[n.getPropertyValue(`direction`),n.getPropertyPriority(`direction`)],n.setProperty(`direction`,t,`important`),e.prevTextDirection=r)}function wr(e,t){t!==void 0&&(delete e.prevTextDirection,e.canvas.style.setProperty(`direction`,t[0],t[1]))}function Tr(e){return e===`angle`?{between:pt,compare:ft,normalize:H}:{between:W,compare:(e,t)=>e-t,normalize:e=>e}}function Er({start:e,end:t,count:n,loop:r,style:i}){return{start:e%n,end:t%n,loop:r&&(t-e+1)%n===0,style:i}}function Dr(e,t,n){let{property:r,start:i,end:a}=n,{between:o,normalize:s}=Tr(r),c=t.length,{start:l,end:u,loop:d}=e,f,p;if(d){for(l+=c,u+=c,f=0,p=c;fc(i,y,_)&&s(i,y)!==0,x=()=>s(a,_)===0||c(a,y,_),S=()=>h||b(),C=()=>!h||x();for(let e=u,n=u;e<=d;++e)v=t[e%o],!v.skip&&(_=l(v[r]),_!==y&&(h=c(_,i,a),g===null&&S()&&(g=s(_,i)===0?e:n),g!==null&&C()&&(m.push(Er({start:g,end:e,loop:f,count:o,style:p})),g=null),n=e,y=_));return g!==null&&m.push(Er({start:g,end:d,loop:f,count:o,style:p})),m}function kr(e,t){let n=[],r=e.segments;for(let i=0;ii&&e[a%t].skip;)a--;return a%=t,{start:i,end:a}}function jr(e,t,n,r){let i=e.length,a=[],o=t,s=e[t],c;for(c=t+1;c<=n;++c){let n=e[c%i];n.skip||n.stop?s.skip||(r=!1,a.push({start:t%i,end:(c-1)%i,loop:r}),t=o=n.stop?c:null):(o=c,s.skip&&(t=c)),s=n}return o!==null&&a.push({start:t%i,end:o%i,loop:r}),a}function Mr(e,t){let n=e.points,r=e.options.spanGaps,i=n.length;if(!i)return[];let a=!!e._loop,{start:o,end:s}=Ar(n,i,a,r);return r===!0?Nr(e,[{start:o,end:s,loop:a}],n,t):Nr(e,jr(n,o,sr({chart:e,initial:t.initial,numSteps:a,currentStep:Math.min(n-t.start,a)}))}_refresh(){this._request||=(this._running=!0,Ct.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(e=Date.now()){let t=0;this._charts.forEach((n,r)=>{if(!n.running||!n.items.length)return;let i=n.items,a=i.length-1,o=!1,s;for(;a>=0;--a)s=i[a],s._active?(s._total>n.duration&&(n.duration=s._total),s.tick(e),o=!0):(i[a]=i[i.length-1],i.pop());o&&(r.draw(),this._notify(r,n,e,`progress`)),i.length||(n.running=!1,this._notify(r,n,e,`complete`),n.initial=!1),t+=i.length}),this._lastDate=e,t===0&&(this._running=!1)}_getAnims(e){let t=this._charts,n=t.get(e);return n||(n={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},t.set(e,n)),n}listen(e,t,n){this._getAnims(e).listeners[t].push(n)}add(e,t){!t||!t.length||this._getAnims(e).items.push(...t)}has(e){return this._getAnims(e).items.length>0}start(e){let t=this._charts.get(e);t&&(t.running=!0,t.start=Date.now(),t.duration=t.items.reduce((e,t)=>Math.max(e,t._duration),0),this._refresh())}running(e){if(!this._running)return!1;let t=this._charts.get(e);return!(!t||!t.running||!t.items.length)}stop(e){let t=this._charts.get(e);if(!t||!t.items.length)return;let n=t.items,r=n.length-1;for(;r>=0;--r)n[r].cancel();t.items=[],this._notify(e,t,Date.now(),`complete`)}remove(e){return this._charts.delete(e)}},Vr=`transparent`,Hr={boolean(e,t,n){return n>.5?t:e},color(e,t,n){let r=Ft(e||Vr),i=r.valid&&Ft(t||Vr);return i&&i.valid?i.mix(r,n).hexString():t},number(e,t,n){return e+(t-e)*n}},Ur=class{constructor(e,t,n,r){let i=t[n];r=Cn([e.to,r,i,e.from]);let a=Cn([e.from,i,r]);this._active=!0,this._fn=e.fn||Hr[e.type||typeof a],this._easing=Nt[e.easing]||Nt.linear,this._start=Math.floor(Date.now()+(e.delay||0)),this._duration=this._total=Math.floor(e.duration),this._loop=!!e.loop,this._target=t,this._prop=n,this._from=a,this._to=r,this._promises=void 0}active(){return this._active}update(e,t,n){if(this._active){this._notify(!1);let r=this._target[this._prop],i=n-this._start,a=this._duration-i;this._start=n,this._duration=Math.floor(Math.max(a,e.duration)),this._total+=i,this._loop=!!e.loop,this._to=Cn([e.to,t,r,e.from]),this._from=Cn([e.from,r,t])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(e){let t=e-this._start,n=this._duration,r=this._prop,i=this._from,a=this._loop,o=this._to,s;if(this._active=i!==o&&(a||t1?2-s:s,s=this._easing(Math.min(1,Math.max(0,s))),this._target[r]=this._fn(i,o,s)}wait(){let e=this._promises||=[];return new Promise((t,n)=>{e.push({res:t,rej:n})})}_notify(e){let t=e?`res`:`rej`,n=this._promises||[];for(let e=0;e{let i=e[r];if(!j(i))return;let a={};for(let e of t)a[e]=i[e];(A(i.properties)&&i.properties||[r]).forEach(e=>{(e===r||!n.has(e))&&n.set(e,a)})})}_animateOptions(e,t){let n=t.options,r=Kr(e,n);if(!r)return[];let i=this._createAnimations(r,n);return n.$shared&&Gr(e.options.$animations,n).then(()=>{e.options=n},()=>{}),i}_createAnimations(e,t){let n=this._properties,r=[],i=e.$animations||={},a=Object.keys(t),o=Date.now(),s;for(s=a.length-1;s>=0;--s){let c=a[s];if(c.charAt(0)===`$`)continue;if(c===`options`){r.push(...this._animateOptions(e,t));continue}let l=t[c],u=i[c],d=n.get(c);if(u)if(d&&u.active()){u.update(d,l,o);continue}else u.cancel();if(!d||!d.duration){e[c]=l;continue}i[c]=u=new Ur(d,e,c,l),r.push(u)}return r}update(e,t){if(this._properties.size===0){Object.assign(e,t);return}let n=this._createAnimations(e,t);if(n.length)return Br.add(this._chart,n),!0}};function Gr(e,t){let n=[],r=Object.keys(t);for(let t=0;t0||!n&&t<0)return i.index}return null}function ii(e,t){let{chart:n,_cachedMeta:r}=e,i=n._stacks||={},{iScale:a,vScale:o,index:s}=r,c=a.axis,l=o.axis,u=ei(a,o,r),d=t.length,f;for(let e=0;en[e].axis===t).shift()}function oi(e,t){return Tn(e,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:`default`,type:`dataset`})}function si(e,t,n){return Tn(e,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:n,index:t,mode:`default`,type:`data`})}function ci(e,t){let n=e.controller.index,r=e.vScale&&e.vScale.axis;if(r){t||=e._parsed;for(let e of t){let t=e._stacks;if(!t||t[r]===void 0||t[r][n]===void 0)return;delete t[r][n],t[r]._visualValues!==void 0&&t[r]._visualValues[n]!==void 0&&delete t[r]._visualValues[n]}}}var li=e=>e===`reset`||e===`none`,ui=(e,t)=>t?e:Object.assign({},e),di=(e,t,n)=>e&&!t.hidden&&t._stacked&&{keys:Xr(n,!0),values:null},fi=class{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(e,t){this.chart=e,this._ctx=e.ctx,this.index=t,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){let e=this._cachedMeta;this.configure(),this.linkScales(),e._stacked=$r(e.vScale,e),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled(`filler`)&&console.warn(`Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options`)}updateIndex(e){this.index!==e&&ci(this._cachedMeta),this.index=e}linkScales(){let e=this.chart,t=this._cachedMeta,n=this.getDataset(),r=(e,t,n,r)=>e===`x`?t:e===`r`?r:n,i=t.xAxisID=P(n.xAxisID,ai(e,`x`)),a=t.yAxisID=P(n.yAxisID,ai(e,`y`)),o=t.rAxisID=P(n.rAxisID,ai(e,`r`)),s=t.indexAxis,c=t.iAxisID=r(s,i,a,o),l=t.vAxisID=r(s,a,i,o);t.xScale=this.getScaleForId(i),t.yScale=this.getScaleForId(a),t.rScale=this.getScaleForId(o),t.iScale=this.getScaleForId(c),t.vScale=this.getScaleForId(l)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(e){return this.chart.scales[e]}_getOtherScale(e){let t=this._cachedMeta;return e===t.iScale?t.vScale:t.iScale}reset(){this._update(`reset`)}_destroy(){let e=this._cachedMeta;this._data&&xt(this._data,this),e._stacked&&ci(e)}_dataCheck(){let e=this.getDataset(),t=e.data||=[],n=this._data;if(j(t)){let e=this._cachedMeta;this._data=Qr(t,e)}else if(n!==t){if(n){xt(n,this);let e=this._cachedMeta;ci(e),e._parsed=[]}t&&Object.isExtensible(t)&&bt(t,this),this._syncList=[],this._data=t}}addElements(){let e=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(e.dataset=new this.datasetElementType)}buildOrUpdateElements(e){let t=this._cachedMeta,n=this.getDataset(),r=!1;this._dataCheck();let i=t._stacked;t._stacked=$r(t.vScale,t),t.stack!==n.stack&&(r=!0,ci(t),t.stack=n.stack),this._resyncElements(e),(r||i!==t._stacked)&&(ii(this,t._parsed),t._stacked=$r(t.vScale,t))}configure(){let e=this.chart.config,t=e.datasetScopeKeys(this._type),n=e.getOptionScopes(this.getDataset(),t,!0);this.options=e.createResolver(n,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(e,t){let{_cachedMeta:n,_data:r}=this,{iScale:i,_stacked:a}=n,o=i.axis,s=e===0&&t===r.length?!0:n._sorted,c=e>0&&n._parsed[e-1],l,u,d;if(this._parsing===!1)n._parsed=r,n._sorted=!0,d=r;else{d=A(r[e])?this.parseArrayData(n,r,e,t):j(r[e])?this.parseObjectData(n,r,e,t):this.parsePrimitiveData(n,r,e,t);let i=()=>u[o]===null||c&&u[o]t||u=0;--d)if(!p()){this.updateRangeFromParsed(c,e,f,s);break}}return c}getAllParsedValues(e){let t=this._cachedMeta._parsed,n=[],r,i,a;for(r=0,i=t.length;r=0&&ethis.getContext(n,r,t),u);return p.$shared&&(p.$shared=s,i[a]=Object.freeze(ui(p,s))),p}_resolveAnimations(e,t,n){let r=this.chart,i=this._cachedDataOpts,a=`animation-${t}`,o=i[a];if(o)return o;let s;if(r.options.animation!==!1){let r=this.chart.config,i=r.datasetAnimationScopeKeys(this._type,t),a=r.getOptionScopes(this.getDataset(),i);s=r.createResolver(a,this.getContext(e,n,t))}let c=new Wr(r,s&&s.animations);return s&&s._cacheable&&(i[a]=Object.freeze(c)),c}getSharedOptions(e){if(e.$shared)return this._sharedOptions||=Object.assign({},e)}includeOptions(e,t){return!t||li(e)||this.chart._animationsDisabled}_getSharedOptions(e,t){let n=this.resolveDataElementOptions(e,t),r=this._sharedOptions,i=this.getSharedOptions(n),a=this.includeOptions(t,i)||i!==r;return this.updateSharedOptions(i,t,n),{sharedOptions:i,includeOptions:a}}updateElement(e,t,n,r){li(r)?Object.assign(e,n):this._resolveAnimations(t,r).update(e,n)}updateSharedOptions(e,t,n){e&&!li(t)&&this._resolveAnimations(void 0,t).update(e,n)}_setStyle(e,t,n,r){e.active=r;let i=this.getStyle(t,r);this._resolveAnimations(t,n,r).update(e,{options:!r&&this.getSharedOptions(i)||i})}removeHoverStyle(e,t,n){this._setStyle(e,n,`active`,!1)}setHoverStyle(e,t,n){this._setStyle(e,n,`active`,!0)}_removeDatasetHoverStyle(){let e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,`active`,!1)}_setDatasetHoverStyle(){let e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,`active`,!0)}_resyncElements(e){let t=this._data,n=this._cachedMeta.data;for(let[e,t,n]of this._syncList)this[e](t,n);this._syncList=[];let r=n.length,i=t.length,a=Math.min(i,r);a&&this.parse(0,a),i>r?this._insertElements(r,i-r,e):i{for(e.length+=t,o=e.length-1;o>=a;o--)e[o]=e[o-t]};for(s(i),o=e;oe-t))}return e._cache.$bar}function mi(e){let t=e.iScale,n=pi(t,e.type),r=t._length,i,a,o,s,c=()=>{o===32767||o===-32768||(Ge(s)&&(r=Math.min(r,Math.abs(o-s)||r)),s=o)};for(i=0,a=n.length;i0?i[e-1]:null,s=eMath.abs(s)&&(c=s,l=o),t[n.axis]=l,t._custom={barStart:c,barEnd:l,start:i,end:a,min:o,max:s}}function vi(e,t,n,r){return A(e)?_i(e,t,n,r):t[n.axis]=n.parse(e,r),t}function yi(e,t,n,r){let i=e.iScale,a=e.vScale,o=i.getLabels(),s=i===a,c=[],l,u,d,f;for(l=n,u=n+r;l=n?1:-1):B(e)}function Si(e){let t,n,r,i,a;return e.horizontal?(t=e.base>e.x,n=`left`,r=`right`):(t=e.basee.controller.options.grouped),i=n.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(t),s=o&&o[n.axis],c=e=>{let t=e._parsed.find(e=>e[n.axis]===s),r=t&&t[e.vScale.axis];if(k(r)||isNaN(r))return!0};for(let n of r)if(!(t!==void 0&&c(n))&&((i===!1||a.indexOf(n.stack)===-1||i===void 0&&n.stack===void 0)&&a.push(n.stack),n.index===e))break;return a.length||a.push(void 0),a}_getStackCount(e){return this._getStacks(void 0,e).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){let e=this.chart.scales,t=this.chart.options.indexAxis;return Object.keys(e).filter(n=>e[n].axis===t).shift()}_getAxis(){let e={},t=this.getFirstScaleIdForIndexAxis();for(let n of this.chart.data.datasets)e[P(this.chart.options.indexAxis===`x`?n.xAxisID:n.yAxisID,t)]=!0;return Object.keys(e)}_getStackIndex(e,t,n){let r=this._getStacks(e,n),i=t===void 0?-1:r.indexOf(t);return i===-1?r.length-1:i}_getRuler(){let e=this.options,t=this._cachedMeta,n=t.iScale,r=[],i,a;for(i=0,a=t.data.length;ipt(e,s,c,!0)?1:Math.max(t,t*n,r,r*n),m=(e,t,r)=>pt(e,s,c,!0)?-1:Math.min(t,t*n,r,r*n),h=p(0,l,d),g=p(z,u,f),_=m(L,l,d),v=m(L+z,u,f);r=(h-_)/2,i=(g-v)/2,a=-(h+_)/2,o=-(g+v)/2}return{ratioX:r,ratioY:i,offsetX:a,offsetY:o}}var Ai=class extends fi{static id=`doughnut`;static defaults={datasetElementType:!1,dataElementType:`arc`,animation:{animateRotate:!0,animateScale:!1},animations:{numbers:{type:`number`,properties:[`circumference`,`endAngle`,`innerRadius`,`outerRadius`,`startAngle`,`x`,`y`,`offset`,`borderWidth`,`spacing`]}},cutout:`50%`,rotation:0,circumference:360,radius:`100%`,spacing:0,indexAxis:`r`};static descriptors={_scriptable:e=>e!==`spacing`,_indexable:e=>e!==`spacing`&&!e.startsWith(`borderDash`)&&!e.startsWith(`hoverBorderDash`)};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){let t=e.data,{labels:{pointStyle:n,textAlign:r,color:i,useBorderRadius:a,borderRadius:o}}=e.legend.options;return t.labels.length&&t.datasets.length?t.labels.map((t,s)=>{let c=e.getDatasetMeta(0).controller.getStyle(s);return{text:t,fillStyle:c.backgroundColor,fontColor:i,hidden:!e.getDataVisibility(s),lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:c.borderWidth,strokeStyle:c.borderColor,textAlign:r,pointStyle:n,borderRadius:a&&(o||c.borderRadius),index:s}}):[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}}};constructor(e,t){super(e,t),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(e,t){let n=this.getDataset().data,r=this._cachedMeta;if(this._parsing===!1)r._parsed=n;else{let i=e=>+n[e];if(j(n[e])){let{key:e=`value`}=this._parsing;i=t=>+Ue(n[t],e)}let a,o;for(a=e,o=e+t;a0&&!isNaN(e)?Math.abs(e)/t*R:0}getLabelAndValue(e){let t=this._cachedMeta,n=this.chart,r=n.data.labels||[],i=Ut(t._parsed[e],n.options.locale);return{label:r[e]||``,value:i}}getMaxBorderWidth(e){let t=0,n=this.chart,r,i,a,o,s;if(!e){for(r=0,i=n.data.datasets.length;r0&&this.getParsed(t-1);for(let n=0;n=_){v.skip=!0;continue}let b=this.getParsed(n),x=k(b[f]),S=v[d]=a.getPixelForValue(b[d],n),C=v[f]=i||x?o.getBasePixel():o.getPixelForValue(s?this.applyStack(o,b,s):b[f],n);v.skip=isNaN(S)||isNaN(C)||x,v.stop=n>0&&Math.abs(b[d]-y[d])>h,m&&(v.parsed=b,v.raw=c.data[n]),u&&(v.options=l||this.resolveDataElementOptions(n,p.active?`active`:r)),g||this.updateElement(p,n,v,r),y=b}}getMaxOverflow(){let e=this._cachedMeta,t=e.dataset,n=t.options&&t.options.borderWidth||0,r=e.data||[];if(!r.length)return n;let i=r[0].size(this.resolveDataElementOptions(0)),a=r[r.length-1].size(this.resolveDataElementOptions(r.length-1));return Math.max(n,i,a)/2}draw(){let e=this._cachedMeta;e.dataset.updateControlPoints(this.chart.chartArea,e.iScale.axis),super.draw()}},Mi=class extends fi{static id=`scatter`;static defaults={datasetElementType:!1,dataElementType:`point`,showLine:!1,fill:!1};static overrides={interaction:{mode:`point`},scales:{x:{type:`linear`},y:{type:`linear`}}};getLabelAndValue(e){let t=this._cachedMeta,n=this.chart.data.labels||[],{xScale:r,yScale:i}=t,a=this.getParsed(e),o=r.getLabelForValue(a.x),s=i.getLabelForValue(a.y);return{label:n[e]||``,value:`(`+o+`, `+s+`)`}}update(e){let t=this._cachedMeta,{data:n=[]}=t,r=this.chart._animationsDisabled,{start:i,count:a}=Ot(t,n,r);if(this._drawStart=i,this._drawCount=a,kt(t)&&(i=0,a=n.length),this.options.showLine){this.datasetElementType||this.addElements();let{dataset:i,_dataset:a}=t;i._chart=this.chart,i._datasetIndex=this.index,i._decimated=!!a._decimated,i.points=n;let o=this.resolveDatasetElementOptions(e);o.segment=this.options.segment,this.updateElement(i,void 0,{animated:!r,options:o},e)}else this.datasetElementType&&=(delete t.dataset,!1);this.updateElements(n,i,a,e)}addElements(){let{showLine:e}=this.options;!this.datasetElementType&&e&&(this.datasetElementType=this.chart.registry.getElement(`line`)),super.addElements()}updateElements(e,t,n,r){let i=r===`reset`,{iScale:a,vScale:o,_stacked:s,_dataset:c}=this._cachedMeta,l=this.resolveDataElementOptions(t,r),u=this.getSharedOptions(l),d=this.includeOptions(r,u),f=a.axis,p=o.axis,{spanGaps:m,segment:h}=this.options,g=at(m)?m:1/0,_=this.chart._animationsDisabled||i||r===`none`,v=t>0&&this.getParsed(t-1);for(let l=t;l0&&Math.abs(n[f]-v[f])>g,h&&(m.parsed=n,m.raw=c.data[l]),d&&(m.options=u||this.resolveDataElementOptions(l,t.active?`active`:r)),_||this.updateElement(t,l,m,r),v=n}this.updateSharedOptions(u,r,l)}getMaxOverflow(){let e=this._cachedMeta,t=e.data||[];if(!this.options.showLine){let e=0;for(let n=t.length-1;n>=0;--n)e=Math.max(e,t[n].size(this.resolveDataElementOptions(n))/2);return e>0&&e}let n=e.dataset,r=n.options&&n.options.borderWidth||0;if(!t.length)return r;let i=t[0].size(this.resolveDataElementOptions(0)),a=t[t.length-1].size(this.resolveDataElementOptions(t.length-1));return Math.max(r,i,a)/2}};function Ni(){throw Error(`This method is not implemented: Check that a complete date adapter is provided.`)}var Pi={_date:class e{static override(t){Object.assign(e.prototype,t)}options;constructor(e){this.options=e||{}}init(){}formats(){return Ni()}parse(){return Ni()}format(){return Ni()}add(){return Ni()}diff(){return Ni()}startOf(){return Ni()}endOf(){return Ni()}}};function Fi(e,t,n,r){let{controller:i,data:a,_sorted:o}=e,s=i._cachedMeta.iScale,c=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null;if(s&&t===s.axis&&t!==`r`&&o&&a.length){let o=s._reversePixels?_t:gt;if(!r){let r=o(a,t,n);if(c){let{vScale:t}=i._cachedMeta,{_parsed:n}=e,a=n.slice(0,r.lo+1).reverse().findIndex(e=>!k(e[t.axis]));r.lo-=Math.max(0,a);let o=n.slice(r.hi).findIndex(e=>!k(e[t.axis]));r.hi+=Math.max(0,o)}return r}else if(i._sharedOptions){let e=a[0],r=typeof e.getRange==`function`&&e.getRange(t);if(r){let e=o(a,t,n-r),i=o(a,t,n+r);return{lo:e.lo,hi:i.hi}}}}return{lo:0,hi:a.length-1}}function Ii(e,t,n,r,i){let a=e.getSortedVisibleDatasetMetas(),o=n[t];for(let e=0,n=a.length;e{e[o]&&e[o](t[n],i)&&(a.push({element:e,datasetIndex:r,index:c}),s||=e.inRange(t.x,t.y,i))}),r&&!s?[]:a}var Ui={evaluateInteractionItems:Ii,modes:{index(e,t,n,r){let i=ur(t,e),a=n.axis||`x`,o=n.includeInvisible||!1,s=n.intersect?Ri(e,i,a,r,o):Vi(e,i,a,!1,r,o),c=[];return s.length?(e.getSortedVisibleDatasetMetas().forEach(e=>{let t=s[0].index,n=e.data[t];n&&!n.skip&&c.push({element:n,datasetIndex:e.index,index:t})}),c):[]},dataset(e,t,n,r){let i=ur(t,e),a=n.axis||`xy`,o=n.includeInvisible||!1,s=n.intersect?Ri(e,i,a,r,o):Vi(e,i,a,!1,r,o);if(s.length>0){let t=s[0].datasetIndex,n=e.getDatasetMeta(t).data;s=[];for(let e=0;ee.pos===t)}function Ki(e,t){return e.filter(e=>Wi.indexOf(e.pos)===-1&&e.box.axis===t)}function qi(e,t){return e.sort((e,n)=>{let r=t?n:e,i=t?e:n;return r.weight===i.weight?r.index-i.index:r.weight-i.weight})}function Ji(e){let t=[],n,r,i,a,o,s;for(n=0,r=(e||[]).length;ne.box.fullSize),!0),r=qi(Gi(t,`left`),!0),i=qi(Gi(t,`right`)),a=qi(Gi(t,`top`),!0),o=qi(Gi(t,`bottom`)),s=Ki(t,`x`),c=Ki(t,`y`);return{fullSize:n,leftAndTop:r.concat(a),rightAndBottom:i.concat(c).concat(o).concat(s),chartArea:Gi(t,`chartArea`),vertical:r.concat(i).concat(c),horizontal:a.concat(o).concat(s)}}function Qi(e,t,n,r){return Math.max(e[n],t[n])+Math.max(e[r],t[r])}function $i(e,t){e.top=Math.max(e.top,t.top),e.left=Math.max(e.left,t.left),e.bottom=Math.max(e.bottom,t.bottom),e.right=Math.max(e.right,t.right)}function ea(e,t,n,r){let{pos:i,box:a}=n,o=e.maxPadding;if(!j(i)){n.size&&(e[i]-=n.size);let t=r[n.stack]||{size:0,count:1};t.size=Math.max(t.size,n.horizontal?a.height:a.width),n.size=t.size/t.count,e[i]+=n.size}a.getPadding&&$i(o,a.getPadding());let s=Math.max(0,t.outerWidth-Qi(o,e,`left`,`right`)),c=Math.max(0,t.outerHeight-Qi(o,e,`top`,`bottom`)),l=s!==e.w,u=c!==e.h;return e.w=s,e.h=c,n.horizontal?{same:l,other:u}:{same:u,other:l}}function ta(e){let t=e.maxPadding;function n(n){let r=Math.max(t[n]-e[n],0);return e[n]+=r,r}e.y+=n(`top`),e.x+=n(`left`),n(`right`),n(`bottom`)}function na(e,t){let n=t.maxPadding;function r(e){let r={left:0,top:0,right:0,bottom:0};return e.forEach(e=>{r[e]=Math.max(t[e],n[e])}),r}return r(e?[`left`,`right`]:[`top`,`bottom`])}function ra(e,t,n,r){let i=[],a,o,s,c,l,u;for(a=0,o=e.length,l=0;a{typeof e.beforeLayout==`function`&&e.beforeLayout()});let u=c.reduce((e,t)=>t.box.options&&t.box.options.display===!1?e:e+1,0)||1,d=Object.freeze({outerWidth:t,outerHeight:n,padding:i,availableWidth:a,availableHeight:o,vBoxMaxWidth:a/2/u,hBoxMaxHeight:o/2}),f=Object.assign({},i);$i(f,q(r));let p=Object.assign({maxPadding:f,w:a,h:o,x:i.left,y:i.top},i),m=Xi(c.concat(l),d);ra(s.fullSize,p,d,m),ra(c,p,d,m),ra(l,p,d,m)&&ra(c,p,d,m),ta(p),aa(s.leftAndTop,p,d,m),p.x+=p.w,p.y+=p.h,aa(s.rightAndBottom,p,d,m),e.chartArea={left:p.left,top:p.top,right:p.left+p.w,bottom:p.top+p.h,height:p.h,width:p.w},I(s.chartArea,t=>{let n=t.box;Object.assign(n,e.chartArea),n.update(p.w,p.h,{left:0,top:0,right:0,bottom:0})})}},oa=class{acquireContext(e,t){}releaseContext(e){return!1}addEventListener(e,t,n){}removeEventListener(e,t,n){}getDevicePixelRatio(){return 1}getMaximumSize(e,t,n,r){return t=Math.max(0,t||e.width),n||=e.height,{width:t,height:Math.max(0,r?Math.floor(t/r):n)}}isAttached(e){return!0}updateConfig(e){}},sa=class extends oa{acquireContext(e){return e&&e.getContext&&e.getContext(`2d`)||null}updateConfig(e){e.options.animation=!1}},ca=`$chartjs`,la={touchstart:`mousedown`,touchmove:`mousemove`,touchend:`mouseup`,pointerenter:`mouseenter`,pointerdown:`mousedown`,pointermove:`mousemove`,pointerup:`mouseup`,pointerleave:`mouseout`,pointerout:`mouseout`},ua=e=>e===null||e===``;function da(e,t){let n=e.style,r=e.getAttribute(`height`),i=e.getAttribute(`width`);if(e[ca]={initial:{height:r,width:i,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||`block`,n.boxSizing=n.boxSizing||`border-box`,ua(i)){let t=gr(e,`width`);t!==void 0&&(e.width=t)}if(ua(r))if(e.style.height===``)e.height=e.width/(t||2);else{let t=gr(e,`height`);t!==void 0&&(e.height=t)}return e}var fa=hr?{passive:!0}:!1;function pa(e,t,n){e&&e.addEventListener(t,n,fa)}function ma(e,t,n){e&&e.canvas&&e.canvas.removeEventListener(t,n,fa)}function ha(e,t){let n=la[e.type]||e.type,{x:r,y:i}=ur(e,t);return{type:n,chart:t,native:e,x:r===void 0?null:r,y:i===void 0?null:i}}function ga(e,t){for(let n of e)if(n===t||n.contains(t))return!0}function _a(e,t,n){let r=e.canvas,i=new MutationObserver(e=>{let t=!1;for(let n of e)t||=ga(n.addedNodes,r),t&&=!ga(n.removedNodes,r);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}function va(e,t,n){let r=e.canvas,i=new MutationObserver(e=>{let t=!1;for(let n of e)t||=ga(n.removedNodes,r),t&&=!ga(n.addedNodes,r);t&&n()});return i.observe(document,{childList:!0,subtree:!0}),i}var ya=new Map,ba=0;function xa(){let e=window.devicePixelRatio;e!==ba&&(ba=e,ya.forEach((t,n)=>{n.currentDevicePixelRatio!==e&&t()}))}function Sa(e,t){ya.size||window.addEventListener(`resize`,xa),ya.set(e,t)}function Ca(e){ya.delete(e),ya.size||window.removeEventListener(`resize`,xa)}function wa(e,t,n){let r=e.canvas,i=r&&nr(r);if(!i)return;let a=wt((e,t)=>{let r=i.clientWidth;n(e,t),r{let t=e[0],n=t.contentRect.width,r=t.contentRect.height;n===0&&r===0||a(n,r)});return o.observe(i),Sa(e,a),o}function Ta(e,t,n){n&&n.disconnect(),t===`resize`&&Ca(e)}function Ea(e,t,n){let r=e.canvas,i=wt(t=>{e.ctx!==null&&n(ha(t,e))},e);return pa(r,t,i),i}var Da=class extends oa{acquireContext(e,t){let n=e&&e.getContext&&e.getContext(`2d`);return n&&n.canvas===e?(da(e,t),n):null}releaseContext(e){let t=e.canvas;if(!t[ca])return!1;let n=t[ca].initial;[`height`,`width`].forEach(e=>{let r=n[e];k(r)?t.removeAttribute(e):t.setAttribute(e,r)});let r=n.style||{};return Object.keys(r).forEach(e=>{t.style[e]=r[e]}),t.width=t.width,delete t[ca],!0}addEventListener(e,t,n){this.removeEventListener(e,t);let r=e.$proxies||={};r[t]=({attach:_a,detach:va,resize:wa}[t]||Ea)(e,t,n)}removeEventListener(e,t){let n=e.$proxies||={},r=n[t];r&&(({attach:Ta,detach:Ta,resize:Ta}[t]||ma)(e,t,r),n[t]=void 0)}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(e,t,n,r){return pr(e,t,n,r)}isAttached(e){let t=e&&nr(e);return!!(t&&t.isConnected)}};function Oa(e){return!tr()||typeof OffscreenCanvas<`u`&&e instanceof OffscreenCanvas?sa:Da}var ka=class{static defaults={};static defaultRoutes=void 0;x;y;active=!1;options;$animations;tooltipPosition(e){let{x:t,y:n}=this.getProps([`x`,`y`],e);return{x:t,y:n}}hasValue(){return at(this.x)&&at(this.y)}getProps(e,t){let n=this.$animations;if(!t||!n)return this;let r={};return e.forEach(e=>{r[e]=n[e]&&n[e].active()?n[e]._to:this[e]}),r}};function Aa(e,t){let n=e.options.ticks,r=ja(e),i=Math.min(n.maxTicksLimit||r,r),a=n.major.enabled?Na(t):[],o=a.length,s=a[0],c=a[o-1],l=[];if(o>i)return Pa(t,l,a,o/i),l;let u=Ma(a,t,i);if(o>0){let e,n,r=o>1?Math.round((c-s)/(o-1)):null;for(Fa(t,l,u,k(r)?0:s-r,s),e=0,n=o-1;ei)return t}return Math.max(i,1)}function Na(e){let t=[],n,r;for(n=0,r=e.length;ne===`left`?`right`:e===`right`?`left`:e,Ra=(e,t,n)=>t===`top`||t===`left`?e[t]+n:e[t]-n,za=(e,t)=>Math.min(t||e,e);function Ba(e,t){let n=[],r=e.length/t,i=e.length,a=0;for(;ao+s)))return c}function Ha(e,t){I(e,e=>{let n=e.gc,r=n.length/2,i;if(r>t){for(i=0;in?n:t,n=r&&t>n?t:n,{min:N(t,N(n,t)),max:N(n,N(t,n))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){let e=this.chart.data;return this.options.labels||(this.isHorizontal()?e.xLabels:e.yLabels)||e.labels||[]}getLabelItems(e=this.chart.chartArea){return this._labelItems||=this._computeLabelItems(e)}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){F(this.options.beforeUpdate,[this])}update(e,t,n){let{beginAtZero:r,grace:i,ticks:a}=this.options,o=a.sampleSize;this.beforeUpdate(),this.maxWidth=e,this.maxHeight=t,this._margins=n=Object.assign({left:0,right:0,top:0,bottom:0},n),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+n.left+n.right:this.height+n.top+n.bottom,this._dataLimitsCached||=(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=wn(this,i,r),!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();let s=o=i||n<=1||!this.isHorizontal()){this.labelRotation=r;return}let l=this._getLabelSizes(),u=l.widest.width,d=l.highest.height,f=U(this.chart.width-u,0,this.maxWidth);o=e.offset?this.maxWidth/n:f/(n-1),u+6>o&&(o=f/(n-(e.offset?.5:1)),s=this.maxHeight-Ua(e.grid)-t.padding-Wa(e.title,this.chart.options.font),c=Math.sqrt(u*u+d*d),a=ct(Math.min(Math.asin(U((l.highest.height+6)/o,-1,1)),Math.asin(U(s/c,-1,1))-Math.asin(U(d/c,-1,1)))),a=Math.max(r,Math.min(i,a))),this.labelRotation=a}afterCalculateLabelRotation(){F(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){F(this.options.beforeFit,[this])}fit(){let e={width:0,height:0},{chart:t,options:{ticks:n,title:r,grid:i}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){let a=Wa(r,t.options.font);if(o?(e.width=this.maxWidth,e.height=Ua(i)+a):(e.height=this.maxHeight,e.width=Ua(i)+a),n.display&&this.ticks.length){let{first:t,last:r,widest:i,highest:a}=this._getLabelSizes(),s=n.padding*2,c=V(this.labelRotation),l=Math.cos(c),u=Math.sin(c);if(o){let t=n.mirror?0:u*i.width+l*a.height;e.height=Math.min(this.maxHeight,e.height+t+s)}else{let t=n.mirror?0:l*i.width+u*a.height;e.width=Math.min(this.maxWidth,e.width+t+s)}this._calculatePadding(t,r,u,l)}}this._handleMargins(),o?(this.width=this._length=t.width-this._margins.left-this._margins.right,this.height=e.height):(this.width=e.width,this.height=this._length=t.height-this._margins.top-this._margins.bottom)}_calculatePadding(e,t,n,r){let{ticks:{align:i,padding:a},position:o}=this.options,s=this.labelRotation!==0,c=o!==`top`&&this.axis===`x`;if(this.isHorizontal()){let o=this.getPixelForTick(0)-this.left,l=this.right-this.getPixelForTick(this.ticks.length-1),u=0,d=0;s?c?(u=r*e.width,d=n*t.height):(u=n*e.height,d=r*t.width):i===`start`?d=t.width:i===`end`?u=e.width:i!==`inner`&&(u=e.width/2,d=t.width/2),this.paddingLeft=Math.max((u-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((d-l+a)*this.width/(this.width-l),0)}else{let n=t.height/2,r=e.height/2;i===`start`?(n=0,r=e.height):i===`end`&&(n=t.height,r=0),this.paddingTop=n+a,this.paddingBottom=r+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){F(this.options.afterFit,[this])}isHorizontal(){let{axis:e,position:t}=this.options;return t===`top`||t===`bottom`||e===`x`}isFullSize(){return this.options.fullSize}_convertTicksToLabels(e){this.beforeTickToLabelConversion(),this.generateTickLabels(e);let t,n;for(t=0,n=e.length;t({width:a[e]||0,height:o[e]||0});return{first:C(0),last:C(t-1),widest:C(x),highest:C(S),widths:a,heights:o}}getLabelForValue(e){return e}getPixelForValue(e,t){return NaN}getValueForPixel(e){}getPixelForTick(e){let t=this.ticks;return e<0||e>t.length-1?null:this.getPixelForValue(t[e].value)}getPixelForDecimal(e){this._reversePixels&&(e=1-e);let t=this._startPixel+e*this._length;return mt(this._alignToPixels?tn(this.chart,t,0):t)}getDecimalForPixel(e){let t=(e-this._startPixel)/this._length;return this._reversePixels?1-t:t}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){let{min:e,max:t}=this;return e<0&&t<0?t:e>0&&t>0?e:0}getContext(e){let t=this.ticks||[];if(e>=0&&eo*r?o/n:s/r:s*r0:!!e}_computeGridLineItems(e){let t=this.axis,n=this.chart,r=this.options,{grid:i,position:a,border:o}=r,s=i.offset,c=this.isHorizontal(),l=this.ticks.length+(s?1:0),u=Ua(i),d=[],f=o.setContext(this.getContext()),p=f.display?f.width:0,m=p/2,h=function(e){return tn(n,e,p)},g,_,v,y,b,x,S,C,w,T,E,D;if(a===`top`)g=h(this.bottom),x=this.bottom-u,C=g-m,T=h(e.top)+m,D=e.bottom;else if(a===`bottom`)g=h(this.top),T=e.top,D=h(e.bottom)-m,x=g+m,C=this.top+u;else if(a===`left`)g=h(this.right),b=this.right-u,S=g-m,w=h(e.left)+m,E=e.right;else if(a===`right`)g=h(this.left),w=e.left,E=h(e.right)-m,b=g+m,S=this.left+u;else if(t===`x`){if(a===`center`)g=h((e.top+e.bottom)/2+.5);else if(j(a)){let e=Object.keys(a)[0],t=a[e];g=h(this.chart.scales[e].getPixelForValue(t))}T=e.top,D=e.bottom,x=g+m,C=x+u}else if(t===`y`){if(a===`center`)g=h((e.left+e.right)/2);else if(j(a)){let e=Object.keys(a)[0],t=a[e];g=h(this.chart.scales[e].getPixelForValue(t))}b=g-m,S=b-u,w=e.left,E=e.right}let ee=P(r.ticks.maxTicksLimit,l),O=Math.max(1,Math.ceil(l/ee));for(_=0;_0&&(a-=r/2);break}f={left:a,top:i,width:r+t.width,height:n+t.height,color:e.backdropColor}}h.push({label:y,font:w,textOffset:D,options:{rotation:m,color:n,strokeColor:s,strokeWidth:l,textAlign:d,textBaseline:ee,translation:[b,x],backdrop:f}})}return h}_getXAxisLabelAlignment(){let{position:e,ticks:t}=this.options;if(-V(this.labelRotation))return e===`top`?`left`:`right`;let n=`center`;return t.align===`start`?n=`left`:t.align===`end`?n=`right`:t.align===`inner`&&(n=`inner`),n}_getYAxisLabelAlignment(e){let{position:t,ticks:{crossAlign:n,mirror:r,padding:i}}=this.options,a=this._getLabelSizes(),o=e+i,s=a.widest.width,c,l;return t===`left`?r?(l=this.right+i,n===`near`?c=`left`:n===`center`?(c=`center`,l+=s/2):(c=`right`,l+=s)):(l=this.right-o,n===`near`?c=`right`:n===`center`?(c=`center`,l-=s/2):(c=`left`,l=this.left)):t===`right`?r?(l=this.left+i,n===`near`?c=`right`:n===`center`?(c=`center`,l-=s/2):(c=`left`,l-=s)):(l=this.left+o,n===`near`?c=`left`:n===`center`?(c=`center`,l+=s/2):(c=`right`,l=this.right)):c=`right`,{textAlign:c,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;let e=this.chart,t=this.options.position;if(t===`left`||t===`right`)return{top:0,left:this.left,bottom:e.height,right:this.right};if(t===`top`||t===`bottom`)return{top:this.top,left:0,bottom:this.bottom,right:e.width}}drawBackground(){let{ctx:e,options:{backgroundColor:t},left:n,top:r,width:i,height:a}=this;t&&(e.save(),e.fillStyle=t,e.fillRect(n,r,i,a),e.restore())}getLineWidthForValue(e){let t=this.options.grid;if(!this._isVisible()||!t.display)return 0;let n=this.ticks.findIndex(t=>t.value===e);return n>=0?t.setContext(this.getContext(n)).lineWidth:0}drawGrid(e){let t=this.options.grid,n=this.ctx,r=this._gridLineItems||=this._computeGridLineItems(e),i,a,o=(e,t,r)=>{!r.width||!r.color||(n.save(),n.lineWidth=r.width,n.strokeStyle=r.color,n.setLineDash(r.borderDash||[]),n.lineDashOffset=r.borderDashOffset,n.beginPath(),n.moveTo(e.x,e.y),n.lineTo(t.x,t.y),n.stroke(),n.restore())};if(t.display)for(i=0,a=r.length;i{this.draw(e)}}]:[{z:r,draw:e=>{this.drawBackground(),this.drawGrid(e),this.drawTitle()}},{z:i,draw:()=>{this.drawBorder()}},{z:n,draw:e=>{this.drawLabels(e)}}]}getMatchingVisibleMetas(e){let t=this.chart.getSortedVisibleDatasetMetas(),n=this.axis+`AxisID`,r=[],i,a;for(i=0,a=t.length;i{let r=n.split(`.`),i=r.pop(),a=[e].concat(r).join(`.`),o=t[n].split(`.`),s=o.pop(),c=o.join(`.`);K.route(a,i,c,s)})}function $a(e){return`id`in e&&`defaults`in e}var X=new class{constructor(){this.controllers=new Xa(fi,`datasets`,!0),this.elements=new Xa(ka,`elements`),this.plugins=new Xa(Object,`plugins`),this.scales=new Xa(Ya,`scales`),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...e){this._each(`register`,e)}remove(...e){this._each(`unregister`,e)}addControllers(...e){this._each(`register`,e,this.controllers)}addElements(...e){this._each(`register`,e,this.elements)}addPlugins(...e){this._each(`register`,e,this.plugins)}addScales(...e){this._each(`register`,e,this.scales)}getController(e){return this._get(e,this.controllers,`controller`)}getElement(e){return this._get(e,this.elements,`element`)}getPlugin(e){return this._get(e,this.plugins,`plugin`)}getScale(e){return this._get(e,this.scales,`scale`)}removeControllers(...e){this._each(`unregister`,e,this.controllers)}removeElements(...e){this._each(`unregister`,e,this.elements)}removePlugins(...e){this._each(`unregister`,e,this.plugins)}removeScales(...e){this._each(`unregister`,e,this.scales)}_each(e,t,n){[...t].forEach(t=>{let r=n||this._getRegistryForType(t);n||r.isForType(t)||r===this.plugins&&t.id?this._exec(e,r,t):I(t,t=>{let r=n||this._getRegistryForType(t);this._exec(e,r,t)})})}_exec(e,t,n){let r=We(e);F(n[`before`+r],[],n),t[e](n),F(n[`after`+r],[],n)}_getRegistryForType(e){for(let t=0;te.filter(e=>!t.some(t=>e.plugin.id===t.plugin.id));this._notify(r(t,n),e,`stop`),this._notify(r(n,t),e,`start`)}};function to(e){let t={},n=[],r=Object.keys(X.plugins.items);for(let e=0;e1&&co(e[0].toLowerCase());if(t)return t}throw Error(`Cannot determine type of '${e}' axis. Please provide 'axis' or 'position' option.`)}function fo(e,t,n){if(n[t+`AxisID`]===e)return{axis:t}}function po(e,t){if(t.data&&t.data.datasets){let n=t.data.datasets.filter(t=>t.xAxisID===e||t.yAxisID===e);if(n.length)return fo(e,`x`,n[0])||fo(e,`y`,n[0])}return{}}function mo(e,t){let n=Jt[e.type]||{scales:{}},r=t.scales||{},i=ao(e.type,t),a=Object.create(null);return Object.keys(r).forEach(t=>{let o=r[t];if(!j(o))return console.error(`Invalid scale configuration for scale: ${t}`);if(o._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);let s=uo(t,o,po(t,e),K.scales[o.type]),c=so(s,i),l=n.scales||{};a[t]=Re(Object.create(null),[{axis:s},o,l[s],l[c]])}),e.data.datasets.forEach(n=>{let i=n.type||e.type,o=n.indexAxis||ao(i,t),s=(Jt[i]||{}).scales||{};Object.keys(s).forEach(e=>{let t=oo(e,o),i=n[t+`AxisID`]||t;a[i]=a[i]||Object.create(null),Re(a[i],[{axis:t},r[i],s[e]])})}),Object.keys(a).forEach(e=>{let t=a[e];Re(t,[K.scales[t.type],K.scale])}),a}function ho(e){let t=e.options||={};t.plugins=P(t.plugins,{}),t.scales=mo(e,t)}function go(e){return e||={},e.datasets=e.datasets||[],e.labels=e.labels||[],e}function _o(e){return e||={},e.data=go(e.data),ho(e),e}var vo=new Map,yo=new Set;function bo(e,t){let n=vo.get(e);return n||(n=t(),vo.set(e,n),yo.add(n)),n}var xo=(e,t,n)=>{let r=Ue(t,n);r!==void 0&&e.add(r)},So=class{constructor(e){this._config=_o(e),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(e){this._config.type=e}get data(){return this._config.data}set data(e){this._config.data=go(e)}get options(){return this._config.options}set options(e){this._config.options=e}get plugins(){return this._config.plugins}update(){let e=this._config;this.clearCache(),ho(e)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(e){return bo(e,()=>[[`datasets.${e}`,``]])}datasetAnimationScopeKeys(e,t){return bo(`${e}.transition.${t}`,()=>[[`datasets.${e}.transitions.${t}`,`transitions.${t}`],[`datasets.${e}`,``]])}datasetElementScopeKeys(e,t){return bo(`${e}-${t}`,()=>[[`datasets.${e}.elements.${t}`,`datasets.${e}`,`elements.${t}`,``]])}pluginScopeKeys(e){let t=e.id,n=this.type;return bo(`${n}-plugin-${t}`,()=>[[`plugins.${t}`,...e.additionalOptionScopes||[]]])}_cachedScopes(e,t){let n=this._scopeCache,r=n.get(e);return(!r||t)&&(r=new Map,n.set(e,r)),r}getOptionScopes(e,t,n){let{options:r,type:i}=this,a=this._cachedScopes(e,n),o=a.get(t);if(o)return o;let s=new Set;t.forEach(t=>{e&&(s.add(e),t.forEach(t=>xo(s,e,t))),t.forEach(e=>xo(s,r,e)),t.forEach(e=>xo(s,Jt[i]||{},e)),t.forEach(e=>xo(s,K,e)),t.forEach(e=>xo(s,Yt,e))});let c=Array.from(s);return c.length===0&&c.push(Object.create(null)),yo.has(t)&&a.set(t,c),c}chartOptionScopes(){let{options:e,type:t}=this;return[e,Jt[t]||{},K.datasets[t]||{},{type:t},K,Yt]}resolveNamedOptions(e,t,n,r=[``]){let i={$shared:!0},{resolver:a,subPrefixes:o}=Co(this._resolverCache,e,r),s=a;if(To(a,t)){i.$shared=!1,n=Ke(n)?n():n;let t=this.createResolver(e,n,o);s=Dn(a,n,t)}for(let e of t)i[e]=s[e];return i}createResolver(e,t,n=[``],r){let{resolver:i}=Co(this._resolverCache,e,n);return j(t)?Dn(i,t,void 0,r):i}};function Co(e,t,n){let r=e.get(t);r||(r=new Map,e.set(t,r));let i=n.join(),a=r.get(i);return a||(a={resolver:En(t,n),subPrefixes:n.filter(e=>!e.toLowerCase().includes(`hover`))},r.set(i,a)),a}var wo=e=>j(e)&&Object.getOwnPropertyNames(e).some(t=>Ke(e[t]));function To(e,t){let{isScriptable:n,isIndexable:r}=On(e);for(let i of t){let t=n(i),a=r(i),o=(a||t)&&e[i];if(t&&(Ke(o)||wo(o))||a&&A(o))return!0}return!1}var Eo=`4.5.1`,Do=[`top`,`bottom`,`left`,`right`,`chartArea`];function Oo(e,t){return e===`top`||e===`bottom`||Do.indexOf(e)===-1&&t===`x`}function ko(e,t){return function(n,r){return n[e]===r[e]?n[t]-r[t]:n[e]-r[e]}}function Ao(e){let t=e.chart,n=t.options.animation;t.notifyPlugins(`afterRender`),F(n&&n.onComplete,[e],t)}function jo(e){let t=e.chart,n=t.options.animation;F(n&&n.onProgress,[e],t)}function Mo(e){return tr()&&typeof e==`string`?e=document.getElementById(e):e&&e.length&&(e=e[0]),e&&e.canvas&&(e=e.canvas),e}var No={},Po=e=>{let t=Mo(e);return Object.values(No).filter(e=>e.canvas===t).pop()};function Fo(e,t,n){let r=Object.keys(e);for(let i of r){let r=+i;if(r>=t){let a=e[i];delete e[i],(n>0||r>t)&&(e[r+n]=a)}}}function Io(e,t,n,r){return!n||e.type===`mouseout`?null:r?t:e}var Lo=class{static defaults=K;static instances=No;static overrides=Jt;static registry=X;static version=Eo;static getChart=Po;static register(...e){X.add(...e),Ro()}static unregister(...e){X.remove(...e),Ro()}constructor(e,t){let n=this.config=new So(t),r=Mo(e),i=Po(r);if(i)throw Error(`Canvas is already in use. Chart with ID '`+i.id+`' must be destroyed before the canvas with ID '`+i.canvas.id+`' can be reused.`);let a=n.createResolver(n.chartOptionScopes(),this.getContext());this.platform=new(n.platform||(Oa(r))),this.platform.updateConfig(n);let o=this.platform.acquireContext(r,a.aspectRatio),s=o&&o.canvas,c=s&&s.height,l=s&&s.width;if(this.id=Ae(),this.ctx=o,this.canvas=s,this.width=l,this.height=c,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new eo,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=Tt(e=>this.update(e),a.resizeDelay||0),this._dataChanges=[],No[this.id]=this,!o||!s){console.error(`Failed to create chart: can't acquire context from the given item`);return}Br.listen(this,`complete`,Ao),Br.listen(this,`progress`,jo),this._initialize(),this.attached&&this.update()}get aspectRatio(){let{options:{aspectRatio:e,maintainAspectRatio:t},width:n,height:r,_aspectRatio:i}=this;return k(e)?t&&i?i:r?n/r:null:e}get data(){return this.config.data}set data(e){this.config.data=e}get options(){return this._options}set options(e){this.config.options=e}get registry(){return X}_initialize(){return this.notifyPlugins(`beforeInit`),this.options.responsive?this.resize():mr(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins(`afterInit`),this}clear(){return nn(this.canvas,this.ctx),this}stop(){return Br.stop(this),this}resize(e,t){Br.running(this)?this._resizeBeforeDraw={width:e,height:t}:this._resize(e,t)}_resize(e,t){let n=this.options,r=this.canvas,i=n.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(r,e,t,i),o=n.devicePixelRatio||this.platform.getDevicePixelRatio(),s=this.width?`resize`:`attach`;this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,mr(this,o,!0)&&(this.notifyPlugins(`resize`,{size:a}),F(n.onResize,[this,a],this),this.attached&&this._doResize(s)&&this.render())}ensureScalesHaveIDs(){I(this.options.scales||{},(e,t)=>{e.id=t})}buildOrUpdateScales(){let e=this.options,t=e.scales,n=this.scales,r=Object.keys(n).reduce((e,t)=>(e[t]=!1,e),{}),i=[];t&&(i=i.concat(Object.keys(t).map(e=>{let n=t[e],r=uo(e,n),i=r===`r`,a=r===`x`;return{options:n,dposition:i?`chartArea`:a?`bottom`:`left`,dtype:i?`radialLinear`:a?`category`:`linear`}}))),I(i,t=>{let i=t.options,a=i.id,o=uo(a,i),s=P(i.type,t.dtype);(i.position===void 0||Oo(i.position,o)!==Oo(t.dposition))&&(i.position=t.dposition),r[a]=!0;let c=null;a in n&&n[a].type===s?c=n[a]:(c=new(X.getScale(s))({id:a,type:s,ctx:this.ctx,chart:this}),n[c.id]=c),c.init(i,e)}),I(r,(e,t)=>{e||delete n[t]}),I(n,e=>{Y.configure(this,e,e.options),Y.addBox(this,e)})}_updateMetasets(){let e=this._metasets,t=this.data.datasets.length,n=e.length;if(e.sort((e,t)=>e.index-t.index),n>t){for(let e=t;et.length&&delete this._stacks,e.forEach((e,n)=>{t.filter(t=>t===e._dataset).length===0&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){let e=[],t=this.data.datasets,n,r;for(this._removeUnreferencedMetasets(),n=0,r=t.length;n{this.getDatasetMeta(t).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins(`reset`)}update(e){let t=this.config;t.update();let n=this._options=t.createResolver(t.chartOptionScopes(),this.getContext()),r=this._animationsDisabled=!n.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins(`beforeUpdate`,{mode:e,cancelable:!0})===!1)return;let i=this.buildOrUpdateControllers();this.notifyPlugins(`beforeElementsUpdate`);let a=0;for(let e=0,t=this.data.datasets.length;e{e.reset()}),this._updateDatasets(e),this.notifyPlugins(`afterUpdate`,{mode:e}),this._layers.sort(ko(`z`,`_idx`));let{_active:o,_lastEvent:s}=this;s?this._eventHandler(s,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){I(this.scales,e=>{Y.removeBox(this,e)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){let e=this.options;(!qe(new Set(Object.keys(this._listeners)),new Set(e.events))||!!this._responsiveListeners!==e.responsive)&&(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){let{_hiddenIndices:e}=this,t=this._getUniformDataChanges()||[];for(let{method:n,start:r,count:i}of t)Fo(e,r,n===`_removeElements`?-i:i)}_getUniformDataChanges(){let e=this._dataChanges;if(!e||!e.length)return;this._dataChanges=[];let t=this.data.datasets.length,n=t=>new Set(e.filter(e=>e[0]===t).map((e,t)=>t+`,`+e.splice(1).join(`,`))),r=n(0);for(let e=1;ee.split(`,`)).map(e=>({method:e[1],start:+e[2],count:+e[3]}))}_updateLayout(e){if(this.notifyPlugins(`beforeLayout`,{cancelable:!0})===!1)return;Y.update(this,this.width,this.height,e);let t=this.chartArea,n=t.width<=0||t.height<=0;this._layers=[],I(this.boxes,e=>{n&&e.position===`chartArea`||(e.configure&&e.configure(),this._layers.push(...e._layers()))},this),this._layers.forEach((e,t)=>{e._idx=t}),this.notifyPlugins(`afterLayout`)}_updateDatasets(e){if(this.notifyPlugins(`beforeDatasetsUpdate`,{mode:e,cancelable:!0})!==!1){for(let e=0,t=this.data.datasets.length;e=0;--t)this._drawDataset(e[t]);this.notifyPlugins(`afterDatasetsDraw`)}_drawDataset(e){let t=this.ctx,n={meta:e,index:e.index,cancelable:!0},r=zr(this,e);this.notifyPlugins(`beforeDatasetDraw`,n)!==!1&&(r&&sn(t,r),e.controller.draw(),r&&cn(t),n.cancelable=!1,this.notifyPlugins(`afterDatasetDraw`,n))}isPointInArea(e){return on(e,this.chartArea,this._minPadding)}getElementsAtEventForMode(e,t,n,r){let i=Ui.modes[t];return typeof i==`function`?i(this,e,n,r):[]}getDatasetMeta(e){let t=this.data.datasets[e],n=this._metasets,r=n.filter(e=>e&&e._dataset===t).pop();return r||(r={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:t&&t.order||0,index:e,_dataset:t,_parsed:[],_sorted:!1},n.push(r)),r}getContext(){return this.$context||=Tn(null,{chart:this,type:`chart`})}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(e){let t=this.data.datasets[e];if(!t)return!1;let n=this.getDatasetMeta(e);return typeof n.hidden==`boolean`?!n.hidden:!t.hidden}setDatasetVisibility(e,t){let n=this.getDatasetMeta(e);n.hidden=!t}toggleDataVisibility(e){this._hiddenIndices[e]=!this._hiddenIndices[e]}getDataVisibility(e){return!this._hiddenIndices[e]}_updateVisibility(e,t,n){let r=n?`show`:`hide`,i=this.getDatasetMeta(e),a=i.controller._resolveAnimations(void 0,r);Ge(t)?(i.data[t].hidden=!n,this.update()):(this.setDatasetVisibility(e,n),a.update(i,{visible:n}),this.update(t=>t.datasetIndex===e?r:void 0))}hide(e,t){this._updateVisibility(e,t,!1)}show(e,t){this._updateVisibility(e,t,!0)}_destroyDatasetMeta(e){let t=this._metasets[e];t&&t.controller&&t.controller._destroy(),delete this._metasets[e]}_stop(){let e,t;for(this.stop(),Br.remove(this),e=0,t=this.data.datasets.length;e{t.addEventListener(this,n,r),e[n]=r},r=(e,t,n)=>{e.offsetX=t,e.offsetY=n,this._eventHandler(e)};I(this.options.events,e=>n(e,r))}bindResponsiveEvents(){this._responsiveListeners||={};let e=this._responsiveListeners,t=this.platform,n=(n,r)=>{t.addEventListener(this,n,r),e[n]=r},r=(n,r)=>{e[n]&&(t.removeEventListener(this,n,r),delete e[n])},i=(e,t)=>{this.canvas&&this.resize(e,t)},a,o=()=>{r(`attach`,o),this.attached=!0,this.resize(),n(`resize`,i),n(`detach`,a)};a=()=>{this.attached=!1,r(`resize`,i),this._stop(),this._resize(0,0),n(`attach`,o)},t.isAttached(this.canvas)?o():a()}unbindEvents(){I(this._listeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._listeners={},I(this._responsiveListeners,(e,t)=>{this.platform.removeEventListener(this,t,e)}),this._responsiveListeners=void 0}updateHoverStyle(e,t,n){let r=n?`set`:`remove`,i,a,o,s;for(t===`dataset`&&(i=this.getDatasetMeta(e[0].datasetIndex),i.controller[`_`+r+`DatasetHoverStyle`]()),o=0,s=e.length;o{let n=this.getDatasetMeta(e);if(!n)throw Error(`No dataset found at index `+e);return{datasetIndex:e,element:n.data[t],index:t}});Ne(n,t)||(this._active=n,this._lastEvent=null,this._updateHoverStyles(n,t))}notifyPlugins(e,t,n){return this._plugins.notify(this,e,t,n)}isPluginEnabled(e){return this._plugins._cache.filter(t=>t.plugin.id===e).length===1}_updateHoverStyles(e,t,n){let r=this.options.hover,i=(e,t)=>e.filter(e=>!t.some(t=>e.datasetIndex===t.datasetIndex&&e.index===t.index)),a=i(t,e),o=n?e:i(e,t);a.length&&this.updateHoverStyle(a,r.mode,!1),o.length&&r.mode&&this.updateHoverStyle(o,r.mode,!0)}_eventHandler(e,t){let n={event:e,replay:t,cancelable:!0,inChartArea:this.isPointInArea(e)},r=t=>(t.options.events||this.options.events).includes(e.native.type);if(this.notifyPlugins(`beforeEvent`,n,r)===!1)return;let i=this._handleEvent(e,t,n.inChartArea);return n.cancelable=!1,this.notifyPlugins(`afterEvent`,n,r),(i||n.changed)&&this.render(),this}_handleEvent(e,t,n){let{_active:r=[],options:i}=this,a=t,o=this._getActiveElements(e,r,n,a),s=Je(e),c=Io(e,this._lastEvent,n,s);n&&(this._lastEvent=null,F(i.onHover,[e,o,this],this),s&&F(i.onClick,[e,o,this],this));let l=!Ne(o,r);return(l||t)&&(this._active=o,this._updateHoverStyles(o,r,t)),this._lastEvent=c,l}_getActiveElements(e,t,n,r){if(e.type===`mouseout`)return[];if(!n)return t;let i=this.options.hover;return this.getElementsAtEventForMode(e,i.mode,i,r)}};function Ro(){return I(Lo.instances,e=>e._plugins.invalidate())}function zo(e,t,n){let{startAngle:r,x:i,y:a,outerRadius:o,innerRadius:s,options:c}=t,{borderWidth:l,borderJoinStyle:u}=c,d=Math.min(l/o,H(r-n));if(e.beginPath(),e.arc(i,a,o-l/2,r+d/2,n-d/2),s>0){let t=Math.min(l/s,H(r-n));e.arc(i,a,s+l/2,n-t/2,r+t/2,!0)}else{let t=Math.min(l/2,o*H(r-n));if(u===`round`)e.arc(i,a,t,n-L/2,r+L/2,!0);else if(u===`bevel`){let o=2*t*t,s=-o*Math.cos(n+L/2)+i,c=-o*Math.sin(n+L/2)+a,l=o*Math.cos(r+L/2)+i,u=o*Math.sin(r+L/2)+a;e.lineTo(s,c),e.lineTo(l,u)}}e.closePath(),e.moveTo(0,0),e.rect(0,0,e.canvas.width,e.canvas.height),e.clip(`evenodd`)}function Bo(e,t,n){let{startAngle:r,pixelMargin:i,x:a,y:o,outerRadius:s,innerRadius:c}=t,l=i/s;e.beginPath(),e.arc(a,o,s,r-l,n+l),c>i?(l=i/c,e.arc(a,o,c,n+l,r-l,!0)):e.arc(a,o,i,n+z,r-z),e.closePath(),e.clip()}function Vo(e){return bn(e,[`outerStart`,`outerEnd`,`innerStart`,`innerEnd`])}function Ho(e,t,n,r){let i=Vo(e.options.borderRadius),a=(n-t)/2,o=Math.min(a,r*t/2),s=e=>{let t=(n-Math.min(a,e))*r/2;return U(e,0,Math.min(a,t))};return{outerStart:s(i.outerStart),outerEnd:s(i.outerEnd),innerStart:U(i.innerStart,0,o),innerEnd:U(i.innerEnd,0,o)}}function Uo(e,t,n,r){return{x:n+e*Math.cos(t),y:r+e*Math.sin(t)}}function Wo(e,t,n,r,i,a){let{x:o,y:s,startAngle:c,pixelMargin:l,innerRadius:u}=t,d=Math.max(t.outerRadius+r+n-l,0),f=u>0?u+r+n+l:0,p=0,m=i-c;if(r){let e=((u>0?u-r:0)+(d>0?d-r:0))/2;p=(m-(e===0?m:m*e/(e+r)))/2}let h=(m-Math.max(.001,m*d-n/L)/d)/2,g=c+h+p,_=i-h-p,{outerStart:v,outerEnd:y,innerStart:b,innerEnd:x}=Ho(t,f,d,_-g),S=d-v,C=d-y,w=g+v/S,T=_-y/C,E=f+b,D=f+x,ee=g+b/E,O=_-x/D;if(e.beginPath(),a){let t=(w+T)/2;if(e.arc(o,s,d,w,t),e.arc(o,s,d,t,T),y>0){let t=Uo(C,T,o,s);e.arc(t.x,t.y,y,T,_+z)}let n=Uo(D,_,o,s);if(e.lineTo(n.x,n.y),x>0){let t=Uo(D,O,o,s);e.arc(t.x,t.y,x,_+z,O+Math.PI)}let r=(_-x/f+(g+b/f))/2;if(e.arc(o,s,f,_-x/f,r,!0),e.arc(o,s,f,r,g+b/f,!0),b>0){let t=Uo(E,ee,o,s);e.arc(t.x,t.y,b,ee+Math.PI,g-z)}let i=Uo(S,g,o,s);if(e.lineTo(i.x,i.y),v>0){let t=Uo(S,w,o,s);e.arc(t.x,t.y,v,g-z,w)}}else{e.moveTo(o,s);let t=Math.cos(w)*d+o,n=Math.sin(w)*d+s;e.lineTo(t,n);let r=Math.cos(T)*d+o,i=Math.sin(T)*d+s;e.lineTo(r,i)}e.closePath()}function Go(e,t,n,r,i){let{fullCircles:a,startAngle:o,circumference:s}=t,c=t.endAngle;if(a){Wo(e,t,n,r,c,i);for(let t=0;t=L&&p===0&&u!==`miter`&&zo(e,t,h),a||(Wo(e,t,n,r,h,i),e.stroke())}var qo=class extends ka{static id=`arc`;static defaults={borderAlign:`center`,borderColor:`#fff`,borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1};static defaultRoutes={backgroundColor:`backgroundColor`};static descriptors={_scriptable:!0,_indexable:e=>e!==`borderDash`};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(e){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,e&&Object.assign(this,e)}inRange(e,t,n){let{angle:r,distance:i}=ut(this.getProps([`x`,`y`],n),{x:e,y:t}),{startAngle:a,endAngle:o,innerRadius:s,outerRadius:c,circumference:l}=this.getProps([`startAngle`,`endAngle`,`innerRadius`,`outerRadius`,`circumference`],n),u=(this.options.spacing+this.options.borderWidth)/2,d=P(l,o-a),f=pt(r,a,o)&&a!==o,p=d>=R||f,m=W(i,s+u,c+u);return p&&m}getCenterPoint(e){let{x:t,y:n,startAngle:r,endAngle:i,innerRadius:a,outerRadius:o}=this.getProps([`x`,`y`,`startAngle`,`endAngle`,`innerRadius`,`outerRadius`],e),{offset:s,spacing:c}=this.options,l=(r+i)/2,u=(a+o+c+s)/2;return{x:t+Math.cos(l)*u,y:n+Math.sin(l)*u}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){let{options:t,circumference:n}=this,r=(t.offset||0)/4,i=(t.spacing||0)/2,a=t.circular;if(this.pixelMargin=t.borderAlign===`inner`?.33:0,this.fullCircles=n>R?Math.floor(n/R):0,n===0||this.innerRadius<0||this.outerRadius<0)return;e.save();let o=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(o)*r,Math.sin(o)*r);let s=r*(1-Math.sin(Math.min(L,n||0)));e.fillStyle=t.backgroundColor,e.strokeStyle=t.borderColor,Go(e,this,s,i,a),Ko(e,this,s,i,a),e.restore()}};function Jo(e,t,n=t){e.lineCap=P(n.borderCapStyle,t.borderCapStyle),e.setLineDash(P(n.borderDash,t.borderDash)),e.lineDashOffset=P(n.borderDashOffset,t.borderDashOffset),e.lineJoin=P(n.borderJoinStyle,t.borderJoinStyle),e.lineWidth=P(n.borderWidth,t.borderWidth),e.strokeStyle=P(n.borderColor,t.borderColor)}function Yo(e,t,n){e.lineTo(n.x,n.y)}function Xo(e){return e.stepped?ln:e.tension||e.cubicInterpolationMode===`monotone`?un:Yo}function Zo(e,t,n={}){let r=e.length,{start:i=0,end:a=r-1}=n,{start:o,end:s}=t,c=Math.max(i,o),l=Math.min(a,s),u=is&&a>s;return{count:r,start:c,loop:t.loop,ilen:l(o+(l?s-e:e))%a,y=()=>{h!==g&&(e.lineTo(u,g),e.lineTo(u,h),e.lineTo(u,_))};for(c&&(p=i[v(0)],e.moveTo(p.x,p.y)),f=0;f<=s;++f){if(p=i[v(f)],p.skip)continue;let t=p.x,n=p.y,r=t|0;r===m?(ng&&(g=n),u=(d*u+t)/++d):(y(),e.lineTo(t,n),m=r,d=0,h=g=n),_=n}y()}function es(e){let t=e.options,n=t.borderDash&&t.borderDash.length;return!e._decimated&&!e._loop&&!t.tension&&t.cubicInterpolationMode!==`monotone`&&!t.stepped&&!n?$o:Qo}function ts(e){return e.stepped?vr:e.tension||e.cubicInterpolationMode===`monotone`?yr:_r}function ns(e,t,n,r){let i=t._path;i||(i=t._path=new Path2D,t.path(i,n,r)&&i.closePath()),Jo(e,t.options),e.stroke(i)}function rs(e,t,n,r){let{segments:i,options:a}=t,o=es(t);for(let s of i)Jo(e,a,s.style),e.beginPath(),o(e,t,s,{start:n,end:n+r-1})&&e.closePath(),e.stroke()}var is=typeof Path2D==`function`;function as(e,t,n,r){is&&!t.options.segment?ns(e,t,n,r):rs(e,t,n,r)}var os=class extends ka{static id=`line`;static defaults={borderCapStyle:`butt`,borderDash:[],borderDashOffset:0,borderJoinStyle:`miter`,borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:`default`,fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:`backgroundColor`,borderColor:`borderColor`};static descriptors={_scriptable:!0,_indexable:e=>e!==`borderDash`&&e!==`fill`};constructor(e){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,e&&Object.assign(this,e)}updateControlPoints(e,t){let n=this.options;if((n.tension||n.cubicInterpolationMode===`monotone`)&&!n.stepped&&!this._pointsUpdated){let r=n.spanGaps?this._loop:this._fullLoop;er(this._points,n,e,r,t),this._pointsUpdated=!0}}set points(e){this._points=e,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||=Mr(this,this.options.segment)}first(){let e=this.segments,t=this.points;return e.length&&t[e[0].start]}last(){let e=this.segments,t=this.points,n=e.length;return n&&t[e[n-1].end]}interpolate(e,t){let n=this.options,r=e[t],i=this.points,a=kr(this,{property:t,start:r,end:r});if(!a.length)return;let o=[],s=ts(n),c,l;for(c=0,l=a.length;c{t=Ss(e,t,i);let o=i[e],s=i[t];r===null?n!==null&&(a.push({x:n,y:o.y}),a.push({x:n,y:s.y})):(a.push({x:o.x,y:r}),a.push({x:s.x,y:r}))}),a}function Ss(e,t,n){for(;t>e;t--){let e=n[t];if(!isNaN(e.x)&&!isNaN(e.y))break}return t}function Cs(e,t,n,r){return e&&t?r(e[n],t[n]):e?e[n]:t?t[n]:0}function ws(e,t){let n=[],r=!1;return A(e)?(r=!0,n=e):n=xs(e,t),n.length?new os({points:n,options:{tension:0},_loop:r,_fullLoop:r}):null}function Ts(e){return e&&e.fill!==!1}function Es(e,t,n){let r=e[t].fill,i=[t],a;if(!n)return r;for(;r!==!1&&i.indexOf(r)===-1;){if(!M(r))return r;if(a=e[r],!a)return!1;if(a.visible)return r;i.push(r),r=a.fill}return!1}function Ds(e,t,n){let r=js(e);if(j(r))return isNaN(r.value)?!1:r;let i=parseFloat(r);return M(i)&&Math.floor(i)===i?Os(r[0],t,i,n):[`origin`,`start`,`end`,`stack`,`shape`].indexOf(r)>=0&&r}function Os(e,t,n,r){return(e===`-`||e===`+`)&&(n=t+n),n===t||n<0||n>=r?!1:n}function ks(e,t){let n=null;return e===`start`?n=t.bottom:e===`end`?n=t.top:j(e)?n=t.getPixelForValue(e.value):t.getBasePixel&&(n=t.getBasePixel()),n}function As(e,t,n){let r;return r=e===`start`?n:e===`end`?t.options.reverse?t.min:t.max:j(e)?e.value:t.getBaseValue(),r}function js(e){let t=e.options,n=t.fill,r=P(n&&n.target,n);return r===void 0&&(r=!!t.backgroundColor),r===!1||r===null?!1:r===!0?`origin`:r}function Ms(e){let{scale:t,index:n,line:r}=e,i=[],a=r.segments,o=r.points,s=Ns(t,n);s.push(ws({x:null,y:t.bottom},r));for(let e=0;e=0;--t){let n=i[t].$filler;n&&(n.line.updateControlPoints(a,n.axis),r&&n.fill&&Hs(e.ctx,n,a))}},beforeDatasetsDraw(e,t,n){if(n.drawTime!==`beforeDatasetsDraw`)return;let r=e.getSortedVisibleDatasetMetas();for(let t=r.length-1;t>=0;--t){let n=r[t].$filler;Ts(n)&&Hs(e.ctx,n,e.chartArea)}},beforeDatasetDraw(e,t,n){let r=t.meta.$filler;!Ts(r)||n.drawTime!==`beforeDatasetDraw`||Hs(e.ctx,r,e.chartArea)},defaults:{propagate:!0,drawTime:`beforeDatasetDraw`}},Xs=(e,t)=>{let{boxHeight:n=t,boxWidth:r=t}=e;return e.usePointStyle&&(n=Math.min(n,t),r=e.pointStyleWidth||Math.min(r,t)),{boxWidth:r,boxHeight:n,itemHeight:Math.max(t,n)}},Zs=(e,t)=>e!==null&&t!==null&&e.datasetIndex===t.datasetIndex&&e.index===t.index,Qs=class extends ka{constructor(e){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=e.chart,this.options=e.options,this.ctx=e.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(e,t,n){this.maxWidth=e,this.maxHeight=t,this._margins=n,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){let e=this.options.labels||{},t=F(e.generateLabels,[this.chart],this)||[];e.filter&&(t=t.filter(t=>e.filter(t,this.chart.data))),e.sort&&(t=t.sort((t,n)=>e.sort(t,n,this.chart.data))),this.options.reverse&&t.reverse(),this.legendItems=t}fit(){let{options:e,ctx:t}=this;if(!e.display){this.width=this.height=0;return}let n=e.labels,r=J(n.font),i=r.size,a=this._computeTitleHeight(),{boxWidth:o,itemHeight:s}=Xs(n,i),c,l;t.font=r.string,this.isHorizontal()?(c=this.maxWidth,l=this._fitRows(a,i,o,s)+10):(l=this.maxHeight,c=this._fitCols(a,r,o,s)+10),this.width=Math.min(c,e.maxWidth||this.maxWidth),this.height=Math.min(l,e.maxHeight||this.maxHeight)}_fitRows(e,t,n,r){let{ctx:i,maxWidth:a,options:{labels:{padding:o}}}=this,s=this.legendHitBoxes=[],c=this.lineWidths=[0],l=r+o,u=e;i.textAlign=`left`,i.textBaseline=`middle`;let d=-1,f=-l;return this.legendItems.forEach((e,p)=>{let m=n+t/2+i.measureText(e.text).width;(p===0||c[c.length-1]+m+2*o>a)&&(u+=l,c[c.length-(p>0?0:1)]=0,f+=l,d++),s[p]={left:0,top:f,row:d,width:m,height:r},c[c.length-1]+=m+o}),u}_fitCols(e,t,n,r){let{ctx:i,maxHeight:a,options:{labels:{padding:o}}}=this,s=this.legendHitBoxes=[],c=this.columnSizes=[],l=a-e,u=o,d=0,f=0,p=0,m=0;return this.legendItems.forEach((e,a)=>{let{itemWidth:h,itemHeight:g}=$s(n,t,i,e,r);a>0&&f+g+2*o>l&&(u+=d+o,c.push({width:d,height:f}),p+=d+o,m++,d=f=0),s[a]={left:p,top:f,col:m,width:h,height:g},d=Math.max(d,h),f+=g+o}),u+=d,c.push({width:d,height:f}),u}adjustHitBoxes(){if(!this.options.display)return;let e=this._computeTitleHeight(),{legendHitBoxes:t,options:{align:n,labels:{padding:r},rtl:i}}=this,a=Sr(i,this.left,this.width);if(this.isHorizontal()){let i=0,o=G(n,this.left+r,this.right-this.lineWidths[i]);for(let s of t)i!==s.row&&(i=s.row,o=G(n,this.left+r,this.right-this.lineWidths[i])),s.top+=this.top+e+r,s.left=a.leftForLtr(a.x(o),s.width),o+=s.width+r}else{let i=0,o=G(n,this.top+e+r,this.bottom-this.columnSizes[i].height);for(let s of t)s.col!==i&&(i=s.col,o=G(n,this.top+e+r,this.bottom-this.columnSizes[i].height)),s.top=o,s.left+=this.left+r,s.left=a.leftForLtr(a.x(s.left),s.width),o+=s.height+r}}isHorizontal(){return this.options.position===`top`||this.options.position===`bottom`}draw(){if(this.options.display){let e=this.ctx;sn(e,this),this._draw(),cn(e)}}_draw(){let{options:e,columnSizes:t,lineWidths:n,ctx:r}=this,{align:i,labels:a}=e,o=K.color,s=Sr(e.rtl,this.left,this.width),c=J(a.font),{padding:l}=a,u=c.size,d=u/2,f;this.drawTitle(),r.textAlign=s.textAlign(`left`),r.textBaseline=`middle`,r.lineWidth=.5,r.font=c.string;let{boxWidth:p,boxHeight:m,itemHeight:h}=Xs(a,u),g=function(e,t,n){if(isNaN(p)||p<=0||isNaN(m)||m<0)return;r.save();let i=P(n.lineWidth,1);if(r.fillStyle=P(n.fillStyle,o),r.lineCap=P(n.lineCap,`butt`),r.lineDashOffset=P(n.lineDashOffset,0),r.lineJoin=P(n.lineJoin,`miter`),r.lineWidth=i,r.strokeStyle=P(n.strokeStyle,o),r.setLineDash(P(n.lineDash,[])),a.usePointStyle)an(r,{radius:m*Math.SQRT2/2,pointStyle:n.pointStyle,rotation:n.rotation,borderWidth:i},s.xPlus(e,p/2),t+d,a.pointStyleWidth&&p);else{let a=t+Math.max((u-m)/2,0),o=s.leftForLtr(e,p),c=Sn(n.borderRadius);r.beginPath(),Object.values(c).some(e=>e!==0)?hn(r,{x:o,y:a,w:p,h:m,radius:c}):r.rect(o,a,p,m),r.fill(),i!==0&&r.stroke()}r.restore()},_=function(e,t,n){mn(r,n.text,e,t+h/2,c,{strikethrough:n.hidden,textAlign:s.textAlign(n.textAlign)})},v=this.isHorizontal(),y=this._computeTitleHeight();f=v?{x:G(i,this.left+l,this.right-n[0]),y:this.top+l+y,line:0}:{x:this.left+l,y:G(i,this.top+y+l,this.bottom-t[0].height),line:0},Cr(this.ctx,e.textDirection);let b=h+l;this.legendItems.forEach((o,u)=>{r.strokeStyle=o.fontColor,r.fillStyle=o.fontColor;let m=r.measureText(o.text).width,h=s.textAlign(o.textAlign||=a.textAlign),x=p+d+m,S=f.x,C=f.y;if(s.setWidth(this.width),v?u>0&&S+x+l>this.right&&(C=f.y+=b,f.line++,S=f.x=G(i,this.left+l,this.right-n[f.line])):u>0&&C+b>this.bottom&&(S=f.x=S+t[f.line].width+l,f.line++,C=f.y=G(i,this.top+y+l,this.bottom-t[f.line].height)),g(s.x(S),C,o),S=Dt(h,S+p+d,v?S+x:this.right,e.rtl),_(s.x(S),C,o),v)f.x+=x+l;else if(typeof o.text!=`string`){let e=c.lineHeight;f.y+=nc(o,e)+l}else f.y+=b}),wr(this.ctx,e.textDirection)}drawTitle(){let e=this.options,t=e.title,n=J(t.font),r=q(t.padding);if(!t.display)return;let i=Sr(e.rtl,this.left,this.width),a=this.ctx,o=t.position,s=n.size/2,c=r.top+s,l,u=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),l=this.top+c,u=G(e.align,u,this.right-d);else{let t=this.columnSizes.reduce((e,t)=>Math.max(e,t.height),0);l=c+G(e.align,this.top,this.bottom-t-e.labels.padding-this._computeTitleHeight())}let f=G(o,u,u+d);a.textAlign=i.textAlign(Et(o)),a.textBaseline=`middle`,a.strokeStyle=t.color,a.fillStyle=t.color,a.font=n.string,mn(a,t.text,f,l,n)}_computeTitleHeight(){let e=this.options.title,t=J(e.font),n=q(e.padding);return e.display?t.lineHeight+n.height:0}_getLegendItemAt(e,t){let n,r,i;if(W(e,this.left,this.right)&&W(t,this.top,this.bottom)){for(i=this.legendHitBoxes,n=0;ne.length>t.length?e:t)),t+n.size/2+r.measureText(i).width}function tc(e,t,n){let r=e;return typeof t.text!=`string`&&(r=nc(t,n)),r}function nc(e,t){return t*(e.text?e.text.length:0)}function rc(e,t){return!!((e===`mousemove`||e===`mouseout`)&&(t.onHover||t.onLeave)||t.onClick&&(e===`click`||e===`mouseup`))}var ic={id:`legend`,_element:Qs,start(e,t,n){let r=e.legend=new Qs({ctx:e.ctx,options:n,chart:e});Y.configure(e,r,n),Y.addBox(e,r)},stop(e){Y.removeBox(e,e.legend),delete e.legend},beforeUpdate(e,t,n){let r=e.legend;Y.configure(e,r,n),r.options=n},afterUpdate(e){let t=e.legend;t.buildLabels(),t.adjustHitBoxes()},afterEvent(e,t){t.replay||e.legend.handleEvent(t.event)},defaults:{display:!0,position:`top`,align:`center`,fullSize:!0,reverse:!1,weight:1e3,onClick(e,t,n){let r=t.datasetIndex,i=n.chart;i.isDatasetVisible(r)?(i.hide(r),t.hidden=!0):(i.show(r),t.hidden=!1)},onHover:null,onLeave:null,labels:{color:e=>e.chart.options.color,boxWidth:40,padding:10,generateLabels(e){let t=e.data.datasets,{labels:{usePointStyle:n,pointStyle:r,textAlign:i,color:a,useBorderRadius:o,borderRadius:s}}=e.legend.options;return e._getSortedDatasetMetas().map(e=>{let c=e.controller.getStyle(n?0:void 0),l=q(c.borderWidth);return{text:t[e.index].label,fillStyle:c.backgroundColor,fontColor:a,hidden:!e.visible,lineCap:c.borderCapStyle,lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:(l.width+l.height)/4,strokeStyle:c.borderColor,pointStyle:r||c.pointStyle,rotation:c.rotation,textAlign:i||c.textAlign,borderRadius:o&&(s||c.borderRadius),datasetIndex:e.index}},this)}},title:{color:e=>e.chart.options.color,display:!1,position:`center`,text:``}},descriptors:{_scriptable:e=>!e.startsWith(`on`),labels:{_scriptable:e=>![`generateLabels`,`filter`,`sort`].includes(e)}}},ac=class extends ka{constructor(e){super(),this.chart=e.chart,this.options=e.options,this.ctx=e.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(e,t){let n=this.options;if(this.left=0,this.top=0,!n.display){this.width=this.height=this.right=this.bottom=0;return}this.width=this.right=e,this.height=this.bottom=t;let r=A(n.text)?n.text.length:1;this._padding=q(n.padding);let i=r*J(n.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=i:this.width=i}isHorizontal(){let e=this.options.position;return e===`top`||e===`bottom`}_drawArgs(e){let{top:t,left:n,bottom:r,right:i,options:a}=this,o=a.align,s=0,c,l,u;return this.isHorizontal()?(l=G(o,n,i),u=t+e,c=i-n):(a.position===`left`?(l=n+e,u=G(o,r,t),s=L*-.5):(l=i-e,u=G(o,t,r),s=L*.5),c=r-t),{titleX:l,titleY:u,maxWidth:c,rotation:s}}draw(){let e=this.ctx,t=this.options;if(!t.display)return;let n=J(t.font),r=n.lineHeight/2+this._padding.top,{titleX:i,titleY:a,maxWidth:o,rotation:s}=this._drawArgs(r);mn(e,t.text,0,0,n,{color:t.color,maxWidth:o,rotation:s,textAlign:Et(t.align),textBaseline:`middle`,translation:[i,a]})}};function oc(e,t){let n=new ac({ctx:e.ctx,options:t,chart:e});Y.configure(e,n,t),Y.addBox(e,n),e.titleBlock=n}var sc={id:`title`,_element:ac,start(e,t,n){oc(e,n)},stop(e){let t=e.titleBlock;Y.removeBox(e,t),delete e.titleBlock},beforeUpdate(e,t,n){let r=e.titleBlock;Y.configure(e,r,n),r.options=n},defaults:{align:`center`,display:!1,font:{weight:`bold`},fullSize:!0,padding:10,position:`top`,text:``,weight:2e3},defaultRoutes:{color:`color`},descriptors:{_scriptable:!0,_indexable:!1}},cc={average(e){if(!e.length)return!1;let t,n,r=new Set,i=0,a=0;for(t=0,n=e.length;te+t)/r.size,y:i/a}},nearest(e,t){if(!e.length)return!1;let n=t.x,r=t.y,i=1/0,a,o,s;for(a=0,o=e.length;a-1?e.split(` `):e}function uc(e,t){let{element:n,datasetIndex:r,index:i}=t,a=e.getDatasetMeta(r).controller,{label:o,value:s}=a.getLabelAndValue(i);return{chart:e,label:o,parsed:a.getParsed(i),raw:e.data.datasets[r].data[i],formattedValue:s,dataset:a.getDataset(),dataIndex:i,datasetIndex:r,element:n}}function dc(e,t){let n=e.chart.ctx,{body:r,footer:i,title:a}=e,{boxWidth:o,boxHeight:s}=t,c=J(t.bodyFont),l=J(t.titleFont),u=J(t.footerFont),d=a.length,f=i.length,p=r.length,m=q(t.padding),h=m.height,g=0,_=r.reduce((e,t)=>e+t.before.length+t.lines.length+t.after.length,0);if(_+=e.beforeBody.length+e.afterBody.length,d&&(h+=d*l.lineHeight+(d-1)*t.titleSpacing+t.titleMarginBottom),_){let e=t.displayColors?Math.max(s,c.lineHeight):c.lineHeight;h+=p*e+(_-p)*c.lineHeight+(_-1)*t.bodySpacing}f&&(h+=t.footerMarginTop+f*u.lineHeight+(f-1)*t.footerSpacing);let v=0,y=function(e){g=Math.max(g,n.measureText(e).width+v)};return n.save(),n.font=l.string,I(e.title,y),n.font=c.string,I(e.beforeBody.concat(e.afterBody),y),v=t.displayColors?o+2+t.boxPadding:0,I(r,e=>{I(e.before,y),I(e.lines,y),I(e.after,y)}),v=0,n.font=u.string,I(e.footer,y),n.restore(),g+=m.width,{width:g,height:h}}function fc(e,t){let{y:n,height:r}=t;return ne.height-r/2?`bottom`:`center`}function pc(e,t,n,r){let{x:i,width:a}=r,o=n.caretSize+n.caretPadding;if(e===`left`&&i+a+o>t.width||e===`right`&&i-a-o<0)return!0}function mc(e,t,n,r){let{x:i,width:a}=n,{width:o,chartArea:{left:s,right:c}}=e,l=`center`;return r===`center`?l=i<=(s+c)/2?`left`:`right`:i<=a/2?l=`left`:i>=o-a/2&&(l=`right`),pc(l,e,t,n)&&(l=`center`),l}function hc(e,t,n){let r=n.yAlign||t.yAlign||fc(e,n);return{xAlign:n.xAlign||t.xAlign||mc(e,t,n,r),yAlign:r}}function gc(e,t){let{x:n,width:r}=e;return t===`right`?n-=r:t===`center`&&(n-=r/2),n}function _c(e,t,n){let{y:r,height:i}=e;return t===`top`?r+=n:t===`bottom`?r-=i+n:r-=i/2,r}function vc(e,t,n,r){let{caretSize:i,caretPadding:a,cornerRadius:o}=e,{xAlign:s,yAlign:c}=n,l=i+a,{topLeft:u,topRight:d,bottomLeft:f,bottomRight:p}=Sn(o),m=gc(t,s),h=_c(t,c,l);return c===`center`?s===`left`?m+=l:s===`right`&&(m-=l):s===`left`?m-=Math.max(u,f)+i:s===`right`&&(m+=Math.max(d,p)+i),{x:U(m,0,r.width-t.width),y:U(h,0,r.height-t.height)}}function yc(e,t,n){let r=q(n.padding);return t===`center`?e.x+e.width/2:t===`right`?e.x+e.width-r.right:e.x+r.left}function bc(e){return Z([],lc(e))}function xc(e,t,n){return Tn(e,{tooltip:t,tooltipItems:n,type:`tooltip`})}function Sc(e,t){let n=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return n?e.override(n):e}var Cc={beforeTitle:ke,title(e){if(e.length>0){let t=e[0],n=t.chart.data.labels,r=n?n.length:0;if(this&&this.options&&this.options.mode===`dataset`)return t.dataset.label||``;if(t.label)return t.label;if(r>0&&t.dataIndex{let t={before:[],lines:[],after:[]},i=Sc(n,e);Z(t.before,lc(Q(i,`beforeLabel`,this,e))),Z(t.lines,Q(i,`label`,this,e)),Z(t.after,lc(Q(i,`afterLabel`,this,e))),r.push(t)}),r}getAfterBody(e,t){return bc(Q(t.callbacks,`afterBody`,this,e))}getFooter(e,t){let{callbacks:n}=t,r=Q(n,`beforeFooter`,this,e),i=Q(n,`footer`,this,e),a=Q(n,`afterFooter`,this,e),o=[];return o=Z(o,lc(r)),o=Z(o,lc(i)),o=Z(o,lc(a)),o}_createItems(e){let t=this._active,n=this.chart.data,r=[],i=[],a=[],o=[],s,c;for(s=0,c=t.length;se.filter(t,r,i,n))),e.itemSort&&(o=o.sort((t,r)=>e.itemSort(t,r,n))),I(o,t=>{let n=Sc(e.callbacks,t);r.push(Q(n,`labelColor`,this,t)),i.push(Q(n,`labelPointStyle`,this,t)),a.push(Q(n,`labelTextColor`,this,t))}),this.labelColors=r,this.labelPointStyles=i,this.labelTextColors=a,this.dataPoints=o,o}update(e,t){let n=this.options.setContext(this.getContext()),r=this._active,i,a=[];if(!r.length)this.opacity!==0&&(i={opacity:0});else{let e=cc[n.position].call(this,r,this._eventPosition);a=this._createItems(n),this.title=this.getTitle(a,n),this.beforeBody=this.getBeforeBody(a,n),this.body=this.getBody(a,n),this.afterBody=this.getAfterBody(a,n),this.footer=this.getFooter(a,n);let t=this._size=dc(this,n),o=Object.assign({},e,t),s=hc(this.chart,n,o),c=vc(n,o,s,this.chart);this.xAlign=s.xAlign,this.yAlign=s.yAlign,i={opacity:1,x:c.x,y:c.y,width:t.width,height:t.height,caretX:e.x,caretY:e.y}}this._tooltipItems=a,this.$context=void 0,i&&this._resolveAnimations().update(this,i),e&&n.external&&n.external.call(this,{chart:this.chart,tooltip:this,replay:t})}drawCaret(e,t,n,r){let i=this.getCaretPosition(e,n,r);t.lineTo(i.x1,i.y1),t.lineTo(i.x2,i.y2),t.lineTo(i.x3,i.y3)}getCaretPosition(e,t,n){let{xAlign:r,yAlign:i}=this,{caretSize:a,cornerRadius:o}=n,{topLeft:s,topRight:c,bottomLeft:l,bottomRight:u}=Sn(o),{x:d,y:f}=e,{width:p,height:m}=t,h,g,_,v,y,b;return i===`center`?(y=f+m/2,r===`left`?(h=d,g=h-a,v=y+a,b=y-a):(h=d+p,g=h+a,v=y-a,b=y+a),_=h):(g=r===`left`?d+Math.max(s,l)+a:r===`right`?d+p-Math.max(c,u)-a:this.caretX,i===`top`?(v=f,y=v-a,h=g-a,_=g+a):(v=f+m,y=v+a,h=g+a,_=g-a),b=v),{x1:h,x2:g,x3:_,y1:v,y2:y,y3:b}}drawTitle(e,t,n){let r=this.title,i=r.length,a,o,s;if(i){let c=Sr(n.rtl,this.x,this.width);for(e.x=yc(this,n.titleAlign,n),t.textAlign=c.textAlign(n.titleAlign),t.textBaseline=`middle`,a=J(n.titleFont),o=n.titleSpacing,t.fillStyle=n.titleColor,t.font=a.string,s=0;se!==0)?(e.beginPath(),e.fillStyle=i.multiKeyBackground,hn(e,{x:t,y:p,w:c,h:s,radius:o}),e.fill(),e.stroke(),e.fillStyle=a.backgroundColor,e.beginPath(),hn(e,{x:n,y:p+1,w:c-2,h:s-2,radius:o}),e.fill()):(e.fillStyle=i.multiKeyBackground,e.fillRect(t,p,c,s),e.strokeRect(t,p,c,s),e.fillStyle=a.backgroundColor,e.fillRect(n,p+1,c-2,s-2))}e.fillStyle=this.labelTextColors[n]}drawBody(e,t,n){let{body:r}=this,{bodySpacing:i,bodyAlign:a,displayColors:o,boxHeight:s,boxWidth:c,boxPadding:l}=n,u=J(n.bodyFont),d=u.lineHeight,f=0,p=Sr(n.rtl,this.x,this.width),m=function(n){t.fillText(n,p.x(e.x+f),e.y+d/2),e.y+=d+i},h=p.textAlign(a),g,_,v,y,b,x,S;for(t.textAlign=a,t.textBaseline=`middle`,t.font=u.string,e.x=yc(this,h,n),t.fillStyle=n.bodyColor,I(this.beforeBody,m),f=o&&h!==`right`?a===`center`?c/2+l:c+2+l:0,y=0,x=r.length;y0&&t.stroke()}_updateAnimationTarget(e){let t=this.chart,n=this.$animations,r=n&&n.x,i=n&&n.y;if(r||i){let n=cc[e.position].call(this,this._active,this._eventPosition);if(!n)return;let a=this._size=dc(this,e),o=Object.assign({},n,this._size),s=hc(t,e,o),c=vc(e,o,s,t);(r._to!==c.x||i._to!==c.y)&&(this.xAlign=s.xAlign,this.yAlign=s.yAlign,this.width=a.width,this.height=a.height,this.caretX=n.x,this.caretY=n.y,this._resolveAnimations().update(this,c))}}_willRender(){return!!this.opacity}draw(e){let t=this.options.setContext(this.getContext()),n=this.opacity;if(!n)return;this._updateAnimationTarget(t);let r={width:this.width,height:this.height},i={x:this.x,y:this.y};n=Math.abs(n)<.001?0:n;let a=q(t.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;t.enabled&&o&&(e.save(),e.globalAlpha=n,this.drawBackground(i,e,r,t),Cr(e,t.textDirection),i.y+=a.top,this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),wr(e,t.textDirection),e.restore())}getActiveElements(){return this._active||[]}setActiveElements(e,t){let n=this._active,r=e.map(({datasetIndex:e,index:t})=>{let n=this.chart.getDatasetMeta(e);if(!n)throw Error(`Cannot find a dataset at index `+e);return{datasetIndex:e,element:n.data[t],index:t}}),i=!Ne(n,r),a=this._positionChanged(r,t);(i||a)&&(this._active=r,this._eventPosition=t,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(e,t,n=!0){if(t&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;let r=this.options,i=this._active||[],a=this._getActiveElements(e,i,t,n),o=this._positionChanged(a,e),s=t||!Ne(a,i)||o;return s&&(this._active=a,(r.enabled||r.external)&&(this._eventPosition={x:e.x,y:e.y},this.update(!0,t))),s}_getActiveElements(e,t,n,r){let i=this.options;if(e.type===`mouseout`)return[];if(!r)return t.filter(e=>this.chart.data.datasets[e.datasetIndex]&&this.chart.getDatasetMeta(e.datasetIndex).controller.getParsed(e.index)!==void 0);let a=this.chart.getElementsAtEventForMode(e,i.mode,i,n);return i.reverse&&a.reverse(),a}_positionChanged(e,t){let{caretX:n,caretY:r,options:i}=this,a=cc[i.position].call(this,e,t);return a!==!1&&(n!==a.x||r!==a.y)}},Tc={id:`tooltip`,_element:wc,positioners:cc,afterInit(e,t,n){n&&(e.tooltip=new wc({chart:e,options:n}))},beforeUpdate(e,t,n){e.tooltip&&e.tooltip.initialize(n)},reset(e,t,n){e.tooltip&&e.tooltip.initialize(n)},afterDraw(e){let t=e.tooltip;if(t&&t._willRender()){let n={tooltip:t};if(e.notifyPlugins(`beforeTooltipDraw`,{...n,cancelable:!0})===!1)return;t.draw(e.ctx),e.notifyPlugins(`afterTooltipDraw`,n)}},afterEvent(e,t){if(e.tooltip){let n=t.replay;e.tooltip.handleEvent(t.event,n,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:`average`,backgroundColor:`rgba(0,0,0,0.8)`,titleColor:`#fff`,titleFont:{weight:`bold`},titleSpacing:2,titleMarginBottom:6,titleAlign:`left`,bodyColor:`#fff`,bodySpacing:2,bodyFont:{},bodyAlign:`left`,footerColor:`#fff`,footerSpacing:2,footerMarginTop:6,footerFont:{weight:`bold`},footerAlign:`left`,padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(e,t)=>t.bodyFont.size,boxWidth:(e,t)=>t.bodyFont.size,multiKeyBackground:`#fff`,displayColors:!0,boxPadding:0,borderColor:`rgba(0,0,0,0)`,borderWidth:0,animation:{duration:400,easing:`easeOutQuart`},animations:{numbers:{type:`number`,properties:[`x`,`y`,`width`,`height`,`caretX`,`caretY`]},opacity:{easing:`linear`,duration:200}},callbacks:Cc},defaultRoutes:{bodyFont:`font`,footerFont:`font`,titleFont:`font`},descriptors:{_scriptable:e=>e!==`filter`&&e!==`itemSort`&&e!==`external`,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:`animation`}},additionalOptionScopes:[`interaction`]},Ec=(e,t,n,r)=>(typeof t==`string`?(n=e.push(t)-1,r.unshift({index:n,label:t})):isNaN(t)&&(n=null),n);function Dc(e,t,n,r){let i=e.indexOf(t);return i===-1?Ec(e,t,n,r):i===e.lastIndexOf(t)?i:n}var Oc=(e,t)=>e===null?null:U(Math.round(e),0,t);function kc(e){let t=this.getLabels();return e>=0&&et.length-1?null:this.getPixelForValue(t[e].value)}getValueForPixel(e){return Math.round(this._startValue+this.getDecimalForPixel(e)*this._valueRange)}getBasePixel(){return this.bottom}};function jc(e,t){let n=[],{bounds:r,step:i,min:a,max:o,precision:s,count:c,maxTicks:l,maxDigits:u,includeBounds:d}=e,f=i||1,p=l-1,{min:m,max:h}=t,g=!k(a),_=!k(o),v=!k(c),y=(h-m)/(u+1),b=nt((h-m)/p/f)*f,x,S,C,w;if(b<1e-14&&!g&&!_)return[{value:m},{value:h}];w=Math.ceil(h/b)-Math.floor(m/b),w>p&&(b=nt(w*b/p/f)*f),k(s)||(x=10**s,b=Math.ceil(b*x)/x),r===`ticks`?(S=Math.floor(m/b)*b,C=Math.ceil(h/b)*b):(S=m,C=h),g&&_&&i&&ot((o-a)/i,b/1e3)?(w=Math.round(Math.min((o-a)/b,l)),b=(o-a)/w,S=a,C=o):v?(S=g?a:S,C=_?o:C,w=c-1,b=(C-S)/w):(w=(C-S)/b,w=tt(w,Math.round(w),b/1e3)?Math.round(w):Math.ceil(w));let T=Math.max(lt(b),lt(S));x=10**(k(s)?T:s),S=Math.round(S*x)/x,C=Math.round(C*x)/x;let E=0;for(g&&(d&&S!==a?(n.push({value:a}),So)break;n.push({value:e})}return _&&d&&C!==o?n.length&&tt(n[n.length-1].value,o,Mc(o,y,e))?n[n.length-1].value=o:n.push({value:o}):(!_||C===o)&&n.push({value:C}),n}function Mc(e,t,{horizontal:n,minRotation:r}){let i=V(r),a=(n?Math.sin(i):Math.cos(i))||.001,o=.75*t*(``+e).length;return Math.min(t/a,o)}var Nc=class extends Ya{constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(e,t){return k(e)||(typeof e==`number`||e instanceof Number)&&!isFinite(+e)?null:+e}handleTickRangeOptions(){let{beginAtZero:e}=this.options,{minDefined:t,maxDefined:n}=this.getUserBounds(),{min:r,max:i}=this,a=e=>r=t?r:e,o=e=>i=n?i:e;if(e){let e=B(r),t=B(i);e<0&&t<0?o(0):e>0&&t>0&&a(0)}if(r===i){let t=i===0?1:Math.abs(i*.05);o(i+t),e||a(r-t)}this.min=r,this.max=i}getTickLimit(){let{maxTicksLimit:e,stepSize:t}=this.options.ticks,n;return t?(n=Math.ceil(this.max/t)-Math.floor(this.min/t)+1,n>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${t} would result generating up to ${n} ticks. Limiting to 1000.`),n=1e3)):(n=this.computeTickLimit(),e||=11),e&&(n=Math.min(e,n)),n}computeTickLimit(){return 1/0}buildTicks(){let e=this.options,t=e.ticks,n=this.getTickLimit();n=Math.max(2,n);let r=jc({maxTicks:n,bounds:e.bounds,min:e.min,max:e.max,precision:t.precision,step:t.stepSize,count:t.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:t.minRotation||0,includeBounds:t.includeBounds!==!1},this._range||this);return e.bounds===`ticks`&&st(r,this,`value`),e.reverse?(r.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),r}configure(){let e=this.ticks,t=this.min,n=this.max;if(super.configure(),this.options.offset&&e.length){let r=(n-t)/Math.max(e.length-1,1)/2;t-=r,n+=r}this._startValue=t,this._endValue=n,this._valueRange=n-t}getLabelForValue(e){return Ut(e,this.chart.options.locale,this.options.ticks.format)}},Pc=class extends Nc{static id=`linear`;static defaults={ticks:{callback:Kt.formatters.numeric}};determineDataLimits(){let{min:e,max:t}=this.getMinMax(!0);this.min=M(e)?e:0,this.max=M(t)?t:1,this.handleTickRangeOptions()}computeTickLimit(){let e=this.isHorizontal(),t=e?this.width:this.height,n=V(this.options.ticks.minRotation),r=(e?Math.sin(n):Math.cos(n))||.001,i=this._resolveTickFontOptions(0);return Math.ceil(t/Math.min(40,i.lineHeight/r))}getPixelForValue(e){return e===null?NaN:this.getPixelForDecimal((e-this._startValue)/this._valueRange)}getValueForPixel(e){return this._startValue+this.getDecimalForPixel(e)*this._valueRange}},Fc=e=>Math.floor(et(e)),Ic=(e,t)=>10**(Fc(e)+t);function Lc(e){return e/10**Fc(e)==1}function Rc(e,t,n){let r=10**n,i=Math.floor(e/r);return Math.ceil(t/r)-i}function zc(e,t){let n=Fc(t-e);for(;Rc(e,t,n)>10;)n++;for(;Rc(e,t,n)<10;)n--;return Math.min(n,Fc(e))}function Bc(e,{min:t,max:n}){t=N(e.min,t);let r=[],i=Fc(t),a=zc(t,n),o=a<0?10**Math.abs(a):1,s=10**a,c=i>a?10**i:0,l=Math.round((t-c)*o)/o,u=Math.floor((t-c)/s/10)*s*10,d=Math.floor((l-u)/10**a),f=N(e.min,Math.round((c+u+d*10**a)*o)/o);for(;f=10?d=d<15?15:20:d++,d>=20&&(a++,d=2,o=a>=0?1:o),f=Math.round((c+u+d*10**a)*o)/o;let p=N(e.max,f);return r.push({value:p,major:Lc(p),significand:d}),r}(class extends Ya{static id=`logarithmic`;static defaults={ticks:{callback:Kt.formatters.logarithmic,major:{enabled:!0}}};constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(e,t){let n=Nc.prototype.parse.apply(this,[e,t]);if(n===0){this._zero=!0;return}return M(n)&&n>0?n:null}determineDataLimits(){let{min:e,max:t}=this.getMinMax(!0);this.min=M(e)?Math.max(0,e):null,this.max=M(t)?Math.max(0,t):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!M(this._userMin)&&(this.min=e===Ic(this.min,0)?Ic(this.min,-1):Ic(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){let{minDefined:e,maxDefined:t}=this.getUserBounds(),n=this.min,r=this.max,i=t=>n=e?n:t,a=e=>r=t?r:e;n===r&&(n<=0?(i(1),a(10)):(i(Ic(n,-1)),a(Ic(r,1)))),n<=0&&i(Ic(r,-1)),r<=0&&a(Ic(n,1)),this.min=n,this.max=r}buildTicks(){let e=this.options,t=Bc({min:this._userMin,max:this._userMax},this);return e.bounds===`ticks`&&st(t,this,`value`),e.reverse?(t.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),t}getLabelForValue(e){return e===void 0?`0`:Ut(e,this.chart.options.locale,this.options.ticks.format)}configure(){let e=this.min;super.configure(),this._startValue=et(e),this._valueRange=et(this.max)-et(e)}getPixelForValue(e){return(e===void 0||e===0)&&(e=this.min),e===null||isNaN(e)?NaN:this.getPixelForDecimal(e===this.min?0:(et(e)-this._startValue)/this._valueRange)}getValueForPixel(e){let t=this.getDecimalForPixel(e);return 10**(this._startValue+t*this._valueRange)}});function Vc(e){let t=e.ticks;if(t.display&&e.display){let e=q(t.backdropPadding);return P(t.font&&t.font.size,K.font.size)+e.height}return 0}function Hc(e,t,n){return n=A(n)?n:[n],{w:en(e,t.string,n),h:n.length*t.lineHeight}}function Uc(e,t,n,r,i){return e===r||e===i?{start:t-n/2,end:t+n/2}:ei?{start:t-n,end:t}:{start:t,end:t+n}}function Wc(e){let t={l:e.left+e._padding.left,r:e.right-e._padding.right,t:e.top+e._padding.top,b:e.bottom-e._padding.bottom},n=Object.assign({},t),r=[],i=[],a=e._pointLabels.length,o=e.options.pointLabels,s=o.centerPointLabels?L/a:0;for(let c=0;ct.r&&(s=(r.end-t.r)/a,e.r=Math.max(e.r,t.r+s)),i.startt.b&&(c=(i.end-t.b)/o,e.b=Math.max(e.b,t.b+c))}function Kc(e,t,n){let r=e.drawingArea,{extra:i,additionalAngle:a,padding:o,size:s}=n,c=e.getPointPosition(t,r+i+o,a),l=Math.round(ct(H(c.angle+z))),u=Zc(c.y,s.h,l),d=Yc(l),f=Xc(c.x,s.w,d);return{visible:!0,x:c.x,y:u,textAlign:d,left:f,top:u,right:f+s.w,bottom:u+s.h}}function qc(e,t){if(!t)return!0;let{left:n,top:r,right:i,bottom:a}=e;return!(on({x:n,y:r},t)||on({x:n,y:a},t)||on({x:i,y:r},t)||on({x:i,y:a},t))}function Jc(e,t,n){let r=[],i=e._pointLabels.length,a=e.options,{centerPointLabels:o,display:s}=a.pointLabels,c={extra:Vc(a)/2,additionalAngle:o?L/i:0},l;for(let a=0;a270||n<90)&&(e-=t),e}function Qc(e,t,n){let{left:r,top:i,right:a,bottom:o}=n,{backdropColor:s}=t;if(!k(s)){let n=Sn(t.borderRadius),c=q(t.backdropPadding);e.fillStyle=s;let l=r-c.left,u=i-c.top,d=a-r+c.width,f=o-i+c.height;Object.values(n).some(e=>e!==0)?(e.beginPath(),hn(e,{x:l,y:u,w:d,h:f,radius:n}),e.fill()):e.fillRect(l,u,d,f)}}function $c(e,t){let{ctx:n,options:{pointLabels:r}}=e;for(let i=t-1;i>=0;i--){let t=e._pointLabelItems[i];if(!t.visible)continue;let a=r.setContext(e.getPointLabelContext(i));Qc(n,a,t);let o=J(a.font),{x:s,y:c,textAlign:l}=t;mn(n,e._pointLabels[i],s,c+o.lineHeight/2,o,{color:a.color,textAlign:l,textBaseline:`middle`})}}function el(e,t,n,r){let{ctx:i}=e;if(n)i.arc(e.xCenter,e.yCenter,t,0,R);else{let n=e.getPointPosition(0,t);i.moveTo(n.x,n.y);for(let a=1;a{let n=F(this.options.pointLabels.callback,[e,t],this);return n||n===0?n:``}).filter((e,t)=>this.chart.getDataVisibility(t))}fit(){let e=this.options;e.display&&e.pointLabels.display?Wc(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(e,t,n,r){this.xCenter+=Math.floor((e-t)/2),this.yCenter+=Math.floor((n-r)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(e,t,n,r))}getIndexAngle(e){let t=R/(this._pointLabels.length||1),n=this.options.startAngle||0;return H(e*t+V(n))}getDistanceFromCenterForValue(e){if(k(e))return NaN;let t=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-e)*t:(e-this.min)*t}getValueForDistanceFromCenter(e){if(k(e))return NaN;let t=e/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-t:this.min+t}getPointLabelContext(e){let t=this._pointLabels||[];if(e>=0&&e{if(t!==0||t===0&&this.min<0){s=this.getDistanceFromCenterForValue(e.value);let n=this.getContext(t),o=r.setContext(n),c=i.setContext(n);tl(this,o,s,a,c)}}),n.display){for(e.save(),o=a-1;o>=0;o--){let r=n.setContext(this.getPointLabelContext(o)),{color:i,lineWidth:a}=r;!a||!i||(e.lineWidth=a,e.strokeStyle=i,e.setLineDash(r.borderDash),e.lineDashOffset=r.borderDashOffset,s=this.getDistanceFromCenterForValue(t.reverse?this.min:this.max),c=this.getPointPosition(o,s),e.beginPath(),e.moveTo(this.xCenter,this.yCenter),e.lineTo(c.x,c.y),e.stroke())}e.restore()}}drawBorder(){}drawLabels(){let e=this.ctx,t=this.options,n=t.ticks;if(!n.display)return;let r=this.getIndexAngle(0),i,a;e.save(),e.translate(this.xCenter,this.yCenter),e.rotate(r),e.textAlign=`center`,e.textBaseline=`middle`,this.ticks.forEach((r,o)=>{if(o===0&&this.min>=0&&!t.reverse)return;let s=n.setContext(this.getContext(o)),c=J(s.font);if(i=this.getDistanceFromCenterForValue(this.ticks[o].value),s.showLabelBackdrop){e.font=c.string,a=e.measureText(r.label).width,e.fillStyle=s.backdropColor;let t=q(s.backdropPadding);e.fillRect(-a/2-t.left,-i-c.size/2-t.top,a+t.width,c.size+t.height)}mn(e,r.label,0,-i,c,{color:s.color,strokeColor:s.textStrokeColor,strokeWidth:s.textStrokeWidth})}),e.restore()}drawTitle(){}});var rl={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},$=Object.keys(rl);function il(e,t){return e-t}function al(e,t){if(k(t))return null;let n=e._adapter,{parser:r,round:i,isoWeekday:a}=e._parseOpts,o=t;return typeof r==`function`&&(o=r(o)),M(o)||(o=typeof r==`string`?n.parse(o,r):n.parse(o)),o===null?null:(i&&(o=i===`week`&&(at(a)||a===!0)?n.startOf(o,`isoWeek`,a):n.startOf(o,i)),+o)}function ol(e,t,n,r){let i=$.length;for(let a=$.indexOf(e);a=$.indexOf(n);a--){let n=$[a];if(rl[n].common&&e._adapter.diff(i,r,n)>=t-1)return n}return $[n?$.indexOf(n):0]}function cl(e){for(let t=$.indexOf(e)+1,n=$.length;t=t?n[r]:n[i];e[a]=!0}}function ul(e,t,n,r){let i=e._adapter,a=+i.startOf(t[0].value,r),o=t[t.length-1].value,s,c;for(s=a;s<=o;s=+i.add(s,1,r))c=n[s],c>=0&&(t[c].major=!0);return t}function dl(e,t,n){let r=[],i={},a=t.length,o,s;for(o=0;o+e.value))}initOffsets(e=[]){let t=0,n=0,r,i;this.options.offset&&e.length&&(r=this.getDecimalForValue(e[0]),t=e.length===1?1-r:(this.getDecimalForValue(e[1])-r)/2,i=this.getDecimalForValue(e[e.length-1]),n=e.length===1?i:(i-this.getDecimalForValue(e[e.length-2]))/2);let a=e.length<3?.5:.25;t=U(t,0,a),n=U(n,0,a),this._offsets={start:t,end:n,factor:1/(t+1+n)}}_generate(){let e=this._adapter,t=this.min,n=this.max,r=this.options,i=r.time,a=i.unit||ol(i.minUnit,t,n,this._getLabelCapacity(t)),o=P(r.ticks.stepSize,1),s=a===`week`?i.isoWeekday:!1,c=at(s)||s===!0,l={},u=t,d,f;if(c&&(u=+e.startOf(u,`isoWeek`,s)),u=+e.startOf(u,c?`day`:a),e.diff(n,t,a)>1e5*o)throw Error(t+` and `+n+` are too far apart with stepSize of `+o+` `+a);let p=r.ticks.source===`data`&&this.getDataTimestamps();for(d=u,f=0;d+e)}getLabelForValue(e){let t=this._adapter,n=this.options.time;return n.tooltipFormat?t.format(e,n.tooltipFormat):t.format(e,n.displayFormats.datetime)}format(e,t){let n=this.options.time.displayFormats,r=this._unit,i=t||n[r];return this._adapter.format(e,i)}_tickFormatFunction(e,t,n,r){let i=this.options,a=i.ticks.callback;if(a)return F(a,[e,t,n],this);let o=i.time.displayFormats,s=this._unit,c=this._majorUnit,l=s&&o[s],u=c&&o[c],d=n[t],f=c&&u&&d&&d.major;return this._adapter.format(e,r||(f?u:l))}generateTickLabels(e){let t,n,r;for(t=0,n=e.length;t0?o:1}getDataTimestamps(){let e=this._cache.data||[],t,n;if(e.length)return e;let r=this.getMatchingVisibleMetas();if(this._normalized&&r.length)return this._cache.data=r[0].controller.getAllParsedValues(this);for(t=0,n=r.length;t=e[r].pos&&t<=e[i].pos&&({lo:r,hi:i}=gt(e,`pos`,t)),{pos:a,time:s}=e[r],{pos:o,time:c}=e[i]):(t>=e[r].time&&t<=e[i].time&&({lo:r,hi:i}=gt(e,`time`,t)),{time:a,pos:s}=e[r],{time:o,pos:c}=e[i]);let l=o-a;return l?s+(c-s)*(t-a)/l:s}(class extends fl{static id=`timeseries`;static defaults=fl.defaults;constructor(e){super(e),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){let e=this._getTimestampsForTable(),t=this._table=this.buildLookupTable(e);this._minPos=pl(t,this.min),this._tableRange=pl(t,this.max)-this._minPos,super.initOffsets(e)}buildLookupTable(e){let{min:t,max:n}=this,r=[],i=[],a,o,s,c,l;for(a=0,o=e.length;a=t&&c<=n&&r.push(c);if(r.length<2)return[{time:t,pos:0},{time:n,pos:1}];for(a=0,o=r.length;ae-t)}_getTimestampsForTable(){let e=this._cache.all||[];if(e.length)return e;let t=this.getDataTimestamps(),n=this.getLabelTimestamps();return e=t.length&&n.length?this.normalize(t.concat(n)):t.length?t:n,e=this._cache.all=e,e}getDecimalForValue(e){return(pl(this._table,e)-this._minPos)/this._tableRange}getValueForPixel(e){let t=this._offsets,n=this.getDecimalForPixel(e)/t.factor-t.end;return pl(this._table,n*this._tableRange+this._minPos,!0)}});async function ml(e,t,n={}){let{connectTimeoutMs:r=15e3,idleTimeoutMs:i=5e3,onPhaseChange:a}=n,o=new AbortController,s=!1,c=null,l=setTimeout(()=>{s||o.abort(Error(`Connection timeout`))},r),u=()=>{c&&clearTimeout(c),c=setTimeout(()=>{o.abort(Error(`Stream stalled`))},i)};a?.(`connecting`);try{return await d.get(e,t,{signal:o.signal,timeout:0,onDownloadProgress:e=>{!s&&(e.loaded??0)>0?(s=!0,clearTimeout(l),a?.(`receiving`),u()):s&&u()}})}finally{clearTimeout(l),c&&clearTimeout(c)}}var hl={class:`relative`},gl={key:0,class:`absolute inset-0 flex flex-col items-center justify-center bg-surface/opacity-heavy backdrop-blur-sm z-10`},_l={key:0,class:`mt-2 text-sm text-content-secondary`},vl={key:1,class:`absolute top-3 right-3 flex items-center gap-1.5 z-10`},yl={key:2,class:`absolute inset-0 flex flex-col items-center justify-center bg-surface/opacity-heavy backdrop-blur-sm z-10`},bl={class:`text-xs text-content-secondary mt-1 max-w-[12rem] text-center`},xl={key:0,class:`mt-2 text-xs text-content-muted`},Sl=i({__name:`ChartCard`,props:{isLoading:{type:Boolean},isUpdating:{type:Boolean},error:{},status:{},autoRetryMs:{}},emits:[`retry`],setup(i,{emit:d}){let p=i,m=d,h=n(0),g=null,_=null,v=()=>{g&&=(clearInterval(g),null),_&&=(clearTimeout(_),null),h.value=0};return a(()=>p.error,e=>{if(v(),!e)return;let t=p.autoRetryMs??3e4;h.value=Math.round(t/1e3),g=setInterval(()=>{h.value=Math.max(0,h.value-1),h.value===0&&v()},1e3),_=setTimeout(()=>{v(),m(`retry`)},t)}),u(v),(n,a)=>(t(),l(`div`,hl,[e(n.$slots,`default`),i.isLoading?(t(),l(`div`,gl,[s(f),i.status?(t(),l(`p`,_l,r(i.status),1)):o(``,!0)])):i.isUpdating&&!i.error?(t(),l(`div`,vl,[s(f,{size:`xs`,color:`current`,class:`text-content-muted`}),a[1]||=c(`span`,{class:`text-xs text-content-muted`},`Updating`,-1)])):o(``,!0),i.error&&!i.isLoading?(t(),l(`div`,yl,[a[2]||=c(`svg`,{xmlns:`http://www.w3.org/2000/svg`,class:`w-8 h-8 text-accent-red mb-2`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`,"stroke-width":`2`},[c(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,d:`M12 9v4m0 4h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z`})],-1),a[3]||=c(`p`,{class:`text-sm font-semibold text-content-primary`},`Loading Failed`,-1),c(`p`,bl,r(i.error),1),c(`button`,{class:`btn-secondary mt-3 text-xs px-3 py-1.5`,onClick:a[0]||=e=>m(`retry`)},`Retry`),h.value>0?(t(),l(`p`,xl,`Retrying in `+r(h.value)+`s`,1)):o(``,!0)])):o(``,!0)]))}});export{ic as _,vs as a,Ai as c,Pc as d,cs as f,Ys as g,Pi as h,Oi as i,ji as l,fl as m,ml as n,Ac as o,Mi as p,qo as r,Lo as s,Sl as t,os as u,sc as v,Tc as y}; \ No newline at end of file diff --git a/repeater/web/html/assets/Companions-BvYFdYvx.js b/repeater/web/html/assets/Companions-CdUuekpd.js similarity index 99% rename from repeater/web/html/assets/Companions-BvYFdYvx.js rename to repeater/web/html/assets/Companions-CdUuekpd.js index b1daf78..7ad1443 100644 --- a/repeater/web/html/assets/Companions-BvYFdYvx.js +++ b/repeater/web/html/assets/Companions-CdUuekpd.js @@ -1 +1 @@ -import{C as e,D as t,P as n,T as r,U as i,X as ee,_t as a,c as o,f as s,h as c,ht as l,i as u,j as d,l as f,m as p,o as m,p as h,r as g,s as _,u as v,y}from"./runtime-core.esm-bundler-CINEgm0a.js";import{i as b,l as x,o as S,r as C}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as w}from"./api-CP9MgmUS.js";import{t as T}from"./Spinner-CMJUE3iy.js";import{r as E}from"./index-Cl4Dij8v.js";import{t as D}from"./ConfirmDialog-Dl1jglkT.js";import{t as O}from"./MessageDialog-Dcp03-LQ.js";var k={role:`dialog`,"aria-describedby":`import-modal-description`,class:`bg-white dark:bg-surface-elevated backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-6 max-w-lg w-full max-h-[90vh] overflow-y-auto`},A={id:`import-modal-description`,class:`text-content-secondary dark:text-content-muted text-sm mb-4`},j={class:`mb-4`},M={class:`flex items-center gap-2 mb-2`},N={key:0,class:`text-content-muted text-xs mb-2`},P={key:1,class:`flex flex-wrap gap-3 ml-6`},F=[`value`],I={class:`text-content-primary text-sm capitalize`},L={class:`border-t border-stroke-subtle dark:border-white/opacity-light pt-4 mt-4 mb-4`},R={class:`flex flex-wrap gap-3 mb-2`},z=[`value`],B={class:`text-content-primary text-sm`},V={class:`flex flex-wrap items-center gap-2 mt-2`},H={class:`flex items-center gap-2`},te={key:1,class:`text-content-muted text-sm`},ne={class:`border-t border-stroke-subtle dark:border-white/opacity-light pt-4 mt-4 mb-4`},re={class:`flex flex-wrap items-center gap-2`},ie={key:0,role:`alert`,class:`mb-4 p-3 rounded-lg bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium border border-accent-red/opacity-medium text-accent-red text-sm`},U={key:1,class:`text-content-muted text-sm mb-4`},ae={class:`flex justify-end gap-3`},W=[`disabled`],G=[`disabled`],K=c({name:`ImportRepeaterContactsModal`,__name:`ImportRepeaterContactsModal`,props:{isOpen:{type:Boolean},companionName:{}},emits:[`close`,`imported`],setup(e,{emit:s}){let c=[`companion`,`repeater`,`room_server`,`sensor`],l=[{label:`All time`,value:null},{label:`Last 24 hours`,value:24},{label:`Last 7 days`,value:168},{label:`Last 30 days`,value:720},{label:`Custom`,value:`custom`}].slice(0,4),p=e,T=s,E=i(!1),D=i(null),O=i(!0),K=i([]),q=i(null),J=i(``),Y=i(``),X=i(null),oe=i(null);function Z(){let e=q.value;if(e===null||e===`custom`){if(e===`custom`){let e=J.value;if(e===``||e===null)return;let t=Number(e);return Number.isInteger(t)&&t>=1?t:void 0}return}return e}function Q(){let e=Y.value;if(e===``||e===null)return;let t=Number(e);return Number.isInteger(t)&&t>=1?t:void 0}function se(){O.value=!0,K.value=[],q.value=null,J.value=``,Y.value=``,D.value=null}d(()=>p.isOpen,e=>{e&&(se(),y(()=>{oe.value?.focus()}))}),d(q,e=>{e===`custom`&&y(()=>{X.value?.focus()})});let ce=m(()=>{let e=O.value?`All types`:K.value.map(e=>e.replace(`_`,` `)).join(`, `),t,n=q.value;if(n===null)t=`all time`;else if(n===`custom`){let e=Z();t=e===void 0?`custom`:`last ${e} hours`}else t=n===24?`last 24 hours`:n===168?`last 7 days`:n===720?`last 30 days`:`all time`;let r=Q(),i=r===void 0?`no limit`:`max ${r} contacts`;return`Import: ${e}, ${t}, ${i}.`});function le(){if(q.value===`custom`){let e=Z();if(e===void 0||e<1)return`Custom recency must be at least 1 hour.`}let e=Q();if(Y.value!==``&&(e===void 0||e<1))return`Limit must be at least 1.`;if(!O.value&&K.value.length===0)return`Select at least one contact type or use All types.`;if(!O.value){let e=K.value.filter(e=>!c.includes(e));if(e.length>0)return`Invalid contact type: ${e.join(`, `)}`}return null}async function ue(){D.value=null;let e=le();if(e){D.value=e;return}let t={companion_name:p.companionName};!O.value&&K.value.length>0&&(t.contact_types=[...K.value]);let n=Z();n!==void 0&&(t.hours=n);let r=Q();r!==void 0&&(t.limit=r),E.value=!0;try{let e=await w.importRepeaterContacts(t);e.success&&e.data?(T(`imported`,e.data.imported),T(`close`)):D.value=e.error||`Import failed.`}catch(e){D.value=e instanceof Error?e.message:`Import failed.`}finally{E.value=!1}}function de(e){e.key===`Escape`&&T(`close`)}return(i,s)=>(r(),o(u,{to:`body`},[e.isOpen?(r(),v(`div`,{key:0,class:`modal-backdrop z-[350]!`,onClick:s[7]||=x(e=>T(`close`),[`self`]),onKeydown:de},[_(`div`,k,[s[18]||=_(`h2`,{class:`text-xl font-bold text-content-primary mb-4`},` Import repeater contacts `,-1),_(`p`,A,[s[8]||=h(` Seed `,-1),_(`strong`,null,a(e.companionName),1),s[9]||=h(` with contacts from the repeater's adverts. Results are ordered by most recent first. `,-1)]),_(`div`,j,[s[11]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},` Contact types `,-1),_(`label`,M,[n(_(`input`,{ref_key:`firstFocusRef`,ref:oe,"onUpdate:modelValue":s[0]||=e=>O.value=e,type:`checkbox`,class:`rounded border-stroke-subtle dark:border-stroke/opacity-medium text-primary focus:ring-primary/opacity-heavy`},null,512),[[C,O.value]]),s[10]||=_(`span`,{class:`text-content-primary text-sm`},`All types`,-1)]),O.value?(r(),v(`p`,N,` Uncheck to filter by type (repeater, companion, room server, sensor). `)):f(``,!0),O.value?f(``,!0):(r(),v(`div`,P,[(r(),v(g,null,t(c,e=>_(`label`,{key:e,class:`flex items-center gap-2`},[n(_(`input`,{"onUpdate:modelValue":s[1]||=e=>K.value=e,type:`checkbox`,value:e,class:`rounded border-stroke-subtle dark:border-stroke/opacity-medium text-primary focus:ring-primary/opacity-heavy`},null,8,F),[[C,K.value]]),_(`span`,I,a(e.replace(`_`,` `)),1)])),64))]))]),_(`div`,L,[s[13]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},` Recency `,-1),_(`div`,R,[(r(!0),v(g,null,t(ee(l),e=>(r(),v(`label`,{key:e.label,class:`flex items-center gap-2`},[n(_(`input`,{"onUpdate:modelValue":s[2]||=e=>q.value=e,type:`radio`,value:e.value,class:`border-stroke-subtle dark:border-stroke/opacity-medium text-primary focus:ring-primary/opacity-heavy`},null,8,z),[[b,q.value]]),_(`span`,B,a(e.label),1)]))),128))]),_(`div`,V,[_(`label`,H,[n(_(`input`,{"onUpdate:modelValue":s[3]||=e=>q.value=e,type:`radio`,value:`custom`,class:`border-stroke-subtle dark:border-stroke/opacity-medium text-primary focus:ring-primary/opacity-heavy`},null,512),[[b,q.value]]),s[12]||=_(`span`,{class:`text-content-primary text-sm`},`Custom:`,-1)]),q.value===`custom`?n((r(),v(`input`,{key:0,ref_key:`customHoursInputRef`,ref:X,"onUpdate:modelValue":s[4]||=e=>J.value=e,type:`number`,min:`1`,placeholder:`e.g. 48`,class:`w-24 bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light rounded-lg px-3 py-1.5 text-content-primary text-sm placeholder-content-muted dark:placeholder-content-muted focus:outline-none focus:border-primary/opacity-heavy`},null,512)),[[S,J.value,void 0,{number:!0}]]):f(``,!0),q.value===`custom`?(r(),v(`span`,te,`hours`)):f(``,!0)])]),_(`div`,ne,[s[16]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},` Max contacts (optional) `,-1),_(`div`,re,[s[14]||=_(`span`,{class:`text-content-muted text-sm`},`Import at most`,-1),n(_(`input`,{"onUpdate:modelValue":s[5]||=e=>Y.value=e,type:`number`,inputmode:`numeric`,min:`1`,placeholder:`No limit`,class:`w-32 bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light rounded-lg px-3 py-2 text-content-primary placeholder-content-muted dark:placeholder-content-muted focus:outline-none focus:border-primary/opacity-heavy`},null,512),[[S,Y.value,void 0,{number:!0}]]),s[15]||=_(`span`,{class:`text-content-muted text-sm`},`contacts`,-1)]),s[17]||=_(`p`,{class:`text-content-muted text-xs mt-1`},` Leave empty for no cap. Server caps at companion max. `,-1)]),D.value?(r(),v(`div`,ie,a(D.value),1)):f(``,!0),D.value?f(``,!0):(r(),v(`p`,U,a(ce.value),1)),_(`div`,ae,[_(`button`,{type:`button`,disabled:E.value,class:`px-4 py-2 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light text-content-primary rounded-lg transition-colors disabled:opacity-50`,onClick:s[6]||=e=>T(`close`)},` Cancel `,8,W),_(`button`,{type:`button`,disabled:E.value,class:`btn-primary`,onClick:ue},a(E.value?`Importing…`:`Import`),9,G)])])],32)):f(``,!0)]))}}),q={class:`p-6 space-y-6`},J={key:0,class:`grid grid-cols-1 md:grid-cols-3 gap-4`},Y={class:`glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-5`},X={class:`flex items-center justify-between`},oe={class:`text-3xl font-bold text-content-primary mb-1`},Z={class:`glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-5`},Q={class:`flex items-center justify-between`},se={class:`text-3xl font-bold text-primary mb-1`},ce={class:`glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-5`},le={class:`flex items-center justify-between`},ue={key:0,class:`w-6 h-6 text-accent-green`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},de={key:1,class:`w-6 h-6 text-accent-yellow`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},fe={class:`glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-6`},pe={key:0,class:`flex items-center justify-center py-12`},me={class:`text-center`},he={key:1,class:`flex items-center justify-center py-12`},ge={class:`text-center`},_e={class:`text-content-secondary dark:text-content-muted text-sm mb-4`},ve={key:2,class:`space-y-4`},ye={class:`flex items-start justify-between`},be={class:`flex-1`},xe={class:`flex items-center gap-3 mb-4`},Se={class:`relative`},Ce={key:0,class:`absolute inset-0 bg-accent-green/opacity-heavy rounded-full animate-ping`},we={class:`text-xl font-bold text-content-primary`},Te={key:0,class:`text-content-muted text-sm`},Ee={class:`grid grid-cols-1 md:grid-cols-2 gap-3 text-sm mb-3`},De={class:`text-content-primary/opacity-heavy ml-2`},Oe={class:`text-content-primary/opacity-heavy ml-2`},ke={class:`text-content-primary/opacity-heavy ml-2`},Ae={class:`flex items-center gap-2`},je={key:0,class:`text-content-primary/opacity-heavy font-mono ml-2 text-xs`},Me={key:1,class:`text-content-muted ml-2 text-xs`},Ne=[`onClick`],Pe={class:`text-xs text-content-muted`},Fe={key:0,class:`ml-2 font-mono text-content-primary/opacity-heavy break-all`},Ie={key:1,class:`ml-2 text-content-muted`},Le={class:`ml-4 flex flex-wrap gap-2`},Re=[`onClick`],ze=[`onClick`],Be=[`onClick`],Ve={key:3,class:`text-center py-12 text-content-secondary dark:text-content-muted`},He={class:`bg-white dark:bg-surface-elevated backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-6 max-w-2xl w-full max-h-[90vh] overflow-y-auto`},Ue={class:`space-y-4`},We={class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},Ge={key:0},Ke={key:1,class:`text-content-secondary dark:text-content-muted text-sm`},qe={class:`grid grid-cols-2 gap-4`},Je={class:`bg-white dark:bg-surface-elevated backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-6 max-w-2xl w-full max-h-[90vh] overflow-y-auto`},Ye={class:`space-y-4`},Xe={class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},Ze={key:0},Qe={class:`grid grid-cols-2 gap-4`},$e=5050,et=1,tt=65535,nt=c({name:`CompanionsView`,__name:`Companions`,setup(ee){let c=i(!1),d=i(null),y=i(null),b=i(!1),C=i(!1),k=i(!1),A=i(null),j=i(``),M=i(!1),N=i(!1),P=i(new Set),F=i(!1),I=i(``),L=i(!1),R=i(``),z=i(!1),B=i({message:``,variant:`success`}),V=i({name:``,identity_key:``,type:`companion`,settings:{node_name:``,tcp_port:5e3,bind_address:`0.0.0.0`}});e(async()=>{await H()});async function H(){c.value=!0,d.value=null;try{let e=await w.getIdentities();e.success?y.value=e.data:d.value=e.error||`Failed to load identities`}catch(e){d.value=e instanceof Error?e.message:`Failed to load identities`}finally{c.value=!1}}async function te(){try{let e=await w.createIdentity({...V.value,settings:{node_name:V.value.settings.node_name||V.value.name,tcp_port:V.value.settings.tcp_port??5e3,bind_address:V.value.settings.bind_address||`0.0.0.0`}});e.success?(b.value=!1,W(),await H(),U(e.message||`Companion created successfully!`,`success`)):U(`Failed to create companion: ${e.error}`,`error`)}catch(e){U(`Error creating companion: ${e}`,`error`)}}async function ne(){let e={name:j.value,identity_key:A.value.identity_key,type:`companion`,settings:{node_name:A.value.settings?.node_name,tcp_port:A.value.settings?.tcp_port,bind_address:A.value.settings?.bind_address}};A.value.name!==j.value&&(e.new_name=A.value.name);try{let t=await w.updateIdentity(e);t.success?(C.value=!1,A.value=null,await H(),k.value=!0):U(`Failed to update companion: ${t.error}`,`error`)}catch(e){U(`Error updating companion: ${e}`,`error`)}}function re(e){I.value=e,F.value=!0}async function ie(){let e=I.value;F.value=!1;try{let t=await w.deleteIdentity(e,`companion`);t.success?(await H(),U(t.message||`Companion deleted successfully!`,`success`)):U(`Failed to delete companion: ${t.error}`,`error`)}catch(e){U(`Error deleting companion: ${e}`,`error`)}finally{I.value=``}}function U(e,t){B.value={message:e,variant:t},z.value=!0}function ae(e){A.value=JSON.parse(JSON.stringify(e)),j.value=A.value.name,delete A.value.new_name,A.value.settings||(A.value.settings={node_name:``,tcp_port:5e3,bind_address:`0.0.0.0`}),N.value=!1,C.value=!0}function W(){V.value={name:``,identity_key:``,type:`companion`,settings:{node_name:``,tcp_port:5e3,bind_address:`0.0.0.0`}},M.value=!1}function G(){b.value=!1,C.value=!1,A.value=null,M.value=!1,N.value=!1,W()}function nt(e){P.value.has(e)?P.value.delete(e):P.value.add(e)}let rt=()=>y.value?.configured_companions??[],it=m(()=>y.value?.configured_companions?.length??0),at=m(()=>y.value?.configured_companions?.filter(e=>e.registered).length??0),$=m(()=>at.value===it.value);function ot(){let e=rt();if(e.length===0)return $e;let t=e.map(e=>e.settings?.tcp_port??5e3),n=Math.max(...t)+1;return Math.min(tt,Math.max(et,n))}function st(){W(),V.value.settings.tcp_port=ot(),b.value=!0}function ct(e){R.value=e,L.value=!0}function lt(){L.value=!1,R.value=``}function ut(e){U(`Imported ${e} contact${e===1?``:`s`}.`,`success`),lt()}return(e,i)=>(r(),v(g,null,[_(`div`,q,[_(`div`,{class:`relative overflow-hidden rounded-[20px] p-6 mb-6 glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light`},[i[18]||=_(`div`,{class:`absolute inset-0 bg-gradient-to-br from-primary/20 via-secondary/10 to-accent-purple/20 opacity-50`},null,-1),i[19]||=_(`div`,{class:`absolute inset-0 bg-gradient-to-tl from-accent-green/10 via-transparent to-primary/10 animate-pulse`},null,-1),_(`div`,{class:`relative flex items-center justify-between`},[i[17]||=s(`

Companions

Manage companion identities (TCP frame server)

`,1),_(`button`,{onClick:st,class:`group relative px-6 py-3 bg-gradient-to-r from-primary/30 to-secondary/30 hover:from-primary/40 hover:to-secondary/40 text-content-primary rounded-[12px] border border-primary/opacity-heavy transition-all hover:scale-105 hover:shadow-lg hover:shadow-primary/opacity-medium`},[...i[16]||=[_(`span`,{class:`flex items-center gap-2`},[_(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 4v16m8-8H4`})]),h(` Add Companion `)],-1)]])])]),y.value&&it.value>0?(r(),v(`div`,J,[_(`div`,Y,[_(`div`,X,[_(`div`,null,[i[20]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs font-medium mb-2 uppercase tracking-wide`},` Total Configured `,-1),_(`div`,oe,a(it.value),1)]),i[21]||=_(`div`,{class:`bg-background-mute dark:bg-white/opacity-subtle p-3 rounded-[12px]`},[_(`svg`,{class:`w-6 h-6 text-content-secondary dark:text-content-primary/opacity-heavy`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z`})])],-1)])]),_(`div`,Z,[_(`div`,Q,[_(`div`,null,[i[22]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs font-medium mb-2 uppercase tracking-wide`},` Currently Registered `,-1),_(`div`,se,a(at.value),1)]),i[23]||=_(`div`,{class:`bg-primary/opacity-medium p-3 rounded-[12px]`},[_(`svg`,{class:`w-6 h-6 text-primary`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 13l4 4L19 7`})])],-1)])]),_(`div`,ce,[_(`div`,le,[_(`div`,null,[i[24]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs font-medium mb-2 uppercase tracking-wide`},` Status `,-1),_(`div`,{class:l([`text-3xl font-bold`,$.value?`text-accent-green`:`text-accent-yellow`])},a($.value?`Synced`:`Out of Sync`),3)]),_(`div`,{class:l([`p-3 rounded-[12px]`,$.value?`bg-accent-green/opacity-medium`:`bg-accent-yellow/20`])},[$.value?(r(),v(`svg`,ue,[...i[25]||=[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z`},null,-1)]])):(r(),v(`svg`,de,[...i[26]||=[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`},null,-1)]]))],2)])])])):f(``,!0),_(`div`,fe,[c.value?(r(),v(`div`,pe,[_(`div`,me,[p(T,{class:`mx-auto mb-4`}),i[27]||=_(`div`,{class:`text-content-secondary dark:text-content-primary/opacity-heavy`},` Loading companions... `,-1)])])):d.value?(r(),v(`div`,he,[_(`div`,ge,[i[28]||=_(`div`,{class:`text-accent-red mb-2`},`Failed to load companions`,-1),_(`div`,_e,a(d.value),1),_(`button`,{onClick:H,class:`btn-primary`},` Retry `)])])):y.value&&rt().length>0?(r(),v(`div`,ve,[(r(!0),v(g,null,t(rt(),e=>(r(),v(`div`,{key:e.name,class:`glass-card backdrop-blur-xl rounded-[15px] p-5 border border-stroke-subtle dark:border-white/opacity-light`},[_(`div`,ye,[_(`div`,be,[_(`div`,xe,[_(`div`,Se,[e.registered?(r(),v(`div`,Ce)):f(``,!0),_(`div`,{class:l([`relative w-3 h-3 rounded-full`,e.registered?`bg-accent-green`:`bg-accent-red`])},null,2)]),_(`h3`,we,a(e.name),1),_(`span`,{class:l([`px-3 py-1 text-xs font-semibold rounded-full`,e.registered?`bg-accent-green/opacity-medium text-accent-green border border-accent-green/opacity-medium`:`bg-accent-red/opacity-medium text-accent-red border border-accent-red/opacity-medium`])},a(e.registered?`● Active`:`○ Inactive`),3),e.hash?(r(),v(`span`,Te,a(e.hash),1)):f(``,!0)]),_(`div`,Ee,[_(`div`,null,[i[29]||=_(`span`,{class:`text-content-muted`},`Node Name:`,-1),_(`span`,De,a(e.settings?.node_name||e.name),1)]),_(`div`,null,[i[30]||=_(`span`,{class:`text-content-muted`},`TCP Port:`,-1),_(`span`,Oe,a(e.settings?.tcp_port??5e3),1)]),_(`div`,null,[i[31]||=_(`span`,{class:`text-content-muted`},`Bind Address:`,-1),_(`span`,ke,a(e.settings?.bind_address||`0.0.0.0`),1)]),_(`div`,Ae,[i[32]||=_(`span`,{class:`text-content-muted`},`Identity Key:`,-1),P.value.has(e.name)?(r(),v(`span`,je,a(e.identity_key),1)):(r(),v(`span`,Me,`••••••••••••••••`)),_(`button`,{onClick:t=>nt(e.name),class:`text-primary/opacity-heavy hover:text-primary text-xs underline`},a(P.value.has(e.name)?`Hide`:`Show`),9,Ne)])]),_(`div`,Pe,[i[33]||=_(`span`,{class:`text-content-muted`},`Public Key:`,-1),e.public_key?(r(),v(`span`,Fe,a(e.public_key),1)):(r(),v(`span`,Ie,`—`))])]),_(`div`,Le,[_(`button`,{onClick:t=>ct(e.name),class:`btn-primary-xs`},` Import contacts `,8,Re),_(`button`,{onClick:t=>ae(e),class:`btn-primary-xs`},` Edit `,8,ze),_(`button`,{onClick:t=>re(e.name),class:`btn-danger-xs`},` Delete `,8,Be)])])]))),128))])):(r(),v(`div`,Ve,[i[34]||=_(`svg`,{class:`w-16 h-16 mx-auto mb-4 text-content-muted/opacity-heavy`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z`})],-1),i[35]||=_(`p`,{class:`text-lg mb-2`},`No companions configured`,-1),i[36]||=_(`p`,{class:`text-sm mb-4`},` Add a companion to run a TCP frame server for firmware or other clients `,-1),_(`button`,{onClick:st,class:`btn-primary`},` + Add Companion `)]))]),(r(),o(u,{to:`body`},[b.value?(r(),v(`div`,{key:0,class:`modal-backdrop`,onClick:i[6]||=x(e=>b.value=!1,[`self`])},[_(`div`,He,[i[43]||=_(`h2`,{class:`text-xl font-bold text-content-primary mb-4`},` Add Companion `,-1),_(`div`,Ue,[_(`div`,null,[i[37]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},`Name *`,-1),n(_(`input`,{"onUpdate:modelValue":i[0]||=e=>V.value.name=e,type:`text`,placeholder:`e.g., TestCompanion`,class:`modal-input`},null,512),[[S,V.value.name]])]),_(`div`,null,[_(`label`,We,[i[38]||=h(` Identity Key (Optional) `,-1),_(`button`,{onClick:i[1]||=e=>M.value=!M.value,type:`button`,class:`ml-2 text-primary/opacity-heavy hover:text-primary text-xs underline`},a(M.value?`Hide`:`Show/Edit`),1)]),M.value?(r(),v(`div`,Ge,[n(_(`input`,{"onUpdate:modelValue":i[2]||=e=>V.value.identity_key=e,type:`text`,placeholder:`Leave empty to auto-generate (32 bytes hex)`,class:`modal-input font-mono text-sm`},null,512),[[S,V.value.identity_key]]),i[39]||=_(`p`,{class:`text-content-secondary dark:text-content-muted text-xs mt-1`},` 32 or 64 bytes hex. Leave empty to auto-generate. `,-1)])):(r(),v(`div`,Ke,` Will be auto-generated if not provided `))]),_(`div`,null,[i[40]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},`Node Name`,-1),n(_(`input`,{"onUpdate:modelValue":i[3]||=e=>V.value.settings.node_name=e,type:`text`,placeholder:`Display name (defaults to Name)`,class:`modal-input`},null,512),[[S,V.value.settings.node_name]])]),_(`div`,qe,[_(`div`,null,[i[41]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},`TCP Port`,-1),n(_(`input`,{"onUpdate:modelValue":i[4]||=e=>V.value.settings.tcp_port=e,type:`number`,min:`1`,max:`65535`,class:`modal-input`},null,512),[[S,V.value.settings.tcp_port,void 0,{number:!0}]])]),_(`div`,null,[i[42]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},`Bind Address`,-1),n(_(`input`,{"onUpdate:modelValue":i[5]||=e=>V.value.settings.bind_address=e,type:`text`,placeholder:`0.0.0.0`,class:`modal-input`},null,512),[[S,V.value.settings.bind_address]])])])]),_(`div`,{class:`flex justify-end gap-3 mt-6`},[_(`button`,{onClick:G,class:`px-4 py-2 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light text-content-primary rounded-lg transition-colors`},` Cancel `),_(`button`,{onClick:te,class:`btn-primary`},` Create `)])])])):f(``,!0)])),(r(),o(u,{to:`body`},[C.value&&A.value?(r(),v(`div`,{key:0,class:`modal-backdrop`,onClick:x(G,[`self`])},[_(`div`,Je,[i[49]||=_(`h2`,{class:`text-xl font-bold text-content-primary mb-4`},` Edit Companion `,-1),_(`div`,Ye,[_(`div`,null,[i[44]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},`Name *`,-1),n(_(`input`,{"onUpdate:modelValue":i[7]||=e=>A.value.name=e,type:`text`,class:`modal-input`},null,512),[[S,A.value.name]])]),_(`div`,null,[_(`label`,Xe,[i[45]||=h(` Identity Key (Optional) `,-1),_(`button`,{onClick:i[8]||=e=>N.value=!N.value,type:`button`,class:`ml-2 text-primary/opacity-heavy hover:text-primary text-xs underline`},a(N.value?`Hide`:`Show/Edit`),1)]),N.value?(r(),v(`div`,Ze,[n(_(`input`,{"onUpdate:modelValue":i[9]||=e=>A.value.identity_key=e,type:`text`,placeholder:`Leave empty to keep current key`,class:`modal-input font-mono text-sm`},null,512),[[S,A.value.identity_key]])])):f(``,!0)]),_(`div`,null,[i[46]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},`Node Name`,-1),n(_(`input`,{"onUpdate:modelValue":i[10]||=e=>A.value.settings.node_name=e,type:`text`,class:`modal-input`},null,512),[[S,A.value.settings.node_name]])]),_(`div`,Qe,[_(`div`,null,[i[47]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},`TCP Port`,-1),n(_(`input`,{"onUpdate:modelValue":i[11]||=e=>A.value.settings.tcp_port=e,type:`number`,min:`1`,max:`65535`,class:`modal-input`},null,512),[[S,A.value.settings.tcp_port,void 0,{number:!0}]])]),_(`div`,null,[i[48]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},`Bind Address`,-1),n(_(`input`,{"onUpdate:modelValue":i[12]||=e=>A.value.settings.bind_address=e,type:`text`,class:`modal-input`},null,512),[[S,A.value.settings.bind_address]])])])]),_(`div`,{class:`flex justify-end gap-3 mt-6`},[_(`button`,{onClick:G,class:`px-4 py-2 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light text-content-primary rounded-lg transition-colors`},` Cancel `),_(`button`,{onClick:ne,class:`btn-primary`},` Update `)])])])):f(``,!0)]))]),p(K,{"is-open":L.value,"companion-name":R.value,onClose:lt,onImported:ut},null,8,[`is-open`,`companion-name`]),p(D,{show:F.value,title:`Delete Companion`,message:`Are you sure you want to delete '${I.value}'? Restart required to fully remove.`,"confirm-text":`Delete`,"cancel-text":`Cancel`,variant:`danger`,onClose:i[13]||=e=>F.value=!1,onConfirm:ie},null,8,[`show`,`message`]),p(O,{show:z.value,message:B.value.message,variant:B.value.variant,onClose:i[14]||=e=>z.value=!1},null,8,[`show`,`message`,`variant`]),p(E,{modelValue:k.value,"onUpdate:modelValue":i[15]||=e=>k.value=e,message:`Companion settings have been saved. A service restart is required for the changes to take effect.`},null,8,[`modelValue`])],64))}});export{nt as default}; \ No newline at end of file +import{C as e,D as t,P as n,T as r,U as i,X as ee,_t as a,c as o,f as s,h as c,ht as l,i as u,j as d,l as f,m as p,o as m,p as h,r as g,s as _,u as v,y}from"./runtime-core.esm-bundler-CINEgm0a.js";import{i as b,l as x,o as S,r as C}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as w}from"./api-EpLa-SS4.js";import{t as T}from"./Spinner-CMJUE3iy.js";import{r as E}from"./index-DF5glAZc.js";import{t as D}from"./ConfirmDialog-Dl1jglkT.js";import{t as O}from"./MessageDialog-Dcp03-LQ.js";var k={role:`dialog`,"aria-describedby":`import-modal-description`,class:`bg-white dark:bg-surface-elevated backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-6 max-w-lg w-full max-h-[90vh] overflow-y-auto`},A={id:`import-modal-description`,class:`text-content-secondary dark:text-content-muted text-sm mb-4`},j={class:`mb-4`},M={class:`flex items-center gap-2 mb-2`},N={key:0,class:`text-content-muted text-xs mb-2`},P={key:1,class:`flex flex-wrap gap-3 ml-6`},F=[`value`],I={class:`text-content-primary text-sm capitalize`},L={class:`border-t border-stroke-subtle dark:border-white/opacity-light pt-4 mt-4 mb-4`},R={class:`flex flex-wrap gap-3 mb-2`},z=[`value`],B={class:`text-content-primary text-sm`},V={class:`flex flex-wrap items-center gap-2 mt-2`},H={class:`flex items-center gap-2`},te={key:1,class:`text-content-muted text-sm`},ne={class:`border-t border-stroke-subtle dark:border-white/opacity-light pt-4 mt-4 mb-4`},re={class:`flex flex-wrap items-center gap-2`},ie={key:0,role:`alert`,class:`mb-4 p-3 rounded-lg bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium border border-accent-red/opacity-medium text-accent-red text-sm`},U={key:1,class:`text-content-muted text-sm mb-4`},ae={class:`flex justify-end gap-3`},W=[`disabled`],G=[`disabled`],K=c({name:`ImportRepeaterContactsModal`,__name:`ImportRepeaterContactsModal`,props:{isOpen:{type:Boolean},companionName:{}},emits:[`close`,`imported`],setup(e,{emit:s}){let c=[`companion`,`repeater`,`room_server`,`sensor`],l=[{label:`All time`,value:null},{label:`Last 24 hours`,value:24},{label:`Last 7 days`,value:168},{label:`Last 30 days`,value:720},{label:`Custom`,value:`custom`}].slice(0,4),p=e,T=s,E=i(!1),D=i(null),O=i(!0),K=i([]),q=i(null),J=i(``),Y=i(``),X=i(null),oe=i(null);function Z(){let e=q.value;if(e===null||e===`custom`){if(e===`custom`){let e=J.value;if(e===``||e===null)return;let t=Number(e);return Number.isInteger(t)&&t>=1?t:void 0}return}return e}function Q(){let e=Y.value;if(e===``||e===null)return;let t=Number(e);return Number.isInteger(t)&&t>=1?t:void 0}function se(){O.value=!0,K.value=[],q.value=null,J.value=``,Y.value=``,D.value=null}d(()=>p.isOpen,e=>{e&&(se(),y(()=>{oe.value?.focus()}))}),d(q,e=>{e===`custom`&&y(()=>{X.value?.focus()})});let ce=m(()=>{let e=O.value?`All types`:K.value.map(e=>e.replace(`_`,` `)).join(`, `),t,n=q.value;if(n===null)t=`all time`;else if(n===`custom`){let e=Z();t=e===void 0?`custom`:`last ${e} hours`}else t=n===24?`last 24 hours`:n===168?`last 7 days`:n===720?`last 30 days`:`all time`;let r=Q(),i=r===void 0?`no limit`:`max ${r} contacts`;return`Import: ${e}, ${t}, ${i}.`});function le(){if(q.value===`custom`){let e=Z();if(e===void 0||e<1)return`Custom recency must be at least 1 hour.`}let e=Q();if(Y.value!==``&&(e===void 0||e<1))return`Limit must be at least 1.`;if(!O.value&&K.value.length===0)return`Select at least one contact type or use All types.`;if(!O.value){let e=K.value.filter(e=>!c.includes(e));if(e.length>0)return`Invalid contact type: ${e.join(`, `)}`}return null}async function ue(){D.value=null;let e=le();if(e){D.value=e;return}let t={companion_name:p.companionName};!O.value&&K.value.length>0&&(t.contact_types=[...K.value]);let n=Z();n!==void 0&&(t.hours=n);let r=Q();r!==void 0&&(t.limit=r),E.value=!0;try{let e=await w.importRepeaterContacts(t);e.success&&e.data?(T(`imported`,e.data.imported),T(`close`)):D.value=e.error||`Import failed.`}catch(e){D.value=e instanceof Error?e.message:`Import failed.`}finally{E.value=!1}}function de(e){e.key===`Escape`&&T(`close`)}return(i,s)=>(r(),o(u,{to:`body`},[e.isOpen?(r(),v(`div`,{key:0,class:`modal-backdrop z-[350]!`,onClick:s[7]||=x(e=>T(`close`),[`self`]),onKeydown:de},[_(`div`,k,[s[18]||=_(`h2`,{class:`text-xl font-bold text-content-primary mb-4`},` Import repeater contacts `,-1),_(`p`,A,[s[8]||=h(` Seed `,-1),_(`strong`,null,a(e.companionName),1),s[9]||=h(` with contacts from the repeater's adverts. Results are ordered by most recent first. `,-1)]),_(`div`,j,[s[11]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},` Contact types `,-1),_(`label`,M,[n(_(`input`,{ref_key:`firstFocusRef`,ref:oe,"onUpdate:modelValue":s[0]||=e=>O.value=e,type:`checkbox`,class:`rounded border-stroke-subtle dark:border-stroke/opacity-medium text-primary focus:ring-primary/opacity-heavy`},null,512),[[C,O.value]]),s[10]||=_(`span`,{class:`text-content-primary text-sm`},`All types`,-1)]),O.value?(r(),v(`p`,N,` Uncheck to filter by type (repeater, companion, room server, sensor). `)):f(``,!0),O.value?f(``,!0):(r(),v(`div`,P,[(r(),v(g,null,t(c,e=>_(`label`,{key:e,class:`flex items-center gap-2`},[n(_(`input`,{"onUpdate:modelValue":s[1]||=e=>K.value=e,type:`checkbox`,value:e,class:`rounded border-stroke-subtle dark:border-stroke/opacity-medium text-primary focus:ring-primary/opacity-heavy`},null,8,F),[[C,K.value]]),_(`span`,I,a(e.replace(`_`,` `)),1)])),64))]))]),_(`div`,L,[s[13]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},` Recency `,-1),_(`div`,R,[(r(!0),v(g,null,t(ee(l),e=>(r(),v(`label`,{key:e.label,class:`flex items-center gap-2`},[n(_(`input`,{"onUpdate:modelValue":s[2]||=e=>q.value=e,type:`radio`,value:e.value,class:`border-stroke-subtle dark:border-stroke/opacity-medium text-primary focus:ring-primary/opacity-heavy`},null,8,z),[[b,q.value]]),_(`span`,B,a(e.label),1)]))),128))]),_(`div`,V,[_(`label`,H,[n(_(`input`,{"onUpdate:modelValue":s[3]||=e=>q.value=e,type:`radio`,value:`custom`,class:`border-stroke-subtle dark:border-stroke/opacity-medium text-primary focus:ring-primary/opacity-heavy`},null,512),[[b,q.value]]),s[12]||=_(`span`,{class:`text-content-primary text-sm`},`Custom:`,-1)]),q.value===`custom`?n((r(),v(`input`,{key:0,ref_key:`customHoursInputRef`,ref:X,"onUpdate:modelValue":s[4]||=e=>J.value=e,type:`number`,min:`1`,placeholder:`e.g. 48`,class:`w-24 bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light rounded-lg px-3 py-1.5 text-content-primary text-sm placeholder-content-muted dark:placeholder-content-muted focus:outline-none focus:border-primary/opacity-heavy`},null,512)),[[S,J.value,void 0,{number:!0}]]):f(``,!0),q.value===`custom`?(r(),v(`span`,te,`hours`)):f(``,!0)])]),_(`div`,ne,[s[16]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},` Max contacts (optional) `,-1),_(`div`,re,[s[14]||=_(`span`,{class:`text-content-muted text-sm`},`Import at most`,-1),n(_(`input`,{"onUpdate:modelValue":s[5]||=e=>Y.value=e,type:`number`,inputmode:`numeric`,min:`1`,placeholder:`No limit`,class:`w-32 bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light rounded-lg px-3 py-2 text-content-primary placeholder-content-muted dark:placeholder-content-muted focus:outline-none focus:border-primary/opacity-heavy`},null,512),[[S,Y.value,void 0,{number:!0}]]),s[15]||=_(`span`,{class:`text-content-muted text-sm`},`contacts`,-1)]),s[17]||=_(`p`,{class:`text-content-muted text-xs mt-1`},` Leave empty for no cap. Server caps at companion max. `,-1)]),D.value?(r(),v(`div`,ie,a(D.value),1)):f(``,!0),D.value?f(``,!0):(r(),v(`p`,U,a(ce.value),1)),_(`div`,ae,[_(`button`,{type:`button`,disabled:E.value,class:`px-4 py-2 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light text-content-primary rounded-lg transition-colors disabled:opacity-50`,onClick:s[6]||=e=>T(`close`)},` Cancel `,8,W),_(`button`,{type:`button`,disabled:E.value,class:`btn-primary`,onClick:ue},a(E.value?`Importing…`:`Import`),9,G)])])],32)):f(``,!0)]))}}),q={class:`p-6 space-y-6`},J={key:0,class:`grid grid-cols-1 md:grid-cols-3 gap-4`},Y={class:`glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-5`},X={class:`flex items-center justify-between`},oe={class:`text-3xl font-bold text-content-primary mb-1`},Z={class:`glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-5`},Q={class:`flex items-center justify-between`},se={class:`text-3xl font-bold text-primary mb-1`},ce={class:`glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-5`},le={class:`flex items-center justify-between`},ue={key:0,class:`w-6 h-6 text-accent-green`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},de={key:1,class:`w-6 h-6 text-accent-yellow`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},fe={class:`glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-6`},pe={key:0,class:`flex items-center justify-center py-12`},me={class:`text-center`},he={key:1,class:`flex items-center justify-center py-12`},ge={class:`text-center`},_e={class:`text-content-secondary dark:text-content-muted text-sm mb-4`},ve={key:2,class:`space-y-4`},ye={class:`flex items-start justify-between`},be={class:`flex-1`},xe={class:`flex items-center gap-3 mb-4`},Se={class:`relative`},Ce={key:0,class:`absolute inset-0 bg-accent-green/opacity-heavy rounded-full animate-ping`},we={class:`text-xl font-bold text-content-primary`},Te={key:0,class:`text-content-muted text-sm`},Ee={class:`grid grid-cols-1 md:grid-cols-2 gap-3 text-sm mb-3`},De={class:`text-content-primary/opacity-heavy ml-2`},Oe={class:`text-content-primary/opacity-heavy ml-2`},ke={class:`text-content-primary/opacity-heavy ml-2`},Ae={class:`flex items-center gap-2`},je={key:0,class:`text-content-primary/opacity-heavy font-mono ml-2 text-xs`},Me={key:1,class:`text-content-muted ml-2 text-xs`},Ne=[`onClick`],Pe={class:`text-xs text-content-muted`},Fe={key:0,class:`ml-2 font-mono text-content-primary/opacity-heavy break-all`},Ie={key:1,class:`ml-2 text-content-muted`},Le={class:`ml-4 flex flex-wrap gap-2`},Re=[`onClick`],ze=[`onClick`],Be=[`onClick`],Ve={key:3,class:`text-center py-12 text-content-secondary dark:text-content-muted`},He={class:`bg-white dark:bg-surface-elevated backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-6 max-w-2xl w-full max-h-[90vh] overflow-y-auto`},Ue={class:`space-y-4`},We={class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},Ge={key:0},Ke={key:1,class:`text-content-secondary dark:text-content-muted text-sm`},qe={class:`grid grid-cols-2 gap-4`},Je={class:`bg-white dark:bg-surface-elevated backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-6 max-w-2xl w-full max-h-[90vh] overflow-y-auto`},Ye={class:`space-y-4`},Xe={class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},Ze={key:0},Qe={class:`grid grid-cols-2 gap-4`},$e=5050,et=1,tt=65535,nt=c({name:`CompanionsView`,__name:`Companions`,setup(ee){let c=i(!1),d=i(null),y=i(null),b=i(!1),C=i(!1),k=i(!1),A=i(null),j=i(``),M=i(!1),N=i(!1),P=i(new Set),F=i(!1),I=i(``),L=i(!1),R=i(``),z=i(!1),B=i({message:``,variant:`success`}),V=i({name:``,identity_key:``,type:`companion`,settings:{node_name:``,tcp_port:5e3,bind_address:`0.0.0.0`}});e(async()=>{await H()});async function H(){c.value=!0,d.value=null;try{let e=await w.getIdentities();e.success?y.value=e.data:d.value=e.error||`Failed to load identities`}catch(e){d.value=e instanceof Error?e.message:`Failed to load identities`}finally{c.value=!1}}async function te(){try{let e=await w.createIdentity({...V.value,settings:{node_name:V.value.settings.node_name||V.value.name,tcp_port:V.value.settings.tcp_port??5e3,bind_address:V.value.settings.bind_address||`0.0.0.0`}});e.success?(b.value=!1,W(),await H(),U(e.message||`Companion created successfully!`,`success`)):U(`Failed to create companion: ${e.error}`,`error`)}catch(e){U(`Error creating companion: ${e}`,`error`)}}async function ne(){let e={name:j.value,identity_key:A.value.identity_key,type:`companion`,settings:{node_name:A.value.settings?.node_name,tcp_port:A.value.settings?.tcp_port,bind_address:A.value.settings?.bind_address}};A.value.name!==j.value&&(e.new_name=A.value.name);try{let t=await w.updateIdentity(e);t.success?(C.value=!1,A.value=null,await H(),k.value=!0):U(`Failed to update companion: ${t.error}`,`error`)}catch(e){U(`Error updating companion: ${e}`,`error`)}}function re(e){I.value=e,F.value=!0}async function ie(){let e=I.value;F.value=!1;try{let t=await w.deleteIdentity(e,`companion`);t.success?(await H(),U(t.message||`Companion deleted successfully!`,`success`)):U(`Failed to delete companion: ${t.error}`,`error`)}catch(e){U(`Error deleting companion: ${e}`,`error`)}finally{I.value=``}}function U(e,t){B.value={message:e,variant:t},z.value=!0}function ae(e){A.value=JSON.parse(JSON.stringify(e)),j.value=A.value.name,delete A.value.new_name,A.value.settings||(A.value.settings={node_name:``,tcp_port:5e3,bind_address:`0.0.0.0`}),N.value=!1,C.value=!0}function W(){V.value={name:``,identity_key:``,type:`companion`,settings:{node_name:``,tcp_port:5e3,bind_address:`0.0.0.0`}},M.value=!1}function G(){b.value=!1,C.value=!1,A.value=null,M.value=!1,N.value=!1,W()}function nt(e){P.value.has(e)?P.value.delete(e):P.value.add(e)}let rt=()=>y.value?.configured_companions??[],it=m(()=>y.value?.configured_companions?.length??0),at=m(()=>y.value?.configured_companions?.filter(e=>e.registered).length??0),$=m(()=>at.value===it.value);function ot(){let e=rt();if(e.length===0)return $e;let t=e.map(e=>e.settings?.tcp_port??5e3),n=Math.max(...t)+1;return Math.min(tt,Math.max(et,n))}function st(){W(),V.value.settings.tcp_port=ot(),b.value=!0}function ct(e){R.value=e,L.value=!0}function lt(){L.value=!1,R.value=``}function ut(e){U(`Imported ${e} contact${e===1?``:`s`}.`,`success`),lt()}return(e,i)=>(r(),v(g,null,[_(`div`,q,[_(`div`,{class:`relative overflow-hidden rounded-[20px] p-6 mb-6 glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light`},[i[18]||=_(`div`,{class:`absolute inset-0 bg-gradient-to-br from-primary/20 via-secondary/10 to-accent-purple/20 opacity-50`},null,-1),i[19]||=_(`div`,{class:`absolute inset-0 bg-gradient-to-tl from-accent-green/10 via-transparent to-primary/10 animate-pulse`},null,-1),_(`div`,{class:`relative flex items-center justify-between`},[i[17]||=s(`

Companions

Manage companion identities (TCP frame server)

`,1),_(`button`,{onClick:st,class:`group relative px-6 py-3 bg-gradient-to-r from-primary/30 to-secondary/30 hover:from-primary/40 hover:to-secondary/40 text-content-primary rounded-[12px] border border-primary/opacity-heavy transition-all hover:scale-105 hover:shadow-lg hover:shadow-primary/opacity-medium`},[...i[16]||=[_(`span`,{class:`flex items-center gap-2`},[_(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 4v16m8-8H4`})]),h(` Add Companion `)],-1)]])])]),y.value&&it.value>0?(r(),v(`div`,J,[_(`div`,Y,[_(`div`,X,[_(`div`,null,[i[20]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs font-medium mb-2 uppercase tracking-wide`},` Total Configured `,-1),_(`div`,oe,a(it.value),1)]),i[21]||=_(`div`,{class:`bg-background-mute dark:bg-white/opacity-subtle p-3 rounded-[12px]`},[_(`svg`,{class:`w-6 h-6 text-content-secondary dark:text-content-primary/opacity-heavy`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z`})])],-1)])]),_(`div`,Z,[_(`div`,Q,[_(`div`,null,[i[22]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs font-medium mb-2 uppercase tracking-wide`},` Currently Registered `,-1),_(`div`,se,a(at.value),1)]),i[23]||=_(`div`,{class:`bg-primary/opacity-medium p-3 rounded-[12px]`},[_(`svg`,{class:`w-6 h-6 text-primary`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 13l4 4L19 7`})])],-1)])]),_(`div`,ce,[_(`div`,le,[_(`div`,null,[i[24]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs font-medium mb-2 uppercase tracking-wide`},` Status `,-1),_(`div`,{class:l([`text-3xl font-bold`,$.value?`text-accent-green`:`text-accent-yellow`])},a($.value?`Synced`:`Out of Sync`),3)]),_(`div`,{class:l([`p-3 rounded-[12px]`,$.value?`bg-accent-green/opacity-medium`:`bg-accent-yellow/20`])},[$.value?(r(),v(`svg`,ue,[...i[25]||=[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z`},null,-1)]])):(r(),v(`svg`,de,[...i[26]||=[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`},null,-1)]]))],2)])])])):f(``,!0),_(`div`,fe,[c.value?(r(),v(`div`,pe,[_(`div`,me,[p(T,{class:`mx-auto mb-4`}),i[27]||=_(`div`,{class:`text-content-secondary dark:text-content-primary/opacity-heavy`},` Loading companions... `,-1)])])):d.value?(r(),v(`div`,he,[_(`div`,ge,[i[28]||=_(`div`,{class:`text-accent-red mb-2`},`Failed to load companions`,-1),_(`div`,_e,a(d.value),1),_(`button`,{onClick:H,class:`btn-primary`},` Retry `)])])):y.value&&rt().length>0?(r(),v(`div`,ve,[(r(!0),v(g,null,t(rt(),e=>(r(),v(`div`,{key:e.name,class:`glass-card backdrop-blur-xl rounded-[15px] p-5 border border-stroke-subtle dark:border-white/opacity-light`},[_(`div`,ye,[_(`div`,be,[_(`div`,xe,[_(`div`,Se,[e.registered?(r(),v(`div`,Ce)):f(``,!0),_(`div`,{class:l([`relative w-3 h-3 rounded-full`,e.registered?`bg-accent-green`:`bg-accent-red`])},null,2)]),_(`h3`,we,a(e.name),1),_(`span`,{class:l([`px-3 py-1 text-xs font-semibold rounded-full`,e.registered?`bg-accent-green/opacity-medium text-accent-green border border-accent-green/opacity-medium`:`bg-accent-red/opacity-medium text-accent-red border border-accent-red/opacity-medium`])},a(e.registered?`● Active`:`○ Inactive`),3),e.hash?(r(),v(`span`,Te,a(e.hash),1)):f(``,!0)]),_(`div`,Ee,[_(`div`,null,[i[29]||=_(`span`,{class:`text-content-muted`},`Node Name:`,-1),_(`span`,De,a(e.settings?.node_name||e.name),1)]),_(`div`,null,[i[30]||=_(`span`,{class:`text-content-muted`},`TCP Port:`,-1),_(`span`,Oe,a(e.settings?.tcp_port??5e3),1)]),_(`div`,null,[i[31]||=_(`span`,{class:`text-content-muted`},`Bind Address:`,-1),_(`span`,ke,a(e.settings?.bind_address||`0.0.0.0`),1)]),_(`div`,Ae,[i[32]||=_(`span`,{class:`text-content-muted`},`Identity Key:`,-1),P.value.has(e.name)?(r(),v(`span`,je,a(e.identity_key),1)):(r(),v(`span`,Me,`••••••••••••••••`)),_(`button`,{onClick:t=>nt(e.name),class:`text-primary/opacity-heavy hover:text-primary text-xs underline`},a(P.value.has(e.name)?`Hide`:`Show`),9,Ne)])]),_(`div`,Pe,[i[33]||=_(`span`,{class:`text-content-muted`},`Public Key:`,-1),e.public_key?(r(),v(`span`,Fe,a(e.public_key),1)):(r(),v(`span`,Ie,`—`))])]),_(`div`,Le,[_(`button`,{onClick:t=>ct(e.name),class:`btn-primary-xs`},` Import contacts `,8,Re),_(`button`,{onClick:t=>ae(e),class:`btn-primary-xs`},` Edit `,8,ze),_(`button`,{onClick:t=>re(e.name),class:`btn-danger-xs`},` Delete `,8,Be)])])]))),128))])):(r(),v(`div`,Ve,[i[34]||=_(`svg`,{class:`w-16 h-16 mx-auto mb-4 text-content-muted/opacity-heavy`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z`})],-1),i[35]||=_(`p`,{class:`text-lg mb-2`},`No companions configured`,-1),i[36]||=_(`p`,{class:`text-sm mb-4`},` Add a companion to run a TCP frame server for firmware or other clients `,-1),_(`button`,{onClick:st,class:`btn-primary`},` + Add Companion `)]))]),(r(),o(u,{to:`body`},[b.value?(r(),v(`div`,{key:0,class:`modal-backdrop`,onClick:i[6]||=x(e=>b.value=!1,[`self`])},[_(`div`,He,[i[43]||=_(`h2`,{class:`text-xl font-bold text-content-primary mb-4`},` Add Companion `,-1),_(`div`,Ue,[_(`div`,null,[i[37]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},`Name *`,-1),n(_(`input`,{"onUpdate:modelValue":i[0]||=e=>V.value.name=e,type:`text`,placeholder:`e.g., TestCompanion`,class:`modal-input`},null,512),[[S,V.value.name]])]),_(`div`,null,[_(`label`,We,[i[38]||=h(` Identity Key (Optional) `,-1),_(`button`,{onClick:i[1]||=e=>M.value=!M.value,type:`button`,class:`ml-2 text-primary/opacity-heavy hover:text-primary text-xs underline`},a(M.value?`Hide`:`Show/Edit`),1)]),M.value?(r(),v(`div`,Ge,[n(_(`input`,{"onUpdate:modelValue":i[2]||=e=>V.value.identity_key=e,type:`text`,placeholder:`Leave empty to auto-generate (32 bytes hex)`,class:`modal-input font-mono text-sm`},null,512),[[S,V.value.identity_key]]),i[39]||=_(`p`,{class:`text-content-secondary dark:text-content-muted text-xs mt-1`},` 32 or 64 bytes hex. Leave empty to auto-generate. `,-1)])):(r(),v(`div`,Ke,` Will be auto-generated if not provided `))]),_(`div`,null,[i[40]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},`Node Name`,-1),n(_(`input`,{"onUpdate:modelValue":i[3]||=e=>V.value.settings.node_name=e,type:`text`,placeholder:`Display name (defaults to Name)`,class:`modal-input`},null,512),[[S,V.value.settings.node_name]])]),_(`div`,qe,[_(`div`,null,[i[41]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},`TCP Port`,-1),n(_(`input`,{"onUpdate:modelValue":i[4]||=e=>V.value.settings.tcp_port=e,type:`number`,min:`1`,max:`65535`,class:`modal-input`},null,512),[[S,V.value.settings.tcp_port,void 0,{number:!0}]])]),_(`div`,null,[i[42]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},`Bind Address`,-1),n(_(`input`,{"onUpdate:modelValue":i[5]||=e=>V.value.settings.bind_address=e,type:`text`,placeholder:`0.0.0.0`,class:`modal-input`},null,512),[[S,V.value.settings.bind_address]])])])]),_(`div`,{class:`flex justify-end gap-3 mt-6`},[_(`button`,{onClick:G,class:`px-4 py-2 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light text-content-primary rounded-lg transition-colors`},` Cancel `),_(`button`,{onClick:te,class:`btn-primary`},` Create `)])])])):f(``,!0)])),(r(),o(u,{to:`body`},[C.value&&A.value?(r(),v(`div`,{key:0,class:`modal-backdrop`,onClick:x(G,[`self`])},[_(`div`,Je,[i[49]||=_(`h2`,{class:`text-xl font-bold text-content-primary mb-4`},` Edit Companion `,-1),_(`div`,Ye,[_(`div`,null,[i[44]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},`Name *`,-1),n(_(`input`,{"onUpdate:modelValue":i[7]||=e=>A.value.name=e,type:`text`,class:`modal-input`},null,512),[[S,A.value.name]])]),_(`div`,null,[_(`label`,Xe,[i[45]||=h(` Identity Key (Optional) `,-1),_(`button`,{onClick:i[8]||=e=>N.value=!N.value,type:`button`,class:`ml-2 text-primary/opacity-heavy hover:text-primary text-xs underline`},a(N.value?`Hide`:`Show/Edit`),1)]),N.value?(r(),v(`div`,Ze,[n(_(`input`,{"onUpdate:modelValue":i[9]||=e=>A.value.identity_key=e,type:`text`,placeholder:`Leave empty to keep current key`,class:`modal-input font-mono text-sm`},null,512),[[S,A.value.identity_key]])])):f(``,!0)]),_(`div`,null,[i[46]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},`Node Name`,-1),n(_(`input`,{"onUpdate:modelValue":i[10]||=e=>A.value.settings.node_name=e,type:`text`,class:`modal-input`},null,512),[[S,A.value.settings.node_name]])]),_(`div`,Qe,[_(`div`,null,[i[47]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},`TCP Port`,-1),n(_(`input`,{"onUpdate:modelValue":i[11]||=e=>A.value.settings.tcp_port=e,type:`number`,min:`1`,max:`65535`,class:`modal-input`},null,512),[[S,A.value.settings.tcp_port,void 0,{number:!0}]])]),_(`div`,null,[i[48]||=_(`label`,{class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-sm mb-2`},`Bind Address`,-1),n(_(`input`,{"onUpdate:modelValue":i[12]||=e=>A.value.settings.bind_address=e,type:`text`,class:`modal-input`},null,512),[[S,A.value.settings.bind_address]])])])]),_(`div`,{class:`flex justify-end gap-3 mt-6`},[_(`button`,{onClick:G,class:`px-4 py-2 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light text-content-primary rounded-lg transition-colors`},` Cancel `),_(`button`,{onClick:ne,class:`btn-primary`},` Update `)])])])):f(``,!0)]))]),p(K,{"is-open":L.value,"companion-name":R.value,onClose:lt,onImported:ut},null,8,[`is-open`,`companion-name`]),p(D,{show:F.value,title:`Delete Companion`,message:`Are you sure you want to delete '${I.value}'? Restart required to fully remove.`,"confirm-text":`Delete`,"cancel-text":`Cancel`,variant:`danger`,onClose:i[13]||=e=>F.value=!1,onConfirm:ie},null,8,[`show`,`message`]),p(O,{show:z.value,message:B.value.message,variant:B.value.variant,onClose:i[14]||=e=>z.value=!1},null,8,[`show`,`message`,`variant`]),p(E,{modelValue:k.value,"onUpdate:modelValue":i[15]||=e=>k.value=e,message:`Companion settings have been saved. A service restart is required for the changes to take effect.`},null,8,[`modelValue`])],64))}});export{nt as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/Configuration-D-blm0qZ.js b/repeater/web/html/assets/Configuration-DRX-sbaI.js similarity index 99% rename from repeater/web/html/assets/Configuration-D-blm0qZ.js rename to repeater/web/html/assets/Configuration-DRX-sbaI.js index 3dcfc39..ddfc1b6 100644 --- a/repeater/web/html/assets/Configuration-D-blm0qZ.js +++ b/repeater/web/html/assets/Configuration-DRX-sbaI.js @@ -1,2 +1,2 @@ -import{C as e,D as t,M as n,N as r,P as i,T as a,U as o,V as s,X as c,_t as l,c as u,f as d,h as f,ht as p,i as m,j as h,k as g,l as _,m as v,o as y,p as b,r as x,s as S,u as C,w,x as T,y as E}from"./runtime-core.esm-bundler-CINEgm0a.js";import{a as D,c as O,i as k,l as A,o as j,r as M,t as N}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{g as P,h as F,m as I,p as L,t as R,v as z,y as B}from"./api-CP9MgmUS.js";import{t as ee}from"./system-CGj1WgG8.js";import{t as V}from"./dataService-CodM3OZh.js";import{n as H,t as U}from"./TxPowerNoticeModal-D8HswuZ5.js";import{t as W}from"./Spinner-CMJUE3iy.js";import{c as G,d as K,r as te,s as q}from"./index-Cl4Dij8v.js";import{t as ne}from"./ConfirmDialog-Dl1jglkT.js";import{t as re}from"./LocationPicker-BfCGxfpG.js";import{n as ie,t as J}from"./CopyLabel-7zw0wWsl.js";import{c as Y,d as X,n as Z,t as Q}from"./formatters-DVmMQB0F.js";var ae={key:0,class:`modal-backdrop`},oe={class:`modal-card max-w-md`},se={class:`flex items-start gap-3 mb-4`},$={class:`mt-1 text-sm text-content-secondary dark:text-content-muted`},ce={class:`modal-actions`},le=[`disabled`],ue=[`disabled`],de=[`disabled`],fe=f({__name:`UnsavedChangesModal`,props:{show:{type:Boolean},isSaving:{type:Boolean},label:{}},emits:[`discard`,`save`,`cancel`],setup(e){return(t,n)=>(a(),u(m,{to:`body`},[v(N,{"enter-active-class":`transition-opacity duration-200`,"enter-from-class":`opacity-0`,"leave-active-class":`transition-opacity duration-200`,"leave-to-class":`opacity-0`},{default:r(()=>[e.show?(a(),C(`div`,ae,[S(`div`,oe,[S(`div`,se,[n[4]||=S(`div`,{class:`flex-shrink-0 w-10 h-10 rounded-full bg-accent-amber/opacity-light dark:bg-accent-amber/opacity-medium flex items-center justify-center`},[S(`svg`,{class:`w-5 h-5 text-accent-amber`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z`})])],-1),S(`div`,null,[n[3]||=S(`h3`,{class:`text-base font-semibold text-content-primary`},` Unsaved Changes `,-1),S(`p`,$,l(e.label?e.label:`Settings`)+` have not been saved. What would you like to do? `,1)])]),S(`div`,ce,[S(`button`,{onClick:n[0]||=e=>t.$emit(`cancel`),disabled:e.isSaving,class:`modal-btn-cancel`},` Keep Editing `,8,le),S(`button`,{onClick:n[1]||=e=>t.$emit(`discard`),disabled:e.isSaving,class:`modal-btn-danger`},` Discard `,8,ue),S(`button`,{onClick:n[2]||=e=>t.$emit(`save`),disabled:e.isSaving,class:`modal-btn-primary`},l(e.isSaving?`Saving…`:`Save Settings`),9,de)])])])):_(``,!0)]),_:1})]))}});function pe(e,t,n,r){let i=o(!1),a=o(null),s=o(null);L((t,n,r)=>{e.value?(i.value=!0,a.value=()=>r(),s.value=()=>r(!1)):r()});function c(t){e.value?(i.value=!0,a.value=t,s.value=null):t()}function l(){n(),i.value=!1,s.value=null,a.value&&=(a.value(),null)}async function u(){await r()&&(i.value=!1,s.value=null,a.value&&=(a.value(),null))}function d(){i.value=!1,s.value&&=(s.value(),null),a.value=null}return{showUnsavedModal:i,requestLeave:c,handleDiscard:l,handleSave:u,handleCancel:d}}var me={class:`space-y-12`},he={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},ge={class:`flex items-center gap-2 shrink-0`},_e=[`disabled`],ve=[`disabled`],ye={key:0,class:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium border border-accent-red/opacity-heavy rounded-lg p-3`},be={class:`text-accent-red text-sm`},xe={class:`cfg-section space-y-3`},Se={class:`w-full max-w-3xl rounded-3xl border border-stroke-subtle dark:border-white/opacity-light bg-white dark:bg-surface-elevated shadow-[0_20px_80px_color-mix(in_srgb,var(--color-shadow-strong)_35%,transparent)] overflow-hidden`},Ce={class:`flex items-start justify-between gap-3 p-5 border-b border-stroke-subtle dark:border-white/opacity-light`},we={class:`p-5`},Te={class:`space-y-2 max-h-[60vh] overflow-y-auto pr-1`},Ee=[`onClick`],De={class:`min-w-0`},Oe={class:`flex flex-wrap items-center gap-2`},ke={class:`text-content-primary font-semibold text-sm truncate`},Ae={key:0,class:`inline-flex items-center rounded-full bg-primary/opacity-light text-primary text-[10px] font-semibold px-2 py-0.5`},je={class:`text-content-secondary dark:text-content-muted text-xs mt-1 line-clamp-2`},Me={class:`flex flex-wrap justify-end gap-2 shrink-0 text-[11px] font-mono`},Ne={class:`rounded-full bg-background-mute dark:bg-black/opacity-medium px-2 py-1 text-content-secondary dark:text-content-muted`},Pe={class:`rounded-full bg-background-mute dark:bg-black/opacity-medium px-2 py-1 text-content-secondary dark:text-content-muted`},Fe={class:`rounded-full bg-background-mute dark:bg-black/opacity-medium px-2 py-1 text-content-secondary dark:text-content-muted`},Ie={class:`rounded-full bg-background-mute dark:bg-black/opacity-medium px-2 py-1 text-content-secondary dark:text-content-muted`},Le={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Re={key:0,class:`text-content-primary font-mono text-sm`},ze={key:1,class:`flex items-center gap-2`},Be={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Ve={key:0,class:`text-content-primary font-mono text-sm`},He={key:1},Ue=[`value`],We={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Ge={key:0,class:`text-content-primary font-mono text-sm`},Ke={key:1},qe=[`value`],Je={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Ye={key:0,class:`text-content-primary font-mono text-sm`},Xe={key:1,class:`flex items-center gap-2`},Ze={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Qe={key:0,class:`text-content-primary font-mono text-sm`},$e={key:1},et={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 gap-1`},tt={class:`text-content-primary font-mono text-sm`},nt={class:`cfg-section space-y-3`},rt={class:`flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},it={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},at={class:`text-content-primary font-mono text-sm`},ot={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 gap-1`},st={class:`text-content-primary font-mono text-sm`},ct=f({__name:`RadioSettings`,setup(e,{expose:n}){let s=P(),u=ee(),d=V(),f=H(),m=y(()=>u.stats?.config?.radio||{}),g=y(()=>u.stats?.config?.radio?.cad??{}),b=o(!1),w=o(!1),T=o(null),E=o(!1),O=o(``),k=o(!1),M=o(!1),F=o(!1),I=o(0),L=o(0),z=o(0),B=o(0),W=o(0),G=o(0),K=o(0),q=[{value:7.8,label:`7.8 kHz`},{value:10.4,label:`10.4 kHz`},{value:15.6,label:`15.6 kHz`},{value:20.8,label:`20.8 kHz`},{value:31.25,label:`31.25 kHz`},{value:41.7,label:`41.7 kHz`},{value:62.5,label:`62.5 kHz`},{value:125,label:`125 kHz`},{value:250,label:`250 kHz`},{value:500,label:`500 kHz`}];h(m,e=>{e&&!b.value&&(L.value=e.frequency?Number((e.frequency/1e6).toFixed(3)):0,z.value=e.spreading_factor??0,B.value=e.bandwidth?Number((e.bandwidth/1e3).toFixed(1)):0,W.value=e.tx_power??0,G.value=e.coding_rate??0,K.value=e.preamble_length??0)},{immediate:!0});let ne=y(()=>{let e=m.value.frequency;return e?(e/1e6).toFixed(3)+` MHz`:`Not set`}),re=y(()=>{let e=m.value.bandwidth;return e?(e/1e3).toFixed(1)+` kHz`:`Not set`}),ie=y(()=>{let e=m.value.tx_power;return e===void 0?`Not set`:e+` dBm`}),J=y(()=>{let e=m.value.coding_rate;return e?`4/`+e:`Not set`}),Y=y(()=>{let e=m.value.preamble_length;return e?e+` symbols`:`Not set`}),X=y(()=>m.value.spreading_factor??`Not set`),Z=async()=>{f.radioPresets.length===0&&await f.fetchRadioPresets(),b.value=!0,T.value=null,F.value=!1,I.value=W.value},Q=e=>{L.value=e.frequency?Number(Number(e.frequency).toFixed(3)):0,z.value=e.spreading_factor?Number(e.spreading_factor):0,B.value=e.bandwidth?Number(Number(e.bandwidth).toFixed(1)):0,G.value=e.coding_rate?Number(e.coding_rate):0},ae=e=>e.frequency?`${Number(e.frequency).toFixed(3)} MHz`:`Not set`,oe=e=>e.bandwidth?`${Number(e.bandwidth).toFixed(1)} kHz`:`Not set`,se=e=>e.spreading_factor||`Not set`,$=e=>e.coding_rate?`4/${e.coding_rate}`:`Not set`,ce=()=>{T.value=null;let e=f.radioPresets.find(e=>e.title===O.value);e&&Q(e)};h(O,e=>{!b.value||!e||ce()});let le=e=>{O.value=e;let t=f.radioPresets.find(t=>t.title===e);t&&(Q(t),k.value=!1)},ue=()=>{b.value=!1,T.value=null,O.value=``,k.value=!1,M.value=!1,F.value=!1;let e=m.value;L.value=e.frequency?Number((e.frequency/1e6).toFixed(3)):0,z.value=e.spreading_factor??0,B.value=e.bandwidth?Number((e.bandwidth/1e3).toFixed(1)):0,W.value=e.tx_power??0,G.value=e.coding_rate??0,K.value=e.preamble_length??0},de=async({silent:e=!1}={})=>{w.value=!0,T.value=null;try{if(W.value<-9||W.value>22)return T.value=`TX Power must be between -9 and +22 dBm for SX1262`,!1;let t={};L.value&&(t.frequency=L.value*1e6),z.value&&(t.spreading_factor=z.value),B.value&&(t.bandwidth=B.value*1e3),(W.value||W.value===0)&&(t.tx_power=W.value),G.value&&(t.coding_rate=G.value);let n=(await R.post(`/update_radio_config`,t)).data;if(n.message||n.persisted)return b.value=!1,F.value=!1,await u.fetchStats(),d.invalidate(`radioConfig`),e||(E.value=!0),!0;n.error?T.value=n.error:T.value=`Unknown response from server`}catch(e){console.error(`Failed to update radio settings:`,e),T.value=e.response?.data?.error||`Failed to update settings`}finally{w.value=!1}return!1},ct=y(()=>W.value!==I.value),lt=async({silent:e=!1}={})=>b.value&&ct.value&&!F.value?(M.value=!0,!1):de({silent:e}),ut=async()=>{F.value&&(M.value=!1,await de())},dt=()=>{M.value=!1,F.value=!1},{showUnsavedModal:ft,requestLeave:pt,handleDiscard:mt,handleSave:ht,handleCancel:gt}=pe(b,w,ue,()=>lt());return n({requestLeave:pt,isEditing:b}),(e,n)=>(a(),C(x,null,[v(te,{modelValue:E.value,"onUpdate:modelValue":n[0]||=e=>E.value=e,title:`Radio Settings Changes require a restart.`,message:`Restart Now?`},null,8,[`modelValue`]),v(fe,{show:c(ft),"is-saving":w.value,label:`Radio Settings`,onDiscard:c(mt),onSave:c(ht),onCancel:c(gt)},null,8,[`show`,`is-saving`,`onDiscard`,`onSave`,`onCancel`]),v(U,{show:M.value,confirmed:F.value,busy:w.value,"action-label":`I Understand, Save Changes`,"onUpdate:show":n[1]||=e=>e?M.value=!0:dt(),"onUpdate:confirmed":n[2]||=e=>F.value=e,onConfirm:ut},null,8,[`show`,`confirmed`,`busy`]),S(`div`,me,[S(`div`,he,[n[13]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`Radio Settings`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Configure LoRa radio parameters and frequency presets`)],-1),S(`div`,ge,[b.value?(a(),C(x,{key:1},[S(`button`,{onClick:n[3]||=e=>k.value=!k.value,class:`cfg-btn-secondary`},` Prefill Preset `),S(`button`,{onClick:ue,disabled:w.value,class:`cfg-btn-secondary`},` Cancel `,8,_e),S(`button`,{onClick:n[4]||=e=>lt(),disabled:w.value,class:`cfg-btn-primary`},l(w.value?`Saving...`:`Save Changes`),9,ve)],64)):(a(),C(`button`,{key:0,onClick:Z,class:`cfg-btn-primary`},` Edit Settings `))])]),T.value?(a(),C(`div`,ye,[S(`p`,be,l(T.value),1)])):_(``,!0),S(`div`,xe,[v(N,{name:`fade`},{default:r(()=>[b.value&&k.value?(a(),C(`div`,{key:0,class:`modal-backdrop`,onClick:n[6]||=A(e=>k.value=!1,[`self`])},[S(`div`,Se,[S(`div`,Ce,[n[14]||=S(`div`,null,[S(`div`,{class:`text-content-primary font-semibold text-base`},` Prefill from preset `),S(`div`,{class:`text-content-muted text-xs mt-1`},` Pick a preset to load its radio values into the form. `)],-1),S(`button`,{type:`button`,class:`cfg-btn-secondary`,onClick:n[5]||=e=>k.value=!1},` Close `)]),S(`div`,we,[S(`div`,Te,[(a(!0),C(x,null,t(c(f).radioPresets,e=>(a(),C(`button`,{key:e.title,type:`button`,onClick:t=>le(e.title),class:p([`w-full text-left rounded-[18px] border px-4 py-3 transition-all duration-200 flex items-center justify-between gap-4`,O.value===e.title?`border-primary/opacity-heavy bg-primary/opacity-light shadow-sm shadow-primary/10`:`border-stroke-subtle dark:border-white/opacity-light bg-white/60 dark:bg-white/opacity-subtle hover:border-primary/opacity-medium dark:hover:border-primary/opacity-medium hover:bg-stroke-subtle/60 dark:hover:bg-white/opacity-light`])},[S(`div`,De,[S(`div`,Oe,[S(`div`,ke,l(e.title),1),O.value===e.title?(a(),C(`span`,Ae,` Selected `)):_(``,!0)]),S(`div`,je,l(e.description),1)]),S(`div`,Me,[S(`span`,Ne,` Freq `+l(ae(e)),1),S(`span`,Pe,` SF `+l(se(e)),1),S(`span`,Fe,` BW `+l(oe(e)),1),S(`span`,Ie,` CR `+l($(e)),1)])],10,Ee))),128))])])])])):_(``,!0)]),_:1}),S(`div`,Le,[n[16]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Frequency`,-1),b.value?(a(),C(`div`,ze,[i(S(`input`,{"onUpdate:modelValue":n[7]||=e=>L.value=e,type:`number`,step:`0.001`,min:`100`,max:`1000`,class:`cfg-input w-32`},null,512),[[j,L.value,void 0,{number:!0}]]),n[15]||=S(`span`,{class:`text-content-muted text-sm`},`MHz`,-1)])):(a(),C(`div`,Re,l(ne.value),1))]),S(`div`,Be,[n[17]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Spreading Factor`,-1),b.value?(a(),C(`div`,He,[i(S(`select`,{"onUpdate:modelValue":n[8]||=e=>z.value=e,class:`cfg-select`},[(a(),C(x,null,t([5,6,7,8,9,10,11,12],e=>S(`option`,{key:e,value:e},l(e),9,Ue)),64))],512),[[D,z.value,void 0,{number:!0}]])])):(a(),C(`div`,Ve,l(X.value),1))]),S(`div`,We,[n[18]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Bandwidth`,-1),b.value?(a(),C(`div`,Ke,[i(S(`select`,{"onUpdate:modelValue":n[9]||=e=>B.value=e,class:`cfg-select`},[(a(),C(x,null,t(q,e=>S(`option`,{key:e.value,value:e.value},l(e.label),9,qe)),64))],512),[[D,B.value,void 0,{number:!0}]])])):(a(),C(`div`,Ge,l(re.value),1))]),S(`div`,Je,[n[20]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`TX Power`,-1),b.value?(a(),C(`div`,Xe,[i(S(`input`,{"onUpdate:modelValue":n[10]||=e=>W.value=e,type:`number`,min:`-9`,max:`22`,class:`cfg-input w-20`},null,512),[[j,W.value,void 0,{number:!0}]]),n[19]||=S(`span`,{class:`text-content-muted text-sm`},`dBm`,-1)])):(a(),C(`div`,Ye,l(ie.value),1))]),S(`div`,Ze,[n[22]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Coding Rate`,-1),b.value?(a(),C(`div`,$e,[i(S(`select`,{"onUpdate:modelValue":n[11]||=e=>G.value=e,class:`cfg-select`},[...n[21]||=[S(`option`,{value:5},`4/5`,-1),S(`option`,{value:6},`4/6`,-1),S(`option`,{value:7},`4/7`,-1),S(`option`,{value:8},`4/8`,-1)]],512),[[D,G.value,void 0,{number:!0}]])])):(a(),C(`div`,Qe,l(J.value),1))]),S(`div`,et,[n[23]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Preamble Length`,-1),S(`span`,tt,l(Y.value),1)])]),S(`div`,nt,[S(`div`,rt,[n[24]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`CAD Calibration`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Channel Activity Detection: Run Calibration to update`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm mt-1`},`These settings tune the receivers ability to detect channel status prior to transmission`)],-1),S(`button`,{onClick:n[12]||=e=>c(s).push(`/cad-calibration`),class:`cfg-btn-secondary shrink-0`},` Run Calibration `)]),n[27]||=S(`div`,{class:`pt-2`},null,-1),S(`div`,it,[n[25]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Peak Threshold`,-1),S(`span`,at,l(g.value.peak_threshold??`Not calibrated`),1)]),S(`div`,ot,[n[26]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Min Threshold`,-1),S(`span`,st,l(g.value.min_threshold??`Not calibrated`),1)])])])],64))}}),lt={class:`space-y-12`},ut={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},dt={class:`flex items-center gap-2 shrink-0`},ft=[`disabled`],pt=[`disabled`],mt={key:0,class:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium border border-accent-red dark:border-accent-red/opacity-heavy rounded-lg p-3 text-accent-red text-sm`},ht={class:`cfg-section space-y-3`},gt={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},_t={key:0,class:`text-content-primary font-mono text-sm`},vt={key:1,class:`w-full sm:w-80`},yt=[`value`],bt={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-2`},xt={key:0,class:`text-content-primary font-mono text-sm break-all`},St={key:1,class:`w-full sm:w-80 space-y-2`},Ct={class:`flex gap-2`},wt=[`disabled`],Tt=[`value`],Et=[`value`],Dt=[`disabled`],Ot=[`value`],kt=[`value`],At=[`disabled`],jt={class:`flex items-center gap-2 text-xs text-content-secondary dark:text-content-muted`},Mt={key:2,class:`text-xs text-accent-red`},Nt={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-2`},Pt={key:0,class:`text-content-primary font-mono text-sm`},Ft={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-2`},It={key:0,class:`text-content-primary font-mono text-sm break-all`},Lt={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-2`},Rt={key:0,class:`text-content-primary font-mono text-sm`},zt={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-2`},Bt={key:0,class:`text-content-primary font-mono text-sm`},Vt={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-2`},Ht={class:`w-full sm:w-96 space-y-2`},Ut={class:`flex gap-2`},Wt=[`value`],Gt=[`disabled`],Kt={key:0,class:`text-xs text-accent-red`},qt={class:`grid grid-cols-1 sm:grid-cols-2 gap-3 py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},Jt={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},Yt={key:1,class:`block text-content-primary font-mono text-sm mt-1`},Xt={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},Zt={key:1,class:`block text-content-primary font-mono text-sm mt-1`},Qt={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},$t={key:1,class:`block text-content-primary font-mono text-sm mt-1`},en={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},tn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},nn={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},rn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},an={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},on={key:1,class:`block text-content-primary font-mono text-sm mt-1`},sn={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},cn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},ln={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},un={key:1,class:`block text-content-primary font-mono text-sm mt-1`},dn={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},fn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},pn={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},mn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},hn={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},gn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},_n={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},vn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},yn={key:3,class:`grid grid-cols-1 sm:grid-cols-2 gap-3 text-sm`},bn={class:`rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute dark:bg-white/opacity-subtle p-3`},xn={class:`text-content-primary font-mono`},Sn={class:`rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute dark:bg-white/opacity-subtle p-3`},Cn={class:`text-content-primary font-mono`},wn={class:`rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute dark:bg-white/opacity-subtle p-3`},Tn={class:`text-content-primary font-mono`},En={class:`rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute dark:bg-white/opacity-subtle p-3`},Dn={class:`text-content-primary font-mono`},On={class:`rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute dark:bg-white/opacity-subtle p-3`},kn={class:`text-content-primary font-mono`},An={class:`rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute dark:bg-white/opacity-subtle p-3`},jn={class:`text-content-primary font-mono`},Mn={class:`rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute dark:bg-white/opacity-subtle p-3`},Nn={class:`text-content-primary font-mono`},Pn={class:`rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute dark:bg-white/opacity-subtle p-3`},Fn={class:`text-content-primary font-mono`},In={class:`grid grid-cols-1 sm:grid-cols-2 gap-3 py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},Ln={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},Rn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},zn={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},Bn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},Vn=f({__name:`RadioHardwareSettings`,setup(n,{expose:r}){let s=ee(),u=[{value:`sx1262`,label:`sx1262`,detail:`Linux spidev + system GPIO`},{value:`sx1262_ch341`,label:`sx1262_ch341`,detail:`CH341 USB-to-SPI`},{value:`kiss`,label:`kiss`,detail:`KISS-modem over serial`},{value:`pymc_tcp`,label:`pymc_tcp`,detail:`pymc_tcp firmware modem over Wi-Fi/TCP`},{value:`pymc_usb`,label:`pymc_usb`,detail:`pymc_usb firmware modem over USB-CDC`},{value:`none`,label:`none`,detail:`Disable radio hardware (no RF I/O)`}],d=y(()=>{let e=s.stats;if(!e)return{};let t=e.config??{};return{...e,...t}}),f=o(!1),p=o(!1),m=o(``),g=o(!1),w=o(`none`),T=o([]),E=o(!1),O=o(``),k=o(!1),A=o([]),N=o(!1),P=o(``),F=o(``),I=o(``),L=o(9600),z=o(``),B=o(921600),V=o(``),H=o(5055),U=o(``),W=o(0),G=o(0),K=o(21),q=o(18),ne=o(20),re=o(16),ie=o(-1),J=o(-1),Y=o(-1),X=o(``),Z=o(-1),Q=o(-1),ae=o(6790),oe=o(21778);function se(e,t=``){return e==null?t:String(e)}function $(e,t){let n=Number(e);return Number.isFinite(n)?n:t}function ce(e){if(e==null)return`none`;let t=String(e).trim().toLowerCase();return!t||[`none`,`null`,`disabled`,`off`,`no_radio`].includes(t)?`none`:t===`kiss-modem`?`kiss`:t===`sx1262`?`sx1262`:t===`sx1262_ch341`?`sx1262_ch341`:t===`kiss`?`kiss`:t===`pymc_tcp`?`pymc_tcp`:t===`pymc_usb`?`pymc_usb`:`none`}function le(e){let t=e.config?.radio_type;return t==null||t===``?`sx1262`:ce(t)}let ue=y(()=>w.value!==`sx1262`&&w.value!==`sx1262_ch341`?[]:A.value.filter(e=>le(e)===w.value));function de(e){let t=A.value.find(t=>t.key===e);if(!t||!t.config)return;let n=t.config;W.value=$(n.bus_id,W.value),G.value=$(n.cs_id,G.value),K.value=$(n.cs_pin,K.value),q.value=$(n.reset_pin,q.value),ne.value=$(n.busy_pin,ne.value),re.value=$(n.irq_pin,re.value),ie.value=$(n.txen_pin,ie.value),J.value=$(n.rxen_pin,J.value),Y.value=$(n.en_pin,Y.value),Array.isArray(n.en_pins)?X.value=n.en_pins.map(e=>Number(e)).filter(e=>Number.isFinite(e)).join(`, `):X.value=``,Z.value=$(n.txled_pin,Z.value),Q.value=$(n.rxled_pin,Q.value),w.value===`sx1262_ch341`&&(ae.value=$(n.vid,ae.value),oe.value=$(n.pid,oe.value))}h(d,e=>{if(!f.value){w.value=ce(e.radio_type);let t=e.kiss??{},n=e.pymc_usb??{},r=e.pymc_tcp??{},i=e.sx1262??{},a=e.ch341??{};I.value=se(t.port,`/dev/ttyUSB0`),L.value=$(t.baud_rate,9600),z.value=se(n.port,`/dev/ttyACM0`),B.value=$(n.baudrate,921600),V.value=se(r.host,``),H.value=$(r.port,5055),U.value=se(r.token,``),W.value=$(i.bus_id,0),G.value=$(i.cs_id,0),K.value=$(i.cs_pin,21),q.value=$(i.reset_pin,18),ne.value=$(i.busy_pin,20),re.value=$(i.irq_pin,16),ie.value=$(i.txen_pin,-1),J.value=$(i.rxen_pin,-1),Y.value=$(i.en_pin,-1),Array.isArray(i.en_pins)?X.value=i.en_pins.map(e=>Number(e)).filter(e=>Number.isFinite(e)).join(`, `):X.value=``,Z.value=$(i.txled_pin,-1),Q.value=$(i.rxled_pin,-1),ae.value=$(a.vid,6790),oe.value=$(a.pid,21778),F.value=``}},{immediate:!0});let me=y(()=>ce(d.value.radio_type)),he=y(()=>{let e=u.find(e=>e.value===me.value);return e?`${e.label} - ${e.detail}`:`none - Disable radio hardware (no RF I/O)`});function ge(){w.value=me.value,f.value=!0,m.value=``}function _e(){w.value=me.value,f.value=!1,m.value=``,k.value=!1,F.value=``}function ve(e){return e.split(`,`).map(e=>Number(e.trim())).filter(e=>Number.isFinite(e))}async function ye(){N.value=!0,P.value=``;try{let e=await R.get(`hardware_options`),t=e.hardware;if(Array.isArray(t)){A.value=t;return}if(e.success&&Array.isArray(e.data)){A.value=e.data;return}A.value=[],P.value=e.error||`Could not load hardware presets`}catch(e){let t=e;A.value=[],P.value=t.message||`Could not load hardware presets`}finally{N.value=!1}}async function be(){E.value=!0,O.value=``;try{let e=await R.getSerialPorts();e.success&&Array.isArray(e.data)?T.value=e.data:(T.value=[],O.value=e.error||`Could not load USB serial devices`)}catch(e){let t=e;T.value=[],O.value=t.message||`Could not load USB serial devices`}finally{E.value=!1}}async function xe(){p.value=!0,m.value=``;try{if(w.value===`pymc_tcp`&&!V.value.trim())return m.value=`TCP modem host is required for pymc_tcp`,!1;let e={radio_type:w.value===`none`?null:w.value};if(w.value===`kiss`&&(e.kiss={port:I.value.trim()||`/dev/ttyUSB0`,baud_rate:$(L.value,9600)}),w.value===`pymc_usb`&&(e.pymc_usb={port:z.value.trim()||`/dev/ttyACM0`,baudrate:$(B.value,921600)}),w.value===`pymc_tcp`&&(e.pymc_tcp={host:V.value.trim(),port:$(H.value,5055),token:U.value}),w.value===`sx1262`||w.value===`sx1262_ch341`){let t=ve(X.value);e.sx1262={bus_id:$(W.value,0),cs_id:$(G.value,0),cs_pin:$(K.value,21),reset_pin:$(q.value,18),busy_pin:$(ne.value,20),irq_pin:$(re.value,16),txen_pin:$(ie.value,-1),rxen_pin:$(J.value,-1),...t.length>0?{en_pins:t}:{en_pin:$(Y.value,-1)},txled_pin:$(Z.value,-1),rxled_pin:$(Q.value,-1)}}w.value===`sx1262_ch341`&&(e.ch341={vid:$(ae.value,6790),pid:$(oe.value,21778)});let t=await R.importConfig(e);return t.success?(f.value=!1,await s.fetchStats(),g.value=!0,!0):(m.value=t.error||`Failed to save settings`,!1)}catch(e){let t=e;return m.value=t.response?.data?.error||t.message||`Failed to save settings`,!1}finally{p.value=!1}}let Se=y(()=>w.value===`kiss`||w.value===`pymc_usb`),Ce=y(()=>w.value===`pymc_tcp`),we=y(()=>w.value===`sx1262`||w.value===`sx1262_ch341`),Te=y(()=>w.value===`sx1262_ch341`),{showUnsavedModal:Ee,requestLeave:De,handleDiscard:Oe,handleSave:ke,handleCancel:Ae}=pe(f,p,_e,async()=>xe());return r({requestLeave:De,isEditing:f}),e(()=>{be(),ye()}),h([f,w],([e,t])=>{e&&(t===`kiss`||t===`pymc_usb`)&&be(),e&&(t===`sx1262`||t===`sx1262_ch341`)&&ye(),F.value=``},{immediate:!1}),(e,n)=>(a(),C(x,null,[v(te,{modelValue:g.value,"onUpdate:modelValue":n[0]||=e=>g.value=e,title:`Radio Hardware change requires a restart.`,message:`Restart now?`},null,8,[`modelValue`]),v(fe,{show:c(Ee),"is-saving":p.value,label:`Radio Hardware settings`,onDiscard:c(Oe),onSave:c(ke),onCancel:c(Ae)},null,8,[`show`,`is-saving`,`onDiscard`,`onSave`,`onCancel`]),S(`div`,lt,[S(`div`,ut,[n[28]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},` Radio Hardware `),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},` Select which radio hardware backend this repeater should use `)],-1),S(`div`,dt,[f.value?(a(),C(x,{key:1},[S(`button`,{onClick:_e,disabled:p.value,class:`cfg-btn-secondary`},` Cancel `,8,ft),S(`button`,{onClick:xe,disabled:p.value,class:`cfg-btn-primary`},l(p.value?`Saving...`:`Save Changes`),9,pt)],64)):(a(),C(`button`,{key:0,onClick:ge,class:`cfg-btn-primary`},` Edit Settings `))])]),m.value?(a(),C(`div`,mt,l(m.value),1)):_(``,!0),S(`div`,ht,[S(`div`,gt,[n[29]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Radio Type`,-1),f.value?(a(),C(`div`,vt,[i(S(`select`,{"onUpdate:modelValue":n[1]||=e=>w.value=e,class:`cfg-select`},[(a(),C(x,null,t(u,e=>S(`option`,{key:e.value,value:e.value},l(e.label)+` - `+l(e.detail),9,yt)),64))],512),[[D,w.value]])])):(a(),C(`div`,_t,l(he.value),1))]),Se.value?(a(),C(x,{key:0},[S(`div`,bt,[n[31]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},` Serial Port `,-1),f.value?(a(),C(`div`,St,[S(`div`,Ct,[w.value===`kiss`?i((a(),C(`select`,{key:0,"onUpdate:modelValue":n[2]||=e=>I.value=e,class:`cfg-select flex-1`,disabled:k.value},[I.value&&!T.value.some(e=>e.device===I.value)?(a(),C(`option`,{key:0,value:I.value},l(I.value)+` (current) `,9,Tt)):_(``,!0),(a(!0),C(x,null,t(T.value,e=>(a(),C(`option`,{key:`kiss-${e.device}`,value:e.device},l(e.description||e.device),9,Et))),128))],8,wt)),[[D,I.value]]):i((a(),C(`select`,{key:1,"onUpdate:modelValue":n[3]||=e=>z.value=e,class:`cfg-select flex-1`,disabled:k.value},[z.value&&!T.value.some(e=>e.device===z.value)?(a(),C(`option`,{key:0,value:z.value},l(z.value)+` (current) `,9,Ot)):_(``,!0),(a(!0),C(x,null,t(T.value,e=>(a(),C(`option`,{key:`usb-${e.device}`,value:e.device},l(e.description||e.device),9,kt))),128))],8,Dt)),[[D,z.value]]),S(`button`,{type:`button`,class:`cfg-btn-secondary`,disabled:E.value,onClick:be},l(E.value?`...`:`Refresh`),9,At)]),S(`label`,jt,[i(S(`input`,{"onUpdate:modelValue":n[4]||=e=>k.value=e,type:`checkbox`},null,512),[[M,k.value]]),n[30]||=b(` Enter custom device path `,-1)]),k.value&&w.value===`kiss`?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[5]||=e=>I.value=e,type:`text`,class:`cfg-input`,placeholder:`/dev/ttyUSB0`},null,512)),[[j,I.value]]):_(``,!0),k.value&&w.value!==`kiss`?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[6]||=e=>z.value=e,type:`text`,class:`cfg-input`,placeholder:`/dev/ttyACM0`},null,512)),[[j,z.value]]):_(``,!0),O.value?(a(),C(`p`,Mt,l(O.value),1)):_(``,!0)])):(a(),C(`div`,xt,l(w.value===`kiss`?I.value:z.value),1))]),S(`div`,Nt,[n[32]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},` Baud Rate `,-1),f.value?(a(),C(x,{key:1},[w.value===`kiss`?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[7]||=e=>L.value=e,type:`number`,min:`1`,class:`cfg-input w-full sm:w-40`},null,512)),[[j,L.value,void 0,{number:!0}]]):i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[8]||=e=>B.value=e,type:`number`,min:`1`,class:`cfg-input w-full sm:w-40`},null,512)),[[j,B.value,void 0,{number:!0}]])],64)):(a(),C(`div`,Pt,l(w.value===`kiss`?L.value:B.value),1))])],64)):_(``,!0),Ce.value?(a(),C(x,{key:1},[S(`div`,Ft,[n[33]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`TCP Host`,-1),f.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[9]||=e=>V.value=e,type:`text`,class:`cfg-input w-full sm:w-72`,placeholder:`pymc-3e2834.local`},null,512)),[[j,V.value]]):(a(),C(`div`,It,l(V.value||`Not set`),1))]),S(`div`,Lt,[n[34]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`TCP Port`,-1),f.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[10]||=e=>H.value=e,type:`number`,min:`1`,max:`65535`,class:`cfg-input w-full sm:w-40`},null,512)),[[j,H.value,void 0,{number:!0}]]):(a(),C(`div`,Rt,l(H.value),1))]),S(`div`,zt,[n[35]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`TCP Token`,-1),f.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[11]||=e=>U.value=e,type:`text`,class:`cfg-input w-full sm:w-72`,placeholder:`Optional`},null,512)),[[j,U.value]]):(a(),C(`div`,Bt,l(U.value?`Configured`:`Not set`),1))])],64)):_(``,!0),we.value&&f.value?(a(),C(x,{key:2},[S(`div`,Vt,[n[38]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Board Preset (Quick Apply)`,-1),S(`div`,Ht,[S(`div`,Ut,[i(S(`select`,{"onUpdate:modelValue":n[12]||=e=>F.value=e,class:`cfg-select flex-1`,onChange:n[13]||=e=>de(F.value)},[n[36]||=S(`option`,{value:``},`Leave current pin values unchanged`,-1),(a(!0),C(x,null,t(ue.value,e=>(a(),C(`option`,{key:e.key,value:e.key},l(e.name||e.key),9,Wt))),128))],544),[[D,F.value]]),S(`button`,{type:`button`,class:`cfg-btn-secondary`,disabled:N.value,onClick:ye},l(N.value?`...`:`Refresh`),9,Gt)]),P.value?(a(),C(`p`,Kt,l(P.value),1)):_(``,!0),n[37]||=S(`p`,{class:`text-xs text-content-muted`},` Optional: selecting a preset fills the pin fields below for quick setup changes. `,-1)])]),n[51]||=S(`div`,{class:`pt-2 text-xs text-content-muted`},`SX1262 Board Pin Configuration`,-1),S(`div`,qt,[S(`label`,Jt,[n[39]||=b(`SPI Bus ID `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[14]||=e=>W.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,W.value,void 0,{number:!0}]]):(a(),C(`span`,Yt,l(W.value),1))]),S(`label`,Xt,[n[40]||=b(`SPI CS ID `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[15]||=e=>G.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,G.value,void 0,{number:!0}]]):(a(),C(`span`,Zt,l(G.value),1))]),S(`label`,Qt,[n[41]||=b(`CS Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[16]||=e=>K.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,K.value,void 0,{number:!0}]]):(a(),C(`span`,$t,l(K.value),1))]),S(`label`,en,[n[42]||=b(`Reset Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[17]||=e=>q.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,q.value,void 0,{number:!0}]]):(a(),C(`span`,tn,l(q.value),1))]),S(`label`,nn,[n[43]||=b(`Busy Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[18]||=e=>ne.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,ne.value,void 0,{number:!0}]]):(a(),C(`span`,rn,l(ne.value),1))]),S(`label`,an,[n[44]||=b(`IRQ Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[19]||=e=>re.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,re.value,void 0,{number:!0}]]):(a(),C(`span`,on,l(re.value),1))]),S(`label`,sn,[n[45]||=b(`TX Enable Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[20]||=e=>ie.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,ie.value,void 0,{number:!0}]]):(a(),C(`span`,cn,l(ie.value),1))]),S(`label`,ln,[n[46]||=b(`RX Enable Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[21]||=e=>J.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,J.value,void 0,{number:!0}]]):(a(),C(`span`,un,l(J.value),1))]),S(`label`,dn,[n[47]||=b(`Power Enable Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[22]||=e=>Y.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,Y.value,void 0,{number:!0}]]):(a(),C(`span`,fn,l(Y.value),1))]),S(`label`,pn,[n[48]||=b(`Power Enable Pins (array) `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[23]||=e=>X.value=e,type:`text`,class:`cfg-input mt-1`,placeholder:`26, 23`},null,512)),[[j,X.value]]):(a(),C(`span`,mn,l(X.value||`Not set`),1))]),S(`label`,hn,[n[49]||=b(`TX LED Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[24]||=e=>Z.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,Z.value,void 0,{number:!0}]]):(a(),C(`span`,gn,l(Z.value),1))]),S(`label`,_n,[n[50]||=b(`RX LED Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[25]||=e=>Q.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,Q.value,void 0,{number:!0}]]):(a(),C(`span`,vn,l(Q.value),1))])])],64)):we.value?(a(),C(`div`,yn,[S(`div`,bn,[n[52]||=S(`div`,{class:`text-content-muted text-xs mb-1`},`Current SPI bus`,-1),S(`div`,xn,l(W.value),1)]),S(`div`,Sn,[n[53]||=S(`div`,{class:`text-content-muted text-xs mb-1`},`Current SPI CS`,-1),S(`div`,Cn,l(G.value),1)]),S(`div`,wn,[n[54]||=S(`div`,{class:`text-content-muted text-xs mb-1`},`Current CS pin`,-1),S(`div`,Tn,l(K.value),1)]),S(`div`,En,[n[55]||=S(`div`,{class:`text-content-muted text-xs mb-1`},`Current reset pin`,-1),S(`div`,Dn,l(q.value),1)]),S(`div`,On,[n[56]||=S(`div`,{class:`text-content-muted text-xs mb-1`},`Current busy pin`,-1),S(`div`,kn,l(ne.value),1)]),S(`div`,An,[n[57]||=S(`div`,{class:`text-content-muted text-xs mb-1`},`Current IRQ pin`,-1),S(`div`,jn,l(re.value),1)]),S(`div`,Mn,[n[58]||=S(`div`,{class:`text-content-muted text-xs mb-1`},`Current power enable pin`,-1),S(`div`,Nn,l(Y.value),1)]),S(`div`,Pn,[n[59]||=S(`div`,{class:`text-content-muted text-xs mb-1`},`Current power enable pins`,-1),S(`div`,Fn,l(X.value||`Not set`),1)])])):_(``,!0),Te.value?(a(),C(x,{key:4},[n[62]||=S(`div`,{class:`pt-2 text-xs text-content-muted`},`CH341 Adapter Configuration`,-1),S(`div`,In,[S(`label`,Ln,[n[60]||=b(`CH341 VID `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[26]||=e=>ae.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,ae.value,void 0,{number:!0}]]):(a(),C(`span`,Rn,l(ae.value),1))]),S(`label`,zn,[n[61]||=b(`CH341 PID `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[27]||=e=>oe.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,oe.value,void 0,{number:!0}]]):(a(),C(`span`,Bn,l(oe.value),1))])])],64)):_(``,!0),n[63]||=S(`div`,{class:`py-2 text-xs text-content-muted`},` Switching hardware saves immediately and requires a service restart to apply. `,-1)])])],64))}}),Hn={class:`space-y-12`},Un={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},Wn={class:`flex items-center gap-2 flex-shrink-0`},Gn=[`disabled`],Kn=[`disabled`],qn={key:0,class:`bg-accent-green/opacity-light dark:bg-accent-green/opacity-light border border-accent-green dark:border-accent-green/opacity-medium rounded-lg p-3`},Jn={class:`text-accent-green text-sm`},Yn={key:1,class:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-light border border-accent-red dark:border-accent-red/opacity-medium rounded-lg p-3`},Xn={class:`text-accent-red text-sm`},Zn={class:`cfg-section space-y-3`},Qn={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},$n={key:0,class:`text-content-primary font-mono text-sm break-all`},er={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},tr={class:`text-content-primary font-mono text-xs break-all`},nr={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},rr={class:`flex items-center gap-2 min-w-0 sm:justify-end`},ir={class:`text-content-primary font-mono text-xs break-all sm:text-right min-w-0`},ar={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},or={class:`text-content-primary font-mono text-sm`},sr={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},cr={key:0,class:`text-content-primary font-mono text-sm`},lr={class:`flex flex-col py-2 gap-2`},ur={class:`flex flex-col sm:flex-row sm:justify-between sm:items-start gap-1`},dr={key:0,class:`text-content-primary font-mono text-sm sm:ml-4`},fr={key:1,class:`flex items-center gap-2`},pr={class:`cfg-section space-y-3`},mr={class:`pb-2`},hr={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},gr={key:0,class:`text-content-primary font-mono text-sm`},_r={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 gap-1`},vr={key:0,class:`text-content-primary font-mono text-sm`},yr={class:`bg-surface dark:bg-surface-elevated border border-stroke-subtle dark:border-stroke/opacity-medium rounded-[15px] shadow-2xl w-full max-w-md p-6 space-y-4`},br={class:`block text-sm font-medium text-content-secondary dark:text-content-muted mb-2`},xr=[`maxlength`,`disabled`],Sr={key:0,class:`text-accent-red text-xs mt-1`},Cr={key:1,class:`text-content-muted text-xs mt-1`},wr=[`disabled`],Tr={key:0,class:`mt-2 bg-accent-amber/opacity-light border border-accent-amber/opacity-medium rounded-lg p-3`},Er={key:0,class:`flex items-center gap-3 bg-primary/opacity-light border border-primary/opacity-medium rounded-lg p-3`},Dr={class:`text-primary text-xs font-medium`},Or={class:`text-primary text-xs mt-0.5`},kr={key:1,class:`bg-accent-red/opacity-light border border-accent-red/opacity-medium rounded-lg p-3`},Ar={class:`text-accent-red text-sm`},jr={key:2,class:`bg-accent-green/opacity-light border border-accent-green/opacity-heavy dark:border-accent-green/opacity-medium rounded-lg p-3 space-y-2`},Mr={class:`text-accent-green text-sm font-medium`},Nr={class:`font-mono text-xs break-all text-content-primary`},Pr={key:3,class:`bg-accent-amber/opacity-light border border-accent-amber/opacity-medium rounded-lg p-3`},Fr={class:`flex gap-2 mt-3`},Ir=[`disabled`],Lr=[`disabled`],Rr={class:`flex justify-end gap-3 mt-6`},zr=[`disabled`],Br=[`disabled`],Vr=f({__name:`RepeaterSettings`,setup(e,{expose:t}){let n=ee(),r=y(()=>n.stats?.config||{}),s=y(()=>r.value.repeater||{}),d=y(()=>n.stats),f=o(!1),g=o(!1),w=o(null),E=o(null),O=o(!1),k=o(``),M=o(0),N=o(0),P=o(0),F=o(1),I=y(()=>r.value.mesh||{});h([r,s,I],()=>{if(!f.value){k.value=r.value.node_name||``,M.value=s.value.latitude||0,N.value=s.value.longitude||0,P.value=s.value.send_advert_interval_hours||0;let e=I.value.path_hash_mode;F.value=e===0||e===1||e===2?e+1:1}},{immediate:!0});let L=y(()=>r.value.node_name||`Not set`),z=y(()=>d.value?.local_hash||`Not available`),B=y(()=>{let e=d.value?.public_key;return!e||e===`Not set`?`Not set`:e}),V=y(()=>{let e=s.value.latitude;return e&&e!==0?e.toFixed(6):`Not set`}),H=y(()=>{let e=s.value.longitude;return e&&e!==0?e.toFixed(6):`Not set`}),U=y(()=>{let e=s.value.mode;return e?e===`no_tx`?`No TX`:e.charAt(0).toUpperCase()+e.slice(1):`Not set`}),G=y(()=>{let e=s.value.send_advert_interval_hours;return e===void 0?`Not set`:e===0?`Disabled`:e+` hour`+(e===1?``:`s`)}),K=y(()=>{let e=I.value.path_hash_mode;return e===0||e===1||e===2?e+1+(e===0?` byte`:` bytes`):`Not set`}),te=()=>{f.value=!0,w.value=null,E.value=null},q=()=>{f.value=!1,w.value=null,k.value=r.value.node_name||``,M.value=s.value.latitude||0,N.value=s.value.longitude||0,P.value=s.value.send_advert_interval_hours||0;let e=I.value.path_hash_mode;F.value=e===0||e===1||e===2?e+1:1},ne=async()=>{g.value=!0,w.value=null,E.value=null;try{let e={};k.value&&(e.node_name=k.value),e.latitude=M.value,e.longitude=N.value,e.flood_advert_interval_hours=P.value,e.path_hash_mode=F.value-1;let t=(await R.post(`/update_radio_config`,e)).data;t.message||t.persisted?(E.value=t.message||`Settings saved successfully`,f.value=!1,await n.fetchStats(),setTimeout(()=>{E.value=null},3e3)):t.error?w.value=t.error:w.value=`Unknown response from server`}catch(e){console.error(`Failed to update repeater settings:`,e),w.value=e.response?.data?.error||`Failed to update settings`}finally{g.value=!1}},ie=()=>{O.value=!0},J=e=>{M.value=e.latitude,N.value=e.longitude},Y=o(!1),X=o(``),Z=o(!1),Q=o(null),ae=o(null),oe=o(!1),se=o(!1),$=o(!1),ce=o(0),le=null,ue=y(()=>$.value?8:4),de=y(()=>{let e=X.value.trim();return!e||e.length>ue.value?!1:/^[0-9a-fA-F]+$/.test(e)}),me=y(()=>{let e=X.value.trim().length;return e===0?``:e===1?`Very fast — ~16 attempts on average`:e===2?`Fast — ~256 attempts on average`:e===3?`Moderate — ~4,096 attempts, a few seconds`:e===4?`Slow — ~65,536 attempts, may take 10-30 seconds`:e===5?`Very slow — ~1 million attempts, could take minutes`:e===6?`Extremely slow — ~16 million attempts, could take a very long time`:e===7?`Extreme — ~268 million attempts, may not complete`:`Extreme — ~4 billion attempts, extremely unlikely to complete`}),he=()=>{ce.value=0,le=setInterval(()=>{ce.value++},1e3)},ge=()=>{le&&=(clearInterval(le),null)};T(()=>ge());let _e=()=>{X.value=``,Q.value=null,ae.value=null,oe.value=!1,$.value=!1,Y.value=!0},ve=async()=>{Z.value=!0,ae.value=null,Q.value=null,he();try{let e=await R.generateVanityKey(X.value.trim());e.success&&e.data?Q.value=e.data:ae.value=e.error||`Generation failed`}catch(e){let t=e;ae.value=t.response?.data?.error||t.message||`Generation failed`}finally{ge(),Z.value=!1}},ye=async()=>{if(Q.value){se.value=!0,ae.value=null;try{let e=await R.generateVanityKey(X.value.trim(),!0);e.success&&e.data?(Q.value=e.data,oe.value=!1,Y.value=!1,E.value=`New identity key applied. Restart the repeater for the change to take effect.`,await n.fetchStats(),setTimeout(()=>{E.value=null},8e3)):ae.value=e.error||`Failed to apply key`}catch(e){let t=e;ae.value=t.response?.data?.error||t.message||`Failed to apply key`}finally{se.value=!1}}},{showUnsavedModal:be,requestLeave:xe,handleDiscard:Se,handleSave:Ce,handleCancel:we}=pe(f,g,q,async()=>(await ne(),!f.value));return t({requestLeave:xe,isEditing:f}),(e,t)=>(a(),C(x,null,[v(fe,{show:c(be),"is-saving":g.value,label:`Repeater Settings`,onDiscard:c(Se),onSave:c(Ce),onCancel:c(we)},null,8,[`show`,`is-saving`,`onDiscard`,`onSave`,`onCancel`]),S(`div`,Hn,[S(`div`,Un,[t[13]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`Repeater Settings`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Configure repeater identity, location, and network settings`)],-1),S(`div`,Wn,[f.value?(a(),C(x,{key:1},[S(`button`,{onClick:q,disabled:g.value,class:`cfg-btn-secondary`},` Cancel `,8,Gn),S(`button`,{onClick:ne,disabled:g.value,class:`cfg-btn-primary`},l(g.value?`Saving...`:`Save Changes`),9,Kn)],64)):(a(),C(`button`,{key:0,onClick:te,class:`cfg-btn-primary`},` Edit Settings `))])]),E.value?(a(),C(`div`,qn,[S(`p`,Jn,l(E.value),1)])):_(``,!0),w.value?(a(),C(`div`,Yn,[S(`p`,Xn,l(w.value),1)])):_(``,!0),S(`div`,Zn,[t[23]||=S(`h3`,{class:`text-lg font-semibold text-content-primary pb-2`},`General Settings`,-1),S(`div`,Qn,[t[14]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Node Name`,-1),f.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":t[0]||=e=>k.value=e,type:`text`,maxlength:`50`,class:`cfg-input w-full sm:w-64`,placeholder:`Enter node name`},null,512)),[[j,k.value]]):(a(),C(`div`,$n,l(L.value),1))]),S(`div`,er,[t[15]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Local Hash`,-1),S(`span`,tr,l(z.value),1)]),S(`div`,nr,[t[16]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm flex-shrink-0`},`Public Key`,-1),S(`div`,rr,[S(`span`,ir,l(B.value),1),f.value?(a(),C(`button`,{key:0,onClick:_e,class:`flex-shrink-0 px-2 py-1 text-xs bg-primary/opacity-light hover:bg-primary/opacity-medium text-content-secondary dark:text-content-muted rounded border border-primary/opacity-medium transition-colors whitespace-nowrap`},` Generate New Key `)):_(``,!0)])]),S(`div`,ar,[t[17]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Mode`,-1),S(`span`,or,l(U.value),1)]),S(`div`,sr,[t[19]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Path hash length`,-1),f.value?i((a(),C(`select`,{key:1,"onUpdate:modelValue":t[1]||=e=>F.value=e,class:`cfg-select w-full sm:w-32`},[...t[18]||=[S(`option`,{value:1},`1 byte`,-1),S(`option`,{value:2},`2 bytes`,-1),S(`option`,{value:3},`3 bytes`,-1)]],512)),[[D,F.value,void 0,{number:!0}]]):(a(),C(`div`,cr,l(K.value),1))]),S(`div`,lr,[S(`div`,ur,[t[21]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Periodic Advertisement Interval`,-1),f.value?(a(),C(`div`,fr,[i(S(`input`,{"onUpdate:modelValue":t[2]||=e=>P.value=e,type:`number`,min:`0`,max:`48`,class:`cfg-input w-20`},null,512),[[j,P.value,void 0,{number:!0}]]),t[20]||=S(`span`,{class:`text-content-muted text-sm`},`hours`,-1)])):(a(),C(`div`,dr,l(G.value),1))]),t[22]||=S(`span`,{class:`text-content-muted text-xs`},`How often the repeater sends an advertisement packet (0 = disabled, 3-48 hours)`,-1)])]),S(`div`,pr,[S(`div`,mr,[t[25]||=S(`h3`,{class:`text-lg font-semibold text-content-primary mb-3`},`Location Settings`,-1),f.value?(a(),C(`button`,{key:0,onClick:ie,class:`btn-primary flex items-center gap-2`,title:`Pick location on map`},[...t[24]||=[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z`}),S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 11a3 3 0 11-6 0 3 3 0 016 0z`})],-1),b(` Pick Location on Map `,-1)]])):_(``,!0)]),S(`div`,hr,[t[26]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Manual Latitude`,-1),f.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":t[3]||=e=>M.value=e,type:`number`,step:`0.000001`,min:`-90`,max:`90`,class:`cfg-input w-full sm:w-48`},null,512)),[[j,M.value,void 0,{number:!0}]]):(a(),C(`div`,gr,l(V.value),1))]),S(`div`,_r,[t[27]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Manual Longitude`,-1),f.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":t[4]||=e=>N.value=e,type:`number`,step:`0.000001`,min:`-180`,max:`180`,class:`cfg-input w-full sm:w-48`},null,512)),[[j,N.value,void 0,{number:!0}]]):(a(),C(`div`,vr,l(H.value),1))])]),v(re,{"is-open":O.value,latitude:M.value,longitude:N.value,onClose:t[5]||=e=>O.value=!1,onSelect:J},null,8,[`is-open`,`latitude`,`longitude`]),(a(),u(m,{to:`body`},[Y.value?(a(),C(`div`,{key:0,class:`modal-backdrop`,onClick:t[12]||=A(e=>Y.value=!1,[`self`])},[S(`div`,yr,[t[34]||=S(`h3`,{class:`text-xl font-semibold text-content-primary`},` Generate Vanity Identity Key `,-1),t[35]||=S(`p`,{class:`text-xs text-content-muted`},` Generate a new Ed25519 identity key whose public key starts with your chosen hex prefix (0-9, A-F). Longer prefixes take more time to find. `,-1),S(`div`,null,[S(`label`,br,`Hex Prefix (1-`+l(ue.value)+` characters)`,1),i(S(`input`,{"onUpdate:modelValue":t[6]||=e=>X.value=e,type:`text`,maxlength:ue.value,placeholder:`e.g. F8A1`,disabled:Z.value,class:`cfg-input py-2 placeholder-content-muted dark:placeholder-content-muted font-mono uppercase disabled:opacity-50`},null,8,xr),[[j,X.value]]),X.value&&!de.value?(a(),C(`p`,Sr,` Enter 1-`+l(ue.value)+` valid hex characters (0-9, A-F) `,1)):me.value?(a(),C(`p`,Cr,l(me.value),1)):_(``,!0)]),S(`div`,null,[S(`button`,{onClick:t[7]||=e=>$.value=!$.value,disabled:Z.value,class:`text-xs text-content-muted hover:text-content-secondary dark:hover:text-content-secondary transition-colors disabled:opacity-50 flex items-center gap-1`},[(a(),C(`svg`,{class:p([`w-3 h-3 transition-transform`,{"rotate-90":$.value}]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...t[28]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 5l7 7-7 7`},null,-1)]],2)),t[29]||=b(` Advanced `,-1)],8,wr),$.value?(a(),C(`div`,Tr,[...t[30]||=[S(`p`,{class:`text-accent-amber text-xs font-medium`},` Extended prefix mode (up to 8 characters) `,-1),S(`p`,{class:`text-accent-amber text-xs mt-1`},` Prefixes longer than 4 characters require exponentially more attempts and can take a very long time or may not complete at all. The request may time out. `,-1)]])):_(``,!0)]),Z.value?(a(),C(`div`,Er,[v(W,{size:`sm`,class:`flex-shrink-0`}),S(`div`,null,[S(`p`,Dr,` Searching for key with prefix "`+l(X.value.toUpperCase())+`"... `,1),S(`p`,Or,` Elapsed: `+l(ce.value)+`s `,1)])])):_(``,!0),ae.value?(a(),C(`div`,kr,[S(`p`,Ar,l(ae.value),1)])):_(``,!0),Q.value?(a(),C(`div`,jr,[S(`p`,Mr,` Key found in `+l(Q.value.attempts.toLocaleString())+` attempts `,1),S(`div`,null,[t[31]||=S(`span`,{class:`text-xs text-content-muted`},`Public Key:`,-1),S(`p`,Nr,l(Q.value.public_hex),1)])])):_(``,!0),oe.value&&Q.value?(a(),C(`div`,Pr,[t[32]||=S(`p`,{class:`text-accent-amber text-sm font-medium`},` Warning: This will replace your current identity key. `,-1),t[33]||=S(`p`,{class:`text-accent-amber text-xs mt-1`},` Your node address and public key will change. Other nodes will need to re-discover you. This cannot be undone unless you have a backup. `,-1),S(`div`,Fr,[S(`button`,{onClick:ye,disabled:se.value,class:`px-3 py-1.5 bg-accent-red/opacity-light hover:bg-accent-red/opacity-light text-white rounded-lg text-xs transition-colors disabled:opacity-50`},l(se.value?`Applying...`:`Confirm Replace Key`),9,Ir),S(`button`,{onClick:t[8]||=e=>oe.value=!1,disabled:se.value,class:`btn-secondary-xs`},` Cancel `,8,Lr)])])):_(``,!0),S(`div`,Rr,[S(`button`,{onClick:t[9]||=e=>Y.value=!1,disabled:Z.value,class:`px-4 py-2 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light text-content-primary rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light transition-colors`},` Close `,8,zr),Q.value?(a(),C(x,{key:1},[S(`button`,{onClick:t[10]||=e=>{Q.value=null,ae.value=null},class:`btn-primary`},` Try Again `),oe.value?_(``,!0):(a(),C(`button`,{key:0,onClick:t[11]||=e=>oe.value=!0,class:`cfg-btn-danger`},` Apply Key `))],64)):(a(),C(`button`,{key:0,onClick:ve,disabled:!de.value||Z.value,class:`btn-primary`},l(Z.value?`Generating...`:`Generate`),9,Br))])])])):_(``,!0)]))])],64))}}),Hr={class:`space-y-12`},Ur={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},Wr={class:`flex items-center gap-2 flex-shrink-0`},Gr=[`disabled`],Kr=[`disabled`],qr={key:0,class:`bg-accent-green/opacity-light dark:bg-accent-green/opacity-medium border border-accent-green dark:border-accent-green/opacity-heavy rounded-lg p-3 text-accent-green text-sm`},Jr={key:1,class:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium border border-accent-red dark:border-accent-red/opacity-heavy rounded-lg p-3 text-accent-red text-sm`},Yr={class:`cfg-section`},Xr={class:`space-y-3`},Zr={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Qr={key:0,class:`text-content-primary font-mono text-sm`},$r={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 gap-1`},ei={key:0,class:`text-content-primary font-mono text-sm`},ti=f({__name:`DutyCycle`,setup(e,{expose:t}){let n=ee(),r=y(()=>n.stats?.config?.duty_cycle||{}),s=y(()=>{let e=r.value.max_airtime_percent;return typeof e==`number`?e.toFixed(1)+`%`:e&&typeof e==`object`&&`parsedValue`in e?(e.parsedValue||0).toFixed(1)+`%`:`Not set`}),u=y(()=>r.value.enforcement_enabled?`Enabled`:`Disabled`),d=o(!1),f=o(!1),p=o(``),m=o(``),h=o(0),g=o(!0),b=()=>{let e=r.value.max_airtime_percent;typeof e==`number`?h.value=e:e&&typeof e==`object`&&`parsedValue`in e?h.value=e.parsedValue||0:h.value=6,g.value=r.value.enforcement_enabled!==!1,d.value=!0,p.value=``,m.value=``},w=()=>{d.value=!1,p.value=``,m.value=``},{showUnsavedModal:T,requestLeave:E,handleDiscard:O,handleSave:k,handleCancel:A}=pe(d,f,w,async()=>(await M(),!d.value));t({requestLeave:E,isEditing:d});let M=async()=>{f.value=!0,m.value=``,p.value=``;try{let e=(await R.post(`/update_duty_cycle_config`,{max_airtime_percent:h.value,enforcement_enabled:g.value})).data;e?.message||e?.persisted?(p.value=e?.message||`Settings saved successfully`,d.value=!1,await n.fetchStats(),setTimeout(()=>{p.value=``},3e3)):m.value=e?.error||`Failed to save settings`}catch(e){console.error(`Failed to save duty cycle settings:`,e),m.value=e.response?.data?.error||`Failed to save settings`}finally{f.value=!1}};return(e,t)=>(a(),C(x,null,[v(fe,{show:c(T),"is-saving":f.value,label:`Duty Cycle settings`,onDiscard:c(O),onSave:c(k),onCancel:c(A)},null,8,[`show`,`is-saving`,`onDiscard`,`onSave`,`onCancel`]),S(`div`,Hr,[S(`div`,Ur,[t[2]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`Duty Cycle`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Configure duty cycle limits for channel activity`)],-1),S(`div`,Wr,[d.value?(a(),C(x,{key:1},[S(`button`,{onClick:w,disabled:f.value,class:`cfg-btn-secondary`},` Cancel `,8,Gr),S(`button`,{onClick:M,disabled:f.value,class:`cfg-btn-primary`},l(f.value?`Saving...`:`Save Changes`),9,Kr)],64)):(a(),C(`button`,{key:0,onClick:b,class:`cfg-btn-primary`},` Edit Settings `))])]),p.value?(a(),C(`div`,qr,l(p.value),1)):_(``,!0),m.value?(a(),C(`div`,Jr,l(m.value),1)):_(``,!0),S(`div`,Yr,[S(`div`,Xr,[S(`div`,Zr,[t[3]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Max Airtime %`,-1),d.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":t[0]||=e=>h.value=e,type:`number`,step:`0.1`,min:`0.1`,max:`100`,class:`cfg-input w-full sm:w-32`},null,512)),[[j,h.value,void 0,{number:!0}]]):(a(),C(`div`,Qr,l(s.value),1))]),S(`div`,$r,[t[5]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Enforcement`,-1),d.value?i((a(),C(`select`,{key:1,"onUpdate:modelValue":t[1]||=e=>g.value=e,class:`cfg-select w-full sm:w-32`},[...t[4]||=[S(`option`,{value:!0},`Enabled`,-1),S(`option`,{value:!1},`Disabled`,-1)]],512)),[[D,g.value]]):(a(),C(`div`,ei,l(u.value),1))])])])])],64))}}),ni={class:`space-y-12`},ri={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},ii={class:`flex items-center gap-2 flex-shrink-0`},ai=[`disabled`],oi=[`disabled`],si={key:0,class:`bg-accent-green/opacity-light dark:bg-accent-green/opacity-medium border border-accent-green dark:border-accent-green/opacity-heavy rounded-lg p-3 text-accent-green text-sm`},ci={key:1,class:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium border border-accent-red dark:border-accent-red/opacity-heavy rounded-lg p-3 text-accent-red text-sm`},li={class:`cfg-section space-y-3`},ui={class:`flex flex-col sm:flex-row sm:items-center sm:justify-between py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-3`},di={key:0,class:`text-content-primary font-mono text-sm flex-shrink-0`},fi={class:`flex flex-col sm:flex-row sm:items-center sm:justify-between py-2 gap-3`},pi={key:0,class:`text-content-primary font-mono text-sm flex-shrink-0`},mi=f({__name:`TransmissionDelays`,setup(e,{expose:t}){let n=ee(),r=y(()=>n.stats?.config?.delays||{}),s=y(()=>{let e=r.value.tx_delay_factor;if(typeof e==`number`)return e.toFixed(2)+`x`;if(e&&typeof e==`object`&&`parsedValue`in e){let t=e.parsedValue;if(typeof t==`number`)return t.toFixed(2)+`x`}return`Not set`}),u=y(()=>{let e=r.value.direct_tx_delay_factor;return typeof e==`number`?e.toFixed(2)+`s`:`Not set`}),d=o(!1),f=o(!1),p=o(``),m=o(``),h=o(0),g=o(0),b=()=>{let e=r.value.tx_delay_factor;e&&typeof e==`object`&&`parsedValue`in e?h.value=e.parsedValue||1:typeof e==`number`?h.value=e:h.value=1;let t=r.value.direct_tx_delay_factor;g.value=typeof t==`number`?t:.5,d.value=!0,p.value=``,m.value=``},w=()=>{d.value=!1,p.value=``,m.value=``},T=async()=>{f.value=!0,m.value=``,p.value=``;try{let e=(await R.post(`/update_radio_config`,{tx_delay_factor:h.value,direct_tx_delay_factor:g.value})).data,t=e?.data??e;e?.success||t?.persisted||t?.message?(p.value=t?.message||`Settings saved successfully`,d.value=!1,await n.fetchStats(),setTimeout(()=>{p.value=``},3e3)):m.value=t?.error||`Failed to save settings`}catch(e){console.error(`Failed to save delay settings:`,e),m.value=e.response?.data?.error||`Failed to save settings`}finally{f.value=!1}},{showUnsavedModal:E,requestLeave:D,handleDiscard:O,handleSave:k,handleCancel:A}=pe(d,f,w,async()=>(await T(),!d.value));return t({requestLeave:D,isEditing:d}),(e,t)=>(a(),C(x,null,[v(fe,{show:c(E),"is-saving":f.value,label:`TX Delay settings`,onDiscard:c(O),onSave:c(k),onCancel:c(A)},null,8,[`show`,`is-saving`,`onDiscard`,`onSave`,`onCancel`]),S(`div`,ni,[S(`div`,ri,[t[2]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`TX Delays`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Configure transmission delay factors for flood and direct packets`)],-1),S(`div`,ii,[d.value?(a(),C(x,{key:1},[S(`button`,{onClick:w,disabled:f.value,class:`cfg-btn-secondary`},` Cancel `,8,ai),S(`button`,{onClick:T,disabled:f.value,class:`cfg-btn-primary`},l(f.value?`Saving...`:`Save Changes`),9,oi)],64)):(a(),C(`button`,{key:0,onClick:b,class:`cfg-btn-primary`},` Edit Settings `))])]),p.value?(a(),C(`div`,si,l(p.value),1)):_(``,!0),m.value?(a(),C(`div`,ci,l(m.value),1)):_(``,!0),S(`div`,li,[S(`div`,ui,[t[3]||=S(`div`,{class:`flex flex-col gap-1`},[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Flood TX Delay Factor`),S(`span`,{class:`text-content-muted text-xs`},`Scales the airtime-based random transmit window for flood packets. Higher values increase delay spread for collision avoidance.`)],-1),d.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":t[0]||=e=>h.value=e,type:`number`,step:`0.1`,min:`0`,max:`5`,class:`cfg-input w-full sm:w-32 flex-shrink-0`},null,512)),[[j,h.value,void 0,{number:!0}]]):(a(),C(`div`,di,l(s.value),1))]),S(`div`,fi,[t[4]||=S(`div`,{class:`flex flex-col gap-1`},[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Direct TX Delay Factor`),S(`span`,{class:`text-content-muted text-xs`},`Fixed delay in seconds before transmitting direct-routed packets. Applied as-is with no randomisation.`)],-1),d.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":t[1]||=e=>g.value=e,type:`number`,step:`0.1`,min:`0`,max:`5`,class:`cfg-input w-full sm:w-32 flex-shrink-0`},null,512)),[[j,g.value,void 0,{number:!0}]]):(a(),C(`div`,pi,l(u.value),1))])])])],64))}}),hi=z(`treeState`,()=>{let e=s(new Set),t=s({value:null}),n=t=>{e.add(t)},r=t=>{e.delete(t)};return{expandedNodes:e,selectedNodeId:t,addExpandedNode:n,removeExpandedNode:r,isNodeExpanded:t=>e.has(t),setSelectedNode:e=>{t.value=e},toggleExpanded:t=>{e.has(t)?r(t):n(t)}}}),gi={class:`select-none`},_i={class:`flex-shrink-0`},vi={key:0,class:`w-3.5 h-3.5 sm:w-4 sm:h-4 text-secondary`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},yi={key:1,class:`w-3.5 h-3.5 sm:w-4 sm:h-4 text-accent-green`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},bi={key:0,class:`hidden sm:flex items-center gap-1 ml-2`},xi={class:`relative group`},Si=[`title`],Ci={key:0,class:`text-xs font-mono text-content-secondary dark:text-on-dark-secondary bg-stroke-subtle/40 dark:bg-white/opacity-subtle px-1.5 py-0.5 rounded border border-stroke-subtle dark:border-white/opacity-light`},wi={class:`flex justify-between items-start mb-4`},Ti={class:`bg-black/opacity-medium border border-white/opacity-light rounded-md p-4 mb-4`},Ei={class:`text-sm font-mono text-white/80 break-all leading-relaxed`},Di={class:`flex justify-end`},Oi={class:`flex items-center gap-2 sm:gap-3 ml-auto flex-shrink-0`},ki={key:0,class:`hidden sm:flex items-center gap-1`},Ai=[`title`],ji={key:1,class:`hidden sm:flex items-center gap-1`},Mi={key:3,class:`hidden sm:inline-block px-2 py-1 bg-stroke-subtle dark:bg-white/opacity-subtle text-content-secondary dark:text-on-dark-secondary text-xs rounded-full ml-1`},Ni={key:0,class:`space-y-1`},Pi=K(f({__name:`TreeNode`,props:{node:{},selectedNodeId:{},level:{},disabled:{type:Boolean},unlocked:{type:Boolean}},emits:[`select`,`edit`,`delete`],setup(e,{emit:n}){let i=e,s=n,d=hi(),f=o(!1),m=y({get:()=>d.isNodeExpanded(i.node.id),set:e=>{e?d.addExpandedNode(i.node.id):d.removeExpandedNode(i.node.id)}}),h=y(()=>i.node.children.length>0);function b(){i.unlocked&&T(),h.value&&w()}function w(){h.value&&(m.value=!m.value)}function T(){s(`select`,i.node.id)}function E(e){s(`select`,e)}function D(e){s(`edit`,e)}function O(e){s(`delete`,e)}function k(e){e.stopPropagation(),f.value=!f.value}let{copy:j,copied:M}=ie();function P(e){e.stopPropagation(),i.node.transport_key&&j(i.node.transport_key)}return(n,o)=>{let d=g(`TreeNode`,!0);return a(),C(`div`,gi,[S(`div`,{class:p([`flex flex-wrap sm:flex-nowrap items-start sm:items-center gap-1 sm:gap-2 py-2 px-2 sm:px-3 rounded-lg border transition-colors duration-150`,i.disabled?`opacity-50`:``,i.unlocked&&e.selectedNodeId===e.node.id?`bg-primary/opacity-light border-primary/opacity-medium text-content-primary`:`cfg-card text-content-primary/opacity-heavy`,i.unlocked&&e.selectedNodeId!==e.node.id?`hover:bg-stroke-subtle/40 dark:hover:bg-white/opacity-light hover:border-stroke dark:hover:border-white/15`:``,h.value&&!i.disabled?`cursor-pointer`:``,`ml-${e.level*4}`]),onClick:o[5]||=A(e=>!i.disabled&&b(),[`stop`])},[S(`div`,{class:`flex-shrink-0 w-3 h-3 sm:w-4 sm:h-4 flex items-center justify-center`,onClick:A(w,[`stop`])},[h.value?(a(),C(`svg`,{key:0,class:p([`w-2.5 h-2.5 sm:w-3 sm:h-3 transition-transform duration-200`,m.value?`rotate-90`:`rotate-0`]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...o[6]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 5l7 7-7 7`},null,-1)]],2)):_(``,!0)]),S(`div`,_i,[i.node.name.startsWith(`#`)?(a(),C(`svg`,vi,[...o[7]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M7 20l4-16m2 16l4-16M6 9h14M4 15h14`},null,-1)]])):(a(),C(`svg`,yi,[...o[8]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z`},null,-1)]]))]),S(`span`,{class:p([`font-mono text-xs sm:text-sm transition-colors duration-200 break-all`,e.selectedNodeId===e.node.id?`text-primary font-medium`:``])},l(e.node.name.startsWith(`#`)?e.node.name.slice(1):e.node.name),3),e.node.transport_key?(a(),C(`div`,bi,[S(`div`,xi,[S(`button`,{onClick:k,class:`p-1 rounded hover:bg-stroke-subtle dark:hover:bg-white/opacity-light transition-colors`,title:f.value?`Hide full key`:`Show full key`},[...o[9]||=[S(`svg`,{class:`w-3 h-3 text-content-muted dark:text-on-dark-secondary hover:text-content-secondary`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 12a3 3 0 11-6 0 3 3 0 016 0z`}),S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z`})],-1)]],8,Si),f.value?_(``,!0):(a(),C(`span`,Ci,l(c(X)(e.node.transport_key)),1)),f.value?(a(),C(`div`,{key:1,class:`modal-backdrop`,onClick:o[2]||=e=>f.value=!1},[S(`div`,{class:`bg-black/opacity-medium border border-white/opacity-medium rounded-lg shadow-lg p-6 max-w-2xl w-full mx-4`,onClick:o[1]||=A(()=>{},[`stop`])},[S(`div`,wi,[o[11]||=S(`h3`,{class:`text-lg font-semibold text-white`},`Transport Key`,-1),S(`button`,{onClick:o[0]||=e=>f.value=!1,class:`text-white/60 hover:text-white transition-colors`},[...o[10]||=[S(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),S(`div`,Ti,[S(`div`,Ei,l(e.node.transport_key),1)]),S(`div`,Di,[S(`button`,{onClick:P,class:p([`flex items-center gap-2 transition-colors`,c(M)?`btn-primary`:`btn-success`])},[o[12]||=S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z`})],-1),v(J,{copied:c(M),label:`Copy Key`},null,8,[`copied`])],2)])])])):_(``,!0)])])):_(``,!0),S(`div`,Oi,[e.node.last_used?(a(),C(`div`,ki,[o[13]||=S(`span`,{class:`text-xs text-content-muted dark:text-on-dark-muted`},`Last Heard:`,-1),S(`span`,{class:`text-xs text-content-secondary dark:text-on-dark-secondary`,title:e.node.last_used.toLocaleString()},l(c(Y)(e.node.last_used)),9,Ai)])):(a(),C(`div`,ji,[...o[14]||=[S(`span`,{class:`text-xs text-content-muted dark:text-on-dark-subtle`},`Last Heard:`,-1),S(`span`,{class:`text-xs text-content-muted dark:text-on-dark-subtle italic`},`Never`,-1)]])),S(`span`,{class:p([`text-[10px] sm:text-xs`,e.node.floodPolicy===`allow`?`text-accent-green/opacity-heavy`:`text-accent-red/opacity-heavy`])},` Flood: `+l(e.node.floodPolicy===`allow`?`Allow`:`Deny`),3),i.unlocked?(a(),C(x,{key:2},[S(`button`,{onClick:o[3]||=A(t=>s(`edit`,e.node.id),[`stop`]),class:`px-2 py-0.5 text-[10px] sm:text-xs bg-primary/opacity-light hover:bg-primary/opacity-medium text-content-secondary dark:text-content-muted rounded border border-primary/opacity-medium transition-colors whitespace-nowrap`},` Edit `),S(`button`,{onClick:o[4]||=A(t=>s(`delete`,e.node.id),[`stop`]),class:`p-1 text-accent-red/opacity-heavy hover:text-accent-red transition-colors`,title:`Delete`},[...o[15]||=[S(`svg`,{class:`w-3.5 h-3.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16`})],-1)]])],64)):_(``,!0),h.value&&!i.unlocked?(a(),C(`span`,Mi,l(e.node.children.length),1)):_(``,!0)])],2),v(N,{"enter-active-class":`transition-all duration-300 ease-out`,"enter-from-class":`opacity-0 max-h-0 overflow-hidden`,"enter-to-class":`opacity-100 max-h-screen overflow-visible`,"leave-active-class":`transition-all duration-300 ease-in`,"leave-from-class":`opacity-100 max-h-screen overflow-visible`,"leave-to-class":`opacity-0 max-h-0 overflow-hidden`},{default:r(()=>[m.value&&e.node.children.length>0?(a(),C(`div`,Ni,[(a(!0),C(x,null,t(e.node.children,t=>(a(),u(d,{key:t.id,node:t,"selected-node-id":e.selectedNodeId,level:e.level+1,disabled:i.disabled,unlocked:i.unlocked,onSelect:E,onEdit:D,onDelete:O},null,8,[`node`,`selected-node-id`,`level`,`disabled`,`unlocked`]))),128))])):_(``,!0)]),_:1})])}}}),[[`__scopeId`,`data-v-164d2832`]]);function Fi(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name===`Uint8Array`&&`BYTES_PER_ELEMENT`in e&&e.BYTES_PER_ELEMENT===1}function Ii(e,t,n=``){let r=Fi(e),i=e?.length,a=t!==void 0;if(!r||a&&i!==t){let o=n&&`"${n}" `,s=a?` of length ${t}`:``,c=r?`length=${i}`:`type=${typeof e}`,l=o+`expected Uint8Array`+s+`, got `+c;throw r?RangeError(l):TypeError(l)}return e}function Li(e,t=!0){if(e.destroyed)throw Error(`Hash instance has been destroyed`);if(t&&e.finished)throw Error(`Hash#digest() has already been called`)}function Ri(e,t){Ii(e,void 0,`digestInto() output`);let n=t.outputLen;if(e.length=`+n)}function zi(...e){for(let t=0;t>>t}new Uint8Array(new Uint32Array([287454020]).buffer)[0],typeof Uint8Array.from([]).toHex==`function`&&Uint8Array.fromHex;function Hi(e,t={}){let n=(t,n)=>e(n).update(t).digest(),r=e(void 0);return n.outputLen=r.outputLen,n.blockLen=r.blockLen,n.canXOF=r.canXOF,n.create=t=>e(t),Object.assign(n,t),Object.freeze(n)}var Ui=e=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,e])});function Wi(e,t,n){return e&t^~e&n}function Gi(e,t,n){return e&t^e&n^t&n}var Ki=class{blockLen;outputLen;canXOF=!1;padOffset;isLE;buffer;view;finished=!1;length=0;pos=0;destroyed=!1;constructor(e,t,n,r){this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=r,this.buffer=new Uint8Array(e),this.view=Bi(this.buffer)}update(e){Li(this),Ii(e);let{view:t,buffer:n,blockLen:r}=this,i=e.length;for(let a=0;ar-a&&(this.process(n,0),a=0);for(let e=a;el.length)throw Error(`_sha2: outputLen bigger than state`);for(let e=0;e>Yi&Ji)}:{h:Number(e>>Yi&Ji)|0,l:Number(e&Ji)|0}}function Zi(e,t=!1){let n=e.length,r=new Uint32Array(n),i=new Uint32Array(n);for(let a=0;a>>3;$i[e]=(Vi(n,17)^Vi(n,19)^n>>>10)+$i[e-7]+r+$i[e-16]|0}let{A:n,B:r,C:i,D:a,E:o,F:s,G:c,H:l}=this;for(let e=0;e<64;e++){let t=Vi(o,6)^Vi(o,11)^Vi(o,25),u=l+t+Wi(o,s,c)+Qi[e]+$i[e]|0,d=(Vi(n,2)^Vi(n,13)^Vi(n,22))+Gi(n,r,i)|0;l=c,c=s,s=o,o=a+u|0,a=i,i=r,r=n,n=u+d|0}n=n+this.A|0,r=r+this.B|0,i=i+this.C|0,a=a+this.D|0,o=o+this.E|0,s=s+this.F|0,c=c+this.G|0,l=l+this.H|0,this.set(n,r,i,a,o,s,c,l)}roundClean(){zi($i)}destroy(){this.destroyed=!0,this.set(0,0,0,0,0,0,0,0),zi(this.buffer)}},ta=class extends ea{A=qi[0]|0;B=qi[1]|0;C=qi[2]|0;D=qi[3]|0;E=qi[4]|0;F=qi[5]|0;G=qi[6]|0;H=qi[7]|0;constructor(){super(32)}},na=Zi(`0x428a2f98d728ae22.0x7137449123ef65cd.0xb5c0fbcfec4d3b2f.0xe9b5dba58189dbbc.0x3956c25bf348b538.0x59f111f1b605d019.0x923f82a4af194f9b.0xab1c5ed5da6d8118.0xd807aa98a3030242.0x12835b0145706fbe.0x243185be4ee4b28c.0x550c7dc3d5ffb4e2.0x72be5d74f27b896f.0x80deb1fe3b1696b1.0x9bdc06a725c71235.0xc19bf174cf692694.0xe49b69c19ef14ad2.0xefbe4786384f25e3.0x0fc19dc68b8cd5b5.0x240ca1cc77ac9c65.0x2de92c6f592b0275.0x4a7484aa6ea6e483.0x5cb0a9dcbd41fbd4.0x76f988da831153b5.0x983e5152ee66dfab.0xa831c66d2db43210.0xb00327c898fb213f.0xbf597fc7beef0ee4.0xc6e00bf33da88fc2.0xd5a79147930aa725.0x06ca6351e003826f.0x142929670a0e6e70.0x27b70a8546d22ffc.0x2e1b21385c26c926.0x4d2c6dfc5ac42aed.0x53380d139d95b3df.0x650a73548baf63de.0x766a0abb3c77b2a8.0x81c2c92e47edaee6.0x92722c851482353b.0xa2bfe8a14cf10364.0xa81a664bbc423001.0xc24b8b70d0f89791.0xc76c51a30654be30.0xd192e819d6ef5218.0xd69906245565a910.0xf40e35855771202a.0x106aa07032bbd1b8.0x19a4c116b8d2d0c8.0x1e376c085141ab53.0x2748774cdf8eeb99.0x34b0bcb5e19b48a8.0x391c0cb3c5c95a63.0x4ed8aa4ae3418acb.0x5b9cca4f7763e373.0x682e6ff3d6b2b8a3.0x748f82ee5defb2fc.0x78a5636f43172f60.0x84c87814a1f0ab72.0x8cc702081a6439ec.0x90befffa23631e28.0xa4506cebde82bde9.0xbef9a3f7b2c67915.0xc67178f2e372532b.0xca273eceea26619c.0xd186b8c721c0c207.0xeada7dd6cde0eb1e.0xf57d4f7fee6ed178.0x06f067aa72176fba.0x0a637dc5a2c898a6.0x113f9804bef90dae.0x1b710b35131c471b.0x28db77f523047d84.0x32caab7b40c72493.0x3c9ebe0a15c9bebc.0x431d67c49c100d4c.0x4cc5d4becb3e42b6.0x597f299cfc657e2a.0x5fcb6fab3ad6faec.0x6c44198c4a475817`.split(`.`).map(e=>BigInt(e)));na[0],na[1];var ra=Hi(()=>new ta,Ui(1)),ia={class:`flex items-center justify-between mb-6`},aa={class:`text-xl font-semibold text-content-primary`},oa={key:0,class:`text-content-secondary dark:text-content-muted text-sm mt-1`},sa={class:`text-primary font-mono`},ca={key:0,class:`mb-4 text-sm text-content-secondary dark:text-content-muted`},la={key:1,class:`mb-4 text-sm text-content-secondary dark:text-content-muted`},ua={class:`pb-2`},da={class:`flex bg-background-mute dark:bg-stroke/opacity-subtle rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium p-0.5`},fa={class:`modal-field-label`},pa={class:`flex items-center`},ma={key:0,class:`px-3 py-2 bg-secondary/opacity-light border border-r-0 border-secondary/opacity-medium rounded-l-md text-secondary text-sm font-mono`},ha=[`placeholder`],ga={key:0,class:`text-content-muted text-xs mt-1`},_a={key:1,class:`mt-3`},va={class:`flex items-center justify-between mb-1`},ya=[`value`],ba={key:0,class:`text-xs text-accent-amber mt-1`},xa={key:0,class:`bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light rounded-lg p-3`},Sa={class:`flex items-center justify-between`},Ca={class:`text-right`},wa={class:`text-sm text-content-secondary dark:text-content-muted`},Ta={class:`text-xs text-content-muted`},Ea={class:`pt-1 border-t border-stroke-subtle dark:border-stroke/opacity-light`},Da={class:`flex bg-background-mute dark:bg-stroke/opacity-subtle rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium p-0.5`},Oa={class:`modal-actions`},ka=[`disabled`],Aa=f({name:`KeyModal`,__name:`KeyModal`,props:{show:{type:Boolean},node:{},selectedParentId:{},allNodes:{}},emits:[`close`,`add`,`save`],setup(e,{emit:r}){let s=e,d=r,f=y(()=>s.node===null),g=o(``),w=o(`allow`),T=o(`region`),E=y(()=>T.value===`region`),D=y(()=>({type:E.value?`Region`:`Private Key`}));h(()=>s.node,e=>{if(e){let t=e.name.startsWith(`#`);T.value=t?`region`:`privateKey`,g.value=t?e.name.slice(1):e.name,w.value=e.floodPolicy}else g.value=``,w.value=`allow`,T.value=`region`},{immediate:!0});function O(e,t){for(let n of e){if(n.id===t)return n;let e=O(n.children,t);if(e)return e}return null}function k(e,t){for(let n of e){if(n.id===t)return[n];let e=k(n.children,t);if(e.length)return[n,...e]}return[]}let M=y(()=>{let e=f.value?s.selectedParentId:s.node?.parent_id;return e?k(s.allNodes,e):[]}),N=y(()=>{let e=g.value.trim();return e?E.value?`#${e}`:e:s.node?.name||``}),P=y(()=>s.node?s.node.name.startsWith(`#`)?s.node.name.slice(1):s.node.name:``),F=y(()=>g.value.trim()!==P.value);function I(e){let t=e.startsWith(`#`)?e:`#${e}`,n=ra(new TextEncoder().encode(t)).slice(0,16),r=``;return n.forEach(e=>{r+=String.fromCharCode(e)}),btoa(r)}let L=o(null);n(()=>{if(f.value){L.value=null;return}let e=g.value.trim();if(!E.value||!e){L.value=null;return}L.value=I(e)});let{copy:R,copied:z}=ie(),B=y(()=>f.value?g.value.trim().length>0:g.value.trim().length>0&&s.node!==null),ee=()=>{if(!B.value)return;let e=E.value?`#${g.value.trim()}`:g.value.trim();if(f.value)d(`add`,{name:e,floodPolicy:w.value,parentId:s.selectedParentId}),g.value=``,w.value=`allow`,T.value=`region`;else{let t=E.value&&F.value?L.value??I(g.value.trim()):void 0;d(`save`,{id:s.node.id,name:e,floodPolicy:w.value,transportKey:t}),d(`close`)}},V=()=>{f.value&&(g.value=``,w.value=`allow`,T.value=`region`),d(`close`)};return(n,r)=>(a(),u(m,{to:`body`},[e.show?(a(),C(`div`,{key:0,class:`modal-backdrop`,onClick:A(V,[`self`])},[S(`div`,{class:p([`modal-card`,f.value?`max-w-md`:`max-w-lg`])},[S(`div`,ia,[S(`div`,null,[S(`h3`,aa,l(f.value?`Add New Entry`:`Edit Entry`),1),f.value?_(``,!0):(a(),C(`p`,oa,[r[6]||=b(` Modify `,-1),S(`span`,sa,l(N.value),1)]))]),S(`button`,{onClick:V,class:`text-content-muted hover:text-content-primary transition-colors`},[...r[7]||=[S(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),M.value.length>0?(a(),C(`div`,ca,[S(`span`,null,l(f.value?`Adding under:`:`Parent:`),1),(a(!0),C(x,null,t(M.value,(e,t)=>(a(),C(`span`,{key:e.id},[r[8]||=S(`span`,{class:`text-content-muted`},` / `,-1),S(`span`,{class:p(t===M.value.length-1?`text-primary font-mono`:`font-mono`)},l(e.name),3)]))),128))])):f.value?(a(),C(`div`,la,` Adding at root level `)):_(``,!0),S(`form`,{onSubmit:A(ee,[`prevent`]),class:`modal-form`},[S(`div`,ua,[r[9]||=S(`label`,{class:`modal-field-label`},`Entry Type`,-1),S(`div`,da,[S(`button`,{type:`button`,onClick:r[0]||=e=>T.value=`region`,class:p([`flex-1 px-3 py-1.5 text-xs font-medium rounded transition-colors`,T.value===`region`?`bg-secondary/opacity-medium text-secondary border border-secondary/opacity-heavy`:`text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-secondary`])},`REGION`,2),S(`button`,{type:`button`,onClick:r[1]||=e=>T.value=`privateKey`,class:p([`flex-1 px-3 py-1.5 text-xs font-medium rounded transition-colors`,T.value===`privateKey`?`bg-accent-green/opacity-medium text-accent-green border border-accent-green/opacity-heavy`:`text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-secondary`])},`PRIVATE KEY`,2)])]),S(`div`,null,[S(`label`,fa,l(D.value.type)+` Name`,1),S(`div`,pa,[E.value?(a(),C(`span`,ma,`#`)):_(``,!0),i(S(`input`,{"onUpdate:modelValue":r[2]||=e=>g.value=e,type:`text`,placeholder:E.value?`e.g., uk, au, us`:`Enter key name`,class:p([`modal-input`,E.value?`rounded-l-none`:``]),autocomplete:`off`},null,10,ha),[[j,g.value]])]),E.value?(a(),C(`p`,ga,` The # prefix is added automatically for regions. `)):_(``,!0),!f.value&&E.value&&e.node?.transport_key?(a(),C(`div`,_a,[S(`div`,va,[r[11]||=S(`span`,{class:`modal-field-label mb-0 mt-0`},`Transport Key`,-1),F.value?_(``,!0):(a(),C(`button`,{key:0,type:`button`,onClick:r[3]||=t=>c(R)(e.node.transport_key||``),class:p([`text-xs flex items-center gap-1 transition-colors`,c(z)?`text-accent-green`:`text-content-muted hover:text-accent-green`])},[r[10]||=S(`svg`,{class:`w-3 h-3`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z`})],-1),v(J,{copied:c(z)},null,8,[`copied`])],2))]),S(`input`,{value:L.value??e.node.transport_key,readonly:``,class:`modal-input-readonly w-full text-xs`},null,8,ya),F.value?(a(),C(`p`,ba,` Updated for "`+l(N.value)+`" `,1)):_(``,!0)])):_(``,!0)]),!f.value&&e.node?.last_used?(a(),C(`div`,xa,[S(`div`,Sa,[r[12]||=S(`div`,{class:`flex items-center gap-2`},[S(`svg`,{class:`w-4 h-4 text-primary`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z`})]),S(`span`,{class:`text-sm font-medium text-content-primary`},`Last Used`)],-1),S(`div`,Ca,[S(`div`,wa,l(e.node.last_used.toLocaleDateString())+` at `+l(e.node.last_used.toLocaleTimeString()),1),S(`div`,Ta,l(c(Y)(e.node.last_used)),1)])])])):_(``,!0),S(`div`,Ea,[r[13]||=S(`label`,{class:`modal-field-label pt-4`},`Flood Policy`,-1),S(`div`,Da,[S(`button`,{type:`button`,onClick:r[4]||=e=>w.value=`allow`,class:p([`flex-1 px-3 py-1.5 text-xs font-medium rounded transition-colors`,w.value===`allow`?`bg-accent-green/opacity-light text-accent-green border border-accent-green/opacity-medium`:`text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-secondary`])},`ALLOW`,2),S(`button`,{type:`button`,onClick:r[5]||=e=>w.value=`deny`,class:p([`flex-1 px-3 py-1.5 text-xs font-medium rounded transition-colors`,w.value===`deny`?`bg-accent-red/opacity-light text-accent-red border border-accent-red/opacity-medium`:`text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-secondary`])},`DENY`,2)])]),S(`div`,Oa,[S(`button`,{type:`button`,class:`modal-btn-cancel`,onClick:V},`Cancel`),S(`button`,{type:`submit`,disabled:!B.value,class:p([`flex-1 px-4 py-3 rounded-lg transition-colors font-medium`,B.value?`bg-accent-green/opacity-medium hover:bg-accent-green/opacity-medium border border-accent-green/opacity-heavy text-accent-green`:`bg-background-mute dark:bg-stroke/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-medium text-content-muted cursor-not-allowed`])},l(f.value?`Add ${D.value.type}`:`Done`),11,ka)])],32)],2)])):_(``,!0)]))}}),ja={class:`modal-card max-w-lg`},Ma={class:`flex items-center gap-3 mb-6`},Na={class:`text-content-secondary dark:text-content-muted text-sm mt-1`},Pa={class:`text-accent-red font-mono`},Fa={key:0,class:`bg-accent-red/opacity-light border border-accent-red/opacity-medium rounded-lg p-4 mb-6`},Ia={class:`flex items-start gap-3`},La={class:`flex-1`},Ra={class:`text-accent-red font-medium text-sm mb-2`},za={class:`space-y-1 max-h-32 overflow-y-auto`},Ba={key:0,class:`w-3 h-3 text-secondary`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Va={key:1,class:`w-3 h-3 text-accent-green`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Ha={class:`font-mono`},Ua={key:0,class:`text-content-secondary dark:text-content-muted text-xs`},Wa={key:1,class:`mb-6`},Ga={class:`mb-3`},Ka={class:`relative`},qa={class:`space-y-2 max-h-40 overflow-y-auto border border-stroke-subtle dark:border-stroke/opacity-medium rounded-lg p-3 bg-background-mute dark:bg-white/opacity-subtle`},Ja={key:0,class:`text-center py-4 text-content-secondary dark:text-content-muted text-sm`},Ya={class:`relative`},Xa=[`value`],Za={class:`flex items-center gap-2 flex-1`},Qa={class:`text-content-primary font-mono text-sm`},$a={key:0,class:`ml-auto px-2 py-0.5 bg-background-mute dark:bg-stroke/opacity-subtle text-content-secondary dark:text-content-muted text-xs rounded-full`},eo={class:`flex gap-3`},to=f({__name:`DeleteConfirmModal`,props:{show:{type:Boolean},node:{},allNodes:{}},emits:[`close`,`delete-all`,`move-children`],setup(e,{emit:n}){let r=e,s=n,c=o(null),d=o(``),f=e=>{let t=[],n=e=>{for(let r of e.children)t.push(r),n(r)};return n(e),t},h=y(()=>r.node?f(r.node):[]),g=y(()=>{if(!r.node)return[];let e=new Set([r.node.id,...h.value.map(e=>e.id)]),t=n=>{let r=[];for(let i of n)i.name.startsWith(`#`)&&!e.has(i.id)&&r.push(i),i.children.length>0&&r.push(...t(i.children));return r};return t(r.allNodes)}),v=y(()=>{if(!d.value.trim())return g.value;let e=d.value.toLowerCase();return g.value.filter(t=>t.name.toLowerCase().includes(e))}),w=()=>{r.node&&(s(`delete-all`,r.node.id),E())},T=()=>{!r.node||!c.value||(s(`move-children`,{nodeId:r.node.id,targetParentId:c.value}),E())},E=()=>{c.value=null,d.value=``,s(`close`)};return(n,r)=>(a(),u(m,{to:`body`},[e.show&&e.node?(a(),C(`div`,{key:0,onClick:r[2]||=A(e=>E(),[`self`]),class:`modal-backdrop-heavy`},[S(`div`,ja,[S(`div`,Ma,[r[6]||=S(`svg`,{class:`w-6 h-6 text-accent-red`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z`})],-1),S(`div`,null,[r[4]||=S(`h3`,{class:`text-xl font-semibold text-content-primary`},` Confirm Deletion `,-1),S(`p`,Na,[r[3]||=b(` Deleting `,-1),S(`span`,Pa,l(e.node?.name),1)])]),S(`button`,{onClick:E,class:`ml-auto text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary transition-colors`},[...r[5]||=[S(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),h.value.length>0?(a(),C(`div`,Fa,[S(`div`,Ia,[r[9]||=S(`svg`,{class:`w-5 h-5 text-accent-red flex-shrink-0 mt-0.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`})],-1),S(`div`,La,[S(`h4`,Ra,` This will affect `+l(h.value.length)+` child `+l(h.value.length===1?`entry`:`entries`)+`: `,1),S(`div`,za,[(a(!0),C(x,null,t(h.value.slice(0,10),e=>(a(),C(`div`,{key:e.id,class:`flex items-center gap-2 text-xs text-content-secondary dark:text-content-primary/opacity-heavy`},[e.name.startsWith(`#`)?(a(),C(`svg`,Ba,[...r[7]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M7 20l4-16m2 16l4-16M6 9h14M4 15h14`},null,-1)]])):(a(),C(`svg`,Va,[...r[8]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1721 9z`},null,-1)]])),S(`span`,Ha,l(e.name),1),S(`span`,{class:p([`px-1 py-0.5 text-xs rounded`,e.floodPolicy===`allow`?`bg-accent-green/opacity-medium text-accent-green`:`bg-accent-red/opacity-medium text-accent-red`])},l(e.floodPolicy),3)]))),128)),h.value.length>10?(a(),C(`div`,Ua,` ...and `+l(h.value.length-10)+` more `,1)):_(``,!0)])])])])):_(``,!0),h.value.length>0&&g.value.length>0?(a(),C(`div`,Wa,[r[13]||=S(`h4`,{class:`text-content-primary font-medium text-sm mb-3`},` Move children to another region: `,-1),S(`div`,Ga,[S(`div`,Ka,[r[10]||=S(`svg`,{class:`absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-content-muted`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z`})],-1),i(S(`input`,{"onUpdate:modelValue":r[0]||=e=>d.value=e,type:`text`,placeholder:`Search regions...`,class:`modal-input pl-9`},null,512),[[j,d.value]])])]),S(`div`,qa,[v.value.length===0?(a(),C(`div`,Ja,l(d.value?`No regions match your search`:`No available regions`),1)):_(``,!0),(a(!0),C(x,null,t(v.value,e=>(a(),C(`label`,{key:e.id,class:`flex items-center gap-3 p-2 rounded cursor-pointer hover:bg-stroke-subtle dark:hover:bg-white/opacity-light transition-colors group`},[S(`div`,Ya,[i(S(`input`,{type:`radio`,value:e.id,"onUpdate:modelValue":r[1]||=e=>c.value=e,class:`sr-only peer`},null,8,Xa),[[k,c.value]]),r[11]||=S(`div`,{class:`w-4 h-4 border-2 border-stroke dark:border-stroke/opacity-medium rounded-full group-hover:border-stroke dark:group-hover:border-stroke/opacity-heavy peer-checked:border-primary peer-checked:bg-primary/opacity-medium transition-all`},[S(`div`,{class:`w-2 h-2 rounded-full bg-primary scale-0 peer-checked:scale-100 transition-transform absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2`})],-1)]),S(`div`,Za,[r[12]||=S(`svg`,{class:`w-4 h-4 text-secondary`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M7 20l4-16m2 16l4-16M6 9h14M4 15h14`})],-1),S(`span`,Qa,l(e.name),1),e.children.length>0?(a(),C(`span`,$a,l(e.children.length),1)):_(``,!0)])]))),128))])])):_(``,!0),S(`div`,eo,[S(`button`,{onClick:E,class:`flex-1 px-4 py-3 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light border border-stroke-subtle dark:border-stroke/opacity-medium text-content-primary rounded-lg transition-colors`},` Cancel `),h.value.length>0&&c.value?(a(),C(`button`,{key:0,onClick:T,class:`modal-btn-primary`},` Move & Delete `)):_(``,!0),S(`button`,{onClick:w,class:`modal-btn-danger`},l(h.value.length>0?`Delete All`:`Delete`),1)])])])):_(``,!0)]))}}),no={class:`space-y-12`},ro={class:`cfg-page-heading flex flex-col sm:flex-row sm:justify-between sm:items-start gap-3`},io={class:`flex items-center gap-2 flex-shrink-0`},ao=[`disabled`],oo=[`disabled`],so=[`disabled`],co={key:0,class:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium border border-accent-red/opacity-heavy rounded-lg p-3`},lo={class:`text-accent-red text-sm`},uo={class:`cfg-section`},fo={class:`flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3`},po={key:0,class:`text-xs text-content-muted pb-1`},mo={key:1,class:`flex items-center justify-center py-8`},ho={key:2,class:`text-center py-8`},go={class:`text-content-secondary dark:text-content-muted text-sm`},_o={key:3,class:`text-center py-8`},vo={key:4,class:`space-y-2`},yo=f({name:`TransportKeys`,__name:`TransportKeys`,setup(n,{expose:r}){let i=hi(),s=ee(),d=o(!1),f=o(!1),m=o(null),g=-1;function w(){return g--}let T=o(`deny`),E=`deny`;h(y(()=>s.stats?.config?.mesh?.unscoped_flood_allow??null),e=>{e!==null&&!d.value&&(T.value=e?`allow`:`deny`)},{immediate:!0});let D=o([]),O=null,k=o(!1),A=o(null),j=o(!1),M=o(!1),N=o(!1),P=o(null),F=o(null);function I(e){return e.map(e=>({...e,children:I(e.children)}))}function L(e,t){let n=[];for(let r of e)n.push({node:r,parentId:t}),n.push(...L(r.children,r.id));return n}function z(e,t){for(let n of e){if(n.id===t)return n;let e=z(n.children,t);if(e)return e}return null}function B(e,t){let n=e.findIndex(e=>e.id===t);if(n!==-1)return e.splice(n,1),!0;for(let n of e)if(B(n.children,t))return!0;return!1}let V=e=>{let t=new Map,n=[];return e.forEach(e=>{t.set(e.id,{id:e.id,name:e.name,floodPolicy:e.flood_policy,transport_key:e.transport_key,last_used:e.last_used?new Date(e.last_used*1e3):void 0,parent_id:e.parent_id,children:[]})}),t.forEach(e=>{e.parent_id&&t.has(e.parent_id)?t.get(e.parent_id).children.push(e):n.push(e)}),n},H=async()=>{k.value=!0,A.value=null;try{let e=await R.getTransportKeys();e.success&&e.data?D.value=V(e.data):A.value=e.error||`Failed to load regions`}catch(e){A.value=e instanceof Error?e.message:`Unknown error occurred`}finally{k.value=!1}};e(H);function U(){O=I(D.value),E=T.value,d.value=!0,m.value=null}function G(){O&&(D.value=I(O)),T.value=E,O=null,d.value=!1,m.value=null,i.setSelectedNode(null)}async function K(){f.value=!0,m.value=null;try{let e=L(D.value),t=O?L(O):[],n=new Map(t.map(({node:e})=>[e.id,e])),r=e.filter(({node:e})=>e.id>0),a=e.filter(({node:e})=>e.id<0),o=new Set(r.map(({node:e})=>e.id));for(let{node:e}of t)o.has(e.id)||await R.deleteTransportKey(e.id);let c=new Map,l=[...a],u=l.length*2;for(;l.length&&u-- >0;){let e=l.findIndex(({parentId:e})=>e===void 0||e>0||e<0&&c.has(e));if(e===-1)break;let{node:t,parentId:n}=l.splice(e,1)[0],r=n===void 0?void 0:n>0?n:c.get(n),i=await R.createTransportKey(t.name,t.floodPolicy,t.transport_key,r);i.success&&i.data?.id&&c.set(t.id,i.data.id)}for(let{node:e}of r){let t=n.get(e.id);t&&(e.name!==t.name||e.floodPolicy!==t.floodPolicy||e.transport_key!==t.transport_key)&&await R.updateTransportKey(e.id,e.name,e.floodPolicy,e.transport_key)}T.value!==E&&await R.updateUnscopedFloodPolicy(T.value===`allow`),await H(),await s.fetchStats(),O=null,d.value=!1,i.setSelectedNode(null)}catch(e){m.value=e instanceof Error?e.message:`Save failed`}finally{f.value=!1}}function te(e){i.setSelectedNode(e)}function q(){j.value=!0}function ne(e){let t={id:w(),name:e.name,floodPolicy:e.floodPolicy,children:[]};if(e.parentId){let n=z(D.value,e.parentId);n?n.children.push(t):D.value.push(t)}else D.value.push(t);j.value=!1}function re(e){let t=z(D.value,e);t&&(P.value=t,M.value=!0)}function ie(e){let t=z(D.value,e.id);t&&(t.name=e.name,t.floodPolicy=e.floodPolicy,e.transportKey!==void 0&&(t.transport_key=e.transportKey)),M.value=!1,P.value=null}function J(){M.value=!1,P.value=null}function Y(e){let t=z(D.value,e);t&&(F.value=t,N.value=!0)}function X(e){B(D.value,e),i.setSelectedNode(null),N.value=!1,F.value=null}function Z(e){let t=z(D.value,e.nodeId);if(t?.children.length){let n=z(D.value,e.targetParentId);n?n.children.push(...t.children):D.value.push(...t.children)}B(D.value,e.nodeId),i.setSelectedNode(null),N.value=!1,F.value=null}function Q(e){T.value=e}let{showUnsavedModal:ae,requestLeave:oe,handleDiscard:se,handleSave:$,handleCancel:ce}=pe(d,f,G,async()=>(await K(),!d.value));return r({requestLeave:oe,isEditing:d}),(e,n)=>(a(),C(x,null,[v(fe,{show:c(ae),"is-saving":f.value,label:`Region Configuration`,onDiscard:c(se),onSave:c($),onCancel:c(ce)},null,8,[`show`,`is-saving`,`onDiscard`,`onSave`,`onCancel`]),S(`div`,no,[S(`div`,ro,[n[6]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},` Region Configuration `),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},` Manage regional key hierarchy `)],-1),S(`div`,io,[d.value?(a(),C(`button`,{key:0,onClick:q,class:`cfg-btn-secondary flex items-center gap-1.5`,disabled:f.value},[...n[5]||=[S(`svg`,{class:`w-3.5 h-3.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 4v16m8-8H4`})],-1),b(` Add Region `,-1)]],8,ao)):_(``,!0),d.value?(a(),C(x,{key:2},[S(`button`,{onClick:G,disabled:f.value,class:`cfg-btn-secondary`},`Cancel`,8,oo),S(`button`,{onClick:K,disabled:f.value,class:`cfg-btn-primary`},l(f.value?`Saving…`:`Save Changes`),9,so)],64)):(a(),C(`button`,{key:1,onClick:U,class:`cfg-btn-primary`},`Edit Settings`))])]),m.value?(a(),C(`div`,co,[S(`p`,lo,l(m.value),1)])):_(``,!0),S(`div`,uo,[S(`div`,fo,[n[7]||=S(`div`,null,[S(`h4`,{class:`text-xs sm:text-sm font-medium text-content-primary mb-1`},` Unscoped Flood Policy (*) `),S(`p`,{class:`text-content-secondary dark:text-content-muted text-[10px] sm:text-xs`},` Allow or Deny unscoped flood packets `)],-1),S(`div`,{class:p([`flex bg-background-mute dark:bg-stroke/opacity-subtle rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium p-0.5 sm:p-1`,d.value?``:`opacity-50 pointer-events-none`])},[S(`button`,{onClick:n[0]||=e=>Q(`deny`),class:p([`px-2 sm:px-3 py-1 text-[10px] sm:text-xs font-medium rounded transition-colors`,T.value===`deny`?`bg-accent-red/opacity-medium text-accent-red border border-accent-red/opacity-heavy`:`text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-secondary`])},` DENY `,2),S(`button`,{onClick:n[1]||=e=>Q(`allow`),class:p([`px-2 sm:px-3 py-1 text-[10px] sm:text-xs font-medium rounded transition-colors`,T.value===`allow`?`bg-accent-green/opacity-medium text-accent-green border border-accent-green/opacity-heavy`:`text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-secondary`])},` ALLOW `,2)],2)])]),S(`div`,{class:`cfg-section space-y-4`,onClick:n[2]||=e=>d.value&&c(i).setSelectedNode(null)},[n[11]||=S(`h3`,{class:`text-lg font-semibold text-content-primary`},`Regions`,-1),d.value?(a(),C(`p`,po,` To add a child region, click on a region to select it, then click "Add Region". `)):_(``,!0),k.value?(a(),C(`div`,mo,[v(W),n[8]||=S(`span`,{class:`ml-2 text-content-secondary dark:text-content-muted`},`Loading regions…`,-1)])):A.value?(a(),C(`div`,ho,[n[9]||=S(`div`,{class:`text-accent-red mb-2`},`⚠️ Error loading regions`,-1),S(`div`,go,l(A.value),1),S(`button`,{onClick:H,class:`btn-success mt-4`},` Retry `)])):D.value.length===0?(a(),C(`div`,_o,[...n[10]||=[S(`div`,{class:`text-content-muted mb-2`},`No regions found`,-1),S(`div`,{class:`text-content-muted/opacity-heavy text-sm`},` Click "Edit Settings" then "Add Region" to get started `,-1)]])):(a(),C(`div`,vo,[(a(!0),C(x,null,t(D.value,e=>(a(),u(Pi,{key:e.id,node:e,"selected-node-id":c(i).selectedNodeId.value,level:0,unlocked:d.value,onSelect:te,onEdit:re,onDelete:Y},null,8,[`node`,`selected-node-id`,`unlocked`]))),128))]))]),v(Aa,{show:j.value,node:null,"selected-parent-id":c(i).selectedNodeId.value||void 0,"all-nodes":D.value,onClose:n[3]||=e=>j.value=!1,onAdd:ne},null,8,[`show`,`selected-parent-id`,`all-nodes`]),v(Aa,{show:M.value,node:P.value,"all-nodes":D.value,onClose:J,onSave:ie},null,8,[`show`,`node`,`all-nodes`]),v(to,{show:N.value,node:F.value,"all-nodes":D.value,onClose:n[4]||=e=>{N.value=!1,F.value=null},onDeleteAll:X,onMoveChildren:Z},null,8,[`show`,`node`,`all-nodes`])])],64))}}),bo={class:`space-y-12`},xo={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3`},So={key:0,class:`bg-accent-red/opacity-light border border-accent-red/opacity-medium rounded-lg p-4`},Co={class:`flex items-center gap-2 text-accent-red`},wo={key:1,class:`flex items-center justify-center py-12`},To={class:`text-center`},Eo={key:2,class:`space-y-3`},Do={class:`flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3`},Oo={class:`flex-1`},ko={class:`flex items-center gap-2 sm:gap-3`},Ao={class:`min-w-0 flex-1`},jo={class:`text-content-primary font-medium text-sm sm:text-base break-all`},Mo={class:`flex flex-col sm:flex-row sm:items-center sm:gap-4 mt-1 text-xs text-content-secondary dark:text-content-muted`},No={class:`truncate`},Po={class:`truncate`},Fo=[`onClick`,`disabled`],Io={key:3,class:`text-center py-12`},Lo={class:`bg-surface dark:bg-surface-elevated border border-stroke-subtle dark:border-stroke/opacity-medium rounded-[15px] p-6 max-w-md w-full shadow-2xl`},Ro={class:`space-y-4`},zo={class:`flex justify-end gap-3 mt-6`},Bo=[`disabled`],Vo=[`disabled`],Ho={class:`bg-surface dark:bg-surface-elevated border border-stroke-subtle dark:border-stroke/opacity-medium rounded-[15px] p-6 max-w-lg w-full shadow-2xl`},Uo={class:`space-y-4`},Wo={class:`flex gap-2`},Go=[`value`],Ko={key:0,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},qo={key:1,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Jo={class:`cfg-card p-4`},Yo={class:`code-block`},Xo=f({name:`APITokens`,__name:`APITokens`,setup(n){let r=o([]),s=o(!1),u=o(null),f=o(!1),m=o(``),h=o(null),g=o(!1),w=o(!1),T=o(null),E=async()=>{s.value=!0,u.value=null;try{let e=await R.get(`/auth/tokens`);r.value=(e.data||e).tokens||[]}catch(e){console.error(`Failed to fetch API tokens:`,e),u.value=e instanceof Error?e.message:`Failed to fetch tokens`}finally{s.value=!1}},D=async()=>{if(!m.value.trim()){u.value=`Token name is required`;return}s.value=!0,u.value=null;try{let e=await R.post(`/auth/tokens`,{name:m.value.trim()});h.value=(e.data||e).token||null,f.value=!1,g.value=!0,m.value=``,await E()}catch(e){console.error(`Failed to create API token:`,e),u.value=e instanceof Error?e.message:`Failed to create token`}finally{s.value=!1}},k=(e,t)=>{T.value={id:e,name:t},w.value=!0},M=async()=>{if(T.value){s.value=!0,u.value=null;try{await R.delete(`/auth/tokens/${T.value.id}`),await E(),w.value=!1,T.value=null}catch(e){console.error(`Failed to revoke API token:`,e),u.value=e instanceof Error?e.message:`Failed to revoke token`}finally{s.value=!1}}},N=()=>{f.value=!1,m.value=``,u.value=null},P=()=>{g.value=!1,h.value=null},{copy:F,copied:I}=ie(),L=()=>{h.value&&F(h.value)},z=e=>e?new Date(e*1e3).toLocaleString():`Never`,B=y(()=>`${window.location.origin}/api/stats`);return e(()=>{E()}),(e,n)=>(a(),C(x,null,[S(`div`,bo,[S(`div`,xo,[n[5]||=S(`div`,null,[S(`h2`,{class:`text-lg sm:text-xl font-semibold text-content-primary`},` API Tokens `),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm mt-1`},` Manage API tokens for machine-to-machine authentication `)],-1),S(`button`,{onClick:n[0]||=e=>f.value=!0,class:`cfg-btn-primary flex items-center justify-center gap-2`},[...n[4]||=[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 4v16m8-8H4`})],-1),b(` Create Token `,-1)]])]),n[21]||=d(`

API tokens are used for machine-to-machine authentication. Include the token in the X-API-Key header when making API requests.

Tokens are only shown once at creation. Store them securely.

`,1),u.value?(a(),C(`div`,So,[S(`div`,Co,[n[6]||=S(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`})],-1),b(` `+l(u.value),1)])])):_(``,!0),s.value&&r.value.length===0?(a(),C(`div`,wo,[S(`div`,To,[v(W,{class:`mx-auto mb-4`}),n[7]||=S(`div`,{class:`text-content-secondary dark:text-content-muted`},`Loading tokens...`,-1)])])):r.value.length>0?(a(),C(`div`,Eo,[(a(!0),C(x,null,t(r.value,e=>(a(),C(`div`,{key:e.id,class:`bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light rounded-lg p-3 sm:p-4 hover:bg-stroke-subtle dark:hover:bg-white/opacity-light transition-colors`},[S(`div`,Do,[S(`div`,Oo,[S(`div`,ko,[n[8]||=S(`svg`,{class:`w-4 h-4 sm:w-5 sm:h-5 text-primary flex-shrink-0`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z`})],-1),S(`div`,Ao,[S(`h3`,jo,l(e.name),1),S(`div`,Mo,[S(`span`,No,`Created: `+l(z(e.created_at)),1),S(`span`,Po,`Last used: `+l(z(e.last_used)),1)])])])]),S(`button`,{onClick:t=>k(e.id,e.name),disabled:s.value,class:`w-full sm:w-auto px-3 py-1.5 bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium hover:bg-accent-red/opacity-medium text-accent-red rounded-lg border border-accent-red/opacity-heavy transition-colors disabled:opacity-50 text-sm`},` Revoke `,8,Fo)])]))),128))])):(a(),C(`div`,Io,[n[9]||=S(`svg`,{class:`w-16 h-16 text-content-muted/opacity-heavy mx-auto mb-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z`})],-1),n[10]||=S(`h3`,{class:`text-content-primary font-medium mb-2`},`No API Tokens`,-1),n[11]||=S(`p`,{class:`text-content-secondary dark:text-content-muted text-sm mb-4`},` Create a token to enable API access `,-1),S(`button`,{onClick:n[1]||=e=>f.value=!0,class:`cfg-btn-primary`},` Create Your First Token `)])),f.value?(a(),C(`div`,{key:4,class:`modal-backdrop`,onClick:A(N,[`self`])},[S(`div`,Lo,[n[14]||=S(`h3`,{class:`text-xl font-semibold text-content-primary mb-4`},` Create API Token `,-1),S(`div`,Ro,[S(`div`,null,[n[12]||=S(`label`,{class:`block text-sm font-medium text-content-secondary dark:text-content-muted mb-2`},`Token Name`,-1),i(S(`input`,{"onUpdate:modelValue":n[2]||=e=>m.value=e,type:`text`,placeholder:`e.g., Production Server, CI/CD Pipeline`,class:`cfg-input placeholder-content-muted dark:placeholder-content-muted`,onKeydown:O(D,[`enter`])},null,544),[[j,m.value]]),n[13]||=S(`p`,{class:`text-xs text-content-muted mt-1`},` Give your token a descriptive name to identify its purpose `,-1)]),S(`div`,zo,[S(`button`,{onClick:N,disabled:s.value,class:`px-4 py-2 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light text-content-primary rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light transition-colors disabled:opacity-50`},` Cancel `,8,Bo),S(`button`,{onClick:D,disabled:s.value||!m.value.trim(),class:`btn-primary`},l(s.value?`Creating...`:`Create Token`),9,Vo)])])])])):_(``,!0),g.value&&h.value?(a(),C(`div`,{key:5,class:`modal-backdrop`,onClick:A(P,[`self`])},[S(`div`,Ho,[n[20]||=S(`h3`,{class:`text-xl font-semibold text-content-primary mb-4`},` Token Created Successfully `,-1),S(`div`,Uo,[n[19]||=d(`
Save this token now! For security reasons, it will not be shown again.
`,1),S(`div`,null,[n[17]||=S(`label`,{class:`block text-sm font-medium text-content-secondary dark:text-content-muted mb-2`},`Your API Token`,-1),S(`div`,Wo,[S(`input`,{value:h.value,readonly:``,class:`modal-input-readonly flex-1 text-sm`},null,8,Go),S(`button`,{onClick:L,class:p([`flex items-center gap-2 transition-colors`,c(I)?`btn-success`:`btn-primary`])},[c(I)?(a(),C(`svg`,qo,[...n[16]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 13l4 4L19 7`},null,-1)]])):(a(),C(`svg`,Ko,[...n[15]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z`},null,-1)]])),v(J,{copied:c(I)},null,8,[`copied`])],2)])]),S(`div`,Jo,[n[18]||=S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted mb-2`},[S(`strong`,null,`Usage Example:`)],-1),S(`code`,Yo,` curl -H "X-API-Key: `+l(h.value)+`" `+l(B.value),1)]),S(`div`,{class:`flex justify-end mt-6`},[S(`button`,{onClick:P,class:`btn-primary`},` Done `)])])])])):_(``,!0)]),v(ne,{show:w.value,title:`Revoke API Token`,message:`Are you sure you want to revoke the token '${T.value?.name}'? This action cannot be undone.`,"confirm-text":`Revoke`,"cancel-text":`Cancel`,variant:`danger`,onConfirm:M,onClose:n[3]||=e=>w.value=!1},null,8,[`show`,`message`])],64))}}),Zo={class:`space-y-12`},Qo={class:`cfg-section`},$o={class:`space-y-4`},es=[`disabled`],ts={class:`cfg-section`},ns={class:`space-y-4`},rs={class:`flex items-center justify-between`},is=[`disabled`],as={class:`cfg-section`},os={class:`space-y-4`},ss={class:`space-y-3`},cs=[`checked`,`disabled`],ls=[`checked`,`disabled`],us={class:`flex items-start gap-3`},ds={key:0,class:`w-5 h-5 text-accent-green flex-shrink-0 mt-0.5`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`},fs={key:1,class:`w-5 h-5 text-accent-cyan flex-shrink-0 mt-0.5`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`},ps={class:`flex-1`},ms={class:`text-sm font-medium text-content-primary`},hs={key:0,class:`text-xs text-accent-green mt-1`},gs={key:1,class:`p-4 bg-accent-amber/opacity-light border border-accent-amber/opacity-medium rounded-lg`},_s={class:`flex items-start justify-between gap-3`},vs=[`disabled`],ys={key:1,class:`w-4 h-4`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`},bs={class:`flex items-center space-x-2`},xs={key:0,class:`w-5 h-5 text-accent-green`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`},Ss={key:1,class:`w-5 h-5 text-accent-red`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`},Cs=f({name:`WebSettings`,__name:`WebSettings`,setup(t){let{stats:n}=B(ee()),r=o(!1),c=o(``),f=o(!1),m=o(!1),h=o(!1),g=o(!1),v=o(!0),w=s({cors_enabled:!1,use_default_frontend:!0,site_name:``}),T=y(()=>f.value?`bg-accent-green/opacity-light border-accent-green/opacity-medium`:`bg-accent-red/opacity-light border-accent-red/opacity-medium`);async function E(){try{v.value=!0;let e=await R.get(`/check_pymc_console`);e.success&&e.data&&(g.value=e.data.exists)}catch(e){console.error(`Failed to check openHop Console:`,e),g.value=!1}finally{v.value=!1}}function D(){let e=n.value?.config?.web||{};w.cors_enabled=e.cors_enabled===!0;let t=e.web_path;w.use_default_frontend=!t||t===``,w.site_name=typeof n.value?.site_name==`string`?n.value.site_name:``}async function O(){r.value=!0,c.value=``;try{let e={web:{cors_enabled:w.cors_enabled,site_name:w.site_name.trim()}};w.use_default_frontend?e.web.web_path=null:e.web.web_path=`/opt/pymc_console/web/html`;let t=await R.post(`/update_web_config`,e);t.success?(N(`Settings saved successfully`,!0),m.value=!0):N(t.error||`Failed to save settings`,!1)}catch(e){console.error(`Failed to save web settings:`,e),N(e.message||`Failed to save settings`,!1)}finally{r.value=!1}}async function k(){w.cors_enabled=!w.cors_enabled,await O()}async function A(){w.use_default_frontend=!0,await O()}async function M(){if(!g.value){N(`openHop Console is not installed. Please install it before switching.`,!1);return}w.use_default_frontend=!1,await O()}function N(e,t){c.value=e,f.value=t,setTimeout(()=>{c.value=``},5e3)}async function P(){h.value=!0,c.value=``;try{let e=await R.post(`/restart_service`,{});e.success?(N(`Service restart initiated. Page will reload...`,!0),m.value=!1,setTimeout(()=>{window.location.reload()},2e3)):N(e.error||`Failed to restart service`,!1)}catch(e){e.code===`ERR_NETWORK`||e.message?.includes(`Network error`)?(N(`Service restarting... Page will reload`,!0),m.value=!1,setTimeout(()=>{window.location.reload()},3e3)):(console.error(`Failed to restart service:`,e),N(e.message||`Failed to restart service`,!1))}finally{h.value=!1}}return e(()=>{D(),E()}),(e,t)=>(a(),C(`div`,Zo,[t[17]||=S(`div`,{class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},[S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`Web Options`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Configure site identification, CORS policy and web frontend selection`)])],-1),S(`div`,Qo,[t[3]||=S(`div`,{class:`flex items-start justify-between mb-4`},[S(`div`,null,[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},` Site Identification `),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},` Customise the browser tab title and login page caption `)])],-1),S(`div`,$o,[S(`div`,null,[t[1]||=S(`label`,{for:`site-name`,class:`block text-sm font-medium text-content-primary mb-2`},` Site Name `,-1),i(S(`input`,{id:`site-name`,"onUpdate:modelValue":t[0]||=e=>w.site_name=e,type:`text`,maxlength:`80`,placeholder:`e.g. Base Station Alpha`,class:`w-full px-3 py-2 rounded-lg bg-background-mute dark:bg-background/40 border border-stroke-subtle dark:border-stroke/opacity-medium text-sm text-content-primary placeholder-content-muted dark:placeholder-content-muted focus:outline-none focus:border-primary/opacity-heavy transition-colors`,onChange:O,disabled:r.value},null,40,es),[[j,w.site_name]]),t[2]||=S(`p`,{class:`text-xs text-content-secondary dark:text-content-muted mt-1.5`},` Shown in the browser tab and above the login form. Leave blank to use the default title. `,-1)])])]),S(`div`,ts,[t[5]||=S(`div`,{class:`flex items-start justify-between mb-4`},[S(`div`,null,[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},` CORS Settings `),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},` Control cross-origin resource sharing for API access `)])],-1),S(`div`,ns,[S(`div`,rs,[t[4]||=S(`div`,null,[S(`label`,{class:`text-sm font-medium text-content-primary`},`Enable CORS`),S(`p`,{class:`text-xs text-content-secondary dark:text-content-muted mt-1`},` Allow web frontends from different origins to access the API `)],-1),S(`button`,{onClick:k,disabled:r.value,class:p([`relative inline-flex h-6 w-11 items-center rounded-full transition-colors border-2`,w.cors_enabled?`bg-accent-cyan border-accent-cyan`:`bg-background-mute border-background-mute`,r.value?`opacity-50 cursor-not-allowed`:`cursor-pointer`])},[S(`span`,{class:p([`inline-block h-4 w-4 transform rounded-full bg-white transition-transform shadow-lg`,w.cors_enabled?`translate-x-5`:`translate-x-0.5`])},null,2)],10,is)])])]),S(`div`,as,[t[14]||=S(`div`,{class:`flex items-start justify-between mb-4`},[S(`div`,null,[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},` Web Frontend `),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},` Choose which web interface to use `)])],-1),S(`div`,os,[S(`div`,ss,[S(`label`,{class:p([`flex items-start space-x-3 p-4 bg-background-mute dark:bg-background/30 rounded-lg border-2 cursor-pointer transition-all`,w.use_default_frontend?`border-accent-cyan bg-accent-cyan/opacity-light`:`border-stroke-subtle dark:border-stroke/opacity-light hover:border-accent-cyan/opacity-heavy dark:hover:border-accent-cyan/opacity-heavy`])},[S(`input`,{type:`radio`,name:`frontend`,checked:w.use_default_frontend,onChange:A,disabled:r.value,class:`mt-1 h-4 w-4 text-accent-cyan focus:ring-accent-cyan focus:ring-offset-background`},null,40,cs),t[6]||=S(`div`,{class:`flex-1`},[S(`div`,{class:`text-sm font-medium text-content-primary`},` Default Frontend `),S(`div`,{class:`text-xs text-content-secondary dark:text-content-muted mt-1`},` Built-in Repeater web interface `),S(`div`,{class:`text-xs text-content-muted/opacity-heavy mt-1 font-mono`},` Built-in `)],-1)],2),S(`label`,{class:p([`flex items-start space-x-3 p-4 bg-background-mute dark:bg-background/30 rounded-lg border-2 transition-all`,g.value?`cursor-pointer`:`opacity-50 cursor-not-allowed`,w.use_default_frontend?`border-stroke-subtle dark:border-stroke/opacity-light hover:border-accent-cyan/opacity-heavy dark:hover:border-accent-cyan/opacity-heavy`:`border-accent-cyan bg-accent-cyan/opacity-light`])},[S(`input`,{type:`radio`,name:`frontend`,checked:!w.use_default_frontend,onChange:M,disabled:r.value||!g.value,class:`mt-1 h-4 w-4 text-accent-cyan focus:ring-accent-cyan focus:ring-offset-background`},null,40,ls),t[7]||=d(`
openHop Console
@Treehouse⚡
Alternative web interface for Repeater
/opt/pymc_console/web/html
`,1)],2)]),v.value?_(``,!0):(a(),C(`div`,{key:0,class:p([`p-4 rounded-lg border`,g.value?`bg-accent-green/opacity-light border-accent-green/opacity-medium`:`bg-accent-cyan/opacity-light border-accent-cyan/opacity-medium`])},[S(`div`,us,[g.value?(a(),C(`svg`,ds,[...t[8]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z`},null,-1)]])):(a(),C(`svg`,fs,[...t[9]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`},null,-1)]])),S(`div`,ps,[S(`h4`,ms,l(g.value?`openHop Console has been detected`:`openHop Console Not Installed`),1),g.value?(a(),C(`p`,hs,[...t[10]||=[b(` openHop Console is installed at `,-1),S(`code`,{class:`text-accent-green`},`/opt/pymc_console/web/html`,-1)]])):(a(),C(x,{key:1},[t[11]||=d(`

openHop Console must be installed at /opt/pymc_console/web/html before selecting this option.

openHop Console Install Instructions `,2)],64))])])],2)),m.value?(a(),C(`div`,gs,[S(`div`,_s,[t[13]||=d(`

Service restart required

Web frontend changes will take effect after restarting the openHop repeater service.

`,1),S(`button`,{onClick:P,disabled:h.value,class:`px-4 py-2 bg-accent-amber/opacity-medium hover:bg-accent-amber/opacity-medium disabled:opacity-50 text-accent-amber font-medium rounded-lg border border-accent-amber/opacity-heavy transition-colors disabled:cursor-not-allowed flex items-center gap-2 whitespace-nowrap`},[h.value?(a(),u(W,{key:0,size:`sm`,color:`current`})):(a(),C(`svg`,ys,[...t[12]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15`},null,-1)]])),b(` `+l(h.value?`Restarting...`:`Restart Now`),1)],8,vs)])])):_(``,!0)])]),c.value?(a(),C(`div`,{key:0,class:p([`p-4 rounded-lg border`,T.value])},[S(`div`,bs,[f.value?(a(),C(`svg`,xs,[...t[15]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 13l4 4L19 7`},null,-1)]])):(a(),C(`svg`,Ss,[...t[16]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`},null,-1)]])),S(`span`,{class:p(f.value?`text-accent-green`:`text-accent-red`)},l(c.value),3)])],2)):_(``,!0)]))}}),ws={ref:`rootEl`,class:`space-y-12`},Ts={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},Es={class:`flex items-center gap-2 flex-shrink-0`},Ds=[`disabled`],Os=[`disabled`],ks={key:0,class:`bg-accent-green/opacity-medium border border-accent-green/opacity-heavy rounded-lg p-3 text-accent-green text-sm`},As={key:1,class:`bg-accent-red/opacity-medium border border-accent-red/opacity-heavy rounded-lg p-3 text-accent-red text-sm`},js={class:`cfg-section space-y-3`},Ms={key:0,class:`flex items-center justify-center py-4`},Ns={key:1,class:`text-center py-4`},Ps={class:`grid grid-cols-2 sm:grid-cols-4 gap-3`},Fs={class:`text-center p-2 bg-white dark:bg-white/opacity-subtle rounded-lg border border-stroke-subtle dark:border-white/opacity-light`},Is={class:`text-center p-2 bg-white dark:bg-white/opacity-subtle rounded-lg border border-stroke-subtle dark:border-white/opacity-light`},Ls={class:`text-lg font-mono text-content-primary`},Rs={class:`text-center p-2 bg-white dark:bg-white/opacity-subtle rounded-lg border border-stroke-subtle dark:border-white/opacity-light`},zs={class:`text-lg font-mono text-accent-green`},Bs={class:`text-center p-2 bg-white dark:bg-white/opacity-subtle rounded-lg border border-stroke-subtle dark:border-white/opacity-light`},Vs={class:`text-lg font-mono text-accent-red`},Hs={key:0,class:`mt-2 p-2 bg-accent-red/opacity-light rounded-lg border border-accent-red/opacity-medium`},Us={key:1,class:`mt-2 p-2 bg-secondary/opacity-light rounded-lg border border-secondary/opacity-medium`},Ws={class:`font-medium`},Gs={class:`font-mono text-[10px] opacity-70`},Ks={class:`text-[10px]`},qs={class:`cfg-section space-y-3`},Js={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Ys={key:0,class:`text-content-primary font-mono text-sm`},Xs={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Zs={key:0,class:`text-content-primary font-mono text-sm`},Qs={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},$s={key:0,class:`text-content-primary font-mono text-sm`},ec={key:1,class:`flex items-center gap-2`},tc={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 gap-1`},nc={key:0,class:`text-content-primary font-mono text-sm`},rc={key:1,class:`flex items-center gap-2`},ic={class:`cfg-section space-y-3`},ac={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},oc={key:0,class:`text-content-primary font-mono text-sm`},sc={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},cc={key:0,class:`text-content-primary font-mono text-sm`},lc={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},uc={key:0,class:`text-content-primary font-mono text-sm`},dc={key:1,class:`flex items-center gap-2`},fc={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},pc={key:0,class:`text-content-primary font-mono text-sm`},mc={key:1,class:`flex items-center gap-2`},hc={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 gap-1`},gc={key:0,class:`text-content-primary font-mono text-sm`},_c={key:1,class:`flex items-center gap-2`},vc={class:`cfg-section space-y-3`},yc={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},bc={key:0,class:`text-content-primary font-mono text-sm`},xc={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Sc={key:0,class:`text-content-primary font-mono text-sm`},Cc={key:1,class:`flex items-center gap-2`},wc={class:`py-2`},Tc={class:`grid grid-cols-3 gap-2 mt-2`},Ec={class:`text-center p-2 bg-white dark:bg-white/opacity-subtle rounded-lg border border-stroke-subtle dark:border-white/opacity-light`},Dc={key:0,class:`font-mono text-sm text-content-primary`},Oc={class:`text-center p-2 bg-white dark:bg-white/opacity-subtle rounded-lg border border-stroke-subtle dark:border-white/opacity-light`},kc={key:0,class:`font-mono text-sm text-content-primary`},Ac={class:`text-center p-2 bg-white dark:bg-white/opacity-subtle rounded-lg border border-stroke-subtle dark:border-white/opacity-light`},jc={key:0,class:`font-mono text-sm text-content-primary`},Mc={class:`p-6 space-y-4`},Nc={class:`flex justify-between items-start`},Pc={class:`flex justify-end pt-4 border-t border-stroke-subtle dark:border-stroke/opacity-medium`},Fc=f({__name:`AdvertSettings`,setup(n,{expose:r}){let s=ee(),u=y(()=>s.stats?.config?.repeater||{}),f=y(()=>u.value.advert_rate_limit||{}),m=y(()=>u.value.advert_penalty_box||{}),g=y(()=>u.value.advert_adaptive||{}),w=y(()=>g.value.thresholds||{}),T=o(!1),O=o(!1),k=o(``),M=o(``),N=o(!1),P=o(!1),F=o(null),I=o(!0),L=o(2),z=o(1),B=o(10),V=o(60),H=o(!0),U=o(2),G=o(12),K=o(6),te=o(2),q=o(24),ne=o(!0),re=o(.1),ie=o(5),J=o(.05),Y=o(.2),X=o(.5),Z=async()=>{P.value=!0;try{let e=await R.get(`/advert_rate_limit_stats`);e.success&&(F.value=e.data)}catch(e){console.error(`Failed to fetch rate limit stats:`,e)}finally{P.value=!1}};h([f,m,g],()=>{T.value||(I.value=f.value.enabled??!1,L.value=f.value.bucket_capacity??2,z.value=f.value.refill_tokens??1,B.value=Math.round((f.value.refill_interval_seconds??36e3)/3600),V.value=Math.round((f.value.min_interval_seconds??0)/60),H.value=m.value.enabled??!1,U.value=m.value.violation_threshold??2,G.value=Math.round((m.value.violation_decay_seconds??43200)/3600),K.value=Math.round((m.value.base_penalty_seconds??21600)/3600),te.value=m.value.penalty_multiplier??2,q.value=Math.round((m.value.max_penalty_seconds??86400)/3600),ne.value=g.value.enabled??!1,re.value=g.value.ewma_alpha??.1,ie.value=Math.round((g.value.hysteresis_seconds??300)/60),J.value=w.value.quiet_max??.05,Y.value=w.value.normal_max??.2,X.value=w.value.busy_max??.5)},{immediate:!0}),e(()=>{Z()});let Q=()=>{I.value=f.value.enabled??!1,L.value=f.value.bucket_capacity??2,z.value=f.value.refill_tokens??1,B.value=Math.round((f.value.refill_interval_seconds??36e3)/3600),V.value=Math.round((f.value.min_interval_seconds??0)/60),H.value=m.value.enabled??!1,U.value=m.value.violation_threshold??2,G.value=Math.round((m.value.violation_decay_seconds??43200)/3600),K.value=Math.round((m.value.base_penalty_seconds??21600)/3600),te.value=m.value.penalty_multiplier??2,q.value=Math.round((m.value.max_penalty_seconds??86400)/3600),ne.value=g.value.enabled??!1,re.value=g.value.ewma_alpha??.1,ie.value=Math.round((g.value.hysteresis_seconds??300)/60),J.value=w.value.quiet_max??.05,Y.value=w.value.normal_max??.2,X.value=w.value.busy_max??.5},ae=()=>{T.value=!0,k.value=``,M.value=``},oe=()=>{T.value=!1,k.value=``,M.value=``,Q()},se=async()=>{O.value=!0,M.value=``,k.value=``;try{let e={rate_limit_enabled:I.value,bucket_capacity:L.value,refill_tokens:z.value,refill_interval_seconds:B.value*3600,min_interval_seconds:V.value*60,penalty_enabled:H.value,violation_threshold:U.value,violation_decay_seconds:G.value*3600,base_penalty_seconds:K.value*3600,penalty_multiplier:te.value,max_penalty_seconds:q.value*3600,adaptive_enabled:ne.value,ewma_alpha:re.value,hysteresis_seconds:ie.value*60,quiet_max:J.value,normal_max:Y.value,busy_max:X.value},t=await R.post(`/update_advert_rate_limit_config`,e),n=t.data;t.success?(k.value=n?.message||`Settings saved successfully`,await s.fetchStats(),await Z(),await E(),Q(),T.value=!1,setTimeout(()=>{k.value=``},3e3)):(M.value=n?.error||`Failed to save settings`,console.error(`[AdvertSettings] Save failed:`,n?.error))}catch(e){console.error(`Failed to save advert settings:`,e),M.value=e.response?.data?.error||`Failed to save settings`}finally{O.value=!1}},{showUnsavedModal:$,requestLeave:ce,handleDiscard:le,handleSave:ue,handleCancel:de}=pe(T,O,oe,async()=>(await se(),!T.value));r({requestLeave:ce,isEditing:T});let me=y(()=>F.value?.adaptive?.current_tier||`unknown`),he=y(()=>{switch(me.value){case`quiet`:return`bg-accent-green/opacity-medium text-accent-green border-accent-green/opacity-heavy`;case`normal`:return`bg-accent-cyan/opacity-medium text-accent-cyan border-accent-cyan/opacity-heavy`;case`busy`:return`bg-secondary/opacity-medium text-secondary border-secondary/opacity-heavy`;case`congested`:return`bg-accent-red/opacity-medium text-accent-red border-accent-red/opacity-heavy`;default:return`bg-background-mute text-content-muted border-stroke-subtle`}});return(e,n)=>(a(),C(x,null,[v(fe,{show:c($),"is-saving":O.value,label:`Advert Limit settings`,onDiscard:c(le),onSave:c(ue),onCancel:c(de)},null,8,[`show`,`is-saving`,`onDiscard`,`onSave`,`onCancel`]),S(`div`,ws,[S(`div`,Ts,[n[20]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`Advert Limits`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Configure advertisement rate limiting and adaptive controls`)],-1),S(`div`,Es,[S(`button`,{onClick:n[0]||=e=>N.value=!0,class:`self-stretch flex items-center justify-center px-3 text-xs bg-primary/opacity-light hover:bg-primary/opacity-medium text-primary rounded-lg border border-primary/opacity-medium transition-colors`,title:`How rate limiting works`},[...n[19]||=[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`})],-1)]]),T.value?(a(),C(x,{key:1},[S(`button`,{onClick:oe,disabled:O.value,class:`cfg-btn-secondary`},` Cancel `,8,Ds),S(`button`,{onClick:se,disabled:O.value,class:`cfg-btn-primary`},l(O.value?`Saving...`:`Save Changes`),9,Os)],64)):(a(),C(`button`,{key:0,onClick:ae,class:`cfg-btn-primary`},` Edit Settings `))])]),k.value?(a(),C(`div`,ks,l(k.value),1)):_(``,!0),M.value?(a(),C(`div`,As,l(M.value),1)):_(``,!0),S(`div`,js,[n[29]||=S(`h3`,{class:`text-lg font-semibold text-content-primary`},` Current Status `,-1),P.value&&!F.value?(a(),C(`div`,Ms,[v(W,{size:`sm`}),n[21]||=S(`span`,{class:`ml-2 text-sm text-content-muted`},`Loading stats...`,-1)])):F.value?(a(),C(x,{key:2},[S(`div`,Ps,[S(`div`,Fs,[n[23]||=S(`div`,{class:`text-xs text-content-muted`},`Mesh Tier`,-1),S(`div`,{class:p([`mt-1 px-2 py-0.5 rounded border text-xs font-medium inline-block`,he.value])},l(me.value.toUpperCase()),3)]),S(`div`,Is,[n[24]||=S(`div`,{class:`text-xs text-content-muted`},`Adverts/min`,-1),S(`div`,Ls,l(F.value.metrics?.adverts_per_min_ewma?.toFixed(2)||`0.00`),1)]),S(`div`,Rs,[n[25]||=S(`div`,{class:`text-xs text-content-muted`},`Allowed`,-1),S(`div`,zs,l(F.value.stats?.adverts_allowed||0),1)]),S(`div`,Bs,[n[26]||=S(`div`,{class:`text-xs text-content-muted`},`Dropped`,-1),S(`div`,Vs,l(F.value.stats?.adverts_dropped||0),1)])]),Object.keys(F.value.active_penalties||{}).length>0?(a(),C(`div`,Hs,[n[27]||=S(`div`,{class:`text-xs font-medium text-accent-red mb-1`},` Active Penalties `,-1),(a(!0),C(x,null,t(F.value.active_penalties,(e,t)=>(a(),C(`div`,{key:t,class:`text-xs font-mono text-accent-red`},l(t)+`... - `+l(Math.round(e))+`s remaining `,1))),128))])):_(``,!0),F.value.recent_drops&&F.value.recent_drops.length>0?(a(),C(`div`,Us,[n[28]||=S(`div`,{class:`text-xs font-medium text-secondary mb-1`},` Recently Dropped Adverts `,-1),(a(!0),C(x,null,t(F.value.recent_drops,(e,t)=>(a(),C(`div`,{key:t,class:`text-xs text-secondary py-0.5`},[S(`span`,Ws,l(e.name),1),S(`span`,Gs,`(`+l(e.pubkey)+`...)`,1),S(`span`,Ks,` - `+l(e.reason)+` (`+l(e.seconds_ago)+`s ago)`,1)]))),128))])):_(``,!0)],64)):(a(),C(`div`,Ns,[...n[22]||=[S(`p`,{class:`text-xs text-content-muted`},` Stats not available. Click "Refresh Stats" to load. `,-1)]])),n[30]||=d(`

There are three layers of advert rate limit control: Each layer can be enabled/disabled independently and the others will still function.

  • Rate Limiting OFF: All limiting disabled — adverts pass through freely
  • Adaptive OFF: Token bucket uses fixed limits (no tier scaling), penalty box still works
  • Penalty Box OFF: Token bucket still applies, but no escalating cooldowns for repeat offenders

Decision flow when all enabled: Adaptive tier check → Penalty box check → Token bucket check → Violation recording (triggers penalty box)

Activity tiers:Quiet (bypass limiting) → Normal (lighter: 0.5x intervals) → Busy (base: 1.0x intervals) → Congested (stricter: 2.0x intervals)

Note: Adaptive mode scales refill/min-interval timing; bucket capacity stays at the configured base value.

`,1)]),S(`div`,qs,[n[38]||=S(`h3`,{class:`text-lg font-semibold text-content-primary flex items-center gap-2`},[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z`})]),b(` Token Bucket Rate Limiting `)],-1),n[39]||=S(`p`,{class:`text-xs text-content-muted`},` Controls how many adverts each pubkey can send in a given time period. `,-1),S(`div`,Js,[n[32]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Rate Limiting`,-1),T.value?i((a(),C(`select`,{key:1,"onUpdate:modelValue":n[1]||=e=>I.value=e,class:`cfg-select w-full sm:w-32`},[...n[31]||=[S(`option`,{value:!0},`Enabled`,-1),S(`option`,{value:!1},`Disabled`,-1)]],512)),[[D,I.value]]):(a(),C(`div`,Ys,l(I.value?`Enabled`:`Disabled`),1))]),S(`div`,Xs,[n[33]||=S(`div`,null,[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Bucket Capacity`),S(`p`,{class:`text-xs text-content-muted`},`Max burst size (adverts)`)],-1),T.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[2]||=e=>L.value=e,type:`number`,min:`1`,max:`10`,class:`cfg-input w-full sm:w-24`},null,512)),[[j,L.value,void 0,{number:!0}]]):(a(),C(`div`,Zs,l(L.value),1))]),S(`div`,Qs,[n[35]||=S(`div`,null,[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Refill Interval`),S(`p`,{class:`text-xs text-content-muted`},` Time between token refills `)],-1),T.value?(a(),C(`div`,ec,[i(S(`input`,{"onUpdate:modelValue":n[3]||=e=>B.value=e,type:`number`,min:`1`,max:`48`,class:`cfg-input w-20`},null,512),[[j,B.value,void 0,{number:!0}]]),n[34]||=S(`span`,{class:`text-content-muted text-sm`},`hours`,-1)])):(a(),C(`div`,$s,l(B.value)+` hours `,1))]),S(`div`,tc,[n[37]||=S(`div`,null,[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Minimum Interval`),S(`p`,{class:`text-xs text-content-muted`},` Hard minimum between adverts `)],-1),T.value?(a(),C(`div`,rc,[i(S(`input`,{"onUpdate:modelValue":n[4]||=e=>V.value=e,type:`number`,min:`0`,max:`1440`,class:`cfg-input w-20`},null,512),[[j,V.value,void 0,{number:!0}]]),n[36]||=S(`span`,{class:`text-content-muted text-sm`},`min`,-1)])):(a(),C(`div`,nc,l(V.value)+` min `,1))])]),S(`div`,ic,[n[49]||=S(`h3`,{class:`text-lg font-semibold text-content-primary flex items-center gap-2`},[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636`})]),b(` Penalty Box (Repeat Offenders) `)],-1),n[50]||=S(`p`,{class:`text-xs text-content-muted`},` Applies escalating cooldowns to pubkeys that repeatedly violate limits. `,-1),S(`div`,ac,[n[41]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Penalty Box`,-1),T.value?i((a(),C(`select`,{key:1,"onUpdate:modelValue":n[5]||=e=>H.value=e,class:`cfg-select w-full sm:w-32`},[...n[40]||=[S(`option`,{value:!0},`Enabled`,-1),S(`option`,{value:!1},`Disabled`,-1)]],512)),[[D,H.value]]):(a(),C(`div`,oc,l(H.value?`Enabled`:`Disabled`),1))]),S(`div`,sc,[n[42]||=S(`div`,null,[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Violation Threshold`),S(`p`,{class:`text-xs text-content-muted`},` Violations before penalty `)],-1),T.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[6]||=e=>U.value=e,type:`number`,min:`1`,max:`10`,class:`cfg-input w-full sm:w-24`},null,512)),[[j,U.value,void 0,{number:!0}]]):(a(),C(`div`,cc,l(U.value),1))]),S(`div`,lc,[n[44]||=S(`div`,null,[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Base Penalty Duration`),S(`p`,{class:`text-xs text-content-muted`},`First penalty duration`)],-1),T.value?(a(),C(`div`,dc,[i(S(`input`,{"onUpdate:modelValue":n[7]||=e=>K.value=e,type:`number`,min:`1`,max:`48`,class:`cfg-input w-20`},null,512),[[j,K.value,void 0,{number:!0}]]),n[43]||=S(`span`,{class:`text-content-muted text-sm`},`hours`,-1)])):(a(),C(`div`,uc,l(K.value)+` hours `,1))]),S(`div`,fc,[n[46]||=S(`div`,null,[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Penalty Multiplier`),S(`p`,{class:`text-xs text-content-muted`},`Escalation factor`)],-1),T.value?(a(),C(`div`,mc,[i(S(`input`,{"onUpdate:modelValue":n[8]||=e=>te.value=e,type:`number`,min:`1`,max:`5`,step:`0.5`,class:`cfg-input w-20`},null,512),[[j,te.value,void 0,{number:!0}]]),n[45]||=S(`span`,{class:`text-content-muted text-sm`},`x`,-1)])):(a(),C(`div`,pc,l(te.value)+`x `,1))]),S(`div`,hc,[n[48]||=S(`div`,null,[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Max Penalty Duration`),S(`p`,{class:`text-xs text-content-muted`},`Maximum cooldown cap`)],-1),T.value?(a(),C(`div`,_c,[i(S(`input`,{"onUpdate:modelValue":n[9]||=e=>q.value=e,type:`number`,min:`1`,max:`168`,class:`cfg-input w-20`},null,512),[[j,q.value,void 0,{number:!0}]]),n[47]||=S(`span`,{class:`text-content-muted text-sm`},`hours`,-1)])):(a(),C(`div`,gc,l(q.value)+` hours `,1))])]),S(`div`,vc,[n[60]||=S(`h3`,{class:`text-lg font-semibold text-content-primary flex items-center gap-2`},[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z`})]),b(` Adaptive Rate Limiting `)],-1),S(`div`,yc,[n[52]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Adaptive Mode`,-1),T.value?i((a(),C(`select`,{key:1,"onUpdate:modelValue":n[10]||=e=>ne.value=e,class:`cfg-select w-full sm:w-32`},[...n[51]||=[S(`option`,{value:!0},`Enabled`,-1),S(`option`,{value:!1},`Disabled`,-1)]],512)),[[D,ne.value]]):(a(),C(`div`,bc,l(ne.value?`Enabled`:`Disabled`),1))]),S(`div`,xc,[n[54]||=S(`div`,null,[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Tier Change Delay`),S(`p`,{class:`text-xs text-content-muted`},`Prevents tier flapping`)],-1),T.value?(a(),C(`div`,Cc,[i(S(`input`,{"onUpdate:modelValue":n[11]||=e=>ie.value=e,type:`number`,min:`0`,max:`60`,class:`cfg-input w-20`},null,512),[[j,ie.value,void 0,{number:!0}]]),n[53]||=S(`span`,{class:`text-content-muted text-sm`},`min`,-1)])):(a(),C(`div`,Sc,l(ie.value)+` min `,1))]),S(`div`,wc,[n[58]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm mb-2 block`},`Activity Tier Thresholds (adverts/min)`,-1),S(`div`,Tc,[S(`div`,Ec,[n[55]||=S(`div`,{class:`text-xs text-accent-green mb-1`},`Quiet Max`,-1),T.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[12]||=e=>J.value=e,type:`number`,min:`0`,max:`1`,step:`0.01`,class:`cfg-input w-full py-1 text-center`},null,512)),[[j,J.value,void 0,{number:!0}]]):(a(),C(`div`,Dc,l(J.value),1))]),S(`div`,Oc,[n[56]||=S(`div`,{class:`text-xs text-accent-cyan mb-1`},`Normal Max`,-1),T.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[13]||=e=>Y.value=e,type:`number`,min:`0`,max:`5`,step:`0.01`,class:`cfg-input w-full py-1 text-center`},null,512)),[[j,Y.value,void 0,{number:!0}]]):(a(),C(`div`,kc,l(Y.value),1))]),S(`div`,Ac,[n[57]||=S(`div`,{class:`text-xs text-secondary mb-1`},`Busy Max`,-1),T.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[14]||=e=>X.value=e,type:`number`,min:`0`,max:`10`,step:`0.01`,class:`cfg-input w-full py-1 text-center`},null,512)),[[j,X.value,void 0,{number:!0}]]):(a(),C(`div`,jc,l(X.value),1))])]),n[59]||=S(`p`,{class:`text-xs text-content-muted mt-2`},` Above Busy Max = Congested tier (strictest limiting) `,-1)])]),N.value?(a(),C(`div`,{key:2,class:`fixed inset-0 bg-black/opacity-heavy flex items-start justify-center z-50 p-4 overflow-y-auto`,onClick:n[18]||=A(e=>N.value=!1,[`self`])},[S(`div`,{class:`bg-background dark:bg-background-dark rounded-lg shadow-xl max-w-3xl w-full my-8`,onClick:n[17]||=A(()=>{},[`stop`])},[S(`div`,Mc,[S(`div`,Nc,[n[62]||=S(`h2`,{class:`text-xl font-semibold text-content-primary`},` How Advert Rate Limiting Works `,-1),S(`button`,{onClick:n[15]||=e=>N.value=!1,class:`text-content-muted hover:text-content-primary dark:text-content-muted dark:hover:text-content-primary`},[...n[61]||=[S(`svg`,{class:`w-6 h-6`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),n[63]||=d(`

Why you may see the same advert more than once

Mesh traffic can reach your repeater through different paths, so duplicate advert packets are expected.

  • First copy arrives and is forwarded
  • Second copy arrives through another repeater path
  • Later copies may be dropped once limits are hit

This is normal behavior and helps prevent repeated rebroadcasts from flooding the mesh.

Token Bucket Rate Limiting

Each sender has a token bucket. Every forwarded advert uses one token.

  • Bucket Capacity: How many adverts can pass in a burst.
  • Refill Rate: How quickly tokens come back over time.
  • Min Interval: Optional gap between adverts from the same sender (usually set to 0).
Example (capacity 2):
- Copy 1 forwarded (2 → 1 tokens)
- Copy 2 forwarded (1 → 0 tokens)
- Copy 3 dropped (no tokens left)

Penalty Box (Repeat Offenders)

If a sender keeps hitting the limit, it is temporarily blocked.

  • Violation Threshold: How many hits before penalty starts.
  • Base Penalty: First block duration.
  • Multiplier: Repeated penalties get longer.
  • Decay Time: Violations age out after stable behavior.

Adaptive Mesh Activity Tiers

Adaptive mode adjusts limits based on recent advert activity.

How Congestion is Measured:
  • What is counted: Advert packets only (not chat/data traffic)
  • Smoothing: 60-second EWMA to avoid reacting to short spikes
  • Score: Tier is based on adverts per minute
  • Hysteresis: Tier changes must hold for 5 minutes
QUIET
Activity < 0.05/min
No rate limiting
NORMAL
Activity 0.05-0.20/min
Light limiting (50%)
BUSY
Activity 0.20-0.50/min
Standard limiting (100%)
CONGESTED
Activity > 0.50/min
Aggressive (200%)
Quick examples:
- 0.02 adverts/min → QUIET (bypass)
- 0.35 adverts/min → BUSY (tighter limits)
- 0.68 adverts/min → CONGESTED (strict limits)

Recommended starting settings

  • Min Interval: 0 (disabled), let adaptive mode do the work
  • Bucket Capacity: 2-3 tokens for normal mesh propagation
  • Adaptive Mode: On
  • Penalty Box: On
`,5),S(`div`,Pc,[S(`button`,{onClick:n[16]||=e=>N.value=!1,class:`btn-primary`},` Got it! `)])])])])):_(``,!0)],512)],64))}}),Ic={class:`modal-card max-w-2xl w-full max-h-[90vh] overflow-y-auto`},Lc={class:`flex items-center justify-between mb-7`},Rc={class:`text-xl font-semibold text-content-primary`},zc={class:`text-content-secondary dark:text-content-muted text-sm mt-1`},Bc={class:`grid grid-cols-2 gap-5 items-end`},Vc={class:`flex items-center gap-3 pb-1.5`},Hc={key:0,class:`grid grid-cols-2 gap-5`},Uc={class:`grid grid-cols-2 gap-5 items-end`},Wc={class:`flex items-center gap-3 pb-1.5`},Gc={class:`grid grid-cols-2 gap-x-5 gap-y-0`},Kc=[`aria-hidden`],qc={class:`grid grid-cols-2 gap-5 items-center pt-4`},Jc={class:`flex items-center gap-3`},Yc={class:`flex items-center gap-6`},Xc={class:`flex items-center gap-3`},Zc={class:`flex items-center gap-3`},Qc={class:`flex flex-wrap gap-2`},$c=[`onClick`],el={class:`modal-actions`},tl=[`disabled`],nl=f({__name:`BrokerEditModal`,props:{show:{type:Boolean},broker:{},isNew:{type:Boolean}},emits:[`done`,`cancel`],setup(e,{emit:n}){let s=[`REQ`,`RESPONSE`,`TXT_MSG`,`ACK`,`ADVERT`,`GRP_TXT`,`GRP_DATA`,`ANON_REQ`,`PATH`,`TRACE`,`RAW_CUSTOM`],c=e,d=n;function f(e){return{...e,tls:{...e.tls},disallowedInput:[...e.disallowedInput??[]]}}let g=o({_id:0,enabled:!0,name:``,host:``,port:443,format:`letsmesh`,use_jwt_auth:!1,transport:`websockets`,disallowedInput:[],retain_status:!1,tls:{enabled:!0,insecure:!1}});h(()=>c.broker,e=>{e&&(g.value=f(e))},{immediate:!0});let w=y(()=>{let e=g.value;return e.name.trim()!==``&&e.host.trim()!==``&&e.port>=1&&e.port<=65535&&(!e.use_jwt_auth||(e.audience?.trim()??``)!==``)});function T(){let e=g.value;(!e.audience||e.audience===e.host)&&(e.audience=e.host)}function E(e){g.value.disallowedInput||(g.value.disallowedInput=[]);let t=g.value.disallowedInput.indexOf(e);t===-1?g.value.disallowedInput.push(e):g.value.disallowedInput.splice(t,1)}function O(){w.value&&d(`done`,f(g.value))}function k(){d(`cancel`)}return(n,o)=>(a(),u(m,{to:`body`},[v(N,{"enter-active-class":`transition-opacity duration-200`,"enter-from-class":`opacity-0`,"leave-active-class":`transition-opacity duration-200`,"leave-to-class":`opacity-0`},{default:r(()=>[e.show&&e.broker?(a(),C(`div`,{key:0,class:`modal-backdrop`,onClick:o[14]||=A(e=>k(),[`self`])},[S(`div`,Ic,[S(`div`,Lc,[S(`div`,null,[S(`h3`,Rc,l(e.isNew?`Add Broker`:`Edit Broker`),1),S(`p`,zc,l(e.isNew?`Configure a new MQTT broker`:`Editing ${e.broker.name||`(unnamed)`}`),1)]),S(`button`,{onClick:k,class:`text-content-secondary dark:text-white/60 hover:text-content-primary dark:hover:text-white transition-colors`},[...o[15]||=[S(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),S(`form`,{onSubmit:A(O,[`prevent`]),class:`modal-form`},[S(`div`,null,[o[16]||=S(`label`,{class:`modal-field-label`},[b(` Name `),S(`span`,{class:`text-accent-red`},`*`)],-1),i(S(`input`,{"onUpdate:modelValue":o[0]||=e=>g.value.name=e,type:`text`,placeholder:`Broker Name`,class:`modal-input`},null,512),[[j,g.value.name]])]),S(`div`,Bc,[S(`div`,null,[o[18]||=S(`label`,{class:`modal-field-label`},[b(` Format `),S(`span`,{class:`text-accent-red`},`*`)],-1),i(S(`select`,{"onUpdate:modelValue":o[1]||=e=>g.value.format=e,class:`modal-select`},[...o[17]||=[S(`option`,{value:`meshcoretomqtt`},`Meshcoretomqtt`,-1),S(`option`,{value:`letsmesh`},`Letsmesh`,-1),S(`option`,{value:`waev`},`Waev`,-1),S(`option`,{value:`mqtt`},`openHop`,-1)]],512),[[D,g.value.format]])]),S(`div`,Vc,[S(`button`,{type:`button`,onClick:o[2]||=e=>g.value.enabled=!g.value.enabled,class:p([`relative inline-flex h-5 w-9 flex-shrink-0 cursor-pointer rounded-full transition-colors duration-200 ease-in-out focus:outline-none`,g.value.enabled?`bg-primary`:`bg-background-mute dark:bg-white/opacity-subtle`])},[S(`span`,{class:p([`pointer-events-none absolute top-0.5 left-0.5 inline-block h-4 w-4 transform rounded-full bg-white shadow transition duration-200 ease-in-out`,g.value.enabled?`translate-x-4`:`translate-x-0`])},null,2)],2),o[19]||=S(`span`,{class:`text-sm font-medium text-content-primary`},`Enabled`,-1)])]),g.value.format===`mqtt`?(a(),C(`div`,Hc,[S(`div`,null,[o[20]||=S(`label`,{class:`modal-field-label`},[b(` MQTT Base Topic `),S(`span`,{class:`font-normal text-content-muted/opacity-heavy ml-1`},`(e.g. meshcore/repeater)`)],-1),i(S(`input`,{"onUpdate:modelValue":o[3]||=e=>g.value.base_topic=e,placeholder:`meshcore/repeater`,class:`modal-input`},null,512),[[j,g.value.base_topic]])]),o[21]||=S(`div`,null,null,-1)])):_(``,!0),S(`div`,Uc,[S(`div`,null,[o[23]||=S(`label`,{class:`modal-field-label`},[b(` Transport `),S(`span`,{class:`text-accent-red`},`*`)],-1),i(S(`select`,{"onUpdate:modelValue":o[4]||=e=>g.value.transport=e,class:`modal-select`},[...o[22]||=[S(`option`,{value:`websockets`},`Websockets`,-1),S(`option`,{value:`tcp`},`TCP`,-1)]],512),[[D,g.value.transport]])]),S(`div`,Wc,[S(`button`,{type:`button`,onClick:o[5]||=e=>g.value.use_jwt_auth=!g.value.use_jwt_auth,class:p([`relative inline-flex h-5 w-9 flex-shrink-0 cursor-pointer rounded-full transition-colors duration-200 ease-in-out focus:outline-none`,g.value.use_jwt_auth?`bg-primary`:`bg-background-mute dark:bg-white/opacity-subtle`])},[S(`span`,{class:p([`pointer-events-none absolute top-0.5 left-0.5 inline-block h-4 w-4 transform rounded-full bg-white shadow transition duration-200 ease-in-out`,g.value.use_jwt_auth?`translate-x-4`:`translate-x-0`])},null,2)],2),o[24]||=S(`span`,{class:`text-sm font-medium text-content-primary`},`Use JWT Auth`,-1)])]),S(`div`,Gc,[S(`div`,null,[o[25]||=S(`label`,{class:`modal-field-label`},[b(` Host `),S(`span`,{class:`text-accent-red`},`*`)],-1),i(S(`input`,{"onUpdate:modelValue":o[6]||=e=>g.value.host=e,type:`text`,placeholder:`mqtt.myserver.com`,onBlur:T,class:`modal-input font-mono`},null,544),[[j,g.value.host]])]),S(`div`,null,[g.value.use_jwt_auth?(a(),C(x,{key:0},[o[26]||=S(`label`,{class:`modal-field-label`},[b(` Audience `),S(`span`,{class:`text-accent-red`},`*`),S(`span`,{class:`font-normal text-content-muted/opacity-heavy ml-1`},`(usually same as host)`)],-1),i(S(`input`,{"onUpdate:modelValue":o[7]||=e=>g.value.audience=e,type:`text`,placeholder:`mqtt.myserver.com`,class:`modal-input font-mono`},null,512),[[j,g.value.audience]])],64)):(a(),C(x,{key:1},[o[27]||=S(`label`,{class:`modal-field-label`},[b(` Username `),S(`span`,{class:`font-normal text-content-muted/opacity-heavy ml-1`},`(blank = anonymous)`)],-1),o[28]||=S(`input`,{type:`text`,autocomplete:`username`,class:`hidden`},null,-1),i(S(`input`,{autocomplete:`username`,"onUpdate:modelValue":o[8]||=e=>g.value.username=e,type:`text`,placeholder:`username`,class:`modal-input`},null,512),[[j,g.value.username]])],64))]),S(`div`,null,[o[29]||=S(`label`,{class:`modal-field-label`},[b(` Port `),S(`span`,{class:`text-accent-red`},`*`),S(`span`,{class:`font-normal text-content-muted/opacity-heavy ml-1`},`(443 WS, 1883 TCP)`)],-1),i(S(`input`,{"onUpdate:modelValue":o[9]||=e=>g.value.port=e,type:`number`,min:`0`,max:`65535`,class:`modal-input font-mono`},null,512),[[j,g.value.port,void 0,{number:!0}]])]),S(`div`,{class:p(g.value.use_jwt_auth?`invisible pointer-events-none`:``),"aria-hidden":g.value.use_jwt_auth?`true`:void 0},[o[30]||=S(`label`,{class:`modal-field-label`},`Password`,-1),o[31]||=S(`input`,{type:`password`,autocomplete:`current-password`,class:`hidden`},null,-1),i(S(`input`,{autocomplete:`new-password`,"onUpdate:modelValue":o[10]||=e=>g.value.password=e,type:`password`,readonly:``,onfocus:`this.removeAttribute('readonly');`,onblur:`this.setAttribute('readonly', true);`,class:`modal-input`},null,512),[[j,g.value.password]])],10,Kc)]),S(`div`,qc,[S(`div`,Jc,[S(`button`,{type:`button`,onClick:o[11]||=e=>g.value.retain_status=!g.value.retain_status,class:p([`relative inline-flex h-5 w-9 flex-shrink-0 cursor-pointer rounded-full transition-colors duration-200 ease-in-out focus:outline-none`,g.value.retain_status?`bg-primary`:`bg-background-mute dark:bg-white/opacity-subtle`])},[S(`span`,{class:p([`pointer-events-none absolute top-0.5 left-0.5 inline-block h-4 w-4 transform rounded-full bg-white shadow transition duration-200 ease-in-out`,g.value.retain_status?`translate-x-4`:`translate-x-0`])},null,2)],2),o[32]||=S(`div`,null,[S(`span`,{class:`text-sm font-medium text-content-primary`},`Retain Status`),S(`span`,{class:`text-xs text-content-muted/opacity-heavy ml-1`},`(MQTT retained)`)],-1)]),S(`div`,Yc,[S(`div`,Xc,[S(`button`,{type:`button`,onClick:o[12]||=e=>g.value.tls.enabled=!g.value.tls.enabled,class:p([`relative inline-flex h-5 w-9 flex-shrink-0 cursor-pointer rounded-full transition-colors duration-200 ease-in-out focus:outline-none`,g.value.tls.enabled?`bg-primary`:`bg-background-mute dark:bg-white/opacity-subtle`])},[S(`span`,{class:p([`pointer-events-none absolute top-0.5 left-0.5 inline-block h-4 w-4 transform rounded-full bg-white shadow transition duration-200 ease-in-out`,g.value.tls.enabled?`translate-x-4`:`translate-x-0`])},null,2)],2),o[33]||=S(`span`,{class:`text-sm font-medium text-content-primary`},`TLS`,-1)]),S(`div`,Zc,[S(`button`,{type:`button`,onClick:o[13]||=e=>g.value.tls.insecure=!g.value.tls.insecure,class:p([`relative inline-flex h-5 w-9 flex-shrink-0 cursor-pointer rounded-full transition-colors duration-200 ease-in-out focus:outline-none`,g.value.tls.insecure?`bg-accent-amber`:`bg-background-mute dark:bg-white/opacity-subtle`])},[S(`span`,{class:p([`pointer-events-none absolute top-0.5 left-0.5 inline-block h-4 w-4 transform rounded-full bg-white shadow transition duration-200 ease-in-out`,g.value.tls.insecure?`translate-x-4`:`translate-x-0`])},null,2)],2),o[34]||=S(`span`,{class:`text-sm font-medium text-content-primary`},`Insecure`,-1)])])]),S(`div`,null,[o[35]||=S(`label`,{class:`modal-field-label`},[b(` Block Packet Types `),S(`span`,{class:`text-content-secondary dark:text-content-muted font-normal text-xs ml-1`},`(prevent publishing to broker)`)],-1),S(`div`,Qc,[(a(),C(x,null,t(s,e=>S(`button`,{key:e,type:`button`,onClick:t=>E(e),class:p([`px-2.5 py-1 rounded text-xs font-mono font-medium border transition-colors`,g.value.disallowedInput?.includes(e)?`bg-accent-red/opacity-light border-accent-red/opacity-heavy text-accent-red`:`bg-background-mute dark:bg-white/opacity-subtle border-stroke-subtle dark:border-stroke/opacity-light text-content-secondary dark:text-content-muted hover:border-primary/opacity-heavy dark:hover:border-primary/opacity-heavy`])},l(e),11,$c)),64))]),o[36]||=S(`p`,{class:`mt-2 text-xs text-content-secondary dark:text-content-muted`},[S(`span`,{class:`text-accent-red font-medium`},`Red = blocked.`),b(` Leave all unselected to publish all packet types. `)],-1)]),S(`div`,el,[S(`button`,{type:`button`,onClick:k,class:`modal-btn-cancel`},` Cancel `),S(`button`,{type:`submit`,disabled:!w.value,class:p([`flex-1 px-4 py-3 rounded-lg transition-colors font-medium`,w.value?`bg-accent-green/opacity-medium hover:bg-accent-green/opacity-medium border border-accent-green/opacity-heavy text-accent-green`:`bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-medium text-content-muted/opacity-heavy cursor-not-allowed`])},` Done `,10,tl)])],32)])])):_(``,!0)]),_:1})]))}}),rl={class:`space-y-12`},il={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},al={class:`flex items-center gap-2 flex-shrink-0`},ol=[`disabled`],sl=[`disabled`],cl={key:0,class:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium border border-accent-red dark:border-accent-red/opacity-heavy rounded-lg p-3 text-accent-red text-sm`},ll={class:`cfg-section`},ul={key:0,class:`text-sm text-content-secondary dark:text-content-muted`},dl={key:1,class:`space-y-3`},fl={class:`flex items-center gap-2`},pl={key:0,class:`space-y-2`},ml=[`title`],hl={key:1,class:`text-sm text-content-muted/opacity-heavy italic`},gl={class:`cfg-card p-6`},_l={key:0,class:`grid grid-cols-1 sm:grid-cols-2 gap-x-8 gap-y-3`},vl={class:`flex flex-col py-1 border-b border-stroke-subtle dark:border-stroke/opacity-light`},yl={class:`text-content-primary font-mono text-sm mt-0.5`},bl={class:`flex flex-col py-1 border-b border-stroke-subtle dark:border-stroke/opacity-light`},xl={class:`text-content-primary text-sm mt-0.5`},Sl={class:`flex flex-col py-1`},Cl={class:`text-content-primary text-sm mt-0.5`},wl={class:`flex flex-col py-1`},Tl={class:`text-content-primary text-sm mt-0.5`},El={key:1,class:`space-y-3`},Dl={class:`grid grid-cols-1 sm:grid-cols-2 gap-3`},Ol={class:`cfg-card p-6`},kl={class:`flex items-start justify-between mb-4`},Al={key:0,class:`flex items-center gap-2 flex-shrink-0 ml-4`},jl={class:`relative`},Ml={key:0,class:`absolute right-0 top-full mt-1 z-20 w-72 rounded-lg shadow-lg border border-stroke-subtle dark:border-stroke/opacity-medium bg-white dark:bg-[var(--color-surface)] overflow-hidden`},Nl={key:0,class:`px-3 py-3 text-xs text-content-secondary dark:text-content-muted italic`},Pl={key:1,class:`px-3 py-3 text-xs text-accent-red`},Fl={key:2,class:`px-3 py-3 text-xs text-content-secondary dark:text-content-muted italic`},Il={key:3,class:`py-1`},Ll=[`onClick`],Rl={class:`min-w-0 flex-1`},zl={class:`text-sm font-medium text-content-primary group-hover:text-primary transition-colors`},Bl={class:`text-xs text-content-secondary dark:text-content-muted`},Vl=[`onClick`,`title`],Hl=[`href`],Ul={key:0,class:`bg-background-mute/opacity-heavy dark:bg-background/20 border-t border-stroke-subtle dark:border-stroke/opacity-light`},Wl=[`onClick`],Gl={class:`min-w-0 flex-1`},Kl={class:`text-xs font-medium text-content-primary truncate`},ql={class:`text-[11px] font-mono text-content-secondary dark:text-content-muted truncate`},Jl={key:0,class:`flex flex-col items-center justify-center py-8 rounded-lg border-2 border-dashed border-stroke-subtle dark:border-stroke/opacity-medium text-content-secondary dark:text-content-muted`},Yl={key:0,class:`text-xs mt-0.5 opacity-70`},Xl={key:1,class:`space-y-2`},Zl={class:`flex items-center gap-3 px-4 py-2.5`},Ql={class:`min-w-0 flex-1 flex items-center gap-2 flex-wrap`},$l={class:`text-sm font-medium text-content-primary`},eu={class:`text-xs font-mono text-content-secondary dark:text-content-muted`},tu={key:0,class:`flex items-center gap-1.5 flex-shrink-0`},nu=[`onClick`],ru=[`onClick`],iu=K(f({__name:`LetsMeshSettings`,setup(n,{expose:s}){let u=ee(),d=y(()=>u.stats?.config?.mqtt_brokers||{}),f=o([]),m=o(!1),g=o(``),T=o(null);function E(e){return{...e,tls:{...e.tls},disallowedInput:[...e.disallowedInput??[]]}}let D=o(!1),O=o(!1),k=o(``),M=o(!1),P=o(null),F=o(!1),I=o(``),L=o(300),z=o(``),B=o(``),V=o([]),H=o(null),U=o(!1),W=o(null),G=o({_id:0,enabled:!0,name:``,host:``,port:443,format:`letsmesh`,use_jwt_auth:!1,transport:`websockets`,disallowedInput:[],retain_status:!1,tls:{enabled:!0,insecure:!1}}),K=o(!1),q=o(null),ne=o(!1);async function re(){if(!ne.value){ne.value=!0;try{let e=await R.get(`/mqtt_status`);e.success&&(q.value=e.data)}catch{}finally{ne.value=!1}}}let ie=1;function J(e={}){return{_id:ie++,enabled:e.enabled??!0,name:e.name??``,host:e.host??``,port:e.port??0,audience:e.audience??``,format:e.format??`letsmesh`,use_jwt_auth:e.use_jwt_auth??!1,username:e.username??``,password:e.password??``,transport:e.transport??`websockets`,disallowedInput:Array.isArray(e.disallowedInput)?[...e.disallowedInput]:[],retain_status:e.retain_status??!1,base_topic:e.base_topic??``,tls:{enabled:e.tls?.enabled??!1,insecure:e.tls?.insecure??!1}}}function Y(){let e=d.value;I.value=e.iata_code??``,L.value=e.status_interval??300,z.value=e.owner??``,B.value=e.email??``,V.value=Array.isArray(e.brokers)?e.brokers.map(e=>J(e)):[]}h(d,()=>{D.value||Y()},{immediate:!0});function X(){return{iata_code:I.value,status_interval:L.value,owner:z.value,email:B.value,brokers:V.value.map(e=>{let t={name:e.name,enabled:e.enabled,transport:e.transport,host:e.host,port:e.port,use_jwt_auth:e.use_jwt_auth,format:e.format,disallowed_packet_types:e.disallowedInput,base_topic:e.base_topic,retain_status:e.retain_status,tls:{enabled:e.tls?.enabled??!1,insecure:e.tls?.insecure??!1}};return e.use_jwt_auth?{...t,audience:e.audience}:{...t,username:e.username,password:e.password}})}}async function Z(){try{let e=await R.post(`/update_mqtt_config`,X());return e.success?(await u.fetchStats(),await re(),{success:!0}):{success:!1,error:e.error||`Save failed`}}catch(e){let t=e;return{success:!1,error:t?.response?.data?.error||t?.message||`Request failed`}}}function Q(){Y(),P.value={iata:I.value,interval:L.value,owner:z.value,email:B.value,brokers:V.value.map(E)},D.value=!0,k.value=``}function ae(){P.value&&(I.value=P.value.iata,L.value=P.value.interval,z.value=P.value.owner,B.value=P.value.email,V.value=P.value.brokers.map(E)),H.value=null,U.value=!1,W.value=null,F.value=!1,D.value=!1,P.value=null,k.value=``}async function oe(){if(H.value!==null){let e=G.value;if(!e.name.trim()||!e.host.trim()){k.value=`Please complete or cancel the open broker edit before saving.`;return}le()}O.value=!0,k.value=``;let e=await Z();O.value=!1,e.success?(D.value=!1,F.value=!1,P.value=null,M.value=!0):k.value=e.error}function se(){H.value!==null&&ce();let e=J();V.value.push(e),W.value=null,U.value=!0,G.value=E(e),H.value=e._id}function $(e){H.value!==null&&H.value!==e._id&&ce(),W.value=E(e),U.value=!1,G.value=E(e),H.value=e._id}function ce(){if(U.value&&H.value!==null)V.value=V.value.filter(e=>e._id!==H.value);else if(W.value){let e=V.value.findIndex(e=>e._id===W.value._id);e!==-1&&V.value.splice(e,1,E(W.value))}H.value=null,U.value=!1,W.value=null}function le(){let e=G.value,t=V.value.findIndex(t=>t._id===e._id);t!==-1&&V.value.splice(t,1,E(e)),H.value=null,U.value=!1,W.value=null}function ue(e){G.value=e,le()}function de(e){V.value=V.value.filter(t=>t._id!==e),H.value===e&&(H.value=null,U.value=!1,W.value=null)}function me(e){K.value=!1,T.value=null,H.value!==null&&ce(),e.brokers.forEach(e=>V.value.push(J(e)))}function he(e){K.value=!1,T.value=null,H.value!==null&&ce(),V.value.push(J(e))}function ge(e){T.value=T.value===e?null:e}async function _e(){m.value=!0,g.value=``;try{let e=await R.get(`/broker_presets`);e.success&&Array.isArray(e.data)?f.value=e.data:(f.value=[],g.value=e.error||`Failed to load broker presets`)}catch(e){f.value=[],e?.response?.status===404?g.value=``:g.value=`Could not reach repeater for broker presets`}finally{m.value=!1}}let ve=y(()=>{let e=G.value;return e.name.trim()!==``&&e.host.trim()!==``&&e.port>=1&&e.port<=65535&&(!e.use_jwt_auth||(e.audience?.trim()??``)!==``)});async function ye(){H.value!==null&&ve.value&&le(),O.value=!0,k.value=``;let e=await Z();return O.value=!1,e.success?(D.value=!1,F.value=!1,P.value=null,M.value=!0,!0):(k.value=e.error??`Save failed`,!1)}let{showUnsavedModal:be,requestLeave:xe,handleDiscard:Se,handleSave:Ce,handleCancel:we}=pe(D,O,ae,ye);s({requestLeave:xe,isEditing:D});let Te=null;return e(()=>{re(),_e(),Te=setInterval(re,5e3)}),w(()=>{Te&&clearInterval(Te)}),(e,n)=>(a(),C(x,null,[v(te,{modelValue:M.value,"onUpdate:modelValue":n[0]||=e=>M.value=e,message:`Broker settings have been saved. A service restart is required for the changes to take effect.`},null,8,[`modelValue`]),v(nl,{show:H.value!==null,broker:H.value===null?null:G.value,"is-new":U.value,onDone:ue,onCancel:ce},null,8,[`show`,`broker`,`is-new`]),v(fe,{show:c(be),"is-saving":O.value,label:`Broker settings`,onDiscard:c(Se),onSave:c(Ce),onCancel:c(we)},null,8,[`show`,`is-saving`,`onDiscard`,`onSave`,`onCancel`]),S(`div`,rl,[S(`div`,il,[n[8]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},` Observer Configuration `),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},` Configure LetsMesh observer settings, MQTT brokers, and connection status `)],-1),S(`div`,al,[D.value?(a(),C(x,{key:1},[S(`button`,{onClick:ae,disabled:O.value,class:`px-3 sm:cfg-btn-secondary`},` Cancel `,8,ol),S(`button`,{onClick:oe,disabled:O.value,class:`btn-primary`},l(O.value?`Saving…`:`Save Settings`),9,sl)],64)):(a(),C(`button`,{key:0,onClick:Q,class:`btn-primary`},` Edit Settings `))])]),k.value?(a(),C(`div`,cl,l(k.value),1)):_(``,!0),S(`div`,ll,[n[10]||=S(`div`,{class:`mb-4`},[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},`Observer Status`),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},`Live LetsMesh broker connection state`)],-1),q.value?(a(),C(`div`,dl,[S(`div`,fl,[n[9]||=S(`span`,{class:`text-sm text-content-secondary dark:text-content-muted w-36`},`Handler`,-1),S(`span`,{class:p([`inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium`,q.value.handler_active?`bg-accent-green/opacity-light dark:bg-accent-green/opacity-medium text-accent-green`:`bg-background-mute dark:bg-background-mute/opacity-heavy text-content-muted`])},[S(`span`,{class:p([`w-1.5 h-1.5 rounded-full`,q.value.handler_active?`bg-accent-green/opacity-light`:`bg-background-mute`])},null,2),b(` `+l(q.value.handler_active?`Active`:`Inactive`),1)],2)]),q.value.brokers.length?(a(),C(`div`,pl,[(a(!0),C(x,null,t(q.value.brokers,e=>(a(),C(`div`,{key:e.host,class:`flex items-center gap-2`},[S(`span`,{class:`text-sm text-content-secondary dark:text-content-muted w-36 truncate`,title:e.name},l(e.name),9,ml),S(`span`,{class:p([`inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium`,e.status.connected?`bg-accent-green/opacity-light dark:bg-accent-green/opacity-medium text-accent-green`:e.status.reconnecting?`bg-accent-amber/opacity-light dark:bg-accent-amber/opacity-medium text-accent-amber`:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium text-accent-red`])},[S(`span`,{class:p([`w-1.5 h-1.5 rounded-full`,e.status.connected?`bg-accent-green/opacity-light`:e.status.reconnecting?`bg-accent-amber/opacity-light`:`bg-accent-red/opacity-light`])},null,2),b(` `+l(e.status.connected?`Connected`:e.status.reconnecting?`Reconnecting…`:`Disconnected`),1)],2)]))),128))])):(a(),C(`div`,hl,`No broker connections configured.`))])):(a(),C(`div`,ul,` Status unavailable — service may not be running. `))]),S(`div`,gl,[n[19]||=S(`div`,{class:`mb-4`},[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},`Observer Setup`),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},`IATA code, status interval, and owner details`)],-1),S(`div`,null,[D.value?_(``,!0):(a(),C(`div`,_l,[S(`div`,vl,[n[11]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`IATA Code`,-1),S(`span`,yl,l(d.value.iata_code||`—`),1)]),S(`div`,bl,[n[12]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Status Interval`,-1),S(`span`,xl,l(d.value.status_interval??300)+`s`,1)]),S(`div`,Sl,[n[13]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Owner`,-1),S(`span`,Cl,l(d.value.owner||`—`),1)]),S(`div`,wl,[n[14]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Email`,-1),S(`span`,Tl,l(d.value.email||`—`),1)])])),D.value?(a(),C(`div`,El,[S(`div`,Dl,[S(`div`,null,[n[15]||=S(`label`,{class:`block text-xs sm:text-sm text-content-secondary dark:text-content-muted mb-1`},[b(` IATA Code `),S(`span`,{class:`text-content-muted/opacity-heavy text-xs`},`(e.g. SFO, LHR)`)],-1),i(S(`input`,{"onUpdate:modelValue":n[1]||=e=>I.value=e,type:`text`,maxlength:`10`,placeholder:`TEST`,class:`cfg-input font-mono`},null,512),[[j,I.value]])]),S(`div`,null,[n[16]||=S(`label`,{class:`block text-xs sm:text-sm text-content-secondary dark:text-content-muted mb-1`},[b(` Status Interval `),S(`span`,{class:`text-content-muted/opacity-heavy text-xs`},`(seconds, min 60)`)],-1),i(S(`input`,{"onUpdate:modelValue":n[2]||=e=>L.value=e,type:`number`,min:`60`,max:`3600`,class:`cfg-input font-mono`},null,512),[[j,L.value,void 0,{number:!0}]])]),S(`div`,null,[n[17]||=S(`label`,{class:`block text-xs sm:text-sm text-content-secondary dark:text-content-muted mb-1`},`Owner Companion Pubkey`,-1),i(S(`input`,{"onUpdate:modelValue":n[3]||=e=>z.value=e,type:`text`,placeholder:`Optional`,class:`cfg-input`},null,512),[[j,z.value]])]),S(`div`,null,[n[18]||=S(`label`,{class:`block text-xs sm:text-sm text-content-secondary dark:text-content-muted mb-1`},`Email`,-1),i(S(`input`,{"onUpdate:modelValue":n[4]||=e=>B.value=e,type:`email`,placeholder:`Optional`,class:`cfg-input`},null,512),[[j,B.value]])])])])):_(``,!0)])]),S(`div`,Ol,[S(`div`,kl,[n[27]||=S(`div`,null,[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},`Broker Settings`),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},`MQTT brokers for observer publishing`)],-1),D.value?(a(),C(`div`,Al,[S(`div`,jl,[S(`button`,{onClick:n[5]||=e=>K.value=!K.value,class:`inline-flex items-center gap-1.5 px-3 sm:cfg-btn-secondary`},[n[21]||=b(` From Template `,-1),(a(),C(`svg`,{class:p([`w-3 h-3 transition-transform`,K.value?`rotate-180`:``]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...n[20]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 9l-7 7-7-7`},null,-1)]],2))]),v(N,{name:`dropdown`},{default:r(()=>[K.value?(a(),C(`div`,Ml,[n[25]||=S(`div`,{class:`px-3 py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},[S(`p`,{class:`text-xs font-medium text-content-secondary dark:text-content-muted uppercase tracking-wide`},`Known Networks`)],-1),m.value?(a(),C(`div`,Nl,` Loading presets… `)):g.value?(a(),C(`div`,Pl,l(g.value),1)):f.value.length?(a(),C(`div`,Il,[(a(!0),C(x,null,t(f.value,e=>(a(),C(`div`,{key:e.id,class:`border-b border-stroke-subtle dark:border-stroke/opacity-light last:border-b-0`},[S(`div`,{class:`flex items-center gap-2 px-3 py-2.5 hover:bg-background-mute dark:hover:bg-background/30 cursor-pointer group`,onClick:t=>me(e)},[S(`div`,Rl,[S(`p`,zl,l(e.name),1),S(`p`,Bl,l(e.brokers.length)+` broker`+l(e.brokers.length===1?``:`s`),1)]),e.brokers.length>1?(a(),C(`button`,{key:0,onClick:A(t=>ge(e.id),[`stop`]),title:T.value===e.id?`Hide individual brokers`:`Pick individual brokers`,class:`flex-shrink-0 p-1 rounded hover:bg-primary/opacity-light text-content-secondary dark:text-content-muted hover:text-primary transition-colors`},[(a(),C(`svg`,{class:p([`w-3.5 h-3.5 transition-transform`,T.value===e.id?`rotate-180`:``]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...n[22]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 9l-7 7-7-7`},null,-1)]],2))],8,Vl)):_(``,!0),e.website?(a(),C(`a`,{key:1,href:e.website,target:`_blank`,rel:`noopener noreferrer`,title:`Visit website`,class:`flex-shrink-0 p-1 rounded hover:bg-primary/opacity-light text-content-secondary dark:text-content-muted hover:text-primary transition-colors`,onClick:n[6]||=A(()=>{},[`stop`])},[...n[23]||=[S(`svg`,{class:`w-3.5 h-3.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14`})],-1)]],8,Hl)):_(``,!0)],8,Ll),T.value===e.id&&e.brokers.length>1?(a(),C(`div`,Ul,[(a(!0),C(x,null,t(e.brokers,(t,r)=>(a(),C(`div`,{key:`${e.id}-${r}`,class:`flex items-center gap-2 pl-6 pr-3 py-2 hover:bg-background-mute dark:hover:bg-background/30 cursor-pointer`,onClick:e=>he(t)},[S(`div`,Gl,[S(`p`,Kl,l(t.name),1),S(`p`,ql,l(t.host)+`:`+l(t.port),1)]),n[24]||=S(`span`,{class:`flex-shrink-0 inline-flex items-center justify-center w-5 h-5 rounded bg-primary/opacity-light text-primary text-xs font-bold`,title:`Add only this broker`},`+`,-1)],8,Wl))),128))])):_(``,!0)]))),128))])):(a(),C(`div`,Fl,` No bundled presets. Use "Add" to configure manually. `))])):_(``,!0)]),_:1}),K.value?(a(),C(`div`,{key:0,class:`fixed inset-0 z-10`,onClick:n[7]||=e=>K.value=!1})):_(``,!0)]),S(`button`,{onClick:se,class:`btn-primary inline-flex items-center gap-1.5`},[...n[26]||=[S(`svg`,{class:`w-3.5 h-3.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 4v16m8-8H4`})],-1),b(` Add `,-1)]])])):_(``,!0)]),V.value.length?(a(),C(`div`,Xl,[(a(!0),C(x,null,t(V.value,e=>(a(),C(`div`,{key:e._id,class:`cfg-card overflow-hidden`},[S(`div`,Zl,[S(`div`,Ql,[S(`span`,{class:p([`inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium`,e.enabled?`bg-accent-green/opacity-light dark:bg-accent-green/opacity-medium text-accent-green`:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium text-accent-red`])},[S(`span`,{class:p([`w-1.5 h-1.5 rounded-full`,e.enabled?`bg-accent-green/opacity-light`:`bg-accent-red/opacity-light`])},null,2),b(` `+l(e.enabled?`Enabled`:`Disabled`),1)],2),S(`span`,$l,l(e.name||`(unnamed)`),1),S(`span`,eu,l(e.host||`—`)+`:`+l(e.port),1)]),D.value?(a(),C(`div`,tu,[S(`button`,{onClick:t=>$(e),class:`px-2.5 py-1 text-xs bg-primary/opacity-medium hover:bg-primary/opacity-medium text-content-primary rounded border border-primary/opacity-heavy transition-colors`},` Edit `,8,nu),S(`button`,{onClick:t=>de(e._id),title:`Remove`,class:`p-1.5 rounded hover:bg-accent-red/opacity-light dark:hover:bg-accent-red/opacity-medium text-content-secondary dark:text-content-muted hover:text-accent-red dark:hover:text-accent-red transition-colors`},[...n[30]||=[S(`svg`,{class:`w-3.5 h-3.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16`})],-1)]],8,ru)])):_(``,!0)])]))),128))])):(a(),C(`div`,Jl,[n[28]||=S(`svg`,{class:`w-7 h-7 mb-2 opacity-40`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`1.5`,d:`M5 12h14M5 12l4-4m-4 4l4 4`})],-1),n[29]||=S(`p`,{class:`text-sm`},`No brokers configured`,-1),D.value?(a(),C(`p`,Yl,`Use Add or From Template above`)):_(``,!0)]))])])],64))}}),[[`__scopeId`,`data-v-e0c27f45`]]),au={class:`space-y-12`},ou={key:0,class:`rounded-lg border-2 border-accent-red/opacity-heavy bg-accent-red/opacity-light p-4`},su={class:`cfg-section`},cu=[`disabled`],lu={key:0,class:`flex items-center gap-2`},uu={key:1,class:`flex items-center gap-2`},du={key:0,class:`text-xs text-accent-green mt-2`},fu={key:1,class:`text-xs text-accent-red mt-2`},pu={class:`cfg-section`},mu={key:0},hu={key:1,class:`rounded-lg border-2 border-accent-red/opacity-heavy bg-accent-red/opacity-light p-4`},gu={class:`flex items-start gap-3`},_u={class:`flex-1`},vu={class:`text-xs text-accent-red mt-1`},yu={class:`flex gap-2 mt-3`},bu=[`disabled`],xu=[`disabled`],Su={key:2,class:`text-xs text-accent-green mt-2`},Cu={key:3,class:`text-xs text-accent-red mt-2`},wu={class:`cfg-section`},Tu={class:`space-y-3`},Eu={class:`flex items-center gap-3 cursor-pointer px-4 py-3 bg-background-mute dark:bg-background/30 rounded-lg border-2 border-dashed border-stroke-subtle dark:border-stroke/opacity-heavy hover:border-primary/opacity-heavy dark:hover:border-primary/opacity-heavy transition-colors`},Du={class:`text-sm text-content-secondary dark:text-content-muted`},Ou={key:0,class:`bg-background-mute dark:bg-background/30 rounded-lg p-4 border border-stroke-subtle dark:border-stroke/opacity-light`},ku={key:0,class:`text-xs text-content-secondary dark:text-content-muted space-y-1 mb-3`},Au={class:`font-mono`},ju={class:`font-mono`},Mu={key:0,class:`text-accent-amber font-medium`},Nu={key:1,class:`text-content-muted`},Pu={class:`text-xs text-content-secondary dark:text-content-muted`},Fu={class:`font-mono`},Iu={key:1},Lu={key:2,class:`rounded-lg border-2 border-accent-amber/opacity-heavy bg-accent-amber/opacity-light p-4`},Ru={class:`flex items-start gap-3`},zu={class:`flex-1`},Bu={class:`text-xs text-accent-amber mt-1`},Vu={class:`flex gap-2 mt-3`},Hu=[`disabled`],Uu=[`disabled`],Wu={key:3,class:`text-xs text-accent-green mt-2`},Gu={key:4,class:`text-xs text-accent-red mt-2`},Ku={class:`cfg-section`},qu={key:0},Ju={key:1,class:`rounded-lg border-2 border-accent-red/opacity-heavy bg-accent-red/opacity-light p-4`},Yu={class:`flex items-start gap-3`},Xu={class:`flex-1`},Zu={class:`text-xs text-accent-red mt-1`},Qu={class:`flex gap-2 mt-3`},$u=[`disabled`],ed=[`disabled`],td={key:2,class:`bg-background-mute dark:bg-background/30 rounded-lg p-4 border border-stroke-subtle dark:border-stroke/opacity-light space-y-2`},nd={class:`flex items-center justify-between`},rd={class:`text-xs text-content-secondary dark:text-content-muted space-y-1`},id={class:`font-mono`},ad={key:0},od={class:`font-mono`},sd={key:1},cd={class:`font-mono text-[10px] break-all`},ld={key:3,class:`text-xs text-accent-red mt-2`},ud=f({__name:`BackupRestore`,setup(e){let t=y(()=>window.location.protocol===`http:`),n=o(!1),r=o(``),i=o(``);async function s(){n.value=!0,r.value=``,i.value=``;try{let e=await R.exportConfig(!1);if(!e.success||!e.data){i.value=e.error||`Export failed`;return}let t=new Blob([JSON.stringify(e.data,null,2)],{type:`application/json`}),n=URL.createObjectURL(t),a=document.createElement(`a`);a.href=n,a.download=`openhop-repeater-settings-${(e.data.meta?.exported_at||new Date().toISOString()).replace(/[:.]/g,`-`)}.json`,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(n),r.value=`Settings exported successfully (secrets redacted).`}catch(e){i.value=e instanceof Error?e.message:`Export failed`}finally{n.value=!1}}let c=o(!1),u=o(!1),f=o(``),p=o(``);async function m(){u.value=!0,f.value=``,p.value=``;try{let e=await R.exportConfig(!0);if(!e.success||!e.data){p.value=e.error||`Export failed`;return}let t=new Blob([JSON.stringify(e.data,null,2)],{type:`application/json`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`openhop-repeater-full-backup-${(e.data.meta?.exported_at||new Date().toISOString()).replace(/[:.]/g,`-`)}.json`,document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(n),f.value=`Full backup exported (includes all secrets).`,c.value=!1}catch(e){p.value=e instanceof Error?e.message:`Export failed`}finally{u.value=!1}}let h=o(null),g=o(null),w=o(!1),T=o(!1),E=o(``),D=o(``),O=o(null),k=y(()=>g.value?.config?Object.keys(g.value.config).join(`, `):``),A=y(()=>{let e=g.value?.meta?.includes_secrets;return e===!0||e===`true`});function j(e){let t=e.target.files?.[0];if(!t)return;h.value=t,g.value=null,w.value=!1,E.value=``,D.value=``;let n=new FileReader;n.onload=e=>{try{let t=JSON.parse(e.target?.result);t.config&&typeof t.config==`object`?g.value={meta:t.meta,config:t.config}:typeof t==`object`&&!Array.isArray(t)?g.value={config:t}:D.value=`Invalid file format — expected a JSON config object.`}catch{D.value=`Invalid JSON file.`}},n.readAsText(t)}function M(){w.value=!1,g.value=null,h.value=null,O.value&&(O.value.value=``)}async function N(){if(g.value?.config){T.value=!0,E.value=``,D.value=``;try{let e=await R.importConfig(g.value.config);if(e.success){let t=e.data,n=e.message||t?.message||`Configuration imported.`;t?.restart_required&&(n+=` A service restart is required for radio changes to take effect.`),E.value=n,w.value=!1,g.value=null,h.value=null,O.value&&(O.value.value=``)}else D.value=e.error||`Import failed`}catch(e){D.value=e instanceof Error?e.message:`Import failed`}finally{T.value=!1}}}let P=o(!1),F=o(!1),I=o(null),L=o(``);async function z(){F.value=!0,L.value=``;try{let e=await R.exportIdentityKey();if(!e.success||!e.data){L.value=e.error||`Export failed`;return}I.value=e.data;let t=new Blob([e.data.identity_key_hex],{type:`text/plain`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`openhop-identity-${e.data.node_address||`key`}.hex`,document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(n)}catch(e){L.value=e instanceof Error?e.message:`Export failed`}finally{F.value=!1}}return(e,o)=>(a(),C(`div`,au,[o[39]||=S(`div`,{class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},[S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`Backup & Restore`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Export, import, and restore your repeater configuration`)])],-1),t.value?(a(),C(`div`,ou,[...o[6]||=[d(`

Unencrypted Connection

This page is served over HTTP, not HTTPS. Exported data (including identity keys) will be transmitted in plain text. Only use these features on a trusted local network.

`,1)]])):_(``,!0),S(`div`,su,[o[9]||=S(`div`,{class:`flex items-start justify-between mb-4`},[S(`div`,null,[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},` Export Settings `),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},[b(` Download the current configuration as a JSON file. Passwords, JWT secrets, and identity keys are `),S(`strong`,null,`redacted`),b(`. Safe to share or use as a template for other devices. `)])])],-1),S(`button`,{onClick:s,disabled:n.value,class:`cfg-btn-primary`},[n.value?(a(),C(`span`,lu,[v(W,{size:`sm`,color:`current`,class:`inline-block`}),o[7]||=b(` Exporting… `,-1)])):(a(),C(`span`,uu,[...o[8]||=[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4`})],-1),b(` Export Settings `,-1)]]))],8,cu),r.value?(a(),C(`p`,du,l(r.value),1)):_(``,!0),i.value?(a(),C(`p`,fu,l(i.value),1)):_(``,!0)]),S(`div`,pu,[o[15]||=d(`

Full Backup

Download a complete backup including all passwords, JWT secrets, and identity keys. Required for restoring to a new device or recovering from a failed SD card.

Contains sensitive data. The backup file will include plain-text passwords and private keys. Store it securely and never share it.

`,2),c.value?_(``,!0):(a(),C(`div`,mu,[S(`button`,{onClick:o[0]||=e=>c.value=!0,class:`cfg-btn-danger`},[...o[10]||=[S(`span`,{class:`flex items-center gap-2`},[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z`})]),b(` Full Backup `)],-1)]])])),c.value?(a(),C(`div`,hu,[S(`div`,gu,[o[14]||=S(`svg`,{class:`w-5 h-5 text-accent-red shrink-0 mt-0.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z`})],-1),S(`div`,_u,[o[13]||=S(`h4`,{class:`text-sm font-semibold text-accent-red`},` Confirm Full Backup `,-1),S(`p`,vu,[o[11]||=b(` This will export `,-1),o[12]||=S(`strong`,null,`all secrets in plain text`,-1),b(` including admin/guest passwords, JWT secret, and your repeater's private identity key`+l(t.value?` over an unencrypted HTTP connection`:``)+`. `,1)]),S(`div`,yu,[S(`button`,{onClick:m,disabled:u.value,class:`cfg-btn-danger`},l(u.value?`Exporting…`:`Yes, Export Full Backup`),9,bu),S(`button`,{onClick:o[1]||=e=>c.value=!1,disabled:u.value,class:`btn-secondary`},` Cancel `,8,xu)])])])])):_(``,!0),f.value?(a(),C(`p`,Su,l(f.value),1)):_(``,!0),p.value?(a(),C(`p`,Cu,l(p.value),1)):_(``,!0)]),S(`div`,wu,[o[29]||=S(`div`,{class:`flex items-start justify-between mb-4`},[S(`div`,null,[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},` Import Configuration `),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},[b(` Restore configuration from a previously exported JSON file. Importing a `),S(`strong`,null,`full backup`),b(` will also restore passwords and identity keys. Importing a `),S(`strong`,null,`settings export`),b(` will only update non-sensitive settings. `)])])],-1),S(`div`,Tu,[S(`label`,Eu,[o[16]||=S(`svg`,{class:`w-5 h-5 text-content-secondary dark:text-content-muted`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12`})],-1),S(`span`,Du,l(h.value?h.value.name:`Choose a config JSON file…`),1),S(`input`,{ref_key:`fileInputRef`,ref:O,type:`file`,accept:`.json,application/json`,class:`hidden`,onChange:j},null,544)]),g.value?(a(),C(`div`,Ou,[o[20]||=S(`h4`,{class:`text-sm font-medium text-content-primary mb-2`},` Import Preview `,-1),g.value.meta?(a(),C(`div`,ku,[S(`p`,null,[o[17]||=b(` Exported: `,-1),S(`span`,Au,l(g.value.meta.exported_at),1)]),S(`p`,null,[o[18]||=b(` Version: `,-1),S(`span`,ju,l(g.value.meta.version),1)]),g.value.meta.includes_secrets===`true`||g.value.meta.includes_secrets===!0?(a(),C(`p`,Mu,` ⚠ Full backup — will restore passwords and identity keys `)):(a(),C(`p`,Nu,` Settings only — existing secrets will not be changed `))])):_(``,!0),S(`p`,Pu,[o[19]||=b(` Sections: `,-1),S(`span`,Fu,l(k.value),1)])])):_(``,!0),g.value&&!w.value?(a(),C(`div`,Iu,[S(`button`,{onClick:o[2]||=e=>w.value=!0,class:`px-4 py-2 bg-accent-amber/opacity-medium hover:bg-accent-amber/opacity-medium text-accent-amber rounded-lg border border-accent-amber/opacity-heavy transition-colors text-sm`},` Review & Import `)])):_(``,!0),w.value?(a(),C(`div`,Lu,[S(`div`,Ru,[o[28]||=S(`svg`,{class:`w-5 h-5 text-accent-amber shrink-0 mt-0.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z`})],-1),S(`div`,zu,[o[27]||=S(`h4`,{class:`text-sm font-semibold text-accent-amber`},` Confirm Import `,-1),S(`p`,Bu,[o[24]||=b(` This will overwrite current settings for: `,-1),S(`strong`,null,l(k.value),1),o[25]||=b(`. `,-1),A.value?(a(),C(x,{key:0},[o[21]||=b(` This is a full backup — `,-1),o[22]||=S(`strong`,null,`passwords, JWT secrets, and identity keys will also be overwritten`,-1),o[23]||=b(`. `,-1)],64)):(a(),C(x,{key:1},[b(` Passwords and identity keys will not be changed. `)],64)),o[26]||=b(` Some changes (radio settings) require a service restart. `,-1)]),S(`div`,Vu,[S(`button`,{onClick:N,disabled:T.value,class:`px-4 py-2 bg-accent-amber/opacity-medium hover:bg-accent-amber/opacity-medium text-accent-amber rounded-lg border border-accent-amber/opacity-heavy transition-colors text-sm disabled:opacity-50 disabled:cursor-not-allowed`},l(T.value?`Importing…`:`Yes, Import`),9,Hu),S(`button`,{onClick:M,disabled:T.value,class:`btn-secondary`},` Cancel `,8,Uu)])])])])):_(``,!0),E.value?(a(),C(`p`,Wu,l(E.value),1)):_(``,!0),D.value?(a(),C(`p`,Gu,l(D.value),1)):_(``,!0)])]),S(`div`,Ku,[o[38]||=d(`

Export Identity Key

Download the repeater's private identity key for backup. This key determines the node's address and cryptographic identity on the mesh.

Sensitive data. The identity key is the repeater's private key. Anyone with this key can impersonate your node. Store the exported file securely and never share it.

`,2),P.value?_(``,!0):(a(),C(`div`,qu,[S(`button`,{onClick:o[3]||=e=>P.value=!0,class:`cfg-btn-danger`},[...o[30]||=[S(`span`,{class:`flex items-center gap-2`},[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z`})]),b(` Export Identity Key `)],-1)]])])),P.value&&!I.value?(a(),C(`div`,Ju,[S(`div`,Yu,[o[32]||=S(`svg`,{class:`w-5 h-5 text-accent-red shrink-0 mt-0.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z`})],-1),S(`div`,Xu,[o[31]||=S(`h4`,{class:`text-sm font-semibold text-accent-red`},`Are you sure?`,-1),S(`p`,Zu,` This will transmit your private key `+l(t.value?`over an unencrypted HTTP connection. `:``)+` and download it as a file. `,1),S(`div`,Qu,[S(`button`,{onClick:z,disabled:F.value,class:`cfg-btn-danger`},l(F.value?`Exporting…`:`Yes, Export Key`),9,$u),S(`button`,{onClick:o[4]||=e=>P.value=!1,disabled:F.value,class:`btn-secondary`},` Cancel `,8,ed)])])])])):_(``,!0),I.value?(a(),C(`div`,td,[S(`div`,nd,[o[33]||=S(`h4`,{class:`text-sm font-medium text-content-primary`},` Key Exported `,-1),S(`button`,{onClick:o[5]||=e=>{I.value=null,P.value=!1},class:`text-xs text-content-muted hover:text-content-secondary transition-colors`},` Dismiss `)]),S(`div`,rd,[S(`p`,null,[o[34]||=b(` Key length: `,-1),S(`span`,id,l(I.value.key_length_bytes)+` bytes`,1)]),I.value.node_address?(a(),C(`p`,ad,[o[35]||=b(` Node address: `,-1),S(`span`,od,l(I.value.node_address),1)])):_(``,!0),I.value.public_key_hex?(a(),C(`p`,sd,[o[36]||=b(` Public key: `,-1),S(`span`,cd,l(I.value.public_key_hex),1)])):_(``,!0)]),o[37]||=S(`p`,{class:`text-xs text-accent-green`},`File downloaded successfully.`,-1)])):_(``,!0),L.value?(a(),C(`p`,ld,l(L.value),1)):_(``,!0)])]))}}),dd={class:`space-y-12`},fd={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},pd={class:`flex items-center gap-2 flex-shrink-0`},md={class:`cfg-section`},hd={class:`flex items-start justify-between mb-4`},gd=[`disabled`],_d={key:0,class:`flex items-center gap-1.5`},vd={key:1},yd={key:0,class:`grid grid-cols-2 sm:grid-cols-4 gap-3 mb-6`},bd={class:`bg-background-mute dark:bg-background/30 rounded-lg p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},xd={class:`text-lg font-semibold text-content-primary font-mono`},Sd={class:`bg-background-mute dark:bg-background/30 rounded-lg p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},Cd={class:`text-lg font-semibold text-content-primary font-mono`},wd={class:`bg-background-mute dark:bg-background/30 rounded-lg p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},Td={class:`text-lg font-semibold text-content-primary font-mono`},Ed={class:`bg-background-mute dark:bg-background/30 rounded-lg p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},Dd={class:`text-lg font-semibold text-content-primary font-mono`},Od={key:1,class:`flex items-center justify-center py-12`},kd={class:`text-center`},Ad={key:2,class:`rounded-lg border border-accent-red/opacity-medium dark:border-accent-red/opacity-medium bg-accent-red/opacity-light dark:bg-accent-red/opacity-light p-3 mb-4`},jd={class:`text-xs text-accent-red`},Md={key:3},Nd={class:`overflow-x-auto`},Pd={class:`w-full text-sm`},Fd={class:`py-2.5 pr-4`},Id={class:`font-mono text-content-primary`},Ld={class:`py-2.5 pr-4 text-right`},Rd={class:`font-mono text-content-secondary dark:text-content-muted`},zd={class:`py-2.5 pr-4 text-right hidden sm:table-cell`},Bd={key:0,class:`text-xs text-content-muted`},Vd={class:`text-content-muted/opacity-heavy ml-1`},Hd={key:1,class:`text-xs text-content-muted/opacity-heavy`},Ud={key:2,class:`text-xs text-content-muted/opacity-heavy`},Wd={class:`py-2.5 text-right`},Gd=[`onClick`,`disabled`],Kd={key:0,class:`flex items-center gap-1`},qd={key:1},Jd={key:1,class:`text-xs text-content-muted/opacity-heavy`},Yd={class:`flex items-start gap-3 mb-5`},Xd={class:`flex-1 min-w-0`},Zd={class:`text-lg font-semibold text-content-primary`},Qd={class:`text-sm text-content-secondary dark:text-content-muted mt-1`},$d={class:`text-content-primary`},ef={class:`text-content-primary font-mono`},tf={class:`flex gap-3`},nf=[`disabled`],rf=[`disabled`],af={class:`cfg-section`},of={class:`flex flex-wrap gap-3`},sf=[`disabled`],cf=[`disabled`],lf={class:`flex items-center gap-2`},uf={key:0,class:`text-xs text-accent-green mt-3`},df={key:1,class:`text-xs text-accent-green mt-3`},ff=f({__name:`DatabaseManagement`,setup(n){let r=new Set([`packets`,`adverts`,`noise_floor`,`crc_errors`,`room_messages`,`room_client_sync`,`companion_contacts`,`companion_channels`,`companion_messages`,`companion_prefs`]),i=o(!1),s=o(!1),d=o(``),f=o(null),p=o({}),h=o(null),g=o(``),w=o(!1),T=o(``),E=y(()=>f.value?f.value.tables.reduce((e,t)=>e+t.row_count,0):0);function D(e){return r.has(e)}function O(e,t){return!e||!t?0:Math.max(1,Math.round((t-e)/86400))}async function k(){s.value=!0,d.value=``;try{let e=await R.getDbStats();e.success&&e.data?f.value=e.data:d.value=e.error||`Failed to load database stats`}catch(e){d.value=e instanceof Error?e.message:`Failed to load database stats`}finally{s.value=!1}}function j(e,t){g.value=``,h.value={table:e,rowCount:t,executing:!1}}async function M(){if(!h.value)return;let{table:e}=h.value;h.value.executing=!0,g.value=``;try{let t=e===`all`?`all`:[e];e!==`all`&&(p.value[e]=!0);let n=await R.purgeTable(t);if(n.success){let t=n.data||{};g.value=`Deleted ${Object.values(t).reduce((e,t)=>e+(t.deleted||0),0).toLocaleString()} rows${e===`all`?` from all tables`:` from ${e}`}.`,h.value=null,await k()}else d.value=n.error||`Purge failed`,h.value=null}catch(e){d.value=e instanceof Error?e.message:`Purge failed`,h.value=null}finally{e!==`all`&&(p.value[e]=!1)}}async function N(){w.value=!0,T.value=``,d.value=``;try{let e=await R.vacuumDb();if(e.success&&e.data){let t=e.data.freed_bytes;T.value=t>0?`Compacted database — freed ${Q(t)} (${Q(e.data.size_before)} → ${Q(e.data.size_after)}).`:`Database already compact (${Q(e.data.size_after)}).`,await k()}else d.value=e.error||`Vacuum failed`}catch(e){d.value=e instanceof Error?e.message:`Vacuum failed`}finally{w.value=!1}}return e(k),(e,n)=>(a(),C(`div`,dd,[S(`div`,fd,[n[5]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`Database`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`View database statistics and perform maintenance`)],-1),S(`div`,pd,[S(`button`,{onClick:n[0]||=e=>i.value=!i.value,class:`cfg-btn-primary`},l(i.value?`Lock`:`Unlock`),1)])]),S(`div`,md,[S(`div`,hd,[n[7]||=S(`div`,null,[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},` Database Overview `),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},` Storage usage and table statistics for the repeater database. `)],-1),S(`button`,{onClick:k,disabled:s.value,class:`cfg-btn-secondary`},[s.value?(a(),C(`span`,_d,[v(W,{size:`xs`,color:`current`,class:`inline-block`}),n[6]||=b(` Loading… `,-1)])):(a(),C(`span`,vd,`Refresh`))],8,gd)]),f.value?(a(),C(`div`,yd,[S(`div`,bd,[n[8]||=S(`p`,{class:`text-xs text-content-muted mb-1`},`Database Size`,-1),S(`p`,xd,l(c(Q)(f.value.database_size_bytes)),1)]),S(`div`,Sd,[n[9]||=S(`p`,{class:`text-xs text-content-muted mb-1`},`RRD Metrics`,-1),S(`p`,Cd,l(c(Q)(f.value.rrd_size_bytes)),1)]),S(`div`,wd,[n[10]||=S(`p`,{class:`text-xs text-content-muted mb-1`},`Total Size`,-1),S(`p`,Td,l(c(Q)(f.value.database_size_bytes+f.value.rrd_size_bytes)),1)]),S(`div`,Ed,[n[11]||=S(`p`,{class:`text-xs text-content-muted mb-1`},`Total Rows`,-1),S(`p`,Dd,l(E.value.toLocaleString()),1)])])):_(``,!0),s.value&&!f.value?(a(),C(`div`,Od,[S(`div`,kd,[v(W,{class:`mx-auto mb-4`}),n[12]||=S(`div`,{class:`text-content-secondary dark:text-content-muted`},`Loading database info…`,-1)])])):_(``,!0),d.value?(a(),C(`div`,Ad,[S(`p`,jd,l(d.value),1)])):_(``,!0),f.value&&f.value.tables.length>0?(a(),C(`div`,Md,[S(`div`,Nd,[S(`table`,Pd,[n[14]||=S(`thead`,null,[S(`tr`,{class:`border-b border-stroke-subtle dark:border-stroke/opacity-light`},[S(`th`,{class:`text-left py-2 pr-4 text-xs font-medium text-content-muted uppercase tracking-wider`},` Table `),S(`th`,{class:`text-right py-2 pr-4 text-xs font-medium text-content-muted uppercase tracking-wider`},` Rows `),S(`th`,{class:`text-right py-2 pr-4 text-xs font-medium text-content-muted uppercase tracking-wider hidden sm:table-cell`},` Date Range `),S(`th`,{class:`text-right py-2 text-xs font-medium text-content-muted uppercase tracking-wider`},` Actions `)])],-1),S(`tbody`,null,[(a(!0),C(x,null,t(f.value.tables,e=>(a(),C(`tr`,{key:e.name,class:`border-b border-stroke-subtle/50 dark:border-stroke/opacity-light`},[S(`td`,Fd,[S(`span`,Id,l(e.name),1)]),S(`td`,Ld,[S(`span`,Rd,l(e.row_count.toLocaleString()),1)]),S(`td`,zd,[e.has_timestamp&&e.row_count>0?(a(),C(`span`,Bd,[b(l(c(Z)(e.oldest_timestamp))+` — `+l(c(Z)(e.newest_timestamp))+` `,1),S(`span`,Vd,`(`+l(O(e.oldest_timestamp,e.newest_timestamp))+`d)`,1)])):e.row_count===0?(a(),C(`span`,Hd,`—`)):(a(),C(`span`,Ud,`n/a`))]),S(`td`,Wd,[i.value&&D(e.name)&&e.row_count>0?(a(),C(`button`,{key:0,onClick:t=>j(e.name,e.row_count),disabled:p.value[e.name],class:`px-2.5 py-1 bg-accent-red/opacity-light dark:bg-accent-red/opacity-light hover:bg-accent-red/opacity-medium dark:hover:bg-accent-red/opacity-medium text-accent-red rounded border border-accent-red/opacity-medium dark:border-accent-red/opacity-medium transition-colors text-xs disabled:opacity-50`},[p.value[e.name]?(a(),C(`span`,Kd,[v(W,{size:`xs`,color:`current`,class:`inline-block`}),n[13]||=b(` Purging… `,-1)])):(a(),C(`span`,qd,`Empty`))],8,Gd)):D(e.name)?_(``,!0):(a(),C(`span`,Jd,`—`))])]))),128))])])])])):_(``,!0)]),(a(),u(m,{to:`body`},[h.value?(a(),C(`div`,{key:0,class:`modal-backdrop-heavy`,onClick:n[3]||=A(e=>!h.value.executing&&(h.value=null),[`self`])},[S(`div`,{class:`modal-card max-w-lg`,onClick:n[2]||=A(()=>{},[`stop`])},[S(`div`,Yd,[n[20]||=S(`div`,{class:`flex-shrink-0 w-10 h-10 rounded-full bg-accent-red/opacity-light flex items-center justify-center`},[S(`svg`,{class:`w-5 h-5 text-accent-red`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z`})])],-1),S(`div`,Xd,[S(`h3`,Zd,l(h.value.table===`all`?`Purge All Tables`:`Purge "${h.value.table}"`),1),S(`p`,Qd,[h.value.table===`all`?(a(),C(x,{key:0},[n[15]||=b(` This will permanently delete `,-1),n[16]||=S(`strong`,{class:`text-content-primary`},`all data`,-1),b(` from every data table (`+l(E.value.toLocaleString())+` rows total). This cannot be undone. `,1)],64)):(a(),C(x,{key:1},[n[17]||=b(` This will permanently delete `,-1),S(`strong`,$d,l(h.value.rowCount.toLocaleString())+` rows`,1),n[18]||=b(` from `,-1),S(`strong`,ef,l(h.value.table),1),n[19]||=b(`. This cannot be undone. `,-1)],64))])])]),S(`div`,tf,[S(`button`,{onClick:n[1]||=e=>h.value=null,disabled:h.value.executing,class:`flex-1 px-4 py-3 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light border border-stroke-subtle dark:border-stroke/opacity-medium text-content-primary rounded-lg transition-colors`},` Cancel `,8,nf),S(`button`,{onClick:M,disabled:h.value.executing,class:`flex-1 px-4 py-3 bg-accent-red/opacity-medium hover:bg-accent-red/opacity-medium border border-accent-red/opacity-heavy text-accent-red rounded-lg transition-colors font-medium disabled:opacity-50`},l(h.value.executing?`Purging…`:`Yes, Delete Data`),9,rf)])])])):_(``,!0)])),S(`div`,af,[n[23]||=S(`h3`,{class:`text-lg font-semibold text-content-primary mb-4`},` Maintenance `,-1),S(`div`,of,[S(`button`,{onClick:n[4]||=e=>j(`all`,E.value),disabled:!f.value||E.value===0||!i.value,class:`px-4 py-2 bg-accent-red/opacity-medium dark:bg-accent-red/opacity-medium hover:bg-accent-red/opacity-medium dark:hover:bg-accent-red/opacity-medium text-accent-red rounded-lg border border-accent-red/opacity-heavy dark:border-accent-red/opacity-heavy transition-colors text-sm disabled:opacity-50 disabled:cursor-not-allowed`},[...n[21]||=[S(`span`,{class:`flex items-center gap-2`},[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16`})]),b(` Purge All Data `)],-1)]],8,sf),S(`button`,{onClick:N,disabled:w.value||!f.value,class:`cfg-btn-primary`},[S(`span`,lf,[n[22]||=S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15`})],-1),b(` `+l(w.value?`Compacting…`:`Compact Database`),1)])],8,cf)]),T.value?(a(),C(`p`,uf,l(T.value),1)):_(``,!0),g.value?(a(),C(`p`,df,l(g.value),1)):_(``,!0)])]))}}),pf={class:`space-y-12`},mf={class:`cfg-section`},hf={class:`flex items-start justify-between mb-4`},gf={class:`flex items-center gap-2`},_f=[`disabled`],vf={key:0,class:`flex items-center gap-1.5`},yf={key:1},bf=[`disabled`],xf={key:0,class:`flex items-center gap-1.5`},Sf={key:1},Cf={key:0,class:`mb-4 p-3 rounded-lg bg-accent-red/opacity-light border border-accent-red/opacity-medium text-accent-red text-sm`},wf={key:1,class:`mb-4`},Tf={class:`bg-background-mute dark:bg-background/30 rounded-lg p-3 border border-stroke-subtle dark:border-stroke/opacity-light inline-block`},Ef={class:`text-lg font-semibold text-content-primary font-mono`},Df={key:2,class:`p-4 rounded-lg bg-accent-cyan/opacity-light dark:bg-primary/opacity-light border border-accent-cyan/opacity-medium dark:border-primary/opacity-medium`},Of={key:3},kf=[`innerHTML`],Af={class:`font-semibold text-sm`},jf={class:`text-sm mt-0.5 opacity-80`},Mf={class:`grid grid-cols-2 sm:grid-cols-3 gap-3 mb-6`},Nf={key:0,class:`bg-background-mute dark:bg-background/30 rounded-lg p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},Pf={class:`text-lg font-semibold text-content-primary font-mono`},Ff={key:1,class:`bg-background-mute dark:bg-background/30 rounded-lg p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},If={class:`text-lg font-semibold text-content-primary font-mono`},Lf={key:2,class:`bg-background-mute dark:bg-background/30 rounded-lg p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},Rf={class:`text-lg font-semibold text-content-primary font-mono`},zf={key:0,class:`mb-6`},Bf={class:`space-y-2`},Vf={class:`flex items-start justify-between gap-3`},Hf={class:`flex items-center gap-2 min-w-0`},Uf={class:`shrink-0 text-xs font-medium text-content-muted w-5 text-right`},Wf={class:`text-right shrink-0`},Gf={class:`text-xs text-content-muted`},Kf={class:`mt-1.5 ml-7`},qf={class:`text-xs font-mono text-content-secondary dark:text-content-muted break-all`},Jf={key:0,class:`text-xs text-content-muted mt-0.5`},Yf={key:1,class:`mb-6 p-4 rounded-lg bg-accent-green/opacity-light border border-accent-green/opacity-medium text-sm flex items-center gap-3`},Xf={key:2},Zf={key:0,class:`overflow-x-auto rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light`},Qf={class:`w-full text-sm`},$f={class:`px-3 py-2 text-content-muted font-mono text-xs`},ep={class:`px-3 py-2 text-content-primary font-mono text-xs break-all`},tp={class:`px-3 py-2 text-right font-mono text-xs text-content-secondary dark:text-content-muted whitespace-nowrap`},np={class:`px-3 py-2 text-right font-mono text-xs text-content-secondary dark:text-content-muted`},rp={key:4,class:`py-8 text-center text-content-muted text-sm`},ip=K(f({__name:`MemoryDebug`,setup(n){let i=o(!1),s=o(!1),c=o(``),u=o(null),f=o(!1),m=o(null),h=o(!1),g=y(()=>u.value&&(u.value.current_top_20||u.value.growth_since_baseline));async function w(){i.value=!0,c.value=``;try{let e=await R.get(`memory_debug`);e.success&&e.data?(f.value=!!e.data.tracing,m.value=e.data.rss_mb??null,(e.data.current_top_20||e.data.growth_since_baseline)&&(u.value=e.data)):c.value=e.error||`Failed to fetch memory status`}catch(e){c.value=e instanceof Error?e.message:`Failed to fetch memory status`}finally{i.value=!1}}async function T(){s.value=!0,c.value=``;let e=f.value?`stop`:`start`;try{let t=await R.post(`memory_debug`,{action:e});t.success&&t.data?(f.value=!!t.data.tracing,e===`stop`&&(u.value=null,m.value=null)):c.value=t.error||`Failed to ${e} tracing`}catch(t){c.value=t instanceof Error?t.message:`Failed to ${e} tracing`}finally{s.value=!1,f.value&&await w()}}function E(e){return e.size_diff_kb>=100?`critical`:e.size_diff_kb>=10?`warning`:e.size_diff_kb>=1?`low`:`ok`}function D(e){let t=E(e);return t===`critical`?`Investigate`:t===`warning`?`Watch`:t===`low`?`Minor`:`Normal`}function O(e){let t=E(e);return t===`critical`?`bg-accent-red/opacity-medium text-accent-red border border-accent-red/opacity-medium`:t===`warning`?`bg-accent-amber/opacity-medium text-accent-amber border border-accent-amber/opacity-medium`:t===`low`?`bg-primary/opacity-light text-primary border border-primary/opacity-medium`:`bg-accent-green/opacity-light text-accent-green border border-accent-green/opacity-medium`}function k(e){let t=E(e);return t===`critical`?`border-accent-red/opacity-heavy dark:border-accent-red/opacity-medium bg-accent-red/opacity-light dark:bg-accent-red/opacity-light`:t===`warning`?`border-accent-amber/opacity-heavy dark:border-accent-amber/opacity-medium bg-accent-amber/opacity-light dark:bg-accent-amber/opacity-light`:t===`low`?`border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute/opacity-heavy dark:bg-background/20`:`border-stroke-subtle/50 dark:border-stroke/opacity-light bg-background-mute/opacity-medium dark:bg-background/10 opacity-60`}function A(e){let t=E(e);return t===`critical`?`text-accent-red`:t===`warning`?`text-accent-amber`:t===`low`?`text-primary`:`text-accent-green`}function j(e){return e>=1024?`${(e/1024).toFixed(1)} MB`:e>=10?`${Math.round(e)} KB`:`${e.toFixed(1)} KB`}function M(e){return e.replace(/.*\/site-packages\//,``).replace(/.*\/lib\/python[^/]*\//,``).replace(/.*\/repeater\//,`repeater/`)}let P=y(()=>u.value?.growth_since_baseline?u.value.growth_since_baseline.reduce((e,t)=>e+t.size_diff_kb,0):0),F=y(()=>P.value>=500?`critical`:P.value>=50?`warning`:P.value>=5?`low`:`ok`),I=y(()=>{let e=F.value;return e===`critical`?`border-accent-red/opacity-heavy dark:border-accent-red/opacity-medium bg-accent-red/opacity-light dark:bg-accent-red/opacity-light text-accent-red`:e===`warning`?`border-accent-amber/opacity-heavy dark:border-accent-amber/opacity-medium bg-accent-amber/opacity-light dark:bg-accent-amber/opacity-light text-accent-amber`:e===`low`?`border-primary/opacity-medium bg-primary/opacity-light dark:bg-primary/opacity-light text-primary`:`border-accent-green/opacity-medium bg-accent-green/opacity-light dark:bg-accent-green/opacity-light text-accent-green`}),L=y(()=>{let e=F.value;return e===`critical`?``:e===`warning`?``:e===`low`?``:``}),z=y(()=>{let e=F.value;return e===`critical`?`Significant memory growth detected`:e===`warning`?`Some memory growth detected`:e===`low`?`Minor memory growth — likely normal`:`Memory looks healthy`}),B=y(()=>{let e=j(P.value),t=F.value;return t===`critical`?`Total growth: ${e}. Red items below need attention.`:t===`warning`?`Total growth: ${e}. Orange items below may need attention over time.`:t===`low`?`Total growth: ${e}. Nothing to worry about right now.`:`No significant growth since tracing started.`});return e(w),(e,n)=>(a(),C(`div`,pf,[n[15]||=S(`div`,{class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},[S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`Memory`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Diagnose memory usage and trace allocations`)])],-1),S(`div`,mf,[S(`div`,hf,[n[2]||=S(`div`,null,[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},` Memory Diagnostics `),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},` Trace memory allocations to find leaks. Tracing adds overhead — only enable when needed. `)],-1),S(`div`,gf,[f.value&&g.value?(a(),C(`button`,{key:0,onClick:w,disabled:i.value,class:`cfg-btn-secondary`},[i.value?(a(),C(`span`,vf,[v(W,{size:`xs`,color:`current`,class:`inline-block`}),n[1]||=b(` Checking… `,-1)])):(a(),C(`span`,yf,`Check Again`))],8,_f)):_(``,!0),S(`button`,{onClick:T,disabled:s.value,class:p([`px-3 py-1.5 rounded-lg border text-sm transition-colors disabled:opacity-50`,f.value?`bg-accent-red/opacity-medium hover:bg-accent-red/opacity-medium text-accent-red border-accent-red/opacity-heavy`:`bg-accent-green/opacity-medium hover:bg-accent-green/opacity-medium text-accent-green border-accent-green/opacity-heavy`])},[s.value?(a(),C(`span`,xf,[v(W,{size:`xs`,color:`current`,class:`inline-block`}),b(` `+l(f.value?`Stopping…`:`Starting…`),1)])):(a(),C(`span`,Sf,l(f.value?`Stop Tracing`:`Start Tracing`),1))],10,bf)])]),c.value?(a(),C(`div`,Cf,l(c.value),1)):_(``,!0),!f.value&&m.value!==null&&!i.value?(a(),C(`div`,wf,[S(`div`,Tf,[n[3]||=S(`p`,{class:`text-xs text-content-muted mb-1`},`Current Memory (RSS)`,-1),S(`p`,Ef,l(m.value)+` MB`,1)])])):_(``,!0),f.value&&!g.value&&!i.value?(a(),C(`div`,Df,[...n[4]||=[d(`
Tracing active

Memory tracing is running. Let the repeater run for a few minutes, then click Check Again to see which parts of the code are using more memory.

`,2)]])):_(``,!0),u.value&&g.value?(a(),C(`div`,Of,[S(`div`,{class:p([`mb-5 p-4 rounded-lg border flex items-start gap-3`,I.value])},[S(`div`,{class:`mt-0.5`,innerHTML:L.value},null,8,kf),S(`div`,null,[S(`p`,Af,l(z.value),1),S(`p`,jf,l(B.value),1)])],2),S(`div`,Mf,[u.value.rss_mb===void 0?_(``,!0):(a(),C(`div`,Nf,[n[5]||=S(`p`,{class:`text-xs text-content-muted mb-1`},`Total Memory Used`,-1),S(`p`,Pf,l(u.value.rss_mb)+` MB`,1)])),u.value.traced_current_mb===void 0?_(``,!0):(a(),C(`div`,Ff,[n[6]||=S(`p`,{class:`text-xs text-content-muted mb-1`},`Tracked Now`,-1),S(`p`,If,l(u.value.traced_current_mb)+` MB`,1)])),u.value.traced_peak_mb===void 0?_(``,!0):(a(),C(`div`,Lf,[n[7]||=S(`p`,{class:`text-xs text-content-muted mb-1`},`Peak Tracked`,-1),S(`p`,Rf,l(u.value.traced_peak_mb)+` MB`,1)]))]),u.value.growth_since_baseline&&u.value.growth_since_baseline.length>0?(a(),C(`div`,zf,[n[8]||=S(`h4`,{class:`text-sm font-semibold text-content-primary mb-1`},`Memory Growth Breakdown`,-1),n[9]||=S(`p`,{class:`text-xs text-content-muted mb-3`},` Items at the top with red/orange tags are the most likely cause of memory issues. Green items are normal and can be ignored. `,-1),S(`div`,Bf,[(a(!0),C(x,null,t(u.value.growth_since_baseline,(e,t)=>(a(),C(`div`,{key:t,class:p([`rounded-lg border p-3 transition-colors`,k(e)])},[S(`div`,Vf,[S(`div`,Hf,[S(`span`,Uf,l(t+1),1),S(`span`,{class:p([`shrink-0 inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-semibold`,O(e)])},l(D(e)),3)]),S(`div`,Wf,[S(`span`,{class:p([`font-mono text-sm font-semibold`,A(e)])},`+`+l(j(e.size_diff_kb)),3),S(`p`,Gf,l(j(e.current_size_kb))+` total`,1)])]),S(`div`,Kf,[S(`p`,qf,l(M(e.file)),1),e.count_diff===0?_(``,!0):(a(),C(`p`,Jf,l(e.count_diff>0?`+`:``)+l(e.count_diff)+` new allocation`+l(Math.abs(e.count_diff)===1?``:`s`),1))])],2))),128))])])):u.value.growth_since_baseline&&u.value.growth_since_baseline.length===0?(a(),C(`div`,Yf,[...n[10]||=[S(`svg`,{class:`w-5 h-5 text-accent-green shrink-0`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z`})],-1),S(`span`,{class:`text-accent-green`},`No memory growth detected. Everything looks healthy.`,-1)]])):_(``,!0),u.value.current_top_20&&u.value.current_top_20.length>0?(a(),C(`div`,Xf,[S(`button`,{onClick:n[0]||=e=>h.value=!h.value,class:`flex items-center gap-2 text-sm font-semibold text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary transition-colors mb-3`},[(a(),C(`svg`,{class:p([`w-4 h-4 transition-transform`,{"rotate-90":h.value}]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...n[11]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 5l7 7-7 7`},null,-1)]],2)),n[12]||=b(` Advanced: Current Top Allocations `,-1)]),v(N,{name:`expand`},{default:r(()=>[h.value?(a(),C(`div`,Zf,[S(`table`,Qf,[n[13]||=S(`thead`,null,[S(`tr`,{class:`bg-background-mute dark:bg-background/30 text-left`},[S(`th`,{class:`px-3 py-2 text-xs font-medium text-content-muted`},`#`),S(`th`,{class:`px-3 py-2 text-xs font-medium text-content-muted`},`Location`),S(`th`,{class:`px-3 py-2 text-xs font-medium text-content-muted text-right`},`Size`),S(`th`,{class:`px-3 py-2 text-xs font-medium text-content-muted text-right`},`Count`)])],-1),S(`tbody`,null,[(a(!0),C(x,null,t(u.value.current_top_20,(e,t)=>(a(),C(`tr`,{key:t,class:`border-t border-stroke-subtle/50 dark:border-stroke/opacity-light hover:bg-background-mute/opacity-heavy dark:hover:bg-background/20 transition-colors`},[S(`td`,$f,l(t+1),1),S(`td`,ep,l(M(e.file)),1),S(`td`,tp,l(j(e.size_kb)),1),S(`td`,np,l(e.count),1)]))),128))])])])):_(``,!0)]),_:1})])):_(``,!0)])):_(``,!0),!i.value&&!s.value&&!f.value&&!g.value&&!c.value&&m.value===null?(a(),C(`div`,rp,[...n[14]||=[b(` Click `,-1),S(`strong`,null,`Start Tracing`,-1),b(` to enable memory diagnostics. `,-1),S(`br`,null,null,-1),S(`span`,{class:`text-xs`},`Tracing uses extra memory — remember to stop it when done.`,-1)]])):_(``,!0)])]))}}),[[`__scopeId`,`data-v-5bf02bea`]]),ap={class:`space-y-6`},op={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},sp={class:`flex items-center gap-2 flex-shrink-0`},cp=[`disabled`],lp=[`disabled`],up=[`disabled`],dp={key:0,class:`alert-error`},fp={key:1,class:`alert-success`},pp={key:2,class:`bg-primary/opacity-light border border-primary/opacity-medium rounded-lg p-3 text-primary text-sm`},mp={key:3,class:`flex items-center justify-center py-10`},hp={class:`cfg-section`},gp={class:`flex flex-wrap items-center gap-2`},_p={key:0,class:`space-y-4`},vp={class:`cfg-section space-y-4`},yp={class:`grid grid-cols-1 xl:grid-cols-2 gap-4 items-stretch`},bp={class:`rounded-xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle px-4 py-4 flex items-center justify-between gap-4`},xp={class:`inline-flex items-center gap-3 rounded-full border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-main dark:bg-surface-900 px-3 py-2 text-sm font-medium text-content-primary shadow-sm`},Sp=[`disabled`],Cp={class:`rounded-xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle px-4 py-4 flex flex-col justify-between gap-3`},wp=[`disabled`],Tp=[`value`],Ep={class:`space-y-3`},Dp={class:`flex flex-wrap items-center justify-between gap-2`},Op={class:`flex items-center gap-2`},kp=[`disabled`],Ap=[`disabled`],jp={class:`overflow-x-auto rounded-2xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-main dark:bg-surface-900 shadow-sm`},Mp={class:`w-full min-w-[980px] table-fixed text-sm`},Np={class:`px-3 py-3 text-xs font-medium text-content-secondary`},Pp={class:`px-3 py-3`},Fp=[`title`],Ip={class:`px-3 py-3 text-content-primary`},Lp=[`title`],Rp={class:`px-3 py-3 text-xs text-content-secondary`},zp=[`title`],Bp={class:`px-3 py-3`},Vp=[`title`],Hp={class:`px-3 py-3 text-right`},Up={class:`inline-flex flex-wrap items-center justify-end gap-1`},Wp=[`disabled`,`onClick`],Gp=[`disabled`,`onClick`],Kp=[`disabled`,`onClick`],qp=[`disabled`,`onClick`],Jp={key:0},Yp={key:0,class:`space-y-2`},Xp=[`disabled`],Zp={class:`flex justify-end`},Qp=[`disabled`],$p={class:`flex flex-wrap items-center gap-2 justify-end`},em=[`disabled`],tm={key:1,class:`space-y-4`},nm={class:`cfg-section`},rm={class:`flex flex-wrap items-center gap-2`},im={class:`grid grid-cols-1 lg:grid-cols-12 gap-4`},am={class:`cfg-section lg:col-span-4 space-y-4`},om={class:`flex items-center justify-between`},sm={class:`text-xs text-content-muted`},cm={class:`space-y-2 max-h-[360px] overflow-auto pr-1`},lm=[`onClick`],um={class:`flex items-start justify-between gap-2`},dm={class:`text-sm font-medium text-content-primary`},fm={class:`text-xs text-content-muted mt-1`},pm={class:`text-[11px] text-content-muted`},mm={key:0,class:`text-xs text-content-muted py-8 text-center border border-dashed border-stroke-subtle dark:border-stroke/opacity-medium rounded-lg`},hm={class:`pt-2 border-t border-stroke-subtle dark:border-stroke/opacity-medium space-y-2`},gm=[`disabled`],_m=[`disabled`],vm=[`disabled`],ym={class:`cfg-section lg:col-span-8 space-y-4`},bm={class:`flex items-center justify-between`},xm={class:`text-sm font-semibold text-content-primary`},Sm=[`disabled`],Cm={key:0,class:`overflow-x-auto rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium`},wm={class:`w-full text-sm`},Tm={class:`px-3 py-2 text-content-primary`},Em={class:`px-3 py-2 font-mono text-xs text-content-secondary`},Dm={class:`px-3 py-2 text-right`},Om=[`disabled`,`onClick`],km={key:0},Am={key:1,class:`text-xs text-content-muted py-8 text-center border border-dashed border-stroke-subtle dark:border-stroke/opacity-medium rounded-lg`},jm={key:2,class:`pt-2 border-t border-stroke-subtle dark:border-stroke/opacity-medium space-y-2`},Mm={class:`grid grid-cols-1 md:grid-cols-2 gap-2`},Nm=[`disabled`],Pm=[`disabled`,`placeholder`],Fm=[`disabled`],Im={class:`bg-surface dark:bg-surface-elevated border border-stroke-subtle dark:border-stroke/opacity-medium rounded-[15px] p-5 max-w-5xl w-full max-h-[90vh] overflow-y-auto shadow-2xl space-y-4`},Lm={class:`flex items-start justify-between gap-3`},Rm={class:`text-lg font-semibold text-content-primary`},zm={class:`text-xs text-content-muted mt-1`},Bm={class:`flex items-center gap-2`},Vm={key:0,class:`rounded-lg border border-primary/opacity-medium bg-primary/opacity-light p-3 space-y-2`},Hm={class:`flex items-center justify-between`},Um={class:`overflow-x-auto rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium`},Wm={class:`w-full min-w-[840px] text-xs`},Gm={class:`px-2 py-1.5`},Km={class:`px-2 py-1.5`},qm={class:`px-2 py-1.5`},Jm={class:`px-2 py-1.5`},Ym={key:1,class:`bg-accent-red/opacity-light border border-accent-red/opacity-medium rounded-lg p-2 text-accent-red text-xs`},Xm={class:`grid grid-cols-1 md:grid-cols-4 gap-3`},Zm={class:`md:col-span-2`},Qm=[`value`],$m={class:`inline-flex items-center gap-2 text-sm text-content-primary`},eh={class:`space-y-2`},th={key:0,class:`rounded-lg border border-accent-amber/opacity-medium bg-accent-amber/opacity-light px-3 py-2 text-xs text-accent-amber`},nh={class:`overflow-x-auto rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium`},rh={class:`w-full min-w-[980px] text-sm`},ih={class:`bg-background-mute dark:bg-white/opacity-subtle`},ah={key:0,class:`px-2 py-2 text-left text-xs font-semibold uppercase tracking-wide text-content-muted`},oh=[`onDragover`],sh={class:`px-2 py-2 w-[58px]`},ch=[`onDragstart`],lh={class:`px-2 py-2 min-w-[170px]`},uh=[`onUpdate:modelValue`,`onChange`],dh=[`value`],fh={class:`px-2 py-2 min-w-[160px]`},ph=[`onUpdate:modelValue`],mh=[`value`],hh={key:0,class:`px-2 py-2 min-w-[140px]`},gh=[`onUpdate:modelValue`,`disabled`],_h={key:0,value:`group`},vh={class:`px-2 py-2 min-w-[230px]`},yh={key:0,class:`grid grid-cols-2 gap-1`},bh=[`onUpdate:modelValue`],xh=[`value`],Sh=[`onUpdate:modelValue`],Ch=[`value`],wh={key:1,class:`space-y-1`},Th=[`onChange`],Eh=[`value`],Dh=[`onUpdate:modelValue`,`placeholder`],Oh=[`onUpdate:modelValue`,`placeholder`],kh={key:3,class:`text-[11px] text-content-muted`},Ah={class:`px-2 py-2 min-w-[110px]`},jh=[`onUpdate:modelValue`,`disabled`],Mh=[`value`],Nh={class:`px-2 py-2 text-right`},Ph={class:`inline-flex items-center gap-1`},Fh=[`disabled`,`onClick`],Ih=[`disabled`,`onClick`],Lh=[`onClick`],Rh=[`colspan`],zh=f({name:`PolicyEngineSettings`,__name:`PolicyEngineSettings`,setup(n,{expose:r}){let s=o(!1),u=o(!1),d=o(!1),f=o(null),m=o(null),g=null,w=o(`policy`),T=o({enabled:!1,default_action:`allow`,rules:[],objects:{}}),E=o({channel_hashes:[],pubkeys:[]}),O=o({enabled:!1,default_action:`allow`,rules:[],objects:{}}),k=o({channel_hashes:[],pubkeys:[]}),N=o(`[]`),P=o(!1),F=o([]),I=o(null),L=o(!1),z=o(null),B=o(null),ee=o(null),V=o(!1),H=o(null),U=o(null),G=o(`channel_hashes`),K=o(``),te=o({friendly_name:``,description:``}),q=o({friendly_name:``,value:``}),ne=[{label:`Allow`,value:`allow`},{label:`Drop`,value:`drop`},{label:`Log Only`,value:`log_only`}],re=[{label:`Equals`,value:`equals`},{label:`Not Equals`,value:`not_equals`},{label:`Greater Than`,value:`greater_than`},{label:`Greater or Equal`,value:`greater_or_equal`},{label:`Less Than`,value:`less_than`},{label:`Less or Equal`,value:`less_or_equal`},{label:`Contains`,value:`contains`},{label:`In List`,value:`in`},{label:`Intersects`,value:`intersects`},{label:`Starts With`,value:`starts_with`},{label:`Ends With`,value:`ends_with`}],ie=[{value:`route_type`,label:`Route Type`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`less_than`]},{value:`payload_type`,label:`Payload Type`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`less_than`]},{value:`payload_length`,label:`Payload Length`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`greater_or_equal`,`less_than`,`less_or_equal`]},{value:`path_hash_size`,label:`Path Hash Size`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`less_than`]},{value:`hop_count`,label:`Hop Count`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`greater_or_equal`,`less_than`,`less_or_equal`]},{value:`rssi`,label:`RSSI`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`greater_or_equal`,`less_than`,`less_or_equal`]},{value:`snr`,label:`SNR`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`greater_or_equal`,`less_than`,`less_or_equal`]},{value:`mode`,label:`Mode`,valueTypes:[`string`],operators:[`equals`,`not_equals`,`in`]},{value:`local_transmission`,label:`Local Transmission`,valueTypes:[`boolean`],operators:[`equals`,`not_equals`]},{value:`path_hashes`,label:`Path Hashes`,valueTypes:[`string`],operators:[`contains`,`intersects`]},{value:`channel_hash`,label:`Channel Hash`,valueTypes:[`string`],operators:[`equals`,`not_equals`,`in`],groupKinds:[`channel_hashes`]},{value:`channel_decryptable`,label:`Channel Decryptable`,valueTypes:[`boolean`],operators:[`equals`,`not_equals`]},{value:`channel_message_body`,label:`Channel Message Body`,valueTypes:[`string`],operators:[`contains`,`starts_with`,`ends_with`,`equals`,`not_equals`]},{value:`payload_hex`,label:`Payload Hex`,valueTypes:[`string`],operators:[`contains`,`starts_with`,`ends_with`,`equals`,`not_equals`]},{value:`transport_code_0`,label:`Transport Code 0`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`less_than`]},{value:`transport_code_1`,label:`Transport Code 1`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`less_than`]}],J=y(()=>{let e={};for(let t of ie)e[t.value]=t;return e}),Y=y(()=>ie.some(e=>Array.isArray(e.groupKinds)&&e.groupKinds.length>0)),X=y(()=>Y.value?8:7);function Z(e){return JSON.parse(JSON.stringify(e))}function Q(e,t){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,`_`).replace(/^_+|_+$/g,``)||t}function ae(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}_${n}`);)n+=1;return`${e}_${n}`}function oe(e){O.value=Z(e.policy_engine),k.value=Z(e.groups)}function se(){T.value=Z(O.value),E.value=Z(k.value),N.value=JSON.stringify(T.value.rules,null,2),F.value=T.value.rules.map((e,t)=>qe(e,t))}function $(){f.value=null,m.value=null,I.value=null,u.value=!0}function ce(e){f.value=e,g&&clearTimeout(g),g=setTimeout(()=>{f.value=null,g=null},3e3)}function le(){se(),u.value=!1,f.value=null,m.value=null,I.value=null,te.value={friendly_name:``,description:``},q.value={friendly_name:``,value:``},at()}function ue(e){return{channel_hash_groups:Object.fromEntries(e.channel_hashes.map(e=>[e.id,e.entries.map(e=>e.value)])),pubkey_groups:Object.fromEntries(e.pubkeys.map(e=>[e.id,e.entries.map(e=>e.value)]))}}function de(){return{...Z(T.value.objects||{}),...ue(E.value)}}let{showUnsavedModal:me,requestLeave:he,handleDiscard:ge,handleSave:_e,handleCancel:ve}=pe(u,d,le,async()=>xt());r({requestLeave:he,isEditing:u});function ye(e,t){let n=e instanceof Error?e.message:t;return n.includes(`404`)?`Policy API not available on the connected backend. Update/restart openHop Repeater so /api/policy, /api/policy_groups, and /api/policy_group_entries are exposed.`:n||t}let be=y(()=>E.value[G.value]??[]),xe=y(()=>be.value.find(e=>e.id===K.value)??null);h([G,be],()=>{if(!be.value.length){K.value=``;return}be.value.find(e=>e.id===K.value)||(K.value=be.value[0].id)});function Se(e){return J.value[e]?.label||e}function Ce(e){return re.find(t=>t.value===e)?.label||e}function we(e){return J.value[e]?.operators||[`equals`,`not_equals`]}function Te(e){return J.value[e]?.valueTypes||[`string`]}function Ee(e){return J.value[e]?.groupKinds||[]}function De(e){return e&&E.value[e]||[]}function Oe(e){return Ee(e).length>0}function ke(e){if(e.valueType===`boolean`)return[{label:`true`,value:`true`},{label:`false`,value:`false`}];switch(e.field){case`mode`:return[{label:`Forward`,value:`forward`},{label:`Monitor`,value:`monitor`},{label:`No TX`,value:`no_tx`}];case`route_type`:return[{label:`0 - Transport Flood`,value:`0`},{label:`1 - Flood`,value:`1`},{label:`2 - Direct`,value:`2`},{label:`3 - Transport Direct`,value:`3`}];case`path_hash_size`:return[{label:`1 byte`,value:`1`},{label:`2 bytes`,value:`2`},{label:`3 bytes`,value:`3`}];case`payload_type`:return[{label:`0 - REQ`,value:`0`},{label:`1 - RESPONSE`,value:`1`},{label:`2 - TXT_MSG`,value:`2`},{label:`3 - ACK`,value:`3`},{label:`4 - ADVERT`,value:`4`},{label:`5 - GRP_TXT`,value:`5`},{label:`6 - GRP_DATA`,value:`6`},{label:`7 - ANON_REQ`,value:`7`},{label:`8 - PATH`,value:`8`},{label:`9 - TRACE`,value:`9`},{label:`10 - MULTIPART`,value:`10`},{label:`15 - RAW_CUSTOM`,value:`15`}];default:return[]}}function Ae(e,t){t&&(e.value=t)}function je(e){return e===`path_hashes`}function Me(e){return e===`channel_hash`}function Ne(e){let t=e.trim();if(!t)throw Error(`Channel hash value is required`);let n=t.replace(/^0x/i,``);if(/^[0-9a-fA-F]+$/.test(n)){if(n.length%2!=0)throw Error(`Channel hash/secret must have an even number of hex characters.`);return n.length===32||n.length===64?`0x${n.toUpperCase()}`:n.length<=2?`0x${Number.parseInt(n,16).toString(16).toUpperCase().padStart(2,`0`)}`:`0x${n.toUpperCase()}`}let r;if(/^[0-9]+$/.test(t))r=Number.parseInt(t,10);else throw Error(`Invalid channel hash value: ${e}`);if(!Number.isFinite(r)||Number.isNaN(r)||r<0)throw Error(`Invalid channel hash value: ${e}`);if(r>255)throw Error(`Decimal channel hash must be within 0-255. Use hex secret key for full channel keys.`);return`0x${r.toString(16).toUpperCase().padStart(2,`0`)}`}function Pe(e){let t=e.trim();if(!t)throw Error(`Path hash value is required`);let n=t.replace(/^0x/i,``);if(!n)throw Error(`Path hash value is required`);if(!/^[0-9a-fA-F]+$/.test(n))throw Error(`Invalid path hash value: ${e}`);if(n.length%2!=0)throw Error(`Path hash must have an even number of hex characters: ${e}`);if(![2,4,6].includes(n.length))throw Error(`Path hash must be 1, 2, or 3 bytes: ${e}`);return`0x${n.toUpperCase()}`}function Fe(e){let t=e.split(/[\s,]+/).map(e=>e.trim()).filter(Boolean);if(!t.length)throw Error(`At least one path hash is required`);let n=t.map(Pe);if(new Set(n.map(e=>e.replace(/^0x/i,``).length)).size>1)throw Error(`Path hashes in one condition must all use the same byte length.`);return n}function Ie(e,t){return je(e)&&Array.isArray(t)?t.map(e=>Pe(String(e))).join(` +import{C as e,D as t,M as n,N as r,P as i,T as a,U as o,V as s,X as c,_t as l,c as u,f as d,h as f,ht as p,i as m,j as h,k as g,l as _,m as v,o as y,p as b,r as x,s as S,u as C,w,x as T,y as E}from"./runtime-core.esm-bundler-CINEgm0a.js";import{a as D,c as O,i as k,l as A,o as j,r as M,t as N}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{g as P,h as F,m as I,p as L,t as R,v as z,y as B}from"./api-EpLa-SS4.js";import{t as ee}from"./system-CuO1gaHr.js";import{t as V}from"./dataService-C8lExiaM.js";import{n as H,t as U}from"./TxPowerNoticeModal-qNJ1X_8Q.js";import{t as W}from"./Spinner-CMJUE3iy.js";import{c as G,d as K,r as te,s as q}from"./index-DF5glAZc.js";import{t as ne}from"./ConfirmDialog-Dl1jglkT.js";import{t as re}from"./LocationPicker-DEowGt6S.js";import{n as ie,t as J}from"./CopyLabel-7zw0wWsl.js";import{c as Y,d as X,n as Z,t as Q}from"./formatters-DVmMQB0F.js";var ae={key:0,class:`modal-backdrop`},oe={class:`modal-card max-w-md`},se={class:`flex items-start gap-3 mb-4`},$={class:`mt-1 text-sm text-content-secondary dark:text-content-muted`},ce={class:`modal-actions`},le=[`disabled`],ue=[`disabled`],de=[`disabled`],fe=f({__name:`UnsavedChangesModal`,props:{show:{type:Boolean},isSaving:{type:Boolean},label:{}},emits:[`discard`,`save`,`cancel`],setup(e){return(t,n)=>(a(),u(m,{to:`body`},[v(N,{"enter-active-class":`transition-opacity duration-200`,"enter-from-class":`opacity-0`,"leave-active-class":`transition-opacity duration-200`,"leave-to-class":`opacity-0`},{default:r(()=>[e.show?(a(),C(`div`,ae,[S(`div`,oe,[S(`div`,se,[n[4]||=S(`div`,{class:`flex-shrink-0 w-10 h-10 rounded-full bg-accent-amber/opacity-light dark:bg-accent-amber/opacity-medium flex items-center justify-center`},[S(`svg`,{class:`w-5 h-5 text-accent-amber`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z`})])],-1),S(`div`,null,[n[3]||=S(`h3`,{class:`text-base font-semibold text-content-primary`},` Unsaved Changes `,-1),S(`p`,$,l(e.label?e.label:`Settings`)+` have not been saved. What would you like to do? `,1)])]),S(`div`,ce,[S(`button`,{onClick:n[0]||=e=>t.$emit(`cancel`),disabled:e.isSaving,class:`modal-btn-cancel`},` Keep Editing `,8,le),S(`button`,{onClick:n[1]||=e=>t.$emit(`discard`),disabled:e.isSaving,class:`modal-btn-danger`},` Discard `,8,ue),S(`button`,{onClick:n[2]||=e=>t.$emit(`save`),disabled:e.isSaving,class:`modal-btn-primary`},l(e.isSaving?`Saving…`:`Save Settings`),9,de)])])])):_(``,!0)]),_:1})]))}});function pe(e,t,n,r){let i=o(!1),a=o(null),s=o(null);L((t,n,r)=>{e.value?(i.value=!0,a.value=()=>r(),s.value=()=>r(!1)):r()});function c(t){e.value?(i.value=!0,a.value=t,s.value=null):t()}function l(){n(),i.value=!1,s.value=null,a.value&&=(a.value(),null)}async function u(){await r()&&(i.value=!1,s.value=null,a.value&&=(a.value(),null))}function d(){i.value=!1,s.value&&=(s.value(),null),a.value=null}return{showUnsavedModal:i,requestLeave:c,handleDiscard:l,handleSave:u,handleCancel:d}}var me={class:`space-y-12`},he={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},ge={class:`flex items-center gap-2 shrink-0`},_e=[`disabled`],ve=[`disabled`],ye={key:0,class:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium border border-accent-red/opacity-heavy rounded-lg p-3`},be={class:`text-accent-red text-sm`},xe={class:`cfg-section space-y-3`},Se={class:`w-full max-w-3xl rounded-3xl border border-stroke-subtle dark:border-white/opacity-light bg-white dark:bg-surface-elevated shadow-[0_20px_80px_color-mix(in_srgb,var(--color-shadow-strong)_35%,transparent)] overflow-hidden`},Ce={class:`flex items-start justify-between gap-3 p-5 border-b border-stroke-subtle dark:border-white/opacity-light`},we={class:`p-5`},Te={class:`space-y-2 max-h-[60vh] overflow-y-auto pr-1`},Ee=[`onClick`],De={class:`min-w-0`},Oe={class:`flex flex-wrap items-center gap-2`},ke={class:`text-content-primary font-semibold text-sm truncate`},Ae={key:0,class:`inline-flex items-center rounded-full bg-primary/opacity-light text-primary text-[10px] font-semibold px-2 py-0.5`},je={class:`text-content-secondary dark:text-content-muted text-xs mt-1 line-clamp-2`},Me={class:`flex flex-wrap justify-end gap-2 shrink-0 text-[11px] font-mono`},Ne={class:`rounded-full bg-background-mute dark:bg-black/opacity-medium px-2 py-1 text-content-secondary dark:text-content-muted`},Pe={class:`rounded-full bg-background-mute dark:bg-black/opacity-medium px-2 py-1 text-content-secondary dark:text-content-muted`},Fe={class:`rounded-full bg-background-mute dark:bg-black/opacity-medium px-2 py-1 text-content-secondary dark:text-content-muted`},Ie={class:`rounded-full bg-background-mute dark:bg-black/opacity-medium px-2 py-1 text-content-secondary dark:text-content-muted`},Le={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Re={key:0,class:`text-content-primary font-mono text-sm`},ze={key:1,class:`flex items-center gap-2`},Be={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Ve={key:0,class:`text-content-primary font-mono text-sm`},He={key:1},Ue=[`value`],We={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Ge={key:0,class:`text-content-primary font-mono text-sm`},Ke={key:1},qe=[`value`],Je={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Ye={key:0,class:`text-content-primary font-mono text-sm`},Xe={key:1,class:`flex items-center gap-2`},Ze={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Qe={key:0,class:`text-content-primary font-mono text-sm`},$e={key:1},et={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 gap-1`},tt={class:`text-content-primary font-mono text-sm`},nt={class:`cfg-section space-y-3`},rt={class:`flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},it={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},at={class:`text-content-primary font-mono text-sm`},ot={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 gap-1`},st={class:`text-content-primary font-mono text-sm`},ct=f({__name:`RadioSettings`,setup(e,{expose:n}){let s=P(),u=ee(),d=V(),f=H(),m=y(()=>u.stats?.config?.radio||{}),g=y(()=>u.stats?.config?.radio?.cad??{}),b=o(!1),w=o(!1),T=o(null),E=o(!1),O=o(``),k=o(!1),M=o(!1),F=o(!1),I=o(0),L=o(0),z=o(0),B=o(0),W=o(0),G=o(0),K=o(0),q=[{value:7.8,label:`7.8 kHz`},{value:10.4,label:`10.4 kHz`},{value:15.6,label:`15.6 kHz`},{value:20.8,label:`20.8 kHz`},{value:31.25,label:`31.25 kHz`},{value:41.7,label:`41.7 kHz`},{value:62.5,label:`62.5 kHz`},{value:125,label:`125 kHz`},{value:250,label:`250 kHz`},{value:500,label:`500 kHz`}];h(m,e=>{e&&!b.value&&(L.value=e.frequency?Number((e.frequency/1e6).toFixed(3)):0,z.value=e.spreading_factor??0,B.value=e.bandwidth?Number((e.bandwidth/1e3).toFixed(1)):0,W.value=e.tx_power??0,G.value=e.coding_rate??0,K.value=e.preamble_length??0)},{immediate:!0});let ne=y(()=>{let e=m.value.frequency;return e?(e/1e6).toFixed(3)+` MHz`:`Not set`}),re=y(()=>{let e=m.value.bandwidth;return e?(e/1e3).toFixed(1)+` kHz`:`Not set`}),ie=y(()=>{let e=m.value.tx_power;return e===void 0?`Not set`:e+` dBm`}),J=y(()=>{let e=m.value.coding_rate;return e?`4/`+e:`Not set`}),Y=y(()=>{let e=m.value.preamble_length;return e?e+` symbols`:`Not set`}),X=y(()=>m.value.spreading_factor??`Not set`),Z=async()=>{f.radioPresets.length===0&&await f.fetchRadioPresets(),b.value=!0,T.value=null,F.value=!1,I.value=W.value},Q=e=>{L.value=e.frequency?Number(Number(e.frequency).toFixed(3)):0,z.value=e.spreading_factor?Number(e.spreading_factor):0,B.value=e.bandwidth?Number(Number(e.bandwidth).toFixed(1)):0,G.value=e.coding_rate?Number(e.coding_rate):0},ae=e=>e.frequency?`${Number(e.frequency).toFixed(3)} MHz`:`Not set`,oe=e=>e.bandwidth?`${Number(e.bandwidth).toFixed(1)} kHz`:`Not set`,se=e=>e.spreading_factor||`Not set`,$=e=>e.coding_rate?`4/${e.coding_rate}`:`Not set`,ce=()=>{T.value=null;let e=f.radioPresets.find(e=>e.title===O.value);e&&Q(e)};h(O,e=>{!b.value||!e||ce()});let le=e=>{O.value=e;let t=f.radioPresets.find(t=>t.title===e);t&&(Q(t),k.value=!1)},ue=()=>{b.value=!1,T.value=null,O.value=``,k.value=!1,M.value=!1,F.value=!1;let e=m.value;L.value=e.frequency?Number((e.frequency/1e6).toFixed(3)):0,z.value=e.spreading_factor??0,B.value=e.bandwidth?Number((e.bandwidth/1e3).toFixed(1)):0,W.value=e.tx_power??0,G.value=e.coding_rate??0,K.value=e.preamble_length??0},de=async({silent:e=!1}={})=>{w.value=!0,T.value=null;try{if(W.value<-9||W.value>22)return T.value=`TX Power must be between -9 and +22 dBm for SX1262`,!1;let t={};L.value&&(t.frequency=L.value*1e6),z.value&&(t.spreading_factor=z.value),B.value&&(t.bandwidth=B.value*1e3),(W.value||W.value===0)&&(t.tx_power=W.value),G.value&&(t.coding_rate=G.value);let n=(await R.post(`/update_radio_config`,t)).data;if(n.message||n.persisted)return b.value=!1,F.value=!1,await u.fetchStats(),d.invalidate(`radioConfig`),e||(E.value=!0),!0;n.error?T.value=n.error:T.value=`Unknown response from server`}catch(e){console.error(`Failed to update radio settings:`,e),T.value=e.response?.data?.error||`Failed to update settings`}finally{w.value=!1}return!1},ct=y(()=>W.value!==I.value),lt=async({silent:e=!1}={})=>b.value&&ct.value&&!F.value?(M.value=!0,!1):de({silent:e}),ut=async()=>{F.value&&(M.value=!1,await de())},dt=()=>{M.value=!1,F.value=!1},{showUnsavedModal:ft,requestLeave:pt,handleDiscard:mt,handleSave:ht,handleCancel:gt}=pe(b,w,ue,()=>lt());return n({requestLeave:pt,isEditing:b}),(e,n)=>(a(),C(x,null,[v(te,{modelValue:E.value,"onUpdate:modelValue":n[0]||=e=>E.value=e,title:`Radio Settings Changes require a restart.`,message:`Restart Now?`},null,8,[`modelValue`]),v(fe,{show:c(ft),"is-saving":w.value,label:`Radio Settings`,onDiscard:c(mt),onSave:c(ht),onCancel:c(gt)},null,8,[`show`,`is-saving`,`onDiscard`,`onSave`,`onCancel`]),v(U,{show:M.value,confirmed:F.value,busy:w.value,"action-label":`I Understand, Save Changes`,"onUpdate:show":n[1]||=e=>e?M.value=!0:dt(),"onUpdate:confirmed":n[2]||=e=>F.value=e,onConfirm:ut},null,8,[`show`,`confirmed`,`busy`]),S(`div`,me,[S(`div`,he,[n[13]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`Radio Settings`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Configure LoRa radio parameters and frequency presets`)],-1),S(`div`,ge,[b.value?(a(),C(x,{key:1},[S(`button`,{onClick:n[3]||=e=>k.value=!k.value,class:`cfg-btn-secondary`},` Prefill Preset `),S(`button`,{onClick:ue,disabled:w.value,class:`cfg-btn-secondary`},` Cancel `,8,_e),S(`button`,{onClick:n[4]||=e=>lt(),disabled:w.value,class:`cfg-btn-primary`},l(w.value?`Saving...`:`Save Changes`),9,ve)],64)):(a(),C(`button`,{key:0,onClick:Z,class:`cfg-btn-primary`},` Edit Settings `))])]),T.value?(a(),C(`div`,ye,[S(`p`,be,l(T.value),1)])):_(``,!0),S(`div`,xe,[v(N,{name:`fade`},{default:r(()=>[b.value&&k.value?(a(),C(`div`,{key:0,class:`modal-backdrop`,onClick:n[6]||=A(e=>k.value=!1,[`self`])},[S(`div`,Se,[S(`div`,Ce,[n[14]||=S(`div`,null,[S(`div`,{class:`text-content-primary font-semibold text-base`},` Prefill from preset `),S(`div`,{class:`text-content-muted text-xs mt-1`},` Pick a preset to load its radio values into the form. `)],-1),S(`button`,{type:`button`,class:`cfg-btn-secondary`,onClick:n[5]||=e=>k.value=!1},` Close `)]),S(`div`,we,[S(`div`,Te,[(a(!0),C(x,null,t(c(f).radioPresets,e=>(a(),C(`button`,{key:e.title,type:`button`,onClick:t=>le(e.title),class:p([`w-full text-left rounded-[18px] border px-4 py-3 transition-all duration-200 flex items-center justify-between gap-4`,O.value===e.title?`border-primary/opacity-heavy bg-primary/opacity-light shadow-sm shadow-primary/10`:`border-stroke-subtle dark:border-white/opacity-light bg-white/60 dark:bg-white/opacity-subtle hover:border-primary/opacity-medium dark:hover:border-primary/opacity-medium hover:bg-stroke-subtle/60 dark:hover:bg-white/opacity-light`])},[S(`div`,De,[S(`div`,Oe,[S(`div`,ke,l(e.title),1),O.value===e.title?(a(),C(`span`,Ae,` Selected `)):_(``,!0)]),S(`div`,je,l(e.description),1)]),S(`div`,Me,[S(`span`,Ne,` Freq `+l(ae(e)),1),S(`span`,Pe,` SF `+l(se(e)),1),S(`span`,Fe,` BW `+l(oe(e)),1),S(`span`,Ie,` CR `+l($(e)),1)])],10,Ee))),128))])])])])):_(``,!0)]),_:1}),S(`div`,Le,[n[16]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Frequency`,-1),b.value?(a(),C(`div`,ze,[i(S(`input`,{"onUpdate:modelValue":n[7]||=e=>L.value=e,type:`number`,step:`0.001`,min:`100`,max:`1000`,class:`cfg-input w-32`},null,512),[[j,L.value,void 0,{number:!0}]]),n[15]||=S(`span`,{class:`text-content-muted text-sm`},`MHz`,-1)])):(a(),C(`div`,Re,l(ne.value),1))]),S(`div`,Be,[n[17]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Spreading Factor`,-1),b.value?(a(),C(`div`,He,[i(S(`select`,{"onUpdate:modelValue":n[8]||=e=>z.value=e,class:`cfg-select`},[(a(),C(x,null,t([5,6,7,8,9,10,11,12],e=>S(`option`,{key:e,value:e},l(e),9,Ue)),64))],512),[[D,z.value,void 0,{number:!0}]])])):(a(),C(`div`,Ve,l(X.value),1))]),S(`div`,We,[n[18]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Bandwidth`,-1),b.value?(a(),C(`div`,Ke,[i(S(`select`,{"onUpdate:modelValue":n[9]||=e=>B.value=e,class:`cfg-select`},[(a(),C(x,null,t(q,e=>S(`option`,{key:e.value,value:e.value},l(e.label),9,qe)),64))],512),[[D,B.value,void 0,{number:!0}]])])):(a(),C(`div`,Ge,l(re.value),1))]),S(`div`,Je,[n[20]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`TX Power`,-1),b.value?(a(),C(`div`,Xe,[i(S(`input`,{"onUpdate:modelValue":n[10]||=e=>W.value=e,type:`number`,min:`-9`,max:`22`,class:`cfg-input w-20`},null,512),[[j,W.value,void 0,{number:!0}]]),n[19]||=S(`span`,{class:`text-content-muted text-sm`},`dBm`,-1)])):(a(),C(`div`,Ye,l(ie.value),1))]),S(`div`,Ze,[n[22]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Coding Rate`,-1),b.value?(a(),C(`div`,$e,[i(S(`select`,{"onUpdate:modelValue":n[11]||=e=>G.value=e,class:`cfg-select`},[...n[21]||=[S(`option`,{value:5},`4/5`,-1),S(`option`,{value:6},`4/6`,-1),S(`option`,{value:7},`4/7`,-1),S(`option`,{value:8},`4/8`,-1)]],512),[[D,G.value,void 0,{number:!0}]])])):(a(),C(`div`,Qe,l(J.value),1))]),S(`div`,et,[n[23]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Preamble Length`,-1),S(`span`,tt,l(Y.value),1)])]),S(`div`,nt,[S(`div`,rt,[n[24]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`CAD Calibration`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Channel Activity Detection: Run Calibration to update`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm mt-1`},`These settings tune the receivers ability to detect channel status prior to transmission`)],-1),S(`button`,{onClick:n[12]||=e=>c(s).push(`/cad-calibration`),class:`cfg-btn-secondary shrink-0`},` Run Calibration `)]),n[27]||=S(`div`,{class:`pt-2`},null,-1),S(`div`,it,[n[25]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Peak Threshold`,-1),S(`span`,at,l(g.value.peak_threshold??`Not calibrated`),1)]),S(`div`,ot,[n[26]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Min Threshold`,-1),S(`span`,st,l(g.value.min_threshold??`Not calibrated`),1)])])])],64))}}),lt={class:`space-y-12`},ut={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},dt={class:`flex items-center gap-2 shrink-0`},ft=[`disabled`],pt=[`disabled`],mt={key:0,class:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium border border-accent-red dark:border-accent-red/opacity-heavy rounded-lg p-3 text-accent-red text-sm`},ht={class:`cfg-section space-y-3`},gt={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},_t={key:0,class:`text-content-primary font-mono text-sm`},vt={key:1,class:`w-full sm:w-80`},yt=[`value`],bt={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-2`},xt={key:0,class:`text-content-primary font-mono text-sm break-all`},St={key:1,class:`w-full sm:w-80 space-y-2`},Ct={class:`flex gap-2`},wt=[`disabled`],Tt=[`value`],Et=[`value`],Dt=[`disabled`],Ot=[`value`],kt=[`value`],At=[`disabled`],jt={class:`flex items-center gap-2 text-xs text-content-secondary dark:text-content-muted`},Mt={key:2,class:`text-xs text-accent-red`},Nt={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-2`},Pt={key:0,class:`text-content-primary font-mono text-sm`},Ft={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-2`},It={key:0,class:`text-content-primary font-mono text-sm break-all`},Lt={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-2`},Rt={key:0,class:`text-content-primary font-mono text-sm`},zt={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-2`},Bt={key:0,class:`text-content-primary font-mono text-sm`},Vt={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-2`},Ht={class:`w-full sm:w-96 space-y-2`},Ut={class:`flex gap-2`},Wt=[`value`],Gt=[`disabled`],Kt={key:0,class:`text-xs text-accent-red`},qt={class:`grid grid-cols-1 sm:grid-cols-2 gap-3 py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},Jt={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},Yt={key:1,class:`block text-content-primary font-mono text-sm mt-1`},Xt={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},Zt={key:1,class:`block text-content-primary font-mono text-sm mt-1`},Qt={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},$t={key:1,class:`block text-content-primary font-mono text-sm mt-1`},en={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},tn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},nn={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},rn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},an={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},on={key:1,class:`block text-content-primary font-mono text-sm mt-1`},sn={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},cn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},ln={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},un={key:1,class:`block text-content-primary font-mono text-sm mt-1`},dn={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},fn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},pn={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},mn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},hn={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},gn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},_n={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},vn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},yn={key:3,class:`grid grid-cols-1 sm:grid-cols-2 gap-3 text-sm`},bn={class:`rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute dark:bg-white/opacity-subtle p-3`},xn={class:`text-content-primary font-mono`},Sn={class:`rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute dark:bg-white/opacity-subtle p-3`},Cn={class:`text-content-primary font-mono`},wn={class:`rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute dark:bg-white/opacity-subtle p-3`},Tn={class:`text-content-primary font-mono`},En={class:`rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute dark:bg-white/opacity-subtle p-3`},Dn={class:`text-content-primary font-mono`},On={class:`rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute dark:bg-white/opacity-subtle p-3`},kn={class:`text-content-primary font-mono`},An={class:`rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute dark:bg-white/opacity-subtle p-3`},jn={class:`text-content-primary font-mono`},Mn={class:`rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute dark:bg-white/opacity-subtle p-3`},Nn={class:`text-content-primary font-mono`},Pn={class:`rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute dark:bg-white/opacity-subtle p-3`},Fn={class:`text-content-primary font-mono`},In={class:`grid grid-cols-1 sm:grid-cols-2 gap-3 py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},Ln={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},Rn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},zn={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},Bn={key:1,class:`block text-content-primary font-mono text-sm mt-1`},Vn=f({__name:`RadioHardwareSettings`,setup(n,{expose:r}){let s=ee(),u=[{value:`sx1262`,label:`sx1262`,detail:`Linux spidev + system GPIO`},{value:`sx1262_ch341`,label:`sx1262_ch341`,detail:`CH341 USB-to-SPI`},{value:`kiss`,label:`kiss`,detail:`KISS-modem over serial`},{value:`pymc_tcp`,label:`pymc_tcp`,detail:`pymc_tcp firmware modem over Wi-Fi/TCP`},{value:`pymc_usb`,label:`pymc_usb`,detail:`pymc_usb firmware modem over USB-CDC`},{value:`none`,label:`none`,detail:`Disable radio hardware (no RF I/O)`}],d=y(()=>{let e=s.stats;if(!e)return{};let t=e.config??{};return{...e,...t}}),f=o(!1),p=o(!1),m=o(``),g=o(!1),w=o(`none`),T=o([]),E=o(!1),O=o(``),k=o(!1),A=o([]),N=o(!1),P=o(``),F=o(``),I=o(``),L=o(9600),z=o(``),B=o(921600),V=o(``),H=o(5055),U=o(``),W=o(0),G=o(0),K=o(21),q=o(18),ne=o(20),re=o(16),ie=o(-1),J=o(-1),Y=o(-1),X=o(``),Z=o(-1),Q=o(-1),ae=o(6790),oe=o(21778);function se(e,t=``){return e==null?t:String(e)}function $(e,t){let n=Number(e);return Number.isFinite(n)?n:t}function ce(e){if(e==null)return`none`;let t=String(e).trim().toLowerCase();return!t||[`none`,`null`,`disabled`,`off`,`no_radio`].includes(t)?`none`:t===`kiss-modem`?`kiss`:t===`sx1262`?`sx1262`:t===`sx1262_ch341`?`sx1262_ch341`:t===`kiss`?`kiss`:t===`pymc_tcp`?`pymc_tcp`:t===`pymc_usb`?`pymc_usb`:`none`}function le(e){let t=e.config?.radio_type;return t==null||t===``?`sx1262`:ce(t)}let ue=y(()=>w.value!==`sx1262`&&w.value!==`sx1262_ch341`?[]:A.value.filter(e=>le(e)===w.value));function de(e){let t=A.value.find(t=>t.key===e);if(!t||!t.config)return;let n=t.config;W.value=$(n.bus_id,W.value),G.value=$(n.cs_id,G.value),K.value=$(n.cs_pin,K.value),q.value=$(n.reset_pin,q.value),ne.value=$(n.busy_pin,ne.value),re.value=$(n.irq_pin,re.value),ie.value=$(n.txen_pin,ie.value),J.value=$(n.rxen_pin,J.value),Y.value=$(n.en_pin,Y.value),Array.isArray(n.en_pins)?X.value=n.en_pins.map(e=>Number(e)).filter(e=>Number.isFinite(e)).join(`, `):X.value=``,Z.value=$(n.txled_pin,Z.value),Q.value=$(n.rxled_pin,Q.value),w.value===`sx1262_ch341`&&(ae.value=$(n.vid,ae.value),oe.value=$(n.pid,oe.value))}h(d,e=>{if(!f.value){w.value=ce(e.radio_type);let t=e.kiss??{},n=e.pymc_usb??{},r=e.pymc_tcp??{},i=e.sx1262??{},a=e.ch341??{};I.value=se(t.port,`/dev/ttyUSB0`),L.value=$(t.baud_rate,9600),z.value=se(n.port,`/dev/ttyACM0`),B.value=$(n.baudrate,921600),V.value=se(r.host,``),H.value=$(r.port,5055),U.value=se(r.token,``),W.value=$(i.bus_id,0),G.value=$(i.cs_id,0),K.value=$(i.cs_pin,21),q.value=$(i.reset_pin,18),ne.value=$(i.busy_pin,20),re.value=$(i.irq_pin,16),ie.value=$(i.txen_pin,-1),J.value=$(i.rxen_pin,-1),Y.value=$(i.en_pin,-1),Array.isArray(i.en_pins)?X.value=i.en_pins.map(e=>Number(e)).filter(e=>Number.isFinite(e)).join(`, `):X.value=``,Z.value=$(i.txled_pin,-1),Q.value=$(i.rxled_pin,-1),ae.value=$(a.vid,6790),oe.value=$(a.pid,21778),F.value=``}},{immediate:!0});let me=y(()=>ce(d.value.radio_type)),he=y(()=>{let e=u.find(e=>e.value===me.value);return e?`${e.label} - ${e.detail}`:`none - Disable radio hardware (no RF I/O)`});function ge(){w.value=me.value,f.value=!0,m.value=``}function _e(){w.value=me.value,f.value=!1,m.value=``,k.value=!1,F.value=``}function ve(e){return e.split(`,`).map(e=>Number(e.trim())).filter(e=>Number.isFinite(e))}async function ye(){N.value=!0,P.value=``;try{let e=await R.get(`hardware_options`),t=e.hardware;if(Array.isArray(t)){A.value=t;return}if(e.success&&Array.isArray(e.data)){A.value=e.data;return}A.value=[],P.value=e.error||`Could not load hardware presets`}catch(e){let t=e;A.value=[],P.value=t.message||`Could not load hardware presets`}finally{N.value=!1}}async function be(){E.value=!0,O.value=``;try{let e=await R.getSerialPorts();e.success&&Array.isArray(e.data)?T.value=e.data:(T.value=[],O.value=e.error||`Could not load USB serial devices`)}catch(e){let t=e;T.value=[],O.value=t.message||`Could not load USB serial devices`}finally{E.value=!1}}async function xe(){p.value=!0,m.value=``;try{if(w.value===`pymc_tcp`&&!V.value.trim())return m.value=`TCP modem host is required for pymc_tcp`,!1;let e={radio_type:w.value===`none`?null:w.value};if(w.value===`kiss`&&(e.kiss={port:I.value.trim()||`/dev/ttyUSB0`,baud_rate:$(L.value,9600)}),w.value===`pymc_usb`&&(e.pymc_usb={port:z.value.trim()||`/dev/ttyACM0`,baudrate:$(B.value,921600)}),w.value===`pymc_tcp`&&(e.pymc_tcp={host:V.value.trim(),port:$(H.value,5055),token:U.value}),w.value===`sx1262`||w.value===`sx1262_ch341`){let t=ve(X.value);e.sx1262={bus_id:$(W.value,0),cs_id:$(G.value,0),cs_pin:$(K.value,21),reset_pin:$(q.value,18),busy_pin:$(ne.value,20),irq_pin:$(re.value,16),txen_pin:$(ie.value,-1),rxen_pin:$(J.value,-1),...t.length>0?{en_pins:t}:{en_pin:$(Y.value,-1)},txled_pin:$(Z.value,-1),rxled_pin:$(Q.value,-1)}}w.value===`sx1262_ch341`&&(e.ch341={vid:$(ae.value,6790),pid:$(oe.value,21778)});let t=await R.importConfig(e);return t.success?(f.value=!1,await s.fetchStats(),g.value=!0,!0):(m.value=t.error||`Failed to save settings`,!1)}catch(e){let t=e;return m.value=t.response?.data?.error||t.message||`Failed to save settings`,!1}finally{p.value=!1}}let Se=y(()=>w.value===`kiss`||w.value===`pymc_usb`),Ce=y(()=>w.value===`pymc_tcp`),we=y(()=>w.value===`sx1262`||w.value===`sx1262_ch341`),Te=y(()=>w.value===`sx1262_ch341`),{showUnsavedModal:Ee,requestLeave:De,handleDiscard:Oe,handleSave:ke,handleCancel:Ae}=pe(f,p,_e,async()=>xe());return r({requestLeave:De,isEditing:f}),e(()=>{be(),ye()}),h([f,w],([e,t])=>{e&&(t===`kiss`||t===`pymc_usb`)&&be(),e&&(t===`sx1262`||t===`sx1262_ch341`)&&ye(),F.value=``},{immediate:!1}),(e,n)=>(a(),C(x,null,[v(te,{modelValue:g.value,"onUpdate:modelValue":n[0]||=e=>g.value=e,title:`Radio Hardware change requires a restart.`,message:`Restart now?`},null,8,[`modelValue`]),v(fe,{show:c(Ee),"is-saving":p.value,label:`Radio Hardware settings`,onDiscard:c(Oe),onSave:c(ke),onCancel:c(Ae)},null,8,[`show`,`is-saving`,`onDiscard`,`onSave`,`onCancel`]),S(`div`,lt,[S(`div`,ut,[n[28]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},` Radio Hardware `),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},` Select which radio hardware backend this repeater should use `)],-1),S(`div`,dt,[f.value?(a(),C(x,{key:1},[S(`button`,{onClick:_e,disabled:p.value,class:`cfg-btn-secondary`},` Cancel `,8,ft),S(`button`,{onClick:xe,disabled:p.value,class:`cfg-btn-primary`},l(p.value?`Saving...`:`Save Changes`),9,pt)],64)):(a(),C(`button`,{key:0,onClick:ge,class:`cfg-btn-primary`},` Edit Settings `))])]),m.value?(a(),C(`div`,mt,l(m.value),1)):_(``,!0),S(`div`,ht,[S(`div`,gt,[n[29]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Radio Type`,-1),f.value?(a(),C(`div`,vt,[i(S(`select`,{"onUpdate:modelValue":n[1]||=e=>w.value=e,class:`cfg-select`},[(a(),C(x,null,t(u,e=>S(`option`,{key:e.value,value:e.value},l(e.label)+` - `+l(e.detail),9,yt)),64))],512),[[D,w.value]])])):(a(),C(`div`,_t,l(he.value),1))]),Se.value?(a(),C(x,{key:0},[S(`div`,bt,[n[31]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},` Serial Port `,-1),f.value?(a(),C(`div`,St,[S(`div`,Ct,[w.value===`kiss`?i((a(),C(`select`,{key:0,"onUpdate:modelValue":n[2]||=e=>I.value=e,class:`cfg-select flex-1`,disabled:k.value},[I.value&&!T.value.some(e=>e.device===I.value)?(a(),C(`option`,{key:0,value:I.value},l(I.value)+` (current) `,9,Tt)):_(``,!0),(a(!0),C(x,null,t(T.value,e=>(a(),C(`option`,{key:`kiss-${e.device}`,value:e.device},l(e.description||e.device),9,Et))),128))],8,wt)),[[D,I.value]]):i((a(),C(`select`,{key:1,"onUpdate:modelValue":n[3]||=e=>z.value=e,class:`cfg-select flex-1`,disabled:k.value},[z.value&&!T.value.some(e=>e.device===z.value)?(a(),C(`option`,{key:0,value:z.value},l(z.value)+` (current) `,9,Ot)):_(``,!0),(a(!0),C(x,null,t(T.value,e=>(a(),C(`option`,{key:`usb-${e.device}`,value:e.device},l(e.description||e.device),9,kt))),128))],8,Dt)),[[D,z.value]]),S(`button`,{type:`button`,class:`cfg-btn-secondary`,disabled:E.value,onClick:be},l(E.value?`...`:`Refresh`),9,At)]),S(`label`,jt,[i(S(`input`,{"onUpdate:modelValue":n[4]||=e=>k.value=e,type:`checkbox`},null,512),[[M,k.value]]),n[30]||=b(` Enter custom device path `,-1)]),k.value&&w.value===`kiss`?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[5]||=e=>I.value=e,type:`text`,class:`cfg-input`,placeholder:`/dev/ttyUSB0`},null,512)),[[j,I.value]]):_(``,!0),k.value&&w.value!==`kiss`?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[6]||=e=>z.value=e,type:`text`,class:`cfg-input`,placeholder:`/dev/ttyACM0`},null,512)),[[j,z.value]]):_(``,!0),O.value?(a(),C(`p`,Mt,l(O.value),1)):_(``,!0)])):(a(),C(`div`,xt,l(w.value===`kiss`?I.value:z.value),1))]),S(`div`,Nt,[n[32]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},` Baud Rate `,-1),f.value?(a(),C(x,{key:1},[w.value===`kiss`?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[7]||=e=>L.value=e,type:`number`,min:`1`,class:`cfg-input w-full sm:w-40`},null,512)),[[j,L.value,void 0,{number:!0}]]):i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[8]||=e=>B.value=e,type:`number`,min:`1`,class:`cfg-input w-full sm:w-40`},null,512)),[[j,B.value,void 0,{number:!0}]])],64)):(a(),C(`div`,Pt,l(w.value===`kiss`?L.value:B.value),1))])],64)):_(``,!0),Ce.value?(a(),C(x,{key:1},[S(`div`,Ft,[n[33]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`TCP Host`,-1),f.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[9]||=e=>V.value=e,type:`text`,class:`cfg-input w-full sm:w-72`,placeholder:`pymc-3e2834.local`},null,512)),[[j,V.value]]):(a(),C(`div`,It,l(V.value||`Not set`),1))]),S(`div`,Lt,[n[34]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`TCP Port`,-1),f.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[10]||=e=>H.value=e,type:`number`,min:`1`,max:`65535`,class:`cfg-input w-full sm:w-40`},null,512)),[[j,H.value,void 0,{number:!0}]]):(a(),C(`div`,Rt,l(H.value),1))]),S(`div`,zt,[n[35]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`TCP Token`,-1),f.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[11]||=e=>U.value=e,type:`text`,class:`cfg-input w-full sm:w-72`,placeholder:`Optional`},null,512)),[[j,U.value]]):(a(),C(`div`,Bt,l(U.value?`Configured`:`Not set`),1))])],64)):_(``,!0),we.value&&f.value?(a(),C(x,{key:2},[S(`div`,Vt,[n[38]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Board Preset (Quick Apply)`,-1),S(`div`,Ht,[S(`div`,Ut,[i(S(`select`,{"onUpdate:modelValue":n[12]||=e=>F.value=e,class:`cfg-select flex-1`,onChange:n[13]||=e=>de(F.value)},[n[36]||=S(`option`,{value:``},`Leave current pin values unchanged`,-1),(a(!0),C(x,null,t(ue.value,e=>(a(),C(`option`,{key:e.key,value:e.key},l(e.name||e.key),9,Wt))),128))],544),[[D,F.value]]),S(`button`,{type:`button`,class:`cfg-btn-secondary`,disabled:N.value,onClick:ye},l(N.value?`...`:`Refresh`),9,Gt)]),P.value?(a(),C(`p`,Kt,l(P.value),1)):_(``,!0),n[37]||=S(`p`,{class:`text-xs text-content-muted`},` Optional: selecting a preset fills the pin fields below for quick setup changes. `,-1)])]),n[51]||=S(`div`,{class:`pt-2 text-xs text-content-muted`},`SX1262 Board Pin Configuration`,-1),S(`div`,qt,[S(`label`,Jt,[n[39]||=b(`SPI Bus ID `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[14]||=e=>W.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,W.value,void 0,{number:!0}]]):(a(),C(`span`,Yt,l(W.value),1))]),S(`label`,Xt,[n[40]||=b(`SPI CS ID `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[15]||=e=>G.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,G.value,void 0,{number:!0}]]):(a(),C(`span`,Zt,l(G.value),1))]),S(`label`,Qt,[n[41]||=b(`CS Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[16]||=e=>K.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,K.value,void 0,{number:!0}]]):(a(),C(`span`,$t,l(K.value),1))]),S(`label`,en,[n[42]||=b(`Reset Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[17]||=e=>q.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,q.value,void 0,{number:!0}]]):(a(),C(`span`,tn,l(q.value),1))]),S(`label`,nn,[n[43]||=b(`Busy Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[18]||=e=>ne.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,ne.value,void 0,{number:!0}]]):(a(),C(`span`,rn,l(ne.value),1))]),S(`label`,an,[n[44]||=b(`IRQ Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[19]||=e=>re.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,re.value,void 0,{number:!0}]]):(a(),C(`span`,on,l(re.value),1))]),S(`label`,sn,[n[45]||=b(`TX Enable Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[20]||=e=>ie.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,ie.value,void 0,{number:!0}]]):(a(),C(`span`,cn,l(ie.value),1))]),S(`label`,ln,[n[46]||=b(`RX Enable Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[21]||=e=>J.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,J.value,void 0,{number:!0}]]):(a(),C(`span`,un,l(J.value),1))]),S(`label`,dn,[n[47]||=b(`Power Enable Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[22]||=e=>Y.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,Y.value,void 0,{number:!0}]]):(a(),C(`span`,fn,l(Y.value),1))]),S(`label`,pn,[n[48]||=b(`Power Enable Pins (array) `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[23]||=e=>X.value=e,type:`text`,class:`cfg-input mt-1`,placeholder:`26, 23`},null,512)),[[j,X.value]]):(a(),C(`span`,mn,l(X.value||`Not set`),1))]),S(`label`,hn,[n[49]||=b(`TX LED Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[24]||=e=>Z.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,Z.value,void 0,{number:!0}]]):(a(),C(`span`,gn,l(Z.value),1))]),S(`label`,_n,[n[50]||=b(`RX LED Pin `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[25]||=e=>Q.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,Q.value,void 0,{number:!0}]]):(a(),C(`span`,vn,l(Q.value),1))])])],64)):we.value?(a(),C(`div`,yn,[S(`div`,bn,[n[52]||=S(`div`,{class:`text-content-muted text-xs mb-1`},`Current SPI bus`,-1),S(`div`,xn,l(W.value),1)]),S(`div`,Sn,[n[53]||=S(`div`,{class:`text-content-muted text-xs mb-1`},`Current SPI CS`,-1),S(`div`,Cn,l(G.value),1)]),S(`div`,wn,[n[54]||=S(`div`,{class:`text-content-muted text-xs mb-1`},`Current CS pin`,-1),S(`div`,Tn,l(K.value),1)]),S(`div`,En,[n[55]||=S(`div`,{class:`text-content-muted text-xs mb-1`},`Current reset pin`,-1),S(`div`,Dn,l(q.value),1)]),S(`div`,On,[n[56]||=S(`div`,{class:`text-content-muted text-xs mb-1`},`Current busy pin`,-1),S(`div`,kn,l(ne.value),1)]),S(`div`,An,[n[57]||=S(`div`,{class:`text-content-muted text-xs mb-1`},`Current IRQ pin`,-1),S(`div`,jn,l(re.value),1)]),S(`div`,Mn,[n[58]||=S(`div`,{class:`text-content-muted text-xs mb-1`},`Current power enable pin`,-1),S(`div`,Nn,l(Y.value),1)]),S(`div`,Pn,[n[59]||=S(`div`,{class:`text-content-muted text-xs mb-1`},`Current power enable pins`,-1),S(`div`,Fn,l(X.value||`Not set`),1)])])):_(``,!0),Te.value?(a(),C(x,{key:4},[n[62]||=S(`div`,{class:`pt-2 text-xs text-content-muted`},`CH341 Adapter Configuration`,-1),S(`div`,In,[S(`label`,Ln,[n[60]||=b(`CH341 VID `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[26]||=e=>ae.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,ae.value,void 0,{number:!0}]]):(a(),C(`span`,Rn,l(ae.value),1))]),S(`label`,zn,[n[61]||=b(`CH341 PID `,-1),f.value?i((a(),C(`input`,{key:0,"onUpdate:modelValue":n[27]||=e=>oe.value=e,type:`number`,class:`cfg-input mt-1`},null,512)),[[j,oe.value,void 0,{number:!0}]]):(a(),C(`span`,Bn,l(oe.value),1))])])],64)):_(``,!0),n[63]||=S(`div`,{class:`py-2 text-xs text-content-muted`},` Switching hardware saves immediately and requires a service restart to apply. `,-1)])])],64))}}),Hn={class:`space-y-12`},Un={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},Wn={class:`flex items-center gap-2 flex-shrink-0`},Gn=[`disabled`],Kn=[`disabled`],qn={key:0,class:`bg-accent-green/opacity-light dark:bg-accent-green/opacity-light border border-accent-green dark:border-accent-green/opacity-medium rounded-lg p-3`},Jn={class:`text-accent-green text-sm`},Yn={key:1,class:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-light border border-accent-red dark:border-accent-red/opacity-medium rounded-lg p-3`},Xn={class:`text-accent-red text-sm`},Zn={class:`cfg-section space-y-3`},Qn={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},$n={key:0,class:`text-content-primary font-mono text-sm break-all`},er={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},tr={class:`text-content-primary font-mono text-xs break-all`},nr={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},rr={class:`flex items-center gap-2 min-w-0 sm:justify-end`},ir={class:`text-content-primary font-mono text-xs break-all sm:text-right min-w-0`},ar={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},or={class:`text-content-primary font-mono text-sm`},sr={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},cr={key:0,class:`text-content-primary font-mono text-sm`},lr={class:`flex flex-col py-2 gap-2`},ur={class:`flex flex-col sm:flex-row sm:justify-between sm:items-start gap-1`},dr={key:0,class:`text-content-primary font-mono text-sm sm:ml-4`},fr={key:1,class:`flex items-center gap-2`},pr={class:`cfg-section space-y-3`},mr={class:`pb-2`},hr={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},gr={key:0,class:`text-content-primary font-mono text-sm`},_r={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 gap-1`},vr={key:0,class:`text-content-primary font-mono text-sm`},yr={class:`bg-surface dark:bg-surface-elevated border border-stroke-subtle dark:border-stroke/opacity-medium rounded-[15px] shadow-2xl w-full max-w-md p-6 space-y-4`},br={class:`block text-sm font-medium text-content-secondary dark:text-content-muted mb-2`},xr=[`maxlength`,`disabled`],Sr={key:0,class:`text-accent-red text-xs mt-1`},Cr={key:1,class:`text-content-muted text-xs mt-1`},wr=[`disabled`],Tr={key:0,class:`mt-2 bg-accent-amber/opacity-light border border-accent-amber/opacity-medium rounded-lg p-3`},Er={key:0,class:`flex items-center gap-3 bg-primary/opacity-light border border-primary/opacity-medium rounded-lg p-3`},Dr={class:`text-primary text-xs font-medium`},Or={class:`text-primary text-xs mt-0.5`},kr={key:1,class:`bg-accent-red/opacity-light border border-accent-red/opacity-medium rounded-lg p-3`},Ar={class:`text-accent-red text-sm`},jr={key:2,class:`bg-accent-green/opacity-light border border-accent-green/opacity-heavy dark:border-accent-green/opacity-medium rounded-lg p-3 space-y-2`},Mr={class:`text-accent-green text-sm font-medium`},Nr={class:`font-mono text-xs break-all text-content-primary`},Pr={key:3,class:`bg-accent-amber/opacity-light border border-accent-amber/opacity-medium rounded-lg p-3`},Fr={class:`flex gap-2 mt-3`},Ir=[`disabled`],Lr=[`disabled`],Rr={class:`flex justify-end gap-3 mt-6`},zr=[`disabled`],Br=[`disabled`],Vr=f({__name:`RepeaterSettings`,setup(e,{expose:t}){let n=ee(),r=y(()=>n.stats?.config||{}),s=y(()=>r.value.repeater||{}),d=y(()=>n.stats),f=o(!1),g=o(!1),w=o(null),E=o(null),O=o(!1),k=o(``),M=o(0),N=o(0),P=o(0),F=o(1),I=y(()=>r.value.mesh||{});h([r,s,I],()=>{if(!f.value){k.value=r.value.node_name||``,M.value=s.value.latitude||0,N.value=s.value.longitude||0,P.value=s.value.send_advert_interval_hours||0;let e=I.value.path_hash_mode;F.value=e===0||e===1||e===2?e+1:1}},{immediate:!0});let L=y(()=>r.value.node_name||`Not set`),z=y(()=>d.value?.local_hash||`Not available`),B=y(()=>{let e=d.value?.public_key;return!e||e===`Not set`?`Not set`:e}),V=y(()=>{let e=s.value.latitude;return e&&e!==0?e.toFixed(6):`Not set`}),H=y(()=>{let e=s.value.longitude;return e&&e!==0?e.toFixed(6):`Not set`}),U=y(()=>{let e=s.value.mode;return e?e===`no_tx`?`No TX`:e.charAt(0).toUpperCase()+e.slice(1):`Not set`}),G=y(()=>{let e=s.value.send_advert_interval_hours;return e===void 0?`Not set`:e===0?`Disabled`:e+` hour`+(e===1?``:`s`)}),K=y(()=>{let e=I.value.path_hash_mode;return e===0||e===1||e===2?e+1+(e===0?` byte`:` bytes`):`Not set`}),te=()=>{f.value=!0,w.value=null,E.value=null},q=()=>{f.value=!1,w.value=null,k.value=r.value.node_name||``,M.value=s.value.latitude||0,N.value=s.value.longitude||0,P.value=s.value.send_advert_interval_hours||0;let e=I.value.path_hash_mode;F.value=e===0||e===1||e===2?e+1:1},ne=async()=>{g.value=!0,w.value=null,E.value=null;try{let e={};k.value&&(e.node_name=k.value),e.latitude=M.value,e.longitude=N.value,e.flood_advert_interval_hours=P.value,e.path_hash_mode=F.value-1;let t=(await R.post(`/update_radio_config`,e)).data;t.message||t.persisted?(E.value=t.message||`Settings saved successfully`,f.value=!1,await n.fetchStats(),setTimeout(()=>{E.value=null},3e3)):t.error?w.value=t.error:w.value=`Unknown response from server`}catch(e){console.error(`Failed to update repeater settings:`,e),w.value=e.response?.data?.error||`Failed to update settings`}finally{g.value=!1}},ie=()=>{O.value=!0},J=e=>{M.value=e.latitude,N.value=e.longitude},Y=o(!1),X=o(``),Z=o(!1),Q=o(null),ae=o(null),oe=o(!1),se=o(!1),$=o(!1),ce=o(0),le=null,ue=y(()=>$.value?8:4),de=y(()=>{let e=X.value.trim();return!e||e.length>ue.value?!1:/^[0-9a-fA-F]+$/.test(e)}),me=y(()=>{let e=X.value.trim().length;return e===0?``:e===1?`Very fast — ~16 attempts on average`:e===2?`Fast — ~256 attempts on average`:e===3?`Moderate — ~4,096 attempts, a few seconds`:e===4?`Slow — ~65,536 attempts, may take 10-30 seconds`:e===5?`Very slow — ~1 million attempts, could take minutes`:e===6?`Extremely slow — ~16 million attempts, could take a very long time`:e===7?`Extreme — ~268 million attempts, may not complete`:`Extreme — ~4 billion attempts, extremely unlikely to complete`}),he=()=>{ce.value=0,le=setInterval(()=>{ce.value++},1e3)},ge=()=>{le&&=(clearInterval(le),null)};T(()=>ge());let _e=()=>{X.value=``,Q.value=null,ae.value=null,oe.value=!1,$.value=!1,Y.value=!0},ve=async()=>{Z.value=!0,ae.value=null,Q.value=null,he();try{let e=await R.generateVanityKey(X.value.trim());e.success&&e.data?Q.value=e.data:ae.value=e.error||`Generation failed`}catch(e){let t=e;ae.value=t.response?.data?.error||t.message||`Generation failed`}finally{ge(),Z.value=!1}},ye=async()=>{if(Q.value){se.value=!0,ae.value=null;try{let e=await R.generateVanityKey(X.value.trim(),!0);e.success&&e.data?(Q.value=e.data,oe.value=!1,Y.value=!1,E.value=`New identity key applied. Restart the repeater for the change to take effect.`,await n.fetchStats(),setTimeout(()=>{E.value=null},8e3)):ae.value=e.error||`Failed to apply key`}catch(e){let t=e;ae.value=t.response?.data?.error||t.message||`Failed to apply key`}finally{se.value=!1}}},{showUnsavedModal:be,requestLeave:xe,handleDiscard:Se,handleSave:Ce,handleCancel:we}=pe(f,g,q,async()=>(await ne(),!f.value));return t({requestLeave:xe,isEditing:f}),(e,t)=>(a(),C(x,null,[v(fe,{show:c(be),"is-saving":g.value,label:`Repeater Settings`,onDiscard:c(Se),onSave:c(Ce),onCancel:c(we)},null,8,[`show`,`is-saving`,`onDiscard`,`onSave`,`onCancel`]),S(`div`,Hn,[S(`div`,Un,[t[13]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`Repeater Settings`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Configure repeater identity, location, and network settings`)],-1),S(`div`,Wn,[f.value?(a(),C(x,{key:1},[S(`button`,{onClick:q,disabled:g.value,class:`cfg-btn-secondary`},` Cancel `,8,Gn),S(`button`,{onClick:ne,disabled:g.value,class:`cfg-btn-primary`},l(g.value?`Saving...`:`Save Changes`),9,Kn)],64)):(a(),C(`button`,{key:0,onClick:te,class:`cfg-btn-primary`},` Edit Settings `))])]),E.value?(a(),C(`div`,qn,[S(`p`,Jn,l(E.value),1)])):_(``,!0),w.value?(a(),C(`div`,Yn,[S(`p`,Xn,l(w.value),1)])):_(``,!0),S(`div`,Zn,[t[23]||=S(`h3`,{class:`text-lg font-semibold text-content-primary pb-2`},`General Settings`,-1),S(`div`,Qn,[t[14]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Node Name`,-1),f.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":t[0]||=e=>k.value=e,type:`text`,maxlength:`50`,class:`cfg-input w-full sm:w-64`,placeholder:`Enter node name`},null,512)),[[j,k.value]]):(a(),C(`div`,$n,l(L.value),1))]),S(`div`,er,[t[15]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Local Hash`,-1),S(`span`,tr,l(z.value),1)]),S(`div`,nr,[t[16]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm flex-shrink-0`},`Public Key`,-1),S(`div`,rr,[S(`span`,ir,l(B.value),1),f.value?(a(),C(`button`,{key:0,onClick:_e,class:`flex-shrink-0 px-2 py-1 text-xs bg-primary/opacity-light hover:bg-primary/opacity-medium text-content-secondary dark:text-content-muted rounded border border-primary/opacity-medium transition-colors whitespace-nowrap`},` Generate New Key `)):_(``,!0)])]),S(`div`,ar,[t[17]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Mode`,-1),S(`span`,or,l(U.value),1)]),S(`div`,sr,[t[19]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Path hash length`,-1),f.value?i((a(),C(`select`,{key:1,"onUpdate:modelValue":t[1]||=e=>F.value=e,class:`cfg-select w-full sm:w-32`},[...t[18]||=[S(`option`,{value:1},`1 byte`,-1),S(`option`,{value:2},`2 bytes`,-1),S(`option`,{value:3},`3 bytes`,-1)]],512)),[[D,F.value,void 0,{number:!0}]]):(a(),C(`div`,cr,l(K.value),1))]),S(`div`,lr,[S(`div`,ur,[t[21]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Periodic Advertisement Interval`,-1),f.value?(a(),C(`div`,fr,[i(S(`input`,{"onUpdate:modelValue":t[2]||=e=>P.value=e,type:`number`,min:`0`,max:`48`,class:`cfg-input w-20`},null,512),[[j,P.value,void 0,{number:!0}]]),t[20]||=S(`span`,{class:`text-content-muted text-sm`},`hours`,-1)])):(a(),C(`div`,dr,l(G.value),1))]),t[22]||=S(`span`,{class:`text-content-muted text-xs`},`How often the repeater sends an advertisement packet (0 = disabled, 3-48 hours)`,-1)])]),S(`div`,pr,[S(`div`,mr,[t[25]||=S(`h3`,{class:`text-lg font-semibold text-content-primary mb-3`},`Location Settings`,-1),f.value?(a(),C(`button`,{key:0,onClick:ie,class:`btn-primary flex items-center gap-2`,title:`Pick location on map`},[...t[24]||=[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z`}),S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 11a3 3 0 11-6 0 3 3 0 016 0z`})],-1),b(` Pick Location on Map `,-1)]])):_(``,!0)]),S(`div`,hr,[t[26]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Manual Latitude`,-1),f.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":t[3]||=e=>M.value=e,type:`number`,step:`0.000001`,min:`-90`,max:`90`,class:`cfg-input w-full sm:w-48`},null,512)),[[j,M.value,void 0,{number:!0}]]):(a(),C(`div`,gr,l(V.value),1))]),S(`div`,_r,[t[27]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Manual Longitude`,-1),f.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":t[4]||=e=>N.value=e,type:`number`,step:`0.000001`,min:`-180`,max:`180`,class:`cfg-input w-full sm:w-48`},null,512)),[[j,N.value,void 0,{number:!0}]]):(a(),C(`div`,vr,l(H.value),1))])]),v(re,{"is-open":O.value,latitude:M.value,longitude:N.value,onClose:t[5]||=e=>O.value=!1,onSelect:J},null,8,[`is-open`,`latitude`,`longitude`]),(a(),u(m,{to:`body`},[Y.value?(a(),C(`div`,{key:0,class:`modal-backdrop`,onClick:t[12]||=A(e=>Y.value=!1,[`self`])},[S(`div`,yr,[t[34]||=S(`h3`,{class:`text-xl font-semibold text-content-primary`},` Generate Vanity Identity Key `,-1),t[35]||=S(`p`,{class:`text-xs text-content-muted`},` Generate a new Ed25519 identity key whose public key starts with your chosen hex prefix (0-9, A-F). Longer prefixes take more time to find. `,-1),S(`div`,null,[S(`label`,br,`Hex Prefix (1-`+l(ue.value)+` characters)`,1),i(S(`input`,{"onUpdate:modelValue":t[6]||=e=>X.value=e,type:`text`,maxlength:ue.value,placeholder:`e.g. F8A1`,disabled:Z.value,class:`cfg-input py-2 placeholder-content-muted dark:placeholder-content-muted font-mono uppercase disabled:opacity-50`},null,8,xr),[[j,X.value]]),X.value&&!de.value?(a(),C(`p`,Sr,` Enter 1-`+l(ue.value)+` valid hex characters (0-9, A-F) `,1)):me.value?(a(),C(`p`,Cr,l(me.value),1)):_(``,!0)]),S(`div`,null,[S(`button`,{onClick:t[7]||=e=>$.value=!$.value,disabled:Z.value,class:`text-xs text-content-muted hover:text-content-secondary dark:hover:text-content-secondary transition-colors disabled:opacity-50 flex items-center gap-1`},[(a(),C(`svg`,{class:p([`w-3 h-3 transition-transform`,{"rotate-90":$.value}]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...t[28]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 5l7 7-7 7`},null,-1)]],2)),t[29]||=b(` Advanced `,-1)],8,wr),$.value?(a(),C(`div`,Tr,[...t[30]||=[S(`p`,{class:`text-accent-amber text-xs font-medium`},` Extended prefix mode (up to 8 characters) `,-1),S(`p`,{class:`text-accent-amber text-xs mt-1`},` Prefixes longer than 4 characters require exponentially more attempts and can take a very long time or may not complete at all. The request may time out. `,-1)]])):_(``,!0)]),Z.value?(a(),C(`div`,Er,[v(W,{size:`sm`,class:`flex-shrink-0`}),S(`div`,null,[S(`p`,Dr,` Searching for key with prefix "`+l(X.value.toUpperCase())+`"... `,1),S(`p`,Or,` Elapsed: `+l(ce.value)+`s `,1)])])):_(``,!0),ae.value?(a(),C(`div`,kr,[S(`p`,Ar,l(ae.value),1)])):_(``,!0),Q.value?(a(),C(`div`,jr,[S(`p`,Mr,` Key found in `+l(Q.value.attempts.toLocaleString())+` attempts `,1),S(`div`,null,[t[31]||=S(`span`,{class:`text-xs text-content-muted`},`Public Key:`,-1),S(`p`,Nr,l(Q.value.public_hex),1)])])):_(``,!0),oe.value&&Q.value?(a(),C(`div`,Pr,[t[32]||=S(`p`,{class:`text-accent-amber text-sm font-medium`},` Warning: This will replace your current identity key. `,-1),t[33]||=S(`p`,{class:`text-accent-amber text-xs mt-1`},` Your node address and public key will change. Other nodes will need to re-discover you. This cannot be undone unless you have a backup. `,-1),S(`div`,Fr,[S(`button`,{onClick:ye,disabled:se.value,class:`px-3 py-1.5 bg-accent-red/opacity-light hover:bg-accent-red/opacity-light text-white rounded-lg text-xs transition-colors disabled:opacity-50`},l(se.value?`Applying...`:`Confirm Replace Key`),9,Ir),S(`button`,{onClick:t[8]||=e=>oe.value=!1,disabled:se.value,class:`btn-secondary-xs`},` Cancel `,8,Lr)])])):_(``,!0),S(`div`,Rr,[S(`button`,{onClick:t[9]||=e=>Y.value=!1,disabled:Z.value,class:`px-4 py-2 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light text-content-primary rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light transition-colors`},` Close `,8,zr),Q.value?(a(),C(x,{key:1},[S(`button`,{onClick:t[10]||=e=>{Q.value=null,ae.value=null},class:`btn-primary`},` Try Again `),oe.value?_(``,!0):(a(),C(`button`,{key:0,onClick:t[11]||=e=>oe.value=!0,class:`cfg-btn-danger`},` Apply Key `))],64)):(a(),C(`button`,{key:0,onClick:ve,disabled:!de.value||Z.value,class:`btn-primary`},l(Z.value?`Generating...`:`Generate`),9,Br))])])])):_(``,!0)]))])],64))}}),Hr={class:`space-y-12`},Ur={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},Wr={class:`flex items-center gap-2 flex-shrink-0`},Gr=[`disabled`],Kr=[`disabled`],qr={key:0,class:`bg-accent-green/opacity-light dark:bg-accent-green/opacity-medium border border-accent-green dark:border-accent-green/opacity-heavy rounded-lg p-3 text-accent-green text-sm`},Jr={key:1,class:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium border border-accent-red dark:border-accent-red/opacity-heavy rounded-lg p-3 text-accent-red text-sm`},Yr={class:`cfg-section`},Xr={class:`space-y-3`},Zr={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Qr={key:0,class:`text-content-primary font-mono text-sm`},$r={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 gap-1`},ei={key:0,class:`text-content-primary font-mono text-sm`},ti=f({__name:`DutyCycle`,setup(e,{expose:t}){let n=ee(),r=y(()=>n.stats?.config?.duty_cycle||{}),s=y(()=>{let e=r.value.max_airtime_percent;return typeof e==`number`?e.toFixed(1)+`%`:e&&typeof e==`object`&&`parsedValue`in e?(e.parsedValue||0).toFixed(1)+`%`:`Not set`}),u=y(()=>r.value.enforcement_enabled?`Enabled`:`Disabled`),d=o(!1),f=o(!1),p=o(``),m=o(``),h=o(0),g=o(!0),b=()=>{let e=r.value.max_airtime_percent;typeof e==`number`?h.value=e:e&&typeof e==`object`&&`parsedValue`in e?h.value=e.parsedValue||0:h.value=6,g.value=r.value.enforcement_enabled!==!1,d.value=!0,p.value=``,m.value=``},w=()=>{d.value=!1,p.value=``,m.value=``},{showUnsavedModal:T,requestLeave:E,handleDiscard:O,handleSave:k,handleCancel:A}=pe(d,f,w,async()=>(await M(),!d.value));t({requestLeave:E,isEditing:d});let M=async()=>{f.value=!0,m.value=``,p.value=``;try{let e=(await R.post(`/update_duty_cycle_config`,{max_airtime_percent:h.value,enforcement_enabled:g.value})).data;e?.message||e?.persisted?(p.value=e?.message||`Settings saved successfully`,d.value=!1,await n.fetchStats(),setTimeout(()=>{p.value=``},3e3)):m.value=e?.error||`Failed to save settings`}catch(e){console.error(`Failed to save duty cycle settings:`,e),m.value=e.response?.data?.error||`Failed to save settings`}finally{f.value=!1}};return(e,t)=>(a(),C(x,null,[v(fe,{show:c(T),"is-saving":f.value,label:`Duty Cycle settings`,onDiscard:c(O),onSave:c(k),onCancel:c(A)},null,8,[`show`,`is-saving`,`onDiscard`,`onSave`,`onCancel`]),S(`div`,Hr,[S(`div`,Ur,[t[2]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`Duty Cycle`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Configure duty cycle limits for channel activity`)],-1),S(`div`,Wr,[d.value?(a(),C(x,{key:1},[S(`button`,{onClick:w,disabled:f.value,class:`cfg-btn-secondary`},` Cancel `,8,Gr),S(`button`,{onClick:M,disabled:f.value,class:`cfg-btn-primary`},l(f.value?`Saving...`:`Save Changes`),9,Kr)],64)):(a(),C(`button`,{key:0,onClick:b,class:`cfg-btn-primary`},` Edit Settings `))])]),p.value?(a(),C(`div`,qr,l(p.value),1)):_(``,!0),m.value?(a(),C(`div`,Jr,l(m.value),1)):_(``,!0),S(`div`,Yr,[S(`div`,Xr,[S(`div`,Zr,[t[3]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Max Airtime %`,-1),d.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":t[0]||=e=>h.value=e,type:`number`,step:`0.1`,min:`0.1`,max:`100`,class:`cfg-input w-full sm:w-32`},null,512)),[[j,h.value,void 0,{number:!0}]]):(a(),C(`div`,Qr,l(s.value),1))]),S(`div`,$r,[t[5]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Enforcement`,-1),d.value?i((a(),C(`select`,{key:1,"onUpdate:modelValue":t[1]||=e=>g.value=e,class:`cfg-select w-full sm:w-32`},[...t[4]||=[S(`option`,{value:!0},`Enabled`,-1),S(`option`,{value:!1},`Disabled`,-1)]],512)),[[D,g.value]]):(a(),C(`div`,ei,l(u.value),1))])])])])],64))}}),ni={class:`space-y-12`},ri={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},ii={class:`flex items-center gap-2 flex-shrink-0`},ai=[`disabled`],oi=[`disabled`],si={key:0,class:`bg-accent-green/opacity-light dark:bg-accent-green/opacity-medium border border-accent-green dark:border-accent-green/opacity-heavy rounded-lg p-3 text-accent-green text-sm`},ci={key:1,class:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium border border-accent-red dark:border-accent-red/opacity-heavy rounded-lg p-3 text-accent-red text-sm`},li={class:`cfg-section space-y-3`},ui={class:`flex flex-col sm:flex-row sm:items-center sm:justify-between py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-3`},di={key:0,class:`text-content-primary font-mono text-sm flex-shrink-0`},fi={class:`flex flex-col sm:flex-row sm:items-center sm:justify-between py-2 gap-3`},pi={key:0,class:`text-content-primary font-mono text-sm flex-shrink-0`},mi=f({__name:`TransmissionDelays`,setup(e,{expose:t}){let n=ee(),r=y(()=>n.stats?.config?.delays||{}),s=y(()=>{let e=r.value.tx_delay_factor;if(typeof e==`number`)return e.toFixed(2)+`x`;if(e&&typeof e==`object`&&`parsedValue`in e){let t=e.parsedValue;if(typeof t==`number`)return t.toFixed(2)+`x`}return`Not set`}),u=y(()=>{let e=r.value.direct_tx_delay_factor;return typeof e==`number`?e.toFixed(2)+`s`:`Not set`}),d=o(!1),f=o(!1),p=o(``),m=o(``),h=o(0),g=o(0),b=()=>{let e=r.value.tx_delay_factor;e&&typeof e==`object`&&`parsedValue`in e?h.value=e.parsedValue||1:typeof e==`number`?h.value=e:h.value=1;let t=r.value.direct_tx_delay_factor;g.value=typeof t==`number`?t:.5,d.value=!0,p.value=``,m.value=``},w=()=>{d.value=!1,p.value=``,m.value=``},T=async()=>{f.value=!0,m.value=``,p.value=``;try{let e=(await R.post(`/update_radio_config`,{tx_delay_factor:h.value,direct_tx_delay_factor:g.value})).data,t=e?.data??e;e?.success||t?.persisted||t?.message?(p.value=t?.message||`Settings saved successfully`,d.value=!1,await n.fetchStats(),setTimeout(()=>{p.value=``},3e3)):m.value=t?.error||`Failed to save settings`}catch(e){console.error(`Failed to save delay settings:`,e),m.value=e.response?.data?.error||`Failed to save settings`}finally{f.value=!1}},{showUnsavedModal:E,requestLeave:D,handleDiscard:O,handleSave:k,handleCancel:A}=pe(d,f,w,async()=>(await T(),!d.value));return t({requestLeave:D,isEditing:d}),(e,t)=>(a(),C(x,null,[v(fe,{show:c(E),"is-saving":f.value,label:`TX Delay settings`,onDiscard:c(O),onSave:c(k),onCancel:c(A)},null,8,[`show`,`is-saving`,`onDiscard`,`onSave`,`onCancel`]),S(`div`,ni,[S(`div`,ri,[t[2]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`TX Delays`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Configure transmission delay factors for flood and direct packets`)],-1),S(`div`,ii,[d.value?(a(),C(x,{key:1},[S(`button`,{onClick:w,disabled:f.value,class:`cfg-btn-secondary`},` Cancel `,8,ai),S(`button`,{onClick:T,disabled:f.value,class:`cfg-btn-primary`},l(f.value?`Saving...`:`Save Changes`),9,oi)],64)):(a(),C(`button`,{key:0,onClick:b,class:`cfg-btn-primary`},` Edit Settings `))])]),p.value?(a(),C(`div`,si,l(p.value),1)):_(``,!0),m.value?(a(),C(`div`,ci,l(m.value),1)):_(``,!0),S(`div`,li,[S(`div`,ui,[t[3]||=S(`div`,{class:`flex flex-col gap-1`},[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Flood TX Delay Factor`),S(`span`,{class:`text-content-muted text-xs`},`Scales the airtime-based random transmit window for flood packets. Higher values increase delay spread for collision avoidance.`)],-1),d.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":t[0]||=e=>h.value=e,type:`number`,step:`0.1`,min:`0`,max:`5`,class:`cfg-input w-full sm:w-32 flex-shrink-0`},null,512)),[[j,h.value,void 0,{number:!0}]]):(a(),C(`div`,di,l(s.value),1))]),S(`div`,fi,[t[4]||=S(`div`,{class:`flex flex-col gap-1`},[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Direct TX Delay Factor`),S(`span`,{class:`text-content-muted text-xs`},`Fixed delay in seconds before transmitting direct-routed packets. Applied as-is with no randomisation.`)],-1),d.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":t[1]||=e=>g.value=e,type:`number`,step:`0.1`,min:`0`,max:`5`,class:`cfg-input w-full sm:w-32 flex-shrink-0`},null,512)),[[j,g.value,void 0,{number:!0}]]):(a(),C(`div`,pi,l(u.value),1))])])])],64))}}),hi=z(`treeState`,()=>{let e=s(new Set),t=s({value:null}),n=t=>{e.add(t)},r=t=>{e.delete(t)};return{expandedNodes:e,selectedNodeId:t,addExpandedNode:n,removeExpandedNode:r,isNodeExpanded:t=>e.has(t),setSelectedNode:e=>{t.value=e},toggleExpanded:t=>{e.has(t)?r(t):n(t)}}}),gi={class:`select-none`},_i={class:`flex-shrink-0`},vi={key:0,class:`w-3.5 h-3.5 sm:w-4 sm:h-4 text-secondary`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},yi={key:1,class:`w-3.5 h-3.5 sm:w-4 sm:h-4 text-accent-green`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},bi={key:0,class:`hidden sm:flex items-center gap-1 ml-2`},xi={class:`relative group`},Si=[`title`],Ci={key:0,class:`text-xs font-mono text-content-secondary dark:text-on-dark-secondary bg-stroke-subtle/40 dark:bg-white/opacity-subtle px-1.5 py-0.5 rounded border border-stroke-subtle dark:border-white/opacity-light`},wi={class:`flex justify-between items-start mb-4`},Ti={class:`bg-black/opacity-medium border border-white/opacity-light rounded-md p-4 mb-4`},Ei={class:`text-sm font-mono text-white/80 break-all leading-relaxed`},Di={class:`flex justify-end`},Oi={class:`flex items-center gap-2 sm:gap-3 ml-auto flex-shrink-0`},ki={key:0,class:`hidden sm:flex items-center gap-1`},Ai=[`title`],ji={key:1,class:`hidden sm:flex items-center gap-1`},Mi={key:3,class:`hidden sm:inline-block px-2 py-1 bg-stroke-subtle dark:bg-white/opacity-subtle text-content-secondary dark:text-on-dark-secondary text-xs rounded-full ml-1`},Ni={key:0,class:`space-y-1`},Pi=K(f({__name:`TreeNode`,props:{node:{},selectedNodeId:{},level:{},disabled:{type:Boolean},unlocked:{type:Boolean}},emits:[`select`,`edit`,`delete`],setup(e,{emit:n}){let i=e,s=n,d=hi(),f=o(!1),m=y({get:()=>d.isNodeExpanded(i.node.id),set:e=>{e?d.addExpandedNode(i.node.id):d.removeExpandedNode(i.node.id)}}),h=y(()=>i.node.children.length>0);function b(){i.unlocked&&T(),h.value&&w()}function w(){h.value&&(m.value=!m.value)}function T(){s(`select`,i.node.id)}function E(e){s(`select`,e)}function D(e){s(`edit`,e)}function O(e){s(`delete`,e)}function k(e){e.stopPropagation(),f.value=!f.value}let{copy:j,copied:M}=ie();function P(e){e.stopPropagation(),i.node.transport_key&&j(i.node.transport_key)}return(n,o)=>{let d=g(`TreeNode`,!0);return a(),C(`div`,gi,[S(`div`,{class:p([`flex flex-wrap sm:flex-nowrap items-start sm:items-center gap-1 sm:gap-2 py-2 px-2 sm:px-3 rounded-lg border transition-colors duration-150`,i.disabled?`opacity-50`:``,i.unlocked&&e.selectedNodeId===e.node.id?`bg-primary/opacity-light border-primary/opacity-medium text-content-primary`:`cfg-card text-content-primary/opacity-heavy`,i.unlocked&&e.selectedNodeId!==e.node.id?`hover:bg-stroke-subtle/40 dark:hover:bg-white/opacity-light hover:border-stroke dark:hover:border-white/15`:``,h.value&&!i.disabled?`cursor-pointer`:``,`ml-${e.level*4}`]),onClick:o[5]||=A(e=>!i.disabled&&b(),[`stop`])},[S(`div`,{class:`flex-shrink-0 w-3 h-3 sm:w-4 sm:h-4 flex items-center justify-center`,onClick:A(w,[`stop`])},[h.value?(a(),C(`svg`,{key:0,class:p([`w-2.5 h-2.5 sm:w-3 sm:h-3 transition-transform duration-200`,m.value?`rotate-90`:`rotate-0`]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...o[6]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 5l7 7-7 7`},null,-1)]],2)):_(``,!0)]),S(`div`,_i,[i.node.name.startsWith(`#`)?(a(),C(`svg`,vi,[...o[7]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M7 20l4-16m2 16l4-16M6 9h14M4 15h14`},null,-1)]])):(a(),C(`svg`,yi,[...o[8]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z`},null,-1)]]))]),S(`span`,{class:p([`font-mono text-xs sm:text-sm transition-colors duration-200 break-all`,e.selectedNodeId===e.node.id?`text-primary font-medium`:``])},l(e.node.name.startsWith(`#`)?e.node.name.slice(1):e.node.name),3),e.node.transport_key?(a(),C(`div`,bi,[S(`div`,xi,[S(`button`,{onClick:k,class:`p-1 rounded hover:bg-stroke-subtle dark:hover:bg-white/opacity-light transition-colors`,title:f.value?`Hide full key`:`Show full key`},[...o[9]||=[S(`svg`,{class:`w-3 h-3 text-content-muted dark:text-on-dark-secondary hover:text-content-secondary`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 12a3 3 0 11-6 0 3 3 0 016 0z`}),S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z`})],-1)]],8,Si),f.value?_(``,!0):(a(),C(`span`,Ci,l(c(X)(e.node.transport_key)),1)),f.value?(a(),C(`div`,{key:1,class:`modal-backdrop`,onClick:o[2]||=e=>f.value=!1},[S(`div`,{class:`bg-black/opacity-medium border border-white/opacity-medium rounded-lg shadow-lg p-6 max-w-2xl w-full mx-4`,onClick:o[1]||=A(()=>{},[`stop`])},[S(`div`,wi,[o[11]||=S(`h3`,{class:`text-lg font-semibold text-white`},`Transport Key`,-1),S(`button`,{onClick:o[0]||=e=>f.value=!1,class:`text-white/60 hover:text-white transition-colors`},[...o[10]||=[S(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),S(`div`,Ti,[S(`div`,Ei,l(e.node.transport_key),1)]),S(`div`,Di,[S(`button`,{onClick:P,class:p([`flex items-center gap-2 transition-colors`,c(M)?`btn-primary`:`btn-success`])},[o[12]||=S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z`})],-1),v(J,{copied:c(M),label:`Copy Key`},null,8,[`copied`])],2)])])])):_(``,!0)])])):_(``,!0),S(`div`,Oi,[e.node.last_used?(a(),C(`div`,ki,[o[13]||=S(`span`,{class:`text-xs text-content-muted dark:text-on-dark-muted`},`Last Heard:`,-1),S(`span`,{class:`text-xs text-content-secondary dark:text-on-dark-secondary`,title:e.node.last_used.toLocaleString()},l(c(Y)(e.node.last_used)),9,Ai)])):(a(),C(`div`,ji,[...o[14]||=[S(`span`,{class:`text-xs text-content-muted dark:text-on-dark-subtle`},`Last Heard:`,-1),S(`span`,{class:`text-xs text-content-muted dark:text-on-dark-subtle italic`},`Never`,-1)]])),S(`span`,{class:p([`text-[10px] sm:text-xs`,e.node.floodPolicy===`allow`?`text-accent-green/opacity-heavy`:`text-accent-red/opacity-heavy`])},` Flood: `+l(e.node.floodPolicy===`allow`?`Allow`:`Deny`),3),i.unlocked?(a(),C(x,{key:2},[S(`button`,{onClick:o[3]||=A(t=>s(`edit`,e.node.id),[`stop`]),class:`px-2 py-0.5 text-[10px] sm:text-xs bg-primary/opacity-light hover:bg-primary/opacity-medium text-content-secondary dark:text-content-muted rounded border border-primary/opacity-medium transition-colors whitespace-nowrap`},` Edit `),S(`button`,{onClick:o[4]||=A(t=>s(`delete`,e.node.id),[`stop`]),class:`p-1 text-accent-red/opacity-heavy hover:text-accent-red transition-colors`,title:`Delete`},[...o[15]||=[S(`svg`,{class:`w-3.5 h-3.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16`})],-1)]])],64)):_(``,!0),h.value&&!i.unlocked?(a(),C(`span`,Mi,l(e.node.children.length),1)):_(``,!0)])],2),v(N,{"enter-active-class":`transition-all duration-300 ease-out`,"enter-from-class":`opacity-0 max-h-0 overflow-hidden`,"enter-to-class":`opacity-100 max-h-screen overflow-visible`,"leave-active-class":`transition-all duration-300 ease-in`,"leave-from-class":`opacity-100 max-h-screen overflow-visible`,"leave-to-class":`opacity-0 max-h-0 overflow-hidden`},{default:r(()=>[m.value&&e.node.children.length>0?(a(),C(`div`,Ni,[(a(!0),C(x,null,t(e.node.children,t=>(a(),u(d,{key:t.id,node:t,"selected-node-id":e.selectedNodeId,level:e.level+1,disabled:i.disabled,unlocked:i.unlocked,onSelect:E,onEdit:D,onDelete:O},null,8,[`node`,`selected-node-id`,`level`,`disabled`,`unlocked`]))),128))])):_(``,!0)]),_:1})])}}}),[[`__scopeId`,`data-v-164d2832`]]);function Fi(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name===`Uint8Array`&&`BYTES_PER_ELEMENT`in e&&e.BYTES_PER_ELEMENT===1}function Ii(e,t,n=``){let r=Fi(e),i=e?.length,a=t!==void 0;if(!r||a&&i!==t){let o=n&&`"${n}" `,s=a?` of length ${t}`:``,c=r?`length=${i}`:`type=${typeof e}`,l=o+`expected Uint8Array`+s+`, got `+c;throw r?RangeError(l):TypeError(l)}return e}function Li(e,t=!0){if(e.destroyed)throw Error(`Hash instance has been destroyed`);if(t&&e.finished)throw Error(`Hash#digest() has already been called`)}function Ri(e,t){Ii(e,void 0,`digestInto() output`);let n=t.outputLen;if(e.length=`+n)}function zi(...e){for(let t=0;t>>t}new Uint8Array(new Uint32Array([287454020]).buffer)[0],typeof Uint8Array.from([]).toHex==`function`&&Uint8Array.fromHex;function Hi(e,t={}){let n=(t,n)=>e(n).update(t).digest(),r=e(void 0);return n.outputLen=r.outputLen,n.blockLen=r.blockLen,n.canXOF=r.canXOF,n.create=t=>e(t),Object.assign(n,t),Object.freeze(n)}var Ui=e=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,e])});function Wi(e,t,n){return e&t^~e&n}function Gi(e,t,n){return e&t^e&n^t&n}var Ki=class{blockLen;outputLen;canXOF=!1;padOffset;isLE;buffer;view;finished=!1;length=0;pos=0;destroyed=!1;constructor(e,t,n,r){this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=r,this.buffer=new Uint8Array(e),this.view=Bi(this.buffer)}update(e){Li(this),Ii(e);let{view:t,buffer:n,blockLen:r}=this,i=e.length;for(let a=0;ar-a&&(this.process(n,0),a=0);for(let e=a;el.length)throw Error(`_sha2: outputLen bigger than state`);for(let e=0;e>Yi&Ji)}:{h:Number(e>>Yi&Ji)|0,l:Number(e&Ji)|0}}function Zi(e,t=!1){let n=e.length,r=new Uint32Array(n),i=new Uint32Array(n);for(let a=0;a>>3;$i[e]=(Vi(n,17)^Vi(n,19)^n>>>10)+$i[e-7]+r+$i[e-16]|0}let{A:n,B:r,C:i,D:a,E:o,F:s,G:c,H:l}=this;for(let e=0;e<64;e++){let t=Vi(o,6)^Vi(o,11)^Vi(o,25),u=l+t+Wi(o,s,c)+Qi[e]+$i[e]|0,d=(Vi(n,2)^Vi(n,13)^Vi(n,22))+Gi(n,r,i)|0;l=c,c=s,s=o,o=a+u|0,a=i,i=r,r=n,n=u+d|0}n=n+this.A|0,r=r+this.B|0,i=i+this.C|0,a=a+this.D|0,o=o+this.E|0,s=s+this.F|0,c=c+this.G|0,l=l+this.H|0,this.set(n,r,i,a,o,s,c,l)}roundClean(){zi($i)}destroy(){this.destroyed=!0,this.set(0,0,0,0,0,0,0,0),zi(this.buffer)}},ta=class extends ea{A=qi[0]|0;B=qi[1]|0;C=qi[2]|0;D=qi[3]|0;E=qi[4]|0;F=qi[5]|0;G=qi[6]|0;H=qi[7]|0;constructor(){super(32)}},na=Zi(`0x428a2f98d728ae22.0x7137449123ef65cd.0xb5c0fbcfec4d3b2f.0xe9b5dba58189dbbc.0x3956c25bf348b538.0x59f111f1b605d019.0x923f82a4af194f9b.0xab1c5ed5da6d8118.0xd807aa98a3030242.0x12835b0145706fbe.0x243185be4ee4b28c.0x550c7dc3d5ffb4e2.0x72be5d74f27b896f.0x80deb1fe3b1696b1.0x9bdc06a725c71235.0xc19bf174cf692694.0xe49b69c19ef14ad2.0xefbe4786384f25e3.0x0fc19dc68b8cd5b5.0x240ca1cc77ac9c65.0x2de92c6f592b0275.0x4a7484aa6ea6e483.0x5cb0a9dcbd41fbd4.0x76f988da831153b5.0x983e5152ee66dfab.0xa831c66d2db43210.0xb00327c898fb213f.0xbf597fc7beef0ee4.0xc6e00bf33da88fc2.0xd5a79147930aa725.0x06ca6351e003826f.0x142929670a0e6e70.0x27b70a8546d22ffc.0x2e1b21385c26c926.0x4d2c6dfc5ac42aed.0x53380d139d95b3df.0x650a73548baf63de.0x766a0abb3c77b2a8.0x81c2c92e47edaee6.0x92722c851482353b.0xa2bfe8a14cf10364.0xa81a664bbc423001.0xc24b8b70d0f89791.0xc76c51a30654be30.0xd192e819d6ef5218.0xd69906245565a910.0xf40e35855771202a.0x106aa07032bbd1b8.0x19a4c116b8d2d0c8.0x1e376c085141ab53.0x2748774cdf8eeb99.0x34b0bcb5e19b48a8.0x391c0cb3c5c95a63.0x4ed8aa4ae3418acb.0x5b9cca4f7763e373.0x682e6ff3d6b2b8a3.0x748f82ee5defb2fc.0x78a5636f43172f60.0x84c87814a1f0ab72.0x8cc702081a6439ec.0x90befffa23631e28.0xa4506cebde82bde9.0xbef9a3f7b2c67915.0xc67178f2e372532b.0xca273eceea26619c.0xd186b8c721c0c207.0xeada7dd6cde0eb1e.0xf57d4f7fee6ed178.0x06f067aa72176fba.0x0a637dc5a2c898a6.0x113f9804bef90dae.0x1b710b35131c471b.0x28db77f523047d84.0x32caab7b40c72493.0x3c9ebe0a15c9bebc.0x431d67c49c100d4c.0x4cc5d4becb3e42b6.0x597f299cfc657e2a.0x5fcb6fab3ad6faec.0x6c44198c4a475817`.split(`.`).map(e=>BigInt(e)));na[0],na[1];var ra=Hi(()=>new ta,Ui(1)),ia={class:`flex items-center justify-between mb-6`},aa={class:`text-xl font-semibold text-content-primary`},oa={key:0,class:`text-content-secondary dark:text-content-muted text-sm mt-1`},sa={class:`text-primary font-mono`},ca={key:0,class:`mb-4 text-sm text-content-secondary dark:text-content-muted`},la={key:1,class:`mb-4 text-sm text-content-secondary dark:text-content-muted`},ua={class:`pb-2`},da={class:`flex bg-background-mute dark:bg-stroke/opacity-subtle rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium p-0.5`},fa={class:`modal-field-label`},pa={class:`flex items-center`},ma={key:0,class:`px-3 py-2 bg-secondary/opacity-light border border-r-0 border-secondary/opacity-medium rounded-l-md text-secondary text-sm font-mono`},ha=[`placeholder`],ga={key:0,class:`text-content-muted text-xs mt-1`},_a={key:1,class:`mt-3`},va={class:`flex items-center justify-between mb-1`},ya=[`value`],ba={key:0,class:`text-xs text-accent-amber mt-1`},xa={key:0,class:`bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light rounded-lg p-3`},Sa={class:`flex items-center justify-between`},Ca={class:`text-right`},wa={class:`text-sm text-content-secondary dark:text-content-muted`},Ta={class:`text-xs text-content-muted`},Ea={class:`pt-1 border-t border-stroke-subtle dark:border-stroke/opacity-light`},Da={class:`flex bg-background-mute dark:bg-stroke/opacity-subtle rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium p-0.5`},Oa={class:`modal-actions`},ka=[`disabled`],Aa=f({name:`KeyModal`,__name:`KeyModal`,props:{show:{type:Boolean},node:{},selectedParentId:{},allNodes:{}},emits:[`close`,`add`,`save`],setup(e,{emit:r}){let s=e,d=r,f=y(()=>s.node===null),g=o(``),w=o(`allow`),T=o(`region`),E=y(()=>T.value===`region`),D=y(()=>({type:E.value?`Region`:`Private Key`}));h(()=>s.node,e=>{if(e){let t=e.name.startsWith(`#`);T.value=t?`region`:`privateKey`,g.value=t?e.name.slice(1):e.name,w.value=e.floodPolicy}else g.value=``,w.value=`allow`,T.value=`region`},{immediate:!0});function O(e,t){for(let n of e){if(n.id===t)return n;let e=O(n.children,t);if(e)return e}return null}function k(e,t){for(let n of e){if(n.id===t)return[n];let e=k(n.children,t);if(e.length)return[n,...e]}return[]}let M=y(()=>{let e=f.value?s.selectedParentId:s.node?.parent_id;return e?k(s.allNodes,e):[]}),N=y(()=>{let e=g.value.trim();return e?E.value?`#${e}`:e:s.node?.name||``}),P=y(()=>s.node?s.node.name.startsWith(`#`)?s.node.name.slice(1):s.node.name:``),F=y(()=>g.value.trim()!==P.value);function I(e){let t=e.startsWith(`#`)?e:`#${e}`,n=ra(new TextEncoder().encode(t)).slice(0,16),r=``;return n.forEach(e=>{r+=String.fromCharCode(e)}),btoa(r)}let L=o(null);n(()=>{if(f.value){L.value=null;return}let e=g.value.trim();if(!E.value||!e){L.value=null;return}L.value=I(e)});let{copy:R,copied:z}=ie(),B=y(()=>f.value?g.value.trim().length>0:g.value.trim().length>0&&s.node!==null),ee=()=>{if(!B.value)return;let e=E.value?`#${g.value.trim()}`:g.value.trim();if(f.value)d(`add`,{name:e,floodPolicy:w.value,parentId:s.selectedParentId}),g.value=``,w.value=`allow`,T.value=`region`;else{let t=E.value&&F.value?L.value??I(g.value.trim()):void 0;d(`save`,{id:s.node.id,name:e,floodPolicy:w.value,transportKey:t}),d(`close`)}},V=()=>{f.value&&(g.value=``,w.value=`allow`,T.value=`region`),d(`close`)};return(n,r)=>(a(),u(m,{to:`body`},[e.show?(a(),C(`div`,{key:0,class:`modal-backdrop`,onClick:A(V,[`self`])},[S(`div`,{class:p([`modal-card`,f.value?`max-w-md`:`max-w-lg`])},[S(`div`,ia,[S(`div`,null,[S(`h3`,aa,l(f.value?`Add New Entry`:`Edit Entry`),1),f.value?_(``,!0):(a(),C(`p`,oa,[r[6]||=b(` Modify `,-1),S(`span`,sa,l(N.value),1)]))]),S(`button`,{onClick:V,class:`text-content-muted hover:text-content-primary transition-colors`},[...r[7]||=[S(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),M.value.length>0?(a(),C(`div`,ca,[S(`span`,null,l(f.value?`Adding under:`:`Parent:`),1),(a(!0),C(x,null,t(M.value,(e,t)=>(a(),C(`span`,{key:e.id},[r[8]||=S(`span`,{class:`text-content-muted`},` / `,-1),S(`span`,{class:p(t===M.value.length-1?`text-primary font-mono`:`font-mono`)},l(e.name),3)]))),128))])):f.value?(a(),C(`div`,la,` Adding at root level `)):_(``,!0),S(`form`,{onSubmit:A(ee,[`prevent`]),class:`modal-form`},[S(`div`,ua,[r[9]||=S(`label`,{class:`modal-field-label`},`Entry Type`,-1),S(`div`,da,[S(`button`,{type:`button`,onClick:r[0]||=e=>T.value=`region`,class:p([`flex-1 px-3 py-1.5 text-xs font-medium rounded transition-colors`,T.value===`region`?`bg-secondary/opacity-medium text-secondary border border-secondary/opacity-heavy`:`text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-secondary`])},`REGION`,2),S(`button`,{type:`button`,onClick:r[1]||=e=>T.value=`privateKey`,class:p([`flex-1 px-3 py-1.5 text-xs font-medium rounded transition-colors`,T.value===`privateKey`?`bg-accent-green/opacity-medium text-accent-green border border-accent-green/opacity-heavy`:`text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-secondary`])},`PRIVATE KEY`,2)])]),S(`div`,null,[S(`label`,fa,l(D.value.type)+` Name`,1),S(`div`,pa,[E.value?(a(),C(`span`,ma,`#`)):_(``,!0),i(S(`input`,{"onUpdate:modelValue":r[2]||=e=>g.value=e,type:`text`,placeholder:E.value?`e.g., uk, au, us`:`Enter key name`,class:p([`modal-input`,E.value?`rounded-l-none`:``]),autocomplete:`off`},null,10,ha),[[j,g.value]])]),E.value?(a(),C(`p`,ga,` The # prefix is added automatically for regions. `)):_(``,!0),!f.value&&E.value&&e.node?.transport_key?(a(),C(`div`,_a,[S(`div`,va,[r[11]||=S(`span`,{class:`modal-field-label mb-0 mt-0`},`Transport Key`,-1),F.value?_(``,!0):(a(),C(`button`,{key:0,type:`button`,onClick:r[3]||=t=>c(R)(e.node.transport_key||``),class:p([`text-xs flex items-center gap-1 transition-colors`,c(z)?`text-accent-green`:`text-content-muted hover:text-accent-green`])},[r[10]||=S(`svg`,{class:`w-3 h-3`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z`})],-1),v(J,{copied:c(z)},null,8,[`copied`])],2))]),S(`input`,{value:L.value??e.node.transport_key,readonly:``,class:`modal-input-readonly w-full text-xs`},null,8,ya),F.value?(a(),C(`p`,ba,` Updated for "`+l(N.value)+`" `,1)):_(``,!0)])):_(``,!0)]),!f.value&&e.node?.last_used?(a(),C(`div`,xa,[S(`div`,Sa,[r[12]||=S(`div`,{class:`flex items-center gap-2`},[S(`svg`,{class:`w-4 h-4 text-primary`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z`})]),S(`span`,{class:`text-sm font-medium text-content-primary`},`Last Used`)],-1),S(`div`,Ca,[S(`div`,wa,l(e.node.last_used.toLocaleDateString())+` at `+l(e.node.last_used.toLocaleTimeString()),1),S(`div`,Ta,l(c(Y)(e.node.last_used)),1)])])])):_(``,!0),S(`div`,Ea,[r[13]||=S(`label`,{class:`modal-field-label pt-4`},`Flood Policy`,-1),S(`div`,Da,[S(`button`,{type:`button`,onClick:r[4]||=e=>w.value=`allow`,class:p([`flex-1 px-3 py-1.5 text-xs font-medium rounded transition-colors`,w.value===`allow`?`bg-accent-green/opacity-light text-accent-green border border-accent-green/opacity-medium`:`text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-secondary`])},`ALLOW`,2),S(`button`,{type:`button`,onClick:r[5]||=e=>w.value=`deny`,class:p([`flex-1 px-3 py-1.5 text-xs font-medium rounded transition-colors`,w.value===`deny`?`bg-accent-red/opacity-light text-accent-red border border-accent-red/opacity-medium`:`text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-secondary`])},`DENY`,2)])]),S(`div`,Oa,[S(`button`,{type:`button`,class:`modal-btn-cancel`,onClick:V},`Cancel`),S(`button`,{type:`submit`,disabled:!B.value,class:p([`flex-1 px-4 py-3 rounded-lg transition-colors font-medium`,B.value?`bg-accent-green/opacity-medium hover:bg-accent-green/opacity-medium border border-accent-green/opacity-heavy text-accent-green`:`bg-background-mute dark:bg-stroke/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-medium text-content-muted cursor-not-allowed`])},l(f.value?`Add ${D.value.type}`:`Done`),11,ka)])],32)],2)])):_(``,!0)]))}}),ja={class:`modal-card max-w-lg`},Ma={class:`flex items-center gap-3 mb-6`},Na={class:`text-content-secondary dark:text-content-muted text-sm mt-1`},Pa={class:`text-accent-red font-mono`},Fa={key:0,class:`bg-accent-red/opacity-light border border-accent-red/opacity-medium rounded-lg p-4 mb-6`},Ia={class:`flex items-start gap-3`},La={class:`flex-1`},Ra={class:`text-accent-red font-medium text-sm mb-2`},za={class:`space-y-1 max-h-32 overflow-y-auto`},Ba={key:0,class:`w-3 h-3 text-secondary`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Va={key:1,class:`w-3 h-3 text-accent-green`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Ha={class:`font-mono`},Ua={key:0,class:`text-content-secondary dark:text-content-muted text-xs`},Wa={key:1,class:`mb-6`},Ga={class:`mb-3`},Ka={class:`relative`},qa={class:`space-y-2 max-h-40 overflow-y-auto border border-stroke-subtle dark:border-stroke/opacity-medium rounded-lg p-3 bg-background-mute dark:bg-white/opacity-subtle`},Ja={key:0,class:`text-center py-4 text-content-secondary dark:text-content-muted text-sm`},Ya={class:`relative`},Xa=[`value`],Za={class:`flex items-center gap-2 flex-1`},Qa={class:`text-content-primary font-mono text-sm`},$a={key:0,class:`ml-auto px-2 py-0.5 bg-background-mute dark:bg-stroke/opacity-subtle text-content-secondary dark:text-content-muted text-xs rounded-full`},eo={class:`flex gap-3`},to=f({__name:`DeleteConfirmModal`,props:{show:{type:Boolean},node:{},allNodes:{}},emits:[`close`,`delete-all`,`move-children`],setup(e,{emit:n}){let r=e,s=n,c=o(null),d=o(``),f=e=>{let t=[],n=e=>{for(let r of e.children)t.push(r),n(r)};return n(e),t},h=y(()=>r.node?f(r.node):[]),g=y(()=>{if(!r.node)return[];let e=new Set([r.node.id,...h.value.map(e=>e.id)]),t=n=>{let r=[];for(let i of n)i.name.startsWith(`#`)&&!e.has(i.id)&&r.push(i),i.children.length>0&&r.push(...t(i.children));return r};return t(r.allNodes)}),v=y(()=>{if(!d.value.trim())return g.value;let e=d.value.toLowerCase();return g.value.filter(t=>t.name.toLowerCase().includes(e))}),w=()=>{r.node&&(s(`delete-all`,r.node.id),E())},T=()=>{!r.node||!c.value||(s(`move-children`,{nodeId:r.node.id,targetParentId:c.value}),E())},E=()=>{c.value=null,d.value=``,s(`close`)};return(n,r)=>(a(),u(m,{to:`body`},[e.show&&e.node?(a(),C(`div`,{key:0,onClick:r[2]||=A(e=>E(),[`self`]),class:`modal-backdrop-heavy`},[S(`div`,ja,[S(`div`,Ma,[r[6]||=S(`svg`,{class:`w-6 h-6 text-accent-red`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z`})],-1),S(`div`,null,[r[4]||=S(`h3`,{class:`text-xl font-semibold text-content-primary`},` Confirm Deletion `,-1),S(`p`,Na,[r[3]||=b(` Deleting `,-1),S(`span`,Pa,l(e.node?.name),1)])]),S(`button`,{onClick:E,class:`ml-auto text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary transition-colors`},[...r[5]||=[S(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),h.value.length>0?(a(),C(`div`,Fa,[S(`div`,Ia,[r[9]||=S(`svg`,{class:`w-5 h-5 text-accent-red flex-shrink-0 mt-0.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`})],-1),S(`div`,La,[S(`h4`,Ra,` This will affect `+l(h.value.length)+` child `+l(h.value.length===1?`entry`:`entries`)+`: `,1),S(`div`,za,[(a(!0),C(x,null,t(h.value.slice(0,10),e=>(a(),C(`div`,{key:e.id,class:`flex items-center gap-2 text-xs text-content-secondary dark:text-content-primary/opacity-heavy`},[e.name.startsWith(`#`)?(a(),C(`svg`,Ba,[...r[7]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M7 20l4-16m2 16l4-16M6 9h14M4 15h14`},null,-1)]])):(a(),C(`svg`,Va,[...r[8]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1721 9z`},null,-1)]])),S(`span`,Ha,l(e.name),1),S(`span`,{class:p([`px-1 py-0.5 text-xs rounded`,e.floodPolicy===`allow`?`bg-accent-green/opacity-medium text-accent-green`:`bg-accent-red/opacity-medium text-accent-red`])},l(e.floodPolicy),3)]))),128)),h.value.length>10?(a(),C(`div`,Ua,` ...and `+l(h.value.length-10)+` more `,1)):_(``,!0)])])])])):_(``,!0),h.value.length>0&&g.value.length>0?(a(),C(`div`,Wa,[r[13]||=S(`h4`,{class:`text-content-primary font-medium text-sm mb-3`},` Move children to another region: `,-1),S(`div`,Ga,[S(`div`,Ka,[r[10]||=S(`svg`,{class:`absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-content-muted`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z`})],-1),i(S(`input`,{"onUpdate:modelValue":r[0]||=e=>d.value=e,type:`text`,placeholder:`Search regions...`,class:`modal-input pl-9`},null,512),[[j,d.value]])])]),S(`div`,qa,[v.value.length===0?(a(),C(`div`,Ja,l(d.value?`No regions match your search`:`No available regions`),1)):_(``,!0),(a(!0),C(x,null,t(v.value,e=>(a(),C(`label`,{key:e.id,class:`flex items-center gap-3 p-2 rounded cursor-pointer hover:bg-stroke-subtle dark:hover:bg-white/opacity-light transition-colors group`},[S(`div`,Ya,[i(S(`input`,{type:`radio`,value:e.id,"onUpdate:modelValue":r[1]||=e=>c.value=e,class:`sr-only peer`},null,8,Xa),[[k,c.value]]),r[11]||=S(`div`,{class:`w-4 h-4 border-2 border-stroke dark:border-stroke/opacity-medium rounded-full group-hover:border-stroke dark:group-hover:border-stroke/opacity-heavy peer-checked:border-primary peer-checked:bg-primary/opacity-medium transition-all`},[S(`div`,{class:`w-2 h-2 rounded-full bg-primary scale-0 peer-checked:scale-100 transition-transform absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2`})],-1)]),S(`div`,Za,[r[12]||=S(`svg`,{class:`w-4 h-4 text-secondary`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M7 20l4-16m2 16l4-16M6 9h14M4 15h14`})],-1),S(`span`,Qa,l(e.name),1),e.children.length>0?(a(),C(`span`,$a,l(e.children.length),1)):_(``,!0)])]))),128))])])):_(``,!0),S(`div`,eo,[S(`button`,{onClick:E,class:`flex-1 px-4 py-3 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light border border-stroke-subtle dark:border-stroke/opacity-medium text-content-primary rounded-lg transition-colors`},` Cancel `),h.value.length>0&&c.value?(a(),C(`button`,{key:0,onClick:T,class:`modal-btn-primary`},` Move & Delete `)):_(``,!0),S(`button`,{onClick:w,class:`modal-btn-danger`},l(h.value.length>0?`Delete All`:`Delete`),1)])])])):_(``,!0)]))}}),no={class:`space-y-12`},ro={class:`cfg-page-heading flex flex-col sm:flex-row sm:justify-between sm:items-start gap-3`},io={class:`flex items-center gap-2 flex-shrink-0`},ao=[`disabled`],oo=[`disabled`],so=[`disabled`],co={key:0,class:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium border border-accent-red/opacity-heavy rounded-lg p-3`},lo={class:`text-accent-red text-sm`},uo={class:`cfg-section`},fo={class:`flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3`},po={key:0,class:`text-xs text-content-muted pb-1`},mo={key:1,class:`flex items-center justify-center py-8`},ho={key:2,class:`text-center py-8`},go={class:`text-content-secondary dark:text-content-muted text-sm`},_o={key:3,class:`text-center py-8`},vo={key:4,class:`space-y-2`},yo=f({name:`TransportKeys`,__name:`TransportKeys`,setup(n,{expose:r}){let i=hi(),s=ee(),d=o(!1),f=o(!1),m=o(null),g=-1;function w(){return g--}let T=o(`deny`),E=`deny`;h(y(()=>s.stats?.config?.mesh?.unscoped_flood_allow??null),e=>{e!==null&&!d.value&&(T.value=e?`allow`:`deny`)},{immediate:!0});let D=o([]),O=null,k=o(!1),A=o(null),j=o(!1),M=o(!1),N=o(!1),P=o(null),F=o(null);function I(e){return e.map(e=>({...e,children:I(e.children)}))}function L(e,t){let n=[];for(let r of e)n.push({node:r,parentId:t}),n.push(...L(r.children,r.id));return n}function z(e,t){for(let n of e){if(n.id===t)return n;let e=z(n.children,t);if(e)return e}return null}function B(e,t){let n=e.findIndex(e=>e.id===t);if(n!==-1)return e.splice(n,1),!0;for(let n of e)if(B(n.children,t))return!0;return!1}let V=e=>{let t=new Map,n=[];return e.forEach(e=>{t.set(e.id,{id:e.id,name:e.name,floodPolicy:e.flood_policy,transport_key:e.transport_key,last_used:e.last_used?new Date(e.last_used*1e3):void 0,parent_id:e.parent_id,children:[]})}),t.forEach(e=>{e.parent_id&&t.has(e.parent_id)?t.get(e.parent_id).children.push(e):n.push(e)}),n},H=async()=>{k.value=!0,A.value=null;try{let e=await R.getTransportKeys();e.success&&e.data?D.value=V(e.data):A.value=e.error||`Failed to load regions`}catch(e){A.value=e instanceof Error?e.message:`Unknown error occurred`}finally{k.value=!1}};e(H);function U(){O=I(D.value),E=T.value,d.value=!0,m.value=null}function G(){O&&(D.value=I(O)),T.value=E,O=null,d.value=!1,m.value=null,i.setSelectedNode(null)}async function K(){f.value=!0,m.value=null;try{let e=L(D.value),t=O?L(O):[],n=new Map(t.map(({node:e})=>[e.id,e])),r=e.filter(({node:e})=>e.id>0),a=e.filter(({node:e})=>e.id<0),o=new Set(r.map(({node:e})=>e.id));for(let{node:e}of t)o.has(e.id)||await R.deleteTransportKey(e.id);let c=new Map,l=[...a],u=l.length*2;for(;l.length&&u-- >0;){let e=l.findIndex(({parentId:e})=>e===void 0||e>0||e<0&&c.has(e));if(e===-1)break;let{node:t,parentId:n}=l.splice(e,1)[0],r=n===void 0?void 0:n>0?n:c.get(n),i=await R.createTransportKey(t.name,t.floodPolicy,t.transport_key,r);i.success&&i.data?.id&&c.set(t.id,i.data.id)}for(let{node:e}of r){let t=n.get(e.id);t&&(e.name!==t.name||e.floodPolicy!==t.floodPolicy||e.transport_key!==t.transport_key)&&await R.updateTransportKey(e.id,e.name,e.floodPolicy,e.transport_key)}T.value!==E&&await R.updateUnscopedFloodPolicy(T.value===`allow`),await H(),await s.fetchStats(),O=null,d.value=!1,i.setSelectedNode(null)}catch(e){m.value=e instanceof Error?e.message:`Save failed`}finally{f.value=!1}}function te(e){i.setSelectedNode(e)}function q(){j.value=!0}function ne(e){let t={id:w(),name:e.name,floodPolicy:e.floodPolicy,children:[]};if(e.parentId){let n=z(D.value,e.parentId);n?n.children.push(t):D.value.push(t)}else D.value.push(t);j.value=!1}function re(e){let t=z(D.value,e);t&&(P.value=t,M.value=!0)}function ie(e){let t=z(D.value,e.id);t&&(t.name=e.name,t.floodPolicy=e.floodPolicy,e.transportKey!==void 0&&(t.transport_key=e.transportKey)),M.value=!1,P.value=null}function J(){M.value=!1,P.value=null}function Y(e){let t=z(D.value,e);t&&(F.value=t,N.value=!0)}function X(e){B(D.value,e),i.setSelectedNode(null),N.value=!1,F.value=null}function Z(e){let t=z(D.value,e.nodeId);if(t?.children.length){let n=z(D.value,e.targetParentId);n?n.children.push(...t.children):D.value.push(...t.children)}B(D.value,e.nodeId),i.setSelectedNode(null),N.value=!1,F.value=null}function Q(e){T.value=e}let{showUnsavedModal:ae,requestLeave:oe,handleDiscard:se,handleSave:$,handleCancel:ce}=pe(d,f,G,async()=>(await K(),!d.value));return r({requestLeave:oe,isEditing:d}),(e,n)=>(a(),C(x,null,[v(fe,{show:c(ae),"is-saving":f.value,label:`Region Configuration`,onDiscard:c(se),onSave:c($),onCancel:c(ce)},null,8,[`show`,`is-saving`,`onDiscard`,`onSave`,`onCancel`]),S(`div`,no,[S(`div`,ro,[n[6]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},` Region Configuration `),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},` Manage regional key hierarchy `)],-1),S(`div`,io,[d.value?(a(),C(`button`,{key:0,onClick:q,class:`cfg-btn-secondary flex items-center gap-1.5`,disabled:f.value},[...n[5]||=[S(`svg`,{class:`w-3.5 h-3.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 4v16m8-8H4`})],-1),b(` Add Region `,-1)]],8,ao)):_(``,!0),d.value?(a(),C(x,{key:2},[S(`button`,{onClick:G,disabled:f.value,class:`cfg-btn-secondary`},`Cancel`,8,oo),S(`button`,{onClick:K,disabled:f.value,class:`cfg-btn-primary`},l(f.value?`Saving…`:`Save Changes`),9,so)],64)):(a(),C(`button`,{key:1,onClick:U,class:`cfg-btn-primary`},`Edit Settings`))])]),m.value?(a(),C(`div`,co,[S(`p`,lo,l(m.value),1)])):_(``,!0),S(`div`,uo,[S(`div`,fo,[n[7]||=S(`div`,null,[S(`h4`,{class:`text-xs sm:text-sm font-medium text-content-primary mb-1`},` Unscoped Flood Policy (*) `),S(`p`,{class:`text-content-secondary dark:text-content-muted text-[10px] sm:text-xs`},` Allow or Deny unscoped flood packets `)],-1),S(`div`,{class:p([`flex bg-background-mute dark:bg-stroke/opacity-subtle rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium p-0.5 sm:p-1`,d.value?``:`opacity-50 pointer-events-none`])},[S(`button`,{onClick:n[0]||=e=>Q(`deny`),class:p([`px-2 sm:px-3 py-1 text-[10px] sm:text-xs font-medium rounded transition-colors`,T.value===`deny`?`bg-accent-red/opacity-medium text-accent-red border border-accent-red/opacity-heavy`:`text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-secondary`])},` DENY `,2),S(`button`,{onClick:n[1]||=e=>Q(`allow`),class:p([`px-2 sm:px-3 py-1 text-[10px] sm:text-xs font-medium rounded transition-colors`,T.value===`allow`?`bg-accent-green/opacity-medium text-accent-green border border-accent-green/opacity-heavy`:`text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-secondary`])},` ALLOW `,2)],2)])]),S(`div`,{class:`cfg-section space-y-4`,onClick:n[2]||=e=>d.value&&c(i).setSelectedNode(null)},[n[11]||=S(`h3`,{class:`text-lg font-semibold text-content-primary`},`Regions`,-1),d.value?(a(),C(`p`,po,` To add a child region, click on a region to select it, then click "Add Region". `)):_(``,!0),k.value?(a(),C(`div`,mo,[v(W),n[8]||=S(`span`,{class:`ml-2 text-content-secondary dark:text-content-muted`},`Loading regions…`,-1)])):A.value?(a(),C(`div`,ho,[n[9]||=S(`div`,{class:`text-accent-red mb-2`},`⚠️ Error loading regions`,-1),S(`div`,go,l(A.value),1),S(`button`,{onClick:H,class:`btn-success mt-4`},` Retry `)])):D.value.length===0?(a(),C(`div`,_o,[...n[10]||=[S(`div`,{class:`text-content-muted mb-2`},`No regions found`,-1),S(`div`,{class:`text-content-muted/opacity-heavy text-sm`},` Click "Edit Settings" then "Add Region" to get started `,-1)]])):(a(),C(`div`,vo,[(a(!0),C(x,null,t(D.value,e=>(a(),u(Pi,{key:e.id,node:e,"selected-node-id":c(i).selectedNodeId.value,level:0,unlocked:d.value,onSelect:te,onEdit:re,onDelete:Y},null,8,[`node`,`selected-node-id`,`unlocked`]))),128))]))]),v(Aa,{show:j.value,node:null,"selected-parent-id":c(i).selectedNodeId.value||void 0,"all-nodes":D.value,onClose:n[3]||=e=>j.value=!1,onAdd:ne},null,8,[`show`,`selected-parent-id`,`all-nodes`]),v(Aa,{show:M.value,node:P.value,"all-nodes":D.value,onClose:J,onSave:ie},null,8,[`show`,`node`,`all-nodes`]),v(to,{show:N.value,node:F.value,"all-nodes":D.value,onClose:n[4]||=e=>{N.value=!1,F.value=null},onDeleteAll:X,onMoveChildren:Z},null,8,[`show`,`node`,`all-nodes`])])],64))}}),bo={class:`space-y-12`},xo={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3`},So={key:0,class:`bg-accent-red/opacity-light border border-accent-red/opacity-medium rounded-lg p-4`},Co={class:`flex items-center gap-2 text-accent-red`},wo={key:1,class:`flex items-center justify-center py-12`},To={class:`text-center`},Eo={key:2,class:`space-y-3`},Do={class:`flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3`},Oo={class:`flex-1`},ko={class:`flex items-center gap-2 sm:gap-3`},Ao={class:`min-w-0 flex-1`},jo={class:`text-content-primary font-medium text-sm sm:text-base break-all`},Mo={class:`flex flex-col sm:flex-row sm:items-center sm:gap-4 mt-1 text-xs text-content-secondary dark:text-content-muted`},No={class:`truncate`},Po={class:`truncate`},Fo=[`onClick`,`disabled`],Io={key:3,class:`text-center py-12`},Lo={class:`bg-surface dark:bg-surface-elevated border border-stroke-subtle dark:border-stroke/opacity-medium rounded-[15px] p-6 max-w-md w-full shadow-2xl`},Ro={class:`space-y-4`},zo={class:`flex justify-end gap-3 mt-6`},Bo=[`disabled`],Vo=[`disabled`],Ho={class:`bg-surface dark:bg-surface-elevated border border-stroke-subtle dark:border-stroke/opacity-medium rounded-[15px] p-6 max-w-lg w-full shadow-2xl`},Uo={class:`space-y-4`},Wo={class:`flex gap-2`},Go=[`value`],Ko={key:0,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},qo={key:1,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Jo={class:`cfg-card p-4`},Yo={class:`code-block`},Xo=f({name:`APITokens`,__name:`APITokens`,setup(n){let r=o([]),s=o(!1),u=o(null),f=o(!1),m=o(``),h=o(null),g=o(!1),w=o(!1),T=o(null),E=async()=>{s.value=!0,u.value=null;try{let e=await R.get(`/auth/tokens`);r.value=(e.data||e).tokens||[]}catch(e){console.error(`Failed to fetch API tokens:`,e),u.value=e instanceof Error?e.message:`Failed to fetch tokens`}finally{s.value=!1}},D=async()=>{if(!m.value.trim()){u.value=`Token name is required`;return}s.value=!0,u.value=null;try{let e=await R.post(`/auth/tokens`,{name:m.value.trim()});h.value=(e.data||e).token||null,f.value=!1,g.value=!0,m.value=``,await E()}catch(e){console.error(`Failed to create API token:`,e),u.value=e instanceof Error?e.message:`Failed to create token`}finally{s.value=!1}},k=(e,t)=>{T.value={id:e,name:t},w.value=!0},M=async()=>{if(T.value){s.value=!0,u.value=null;try{await R.delete(`/auth/tokens/${T.value.id}`),await E(),w.value=!1,T.value=null}catch(e){console.error(`Failed to revoke API token:`,e),u.value=e instanceof Error?e.message:`Failed to revoke token`}finally{s.value=!1}}},N=()=>{f.value=!1,m.value=``,u.value=null},P=()=>{g.value=!1,h.value=null},{copy:F,copied:I}=ie(),L=()=>{h.value&&F(h.value)},z=e=>e?new Date(e*1e3).toLocaleString():`Never`,B=y(()=>`${window.location.origin}/api/stats`);return e(()=>{E()}),(e,n)=>(a(),C(x,null,[S(`div`,bo,[S(`div`,xo,[n[5]||=S(`div`,null,[S(`h2`,{class:`text-lg sm:text-xl font-semibold text-content-primary`},` API Tokens `),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm mt-1`},` Manage API tokens for machine-to-machine authentication `)],-1),S(`button`,{onClick:n[0]||=e=>f.value=!0,class:`cfg-btn-primary flex items-center justify-center gap-2`},[...n[4]||=[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 4v16m8-8H4`})],-1),b(` Create Token `,-1)]])]),n[21]||=d(`

API tokens are used for machine-to-machine authentication. Include the token in the X-API-Key header when making API requests.

Tokens are only shown once at creation. Store them securely.

`,1),u.value?(a(),C(`div`,So,[S(`div`,Co,[n[6]||=S(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`})],-1),b(` `+l(u.value),1)])])):_(``,!0),s.value&&r.value.length===0?(a(),C(`div`,wo,[S(`div`,To,[v(W,{class:`mx-auto mb-4`}),n[7]||=S(`div`,{class:`text-content-secondary dark:text-content-muted`},`Loading tokens...`,-1)])])):r.value.length>0?(a(),C(`div`,Eo,[(a(!0),C(x,null,t(r.value,e=>(a(),C(`div`,{key:e.id,class:`bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light rounded-lg p-3 sm:p-4 hover:bg-stroke-subtle dark:hover:bg-white/opacity-light transition-colors`},[S(`div`,Do,[S(`div`,Oo,[S(`div`,ko,[n[8]||=S(`svg`,{class:`w-4 h-4 sm:w-5 sm:h-5 text-primary flex-shrink-0`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z`})],-1),S(`div`,Ao,[S(`h3`,jo,l(e.name),1),S(`div`,Mo,[S(`span`,No,`Created: `+l(z(e.created_at)),1),S(`span`,Po,`Last used: `+l(z(e.last_used)),1)])])])]),S(`button`,{onClick:t=>k(e.id,e.name),disabled:s.value,class:`w-full sm:w-auto px-3 py-1.5 bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium hover:bg-accent-red/opacity-medium text-accent-red rounded-lg border border-accent-red/opacity-heavy transition-colors disabled:opacity-50 text-sm`},` Revoke `,8,Fo)])]))),128))])):(a(),C(`div`,Io,[n[9]||=S(`svg`,{class:`w-16 h-16 text-content-muted/opacity-heavy mx-auto mb-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z`})],-1),n[10]||=S(`h3`,{class:`text-content-primary font-medium mb-2`},`No API Tokens`,-1),n[11]||=S(`p`,{class:`text-content-secondary dark:text-content-muted text-sm mb-4`},` Create a token to enable API access `,-1),S(`button`,{onClick:n[1]||=e=>f.value=!0,class:`cfg-btn-primary`},` Create Your First Token `)])),f.value?(a(),C(`div`,{key:4,class:`modal-backdrop`,onClick:A(N,[`self`])},[S(`div`,Lo,[n[14]||=S(`h3`,{class:`text-xl font-semibold text-content-primary mb-4`},` Create API Token `,-1),S(`div`,Ro,[S(`div`,null,[n[12]||=S(`label`,{class:`block text-sm font-medium text-content-secondary dark:text-content-muted mb-2`},`Token Name`,-1),i(S(`input`,{"onUpdate:modelValue":n[2]||=e=>m.value=e,type:`text`,placeholder:`e.g., Production Server, CI/CD Pipeline`,class:`cfg-input placeholder-content-muted dark:placeholder-content-muted`,onKeydown:O(D,[`enter`])},null,544),[[j,m.value]]),n[13]||=S(`p`,{class:`text-xs text-content-muted mt-1`},` Give your token a descriptive name to identify its purpose `,-1)]),S(`div`,zo,[S(`button`,{onClick:N,disabled:s.value,class:`px-4 py-2 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light text-content-primary rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light transition-colors disabled:opacity-50`},` Cancel `,8,Bo),S(`button`,{onClick:D,disabled:s.value||!m.value.trim(),class:`btn-primary`},l(s.value?`Creating...`:`Create Token`),9,Vo)])])])])):_(``,!0),g.value&&h.value?(a(),C(`div`,{key:5,class:`modal-backdrop`,onClick:A(P,[`self`])},[S(`div`,Ho,[n[20]||=S(`h3`,{class:`text-xl font-semibold text-content-primary mb-4`},` Token Created Successfully `,-1),S(`div`,Uo,[n[19]||=d(`
Save this token now! For security reasons, it will not be shown again.
`,1),S(`div`,null,[n[17]||=S(`label`,{class:`block text-sm font-medium text-content-secondary dark:text-content-muted mb-2`},`Your API Token`,-1),S(`div`,Wo,[S(`input`,{value:h.value,readonly:``,class:`modal-input-readonly flex-1 text-sm`},null,8,Go),S(`button`,{onClick:L,class:p([`flex items-center gap-2 transition-colors`,c(I)?`btn-success`:`btn-primary`])},[c(I)?(a(),C(`svg`,qo,[...n[16]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 13l4 4L19 7`},null,-1)]])):(a(),C(`svg`,Ko,[...n[15]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z`},null,-1)]])),v(J,{copied:c(I)},null,8,[`copied`])],2)])]),S(`div`,Jo,[n[18]||=S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted mb-2`},[S(`strong`,null,`Usage Example:`)],-1),S(`code`,Yo,` curl -H "X-API-Key: `+l(h.value)+`" `+l(B.value),1)]),S(`div`,{class:`flex justify-end mt-6`},[S(`button`,{onClick:P,class:`btn-primary`},` Done `)])])])])):_(``,!0)]),v(ne,{show:w.value,title:`Revoke API Token`,message:`Are you sure you want to revoke the token '${T.value?.name}'? This action cannot be undone.`,"confirm-text":`Revoke`,"cancel-text":`Cancel`,variant:`danger`,onConfirm:M,onClose:n[3]||=e=>w.value=!1},null,8,[`show`,`message`])],64))}}),Zo={class:`space-y-12`},Qo={class:`cfg-section`},$o={class:`space-y-4`},es=[`disabled`],ts={class:`cfg-section`},ns={class:`space-y-4`},rs={class:`flex items-center justify-between`},is=[`disabled`],as={class:`cfg-section`},os={class:`space-y-4`},ss={class:`space-y-3`},cs=[`checked`,`disabled`],ls=[`checked`,`disabled`],us={class:`flex items-start gap-3`},ds={key:0,class:`w-5 h-5 text-accent-green flex-shrink-0 mt-0.5`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`},fs={key:1,class:`w-5 h-5 text-accent-cyan flex-shrink-0 mt-0.5`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`},ps={class:`flex-1`},ms={class:`text-sm font-medium text-content-primary`},hs={key:0,class:`text-xs text-accent-green mt-1`},gs={key:1,class:`p-4 bg-accent-amber/opacity-light border border-accent-amber/opacity-medium rounded-lg`},_s={class:`flex items-start justify-between gap-3`},vs=[`disabled`],ys={key:1,class:`w-4 h-4`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`},bs={class:`flex items-center space-x-2`},xs={key:0,class:`w-5 h-5 text-accent-green`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`},Ss={key:1,class:`w-5 h-5 text-accent-red`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`},Cs=f({name:`WebSettings`,__name:`WebSettings`,setup(t){let{stats:n}=B(ee()),r=o(!1),c=o(``),f=o(!1),m=o(!1),h=o(!1),g=o(!1),v=o(!0),w=s({cors_enabled:!1,use_default_frontend:!0,site_name:``}),T=y(()=>f.value?`bg-accent-green/opacity-light border-accent-green/opacity-medium`:`bg-accent-red/opacity-light border-accent-red/opacity-medium`);async function E(){try{v.value=!0;let e=await R.get(`/check_pymc_console`);e.success&&e.data&&(g.value=e.data.exists)}catch(e){console.error(`Failed to check openHop Console:`,e),g.value=!1}finally{v.value=!1}}function D(){let e=n.value?.config?.web||{};w.cors_enabled=e.cors_enabled===!0;let t=e.web_path;w.use_default_frontend=!t||t===``,w.site_name=typeof n.value?.site_name==`string`?n.value.site_name:``}async function O(){r.value=!0,c.value=``;try{let e={web:{cors_enabled:w.cors_enabled,site_name:w.site_name.trim()}};w.use_default_frontend?e.web.web_path=null:e.web.web_path=`/opt/pymc_console/web/html`;let t=await R.post(`/update_web_config`,e);t.success?(N(`Settings saved successfully`,!0),m.value=!0):N(t.error||`Failed to save settings`,!1)}catch(e){console.error(`Failed to save web settings:`,e),N(e.message||`Failed to save settings`,!1)}finally{r.value=!1}}async function k(){w.cors_enabled=!w.cors_enabled,await O()}async function A(){w.use_default_frontend=!0,await O()}async function M(){if(!g.value){N(`openHop Console is not installed. Please install it before switching.`,!1);return}w.use_default_frontend=!1,await O()}function N(e,t){c.value=e,f.value=t,setTimeout(()=>{c.value=``},5e3)}async function P(){h.value=!0,c.value=``;try{let e=await R.post(`/restart_service`,{});e.success?(N(`Service restart initiated. Page will reload...`,!0),m.value=!1,setTimeout(()=>{window.location.reload()},2e3)):N(e.error||`Failed to restart service`,!1)}catch(e){e.code===`ERR_NETWORK`||e.message?.includes(`Network error`)?(N(`Service restarting... Page will reload`,!0),m.value=!1,setTimeout(()=>{window.location.reload()},3e3)):(console.error(`Failed to restart service:`,e),N(e.message||`Failed to restart service`,!1))}finally{h.value=!1}}return e(()=>{D(),E()}),(e,t)=>(a(),C(`div`,Zo,[t[17]||=S(`div`,{class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},[S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`Web Options`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Configure site identification, CORS policy and web frontend selection`)])],-1),S(`div`,Qo,[t[3]||=S(`div`,{class:`flex items-start justify-between mb-4`},[S(`div`,null,[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},` Site Identification `),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},` Customise the browser tab title and login page caption `)])],-1),S(`div`,$o,[S(`div`,null,[t[1]||=S(`label`,{for:`site-name`,class:`block text-sm font-medium text-content-primary mb-2`},` Site Name `,-1),i(S(`input`,{id:`site-name`,"onUpdate:modelValue":t[0]||=e=>w.site_name=e,type:`text`,maxlength:`80`,placeholder:`e.g. Base Station Alpha`,class:`w-full px-3 py-2 rounded-lg bg-background-mute dark:bg-background/40 border border-stroke-subtle dark:border-stroke/opacity-medium text-sm text-content-primary placeholder-content-muted dark:placeholder-content-muted focus:outline-none focus:border-primary/opacity-heavy transition-colors`,onChange:O,disabled:r.value},null,40,es),[[j,w.site_name]]),t[2]||=S(`p`,{class:`text-xs text-content-secondary dark:text-content-muted mt-1.5`},` Shown in the browser tab and above the login form. Leave blank to use the default title. `,-1)])])]),S(`div`,ts,[t[5]||=S(`div`,{class:`flex items-start justify-between mb-4`},[S(`div`,null,[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},` CORS Settings `),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},` Control cross-origin resource sharing for API access `)])],-1),S(`div`,ns,[S(`div`,rs,[t[4]||=S(`div`,null,[S(`label`,{class:`text-sm font-medium text-content-primary`},`Enable CORS`),S(`p`,{class:`text-xs text-content-secondary dark:text-content-muted mt-1`},` Allow web frontends from different origins to access the API `)],-1),S(`button`,{onClick:k,disabled:r.value,class:p([`relative inline-flex h-6 w-11 items-center rounded-full transition-colors border-2`,w.cors_enabled?`bg-accent-cyan border-accent-cyan`:`bg-background-mute border-background-mute`,r.value?`opacity-50 cursor-not-allowed`:`cursor-pointer`])},[S(`span`,{class:p([`inline-block h-4 w-4 transform rounded-full bg-white transition-transform shadow-lg`,w.cors_enabled?`translate-x-5`:`translate-x-0.5`])},null,2)],10,is)])])]),S(`div`,as,[t[14]||=S(`div`,{class:`flex items-start justify-between mb-4`},[S(`div`,null,[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},` Web Frontend `),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},` Choose which web interface to use `)])],-1),S(`div`,os,[S(`div`,ss,[S(`label`,{class:p([`flex items-start space-x-3 p-4 bg-background-mute dark:bg-background/30 rounded-lg border-2 cursor-pointer transition-all`,w.use_default_frontend?`border-accent-cyan bg-accent-cyan/opacity-light`:`border-stroke-subtle dark:border-stroke/opacity-light hover:border-accent-cyan/opacity-heavy dark:hover:border-accent-cyan/opacity-heavy`])},[S(`input`,{type:`radio`,name:`frontend`,checked:w.use_default_frontend,onChange:A,disabled:r.value,class:`mt-1 h-4 w-4 text-accent-cyan focus:ring-accent-cyan focus:ring-offset-background`},null,40,cs),t[6]||=S(`div`,{class:`flex-1`},[S(`div`,{class:`text-sm font-medium text-content-primary`},` Default Frontend `),S(`div`,{class:`text-xs text-content-secondary dark:text-content-muted mt-1`},` Built-in Repeater web interface `),S(`div`,{class:`text-xs text-content-muted/opacity-heavy mt-1 font-mono`},` Built-in `)],-1)],2),S(`label`,{class:p([`flex items-start space-x-3 p-4 bg-background-mute dark:bg-background/30 rounded-lg border-2 transition-all`,g.value?`cursor-pointer`:`opacity-50 cursor-not-allowed`,w.use_default_frontend?`border-stroke-subtle dark:border-stroke/opacity-light hover:border-accent-cyan/opacity-heavy dark:hover:border-accent-cyan/opacity-heavy`:`border-accent-cyan bg-accent-cyan/opacity-light`])},[S(`input`,{type:`radio`,name:`frontend`,checked:!w.use_default_frontend,onChange:M,disabled:r.value||!g.value,class:`mt-1 h-4 w-4 text-accent-cyan focus:ring-accent-cyan focus:ring-offset-background`},null,40,ls),t[7]||=d(`
openHop Console
@Treehouse⚡
Alternative web interface for Repeater
/opt/pymc_console/web/html
`,1)],2)]),v.value?_(``,!0):(a(),C(`div`,{key:0,class:p([`p-4 rounded-lg border`,g.value?`bg-accent-green/opacity-light border-accent-green/opacity-medium`:`bg-accent-cyan/opacity-light border-accent-cyan/opacity-medium`])},[S(`div`,us,[g.value?(a(),C(`svg`,ds,[...t[8]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z`},null,-1)]])):(a(),C(`svg`,fs,[...t[9]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`},null,-1)]])),S(`div`,ps,[S(`h4`,ms,l(g.value?`openHop Console has been detected`:`openHop Console Not Installed`),1),g.value?(a(),C(`p`,hs,[...t[10]||=[b(` openHop Console is installed at `,-1),S(`code`,{class:`text-accent-green`},`/opt/pymc_console/web/html`,-1)]])):(a(),C(x,{key:1},[t[11]||=d(`

openHop Console must be installed at /opt/pymc_console/web/html before selecting this option.

openHop Console Install Instructions `,2)],64))])])],2)),m.value?(a(),C(`div`,gs,[S(`div`,_s,[t[13]||=d(`

Service restart required

Web frontend changes will take effect after restarting the openHop repeater service.

`,1),S(`button`,{onClick:P,disabled:h.value,class:`px-4 py-2 bg-accent-amber/opacity-medium hover:bg-accent-amber/opacity-medium disabled:opacity-50 text-accent-amber font-medium rounded-lg border border-accent-amber/opacity-heavy transition-colors disabled:cursor-not-allowed flex items-center gap-2 whitespace-nowrap`},[h.value?(a(),u(W,{key:0,size:`sm`,color:`current`})):(a(),C(`svg`,ys,[...t[12]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15`},null,-1)]])),b(` `+l(h.value?`Restarting...`:`Restart Now`),1)],8,vs)])])):_(``,!0)])]),c.value?(a(),C(`div`,{key:0,class:p([`p-4 rounded-lg border`,T.value])},[S(`div`,bs,[f.value?(a(),C(`svg`,xs,[...t[15]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 13l4 4L19 7`},null,-1)]])):(a(),C(`svg`,Ss,[...t[16]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`},null,-1)]])),S(`span`,{class:p(f.value?`text-accent-green`:`text-accent-red`)},l(c.value),3)])],2)):_(``,!0)]))}}),ws={ref:`rootEl`,class:`space-y-12`},Ts={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},Es={class:`flex items-center gap-2 flex-shrink-0`},Ds=[`disabled`],Os=[`disabled`],ks={key:0,class:`bg-accent-green/opacity-medium border border-accent-green/opacity-heavy rounded-lg p-3 text-accent-green text-sm`},As={key:1,class:`bg-accent-red/opacity-medium border border-accent-red/opacity-heavy rounded-lg p-3 text-accent-red text-sm`},js={class:`cfg-section space-y-3`},Ms={key:0,class:`flex items-center justify-center py-4`},Ns={key:1,class:`text-center py-4`},Ps={class:`grid grid-cols-2 sm:grid-cols-4 gap-3`},Fs={class:`text-center p-2 bg-white dark:bg-white/opacity-subtle rounded-lg border border-stroke-subtle dark:border-white/opacity-light`},Is={class:`text-center p-2 bg-white dark:bg-white/opacity-subtle rounded-lg border border-stroke-subtle dark:border-white/opacity-light`},Ls={class:`text-lg font-mono text-content-primary`},Rs={class:`text-center p-2 bg-white dark:bg-white/opacity-subtle rounded-lg border border-stroke-subtle dark:border-white/opacity-light`},zs={class:`text-lg font-mono text-accent-green`},Bs={class:`text-center p-2 bg-white dark:bg-white/opacity-subtle rounded-lg border border-stroke-subtle dark:border-white/opacity-light`},Vs={class:`text-lg font-mono text-accent-red`},Hs={key:0,class:`mt-2 p-2 bg-accent-red/opacity-light rounded-lg border border-accent-red/opacity-medium`},Us={key:1,class:`mt-2 p-2 bg-secondary/opacity-light rounded-lg border border-secondary/opacity-medium`},Ws={class:`font-medium`},Gs={class:`font-mono text-[10px] opacity-70`},Ks={class:`text-[10px]`},qs={class:`cfg-section space-y-3`},Js={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Ys={key:0,class:`text-content-primary font-mono text-sm`},Xs={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Zs={key:0,class:`text-content-primary font-mono text-sm`},Qs={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},$s={key:0,class:`text-content-primary font-mono text-sm`},ec={key:1,class:`flex items-center gap-2`},tc={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 gap-1`},nc={key:0,class:`text-content-primary font-mono text-sm`},rc={key:1,class:`flex items-center gap-2`},ic={class:`cfg-section space-y-3`},ac={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},oc={key:0,class:`text-content-primary font-mono text-sm`},sc={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},cc={key:0,class:`text-content-primary font-mono text-sm`},lc={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},uc={key:0,class:`text-content-primary font-mono text-sm`},dc={key:1,class:`flex items-center gap-2`},fc={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},pc={key:0,class:`text-content-primary font-mono text-sm`},mc={key:1,class:`flex items-center gap-2`},hc={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 gap-1`},gc={key:0,class:`text-content-primary font-mono text-sm`},_c={key:1,class:`flex items-center gap-2`},vc={class:`cfg-section space-y-3`},yc={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},bc={key:0,class:`text-content-primary font-mono text-sm`},xc={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light gap-1`},Sc={key:0,class:`text-content-primary font-mono text-sm`},Cc={key:1,class:`flex items-center gap-2`},wc={class:`py-2`},Tc={class:`grid grid-cols-3 gap-2 mt-2`},Ec={class:`text-center p-2 bg-white dark:bg-white/opacity-subtle rounded-lg border border-stroke-subtle dark:border-white/opacity-light`},Dc={key:0,class:`font-mono text-sm text-content-primary`},Oc={class:`text-center p-2 bg-white dark:bg-white/opacity-subtle rounded-lg border border-stroke-subtle dark:border-white/opacity-light`},kc={key:0,class:`font-mono text-sm text-content-primary`},Ac={class:`text-center p-2 bg-white dark:bg-white/opacity-subtle rounded-lg border border-stroke-subtle dark:border-white/opacity-light`},jc={key:0,class:`font-mono text-sm text-content-primary`},Mc={class:`p-6 space-y-4`},Nc={class:`flex justify-between items-start`},Pc={class:`flex justify-end pt-4 border-t border-stroke-subtle dark:border-stroke/opacity-medium`},Fc=f({__name:`AdvertSettings`,setup(n,{expose:r}){let s=ee(),u=y(()=>s.stats?.config?.repeater||{}),f=y(()=>u.value.advert_rate_limit||{}),m=y(()=>u.value.advert_penalty_box||{}),g=y(()=>u.value.advert_adaptive||{}),w=y(()=>g.value.thresholds||{}),T=o(!1),O=o(!1),k=o(``),M=o(``),N=o(!1),P=o(!1),F=o(null),I=o(!0),L=o(2),z=o(1),B=o(10),V=o(60),H=o(!0),U=o(2),G=o(12),K=o(6),te=o(2),q=o(24),ne=o(!0),re=o(.1),ie=o(5),J=o(.05),Y=o(.2),X=o(.5),Z=async()=>{P.value=!0;try{let e=await R.get(`/advert_rate_limit_stats`);e.success&&(F.value=e.data)}catch(e){console.error(`Failed to fetch rate limit stats:`,e)}finally{P.value=!1}};h([f,m,g],()=>{T.value||(I.value=f.value.enabled??!1,L.value=f.value.bucket_capacity??2,z.value=f.value.refill_tokens??1,B.value=Math.round((f.value.refill_interval_seconds??36e3)/3600),V.value=Math.round((f.value.min_interval_seconds??0)/60),H.value=m.value.enabled??!1,U.value=m.value.violation_threshold??2,G.value=Math.round((m.value.violation_decay_seconds??43200)/3600),K.value=Math.round((m.value.base_penalty_seconds??21600)/3600),te.value=m.value.penalty_multiplier??2,q.value=Math.round((m.value.max_penalty_seconds??86400)/3600),ne.value=g.value.enabled??!1,re.value=g.value.ewma_alpha??.1,ie.value=Math.round((g.value.hysteresis_seconds??300)/60),J.value=w.value.quiet_max??.05,Y.value=w.value.normal_max??.2,X.value=w.value.busy_max??.5)},{immediate:!0}),e(()=>{Z()});let Q=()=>{I.value=f.value.enabled??!1,L.value=f.value.bucket_capacity??2,z.value=f.value.refill_tokens??1,B.value=Math.round((f.value.refill_interval_seconds??36e3)/3600),V.value=Math.round((f.value.min_interval_seconds??0)/60),H.value=m.value.enabled??!1,U.value=m.value.violation_threshold??2,G.value=Math.round((m.value.violation_decay_seconds??43200)/3600),K.value=Math.round((m.value.base_penalty_seconds??21600)/3600),te.value=m.value.penalty_multiplier??2,q.value=Math.round((m.value.max_penalty_seconds??86400)/3600),ne.value=g.value.enabled??!1,re.value=g.value.ewma_alpha??.1,ie.value=Math.round((g.value.hysteresis_seconds??300)/60),J.value=w.value.quiet_max??.05,Y.value=w.value.normal_max??.2,X.value=w.value.busy_max??.5},ae=()=>{T.value=!0,k.value=``,M.value=``},oe=()=>{T.value=!1,k.value=``,M.value=``,Q()},se=async()=>{O.value=!0,M.value=``,k.value=``;try{let e={rate_limit_enabled:I.value,bucket_capacity:L.value,refill_tokens:z.value,refill_interval_seconds:B.value*3600,min_interval_seconds:V.value*60,penalty_enabled:H.value,violation_threshold:U.value,violation_decay_seconds:G.value*3600,base_penalty_seconds:K.value*3600,penalty_multiplier:te.value,max_penalty_seconds:q.value*3600,adaptive_enabled:ne.value,ewma_alpha:re.value,hysteresis_seconds:ie.value*60,quiet_max:J.value,normal_max:Y.value,busy_max:X.value},t=await R.post(`/update_advert_rate_limit_config`,e),n=t.data;t.success?(k.value=n?.message||`Settings saved successfully`,await s.fetchStats(),await Z(),await E(),Q(),T.value=!1,setTimeout(()=>{k.value=``},3e3)):(M.value=n?.error||`Failed to save settings`,console.error(`[AdvertSettings] Save failed:`,n?.error))}catch(e){console.error(`Failed to save advert settings:`,e),M.value=e.response?.data?.error||`Failed to save settings`}finally{O.value=!1}},{showUnsavedModal:$,requestLeave:ce,handleDiscard:le,handleSave:ue,handleCancel:de}=pe(T,O,oe,async()=>(await se(),!T.value));r({requestLeave:ce,isEditing:T});let me=y(()=>F.value?.adaptive?.current_tier||`unknown`),he=y(()=>{switch(me.value){case`quiet`:return`bg-accent-green/opacity-medium text-accent-green border-accent-green/opacity-heavy`;case`normal`:return`bg-accent-cyan/opacity-medium text-accent-cyan border-accent-cyan/opacity-heavy`;case`busy`:return`bg-secondary/opacity-medium text-secondary border-secondary/opacity-heavy`;case`congested`:return`bg-accent-red/opacity-medium text-accent-red border-accent-red/opacity-heavy`;default:return`bg-background-mute text-content-muted border-stroke-subtle`}});return(e,n)=>(a(),C(x,null,[v(fe,{show:c($),"is-saving":O.value,label:`Advert Limit settings`,onDiscard:c(le),onSave:c(ue),onCancel:c(de)},null,8,[`show`,`is-saving`,`onDiscard`,`onSave`,`onCancel`]),S(`div`,ws,[S(`div`,Ts,[n[20]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`Advert Limits`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Configure advertisement rate limiting and adaptive controls`)],-1),S(`div`,Es,[S(`button`,{onClick:n[0]||=e=>N.value=!0,class:`self-stretch flex items-center justify-center px-3 text-xs bg-primary/opacity-light hover:bg-primary/opacity-medium text-primary rounded-lg border border-primary/opacity-medium transition-colors`,title:`How rate limiting works`},[...n[19]||=[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`})],-1)]]),T.value?(a(),C(x,{key:1},[S(`button`,{onClick:oe,disabled:O.value,class:`cfg-btn-secondary`},` Cancel `,8,Ds),S(`button`,{onClick:se,disabled:O.value,class:`cfg-btn-primary`},l(O.value?`Saving...`:`Save Changes`),9,Os)],64)):(a(),C(`button`,{key:0,onClick:ae,class:`cfg-btn-primary`},` Edit Settings `))])]),k.value?(a(),C(`div`,ks,l(k.value),1)):_(``,!0),M.value?(a(),C(`div`,As,l(M.value),1)):_(``,!0),S(`div`,js,[n[29]||=S(`h3`,{class:`text-lg font-semibold text-content-primary`},` Current Status `,-1),P.value&&!F.value?(a(),C(`div`,Ms,[v(W,{size:`sm`}),n[21]||=S(`span`,{class:`ml-2 text-sm text-content-muted`},`Loading stats...`,-1)])):F.value?(a(),C(x,{key:2},[S(`div`,Ps,[S(`div`,Fs,[n[23]||=S(`div`,{class:`text-xs text-content-muted`},`Mesh Tier`,-1),S(`div`,{class:p([`mt-1 px-2 py-0.5 rounded border text-xs font-medium inline-block`,he.value])},l(me.value.toUpperCase()),3)]),S(`div`,Is,[n[24]||=S(`div`,{class:`text-xs text-content-muted`},`Adverts/min`,-1),S(`div`,Ls,l(F.value.metrics?.adverts_per_min_ewma?.toFixed(2)||`0.00`),1)]),S(`div`,Rs,[n[25]||=S(`div`,{class:`text-xs text-content-muted`},`Allowed`,-1),S(`div`,zs,l(F.value.stats?.adverts_allowed||0),1)]),S(`div`,Bs,[n[26]||=S(`div`,{class:`text-xs text-content-muted`},`Dropped`,-1),S(`div`,Vs,l(F.value.stats?.adverts_dropped||0),1)])]),Object.keys(F.value.active_penalties||{}).length>0?(a(),C(`div`,Hs,[n[27]||=S(`div`,{class:`text-xs font-medium text-accent-red mb-1`},` Active Penalties `,-1),(a(!0),C(x,null,t(F.value.active_penalties,(e,t)=>(a(),C(`div`,{key:t,class:`text-xs font-mono text-accent-red`},l(t)+`... - `+l(Math.round(e))+`s remaining `,1))),128))])):_(``,!0),F.value.recent_drops&&F.value.recent_drops.length>0?(a(),C(`div`,Us,[n[28]||=S(`div`,{class:`text-xs font-medium text-secondary mb-1`},` Recently Dropped Adverts `,-1),(a(!0),C(x,null,t(F.value.recent_drops,(e,t)=>(a(),C(`div`,{key:t,class:`text-xs text-secondary py-0.5`},[S(`span`,Ws,l(e.name),1),S(`span`,Gs,`(`+l(e.pubkey)+`...)`,1),S(`span`,Ks,` - `+l(e.reason)+` (`+l(e.seconds_ago)+`s ago)`,1)]))),128))])):_(``,!0)],64)):(a(),C(`div`,Ns,[...n[22]||=[S(`p`,{class:`text-xs text-content-muted`},` Stats not available. Click "Refresh Stats" to load. `,-1)]])),n[30]||=d(`

There are three layers of advert rate limit control: Each layer can be enabled/disabled independently and the others will still function.

  • Rate Limiting OFF: All limiting disabled — adverts pass through freely
  • Adaptive OFF: Token bucket uses fixed limits (no tier scaling), penalty box still works
  • Penalty Box OFF: Token bucket still applies, but no escalating cooldowns for repeat offenders

Decision flow when all enabled: Adaptive tier check → Penalty box check → Token bucket check → Violation recording (triggers penalty box)

Activity tiers:Quiet (bypass limiting) → Normal (lighter: 0.5x intervals) → Busy (base: 1.0x intervals) → Congested (stricter: 2.0x intervals)

Note: Adaptive mode scales refill/min-interval timing; bucket capacity stays at the configured base value.

`,1)]),S(`div`,qs,[n[38]||=S(`h3`,{class:`text-lg font-semibold text-content-primary flex items-center gap-2`},[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z`})]),b(` Token Bucket Rate Limiting `)],-1),n[39]||=S(`p`,{class:`text-xs text-content-muted`},` Controls how many adverts each pubkey can send in a given time period. `,-1),S(`div`,Js,[n[32]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Rate Limiting`,-1),T.value?i((a(),C(`select`,{key:1,"onUpdate:modelValue":n[1]||=e=>I.value=e,class:`cfg-select w-full sm:w-32`},[...n[31]||=[S(`option`,{value:!0},`Enabled`,-1),S(`option`,{value:!1},`Disabled`,-1)]],512)),[[D,I.value]]):(a(),C(`div`,Ys,l(I.value?`Enabled`:`Disabled`),1))]),S(`div`,Xs,[n[33]||=S(`div`,null,[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Bucket Capacity`),S(`p`,{class:`text-xs text-content-muted`},`Max burst size (adverts)`)],-1),T.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[2]||=e=>L.value=e,type:`number`,min:`1`,max:`10`,class:`cfg-input w-full sm:w-24`},null,512)),[[j,L.value,void 0,{number:!0}]]):(a(),C(`div`,Zs,l(L.value),1))]),S(`div`,Qs,[n[35]||=S(`div`,null,[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Refill Interval`),S(`p`,{class:`text-xs text-content-muted`},` Time between token refills `)],-1),T.value?(a(),C(`div`,ec,[i(S(`input`,{"onUpdate:modelValue":n[3]||=e=>B.value=e,type:`number`,min:`1`,max:`48`,class:`cfg-input w-20`},null,512),[[j,B.value,void 0,{number:!0}]]),n[34]||=S(`span`,{class:`text-content-muted text-sm`},`hours`,-1)])):(a(),C(`div`,$s,l(B.value)+` hours `,1))]),S(`div`,tc,[n[37]||=S(`div`,null,[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Minimum Interval`),S(`p`,{class:`text-xs text-content-muted`},` Hard minimum between adverts `)],-1),T.value?(a(),C(`div`,rc,[i(S(`input`,{"onUpdate:modelValue":n[4]||=e=>V.value=e,type:`number`,min:`0`,max:`1440`,class:`cfg-input w-20`},null,512),[[j,V.value,void 0,{number:!0}]]),n[36]||=S(`span`,{class:`text-content-muted text-sm`},`min`,-1)])):(a(),C(`div`,nc,l(V.value)+` min `,1))])]),S(`div`,ic,[n[49]||=S(`h3`,{class:`text-lg font-semibold text-content-primary flex items-center gap-2`},[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636`})]),b(` Penalty Box (Repeat Offenders) `)],-1),n[50]||=S(`p`,{class:`text-xs text-content-muted`},` Applies escalating cooldowns to pubkeys that repeatedly violate limits. `,-1),S(`div`,ac,[n[41]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Penalty Box`,-1),T.value?i((a(),C(`select`,{key:1,"onUpdate:modelValue":n[5]||=e=>H.value=e,class:`cfg-select w-full sm:w-32`},[...n[40]||=[S(`option`,{value:!0},`Enabled`,-1),S(`option`,{value:!1},`Disabled`,-1)]],512)),[[D,H.value]]):(a(),C(`div`,oc,l(H.value?`Enabled`:`Disabled`),1))]),S(`div`,sc,[n[42]||=S(`div`,null,[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Violation Threshold`),S(`p`,{class:`text-xs text-content-muted`},` Violations before penalty `)],-1),T.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[6]||=e=>U.value=e,type:`number`,min:`1`,max:`10`,class:`cfg-input w-full sm:w-24`},null,512)),[[j,U.value,void 0,{number:!0}]]):(a(),C(`div`,cc,l(U.value),1))]),S(`div`,lc,[n[44]||=S(`div`,null,[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Base Penalty Duration`),S(`p`,{class:`text-xs text-content-muted`},`First penalty duration`)],-1),T.value?(a(),C(`div`,dc,[i(S(`input`,{"onUpdate:modelValue":n[7]||=e=>K.value=e,type:`number`,min:`1`,max:`48`,class:`cfg-input w-20`},null,512),[[j,K.value,void 0,{number:!0}]]),n[43]||=S(`span`,{class:`text-content-muted text-sm`},`hours`,-1)])):(a(),C(`div`,uc,l(K.value)+` hours `,1))]),S(`div`,fc,[n[46]||=S(`div`,null,[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Penalty Multiplier`),S(`p`,{class:`text-xs text-content-muted`},`Escalation factor`)],-1),T.value?(a(),C(`div`,mc,[i(S(`input`,{"onUpdate:modelValue":n[8]||=e=>te.value=e,type:`number`,min:`1`,max:`5`,step:`0.5`,class:`cfg-input w-20`},null,512),[[j,te.value,void 0,{number:!0}]]),n[45]||=S(`span`,{class:`text-content-muted text-sm`},`x`,-1)])):(a(),C(`div`,pc,l(te.value)+`x `,1))]),S(`div`,hc,[n[48]||=S(`div`,null,[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Max Penalty Duration`),S(`p`,{class:`text-xs text-content-muted`},`Maximum cooldown cap`)],-1),T.value?(a(),C(`div`,_c,[i(S(`input`,{"onUpdate:modelValue":n[9]||=e=>q.value=e,type:`number`,min:`1`,max:`168`,class:`cfg-input w-20`},null,512),[[j,q.value,void 0,{number:!0}]]),n[47]||=S(`span`,{class:`text-content-muted text-sm`},`hours`,-1)])):(a(),C(`div`,gc,l(q.value)+` hours `,1))])]),S(`div`,vc,[n[60]||=S(`h3`,{class:`text-lg font-semibold text-content-primary flex items-center gap-2`},[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z`})]),b(` Adaptive Rate Limiting `)],-1),S(`div`,yc,[n[52]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Adaptive Mode`,-1),T.value?i((a(),C(`select`,{key:1,"onUpdate:modelValue":n[10]||=e=>ne.value=e,class:`cfg-select w-full sm:w-32`},[...n[51]||=[S(`option`,{value:!0},`Enabled`,-1),S(`option`,{value:!1},`Disabled`,-1)]],512)),[[D,ne.value]]):(a(),C(`div`,bc,l(ne.value?`Enabled`:`Disabled`),1))]),S(`div`,xc,[n[54]||=S(`div`,null,[S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Tier Change Delay`),S(`p`,{class:`text-xs text-content-muted`},`Prevents tier flapping`)],-1),T.value?(a(),C(`div`,Cc,[i(S(`input`,{"onUpdate:modelValue":n[11]||=e=>ie.value=e,type:`number`,min:`0`,max:`60`,class:`cfg-input w-20`},null,512),[[j,ie.value,void 0,{number:!0}]]),n[53]||=S(`span`,{class:`text-content-muted text-sm`},`min`,-1)])):(a(),C(`div`,Sc,l(ie.value)+` min `,1))]),S(`div`,wc,[n[58]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm mb-2 block`},`Activity Tier Thresholds (adverts/min)`,-1),S(`div`,Tc,[S(`div`,Ec,[n[55]||=S(`div`,{class:`text-xs text-accent-green mb-1`},`Quiet Max`,-1),T.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[12]||=e=>J.value=e,type:`number`,min:`0`,max:`1`,step:`0.01`,class:`cfg-input w-full py-1 text-center`},null,512)),[[j,J.value,void 0,{number:!0}]]):(a(),C(`div`,Dc,l(J.value),1))]),S(`div`,Oc,[n[56]||=S(`div`,{class:`text-xs text-accent-cyan mb-1`},`Normal Max`,-1),T.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[13]||=e=>Y.value=e,type:`number`,min:`0`,max:`5`,step:`0.01`,class:`cfg-input w-full py-1 text-center`},null,512)),[[j,Y.value,void 0,{number:!0}]]):(a(),C(`div`,kc,l(Y.value),1))]),S(`div`,Ac,[n[57]||=S(`div`,{class:`text-xs text-secondary mb-1`},`Busy Max`,-1),T.value?i((a(),C(`input`,{key:1,"onUpdate:modelValue":n[14]||=e=>X.value=e,type:`number`,min:`0`,max:`10`,step:`0.01`,class:`cfg-input w-full py-1 text-center`},null,512)),[[j,X.value,void 0,{number:!0}]]):(a(),C(`div`,jc,l(X.value),1))])]),n[59]||=S(`p`,{class:`text-xs text-content-muted mt-2`},` Above Busy Max = Congested tier (strictest limiting) `,-1)])]),N.value?(a(),C(`div`,{key:2,class:`fixed inset-0 bg-black/opacity-heavy flex items-start justify-center z-50 p-4 overflow-y-auto`,onClick:n[18]||=A(e=>N.value=!1,[`self`])},[S(`div`,{class:`bg-background dark:bg-background-dark rounded-lg shadow-xl max-w-3xl w-full my-8`,onClick:n[17]||=A(()=>{},[`stop`])},[S(`div`,Mc,[S(`div`,Nc,[n[62]||=S(`h2`,{class:`text-xl font-semibold text-content-primary`},` How Advert Rate Limiting Works `,-1),S(`button`,{onClick:n[15]||=e=>N.value=!1,class:`text-content-muted hover:text-content-primary dark:text-content-muted dark:hover:text-content-primary`},[...n[61]||=[S(`svg`,{class:`w-6 h-6`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),n[63]||=d(`

Why you may see the same advert more than once

Mesh traffic can reach your repeater through different paths, so duplicate advert packets are expected.

  • First copy arrives and is forwarded
  • Second copy arrives through another repeater path
  • Later copies may be dropped once limits are hit

This is normal behavior and helps prevent repeated rebroadcasts from flooding the mesh.

Token Bucket Rate Limiting

Each sender has a token bucket. Every forwarded advert uses one token.

  • Bucket Capacity: How many adverts can pass in a burst.
  • Refill Rate: How quickly tokens come back over time.
  • Min Interval: Optional gap between adverts from the same sender (usually set to 0).
Example (capacity 2):
- Copy 1 forwarded (2 → 1 tokens)
- Copy 2 forwarded (1 → 0 tokens)
- Copy 3 dropped (no tokens left)

Penalty Box (Repeat Offenders)

If a sender keeps hitting the limit, it is temporarily blocked.

  • Violation Threshold: How many hits before penalty starts.
  • Base Penalty: First block duration.
  • Multiplier: Repeated penalties get longer.
  • Decay Time: Violations age out after stable behavior.

Adaptive Mesh Activity Tiers

Adaptive mode adjusts limits based on recent advert activity.

How Congestion is Measured:
  • What is counted: Advert packets only (not chat/data traffic)
  • Smoothing: 60-second EWMA to avoid reacting to short spikes
  • Score: Tier is based on adverts per minute
  • Hysteresis: Tier changes must hold for 5 minutes
QUIET
Activity < 0.05/min
No rate limiting
NORMAL
Activity 0.05-0.20/min
Light limiting (50%)
BUSY
Activity 0.20-0.50/min
Standard limiting (100%)
CONGESTED
Activity > 0.50/min
Aggressive (200%)
Quick examples:
- 0.02 adverts/min → QUIET (bypass)
- 0.35 adverts/min → BUSY (tighter limits)
- 0.68 adverts/min → CONGESTED (strict limits)

Recommended starting settings

  • Min Interval: 0 (disabled), let adaptive mode do the work
  • Bucket Capacity: 2-3 tokens for normal mesh propagation
  • Adaptive Mode: On
  • Penalty Box: On
`,5),S(`div`,Pc,[S(`button`,{onClick:n[16]||=e=>N.value=!1,class:`btn-primary`},` Got it! `)])])])])):_(``,!0)],512)],64))}}),Ic={class:`modal-card max-w-2xl w-full max-h-[90vh] overflow-y-auto`},Lc={class:`flex items-center justify-between mb-7`},Rc={class:`text-xl font-semibold text-content-primary`},zc={class:`text-content-secondary dark:text-content-muted text-sm mt-1`},Bc={class:`grid grid-cols-2 gap-5 items-end`},Vc={class:`flex items-center gap-3 pb-1.5`},Hc={key:0,class:`grid grid-cols-2 gap-5`},Uc={class:`grid grid-cols-2 gap-5 items-end`},Wc={class:`flex items-center gap-3 pb-1.5`},Gc={class:`grid grid-cols-2 gap-x-5 gap-y-0`},Kc=[`aria-hidden`],qc={class:`grid grid-cols-2 gap-5 items-center pt-4`},Jc={class:`flex items-center gap-3`},Yc={class:`flex items-center gap-6`},Xc={class:`flex items-center gap-3`},Zc={class:`flex items-center gap-3`},Qc={class:`flex flex-wrap gap-2`},$c=[`onClick`],el={class:`modal-actions`},tl=[`disabled`],nl=f({__name:`BrokerEditModal`,props:{show:{type:Boolean},broker:{},isNew:{type:Boolean}},emits:[`done`,`cancel`],setup(e,{emit:n}){let s=[`REQ`,`RESPONSE`,`TXT_MSG`,`ACK`,`ADVERT`,`GRP_TXT`,`GRP_DATA`,`ANON_REQ`,`PATH`,`TRACE`,`RAW_CUSTOM`],c=e,d=n;function f(e){return{...e,tls:{...e.tls},disallowedInput:[...e.disallowedInput??[]]}}let g=o({_id:0,enabled:!0,name:``,host:``,port:443,format:`letsmesh`,use_jwt_auth:!1,transport:`websockets`,disallowedInput:[],retain_status:!1,tls:{enabled:!0,insecure:!1}});h(()=>c.broker,e=>{e&&(g.value=f(e))},{immediate:!0});let w=y(()=>{let e=g.value;return e.name.trim()!==``&&e.host.trim()!==``&&e.port>=1&&e.port<=65535&&(!e.use_jwt_auth||(e.audience?.trim()??``)!==``)});function T(){let e=g.value;(!e.audience||e.audience===e.host)&&(e.audience=e.host)}function E(e){g.value.disallowedInput||(g.value.disallowedInput=[]);let t=g.value.disallowedInput.indexOf(e);t===-1?g.value.disallowedInput.push(e):g.value.disallowedInput.splice(t,1)}function O(){w.value&&d(`done`,f(g.value))}function k(){d(`cancel`)}return(n,o)=>(a(),u(m,{to:`body`},[v(N,{"enter-active-class":`transition-opacity duration-200`,"enter-from-class":`opacity-0`,"leave-active-class":`transition-opacity duration-200`,"leave-to-class":`opacity-0`},{default:r(()=>[e.show&&e.broker?(a(),C(`div`,{key:0,class:`modal-backdrop`,onClick:o[14]||=A(e=>k(),[`self`])},[S(`div`,Ic,[S(`div`,Lc,[S(`div`,null,[S(`h3`,Rc,l(e.isNew?`Add Broker`:`Edit Broker`),1),S(`p`,zc,l(e.isNew?`Configure a new MQTT broker`:`Editing ${e.broker.name||`(unnamed)`}`),1)]),S(`button`,{onClick:k,class:`text-content-secondary dark:text-white/60 hover:text-content-primary dark:hover:text-white transition-colors`},[...o[15]||=[S(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),S(`form`,{onSubmit:A(O,[`prevent`]),class:`modal-form`},[S(`div`,null,[o[16]||=S(`label`,{class:`modal-field-label`},[b(` Name `),S(`span`,{class:`text-accent-red`},`*`)],-1),i(S(`input`,{"onUpdate:modelValue":o[0]||=e=>g.value.name=e,type:`text`,placeholder:`Broker Name`,class:`modal-input`},null,512),[[j,g.value.name]])]),S(`div`,Bc,[S(`div`,null,[o[18]||=S(`label`,{class:`modal-field-label`},[b(` Format `),S(`span`,{class:`text-accent-red`},`*`)],-1),i(S(`select`,{"onUpdate:modelValue":o[1]||=e=>g.value.format=e,class:`modal-select`},[...o[17]||=[S(`option`,{value:`meshcoretomqtt`},`Meshcoretomqtt`,-1),S(`option`,{value:`letsmesh`},`Letsmesh`,-1),S(`option`,{value:`waev`},`Waev`,-1),S(`option`,{value:`mqtt`},`openHop`,-1)]],512),[[D,g.value.format]])]),S(`div`,Vc,[S(`button`,{type:`button`,onClick:o[2]||=e=>g.value.enabled=!g.value.enabled,class:p([`relative inline-flex h-5 w-9 flex-shrink-0 cursor-pointer rounded-full transition-colors duration-200 ease-in-out focus:outline-none`,g.value.enabled?`bg-primary`:`bg-background-mute dark:bg-white/opacity-subtle`])},[S(`span`,{class:p([`pointer-events-none absolute top-0.5 left-0.5 inline-block h-4 w-4 transform rounded-full bg-white shadow transition duration-200 ease-in-out`,g.value.enabled?`translate-x-4`:`translate-x-0`])},null,2)],2),o[19]||=S(`span`,{class:`text-sm font-medium text-content-primary`},`Enabled`,-1)])]),g.value.format===`mqtt`?(a(),C(`div`,Hc,[S(`div`,null,[o[20]||=S(`label`,{class:`modal-field-label`},[b(` MQTT Base Topic `),S(`span`,{class:`font-normal text-content-muted/opacity-heavy ml-1`},`(e.g. meshcore/repeater)`)],-1),i(S(`input`,{"onUpdate:modelValue":o[3]||=e=>g.value.base_topic=e,placeholder:`meshcore/repeater`,class:`modal-input`},null,512),[[j,g.value.base_topic]])]),o[21]||=S(`div`,null,null,-1)])):_(``,!0),S(`div`,Uc,[S(`div`,null,[o[23]||=S(`label`,{class:`modal-field-label`},[b(` Transport `),S(`span`,{class:`text-accent-red`},`*`)],-1),i(S(`select`,{"onUpdate:modelValue":o[4]||=e=>g.value.transport=e,class:`modal-select`},[...o[22]||=[S(`option`,{value:`websockets`},`Websockets`,-1),S(`option`,{value:`tcp`},`TCP`,-1)]],512),[[D,g.value.transport]])]),S(`div`,Wc,[S(`button`,{type:`button`,onClick:o[5]||=e=>g.value.use_jwt_auth=!g.value.use_jwt_auth,class:p([`relative inline-flex h-5 w-9 flex-shrink-0 cursor-pointer rounded-full transition-colors duration-200 ease-in-out focus:outline-none`,g.value.use_jwt_auth?`bg-primary`:`bg-background-mute dark:bg-white/opacity-subtle`])},[S(`span`,{class:p([`pointer-events-none absolute top-0.5 left-0.5 inline-block h-4 w-4 transform rounded-full bg-white shadow transition duration-200 ease-in-out`,g.value.use_jwt_auth?`translate-x-4`:`translate-x-0`])},null,2)],2),o[24]||=S(`span`,{class:`text-sm font-medium text-content-primary`},`Use JWT Auth`,-1)])]),S(`div`,Gc,[S(`div`,null,[o[25]||=S(`label`,{class:`modal-field-label`},[b(` Host `),S(`span`,{class:`text-accent-red`},`*`)],-1),i(S(`input`,{"onUpdate:modelValue":o[6]||=e=>g.value.host=e,type:`text`,placeholder:`mqtt.myserver.com`,onBlur:T,class:`modal-input font-mono`},null,544),[[j,g.value.host]])]),S(`div`,null,[g.value.use_jwt_auth?(a(),C(x,{key:0},[o[26]||=S(`label`,{class:`modal-field-label`},[b(` Audience `),S(`span`,{class:`text-accent-red`},`*`),S(`span`,{class:`font-normal text-content-muted/opacity-heavy ml-1`},`(usually same as host)`)],-1),i(S(`input`,{"onUpdate:modelValue":o[7]||=e=>g.value.audience=e,type:`text`,placeholder:`mqtt.myserver.com`,class:`modal-input font-mono`},null,512),[[j,g.value.audience]])],64)):(a(),C(x,{key:1},[o[27]||=S(`label`,{class:`modal-field-label`},[b(` Username `),S(`span`,{class:`font-normal text-content-muted/opacity-heavy ml-1`},`(blank = anonymous)`)],-1),o[28]||=S(`input`,{type:`text`,autocomplete:`username`,class:`hidden`},null,-1),i(S(`input`,{autocomplete:`username`,"onUpdate:modelValue":o[8]||=e=>g.value.username=e,type:`text`,placeholder:`username`,class:`modal-input`},null,512),[[j,g.value.username]])],64))]),S(`div`,null,[o[29]||=S(`label`,{class:`modal-field-label`},[b(` Port `),S(`span`,{class:`text-accent-red`},`*`),S(`span`,{class:`font-normal text-content-muted/opacity-heavy ml-1`},`(443 WS, 1883 TCP)`)],-1),i(S(`input`,{"onUpdate:modelValue":o[9]||=e=>g.value.port=e,type:`number`,min:`0`,max:`65535`,class:`modal-input font-mono`},null,512),[[j,g.value.port,void 0,{number:!0}]])]),S(`div`,{class:p(g.value.use_jwt_auth?`invisible pointer-events-none`:``),"aria-hidden":g.value.use_jwt_auth?`true`:void 0},[o[30]||=S(`label`,{class:`modal-field-label`},`Password`,-1),o[31]||=S(`input`,{type:`password`,autocomplete:`current-password`,class:`hidden`},null,-1),i(S(`input`,{autocomplete:`new-password`,"onUpdate:modelValue":o[10]||=e=>g.value.password=e,type:`password`,readonly:``,onfocus:`this.removeAttribute('readonly');`,onblur:`this.setAttribute('readonly', true);`,class:`modal-input`},null,512),[[j,g.value.password]])],10,Kc)]),S(`div`,qc,[S(`div`,Jc,[S(`button`,{type:`button`,onClick:o[11]||=e=>g.value.retain_status=!g.value.retain_status,class:p([`relative inline-flex h-5 w-9 flex-shrink-0 cursor-pointer rounded-full transition-colors duration-200 ease-in-out focus:outline-none`,g.value.retain_status?`bg-primary`:`bg-background-mute dark:bg-white/opacity-subtle`])},[S(`span`,{class:p([`pointer-events-none absolute top-0.5 left-0.5 inline-block h-4 w-4 transform rounded-full bg-white shadow transition duration-200 ease-in-out`,g.value.retain_status?`translate-x-4`:`translate-x-0`])},null,2)],2),o[32]||=S(`div`,null,[S(`span`,{class:`text-sm font-medium text-content-primary`},`Retain Status`),S(`span`,{class:`text-xs text-content-muted/opacity-heavy ml-1`},`(MQTT retained)`)],-1)]),S(`div`,Yc,[S(`div`,Xc,[S(`button`,{type:`button`,onClick:o[12]||=e=>g.value.tls.enabled=!g.value.tls.enabled,class:p([`relative inline-flex h-5 w-9 flex-shrink-0 cursor-pointer rounded-full transition-colors duration-200 ease-in-out focus:outline-none`,g.value.tls.enabled?`bg-primary`:`bg-background-mute dark:bg-white/opacity-subtle`])},[S(`span`,{class:p([`pointer-events-none absolute top-0.5 left-0.5 inline-block h-4 w-4 transform rounded-full bg-white shadow transition duration-200 ease-in-out`,g.value.tls.enabled?`translate-x-4`:`translate-x-0`])},null,2)],2),o[33]||=S(`span`,{class:`text-sm font-medium text-content-primary`},`TLS`,-1)]),S(`div`,Zc,[S(`button`,{type:`button`,onClick:o[13]||=e=>g.value.tls.insecure=!g.value.tls.insecure,class:p([`relative inline-flex h-5 w-9 flex-shrink-0 cursor-pointer rounded-full transition-colors duration-200 ease-in-out focus:outline-none`,g.value.tls.insecure?`bg-accent-amber`:`bg-background-mute dark:bg-white/opacity-subtle`])},[S(`span`,{class:p([`pointer-events-none absolute top-0.5 left-0.5 inline-block h-4 w-4 transform rounded-full bg-white shadow transition duration-200 ease-in-out`,g.value.tls.insecure?`translate-x-4`:`translate-x-0`])},null,2)],2),o[34]||=S(`span`,{class:`text-sm font-medium text-content-primary`},`Insecure`,-1)])])]),S(`div`,null,[o[35]||=S(`label`,{class:`modal-field-label`},[b(` Block Packet Types `),S(`span`,{class:`text-content-secondary dark:text-content-muted font-normal text-xs ml-1`},`(prevent publishing to broker)`)],-1),S(`div`,Qc,[(a(),C(x,null,t(s,e=>S(`button`,{key:e,type:`button`,onClick:t=>E(e),class:p([`px-2.5 py-1 rounded text-xs font-mono font-medium border transition-colors`,g.value.disallowedInput?.includes(e)?`bg-accent-red/opacity-light border-accent-red/opacity-heavy text-accent-red`:`bg-background-mute dark:bg-white/opacity-subtle border-stroke-subtle dark:border-stroke/opacity-light text-content-secondary dark:text-content-muted hover:border-primary/opacity-heavy dark:hover:border-primary/opacity-heavy`])},l(e),11,$c)),64))]),o[36]||=S(`p`,{class:`mt-2 text-xs text-content-secondary dark:text-content-muted`},[S(`span`,{class:`text-accent-red font-medium`},`Red = blocked.`),b(` Leave all unselected to publish all packet types. `)],-1)]),S(`div`,el,[S(`button`,{type:`button`,onClick:k,class:`modal-btn-cancel`},` Cancel `),S(`button`,{type:`submit`,disabled:!w.value,class:p([`flex-1 px-4 py-3 rounded-lg transition-colors font-medium`,w.value?`bg-accent-green/opacity-medium hover:bg-accent-green/opacity-medium border border-accent-green/opacity-heavy text-accent-green`:`bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-medium text-content-muted/opacity-heavy cursor-not-allowed`])},` Done `,10,tl)])],32)])])):_(``,!0)]),_:1})]))}}),rl={class:`space-y-12`},il={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},al={class:`flex items-center gap-2 flex-shrink-0`},ol=[`disabled`],sl=[`disabled`],cl={key:0,class:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium border border-accent-red dark:border-accent-red/opacity-heavy rounded-lg p-3 text-accent-red text-sm`},ll={class:`cfg-section`},ul={key:0,class:`text-sm text-content-secondary dark:text-content-muted`},dl={key:1,class:`space-y-3`},fl={class:`flex items-center gap-2`},pl={key:0,class:`space-y-2`},ml=[`title`],hl={key:1,class:`text-sm text-content-muted/opacity-heavy italic`},gl={class:`cfg-card p-6`},_l={key:0,class:`grid grid-cols-1 sm:grid-cols-2 gap-x-8 gap-y-3`},vl={class:`flex flex-col py-1 border-b border-stroke-subtle dark:border-stroke/opacity-light`},yl={class:`text-content-primary font-mono text-sm mt-0.5`},bl={class:`flex flex-col py-1 border-b border-stroke-subtle dark:border-stroke/opacity-light`},xl={class:`text-content-primary text-sm mt-0.5`},Sl={class:`flex flex-col py-1`},Cl={class:`text-content-primary text-sm mt-0.5`},wl={class:`flex flex-col py-1`},Tl={class:`text-content-primary text-sm mt-0.5`},El={key:1,class:`space-y-3`},Dl={class:`grid grid-cols-1 sm:grid-cols-2 gap-3`},Ol={class:`cfg-card p-6`},kl={class:`flex items-start justify-between mb-4`},Al={key:0,class:`flex items-center gap-2 flex-shrink-0 ml-4`},jl={class:`relative`},Ml={key:0,class:`absolute right-0 top-full mt-1 z-20 w-72 rounded-lg shadow-lg border border-stroke-subtle dark:border-stroke/opacity-medium bg-white dark:bg-[var(--color-surface)] overflow-hidden`},Nl={key:0,class:`px-3 py-3 text-xs text-content-secondary dark:text-content-muted italic`},Pl={key:1,class:`px-3 py-3 text-xs text-accent-red`},Fl={key:2,class:`px-3 py-3 text-xs text-content-secondary dark:text-content-muted italic`},Il={key:3,class:`py-1`},Ll=[`onClick`],Rl={class:`min-w-0 flex-1`},zl={class:`text-sm font-medium text-content-primary group-hover:text-primary transition-colors`},Bl={class:`text-xs text-content-secondary dark:text-content-muted`},Vl=[`onClick`,`title`],Hl=[`href`],Ul={key:0,class:`bg-background-mute/opacity-heavy dark:bg-background/20 border-t border-stroke-subtle dark:border-stroke/opacity-light`},Wl=[`onClick`],Gl={class:`min-w-0 flex-1`},Kl={class:`text-xs font-medium text-content-primary truncate`},ql={class:`text-[11px] font-mono text-content-secondary dark:text-content-muted truncate`},Jl={key:0,class:`flex flex-col items-center justify-center py-8 rounded-lg border-2 border-dashed border-stroke-subtle dark:border-stroke/opacity-medium text-content-secondary dark:text-content-muted`},Yl={key:0,class:`text-xs mt-0.5 opacity-70`},Xl={key:1,class:`space-y-2`},Zl={class:`flex items-center gap-3 px-4 py-2.5`},Ql={class:`min-w-0 flex-1 flex items-center gap-2 flex-wrap`},$l={class:`text-sm font-medium text-content-primary`},eu={class:`text-xs font-mono text-content-secondary dark:text-content-muted`},tu={key:0,class:`flex items-center gap-1.5 flex-shrink-0`},nu=[`onClick`],ru=[`onClick`],iu=K(f({__name:`LetsMeshSettings`,setup(n,{expose:s}){let u=ee(),d=y(()=>u.stats?.config?.mqtt_brokers||{}),f=o([]),m=o(!1),g=o(``),T=o(null);function E(e){return{...e,tls:{...e.tls},disallowedInput:[...e.disallowedInput??[]]}}let D=o(!1),O=o(!1),k=o(``),M=o(!1),P=o(null),F=o(!1),I=o(``),L=o(300),z=o(``),B=o(``),V=o([]),H=o(null),U=o(!1),W=o(null),G=o({_id:0,enabled:!0,name:``,host:``,port:443,format:`letsmesh`,use_jwt_auth:!1,transport:`websockets`,disallowedInput:[],retain_status:!1,tls:{enabled:!0,insecure:!1}}),K=o(!1),q=o(null),ne=o(!1);async function re(){if(!ne.value){ne.value=!0;try{let e=await R.get(`/mqtt_status`);e.success&&(q.value=e.data)}catch{}finally{ne.value=!1}}}let ie=1;function J(e={}){return{_id:ie++,enabled:e.enabled??!0,name:e.name??``,host:e.host??``,port:e.port??0,audience:e.audience??``,format:e.format??`letsmesh`,use_jwt_auth:e.use_jwt_auth??!1,username:e.username??``,password:e.password??``,transport:e.transport??`websockets`,disallowedInput:Array.isArray(e.disallowedInput)?[...e.disallowedInput]:[],retain_status:e.retain_status??!1,base_topic:e.base_topic??``,tls:{enabled:e.tls?.enabled??!1,insecure:e.tls?.insecure??!1}}}function Y(){let e=d.value;I.value=e.iata_code??``,L.value=e.status_interval??300,z.value=e.owner??``,B.value=e.email??``,V.value=Array.isArray(e.brokers)?e.brokers.map(e=>J(e)):[]}h(d,()=>{D.value||Y()},{immediate:!0});function X(){return{iata_code:I.value,status_interval:L.value,owner:z.value,email:B.value,brokers:V.value.map(e=>{let t={name:e.name,enabled:e.enabled,transport:e.transport,host:e.host,port:e.port,use_jwt_auth:e.use_jwt_auth,format:e.format,disallowed_packet_types:e.disallowedInput,base_topic:e.base_topic,retain_status:e.retain_status,tls:{enabled:e.tls?.enabled??!1,insecure:e.tls?.insecure??!1}};return e.use_jwt_auth?{...t,audience:e.audience}:{...t,username:e.username,password:e.password}})}}async function Z(){try{let e=await R.post(`/update_mqtt_config`,X());return e.success?(await u.fetchStats(),await re(),{success:!0}):{success:!1,error:e.error||`Save failed`}}catch(e){let t=e;return{success:!1,error:t?.response?.data?.error||t?.message||`Request failed`}}}function Q(){Y(),P.value={iata:I.value,interval:L.value,owner:z.value,email:B.value,brokers:V.value.map(E)},D.value=!0,k.value=``}function ae(){P.value&&(I.value=P.value.iata,L.value=P.value.interval,z.value=P.value.owner,B.value=P.value.email,V.value=P.value.brokers.map(E)),H.value=null,U.value=!1,W.value=null,F.value=!1,D.value=!1,P.value=null,k.value=``}async function oe(){if(H.value!==null){let e=G.value;if(!e.name.trim()||!e.host.trim()){k.value=`Please complete or cancel the open broker edit before saving.`;return}le()}O.value=!0,k.value=``;let e=await Z();O.value=!1,e.success?(D.value=!1,F.value=!1,P.value=null,M.value=!0):k.value=e.error}function se(){H.value!==null&&ce();let e=J();V.value.push(e),W.value=null,U.value=!0,G.value=E(e),H.value=e._id}function $(e){H.value!==null&&H.value!==e._id&&ce(),W.value=E(e),U.value=!1,G.value=E(e),H.value=e._id}function ce(){if(U.value&&H.value!==null)V.value=V.value.filter(e=>e._id!==H.value);else if(W.value){let e=V.value.findIndex(e=>e._id===W.value._id);e!==-1&&V.value.splice(e,1,E(W.value))}H.value=null,U.value=!1,W.value=null}function le(){let e=G.value,t=V.value.findIndex(t=>t._id===e._id);t!==-1&&V.value.splice(t,1,E(e)),H.value=null,U.value=!1,W.value=null}function ue(e){G.value=e,le()}function de(e){V.value=V.value.filter(t=>t._id!==e),H.value===e&&(H.value=null,U.value=!1,W.value=null)}function me(e){K.value=!1,T.value=null,H.value!==null&&ce(),e.brokers.forEach(e=>V.value.push(J(e)))}function he(e){K.value=!1,T.value=null,H.value!==null&&ce(),V.value.push(J(e))}function ge(e){T.value=T.value===e?null:e}async function _e(){m.value=!0,g.value=``;try{let e=await R.get(`/broker_presets`);e.success&&Array.isArray(e.data)?f.value=e.data:(f.value=[],g.value=e.error||`Failed to load broker presets`)}catch(e){f.value=[],e?.response?.status===404?g.value=``:g.value=`Could not reach repeater for broker presets`}finally{m.value=!1}}let ve=y(()=>{let e=G.value;return e.name.trim()!==``&&e.host.trim()!==``&&e.port>=1&&e.port<=65535&&(!e.use_jwt_auth||(e.audience?.trim()??``)!==``)});async function ye(){H.value!==null&&ve.value&&le(),O.value=!0,k.value=``;let e=await Z();return O.value=!1,e.success?(D.value=!1,F.value=!1,P.value=null,M.value=!0,!0):(k.value=e.error??`Save failed`,!1)}let{showUnsavedModal:be,requestLeave:xe,handleDiscard:Se,handleSave:Ce,handleCancel:we}=pe(D,O,ae,ye);s({requestLeave:xe,isEditing:D});let Te=null;return e(()=>{re(),_e(),Te=setInterval(re,5e3)}),w(()=>{Te&&clearInterval(Te)}),(e,n)=>(a(),C(x,null,[v(te,{modelValue:M.value,"onUpdate:modelValue":n[0]||=e=>M.value=e,message:`Broker settings have been saved. A service restart is required for the changes to take effect.`},null,8,[`modelValue`]),v(nl,{show:H.value!==null,broker:H.value===null?null:G.value,"is-new":U.value,onDone:ue,onCancel:ce},null,8,[`show`,`broker`,`is-new`]),v(fe,{show:c(be),"is-saving":O.value,label:`Broker settings`,onDiscard:c(Se),onSave:c(Ce),onCancel:c(we)},null,8,[`show`,`is-saving`,`onDiscard`,`onSave`,`onCancel`]),S(`div`,rl,[S(`div`,il,[n[8]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},` Observer Configuration `),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},` Configure LetsMesh observer settings, MQTT brokers, and connection status `)],-1),S(`div`,al,[D.value?(a(),C(x,{key:1},[S(`button`,{onClick:ae,disabled:O.value,class:`px-3 sm:cfg-btn-secondary`},` Cancel `,8,ol),S(`button`,{onClick:oe,disabled:O.value,class:`btn-primary`},l(O.value?`Saving…`:`Save Settings`),9,sl)],64)):(a(),C(`button`,{key:0,onClick:Q,class:`btn-primary`},` Edit Settings `))])]),k.value?(a(),C(`div`,cl,l(k.value),1)):_(``,!0),S(`div`,ll,[n[10]||=S(`div`,{class:`mb-4`},[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},`Observer Status`),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},`Live LetsMesh broker connection state`)],-1),q.value?(a(),C(`div`,dl,[S(`div`,fl,[n[9]||=S(`span`,{class:`text-sm text-content-secondary dark:text-content-muted w-36`},`Handler`,-1),S(`span`,{class:p([`inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium`,q.value.handler_active?`bg-accent-green/opacity-light dark:bg-accent-green/opacity-medium text-accent-green`:`bg-background-mute dark:bg-background-mute/opacity-heavy text-content-muted`])},[S(`span`,{class:p([`w-1.5 h-1.5 rounded-full`,q.value.handler_active?`bg-accent-green/opacity-light`:`bg-background-mute`])},null,2),b(` `+l(q.value.handler_active?`Active`:`Inactive`),1)],2)]),q.value.brokers.length?(a(),C(`div`,pl,[(a(!0),C(x,null,t(q.value.brokers,e=>(a(),C(`div`,{key:e.host,class:`flex items-center gap-2`},[S(`span`,{class:`text-sm text-content-secondary dark:text-content-muted w-36 truncate`,title:e.name},l(e.name),9,ml),S(`span`,{class:p([`inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium`,e.status.connected?`bg-accent-green/opacity-light dark:bg-accent-green/opacity-medium text-accent-green`:e.status.reconnecting?`bg-accent-amber/opacity-light dark:bg-accent-amber/opacity-medium text-accent-amber`:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium text-accent-red`])},[S(`span`,{class:p([`w-1.5 h-1.5 rounded-full`,e.status.connected?`bg-accent-green/opacity-light`:e.status.reconnecting?`bg-accent-amber/opacity-light`:`bg-accent-red/opacity-light`])},null,2),b(` `+l(e.status.connected?`Connected`:e.status.reconnecting?`Reconnecting…`:`Disconnected`),1)],2)]))),128))])):(a(),C(`div`,hl,`No broker connections configured.`))])):(a(),C(`div`,ul,` Status unavailable — service may not be running. `))]),S(`div`,gl,[n[19]||=S(`div`,{class:`mb-4`},[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},`Observer Setup`),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},`IATA code, status interval, and owner details`)],-1),S(`div`,null,[D.value?_(``,!0):(a(),C(`div`,_l,[S(`div`,vl,[n[11]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`IATA Code`,-1),S(`span`,yl,l(d.value.iata_code||`—`),1)]),S(`div`,bl,[n[12]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Status Interval`,-1),S(`span`,xl,l(d.value.status_interval??300)+`s`,1)]),S(`div`,Sl,[n[13]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Owner`,-1),S(`span`,Cl,l(d.value.owner||`—`),1)]),S(`div`,wl,[n[14]||=S(`span`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Email`,-1),S(`span`,Tl,l(d.value.email||`—`),1)])])),D.value?(a(),C(`div`,El,[S(`div`,Dl,[S(`div`,null,[n[15]||=S(`label`,{class:`block text-xs sm:text-sm text-content-secondary dark:text-content-muted mb-1`},[b(` IATA Code `),S(`span`,{class:`text-content-muted/opacity-heavy text-xs`},`(e.g. SFO, LHR)`)],-1),i(S(`input`,{"onUpdate:modelValue":n[1]||=e=>I.value=e,type:`text`,maxlength:`10`,placeholder:`TEST`,class:`cfg-input font-mono`},null,512),[[j,I.value]])]),S(`div`,null,[n[16]||=S(`label`,{class:`block text-xs sm:text-sm text-content-secondary dark:text-content-muted mb-1`},[b(` Status Interval `),S(`span`,{class:`text-content-muted/opacity-heavy text-xs`},`(seconds, min 60)`)],-1),i(S(`input`,{"onUpdate:modelValue":n[2]||=e=>L.value=e,type:`number`,min:`60`,max:`3600`,class:`cfg-input font-mono`},null,512),[[j,L.value,void 0,{number:!0}]])]),S(`div`,null,[n[17]||=S(`label`,{class:`block text-xs sm:text-sm text-content-secondary dark:text-content-muted mb-1`},`Owner Companion Pubkey`,-1),i(S(`input`,{"onUpdate:modelValue":n[3]||=e=>z.value=e,type:`text`,placeholder:`Optional`,class:`cfg-input`},null,512),[[j,z.value]])]),S(`div`,null,[n[18]||=S(`label`,{class:`block text-xs sm:text-sm text-content-secondary dark:text-content-muted mb-1`},`Email`,-1),i(S(`input`,{"onUpdate:modelValue":n[4]||=e=>B.value=e,type:`email`,placeholder:`Optional`,class:`cfg-input`},null,512),[[j,B.value]])])])])):_(``,!0)])]),S(`div`,Ol,[S(`div`,kl,[n[27]||=S(`div`,null,[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},`Broker Settings`),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},`MQTT brokers for observer publishing`)],-1),D.value?(a(),C(`div`,Al,[S(`div`,jl,[S(`button`,{onClick:n[5]||=e=>K.value=!K.value,class:`inline-flex items-center gap-1.5 px-3 sm:cfg-btn-secondary`},[n[21]||=b(` From Template `,-1),(a(),C(`svg`,{class:p([`w-3 h-3 transition-transform`,K.value?`rotate-180`:``]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...n[20]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 9l-7 7-7-7`},null,-1)]],2))]),v(N,{name:`dropdown`},{default:r(()=>[K.value?(a(),C(`div`,Ml,[n[25]||=S(`div`,{class:`px-3 py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},[S(`p`,{class:`text-xs font-medium text-content-secondary dark:text-content-muted uppercase tracking-wide`},`Known Networks`)],-1),m.value?(a(),C(`div`,Nl,` Loading presets… `)):g.value?(a(),C(`div`,Pl,l(g.value),1)):f.value.length?(a(),C(`div`,Il,[(a(!0),C(x,null,t(f.value,e=>(a(),C(`div`,{key:e.id,class:`border-b border-stroke-subtle dark:border-stroke/opacity-light last:border-b-0`},[S(`div`,{class:`flex items-center gap-2 px-3 py-2.5 hover:bg-background-mute dark:hover:bg-background/30 cursor-pointer group`,onClick:t=>me(e)},[S(`div`,Rl,[S(`p`,zl,l(e.name),1),S(`p`,Bl,l(e.brokers.length)+` broker`+l(e.brokers.length===1?``:`s`),1)]),e.brokers.length>1?(a(),C(`button`,{key:0,onClick:A(t=>ge(e.id),[`stop`]),title:T.value===e.id?`Hide individual brokers`:`Pick individual brokers`,class:`flex-shrink-0 p-1 rounded hover:bg-primary/opacity-light text-content-secondary dark:text-content-muted hover:text-primary transition-colors`},[(a(),C(`svg`,{class:p([`w-3.5 h-3.5 transition-transform`,T.value===e.id?`rotate-180`:``]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...n[22]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 9l-7 7-7-7`},null,-1)]],2))],8,Vl)):_(``,!0),e.website?(a(),C(`a`,{key:1,href:e.website,target:`_blank`,rel:`noopener noreferrer`,title:`Visit website`,class:`flex-shrink-0 p-1 rounded hover:bg-primary/opacity-light text-content-secondary dark:text-content-muted hover:text-primary transition-colors`,onClick:n[6]||=A(()=>{},[`stop`])},[...n[23]||=[S(`svg`,{class:`w-3.5 h-3.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14`})],-1)]],8,Hl)):_(``,!0)],8,Ll),T.value===e.id&&e.brokers.length>1?(a(),C(`div`,Ul,[(a(!0),C(x,null,t(e.brokers,(t,r)=>(a(),C(`div`,{key:`${e.id}-${r}`,class:`flex items-center gap-2 pl-6 pr-3 py-2 hover:bg-background-mute dark:hover:bg-background/30 cursor-pointer`,onClick:e=>he(t)},[S(`div`,Gl,[S(`p`,Kl,l(t.name),1),S(`p`,ql,l(t.host)+`:`+l(t.port),1)]),n[24]||=S(`span`,{class:`flex-shrink-0 inline-flex items-center justify-center w-5 h-5 rounded bg-primary/opacity-light text-primary text-xs font-bold`,title:`Add only this broker`},`+`,-1)],8,Wl))),128))])):_(``,!0)]))),128))])):(a(),C(`div`,Fl,` No bundled presets. Use "Add" to configure manually. `))])):_(``,!0)]),_:1}),K.value?(a(),C(`div`,{key:0,class:`fixed inset-0 z-10`,onClick:n[7]||=e=>K.value=!1})):_(``,!0)]),S(`button`,{onClick:se,class:`btn-primary inline-flex items-center gap-1.5`},[...n[26]||=[S(`svg`,{class:`w-3.5 h-3.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 4v16m8-8H4`})],-1),b(` Add `,-1)]])])):_(``,!0)]),V.value.length?(a(),C(`div`,Xl,[(a(!0),C(x,null,t(V.value,e=>(a(),C(`div`,{key:e._id,class:`cfg-card overflow-hidden`},[S(`div`,Zl,[S(`div`,Ql,[S(`span`,{class:p([`inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium`,e.enabled?`bg-accent-green/opacity-light dark:bg-accent-green/opacity-medium text-accent-green`:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium text-accent-red`])},[S(`span`,{class:p([`w-1.5 h-1.5 rounded-full`,e.enabled?`bg-accent-green/opacity-light`:`bg-accent-red/opacity-light`])},null,2),b(` `+l(e.enabled?`Enabled`:`Disabled`),1)],2),S(`span`,$l,l(e.name||`(unnamed)`),1),S(`span`,eu,l(e.host||`—`)+`:`+l(e.port),1)]),D.value?(a(),C(`div`,tu,[S(`button`,{onClick:t=>$(e),class:`px-2.5 py-1 text-xs bg-primary/opacity-medium hover:bg-primary/opacity-medium text-content-primary rounded border border-primary/opacity-heavy transition-colors`},` Edit `,8,nu),S(`button`,{onClick:t=>de(e._id),title:`Remove`,class:`p-1.5 rounded hover:bg-accent-red/opacity-light dark:hover:bg-accent-red/opacity-medium text-content-secondary dark:text-content-muted hover:text-accent-red dark:hover:text-accent-red transition-colors`},[...n[30]||=[S(`svg`,{class:`w-3.5 h-3.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16`})],-1)]],8,ru)])):_(``,!0)])]))),128))])):(a(),C(`div`,Jl,[n[28]||=S(`svg`,{class:`w-7 h-7 mb-2 opacity-40`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`1.5`,d:`M5 12h14M5 12l4-4m-4 4l4 4`})],-1),n[29]||=S(`p`,{class:`text-sm`},`No brokers configured`,-1),D.value?(a(),C(`p`,Yl,`Use Add or From Template above`)):_(``,!0)]))])])],64))}}),[[`__scopeId`,`data-v-e0c27f45`]]),au={class:`space-y-12`},ou={key:0,class:`rounded-lg border-2 border-accent-red/opacity-heavy bg-accent-red/opacity-light p-4`},su={class:`cfg-section`},cu=[`disabled`],lu={key:0,class:`flex items-center gap-2`},uu={key:1,class:`flex items-center gap-2`},du={key:0,class:`text-xs text-accent-green mt-2`},fu={key:1,class:`text-xs text-accent-red mt-2`},pu={class:`cfg-section`},mu={key:0},hu={key:1,class:`rounded-lg border-2 border-accent-red/opacity-heavy bg-accent-red/opacity-light p-4`},gu={class:`flex items-start gap-3`},_u={class:`flex-1`},vu={class:`text-xs text-accent-red mt-1`},yu={class:`flex gap-2 mt-3`},bu=[`disabled`],xu=[`disabled`],Su={key:2,class:`text-xs text-accent-green mt-2`},Cu={key:3,class:`text-xs text-accent-red mt-2`},wu={class:`cfg-section`},Tu={class:`space-y-3`},Eu={class:`flex items-center gap-3 cursor-pointer px-4 py-3 bg-background-mute dark:bg-background/30 rounded-lg border-2 border-dashed border-stroke-subtle dark:border-stroke/opacity-heavy hover:border-primary/opacity-heavy dark:hover:border-primary/opacity-heavy transition-colors`},Du={class:`text-sm text-content-secondary dark:text-content-muted`},Ou={key:0,class:`bg-background-mute dark:bg-background/30 rounded-lg p-4 border border-stroke-subtle dark:border-stroke/opacity-light`},ku={key:0,class:`text-xs text-content-secondary dark:text-content-muted space-y-1 mb-3`},Au={class:`font-mono`},ju={class:`font-mono`},Mu={key:0,class:`text-accent-amber font-medium`},Nu={key:1,class:`text-content-muted`},Pu={class:`text-xs text-content-secondary dark:text-content-muted`},Fu={class:`font-mono`},Iu={key:1},Lu={key:2,class:`rounded-lg border-2 border-accent-amber/opacity-heavy bg-accent-amber/opacity-light p-4`},Ru={class:`flex items-start gap-3`},zu={class:`flex-1`},Bu={class:`text-xs text-accent-amber mt-1`},Vu={class:`flex gap-2 mt-3`},Hu=[`disabled`],Uu=[`disabled`],Wu={key:3,class:`text-xs text-accent-green mt-2`},Gu={key:4,class:`text-xs text-accent-red mt-2`},Ku={class:`cfg-section`},qu={key:0},Ju={key:1,class:`rounded-lg border-2 border-accent-red/opacity-heavy bg-accent-red/opacity-light p-4`},Yu={class:`flex items-start gap-3`},Xu={class:`flex-1`},Zu={class:`text-xs text-accent-red mt-1`},Qu={class:`flex gap-2 mt-3`},$u=[`disabled`],ed=[`disabled`],td={key:2,class:`bg-background-mute dark:bg-background/30 rounded-lg p-4 border border-stroke-subtle dark:border-stroke/opacity-light space-y-2`},nd={class:`flex items-center justify-between`},rd={class:`text-xs text-content-secondary dark:text-content-muted space-y-1`},id={class:`font-mono`},ad={key:0},od={class:`font-mono`},sd={key:1},cd={class:`font-mono text-[10px] break-all`},ld={key:3,class:`text-xs text-accent-red mt-2`},ud=f({__name:`BackupRestore`,setup(e){let t=y(()=>window.location.protocol===`http:`),n=o(!1),r=o(``),i=o(``);async function s(){n.value=!0,r.value=``,i.value=``;try{let e=await R.exportConfig(!1);if(!e.success||!e.data){i.value=e.error||`Export failed`;return}let t=new Blob([JSON.stringify(e.data,null,2)],{type:`application/json`}),n=URL.createObjectURL(t),a=document.createElement(`a`);a.href=n,a.download=`openhop-repeater-settings-${(e.data.meta?.exported_at||new Date().toISOString()).replace(/[:.]/g,`-`)}.json`,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(n),r.value=`Settings exported successfully (secrets redacted).`}catch(e){i.value=e instanceof Error?e.message:`Export failed`}finally{n.value=!1}}let c=o(!1),u=o(!1),f=o(``),p=o(``);async function m(){u.value=!0,f.value=``,p.value=``;try{let e=await R.exportConfig(!0);if(!e.success||!e.data){p.value=e.error||`Export failed`;return}let t=new Blob([JSON.stringify(e.data,null,2)],{type:`application/json`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`openhop-repeater-full-backup-${(e.data.meta?.exported_at||new Date().toISOString()).replace(/[:.]/g,`-`)}.json`,document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(n),f.value=`Full backup exported (includes all secrets).`,c.value=!1}catch(e){p.value=e instanceof Error?e.message:`Export failed`}finally{u.value=!1}}let h=o(null),g=o(null),w=o(!1),T=o(!1),E=o(``),D=o(``),O=o(null),k=y(()=>g.value?.config?Object.keys(g.value.config).join(`, `):``),A=y(()=>{let e=g.value?.meta?.includes_secrets;return e===!0||e===`true`});function j(e){let t=e.target.files?.[0];if(!t)return;h.value=t,g.value=null,w.value=!1,E.value=``,D.value=``;let n=new FileReader;n.onload=e=>{try{let t=JSON.parse(e.target?.result);t.config&&typeof t.config==`object`?g.value={meta:t.meta,config:t.config}:typeof t==`object`&&!Array.isArray(t)?g.value={config:t}:D.value=`Invalid file format — expected a JSON config object.`}catch{D.value=`Invalid JSON file.`}},n.readAsText(t)}function M(){w.value=!1,g.value=null,h.value=null,O.value&&(O.value.value=``)}async function N(){if(g.value?.config){T.value=!0,E.value=``,D.value=``;try{let e=await R.importConfig(g.value.config);if(e.success){let t=e.data,n=e.message||t?.message||`Configuration imported.`;t?.restart_required&&(n+=` A service restart is required for radio changes to take effect.`),E.value=n,w.value=!1,g.value=null,h.value=null,O.value&&(O.value.value=``)}else D.value=e.error||`Import failed`}catch(e){D.value=e instanceof Error?e.message:`Import failed`}finally{T.value=!1}}}let P=o(!1),F=o(!1),I=o(null),L=o(``);async function z(){F.value=!0,L.value=``;try{let e=await R.exportIdentityKey();if(!e.success||!e.data){L.value=e.error||`Export failed`;return}I.value=e.data;let t=new Blob([e.data.identity_key_hex],{type:`text/plain`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`openhop-identity-${e.data.node_address||`key`}.hex`,document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(n)}catch(e){L.value=e instanceof Error?e.message:`Export failed`}finally{F.value=!1}}return(e,o)=>(a(),C(`div`,au,[o[39]||=S(`div`,{class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},[S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`Backup & Restore`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Export, import, and restore your repeater configuration`)])],-1),t.value?(a(),C(`div`,ou,[...o[6]||=[d(`

Unencrypted Connection

This page is served over HTTP, not HTTPS. Exported data (including identity keys) will be transmitted in plain text. Only use these features on a trusted local network.

`,1)]])):_(``,!0),S(`div`,su,[o[9]||=S(`div`,{class:`flex items-start justify-between mb-4`},[S(`div`,null,[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},` Export Settings `),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},[b(` Download the current configuration as a JSON file. Passwords, JWT secrets, and identity keys are `),S(`strong`,null,`redacted`),b(`. Safe to share or use as a template for other devices. `)])])],-1),S(`button`,{onClick:s,disabled:n.value,class:`cfg-btn-primary`},[n.value?(a(),C(`span`,lu,[v(W,{size:`sm`,color:`current`,class:`inline-block`}),o[7]||=b(` Exporting… `,-1)])):(a(),C(`span`,uu,[...o[8]||=[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4`})],-1),b(` Export Settings `,-1)]]))],8,cu),r.value?(a(),C(`p`,du,l(r.value),1)):_(``,!0),i.value?(a(),C(`p`,fu,l(i.value),1)):_(``,!0)]),S(`div`,pu,[o[15]||=d(`

Full Backup

Download a complete backup including all passwords, JWT secrets, and identity keys. Required for restoring to a new device or recovering from a failed SD card.

Contains sensitive data. The backup file will include plain-text passwords and private keys. Store it securely and never share it.

`,2),c.value?_(``,!0):(a(),C(`div`,mu,[S(`button`,{onClick:o[0]||=e=>c.value=!0,class:`cfg-btn-danger`},[...o[10]||=[S(`span`,{class:`flex items-center gap-2`},[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z`})]),b(` Full Backup `)],-1)]])])),c.value?(a(),C(`div`,hu,[S(`div`,gu,[o[14]||=S(`svg`,{class:`w-5 h-5 text-accent-red shrink-0 mt-0.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z`})],-1),S(`div`,_u,[o[13]||=S(`h4`,{class:`text-sm font-semibold text-accent-red`},` Confirm Full Backup `,-1),S(`p`,vu,[o[11]||=b(` This will export `,-1),o[12]||=S(`strong`,null,`all secrets in plain text`,-1),b(` including admin/guest passwords, JWT secret, and your repeater's private identity key`+l(t.value?` over an unencrypted HTTP connection`:``)+`. `,1)]),S(`div`,yu,[S(`button`,{onClick:m,disabled:u.value,class:`cfg-btn-danger`},l(u.value?`Exporting…`:`Yes, Export Full Backup`),9,bu),S(`button`,{onClick:o[1]||=e=>c.value=!1,disabled:u.value,class:`btn-secondary`},` Cancel `,8,xu)])])])])):_(``,!0),f.value?(a(),C(`p`,Su,l(f.value),1)):_(``,!0),p.value?(a(),C(`p`,Cu,l(p.value),1)):_(``,!0)]),S(`div`,wu,[o[29]||=S(`div`,{class:`flex items-start justify-between mb-4`},[S(`div`,null,[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},` Import Configuration `),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},[b(` Restore configuration from a previously exported JSON file. Importing a `),S(`strong`,null,`full backup`),b(` will also restore passwords and identity keys. Importing a `),S(`strong`,null,`settings export`),b(` will only update non-sensitive settings. `)])])],-1),S(`div`,Tu,[S(`label`,Eu,[o[16]||=S(`svg`,{class:`w-5 h-5 text-content-secondary dark:text-content-muted`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12`})],-1),S(`span`,Du,l(h.value?h.value.name:`Choose a config JSON file…`),1),S(`input`,{ref_key:`fileInputRef`,ref:O,type:`file`,accept:`.json,application/json`,class:`hidden`,onChange:j},null,544)]),g.value?(a(),C(`div`,Ou,[o[20]||=S(`h4`,{class:`text-sm font-medium text-content-primary mb-2`},` Import Preview `,-1),g.value.meta?(a(),C(`div`,ku,[S(`p`,null,[o[17]||=b(` Exported: `,-1),S(`span`,Au,l(g.value.meta.exported_at),1)]),S(`p`,null,[o[18]||=b(` Version: `,-1),S(`span`,ju,l(g.value.meta.version),1)]),g.value.meta.includes_secrets===`true`||g.value.meta.includes_secrets===!0?(a(),C(`p`,Mu,` ⚠ Full backup — will restore passwords and identity keys `)):(a(),C(`p`,Nu,` Settings only — existing secrets will not be changed `))])):_(``,!0),S(`p`,Pu,[o[19]||=b(` Sections: `,-1),S(`span`,Fu,l(k.value),1)])])):_(``,!0),g.value&&!w.value?(a(),C(`div`,Iu,[S(`button`,{onClick:o[2]||=e=>w.value=!0,class:`px-4 py-2 bg-accent-amber/opacity-medium hover:bg-accent-amber/opacity-medium text-accent-amber rounded-lg border border-accent-amber/opacity-heavy transition-colors text-sm`},` Review & Import `)])):_(``,!0),w.value?(a(),C(`div`,Lu,[S(`div`,Ru,[o[28]||=S(`svg`,{class:`w-5 h-5 text-accent-amber shrink-0 mt-0.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z`})],-1),S(`div`,zu,[o[27]||=S(`h4`,{class:`text-sm font-semibold text-accent-amber`},` Confirm Import `,-1),S(`p`,Bu,[o[24]||=b(` This will overwrite current settings for: `,-1),S(`strong`,null,l(k.value),1),o[25]||=b(`. `,-1),A.value?(a(),C(x,{key:0},[o[21]||=b(` This is a full backup — `,-1),o[22]||=S(`strong`,null,`passwords, JWT secrets, and identity keys will also be overwritten`,-1),o[23]||=b(`. `,-1)],64)):(a(),C(x,{key:1},[b(` Passwords and identity keys will not be changed. `)],64)),o[26]||=b(` Some changes (radio settings) require a service restart. `,-1)]),S(`div`,Vu,[S(`button`,{onClick:N,disabled:T.value,class:`px-4 py-2 bg-accent-amber/opacity-medium hover:bg-accent-amber/opacity-medium text-accent-amber rounded-lg border border-accent-amber/opacity-heavy transition-colors text-sm disabled:opacity-50 disabled:cursor-not-allowed`},l(T.value?`Importing…`:`Yes, Import`),9,Hu),S(`button`,{onClick:M,disabled:T.value,class:`btn-secondary`},` Cancel `,8,Uu)])])])])):_(``,!0),E.value?(a(),C(`p`,Wu,l(E.value),1)):_(``,!0),D.value?(a(),C(`p`,Gu,l(D.value),1)):_(``,!0)])]),S(`div`,Ku,[o[38]||=d(`

Export Identity Key

Download the repeater's private identity key for backup. This key determines the node's address and cryptographic identity on the mesh.

Sensitive data. The identity key is the repeater's private key. Anyone with this key can impersonate your node. Store the exported file securely and never share it.

`,2),P.value?_(``,!0):(a(),C(`div`,qu,[S(`button`,{onClick:o[3]||=e=>P.value=!0,class:`cfg-btn-danger`},[...o[30]||=[S(`span`,{class:`flex items-center gap-2`},[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z`})]),b(` Export Identity Key `)],-1)]])])),P.value&&!I.value?(a(),C(`div`,Ju,[S(`div`,Yu,[o[32]||=S(`svg`,{class:`w-5 h-5 text-accent-red shrink-0 mt-0.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z`})],-1),S(`div`,Xu,[o[31]||=S(`h4`,{class:`text-sm font-semibold text-accent-red`},`Are you sure?`,-1),S(`p`,Zu,` This will transmit your private key `+l(t.value?`over an unencrypted HTTP connection. `:``)+` and download it as a file. `,1),S(`div`,Qu,[S(`button`,{onClick:z,disabled:F.value,class:`cfg-btn-danger`},l(F.value?`Exporting…`:`Yes, Export Key`),9,$u),S(`button`,{onClick:o[4]||=e=>P.value=!1,disabled:F.value,class:`btn-secondary`},` Cancel `,8,ed)])])])])):_(``,!0),I.value?(a(),C(`div`,td,[S(`div`,nd,[o[33]||=S(`h4`,{class:`text-sm font-medium text-content-primary`},` Key Exported `,-1),S(`button`,{onClick:o[5]||=e=>{I.value=null,P.value=!1},class:`text-xs text-content-muted hover:text-content-secondary transition-colors`},` Dismiss `)]),S(`div`,rd,[S(`p`,null,[o[34]||=b(` Key length: `,-1),S(`span`,id,l(I.value.key_length_bytes)+` bytes`,1)]),I.value.node_address?(a(),C(`p`,ad,[o[35]||=b(` Node address: `,-1),S(`span`,od,l(I.value.node_address),1)])):_(``,!0),I.value.public_key_hex?(a(),C(`p`,sd,[o[36]||=b(` Public key: `,-1),S(`span`,cd,l(I.value.public_key_hex),1)])):_(``,!0)]),o[37]||=S(`p`,{class:`text-xs text-accent-green`},`File downloaded successfully.`,-1)])):_(``,!0),L.value?(a(),C(`p`,ld,l(L.value),1)):_(``,!0)])]))}}),dd={class:`space-y-12`},fd={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},pd={class:`flex items-center gap-2 flex-shrink-0`},md={class:`cfg-section`},hd={class:`flex items-start justify-between mb-4`},gd=[`disabled`],_d={key:0,class:`flex items-center gap-1.5`},vd={key:1},yd={key:0,class:`grid grid-cols-2 sm:grid-cols-4 gap-3 mb-6`},bd={class:`bg-background-mute dark:bg-background/30 rounded-lg p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},xd={class:`text-lg font-semibold text-content-primary font-mono`},Sd={class:`bg-background-mute dark:bg-background/30 rounded-lg p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},Cd={class:`text-lg font-semibold text-content-primary font-mono`},wd={class:`bg-background-mute dark:bg-background/30 rounded-lg p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},Td={class:`text-lg font-semibold text-content-primary font-mono`},Ed={class:`bg-background-mute dark:bg-background/30 rounded-lg p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},Dd={class:`text-lg font-semibold text-content-primary font-mono`},Od={key:1,class:`flex items-center justify-center py-12`},kd={class:`text-center`},Ad={key:2,class:`rounded-lg border border-accent-red/opacity-medium dark:border-accent-red/opacity-medium bg-accent-red/opacity-light dark:bg-accent-red/opacity-light p-3 mb-4`},jd={class:`text-xs text-accent-red`},Md={key:3},Nd={class:`overflow-x-auto`},Pd={class:`w-full text-sm`},Fd={class:`py-2.5 pr-4`},Id={class:`font-mono text-content-primary`},Ld={class:`py-2.5 pr-4 text-right`},Rd={class:`font-mono text-content-secondary dark:text-content-muted`},zd={class:`py-2.5 pr-4 text-right hidden sm:table-cell`},Bd={key:0,class:`text-xs text-content-muted`},Vd={class:`text-content-muted/opacity-heavy ml-1`},Hd={key:1,class:`text-xs text-content-muted/opacity-heavy`},Ud={key:2,class:`text-xs text-content-muted/opacity-heavy`},Wd={class:`py-2.5 text-right`},Gd=[`onClick`,`disabled`],Kd={key:0,class:`flex items-center gap-1`},qd={key:1},Jd={key:1,class:`text-xs text-content-muted/opacity-heavy`},Yd={class:`flex items-start gap-3 mb-5`},Xd={class:`flex-1 min-w-0`},Zd={class:`text-lg font-semibold text-content-primary`},Qd={class:`text-sm text-content-secondary dark:text-content-muted mt-1`},$d={class:`text-content-primary`},ef={class:`text-content-primary font-mono`},tf={class:`flex gap-3`},nf=[`disabled`],rf=[`disabled`],af={class:`cfg-section`},of={class:`flex flex-wrap gap-3`},sf=[`disabled`],cf=[`disabled`],lf={class:`flex items-center gap-2`},uf={key:0,class:`text-xs text-accent-green mt-3`},df={key:1,class:`text-xs text-accent-green mt-3`},ff=f({__name:`DatabaseManagement`,setup(n){let r=new Set([`packets`,`adverts`,`noise_floor`,`crc_errors`,`room_messages`,`room_client_sync`,`companion_contacts`,`companion_channels`,`companion_messages`,`companion_prefs`]),i=o(!1),s=o(!1),d=o(``),f=o(null),p=o({}),h=o(null),g=o(``),w=o(!1),T=o(``),E=y(()=>f.value?f.value.tables.reduce((e,t)=>e+t.row_count,0):0);function D(e){return r.has(e)}function O(e,t){return!e||!t?0:Math.max(1,Math.round((t-e)/86400))}async function k(){s.value=!0,d.value=``;try{let e=await R.getDbStats();e.success&&e.data?f.value=e.data:d.value=e.error||`Failed to load database stats`}catch(e){d.value=e instanceof Error?e.message:`Failed to load database stats`}finally{s.value=!1}}function j(e,t){g.value=``,h.value={table:e,rowCount:t,executing:!1}}async function M(){if(!h.value)return;let{table:e}=h.value;h.value.executing=!0,g.value=``;try{let t=e===`all`?`all`:[e];e!==`all`&&(p.value[e]=!0);let n=await R.purgeTable(t);if(n.success){let t=n.data||{};g.value=`Deleted ${Object.values(t).reduce((e,t)=>e+(t.deleted||0),0).toLocaleString()} rows${e===`all`?` from all tables`:` from ${e}`}.`,h.value=null,await k()}else d.value=n.error||`Purge failed`,h.value=null}catch(e){d.value=e instanceof Error?e.message:`Purge failed`,h.value=null}finally{e!==`all`&&(p.value[e]=!1)}}async function N(){w.value=!0,T.value=``,d.value=``;try{let e=await R.vacuumDb();if(e.success&&e.data){let t=e.data.freed_bytes;T.value=t>0?`Compacted database — freed ${Q(t)} (${Q(e.data.size_before)} → ${Q(e.data.size_after)}).`:`Database already compact (${Q(e.data.size_after)}).`,await k()}else d.value=e.error||`Vacuum failed`}catch(e){d.value=e instanceof Error?e.message:`Vacuum failed`}finally{w.value=!1}}return e(k),(e,n)=>(a(),C(`div`,dd,[S(`div`,fd,[n[5]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`Database`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`View database statistics and perform maintenance`)],-1),S(`div`,pd,[S(`button`,{onClick:n[0]||=e=>i.value=!i.value,class:`cfg-btn-primary`},l(i.value?`Lock`:`Unlock`),1)])]),S(`div`,md,[S(`div`,hd,[n[7]||=S(`div`,null,[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},` Database Overview `),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},` Storage usage and table statistics for the repeater database. `)],-1),S(`button`,{onClick:k,disabled:s.value,class:`cfg-btn-secondary`},[s.value?(a(),C(`span`,_d,[v(W,{size:`xs`,color:`current`,class:`inline-block`}),n[6]||=b(` Loading… `,-1)])):(a(),C(`span`,vd,`Refresh`))],8,gd)]),f.value?(a(),C(`div`,yd,[S(`div`,bd,[n[8]||=S(`p`,{class:`text-xs text-content-muted mb-1`},`Database Size`,-1),S(`p`,xd,l(c(Q)(f.value.database_size_bytes)),1)]),S(`div`,Sd,[n[9]||=S(`p`,{class:`text-xs text-content-muted mb-1`},`RRD Metrics`,-1),S(`p`,Cd,l(c(Q)(f.value.rrd_size_bytes)),1)]),S(`div`,wd,[n[10]||=S(`p`,{class:`text-xs text-content-muted mb-1`},`Total Size`,-1),S(`p`,Td,l(c(Q)(f.value.database_size_bytes+f.value.rrd_size_bytes)),1)]),S(`div`,Ed,[n[11]||=S(`p`,{class:`text-xs text-content-muted mb-1`},`Total Rows`,-1),S(`p`,Dd,l(E.value.toLocaleString()),1)])])):_(``,!0),s.value&&!f.value?(a(),C(`div`,Od,[S(`div`,kd,[v(W,{class:`mx-auto mb-4`}),n[12]||=S(`div`,{class:`text-content-secondary dark:text-content-muted`},`Loading database info…`,-1)])])):_(``,!0),d.value?(a(),C(`div`,Ad,[S(`p`,jd,l(d.value),1)])):_(``,!0),f.value&&f.value.tables.length>0?(a(),C(`div`,Md,[S(`div`,Nd,[S(`table`,Pd,[n[14]||=S(`thead`,null,[S(`tr`,{class:`border-b border-stroke-subtle dark:border-stroke/opacity-light`},[S(`th`,{class:`text-left py-2 pr-4 text-xs font-medium text-content-muted uppercase tracking-wider`},` Table `),S(`th`,{class:`text-right py-2 pr-4 text-xs font-medium text-content-muted uppercase tracking-wider`},` Rows `),S(`th`,{class:`text-right py-2 pr-4 text-xs font-medium text-content-muted uppercase tracking-wider hidden sm:table-cell`},` Date Range `),S(`th`,{class:`text-right py-2 text-xs font-medium text-content-muted uppercase tracking-wider`},` Actions `)])],-1),S(`tbody`,null,[(a(!0),C(x,null,t(f.value.tables,e=>(a(),C(`tr`,{key:e.name,class:`border-b border-stroke-subtle/50 dark:border-stroke/opacity-light`},[S(`td`,Fd,[S(`span`,Id,l(e.name),1)]),S(`td`,Ld,[S(`span`,Rd,l(e.row_count.toLocaleString()),1)]),S(`td`,zd,[e.has_timestamp&&e.row_count>0?(a(),C(`span`,Bd,[b(l(c(Z)(e.oldest_timestamp))+` — `+l(c(Z)(e.newest_timestamp))+` `,1),S(`span`,Vd,`(`+l(O(e.oldest_timestamp,e.newest_timestamp))+`d)`,1)])):e.row_count===0?(a(),C(`span`,Hd,`—`)):(a(),C(`span`,Ud,`n/a`))]),S(`td`,Wd,[i.value&&D(e.name)&&e.row_count>0?(a(),C(`button`,{key:0,onClick:t=>j(e.name,e.row_count),disabled:p.value[e.name],class:`px-2.5 py-1 bg-accent-red/opacity-light dark:bg-accent-red/opacity-light hover:bg-accent-red/opacity-medium dark:hover:bg-accent-red/opacity-medium text-accent-red rounded border border-accent-red/opacity-medium dark:border-accent-red/opacity-medium transition-colors text-xs disabled:opacity-50`},[p.value[e.name]?(a(),C(`span`,Kd,[v(W,{size:`xs`,color:`current`,class:`inline-block`}),n[13]||=b(` Purging… `,-1)])):(a(),C(`span`,qd,`Empty`))],8,Gd)):D(e.name)?_(``,!0):(a(),C(`span`,Jd,`—`))])]))),128))])])])])):_(``,!0)]),(a(),u(m,{to:`body`},[h.value?(a(),C(`div`,{key:0,class:`modal-backdrop-heavy`,onClick:n[3]||=A(e=>!h.value.executing&&(h.value=null),[`self`])},[S(`div`,{class:`modal-card max-w-lg`,onClick:n[2]||=A(()=>{},[`stop`])},[S(`div`,Yd,[n[20]||=S(`div`,{class:`flex-shrink-0 w-10 h-10 rounded-full bg-accent-red/opacity-light flex items-center justify-center`},[S(`svg`,{class:`w-5 h-5 text-accent-red`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z`})])],-1),S(`div`,Xd,[S(`h3`,Zd,l(h.value.table===`all`?`Purge All Tables`:`Purge "${h.value.table}"`),1),S(`p`,Qd,[h.value.table===`all`?(a(),C(x,{key:0},[n[15]||=b(` This will permanently delete `,-1),n[16]||=S(`strong`,{class:`text-content-primary`},`all data`,-1),b(` from every data table (`+l(E.value.toLocaleString())+` rows total). This cannot be undone. `,1)],64)):(a(),C(x,{key:1},[n[17]||=b(` This will permanently delete `,-1),S(`strong`,$d,l(h.value.rowCount.toLocaleString())+` rows`,1),n[18]||=b(` from `,-1),S(`strong`,ef,l(h.value.table),1),n[19]||=b(`. This cannot be undone. `,-1)],64))])])]),S(`div`,tf,[S(`button`,{onClick:n[1]||=e=>h.value=null,disabled:h.value.executing,class:`flex-1 px-4 py-3 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light border border-stroke-subtle dark:border-stroke/opacity-medium text-content-primary rounded-lg transition-colors`},` Cancel `,8,nf),S(`button`,{onClick:M,disabled:h.value.executing,class:`flex-1 px-4 py-3 bg-accent-red/opacity-medium hover:bg-accent-red/opacity-medium border border-accent-red/opacity-heavy text-accent-red rounded-lg transition-colors font-medium disabled:opacity-50`},l(h.value.executing?`Purging…`:`Yes, Delete Data`),9,rf)])])])):_(``,!0)])),S(`div`,af,[n[23]||=S(`h3`,{class:`text-lg font-semibold text-content-primary mb-4`},` Maintenance `,-1),S(`div`,of,[S(`button`,{onClick:n[4]||=e=>j(`all`,E.value),disabled:!f.value||E.value===0||!i.value,class:`px-4 py-2 bg-accent-red/opacity-medium dark:bg-accent-red/opacity-medium hover:bg-accent-red/opacity-medium dark:hover:bg-accent-red/opacity-medium text-accent-red rounded-lg border border-accent-red/opacity-heavy dark:border-accent-red/opacity-heavy transition-colors text-sm disabled:opacity-50 disabled:cursor-not-allowed`},[...n[21]||=[S(`span`,{class:`flex items-center gap-2`},[S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16`})]),b(` Purge All Data `)],-1)]],8,sf),S(`button`,{onClick:N,disabled:w.value||!f.value,class:`cfg-btn-primary`},[S(`span`,lf,[n[22]||=S(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15`})],-1),b(` `+l(w.value?`Compacting…`:`Compact Database`),1)])],8,cf)]),T.value?(a(),C(`p`,uf,l(T.value),1)):_(``,!0),g.value?(a(),C(`p`,df,l(g.value),1)):_(``,!0)])]))}}),pf={class:`space-y-12`},mf={class:`cfg-section`},hf={class:`flex items-start justify-between mb-4`},gf={class:`flex items-center gap-2`},_f=[`disabled`],vf={key:0,class:`flex items-center gap-1.5`},yf={key:1},bf=[`disabled`],xf={key:0,class:`flex items-center gap-1.5`},Sf={key:1},Cf={key:0,class:`mb-4 p-3 rounded-lg bg-accent-red/opacity-light border border-accent-red/opacity-medium text-accent-red text-sm`},wf={key:1,class:`mb-4`},Tf={class:`bg-background-mute dark:bg-background/30 rounded-lg p-3 border border-stroke-subtle dark:border-stroke/opacity-light inline-block`},Ef={class:`text-lg font-semibold text-content-primary font-mono`},Df={key:2,class:`p-4 rounded-lg bg-accent-cyan/opacity-light dark:bg-primary/opacity-light border border-accent-cyan/opacity-medium dark:border-primary/opacity-medium`},Of={key:3},kf=[`innerHTML`],Af={class:`font-semibold text-sm`},jf={class:`text-sm mt-0.5 opacity-80`},Mf={class:`grid grid-cols-2 sm:grid-cols-3 gap-3 mb-6`},Nf={key:0,class:`bg-background-mute dark:bg-background/30 rounded-lg p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},Pf={class:`text-lg font-semibold text-content-primary font-mono`},Ff={key:1,class:`bg-background-mute dark:bg-background/30 rounded-lg p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},If={class:`text-lg font-semibold text-content-primary font-mono`},Lf={key:2,class:`bg-background-mute dark:bg-background/30 rounded-lg p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},Rf={class:`text-lg font-semibold text-content-primary font-mono`},zf={key:0,class:`mb-6`},Bf={class:`space-y-2`},Vf={class:`flex items-start justify-between gap-3`},Hf={class:`flex items-center gap-2 min-w-0`},Uf={class:`shrink-0 text-xs font-medium text-content-muted w-5 text-right`},Wf={class:`text-right shrink-0`},Gf={class:`text-xs text-content-muted`},Kf={class:`mt-1.5 ml-7`},qf={class:`text-xs font-mono text-content-secondary dark:text-content-muted break-all`},Jf={key:0,class:`text-xs text-content-muted mt-0.5`},Yf={key:1,class:`mb-6 p-4 rounded-lg bg-accent-green/opacity-light border border-accent-green/opacity-medium text-sm flex items-center gap-3`},Xf={key:2},Zf={key:0,class:`overflow-x-auto rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light`},Qf={class:`w-full text-sm`},$f={class:`px-3 py-2 text-content-muted font-mono text-xs`},ep={class:`px-3 py-2 text-content-primary font-mono text-xs break-all`},tp={class:`px-3 py-2 text-right font-mono text-xs text-content-secondary dark:text-content-muted whitespace-nowrap`},np={class:`px-3 py-2 text-right font-mono text-xs text-content-secondary dark:text-content-muted`},rp={key:4,class:`py-8 text-center text-content-muted text-sm`},ip=K(f({__name:`MemoryDebug`,setup(n){let i=o(!1),s=o(!1),c=o(``),u=o(null),f=o(!1),m=o(null),h=o(!1),g=y(()=>u.value&&(u.value.current_top_20||u.value.growth_since_baseline));async function w(){i.value=!0,c.value=``;try{let e=await R.get(`memory_debug`);e.success&&e.data?(f.value=!!e.data.tracing,m.value=e.data.rss_mb??null,(e.data.current_top_20||e.data.growth_since_baseline)&&(u.value=e.data)):c.value=e.error||`Failed to fetch memory status`}catch(e){c.value=e instanceof Error?e.message:`Failed to fetch memory status`}finally{i.value=!1}}async function T(){s.value=!0,c.value=``;let e=f.value?`stop`:`start`;try{let t=await R.post(`memory_debug`,{action:e});t.success&&t.data?(f.value=!!t.data.tracing,e===`stop`&&(u.value=null,m.value=null)):c.value=t.error||`Failed to ${e} tracing`}catch(t){c.value=t instanceof Error?t.message:`Failed to ${e} tracing`}finally{s.value=!1,f.value&&await w()}}function E(e){return e.size_diff_kb>=100?`critical`:e.size_diff_kb>=10?`warning`:e.size_diff_kb>=1?`low`:`ok`}function D(e){let t=E(e);return t===`critical`?`Investigate`:t===`warning`?`Watch`:t===`low`?`Minor`:`Normal`}function O(e){let t=E(e);return t===`critical`?`bg-accent-red/opacity-medium text-accent-red border border-accent-red/opacity-medium`:t===`warning`?`bg-accent-amber/opacity-medium text-accent-amber border border-accent-amber/opacity-medium`:t===`low`?`bg-primary/opacity-light text-primary border border-primary/opacity-medium`:`bg-accent-green/opacity-light text-accent-green border border-accent-green/opacity-medium`}function k(e){let t=E(e);return t===`critical`?`border-accent-red/opacity-heavy dark:border-accent-red/opacity-medium bg-accent-red/opacity-light dark:bg-accent-red/opacity-light`:t===`warning`?`border-accent-amber/opacity-heavy dark:border-accent-amber/opacity-medium bg-accent-amber/opacity-light dark:bg-accent-amber/opacity-light`:t===`low`?`border-stroke-subtle dark:border-stroke/opacity-light bg-background-mute/opacity-heavy dark:bg-background/20`:`border-stroke-subtle/50 dark:border-stroke/opacity-light bg-background-mute/opacity-medium dark:bg-background/10 opacity-60`}function A(e){let t=E(e);return t===`critical`?`text-accent-red`:t===`warning`?`text-accent-amber`:t===`low`?`text-primary`:`text-accent-green`}function j(e){return e>=1024?`${(e/1024).toFixed(1)} MB`:e>=10?`${Math.round(e)} KB`:`${e.toFixed(1)} KB`}function M(e){return e.replace(/.*\/site-packages\//,``).replace(/.*\/lib\/python[^/]*\//,``).replace(/.*\/repeater\//,`repeater/`)}let P=y(()=>u.value?.growth_since_baseline?u.value.growth_since_baseline.reduce((e,t)=>e+t.size_diff_kb,0):0),F=y(()=>P.value>=500?`critical`:P.value>=50?`warning`:P.value>=5?`low`:`ok`),I=y(()=>{let e=F.value;return e===`critical`?`border-accent-red/opacity-heavy dark:border-accent-red/opacity-medium bg-accent-red/opacity-light dark:bg-accent-red/opacity-light text-accent-red`:e===`warning`?`border-accent-amber/opacity-heavy dark:border-accent-amber/opacity-medium bg-accent-amber/opacity-light dark:bg-accent-amber/opacity-light text-accent-amber`:e===`low`?`border-primary/opacity-medium bg-primary/opacity-light dark:bg-primary/opacity-light text-primary`:`border-accent-green/opacity-medium bg-accent-green/opacity-light dark:bg-accent-green/opacity-light text-accent-green`}),L=y(()=>{let e=F.value;return e===`critical`?``:e===`warning`?``:e===`low`?``:``}),z=y(()=>{let e=F.value;return e===`critical`?`Significant memory growth detected`:e===`warning`?`Some memory growth detected`:e===`low`?`Minor memory growth — likely normal`:`Memory looks healthy`}),B=y(()=>{let e=j(P.value),t=F.value;return t===`critical`?`Total growth: ${e}. Red items below need attention.`:t===`warning`?`Total growth: ${e}. Orange items below may need attention over time.`:t===`low`?`Total growth: ${e}. Nothing to worry about right now.`:`No significant growth since tracing started.`});return e(w),(e,n)=>(a(),C(`div`,pf,[n[15]||=S(`div`,{class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},[S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},`Memory`),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Diagnose memory usage and trace allocations`)])],-1),S(`div`,mf,[S(`div`,hf,[n[2]||=S(`div`,null,[S(`h3`,{class:`text-lg font-semibold text-content-primary mb-1`},` Memory Diagnostics `),S(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},` Trace memory allocations to find leaks. Tracing adds overhead — only enable when needed. `)],-1),S(`div`,gf,[f.value&&g.value?(a(),C(`button`,{key:0,onClick:w,disabled:i.value,class:`cfg-btn-secondary`},[i.value?(a(),C(`span`,vf,[v(W,{size:`xs`,color:`current`,class:`inline-block`}),n[1]||=b(` Checking… `,-1)])):(a(),C(`span`,yf,`Check Again`))],8,_f)):_(``,!0),S(`button`,{onClick:T,disabled:s.value,class:p([`px-3 py-1.5 rounded-lg border text-sm transition-colors disabled:opacity-50`,f.value?`bg-accent-red/opacity-medium hover:bg-accent-red/opacity-medium text-accent-red border-accent-red/opacity-heavy`:`bg-accent-green/opacity-medium hover:bg-accent-green/opacity-medium text-accent-green border-accent-green/opacity-heavy`])},[s.value?(a(),C(`span`,xf,[v(W,{size:`xs`,color:`current`,class:`inline-block`}),b(` `+l(f.value?`Stopping…`:`Starting…`),1)])):(a(),C(`span`,Sf,l(f.value?`Stop Tracing`:`Start Tracing`),1))],10,bf)])]),c.value?(a(),C(`div`,Cf,l(c.value),1)):_(``,!0),!f.value&&m.value!==null&&!i.value?(a(),C(`div`,wf,[S(`div`,Tf,[n[3]||=S(`p`,{class:`text-xs text-content-muted mb-1`},`Current Memory (RSS)`,-1),S(`p`,Ef,l(m.value)+` MB`,1)])])):_(``,!0),f.value&&!g.value&&!i.value?(a(),C(`div`,Df,[...n[4]||=[d(`
Tracing active

Memory tracing is running. Let the repeater run for a few minutes, then click Check Again to see which parts of the code are using more memory.

`,2)]])):_(``,!0),u.value&&g.value?(a(),C(`div`,Of,[S(`div`,{class:p([`mb-5 p-4 rounded-lg border flex items-start gap-3`,I.value])},[S(`div`,{class:`mt-0.5`,innerHTML:L.value},null,8,kf),S(`div`,null,[S(`p`,Af,l(z.value),1),S(`p`,jf,l(B.value),1)])],2),S(`div`,Mf,[u.value.rss_mb===void 0?_(``,!0):(a(),C(`div`,Nf,[n[5]||=S(`p`,{class:`text-xs text-content-muted mb-1`},`Total Memory Used`,-1),S(`p`,Pf,l(u.value.rss_mb)+` MB`,1)])),u.value.traced_current_mb===void 0?_(``,!0):(a(),C(`div`,Ff,[n[6]||=S(`p`,{class:`text-xs text-content-muted mb-1`},`Tracked Now`,-1),S(`p`,If,l(u.value.traced_current_mb)+` MB`,1)])),u.value.traced_peak_mb===void 0?_(``,!0):(a(),C(`div`,Lf,[n[7]||=S(`p`,{class:`text-xs text-content-muted mb-1`},`Peak Tracked`,-1),S(`p`,Rf,l(u.value.traced_peak_mb)+` MB`,1)]))]),u.value.growth_since_baseline&&u.value.growth_since_baseline.length>0?(a(),C(`div`,zf,[n[8]||=S(`h4`,{class:`text-sm font-semibold text-content-primary mb-1`},`Memory Growth Breakdown`,-1),n[9]||=S(`p`,{class:`text-xs text-content-muted mb-3`},` Items at the top with red/orange tags are the most likely cause of memory issues. Green items are normal and can be ignored. `,-1),S(`div`,Bf,[(a(!0),C(x,null,t(u.value.growth_since_baseline,(e,t)=>(a(),C(`div`,{key:t,class:p([`rounded-lg border p-3 transition-colors`,k(e)])},[S(`div`,Vf,[S(`div`,Hf,[S(`span`,Uf,l(t+1),1),S(`span`,{class:p([`shrink-0 inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-semibold`,O(e)])},l(D(e)),3)]),S(`div`,Wf,[S(`span`,{class:p([`font-mono text-sm font-semibold`,A(e)])},`+`+l(j(e.size_diff_kb)),3),S(`p`,Gf,l(j(e.current_size_kb))+` total`,1)])]),S(`div`,Kf,[S(`p`,qf,l(M(e.file)),1),e.count_diff===0?_(``,!0):(a(),C(`p`,Jf,l(e.count_diff>0?`+`:``)+l(e.count_diff)+` new allocation`+l(Math.abs(e.count_diff)===1?``:`s`),1))])],2))),128))])])):u.value.growth_since_baseline&&u.value.growth_since_baseline.length===0?(a(),C(`div`,Yf,[...n[10]||=[S(`svg`,{class:`w-5 h-5 text-accent-green shrink-0`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z`})],-1),S(`span`,{class:`text-accent-green`},`No memory growth detected. Everything looks healthy.`,-1)]])):_(``,!0),u.value.current_top_20&&u.value.current_top_20.length>0?(a(),C(`div`,Xf,[S(`button`,{onClick:n[0]||=e=>h.value=!h.value,class:`flex items-center gap-2 text-sm font-semibold text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary transition-colors mb-3`},[(a(),C(`svg`,{class:p([`w-4 h-4 transition-transform`,{"rotate-90":h.value}]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...n[11]||=[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 5l7 7-7 7`},null,-1)]],2)),n[12]||=b(` Advanced: Current Top Allocations `,-1)]),v(N,{name:`expand`},{default:r(()=>[h.value?(a(),C(`div`,Zf,[S(`table`,Qf,[n[13]||=S(`thead`,null,[S(`tr`,{class:`bg-background-mute dark:bg-background/30 text-left`},[S(`th`,{class:`px-3 py-2 text-xs font-medium text-content-muted`},`#`),S(`th`,{class:`px-3 py-2 text-xs font-medium text-content-muted`},`Location`),S(`th`,{class:`px-3 py-2 text-xs font-medium text-content-muted text-right`},`Size`),S(`th`,{class:`px-3 py-2 text-xs font-medium text-content-muted text-right`},`Count`)])],-1),S(`tbody`,null,[(a(!0),C(x,null,t(u.value.current_top_20,(e,t)=>(a(),C(`tr`,{key:t,class:`border-t border-stroke-subtle/50 dark:border-stroke/opacity-light hover:bg-background-mute/opacity-heavy dark:hover:bg-background/20 transition-colors`},[S(`td`,$f,l(t+1),1),S(`td`,ep,l(M(e.file)),1),S(`td`,tp,l(j(e.size_kb)),1),S(`td`,np,l(e.count),1)]))),128))])])])):_(``,!0)]),_:1})])):_(``,!0)])):_(``,!0),!i.value&&!s.value&&!f.value&&!g.value&&!c.value&&m.value===null?(a(),C(`div`,rp,[...n[14]||=[b(` Click `,-1),S(`strong`,null,`Start Tracing`,-1),b(` to enable memory diagnostics. `,-1),S(`br`,null,null,-1),S(`span`,{class:`text-xs`},`Tracing uses extra memory — remember to stop it when done.`,-1)]])):_(``,!0)])]))}}),[[`__scopeId`,`data-v-5bf02bea`]]),ap={class:`space-y-6`},op={class:`cfg-page-heading flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},sp={class:`flex items-center gap-2 flex-shrink-0`},cp=[`disabled`],lp=[`disabled`],up=[`disabled`],dp={key:0,class:`alert-error`},fp={key:1,class:`alert-success`},pp={key:2,class:`bg-primary/opacity-light border border-primary/opacity-medium rounded-lg p-3 text-primary text-sm`},mp={key:3,class:`flex items-center justify-center py-10`},hp={class:`cfg-section`},gp={class:`flex flex-wrap items-center gap-2`},_p={key:0,class:`space-y-4`},vp={class:`cfg-section space-y-4`},yp={class:`grid grid-cols-1 xl:grid-cols-2 gap-4 items-stretch`},bp={class:`rounded-xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle px-4 py-4 flex items-center justify-between gap-4`},xp={class:`inline-flex items-center gap-3 rounded-full border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-main dark:bg-surface-900 px-3 py-2 text-sm font-medium text-content-primary shadow-sm`},Sp=[`disabled`],Cp={class:`rounded-xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle px-4 py-4 flex flex-col justify-between gap-3`},wp=[`disabled`],Tp=[`value`],Ep={class:`space-y-3`},Dp={class:`flex flex-wrap items-center justify-between gap-2`},Op={class:`flex items-center gap-2`},kp=[`disabled`],Ap=[`disabled`],jp={class:`overflow-x-auto rounded-2xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-main dark:bg-surface-900 shadow-sm`},Mp={class:`w-full min-w-[980px] table-fixed text-sm`},Np={class:`px-3 py-3 text-xs font-medium text-content-secondary`},Pp={class:`px-3 py-3`},Fp=[`title`],Ip={class:`px-3 py-3 text-content-primary`},Lp=[`title`],Rp={class:`px-3 py-3 text-xs text-content-secondary`},zp=[`title`],Bp={class:`px-3 py-3`},Vp=[`title`],Hp={class:`px-3 py-3 text-right`},Up={class:`inline-flex flex-wrap items-center justify-end gap-1`},Wp=[`disabled`,`onClick`],Gp=[`disabled`,`onClick`],Kp=[`disabled`,`onClick`],qp=[`disabled`,`onClick`],Jp={key:0},Yp={key:0,class:`space-y-2`},Xp=[`disabled`],Zp={class:`flex justify-end`},Qp=[`disabled`],$p={class:`flex flex-wrap items-center gap-2 justify-end`},em=[`disabled`],tm={key:1,class:`space-y-4`},nm={class:`cfg-section`},rm={class:`flex flex-wrap items-center gap-2`},im={class:`grid grid-cols-1 lg:grid-cols-12 gap-4`},am={class:`cfg-section lg:col-span-4 space-y-4`},om={class:`flex items-center justify-between`},sm={class:`text-xs text-content-muted`},cm={class:`space-y-2 max-h-[360px] overflow-auto pr-1`},lm=[`onClick`],um={class:`flex items-start justify-between gap-2`},dm={class:`text-sm font-medium text-content-primary`},fm={class:`text-xs text-content-muted mt-1`},pm={class:`text-[11px] text-content-muted`},mm={key:0,class:`text-xs text-content-muted py-8 text-center border border-dashed border-stroke-subtle dark:border-stroke/opacity-medium rounded-lg`},hm={class:`pt-2 border-t border-stroke-subtle dark:border-stroke/opacity-medium space-y-2`},gm=[`disabled`],_m=[`disabled`],vm=[`disabled`],ym={class:`cfg-section lg:col-span-8 space-y-4`},bm={class:`flex items-center justify-between`},xm={class:`text-sm font-semibold text-content-primary`},Sm=[`disabled`],Cm={key:0,class:`overflow-x-auto rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium`},wm={class:`w-full text-sm`},Tm={class:`px-3 py-2 text-content-primary`},Em={class:`px-3 py-2 font-mono text-xs text-content-secondary`},Dm={class:`px-3 py-2 text-right`},Om=[`disabled`,`onClick`],km={key:0},Am={key:1,class:`text-xs text-content-muted py-8 text-center border border-dashed border-stroke-subtle dark:border-stroke/opacity-medium rounded-lg`},jm={key:2,class:`pt-2 border-t border-stroke-subtle dark:border-stroke/opacity-medium space-y-2`},Mm={class:`grid grid-cols-1 md:grid-cols-2 gap-2`},Nm=[`disabled`],Pm=[`disabled`,`placeholder`],Fm=[`disabled`],Im={class:`bg-surface dark:bg-surface-elevated border border-stroke-subtle dark:border-stroke/opacity-medium rounded-[15px] p-5 max-w-5xl w-full max-h-[90vh] overflow-y-auto shadow-2xl space-y-4`},Lm={class:`flex items-start justify-between gap-3`},Rm={class:`text-lg font-semibold text-content-primary`},zm={class:`text-xs text-content-muted mt-1`},Bm={class:`flex items-center gap-2`},Vm={key:0,class:`rounded-lg border border-primary/opacity-medium bg-primary/opacity-light p-3 space-y-2`},Hm={class:`flex items-center justify-between`},Um={class:`overflow-x-auto rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium`},Wm={class:`w-full min-w-[840px] text-xs`},Gm={class:`px-2 py-1.5`},Km={class:`px-2 py-1.5`},qm={class:`px-2 py-1.5`},Jm={class:`px-2 py-1.5`},Ym={key:1,class:`bg-accent-red/opacity-light border border-accent-red/opacity-medium rounded-lg p-2 text-accent-red text-xs`},Xm={class:`grid grid-cols-1 md:grid-cols-4 gap-3`},Zm={class:`md:col-span-2`},Qm=[`value`],$m={class:`inline-flex items-center gap-2 text-sm text-content-primary`},eh={class:`space-y-2`},th={key:0,class:`rounded-lg border border-accent-amber/opacity-medium bg-accent-amber/opacity-light px-3 py-2 text-xs text-accent-amber`},nh={class:`overflow-x-auto rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium`},rh={class:`w-full min-w-[980px] text-sm`},ih={class:`bg-background-mute dark:bg-white/opacity-subtle`},ah={key:0,class:`px-2 py-2 text-left text-xs font-semibold uppercase tracking-wide text-content-muted`},oh=[`onDragover`],sh={class:`px-2 py-2 w-[58px]`},ch=[`onDragstart`],lh={class:`px-2 py-2 min-w-[170px]`},uh=[`onUpdate:modelValue`,`onChange`],dh=[`value`],fh={class:`px-2 py-2 min-w-[160px]`},ph=[`onUpdate:modelValue`],mh=[`value`],hh={key:0,class:`px-2 py-2 min-w-[140px]`},gh=[`onUpdate:modelValue`,`disabled`],_h={key:0,value:`group`},vh={class:`px-2 py-2 min-w-[230px]`},yh={key:0,class:`grid grid-cols-2 gap-1`},bh=[`onUpdate:modelValue`],xh=[`value`],Sh=[`onUpdate:modelValue`],Ch=[`value`],wh={key:1,class:`space-y-1`},Th=[`onChange`],Eh=[`value`],Dh=[`onUpdate:modelValue`,`placeholder`],Oh=[`onUpdate:modelValue`,`placeholder`],kh={key:3,class:`text-[11px] text-content-muted`},Ah={class:`px-2 py-2 min-w-[110px]`},jh=[`onUpdate:modelValue`,`disabled`],Mh=[`value`],Nh={class:`px-2 py-2 text-right`},Ph={class:`inline-flex items-center gap-1`},Fh=[`disabled`,`onClick`],Ih=[`disabled`,`onClick`],Lh=[`onClick`],Rh=[`colspan`],zh=f({name:`PolicyEngineSettings`,__name:`PolicyEngineSettings`,setup(n,{expose:r}){let s=o(!1),u=o(!1),d=o(!1),f=o(null),m=o(null),g=null,w=o(`policy`),T=o({enabled:!1,default_action:`allow`,rules:[],objects:{}}),E=o({channel_hashes:[],pubkeys:[]}),O=o({enabled:!1,default_action:`allow`,rules:[],objects:{}}),k=o({channel_hashes:[],pubkeys:[]}),N=o(`[]`),P=o(!1),F=o([]),I=o(null),L=o(!1),z=o(null),B=o(null),ee=o(null),V=o(!1),H=o(null),U=o(null),G=o(`channel_hashes`),K=o(``),te=o({friendly_name:``,description:``}),q=o({friendly_name:``,value:``}),ne=[{label:`Allow`,value:`allow`},{label:`Drop`,value:`drop`},{label:`Log Only`,value:`log_only`}],re=[{label:`Equals`,value:`equals`},{label:`Not Equals`,value:`not_equals`},{label:`Greater Than`,value:`greater_than`},{label:`Greater or Equal`,value:`greater_or_equal`},{label:`Less Than`,value:`less_than`},{label:`Less or Equal`,value:`less_or_equal`},{label:`Contains`,value:`contains`},{label:`In List`,value:`in`},{label:`Intersects`,value:`intersects`},{label:`Starts With`,value:`starts_with`},{label:`Ends With`,value:`ends_with`}],ie=[{value:`route_type`,label:`Route Type`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`less_than`]},{value:`payload_type`,label:`Payload Type`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`less_than`]},{value:`payload_length`,label:`Payload Length`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`greater_or_equal`,`less_than`,`less_or_equal`]},{value:`path_hash_size`,label:`Path Hash Size`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`less_than`]},{value:`hop_count`,label:`Hop Count`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`greater_or_equal`,`less_than`,`less_or_equal`]},{value:`rssi`,label:`RSSI`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`greater_or_equal`,`less_than`,`less_or_equal`]},{value:`snr`,label:`SNR`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`greater_or_equal`,`less_than`,`less_or_equal`]},{value:`mode`,label:`Mode`,valueTypes:[`string`],operators:[`equals`,`not_equals`,`in`]},{value:`local_transmission`,label:`Local Transmission`,valueTypes:[`boolean`],operators:[`equals`,`not_equals`]},{value:`path_hashes`,label:`Path Hashes`,valueTypes:[`string`],operators:[`contains`,`intersects`]},{value:`channel_hash`,label:`Channel Hash`,valueTypes:[`string`],operators:[`equals`,`not_equals`,`in`],groupKinds:[`channel_hashes`]},{value:`channel_decryptable`,label:`Channel Decryptable`,valueTypes:[`boolean`],operators:[`equals`,`not_equals`]},{value:`channel_message_body`,label:`Channel Message Body`,valueTypes:[`string`],operators:[`contains`,`starts_with`,`ends_with`,`equals`,`not_equals`]},{value:`payload_hex`,label:`Payload Hex`,valueTypes:[`string`],operators:[`contains`,`starts_with`,`ends_with`,`equals`,`not_equals`]},{value:`transport_code_0`,label:`Transport Code 0`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`less_than`]},{value:`transport_code_1`,label:`Transport Code 1`,valueTypes:[`number`],operators:[`equals`,`not_equals`,`greater_than`,`less_than`]}],J=y(()=>{let e={};for(let t of ie)e[t.value]=t;return e}),Y=y(()=>ie.some(e=>Array.isArray(e.groupKinds)&&e.groupKinds.length>0)),X=y(()=>Y.value?8:7);function Z(e){return JSON.parse(JSON.stringify(e))}function Q(e,t){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,`_`).replace(/^_+|_+$/g,``)||t}function ae(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}_${n}`);)n+=1;return`${e}_${n}`}function oe(e){O.value=Z(e.policy_engine),k.value=Z(e.groups)}function se(){T.value=Z(O.value),E.value=Z(k.value),N.value=JSON.stringify(T.value.rules,null,2),F.value=T.value.rules.map((e,t)=>qe(e,t))}function $(){f.value=null,m.value=null,I.value=null,u.value=!0}function ce(e){f.value=e,g&&clearTimeout(g),g=setTimeout(()=>{f.value=null,g=null},3e3)}function le(){se(),u.value=!1,f.value=null,m.value=null,I.value=null,te.value={friendly_name:``,description:``},q.value={friendly_name:``,value:``},at()}function ue(e){return{channel_hash_groups:Object.fromEntries(e.channel_hashes.map(e=>[e.id,e.entries.map(e=>e.value)])),pubkey_groups:Object.fromEntries(e.pubkeys.map(e=>[e.id,e.entries.map(e=>e.value)]))}}function de(){return{...Z(T.value.objects||{}),...ue(E.value)}}let{showUnsavedModal:me,requestLeave:he,handleDiscard:ge,handleSave:_e,handleCancel:ve}=pe(u,d,le,async()=>xt());r({requestLeave:he,isEditing:u});function ye(e,t){let n=e instanceof Error?e.message:t;return n.includes(`404`)?`Policy API not available on the connected backend. Update/restart openHop Repeater so /api/policy, /api/policy_groups, and /api/policy_group_entries are exposed.`:n||t}let be=y(()=>E.value[G.value]??[]),xe=y(()=>be.value.find(e=>e.id===K.value)??null);h([G,be],()=>{if(!be.value.length){K.value=``;return}be.value.find(e=>e.id===K.value)||(K.value=be.value[0].id)});function Se(e){return J.value[e]?.label||e}function Ce(e){return re.find(t=>t.value===e)?.label||e}function we(e){return J.value[e]?.operators||[`equals`,`not_equals`]}function Te(e){return J.value[e]?.valueTypes||[`string`]}function Ee(e){return J.value[e]?.groupKinds||[]}function De(e){return e&&E.value[e]||[]}function Oe(e){return Ee(e).length>0}function ke(e){if(e.valueType===`boolean`)return[{label:`true`,value:`true`},{label:`false`,value:`false`}];switch(e.field){case`mode`:return[{label:`Forward`,value:`forward`},{label:`Monitor`,value:`monitor`},{label:`No TX`,value:`no_tx`}];case`route_type`:return[{label:`0 - Transport Flood`,value:`0`},{label:`1 - Flood`,value:`1`},{label:`2 - Direct`,value:`2`},{label:`3 - Transport Direct`,value:`3`}];case`path_hash_size`:return[{label:`1 byte`,value:`1`},{label:`2 bytes`,value:`2`},{label:`3 bytes`,value:`3`}];case`payload_type`:return[{label:`0 - REQ`,value:`0`},{label:`1 - RESPONSE`,value:`1`},{label:`2 - TXT_MSG`,value:`2`},{label:`3 - ACK`,value:`3`},{label:`4 - ADVERT`,value:`4`},{label:`5 - GRP_TXT`,value:`5`},{label:`6 - GRP_DATA`,value:`6`},{label:`7 - ANON_REQ`,value:`7`},{label:`8 - PATH`,value:`8`},{label:`9 - TRACE`,value:`9`},{label:`10 - MULTIPART`,value:`10`},{label:`15 - RAW_CUSTOM`,value:`15`}];default:return[]}}function Ae(e,t){t&&(e.value=t)}function je(e){return e===`path_hashes`}function Me(e){return e===`channel_hash`}function Ne(e){let t=e.trim();if(!t)throw Error(`Channel hash value is required`);let n=t.replace(/^0x/i,``);if(/^[0-9a-fA-F]+$/.test(n)){if(n.length%2!=0)throw Error(`Channel hash/secret must have an even number of hex characters.`);return n.length===32||n.length===64?`0x${n.toUpperCase()}`:n.length<=2?`0x${Number.parseInt(n,16).toString(16).toUpperCase().padStart(2,`0`)}`:`0x${n.toUpperCase()}`}let r;if(/^[0-9]+$/.test(t))r=Number.parseInt(t,10);else throw Error(`Invalid channel hash value: ${e}`);if(!Number.isFinite(r)||Number.isNaN(r)||r<0)throw Error(`Invalid channel hash value: ${e}`);if(r>255)throw Error(`Decimal channel hash must be within 0-255. Use hex secret key for full channel keys.`);return`0x${r.toString(16).toUpperCase().padStart(2,`0`)}`}function Pe(e){let t=e.trim();if(!t)throw Error(`Path hash value is required`);let n=t.replace(/^0x/i,``);if(!n)throw Error(`Path hash value is required`);if(!/^[0-9a-fA-F]+$/.test(n))throw Error(`Invalid path hash value: ${e}`);if(n.length%2!=0)throw Error(`Path hash must have an even number of hex characters: ${e}`);if(![2,4,6].includes(n.length))throw Error(`Path hash must be 1, 2, or 3 bytes: ${e}`);return`0x${n.toUpperCase()}`}function Fe(e){let t=e.split(/[\s,]+/).map(e=>e.trim()).filter(Boolean);if(!t.length)throw Error(`At least one path hash is required`);let n=t.map(Pe);if(new Set(n.map(e=>e.replace(/^0x/i,``).length)).size>1)throw Error(`Path hashes in one condition must all use the same byte length.`);return n}function Ie(e,t){return je(e)&&Array.isArray(t)?t.map(e=>Pe(String(e))).join(` `):t==null?``:typeof t==`string`?t:typeof t==`number`||typeof t==`boolean`?String(t):JSON.stringify(t)}function Le(e){let t=e.value.trim();if(je(e.field)){let n=Fe(t);if(e.op===`contains`){if(n.length!==1)throw Error(`Path Hashes with Contains expects one hash. Use Intersects for multiple hashes.`);return n[0]}return n}return Me(e.field)?Ne(t):Ve(t,e.valueType)}function Re(e){return je(e.field)?e.op===`contains`?`Single hash, e.g. 0x42, 0x0042, or 0x000042`:`One hash per line or comma-separated; all must be the same size`:Me(e.field)?`1-byte channel hash (0x11) or full channel secret key`:e.valueType===`boolean`?`true/false`:`value`}function ze(e){return je(e.field)&&e.valueSource===`literal`}function Be(e){return typeof e==`number`?`number`:typeof e==`boolean`?`boolean`:`string`}function Ve(e,t){if(t===`number`){let t=Number(e);if(!Number.isFinite(t))throw Error(`Invalid numeric value: ${e}`);return t}if(t===`boolean`){let t=e.trim().toLowerCase();if(t===`true`)return!0;if(t===`false`)return!1;throw Error(`Invalid boolean value: ${e}. Use true or false.`)}return e}function He(e){return{id:e,field:`hop_count`,op:`greater_than`,valueType:`number`,valueSource:`literal`,value:`2`}}function Ue(e){return{id:e,name:`Rule ${e}`,enabled:!0,matchMode:`all`,conditions:[He(1)],action:`drop`}}function We(){return F.value.length?Math.max(...F.value.map(e=>Number(e.id)||0))+1:1}function Ge(e){return e.conditions.length?Math.max(...e.conditions.map(e=>e.id))+1:1}function Ke(e){let t=we(e.field);t.includes(e.op)||(e.op=t[0]);let n=Te(e.field);n.includes(e.valueType)||(e.valueType=n[0]);let r=Ee(e.field);if(!r.length){e.valueSource=`literal`,e.groupKind=void 0,e.groupId=void 0;return}if(e.valueSource===`group`){(!e.groupKind||!r.includes(e.groupKind))&&(e.groupKind=r[0]),Me(e.field)&&e.op!==`in`&&(e.op=`in`);let t=De(e.groupKind);t.find(t=>t.id===e.groupId)||(e.groupId=t[0]?.id)}}function qe(e,t){let n=e.if??{},r=`all`,i=[];Array.isArray(n.any)?(r=`any`,i=n.any):Array.isArray(n.all)?(r=`all`,i=n.all):`field`in n&&(i=[n]),i.length||(i=[{field:`hop_count`,op:`greater_than`,value:2}]);let a=i.map((e,t)=>{let n=String(e.field??`hop_count`),r=String(e.op??`equals`),i=we(n),a=i.includes(r)?r:i[0],o=e.value;if(typeof o==`string`&&o.startsWith(`@`)){let[e,r]=o.slice(1).split(`.`,2),i=e===`channel_hash_groups`?`channel_hashes`:e===`pubkey_groups`?`pubkeys`:void 0,s={id:t+1,field:n,op:a,valueType:`string`,valueSource:`group`,value:r||``,groupKind:i,groupId:r};return Ke(s),s}let s=Be(o),c={id:t+1,field:n,op:a,valueType:Te(n).includes(s)?s:Te(n)[0],valueSource:`literal`,value:Ie(n,o)};return Ke(c),c}),o=e.then??{},s=String(o.action??e.action??`allow`),c=ne.some(e=>e.value===s)?s:`allow`;return{id:Number(e.id??t+1),name:String(e.name??`Rule ${t+1}`),enabled:!!(e.enabled??!0),matchMode:r,conditions:a,action:c}}function Je(e,t){let n=e.conditions.map(t=>{let n;if(t.valueSource===`group`){if(!t.groupKind||!t.groupId)throw Error(`Condition ${t.id} in ${e.name} is missing group selection`);n=`@${t.groupKind===`channel_hashes`?`channel_hash_groups`:`pubkey_groups`}.${t.groupId}`}else n=Le(t);return{field:t.field,op:t.op,value:n}});return{id:Number(e.id)||t+1,name:e.name.trim()||`Rule ${t+1}`,enabled:!!e.enabled,if:{[e.matchMode]:n},then:{action:e.action}}}function Ye(){let e=F.value.map((e,t)=>Je(e,t));N.value=JSON.stringify(e,null,2)}function Xe(){let e=JSON.parse(N.value);if(!Array.isArray(e))throw Error(`Rules must be a JSON array`);return e}function Ze(){F.value=Xe().map((e,t)=>qe(e,t))}function Qe(){return P.value?Xe():F.value.map((e,t)=>Je(e,t))}function $e(e){if(e.valueSource===`group`)return`${Se(e.field)} ${Ce(e.op)} ${e.groupKind}:${e.groupId||`unset`}`;if(je(e.field)){let t=e.value.split(/[\s,]+/).map(e=>e.trim()).filter(Boolean).length;return`${Se(e.field)} ${Ce(e.op)} ${t} hash${t===1?``:`es`}`}return`${Se(e.field)} ${Ce(e.op)} ${e.value}`}function et(e){let t=e.matchMode===`all`?` AND `:` OR `;return e.conditions.map(e=>$e(e)).join(t)}function tt(e){return e===`log_only`?`Log Only`:e.charAt(0).toUpperCase()+e.slice(1)}function nt(e){return e===`drop`?`border-accent-red/opacity-medium bg-accent-red/opacity-light text-accent-red`:e===`log_only`?`border-accent-amber/opacity-medium bg-accent-amber/opacity-light text-accent-amber`:`border-accent-green/opacity-medium bg-accent-green/opacity-light text-accent-green`}function rt(){z.value=null,B.value=Ue(We()),ee.value=null,L.value=!0}function it(e){let t=F.value[e];t&&(z.value=e,B.value=JSON.parse(JSON.stringify(t)),ee.value=null,L.value=!0)}function at(){L.value=!1,B.value=null,z.value=null,ee.value=null,V.value=!1,H.value=null,U.value=null}function ot(){if(!B.value)return;let e=He(Ge(B.value));B.value.conditions.push(e)}function st(e){B.value&&(B.value.conditions.length<=1||B.value.conditions.splice(e,1))}function ct(e,t){if(!B.value)return;let n=e+t;if(n<0||n>=B.value.conditions.length)return;let r=B.value.conditions[e];B.value.conditions[e]=B.value.conditions[n],B.value.conditions[n]=r}function lt(e,t){H.value=e,U.value=e,t.dataTransfer&&(t.dataTransfer.effectAllowed=`move`,t.dataTransfer.setData(`text/plain`,String(e)))}function ut(e,t){if(H.value===null)return;t.preventDefault(),t.dataTransfer&&(t.dataTransfer.dropEffect=`move`);let n=t.currentTarget;if(!n)return;let r=n.getBoundingClientRect();U.value=t.clientYt&&--n,n===t){H.value=null,U.value=null;return}let r=B.value.conditions.splice(t,1)[0];if(!r){H.value=null,U.value=null;return}B.value.conditions.splice(n,0,r),H.value=null,U.value=null}function ft(){H.value=null,U.value=null}function pt(e){Ke(e)}function mt(e){if(!e.conditions.some(e=>e.field===`channel_message_body`))return null;let t=e.conditions.findIndex(e=>e.field===`channel_message_body`);return t<=0?`For best results, move Channel Message Body lower in the list. Put Channel Decryptable == true or Channel Hash above it.`:e.conditions.slice(0,t).some(e=>e.field===`channel_decryptable`&&e.op===`equals`?e.value.trim().toLowerCase()===`true`:e.field===`channel_hash`)?null:`Change the order: put Channel Decryptable == true or Channel Hash before Channel Message Body.`}function ht(){if(B.value){ee.value=null;try{if(!B.value.name.trim())throw Error(`Rule name is required`);if(!B.value.conditions.length)throw Error(`At least one condition is required`);for(let e of B.value.conditions)if(Ke(e),e.valueSource===`group`){if(!e.groupKind||!e.groupId)throw Error(`Select a group for ${Se(e.field)}`)}else{if(!e.value.trim())throw Error(`Condition value is required for ${Se(e.field)}`);Le(e)}let e=JSON.parse(JSON.stringify(B.value));z.value===null?F.value.push(e):F.value.splice(z.value,1,e),Ye(),at()}catch(e){ee.value=e instanceof Error?e.message:`Failed to save rule`}}}function gt(e){F.value.splice(e,1),Ye()}function _t(e,t){let n=e+t;if(n<0||n>=F.value.length)return;let r=F.value[e];F.value[e]=F.value[n],F.value[n]=r,Ye()}function vt(e){let t={policy_engine:{enabled:!1,default_action:`allow`,rules:[],objects:{}},groups:{channel_hashes:[],pubkeys:[]}};if(!e||typeof e!=`object`)return t;let n=e,r=n.policy_engine??{},i=n.groups??{},a={channel_hashes:Array.isArray(i.channel_hashes)?i.channel_hashes:[],pubkeys:Array.isArray(i.pubkeys)?i.pubkeys:[]};return{policy_file:typeof n.policy_file==`string`?n.policy_file:void 0,exists:!!n.exists,policy_engine:{enabled:!!r.enabled,default_action:typeof r.default_action==`string`?r.default_action:`allow`,rules:Array.isArray(r.rules)?r.rules:[],objects:r.objects&&typeof r.objects==`object`?r.objects:{}},groups:a}}async function yt(){s.value=!0,m.value=null,f.value=null;try{let e=await R.getPolicyDocument();if(!e.success||!e.data)throw Error(e.error||`Failed to load policy document`);oe(vt(e.data)),se()}catch(e){m.value=ye(e,`Failed to load policy`)}finally{s.value=!1}}async function bt(){m.value=null,f.value=null,I.value=null;try{let e=Qe(),t=await R.validatePolicyDocument({policy_engine:{enabled:T.value.enabled,default_action:T.value.default_action,rules:e,objects:de()}});if(!t.success||!t.data)throw Error(t.error||`Validation failed`);if(t.data.valid){let n=t.data.effective;I.value=`Valid policy. Enabled=${n?.enabled?`yes`:`no`}, default=${n?.default_action||T.value.default_action}, rules=${n?.rule_count??e.length}`;return}throw Error(t.data.error||`Invalid policy payload`)}catch(e){m.value=ye(e,`Validation failed`)}}async function xt(){d.value=!0,m.value=null,f.value=null,I.value=null;try{let e=Qe(),t={policy_engine:{enabled:T.value.enabled,default_action:T.value.default_action,rules:e,objects:de()},groups:E.value},n=await R.updatePolicyDocument(t);if(!n.success)throw Error(n.error||`Failed to save policy`);let r=n.message||`Settings saved successfully`;return await yt(),u.value=!1,ce(r),!0}catch(e){return m.value=ye(e,`Failed to save policy`),!1}finally{d.value=!1}}function St(){m.value=null,f.value=null;let e=te.value.friendly_name.trim();if(!e){m.value=`Group friendly name is required`;return}let t=E.value[G.value],n=ae(Q(e,`${G.value}_group`),t.map(e=>e.id));t.push({id:n,friendly_name:e,description:te.value.description.trim()||void 0,entries:[]}),K.value=n,te.value={friendly_name:``,description:``},I.value=null}function Ct(e){m.value=null,f.value=null,E.value[G.value]=E.value[G.value].filter(t=>t.id!==e),I.value=null}function wt(){if(m.value=null,f.value=null,!xe.value){m.value=`Select a group first`;return}let e=q.value.friendly_name.trim(),t=q.value.value.trim();if(!e||!t){m.value=`Entry friendly name and value are required`;return}let n=ae(Q(e||t,`entry`),xe.value.entries.map(e=>e.id));xe.value.entries.push({id:n,friendly_name:e,value:t}),q.value={friendly_name:``,value:``},I.value=null}function Tt(e){if(m.value=null,f.value=null,!xe.value){m.value=`Select a group first`;return}xe.value.entries=xe.value.entries.filter(t=>t.id!==e),I.value=null}return e(yt),(e,n)=>(a(),C(x,null,[v(fe,{show:c(me),"is-saving":d.value,label:`Policy Engine settings`,onDiscard:c(ge),onSave:c(_e),onCancel:c(ve)},null,8,[`show`,`is-saving`,`onDiscard`,`onSave`,`onCancel`]),S(`div`,ap,[S(`div`,op,[n[22]||=S(`div`,null,[S(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-1 sm:mb-2`},` Policy Engine `),S(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},` Policy and object management with chained rule conditions `)],-1),S(`div`,sp,[u.value?(a(),C(x,{key:1},[S(`button`,{class:`cfg-btn-secondary`,disabled:d.value,onClick:le},` Cancel `,8,lp),S(`button`,{class:`cfg-btn-primary`,disabled:d.value,onClick:xt},l(d.value?`Saving…`:`Save Changes`),9,up)],64)):(a(),C(`button`,{key:0,class:`cfg-btn-primary`,disabled:s.value,onClick:$},` Edit Settings `,8,cp))])]),m.value?(a(),C(`div`,dp,l(m.value),1)):_(``,!0),f.value?(a(),C(`div`,fp,l(f.value),1)):_(``,!0),I.value?(a(),C(`div`,pp,l(I.value),1)):_(``,!0),s.value?(a(),C(`div`,mp,[v(W),n[23]||=S(`span`,{class:`ml-2 text-content-secondary dark:text-content-muted`},`Loading policy…`,-1)])):(a(),C(x,{key:4},[S(`div`,hp,[S(`div`,gp,[S(`button`,{class:p([`px-3 py-1.5 text-xs sm:text-sm rounded-md border transition-colors`,w.value===`policy`?`border-primary/opacity-heavy text-primary bg-primary/opacity-light`:`border-stroke-subtle dark:border-stroke/opacity-medium text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary`]),onClick:n[0]||=e=>w.value=`policy`},` Policy `,2),S(`button`,{class:p([`px-3 py-1.5 text-xs sm:text-sm rounded-md border transition-colors`,w.value===`objects`?`border-primary/opacity-heavy text-primary bg-primary/opacity-light`:`border-stroke-subtle dark:border-stroke/opacity-medium text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary`]),onClick:n[1]||=e=>w.value=`objects`},` Objects `,2)])]),w.value===`policy`?(a(),C(`div`,_p,[S(`div`,vp,[S(`div`,yp,[S(`div`,bp,[n[25]||=S(`div`,null,[S(`label`,{class:`cfg-label`},`Policy Engine Enabled`),S(`p`,{class:`mt-1 text-xs text-content-muted`},`Enable policy enforcement for incoming packets.`)],-1),S(`label`,xp,[i(S(`input`,{"onUpdate:modelValue":n[2]||=e=>T.value.enabled=e,type:`checkbox`,disabled:!u.value||d.value,class:`h-4 w-4 rounded border-stroke-subtle dark:border-stroke/opacity-medium accent-primary`},null,8,Sp),[[M,T.value.enabled]]),n[24]||=S(`span`,null,`Enable policy enforcement`,-1)])]),S(`div`,Cp,[n[26]||=S(`div`,null,[S(`label`,{class:`cfg-label`},`Default Action`),S(`p`,{class:`mt-1 text-xs text-content-muted`},`Applied when no policy rule matches.`)],-1),i(S(`select`,{"onUpdate:modelValue":n[3]||=e=>T.value.default_action=e,class:`cfg-select w-full md:max-w-sm`,disabled:!u.value||d.value},[(a(),C(x,null,t(ne,e=>S(`option`,{key:e.value,value:e.value},l(e.label),9,Tp)),64))],8,wp),[[D,T.value.default_action]])])]),S(`div`,Ep,[S(`div`,Dp,[n[27]||=S(`label`,{class:`cfg-label`},`Policy Rules`,-1),S(`div`,Op,[S(`button`,{class:`cfg-btn-secondary text-xs`,disabled:!u.value||d.value,onClick:rt},`Add Rule`,8,kp),S(`button`,{class:`cfg-btn-secondary text-xs`,disabled:d.value,onClick:n[4]||=e=>P.value=!P.value},l(P.value?`Hide JSON`:`Advanced JSON`),9,Ap)])]),S(`div`,jp,[S(`table`,Mp,[n[29]||=S(`thead`,{class:`bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle backdrop-blur`},[S(`tr`,null,[S(`th`,{class:`w-16 px-3 py-2 text-left text-[11px] font-semibold uppercase tracking-[0.18em] text-content-muted`},`Order`),S(`th`,{class:`w-14 px-3 py-2 text-left text-[11px] font-semibold uppercase tracking-[0.18em] text-content-muted`},`On`),S(`th`,{class:`w-44 px-3 py-2 text-left text-[11px] font-semibold uppercase tracking-[0.18em] text-content-muted`},`Name`),S(`th`,{class:`px-3 py-2 text-left text-[11px] font-semibold uppercase tracking-[0.18em] text-content-muted`},`Logic`),S(`th`,{class:`w-28 px-3 py-2 text-left text-[11px] font-semibold uppercase tracking-[0.18em] text-content-muted`},`Action`),S(`th`,{class:`w-48 px-3 py-2 text-right text-[11px] font-semibold uppercase tracking-[0.18em] text-content-muted`},`Controls`)])],-1),S(`tbody`,null,[(a(!0),C(x,null,t(F.value,(e,t)=>(a(),C(`tr`,{key:`${e.id}-${t}`,class:`border-t border-stroke-subtle/70 dark:border-stroke/opacity-light odd:bg-background-mute/opacity-medium dark:odd:bg-white/[0.02] hover:bg-primary/opacity-light dark:hover:bg-white/[0.04] transition-colors`},[S(`td`,Np,l(t+1),1),S(`td`,Pp,[S(`span`,{class:p([`inline-flex h-5 w-5 items-center justify-center rounded-md border text-[10px] font-semibold`,e.enabled?`border-accent-green/opacity-medium bg-accent-green/opacity-light text-accent-green`:`border-stroke-subtle/70 bg-background-mute text-content-muted dark:border-stroke/opacity-medium dark:bg-white/opacity-subtle dark:text-content-muted`]),title:e.enabled?`Enabled`:`Disabled`},l(e.enabled?`✓`:`—`),11,Fp)]),S(`td`,Ip,[S(`span`,{class:`block truncate font-medium`,title:e.name},l(e.name),9,Lp)]),S(`td`,Rp,[S(`span`,{class:`block truncate font-mono leading-5`,title:et(e)},l(et(e)),9,zp)]),S(`td`,Bp,[S(`span`,{class:p([`inline-flex items-center rounded-full border px-2.5 py-1 text-xs font-semibold uppercase tracking-wide`,nt(e.action)]),title:e.action},l(tt(e.action)),11,Vp)]),S(`td`,Hp,[S(`div`,Up,[S(`button`,{class:`cfg-btn-secondary text-xs px-2 py-1`,disabled:!u.value||d.value,onClick:e=>_t(t,-1)},`▲`,8,Wp),S(`button`,{class:`cfg-btn-secondary text-xs px-2 py-1`,disabled:!u.value||d.value,onClick:e=>_t(t,1)},`▼`,8,Gp),S(`button`,{class:`cfg-btn-secondary text-xs px-2 py-1`,disabled:!u.value||d.value,onClick:e=>it(t)},`Edit`,8,Kp),S(`button`,{class:`text-xs px-2 py-1 rounded border border-accent-red/opacity-heavy text-accent-red hover:bg-accent-red/opacity-light disabled:opacity-40`,disabled:!u.value||d.value,onClick:e=>gt(t)},`Del`,8,qp)])])]))),128)),F.value.length?_(``,!0):(a(),C(`tr`,Jp,[...n[28]||=[S(`td`,{colspan:`6`,class:`px-3 py-8 text-center text-xs text-content-muted`},`No rules yet. Add your first rule.`,-1)]]))])])]),n[31]||=S(`p`,{class:`text-xs text-content-muted`},` Rules are evaluated top to bottom. First matching rule wins. `,-1),P.value?(a(),C(`div`,Yp,[n[30]||=S(`label`,{class:`cfg-label`},`Advanced JSON Editor`,-1),i(S(`textarea`,{"onUpdate:modelValue":n[5]||=e=>N.value=e,rows:`12`,spellcheck:`false`,disabled:!u.value||d.value,class:`cfg-textarea font-mono text-xs`,placeholder:`[{"id":1,"if":{"all":[{"field":"hop_count","op":"greater_than","value":4}]},"then":{"action":"drop"}}]`},null,8,Xp),[[j,N.value]]),S(`div`,Zp,[S(`button`,{class:`cfg-btn-secondary text-xs`,disabled:!u.value||d.value,onClick:Ze},`Apply JSON To Table`,8,Qp)])])):_(``,!0)]),S(`div`,$p,[S(`button`,{class:`cfg-btn-secondary`,disabled:d.value||!u.value,onClick:bt},`Validate`,8,em)])])])):(a(),C(`div`,tm,[S(`div`,nm,[S(`div`,rm,[S(`button`,{class:p([`px-3 py-1.5 text-xs sm:text-sm rounded-md border transition-colors`,G.value===`channel_hashes`?`border-primary/opacity-heavy text-primary bg-primary/opacity-light`:`border-stroke-subtle dark:border-stroke/opacity-medium text-content-secondary dark:text-content-muted`]),onClick:n[6]||=e=>G.value=`channel_hashes`},` Channel Hash Groups `,2),S(`button`,{class:p([`px-3 py-1.5 text-xs sm:text-sm rounded-md border transition-colors`,G.value===`pubkeys`?`border-primary/opacity-heavy text-primary bg-primary/opacity-light`:`border-stroke-subtle dark:border-stroke/opacity-medium text-content-secondary dark:text-content-muted`]),onClick:n[7]||=e=>G.value=`pubkeys`},` Pubkey Groups `,2)])]),S(`div`,im,[S(`div`,am,[S(`div`,om,[n[32]||=S(`h4`,{class:`text-sm font-semibold text-content-primary`},`Groups`,-1),S(`span`,sm,l(be.value.length)+` total`,1)]),S(`div`,cm,[(a(!0),C(x,null,t(be.value,e=>(a(),C(`button`,{key:e.id,class:p([`w-full text-left rounded-lg border p-3 transition-colors`,K.value===e.id?`border-primary/opacity-heavy bg-primary/opacity-light`:`border-stroke-subtle dark:border-stroke/opacity-medium bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light`]),onClick:t=>K.value=e.id},[S(`div`,um,[S(`div`,null,[S(`p`,dm,l(e.friendly_name),1),S(`p`,fm,l(e.id),1)]),S(`span`,pm,l(e.entries.length),1)])],10,lm))),128)),be.value.length?_(``,!0):(a(),C(`div`,mm,` No groups yet `))]),S(`div`,hm,[n[33]||=S(`h5`,{class:`text-xs font-semibold uppercase tracking-wide text-content-muted`},`Create Group`,-1),i(S(`input`,{"onUpdate:modelValue":n[8]||=e=>te.value.friendly_name=e,class:`cfg-input`,disabled:!u.value||d.value,placeholder:`Friendly name`},null,8,gm),[[j,te.value.friendly_name]]),i(S(`input`,{"onUpdate:modelValue":n[9]||=e=>te.value.description=e,class:`cfg-input`,disabled:!u.value||d.value,placeholder:`Description (optional)`},null,8,_m),[[j,te.value.description]]),S(`button`,{class:`cfg-btn-primary w-full`,disabled:!u.value||d.value,onClick:St},`Add Group`,8,vm)])]),S(`div`,ym,[S(`div`,bm,[S(`h4`,xm,l(xe.value?xe.value.friendly_name:`Entries`),1),xe.value?(a(),C(`button`,{key:0,class:`text-xs px-2.5 py-1 rounded border border-accent-red/opacity-heavy text-accent-red hover:bg-accent-red/opacity-light`,disabled:!u.value||d.value,onClick:n[10]||=e=>Ct(xe.value.id)},` Delete Group `,8,Sm)):_(``,!0)]),xe.value?(a(),C(`div`,Cm,[S(`table`,wm,[n[35]||=S(`thead`,{class:`bg-background-mute dark:bg-white/opacity-subtle`},[S(`tr`,null,[S(`th`,{class:`text-left px-3 py-2 text-xs font-semibold uppercase tracking-wide text-content-muted`},`Name`),S(`th`,{class:`text-left px-3 py-2 text-xs font-semibold uppercase tracking-wide text-content-muted`},`Value`),S(`th`,{class:`text-right px-3 py-2 text-xs font-semibold uppercase tracking-wide text-content-muted`},`Actions`)])],-1),S(`tbody`,null,[(a(!0),C(x,null,t(xe.value.entries,e=>(a(),C(`tr`,{key:e.id,class:`border-t border-stroke-subtle dark:border-stroke/opacity-light`},[S(`td`,Tm,l(e.friendly_name),1),S(`td`,Em,l(e.value),1),S(`td`,Dm,[S(`button`,{class:`text-xs px-2.5 py-1 rounded border border-accent-red/opacity-heavy text-accent-red hover:bg-accent-red/opacity-light`,disabled:!u.value||d.value,onClick:t=>Tt(e.id)},` Remove `,8,Om)])]))),128)),xe.value.entries.length?_(``,!0):(a(),C(`tr`,km,[...n[34]||=[S(`td`,{colspan:`3`,class:`px-3 py-8 text-center text-xs text-content-muted`},`No entries in this group`,-1)]]))])])])):(a(),C(`div`,Am,` Select a group to manage entries `)),xe.value?(a(),C(`div`,jm,[n[36]||=S(`h5`,{class:`text-xs font-semibold uppercase tracking-wide text-content-muted`},`Add Entry`,-1),S(`div`,Mm,[i(S(`input`,{"onUpdate:modelValue":n[11]||=e=>q.value.friendly_name=e,class:`cfg-input`,disabled:!u.value||d.value,placeholder:`Friendly name`},null,8,Nm),[[j,q.value.friendly_name]]),i(S(`input`,{"onUpdate:modelValue":n[12]||=e=>q.value.value=e,class:`cfg-input font-mono`,disabled:!u.value||d.value,placeholder:G.value===`channel_hashes`?`0x...`:`0xaabbccdd`},null,8,Pm),[[j,q.value.value]])]),S(`button`,{class:`cfg-btn-primary`,disabled:!u.value||d.value,onClick:wt},`Add Entry`,8,Fm)])):_(``,!0)])])]))],64)),L.value&&B.value?(a(),C(`div`,{key:5,class:`modal-backdrop`,onClick:A(at,[`self`])},[S(`div`,Im,[S(`div`,Lm,[S(`div`,null,[S(`h3`,Rm,l(z.value===null?`Add Policy Rule`:`Edit Policy Rule`),1),S(`p`,zm,` Choose match logic, then add one or more conditions. `+l(B.value.matchMode===`all`?`ALL`:`ANY`)+` conditions must match. `,1)]),S(`div`,Bm,[S(`button`,{class:p([`w-7 h-7 rounded-full border border-stroke-subtle dark:border-stroke/opacity-medium text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary hover:bg-background-mute dark:hover:bg-white/opacity-light text-sm font-semibold`,V.value?`bg-primary/opacity-light text-primary border-primary/opacity-heavy`:``]),title:`Match Field Logic Matrix`,onClick:n[13]||=e=>V.value=!V.value},` i `,2),S(`button`,{class:`cfg-btn-secondary text-xs`,onClick:at},`Close`)])]),V.value?(a(),C(`div`,Vm,[S(`div`,Hm,[n[37]||=S(`h4`,{class:`text-sm font-semibold text-content-primary`},`Match Field Logic Matrix`,-1),S(`button`,{class:`cfg-btn-secondary text-xs`,onClick:n[14]||=e=>V.value=!1},`Hide`)]),S(`div`,Um,[S(`table`,Wm,[n[38]||=S(`thead`,{class:`bg-background-mute dark:bg-white/opacity-subtle`},[S(`tr`,null,[S(`th`,{class:`px-2 py-2 text-left font-semibold uppercase tracking-wide text-content-muted`},`Field`),S(`th`,{class:`px-2 py-2 text-left font-semibold uppercase tracking-wide text-content-muted`},`Value Types`),S(`th`,{class:`px-2 py-2 text-left font-semibold uppercase tracking-wide text-content-muted`},`Operators`),S(`th`,{class:`px-2 py-2 text-left font-semibold uppercase tracking-wide text-content-muted`},`Group Sources`)])],-1),S(`tbody`,null,[(a(),C(x,null,t(ie,e=>S(`tr`,{key:e.value,class:`border-t border-stroke-subtle dark:border-stroke/opacity-light`},[S(`td`,Gm,l(e.label),1),S(`td`,Km,l(e.valueTypes.join(`, `)),1),S(`td`,qm,l(e.operators.map(Ce).join(`, `)),1),S(`td`,Jm,l(e.groupKinds?.join(`, `)||`None`),1)])),64))])])])])):_(``,!0),ee.value?(a(),C(`div`,Ym,l(ee.value),1)):_(``,!0),S(`div`,Xm,[S(`div`,Zm,[n[39]||=S(`label`,{class:`cfg-label`},`Rule Name`,-1),i(S(`input`,{"onUpdate:modelValue":n[15]||=e=>B.value.name=e,class:`cfg-input mt-1`,placeholder:`Block noisy channel route`},null,512),[[j,B.value.name]])]),S(`div`,null,[n[41]||=S(`label`,{class:`cfg-label`},`Match Logic`,-1),i(S(`select`,{"onUpdate:modelValue":n[16]||=e=>B.value.matchMode=e,class:`cfg-select mt-1`},[...n[40]||=[S(`option`,{value:`all`},`ALL conditions (AND)`,-1),S(`option`,{value:`any`},`ANY condition (OR)`,-1)]],512),[[D,B.value.matchMode]])]),S(`div`,null,[n[42]||=S(`label`,{class:`cfg-label`},`Action`,-1),i(S(`select`,{"onUpdate:modelValue":n[17]||=e=>B.value.action=e,class:`cfg-select mt-1`},[(a(),C(x,null,t(ne,e=>S(`option`,{key:e.value,value:e.value},l(e.label),9,Qm)),64))],512),[[D,B.value.action]])])]),S(`label`,$m,[i(S(`input`,{"onUpdate:modelValue":n[18]||=e=>B.value.enabled=e,type:`checkbox`},null,512),[[M,B.value.enabled]]),n[43]||=b(` Rule enabled `,-1)]),S(`div`,eh,[S(`div`,{class:`flex items-center justify-between`},[n[44]||=S(`h4`,{class:`text-sm font-semibold text-content-primary`},`Conditions`,-1),S(`button`,{class:`cfg-btn-secondary text-xs`,onClick:ot},`Add Condition`)]),mt(B.value)?(a(),C(`div`,th,l(mt(B.value)),1)):_(``,!0),S(`div`,nh,[S(`table`,rh,[S(`thead`,ih,[S(`tr`,null,[n[45]||=S(`th`,{class:`px-2 py-2 text-left text-xs font-semibold uppercase tracking-wide text-content-muted`},`Drag`,-1),n[46]||=S(`th`,{class:`px-2 py-2 text-left text-xs font-semibold uppercase tracking-wide text-content-muted`},`Field`,-1),n[47]||=S(`th`,{class:`px-2 py-2 text-left text-xs font-semibold uppercase tracking-wide text-content-muted`},`Operator`,-1),Y.value?(a(),C(`th`,ah,`Source`)):_(``,!0),n[48]||=S(`th`,{class:`px-2 py-2 text-left text-xs font-semibold uppercase tracking-wide text-content-muted`},`Value`,-1),n[49]||=S(`th`,{class:`px-2 py-2 text-left text-xs font-semibold uppercase tracking-wide text-content-muted`},`Type`,-1),n[50]||=S(`th`,{class:`px-2 py-2 text-right text-xs font-semibold uppercase tracking-wide text-content-muted`},`Action`,-1)])]),S(`tbody`,null,[(a(!0),C(x,null,t(B.value.conditions,(e,r)=>(a(),C(`tr`,{key:e.id,class:p([`border-t border-stroke-subtle dark:border-stroke/opacity-light transition-colors`,{"opacity-60":H.value===r,"!border-t-2 !border-primary":U.value===r&&H.value!==null}]),onDragover:e=>ut(r,e),onDrop:n[19]||=e=>dt(e)},[S(`td`,sh,[S(`button`,{type:`button`,draggable:`true`,class:`h-8 w-8 inline-flex items-center justify-center rounded border border-stroke-subtle dark:border-stroke/opacity-medium text-content-secondary dark:text-content-muted hover:bg-background-mute dark:hover:bg-white/opacity-light cursor-grab active:cursor-grabbing`,title:`Drag to reorder`,onDragstart:e=>lt(r,e),onDragend:ft},` ☰ `,40,ch)]),S(`td`,lh,[i(S(`select`,{"onUpdate:modelValue":t=>e.field=t,class:`cfg-select h-8 text-xs`,onChange:t=>pt(e)},[(a(),C(x,null,t(ie,e=>S(`option`,{key:e.value,value:e.value},l(e.label),9,dh)),64))],40,uh),[[D,e.field]])]),S(`td`,fh,[i(S(`select`,{"onUpdate:modelValue":t=>e.op=t,class:`cfg-select h-8 text-xs`},[(a(!0),C(x,null,t(we(e.field),e=>(a(),C(`option`,{key:e,value:e},l(Ce(e)),9,mh))),128))],8,ph),[[D,e.op]])]),Y.value?(a(),C(`td`,hh,[i(S(`select`,{"onUpdate:modelValue":t=>e.valueSource=t,class:`cfg-select h-8 text-xs`,disabled:!Oe(e.field)},[n[51]||=S(`option`,{value:`literal`},`Literal`,-1),Oe(e.field)?(a(),C(`option`,_h,`Group`)):_(``,!0)],8,gh),[[D,e.valueSource]])])):_(``,!0),S(`td`,vh,[Y.value&&e.valueSource===`group`&&Oe(e.field)?(a(),C(`div`,yh,[i(S(`select`,{"onUpdate:modelValue":t=>e.groupKind=t,class:`cfg-select h-8 text-xs`},[(a(!0),C(x,null,t(Ee(e.field),e=>(a(),C(`option`,{key:e,value:e},l(e),9,xh))),128))],8,bh),[[D,e.groupKind]]),i(S(`select`,{"onUpdate:modelValue":t=>e.groupId=t,class:`cfg-select h-8 text-xs`},[(a(!0),C(x,null,t(De(e.groupKind),e=>(a(),C(`option`,{key:e.id,value:e.id},l(e.friendly_name),9,Ch))),128))],8,Sh),[[D,e.groupId]])])):(a(),C(`div`,wh,[ke(e).length?(a(),C(`select`,{key:0,class:`cfg-select h-8 text-xs`,onChange:t=>Ae(e,String(t.target.value))},[n[52]||=S(`option`,{value:``},`Lookup value...`,-1),(a(!0),C(x,null,t(ke(e),t=>(a(),C(`option`,{key:`${e.id}-${t.value}`,value:t.value},l(t.label),9,Eh))),128))],40,Th)):_(``,!0),ze(e)?i((a(),C(`textarea`,{key:1,"onUpdate:modelValue":t=>e.value=t,class:`cfg-input min-h-[72px] text-xs font-mono py-2`,placeholder:Re(e)},null,8,Dh)),[[j,e.value]]):i((a(),C(`input`,{key:2,"onUpdate:modelValue":t=>e.value=t,class:`cfg-input h-8 text-xs font-mono`,placeholder:Re(e)},null,8,Oh)),[[j,e.value]]),je(e.field)?(a(),C(`p`,kh," Use hex only. All hashes in one condition must be the same width: 1 byte (`0x42`), 2 bytes (`0x0042`), or 3 bytes (`0x000042`). ")):_(``,!0)]))]),S(`td`,Ah,[i(S(`select`,{"onUpdate:modelValue":t=>e.valueType=t,class:`cfg-select h-8 text-xs`,disabled:Y.value&&e.valueSource===`group`},[(a(!0),C(x,null,t(Te(e.field),e=>(a(),C(`option`,{key:e,value:e},l(e),9,Mh))),128))],8,jh),[[D,e.valueType]])]),S(`td`,Nh,[S(`div`,Ph,[S(`button`,{class:`text-xs px-2 py-1 rounded border border-stroke-subtle dark:border-stroke/opacity-medium text-content-secondary dark:text-content-muted hover:bg-background-mute dark:hover:bg-white/opacity-light disabled:opacity-40`,disabled:r===0,title:`Move condition up`,"aria-label":`Move condition up`,onClick:e=>ct(r,-1)},` ▲ `,8,Fh),S(`button`,{class:`text-xs px-2 py-1 rounded border border-stroke-subtle dark:border-stroke/opacity-medium text-content-secondary dark:text-content-muted hover:bg-background-mute dark:hover:bg-white/opacity-light disabled:opacity-40`,disabled:r===B.value.conditions.length-1,title:`Move condition down`,"aria-label":`Move condition down`,onClick:e=>ct(r,1)},` ▼ `,8,Ih),S(`button`,{class:`text-xs px-2 py-1 rounded border border-accent-red/opacity-heavy text-accent-red hover:bg-accent-red/opacity-light`,onClick:e=>st(r)},`Del`,8,Lh)])])],42,oh))),128)),H.value!==null&&U.value===B.value.conditions.length?(a(),C(`tr`,{key:0,class:`border-t-2 border-primary`,onDragover:n[20]||=A(()=>{},[`prevent`]),onDrop:n[21]||=e=>dt(e)},[S(`td`,{colspan:X.value,class:`px-2 py-0`},[...n[53]||=[S(`div`,{class:`h-0`},null,-1)]],8,Rh)],32)):_(``,!0)])])])]),S(`div`,{class:`flex justify-end gap-2`},[S(`button`,{class:`cfg-btn-secondary`,onClick:at},`Cancel`),S(`button`,{class:`cfg-btn-primary`,onClick:ht},`Save Rule`)])])])):_(``,!0)])],64))}}),Bh={class:`p-3 sm:p-6 space-y-4 sm:space-y-6`},Vh={class:`flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3`},Hh={class:`glass-card rounded-[15px] p-3 sm:p-6 mt-4 sm:mt-6`},Uh={key:0,class:`flex items-center justify-center py-12`},Wh={class:`text-center`},Gh={key:1,class:`flex items-center justify-center py-12`},Kh={class:`text-center`},qh={class:`text-content-secondary dark:text-content-muted text-sm mb-4`},Jh={key:2,class:`min-h-[400px]`},Yh=`radio`,Xh=f({name:`ConfigurationView`,__name:`Configuration`,setup(t){let n=F(),i=ee(),s=V(),d=o(q(`configuration_activeTab`,Yh)),f=o(!1),p=o(null),m=o(null),y=o(null),b=o(null),x=o(null),w=o(null),T=o(null),E=o(null),D={radio:p,"radio-hardware":m,repeater:y,advert:b,duty:x,delays:w,transport:T,observer:E};function O(){let e=D[d.value]?.value;if(!e)return!1;let t=e.isEditing;return typeof t==`boolean`?t:t.value}function k(e){let t=D[d.value]?.value;t?t.requestLeave(e):e()}let A=new Set([`radio`,`radio-hardware`,`repeater`,`duty`,`delays`,`advert`,`transport`,`api-tokens`,`web`,`observer`,`policy-engine`,`backup`,`database`,`memory`]);function j(e){return e&&A.has(e)?e:q(`configuration_activeTab`,Yh)}return d.value=j(n.query.tab),h(d,e=>G(`configuration_activeTab`,e)),I((e,t,n)=>{let r=j(e.query.tab);if(r===d.value){n();return}if(O()){k(()=>{d.value=r,n()});return}d.value=r,n()}),e(async()=>{if(i.stats)f.value=!0;else try{await s.ensure(`stats`)}catch(e){console.error(`Failed to load configuration data:`,e)}finally{f.value=!0}}),(e,t)=>{let n=g(`router-link`);return a(),C(`div`,Bh,[S(`div`,Vh,[t[2]||=S(`div`,null,[S(`h1`,{class:`text-xl sm:text-2xl font-bold text-content-primary`},` Configuration `),S(`p`,{class:`text-content-secondary dark:text-content-muted mt-1 sm:mt-2 text-sm sm:text-base`},` System configuration and settings `)],-1),f.value&&!(c(i).stats?.config?.radio)?.cad?.peak_threshold?(a(),u(n,{key:0,to:`/cad-calibration`,class:`flex-shrink-0 flex items-center gap-4 px-5 py-3 min-w-[280px] rounded-xl border border-primary/opacity-medium bg-primary/opacity-light text-primary hover:bg-primary/opacity-medium transition-colors`},{default:r(()=>[...t[1]||=[S(`svg`,{class:`w-5 h-5 flex-shrink-0`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[S(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M13 10V3L4 14h7v7l9-11h-7z`})],-1),S(`div`,null,[S(`div`,{class:`text-sm font-semibold`},`CAD Calibration Available`),S(`div`,{class:`text-xs text-primary/opacity-heavy`},`Optimise CAD settings →`)],-1)]]),_:1})):_(``,!0)]),S(`div`,Hh,[!f.value&&c(i).isLoading?(a(),C(`div`,Uh,[S(`div`,Wh,[v(W,{class:`mx-auto mb-4`}),t[3]||=S(`div`,{class:`text-content-secondary dark:text-content-muted`},`Loading configuration...`,-1)])])):f.value&&!c(i).stats?(a(),C(`div`,Gh,[S(`div`,Kh,[t[4]||=S(`div`,{class:`text-accent-red mb-2`},`Failed to load configuration`,-1),S(`div`,qh,l(c(i).error),1),S(`button`,{onClick:t[0]||=e=>c(i).fetchStats(),class:`btn-primary`},`Retry`)])])):(a(),C(`div`,Jh,[d.value===`radio`?(a(),u(ct,{ref_key:`radioRef`,ref:p,key:`radio-settings`},null,512)):_(``,!0),d.value===`radio-hardware`?(a(),u(Vn,{ref_key:`radioHardwareRef`,ref:m,key:`radio-hardware-settings`},null,512)):_(``,!0),d.value===`repeater`?(a(),u(Vr,{ref_key:`repeaterRef`,ref:y,key:`repeater-settings`},null,512)):_(``,!0),d.value===`advert`?(a(),u(Fc,{ref_key:`advertRef`,ref:b,key:`advert-settings`},null,512)):_(``,!0),d.value===`duty`?(a(),u(ti,{ref_key:`dutyRef`,ref:x,key:`duty-cycle`},null,512)):_(``,!0),d.value===`delays`?(a(),u(mi,{ref_key:`delaysRef`,ref:w,key:`transmission-delays`},null,512)):_(``,!0),d.value===`transport`?(a(),u(yo,{ref_key:`transportRef`,ref:T,key:`transport-keys`},null,512)):_(``,!0),d.value===`api-tokens`?(a(),u(Xo,{key:`api-tokens`})):_(``,!0),d.value===`web`?(a(),u(Cs,{key:`web-settings`})):_(``,!0),d.value===`observer`?(a(),u(iu,{ref_key:`letsMeshRef`,ref:E,key:`letsmesh-settings`},null,512)):_(``,!0),d.value===`policy-engine`?(a(),u(zh,{key:`policy-engine`})):_(``,!0),d.value===`backup`?(a(),u(ud,{key:`backup-restore`})):_(``,!0),d.value===`database`?(a(),u(ff,{key:`database-management`})):_(``,!0),d.value===`memory`?(a(),u(ip,{key:`memory-debug`})):_(``,!0)]))])])}}});export{Xh as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/Dashboard-BdHklAFz.js b/repeater/web/html/assets/Dashboard-DhSJn9HX.js similarity index 99% rename from repeater/web/html/assets/Dashboard-BdHklAFz.js rename to repeater/web/html/assets/Dashboard-DhSJn9HX.js index aab27c3..a55fadc 100644 --- a/repeater/web/html/assets/Dashboard-BdHklAFz.js +++ b/repeater/web/html/assets/Dashboard-DhSJn9HX.js @@ -1 +1 @@ -import{C as e,D as t,N as n,P as r,T as i,U as a,X as o,_t as s,c,f as l,gt as u,h as d,ht as f,j as p,l as m,m as h,o as g,p as _,r as v,s as y,u as b,x,y as S,z as C}from"./runtime-core.esm-bundler-CINEgm0a.js";import{a as w,l as T}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as ee}from"./packets-DqaKkuHX.js";import{t as E}from"./system-CGj1WgG8.js";import{t as D}from"./dataService-CodM3OZh.js";import{t as O}from"./Spinner-CMJUE3iy.js";import{t as k}from"./websocket-CWIil-yT.js";import{c as A,d as j,s as te,t as M}from"./index-Cl4Dij8v.js";import{d as N,f as P,g as F,l as ne,n as I,o as re,s as ie,t as ae,u as oe}from"./ChartCard-DSqBTrdz.js";import{n as se,t as ce}from"./SignalBars-Ca14Gu_3.js";import{t as le}from"./PacketDetailsModal-CeDGHosS.js";var ue={class:`sparkline-card`},de={class:`card-header`},L={class:`card-title`},R={class:`card-values`},z={class:`card-chart`},B=j(d({name:`ChartSparkline`,__name:`ChartSparkline`,props:{title:{},value:{},color:{},data:{default:()=>[]},showChart:{type:Boolean,default:!0},secondaryValue:{default:void 0},secondaryLabel:{default:``},secondaryColor:{default:``},secondaryData:{default:()=>[]}},setup(t){ie.register(re,N,P,oe,ne,F);let n=t,r=a(null),o=a(null),c=e=>{let t=e.trim();if(typeof window>`u`)return t;let n=t;for(let e=0;e<4&&n.startsWith(`var(`);e++){let e=n.match(/^var\(\s*(--[\w-]+)\s*(?:,\s*([^\)]+))?\s*\)$/);if(!e)break;let[,t,r]=e;n=window.getComputedStyle(document.documentElement).getPropertyValue(t).trim()||(r?.trim()??n)}return n},l=e=>{if(e.length<3)return e;let t=Math.min(15,Math.max(3,Math.floor(e.length*.2))),n=[];for(let r=0;re+t,0)/s.length)}let r=Math.min(12,n.length),i=n.length/r,a=[];for(let e=0;e!n.data||n.data.length===0?[]:l(n.data)),f=g(()=>!n.secondaryData||n.secondaryData.length===0?[]:l(n.secondaryData)),h=()=>{if(!r.value)return;let e=r.value.getContext(`2d`);if(!e)return;o.value&&=(o.value.destroy(),null);let t=d.value;if(t.length<2)return;let i=[{data:t,borderColor:c(n.color),borderWidth:2.5,fill:!1,tension:.4,pointRadius:0,pointHoverRadius:0}],a=f.value;a.length>=2&&n.secondaryColor&&i.push({data:a,borderColor:c(n.secondaryColor),borderWidth:2,borderDash:[4,3],fill:!1,tension:.4,pointRadius:0,pointHoverRadius:0}),o.value=C(new ie(e,{type:`line`,data:{labels:t.map((e,t)=>t.toString()),datasets:i},options:{responsive:!0,maintainAspectRatio:!1,animation:{duration:800,easing:`easeOutQuart`},plugins:{legend:{display:!1},tooltip:{enabled:!1}},scales:{x:{display:!1,grid:{display:!1}},y:{display:!1,grid:{display:!1},grace:`10%`}},elements:{line:{capBezierPoints:!0}}}}))},_=()=>{if(!o.value){h();return}let e=d.value;if(e.length<2)return;o.value.data.labels=e.map((e,t)=>t.toString()),o.value.data.datasets[0].data=e;let t=f.value;t.length>=2&&n.secondaryColor&&(o.value.data.datasets.length<2?o.value.data.datasets.push({data:t,borderColor:c(n.secondaryColor),borderWidth:2,borderDash:[4,3],fill:!1,tension:.4,pointRadius:0,pointHoverRadius:0}):o.value.data.datasets[1].data=t),o.value.update(`default`)};return p(()=>n.data,()=>{S(()=>_())},{deep:!0}),p(()=>n.color,()=>{o.value&&(o.value.data.datasets[0].borderColor=c(n.color),o.value.update(`none`))}),p(()=>n.secondaryColor,()=>{o.value&&o.value.data.datasets.length>1&&(o.value.data.datasets[1].borderColor=c(n.secondaryColor),o.value.update(`none`))}),e(()=>{S(()=>h())}),x(()=>{o.value&&=(o.value.destroy(),null)}),(e,n)=>(i(),b(`div`,ue,[y(`div`,de,[y(`p`,L,s(t.title),1),y(`div`,R,[y(`span`,{class:`card-value`,style:u({color:t.color})},s(typeof t.value==`number`?t.value.toLocaleString():t.value),5),t.secondaryValue===void 0?m(``,!0):(i(),b(`span`,{key:0,class:`card-secondary-value`,style:u({color:t.secondaryColor})},s(t.secondaryLabel)+s(typeof t.secondaryValue==`number`?t.secondaryValue.toLocaleString():t.secondaryValue),5))])]),y(`div`,z,[t.showChart?(i(),b(`canvas`,{key:0,ref_key:`canvasRef`,ref:r},null,512)):m(``,!0)])]))}}),[[`__scopeId`,`data-v-9b0980f5`]]),fe={class:`grid grid-cols-2 md:grid-cols-3 lg:grid-cols-7 gap-3 lg:gap-4 mb-5 stats-cards-container`},pe=j(d({name:`StatsCards`,__name:`StatsCards`,setup(t){let n={uptime:`var(--color-primary)`,rx:`var(--color-primary)`,forward:`var(--color-secondary)`,dropped:`var(--color-accent-red)`,policy:`var(--color-accent-cyan)`,crcErrors:`var(--color-accent-red)`,hashCache:`var(--color-secondary)`},r=ee(),a=E(),o=D(),s=e=>{let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}d ${n}h`:n>0?`${n}h ${r}m`:`${r}m`},c=g(()=>{let e=r.packetStats,t=a.stats?.uptime_seconds||0,n=e?.total_packets||0,i=e?.dropped_packets||0,o=e?.drop_reasons?.reduce((e,t)=>typeof t?.reason==`string`&&t.reason.startsWith(`Policy blocked packet`)?e+(t.count||0):e,0)||0;return{packetsReceived:n,packetsForwarded:e?.transmitted_packets||0,uptimeFormatted:s(t),droppedPackets:i,policyEvents:o,crcErrorCount:r.crcErrorCount,hashCacheSize:r.systemStats?.duplicate_cache_size??0}}),l=g(()=>r.sparklineData);return e(()=>{o.ensure(`sparklines`)}),(e,t)=>(i(),b(`div`,fe,[h(B,{title:`Up Time`,value:c.value.uptimeFormatted,color:n.uptime,data:[],showChart:!1,class:`stat-card`},null,8,[`value`,`color`]),h(B,{title:`RX Packets`,value:c.value.packetsReceived,color:n.rx,data:l.value.totalPackets,class:`stat-card`},null,8,[`value`,`color`,`data`]),h(B,{title:`Forward`,value:c.value.packetsForwarded,color:n.forward,data:l.value.transmittedPackets,class:`stat-card`},null,8,[`value`,`color`,`data`]),h(B,{title:`Dropped`,value:c.value.droppedPackets,color:n.dropped,data:l.value.droppedPackets,class:`stat-card`},null,8,[`value`,`color`,`data`]),h(B,{title:`Policy Events`,value:c.value.policyEvents,color:n.policy,data:l.value.policyEvents,class:`stat-card`},null,8,[`value`,`color`,`data`]),h(B,{title:`CRC Errors`,value:c.value.crcErrorCount,color:n.crcErrors,data:l.value.crcErrors,class:`stat-card`},null,8,[`value`,`color`,`data`]),h(B,{title:`Hash Cache`,value:c.value.hashCacheSize,color:n.hashCache,showChart:!1,class:`stat-card`},null,8,[`value`,`color`])]))}}),[[`__scopeId`,`data-v-c0acbf34`]]),V={class:`glass-card rounded-[10px] p-4 lg:p-6`},H={key:0,class:`absolute inset-0 flex items-center justify-center`},U={key:1,class:`h-full flex flex-col`},me={key:0,class:`absolute top-2 left-1/2 -translate-x-1/2 bg-surface dark:bg-surface-elevated border border-stroke-subtle dark:border-stroke rounded-lg px-3 py-2 z-10 pointer-events-none min-w-48`},W={class:`text-content-primary text-sm font-medium mb-1`},he={class:`text-content-primary`},ge={class:`flex-1 flex items-end justify-evenly gap-4 px-4`},_e=[`onMouseenter`],ve={class:`text-content-primary text-xs sm:text-sm font-semibold text-center w-full pb-1`},G={class:`text-content-secondary dark:text-content-muted text-xs mt-2 text-center`},ye={key:0,class:`mt-4 flex flex-wrap justify-center gap-3 sm:gap-4 px-2 sm:px-4 text-[10px] sm:text-xs text-content-secondary dark:text-content-muted`},be={class:`truncate text-left`},xe={key:1,class:`mt-3 text-xs text-content-secondary dark:text-content-muted text-center`},K=j(d({name:`PacketTypesChart`,__name:`PacketTypesChart`,setup(r){let o=(e,t)=>typeof window>`u`?t:window.getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t,c=a([]),l=ee(),d=k(),f=a(!0),_=a(!1),x=a(null),S=a(`Connecting...`),C=a(null),w=[{name:`Payload`,types:[`Plain Text Message`,`Group Text Message`,`Group Datagram`,`Multi-part Packet`],subColors:[o(`--color-primary`,`deepskyblue`),o(`--openhop-blue-light`,`lightskyblue`),o(`--color-badge-cyan-text`,`dodgerblue`),o(`--color-badge-cyan-bg`,`lightblue`)]},{name:`Requests`,types:[`Request`,`Response`,`Anonymous Request`],subColors:[o(`--color-accent-green`,`limegreen`),o(`--color-accent-green-bg`,`lightgreen`),o(`--color-glass-green-border`,`mediumseagreen`)]},{name:`Control`,types:[`Node Advertisement`,`Acknowledgment`,`Returned Path`],subColors:[o(`--color-accent-cyan`,`cyan`),o(`--color-accent-cyan-bg`,`paleturquoise`),o(`--color-primary-bg`,`khaki`)]},{name:`Routing`,types:[`Trace`],subColors:[o(`--color-secondary`,`violet`)]},{name:`Reserved`,types:[`Reserved Type 11`,`Reserved Type 12`,`Reserved Type 13`],subColors:[o(`--color-text-muted`,`gray`),o(`--color-border-hover`,`darkgray`),o(`--color-border`,`silver`)]}],T=g(()=>w.map(e=>{let t=c.value.filter(t=>e.types.some(e=>t.name.includes(e)||t.name===e)).sort((e,t)=>t.count-e.count).map((t,n)=>({...t,color:e.subColors[n%e.subColors.length]}));return{name:e.name,color:e.subColors[0],items:t,total:t.reduce((e,t)=>e+t.count,0)}}).filter(e=>e.total>0)),E=g(()=>Math.max(...T.value.map(e=>e.total),1)),D=g(()=>T.value.reduce((e,t)=>e+t.total,0)),O=async()=>{S.value=`Connecting...`,x.value=null,f.value||(_.value=!0);try{let e=await I(`/packet_type_graph_data`,void 0,{onPhaseChange:e=>{S.value=e===`receiving`?`Receiving data...`:`Connecting...`}});if(e?.success&&e?.data){let t=e.data;if(t?.series){let e=[];t.series.forEach((t,n)=>{let r=0;t.data&&Array.isArray(t.data)&&(r=t.data.reduce((e,t)=>e+(t[1]||0),0)),r>0&&e.push({name:t.name||`Type ${t.type}`,type:t.type,count:r,color:``})}),c.value=e,f.value=!1,_.value=!1}else x.value=`No series data in server response`,f.value=!1,_.value=!1}else x.value=`Invalid response from server`,f.value=!1,_.value=!1}catch(e){x.value=e instanceof Error?e.message:`Failed to load data`,f.value=!1,_.value=!1}},A={0:`Request`,1:`Response`,2:`Plain Text Message`,3:`Acknowledgment`,4:`Node Advertisement`,5:`Group Text Message`,6:`Group Datagram`,7:`Anonymous Request`,8:`Returned Path`,9:`Trace`,10:`Multi-part Packet`,15:`Custom Packet`},j=()=>{let e=l.packetTypeBreakdown;!e||e.length===0||(c.value=e.map(e=>({name:A[Number(e.type)]||`Type ${e.type}`,type:e.type,count:e.count,color:``})),f.value=!1,x.value=null)},te=e=>Math.max(e/E.value*90,2),N=(e,t)=>t===0?0:e/t*100;return e(()=>{O()}),p(()=>l.packetTypeBreakdown,()=>j(),{deep:!0,immediate:!0}),M(O,{intervalMs:3e4,enabled:()=>!d.isConnected,immediate:!0}),(e,r)=>(i(),b(`div`,V,[r[2]||=y(`div`,{class:`flex items-baseline justify-between mb-3 lg:mb-4`},[y(`h3`,{class:`text-content-primary text-lg lg:text-xl font-semibold`},` Packet Types `),y(`p`,{class:`text-content-secondary dark:text-content-muted text-xs lg:text-sm uppercase`},` Distribution by Type `)],-1),h(ae,{class:`h-48 lg:h-56`,"is-loading":f.value,"is-updating":_.value,error:x.value,status:S.value,onRetry:O},{default:n(()=>[T.value.length===0&&!f.value&&!x.value?(i(),b(`div`,H,[...r[1]||=[y(`div`,{class:`text-content-secondary dark:text-content-primary text-sm lg:text-base`},` No packet data available `,-1)]])):m(``,!0),T.value.length>0?(i(),b(`div`,U,[C.value?(i(),b(`div`,me,[y(`div`,W,s(C.value.name)+` · `+s(C.value.total.toLocaleString()),1),(i(!0),b(v,null,t(C.value.items,e=>(i(),b(`div`,{key:e.type,class:`flex justify-between gap-4 text-xs text-content-secondary dark:text-content-muted`},[y(`span`,null,s(e.name),1),y(`span`,he,s(e.count.toLocaleString()),1)]))),128))])):m(``,!0),y(`div`,ge,[(i(!0),b(v,null,t(T.value,e=>(i(),b(`div`,{key:e.name,class:`flex flex-col items-center flex-1 max-w-32 h-full justify-end cursor-pointer`,onMouseenter:t=>C.value=e,onMouseleave:r[0]||=e=>C.value=null},[y(`span`,ve,s(e.total.toLocaleString()),1),y(`div`,{class:`w-full rounded-[5px] transition-all duration-300 ease-out hover:opacity-90 overflow-hidden flex flex-col-reverse`,style:u({height:te(e.total)+`%`,minHeight:`8px`})},[(i(!0),b(v,null,t(e.items,t=>(i(),b(`div`,{key:t.type,style:u({height:N(t.count,e.total)+`%`,backgroundColor:t.color})},null,4))),128))],4),y(`span`,G,s(e.name),1)],40,_e))),128))])])):m(``,!0)]),_:1},8,[`is-loading`,`is-updating`,`error`,`status`]),T.value.length>0?(i(),b(`div`,ye,[(i(!0),b(v,null,t(T.value,e=>(i(),b(`div`,{key:`legend-`+e.name,class:`flex flex-col gap-0.5 min-w-[100px] max-w-[140px] flex-shrink-0`},[(i(!0),b(v,null,t(e.items,e=>(i(),b(`div`,{key:e.type,class:`flex items-center gap-1.5`},[y(`span`,{class:`w-2 h-2 rounded-sm shrink-0`,style:u({backgroundColor:e.color})},null,4),y(`span`,be,s(e.name),1)]))),128))]))),128))])):m(``,!0),T.value.length>0?(i(),b(`div`,xe,` Total: `+s(D.value.toLocaleString())+` packets `,1)):m(``,!0)]))}}),[[`__scopeId`,`data-v-b302d2e6`]]),Se={class:`glass-card rounded-[10px] p-4 lg:p-6`},Ce={class:`mt-3 lg:mt-4 grid grid-cols-2 gap-3 lg:gap-4`},we={class:`text-center`},Te={class:`text-lg lg:text-2xl font-bold text-content-primary`},q={class:`text-center`},Ee={class:`text-lg lg:text-2xl font-bold text-content-primary`},J={class:`mt-2 lg:mt-3 grid grid-cols-3 gap-2 lg:gap-3 text-center`},De={class:`text-xs lg:text-sm font-semibold text-accent-purple flex items-center justify-center gap-1`},Oe={key:0,class:`inline-block w-1.5 h-1.5 rounded-full bg-secondary opacity-70`,title:`Early data - limited uptime`},ke={class:`text-xs text-content-secondary dark:text-content-muted`},Ae={class:`text-xs lg:text-sm font-semibold text-accent-red flex items-center justify-center gap-1`},je={key:0,class:`inline-block w-1.5 h-1.5 rounded-full bg-secondary opacity-70`,title:`Early data - limited uptime`},Me={class:`text-xs text-content-secondary dark:text-content-muted`},Ne={class:`text-xs lg:text-sm font-semibold text-accent-red`},Y=null,Pe=12e4,Fe=j(d({name:`AirtimeUtilizationChart`,__name:`AirtimeUtilizationChart`,setup(t){let r=(e,t)=>typeof window>`u`?t:window.getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t,c={rx:r(`--color-secondary`,`violet`),tx:r(`--color-accent-red`,`tomato`)},u=()=>({gridLine:r(`--color-border-subtle`,`lightgray`),axisLabel:r(`--color-text-muted`,`gray`)}),d=ee(),f=E(),p=a(null),v=a([]),C=a(!1),w=a(!0),T=a(!1),D=a(null),O=a(`Connecting...`),k=a(30),A=a({totalReceived:0,totalTransmitted:0,dropped:0,firstPacketTime:0}),j=a({sf:9,bwHz:62500,cr:5,preamble:17}),te=(e,t=60)=>{if(e.length===0)return[];let n=1-.5**(1/t),r=Math.min(e.length,Math.max(10,Math.floor(t/3))),i=0,a=0;for(let t=0;t(i=n*e.rxUtil+(1-n)*i,a=n*e.txUtil+(1-n)*a,{...e,rxUtil:i,txUtil:a}))},N=g(()=>{let e=d.packetStats?.total_packets||0,t=d.packetStats?.transmitted_packets||0,n=f.stats?.uptime_seconds||0,r=e||A.value.totalReceived,i=t||A.value.totalTransmitted,a=A.value.firstPacketTime>0?Math.floor(Date.now()/1e3)-A.value.firstPacketTime:0,o=n||a,s=Math.max(o/3600,.1);if(s<1){let e=Math.max(o/60,1);return{rxRate:{value:Math.round(r/e*100)/100,label:s<.5?`RX/min (early)`:`RX/min`},txRate:{value:Math.round(i/e*100)/100,label:s<.5?`TX/min (early)`:`TX/min`},confidence:`low`}}let c=Math.round(r/s*100)/100,l=Math.round(i/s*100)/100,u,p;return s<6?(u=`RX/hr (${Math.round(s)}h)`,p=`medium`):s<24?(u=`RX/hr (${Math.round(s)}h)`,p=`high`):(u=`RX/hr`,p=`high`),{rxRate:{value:c,label:u},txRate:{value:l,label:u.replace(`RX`,`TX`)},confidence:p}}),P=async()=>{O.value=`Connecting...`,D.value=null,w.value||(T.value=!0);try{let e=60*1e3,t=Math.floor(Date.now()/1e3),n=t-24*3600,r=f.stats?.config?.radio;r&&(j.value={sf:r.spreading_factor??9,bwHz:r.bandwidth??62500,cr:r.coding_rate??5,preamble:r.preamble_length??17});let i=await I(`/airtime_chart_data`,{start_timestamp:n,end_timestamp:t,bucket_seconds:60,sf:j.value.sf,bw_hz:j.value.bwHz,cr:j.value.cr,preamble:j.value.preamble},{onPhaseChange:e=>{O.value=e===`receiving`?`Receiving data...`:`Connecting...`}});if(!i.success){v.value=[],C.value=!1,w.value=!1,T.value=!1,S(()=>F());return}let a=i.data,o=a.buckets||[];A.value={totalReceived:a.rx_total||0,totalTransmitted:a.tx_total||0,dropped:d.packetStats?.dropped_packets??0,firstPacketTime:o.length>0?o[0].timestamp:t};let s=24*3600/60,c=new Float64Array(s),l=new Float64Array(s);for(let t of o){let r=Math.floor((t.timestamp-n)/60);r>=0&&r[e.rxUtil,e.txUtil]))*1.05;k.value=Math.max(5,Math.ceil(g/5)*5),Y={data:h,yAxisMax:k.value,fetchedAt:Date.now()},C.value=!1,w.value=!1,T.value=!1,D.value=null,S(()=>F())}catch(e){console.error(`Failed to fetch airtime data:`,e),v.value=[],C.value=!1,w.value=!1,T.value=!1,D.value=e instanceof Error?e.message:`Failed to load chart data`,S(()=>F())}},F=()=>{if(!p.value)return;let e=p.value,t=e.getContext(`2d`);if(!t)return;let n=e.parentElement;if(!n)return;let r=n.getBoundingClientRect(),i=r.width,a=r.height;if(e.width=i*window.devicePixelRatio,e.height=a*window.devicePixelRatio,e.style.width=i+`px`,e.style.height=a+`px`,t.scale(window.devicePixelRatio,window.devicePixelRatio),t.clearRect(0,0,i,a),C.value){t.fillStyle=u().axisLabel,t.font=`16px system-ui`,t.textAlign=`center`,t.fillText(`Loading chart data...`,i/2,a/2);return}if(v.value.length===0){t.fillStyle=u().axisLabel,t.font=`16px system-ui`,t.textAlign=`center`,t.fillText(`No data available`,i/2,a/2);return}let o=i-45-20,s=a-40,l=k.value,d=k.value,f=u();t.strokeStyle=f.gridLine,t.lineWidth=1,t.font=`10px system-ui`,t.textAlign=`right`;for(let e=0;e<=5;e++){let n=20+s*e/5;t.beginPath(),t.moveTo(45,n),t.lineTo(i-20,n),t.stroke();let r=l-e/5*d;t.fillStyle=f.axisLabel,t.fillText(`${r.toFixed(0)}%`,40,n+3)}for(let e=0;e<=6;e++){let n=45+o*e/6;t.beginPath(),t.moveTo(n,20),t.lineTo(n,a-20),t.stroke()}v.value.length>1&&(t.strokeStyle=c.rx,t.lineWidth=2,t.beginPath(),v.value.forEach((e,n)=>{let r=45+o*n/(v.value.length-1),i=a-20-Math.min(e.rxUtil,k.value)/d*s;n===0?t.moveTo(r,i):t.lineTo(r,i)}),t.stroke()),v.value.length>1&&(t.strokeStyle=c.tx,t.lineWidth=2,t.beginPath(),v.value.forEach((e,n)=>{let r=45+o*n/(v.value.length-1),i=a-20-Math.min(e.txUtil,k.value)/d*s;n===0?t.moveTo(r,i):t.lineTo(r,i)}),t.stroke())};return M(P,{intervalMs:12e4,immediate:!1}),e(()=>{Y&&Date.now()-Y.fetchedAt{F(),setTimeout(()=>F(),100)}),window.addEventListener(`resize`,F)}),x(()=>{window.removeEventListener(`resize`,F)}),(e,t)=>(i(),b(`div`,Se,[t[3]||=l(`

Airtime Utilization

Activity (Last 24 Hours)

Rx Util
Tx Util
`,3),h(ae,{class:`h-40 lg:h-48`,"is-loading":w.value,"is-updating":T.value,error:D.value,status:O.value,onRetry:P},{default:n(()=>[y(`canvas`,{ref_key:`chartRef`,ref:p,class:`absolute inset-0 w-full h-full`},null,512)]),_:1},8,[`is-loading`,`is-updating`,`error`,`status`]),y(`div`,Ce,[y(`div`,we,[y(`div`,Te,s(o(d).packetStats?.total_packets||A.value.totalReceived),1),t[0]||=y(`div`,{class:`text-xs text-content-secondary dark:text-content-muted uppercase tracking-wide`},` Total Received `,-1)]),y(`div`,q,[y(`div`,Ee,s(o(d).packetStats?.transmitted_packets||A.value.totalTransmitted),1),t[1]||=y(`div`,{class:`text-xs text-content-secondary dark:text-content-muted uppercase tracking-wide`},` Total Transmitted `,-1)])]),y(`div`,J,[y(`div`,null,[y(`div`,De,[_(s(N.value.rxRate.value)+` `,1),N.value.confidence===`low`?(i(),b(`span`,Oe)):m(``,!0)]),y(`div`,ke,s(N.value.rxRate.label),1)]),y(`div`,null,[y(`div`,Ae,[_(s(N.value.txRate.value)+` `,1),N.value.confidence===`low`?(i(),b(`span`,je)):m(``,!0)]),y(`div`,Me,s(N.value.txRate.label),1)]),y(`div`,null,[y(`div`,Ne,s(o(d).packetStats?.dropped_packets||A.value.dropped),1),t[2]||=y(`div`,{class:`text-xs text-content-secondary dark:text-content-muted`},`Dropped`,-1)])])]))}}),[[`__scopeId`,`data-v-dff649e7`]]),Ie={},Le={viewBox:`0 0 20 16`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,"aria-hidden":`true`};function Re(e,t){return i(),b(`svg`,Le,[...t[0]||=[l(``,7)]])}var ze=j(Ie,[[`render`,Re]]),Be=j(d({__name:`HopConnector`,props:{status:{default:`received`}},setup(e){return(t,n)=>(i(),b(`span`,{class:f([`hop-connector`,`hop-connector-${e.status}`]),title:`Rabbit hop`},[h(ze,{class:`hop-rabbit`})],2))}}),[[`__scopeId`,`data-v-5fc98e84`]]),Ve={class:`glass-card w-full max-w-none rounded-[20px] p-6`},He={class:`flex flex-col lg:flex-row lg:justify-between lg:items-center mb-6 gap-4 filter-container`},Ue={class:`flex items-center gap-2 header-info relative`},We={class:`text-content-secondary dark:text-content-muted text-sm packet-count`},Ge=[`title`],Ke={class:`hidden sm:inline`},qe={key:1,class:`text-accent-red text-sm error-indicator`},Je={class:`flex items-center gap-3 lg:flex filter-controls`},Ye={class:`flex flex-col`},Xe=[`value`],Ze={class:`flex flex-col`},Qe=[`value`],$e={class:`flex flex-col`},et={class:`flex flex-col reset-container`},tt=[`disabled`],nt={class:`space-y-4 w-full`},rt=[`onClick`],it={key:0,class:`duplicate-group-banner mb-2 flex items-center justify-between gap-2 rounded-[8px] px-2 py-1`},at={class:`text-[10px] text-content-secondary dark:text-content-muted`},ot={class:`hidden lg:block w-full space-y-2`},st={class:`grid w-full grid-cols-11 gap-2 items-center`},ct={class:`col-span-1 text-content-primary text-sm`},lt={class:`col-span-1 flex items-center gap-2`},ut={class:`flex flex-col`},dt={class:`text-content-primary text-xs`},ft=[`title`],pt={class:`col-span-2`},mt={class:`col-span-1 text-content-primary text-xs`},ht={class:`col-span-1 text-content-primary text-xs`},gt={class:`col-span-1 text-content-primary text-xs flex items-center gap-1`},_t={class:`col-span-1 text-content-primary text-xs`},vt={class:`col-span-1 text-content-primary text-xs`},yt={key:0,class:`flex items-center gap-1`},bt={class:`col-span-2`},xt={class:`flex items-center gap-1`},St={key:0,class:`inline-flex items-center text-[10px] font-medium text-accent-amber`,title:`Policy blocked`},Ct={key:0,class:`mt-1 flex items-center gap-2`},wt=[`onClick`],Tt={key:1,class:`mt-1 text-[10px] text-content-secondary dark:text-content-muted`},Et={key:2,class:`text-accent-red text-[8px] italic truncate`},Dt={class:`grid w-full grid-cols-11 gap-2 items-start`},Ot={class:`col-span-11`},kt={class:`space-y-1`},At={class:`flex items-center gap-2`},jt={class:`text-[9px] text-content-muted`},Mt={class:`flex items-center gap-0.5 flex-wrap`},Nt=[`title`],Pt={key:1,class:`flex items-center gap-1`},Ft={class:`inline-block px-2 py-0.5 rounded bg-badge-cyan-bg text-badge-cyan-text text-xs font-mono`},It={class:`lg:hidden space-y-2`},Lt={class:`mobile-packet-card space-y-3 rounded-[16px] p-4`},Rt={class:`flex items-start justify-between gap-3`},zt={class:`flex items-start gap-3 min-w-0`},Bt={class:`min-w-0`},Vt={class:`flex items-center gap-2 flex-wrap`},Ht={class:`text-content-primary text-xl font-semibold tracking-wide`},Ut={key:0,class:`text-content-secondary dark:text-content-muted text-[10px] font-medium leading-tight`},Wt=[`title`],Gt={class:`flex items-start gap-2 flex-shrink-0`},Kt={class:`flex flex-col items-end`},qt={class:`text-content-secondary dark:text-content-muted text-xs`},Jt={class:`mt-1 flex items-center gap-1 justify-end`},Yt={key:0,class:`inline-flex items-center text-[10px] font-medium text-accent-amber`,title:`Policy blocked`},Xt=[`title`,`aria-label`,`onClick`],Zt={class:`absolute -top-1 -right-1 min-w-[18px] h-[18px] px-1 rounded-full bg-surface dark:bg-surface-elevated border border-primary/opacity-heavy text-[10px] leading-none font-semibold text-primary flex items-center justify-center`},Qt={class:`space-y-2`},$t={class:`flex items-center gap-2`},en={class:`text-content-muted text-xs`},tn={key:0,class:`flex flex-wrap items-center gap-1.5`},nn=[`title`],rn={key:1,class:`flex items-center gap-1`},an={class:`inline-block px-2 py-0.5 rounded bg-badge-cyan-bg text-badge-cyan-text text-xs font-mono font-semibold`},on={class:`pt-3 border-t border-stroke-subtle/70 dark:border-stroke/opacity-heavy`},sn={class:`mobile-metrics-grid grid gap-0`},cn={class:`mobile-metric-cell`},ln={class:`text-content-primary text-base font-semibold`},un={class:`mobile-metric-cell`},dn={class:`text-content-primary text-base font-semibold`},fn={class:`mobile-metric-cell`},pn={class:`flex items-center gap-1 min-w-0`},mn={class:`text-content-primary text-[11px] font-medium leading-tight`},hn={class:`mobile-metric-cell`},gn={class:`flex items-center gap-1`},_n={class:`text-content-primary text-base font-semibold`},vn={key:0,class:`text-accent-red text-xs italic`},yn={key:0,class:`flex justify-between items-center mt-6 pt-4 border-t border-stroke-subtle dark:border-stroke pagination-container`},bn={class:`flex items-center gap-4 pagination-info`},xn={class:`text-content-secondary dark:text-content-muted text-sm`},Sn={class:`text-xs`},Cn={key:0,class:`flex items-center gap-2 load-more-section`},wn=[`disabled`],Tn={class:`text-content-secondary dark:text-content-muted text-xs load-more-count`},En={class:`flex items-center gap-2 pagination-controls`},Dn=[`disabled`],On={class:`flex items-center gap-1 page-numbers`},kn={key:1,class:`text-content-secondary dark:text-content-muted text-sm px-2 ellipsis`},An=[`onClick`],jn={key:2,class:`text-content-secondary dark:text-content-muted text-sm px-2 ellipsis`},Mn=[`disabled`],Nn={key:1,class:`flex justify-center mt-6 pt-4 border-t border-stroke-subtle dark:border-stroke`},Pn={class:`flex items-center gap-4`},Fn={class:`text-content-secondary dark:text-content-muted text-sm`},In={class:`text-content-secondary dark:text-content-muted text-xs`},Ln={key:2,class:`flex justify-center mt-6 pt-4 border-t border-stroke-subtle dark:border-stroke`},Rn={class:`flex items-center gap-2`},X=10,Z=1e3,zn=j(d({name:`PacketTable`,__name:`PacketTable`,setup(n){let u=ee(),{getSignalQualityFromSNR:d}=se(),S=D(),C=a(1),E=a(100),k=a(!1),j=a(!1),M=null;p(()=>u.isLoading,e=>{e?(M&&=(clearTimeout(M),null),j.value=!0):M=window.setTimeout(()=>{j.value=!1,M=null},600)});let N=a(null),P=a(!1),F=a(null),ne=a(0),I=(e,t)=>!e||!t?!1:e.packet_hash===t.packet_hash&&e.timestamp===t.timestamp&&e.type===t.type&&e.route===t.route&&e.src_hash===t.src_hash&&e.dst_hash===t.dst_hash&&e.length===t.length,re=async(e,t)=>{if((e.id||e.packet_hash)&&(!e.header||!e.raw_packet)){let n=++ne.value;try{let r=e.id==null?await u.getPacketByHash(e.packet_hash):await u.getPacketById(e.id);r&&ne.value===n&&N.value&&I(N.value,e)&&F.value===t&&(N.value={...N.value,...r})}catch{}}},ie=async e=>{let t=W.value.findIndex(t=>I(t,e));F.value=t>=0?t:null,N.value=e,P.value=!0,await re(e,F.value)},ae=async e=>{let t=W.value[e];t&&(F.value=e,N.value=t,P.value=!0,await re(t,e))},oe=async()=>{F.value==null||F.value<=0||await ae(F.value-1)},ue=async()=>{F.value==null||F.value>=W.value.length-1||await ae(F.value+1)},de=()=>{P.value=!1,N.value=null,F.value=null,ne.value+=1},L=a(te(`packetTable_selectedType`,`all`)),R=a(te(`packetTable_selectedRoute`,`all`)),z=a(!1),B=a(null),fe=[`all`,`0`,`1`,`2`,`3`,`4`,`5`,`6`,`7`,`8`,`9`,`10`,`11`],pe=[`all`,`1`,`2`],V=a(new Set);p(L,e=>{A(`packetTable_selectedType`,e),C.value=1}),p(R,e=>{A(`packetTable_selectedRoute`,e),C.value=1}),p(z,()=>{C.value=1});let H=g(()=>{let e=u.recentPackets;if(L.value!==`all`){let t=parseInt(L.value);e=e.filter(e=>e.type===t)}if(R.value!==`all`){let t=parseInt(R.value);e=e.filter(e=>e.route===t)}return z.value&&B.value!==null&&(e=e.filter(e=>e.timestamp>=B.value)),e}),U=g(()=>{let e=new Map,t=[];return H.value.forEach((n,r)=>{let i=n.packet_hash?.trim(),a=i?`hash:${i}`:`nohash:${n.timestamp}:${r}`,o=e.get(a);if(o){o.packets.push(n);return}let s={key:a,packetHash:i??``,packets:[n],primary:n,duplicates:[],duplicateCount:0,hasDuplicates:!1};e.set(a,s),t.push(s)}),t.map(e=>{let t=e.packets.findIndex(e=>!e.is_duplicate),n=t>=0?t:e.packets.findIndex(e=>e.transmitted&&!e.drop_reason),r=n>=0?n:e.packets.findIndex(e=>e.transmitted),i=r>=0?r:0,a=e.packets[i],o=e.packets.filter((e,t)=>t!==i);return{...e,primary:a,duplicates:o,duplicateCount:o.length,hasDuplicates:o.length>0}})}),me=g(()=>{let e=(C.value-1)*X,t=e+X;return U.value.slice(e,t)}),W=g(()=>U.value.flatMap(e=>[e.primary,...e.duplicates])),he=g(()=>{let e=N.value;return e?U.value.find(t=>t.packets.some(t=>I(t,e)))?.packets??[]:[]}),ge=g(()=>F.value!=null&&F.value>0),_e=g(()=>F.value!=null&&F.value{let e=new Map;for(let t of me.value)e.set(t.primary,{group:t,isPrimary:!0,duplicateIndex:0}),t.duplicates.forEach((n,r)=>{e.set(n,{group:t,isPrimary:!1,duplicateIndex:r+1})});return e}),G=g(()=>Math.ceil(U.value.length/X));p(U,e=>{let t=new Set(e.filter(e=>e.hasDuplicates).map(e=>e.key)),n=new Set([...V.value].filter(e=>t.has(e)));n.size!==V.value.size&&(V.value=n),G.value>0&&C.value>G.value&&(C.value=G.value)},{immediate:!0}),p([W,N,P],([e,t,n])=>{if(!n||!t)return;let r=e.findIndex(e=>I(e,t));F.value=r>=0?r:null},{immediate:!0});let ye=g(()=>C.value===G.value),be=g(()=>u.recentPackets.length>=E.value&&E.valueye.value&&be.value&&!k.value),K=e=>ve.value.get(e),Se=e=>K(e)?.isPrimary??!0,Ce=e=>!Se(e),we=e=>Te(e)&&J(e),Te=e=>{let t=K(e);return!!(t?.isPrimary&&t.group.hasDuplicates)},q=e=>{let t=K(e);return t?.isPrimary?t.group.duplicateCount:0},Ee=e=>{let t=q(e);return`${J(e)?`Hide`:`Show`} ${t} duplicate${t===1?``:`s`}`},J=e=>{let t=K(e);return t?.isPrimary?V.value.has(t.group.key):!1},De=e=>{let t=K(e);return!t||t.isPrimary?0:t.duplicateIndex},Oe=e=>K(e)?.group.packets.length??1,ke=e=>De(e)===1,Ae=e=>e.hasDuplicates&&V.value.has(e.key)?[e.primary,...e.duplicates]:[e.primary],je=e=>{let t=K(e);if(!t?.isPrimary||!t.group.hasDuplicates)return;let n=new Set(V.value);n.has(t.group.key)?n.delete(t.group.key):n.add(t.group.key),V.value=n},Me=e=>new Date(e*1e3).toLocaleTimeString(void 0,{hour12:!0}),Ne=e=>({0:`REQ`,1:`RESPONSE`,2:`TXT_MSG`,3:`ACK`,4:`ADVERT`,5:`GRP_TXT`,6:`GRP_DATA`,7:`ANON_REQ`,8:`PATH`,9:`TRACE`,10:`MULTI_PART`,11:`CONTROL`})[e]||`TYPE_${e}`,Y=e=>({0:`T-Flood`,1:`Flood`,2:`Direct`,3:`T-Direct`})[e]||`Route ${e}`,Pe=e=>e.transmitted?`text-accent-green`:`text-primary`,Fe=e=>e.drop_reason?`Dropped`:e.transmitted?`Forward`:`Received`,Ie=e=>{let t=e.drop_reason?.toLowerCase();return!!(t&&t.includes(`policy blocked`))},Le=e=>(Ie(e),``),Re=e=>e===1?`bg-badge-cyan-bg text-badge-cyan-text`:`bg-badge-neutral-bg text-badge-neutral-text`,ze=e=>({0:`bg-primary`,1:`bg-accent-green`,2:`bg-secondary`,3:`bg-accent-purple`,4:`bg-accent-red`,5:`bg-accent-cyan`,6:`bg-primary`,7:`bg-accent-purple`,8:`bg-accent-green`,9:`bg-secondary`})[e]||`bg-background-mute`,zn=e=>({0:`border-l-primary`,1:`border-l-accent-green`,2:`border-l-accent-amber`,3:`border-l-accent-purple`,4:`border-l-accent-red`,5:`border-l-accent-cyan`,6:`border-l-primary`,7:`border-l-accent-purple`,8:`border-l-accent-green`,9:`border-l-accent-amber`})[e]||`border-l-gray-500`,Bn=e=>!e.transmitted||!e.lbt_attempts||e.lbt_attempts===0?`status-dot-green`:e.lbt_attempts===1?`status-dot-muted`:e.lbt_attempts===2?`status-dot-amber`:`status-dot-red`,Vn=e=>e>=1e3?(e/1e3).toFixed(2)+`s`:e.toFixed(1)+`ms`,Hn=e=>{if(!e)return[];if(Array.isArray(e))return e;if(typeof e==`string`)try{let t=JSON.parse(e);return typeof t==`string`?JSON.parse(t):Array.isArray(t)?t:[]}catch{return[]}return[]},Q=e=>{let t=Hn(e.original_path),n=Hn(e.forwarded_path),r=e.transmitted&&n.length>0?n:t.length>0?t:n;return r.length===0?null:{hops:r.length-1,nodes:r.map(e=>e.toUpperCase())}},Un=e=>e<=0?`Direct`:`${e} hop${e>1?`s`:``}`,$=e=>{if(e.type!==4||!e.payload)return null;try{let t=e.payload.replace(/\s+/g,``).toUpperCase(),n=t,r=0;if(t.length/2>=100)if(t.length>200)n=t.slice(200),r=0;else return null;if(n.length>=2){let e=parseInt(n.slice(0,2),16);r+=2;let t=!!(e&16),i=!!(e&32),a=!!(e&64);if(!(e&128))return null;if(t&&n.length>=r+16&&(r+=16),i&&n.length>=r+4&&(r+=4),a&&n.length>=r+4&&(r+=4),n.length>r){let e=(n.slice(r).match(/.{2}/g)||[]).map(e=>{let t=parseInt(e,16);return t>=32&&t<=126?String.fromCharCode(t):`.`}).join(``).replace(/\.*$/,``);return e.length>0?e:null}}}catch(e){console.error(`Error parsing ADVERT node name:`,e)}return null},Wn=()=>{L.value=`all`,R.value=`all`,z.value=!1,B.value=null,C.value=1},Gn=()=>{z.value?(z.value=!1,B.value=null):(z.value=!0,B.value=Date.now()/1e3),C.value=1},Kn=g(()=>B.value?new Date(B.value*1e3).toLocaleTimeString(void 0,{hour12:!0}):``),qn=async e=>{try{let t=e||E.value;await u.fetchRecentPackets({limit:t})}catch(e){console.error(`Error fetching packet data:`,e)}},Jn=async()=>{if(!(k.value||E.value>=Z)){k.value=!0;try{let e=Math.min(E.value+200,Z);E.value=e,await qn(e)}catch(e){console.error(`Error loading more records:`,e)}finally{k.value=!1}}};return e(()=>{S.ensure(`recentPackets`)}),x(()=>{M&&clearTimeout(M)}),(e,n)=>(i(),b(v,null,[y(`div`,Ve,[y(`div`,He,[y(`div`,Ue,[n[7]||=y(`h3`,{class:`text-content-primary text-xl font-semibold`},` Recent Packets `,-1),y(`span`,We,` (`+s(H.value.length)+` of `+s(o(u).recentPackets.length)+`) `,1),z.value?(i(),b(`span`,{key:0,class:`text-primary text-xs sm:text-sm bg-primary/opacity-light px-2 py-1 rounded-md border border-primary/opacity-medium live-mode-badge whitespace-nowrap`,title:`Filter activated at ${Kn.value}`},[y(`span`,Ke,`Live Mode (since `+s(Kn.value)+`)`,1),n[6]||=y(`span`,{class:`sm:hidden`},`Live`,-1)],8,Ge)):m(``,!0),o(u).error?(i(),b(`span`,qe,s(o(u).error),1)):m(``,!0)]),y(`div`,Je,[y(`div`,Ye,[n[8]||=y(`label`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},`Type`,-1),r(y(`select`,{"onUpdate:modelValue":n[0]||=e=>L.value=e,class:`glass-card border border-stroke-subtle dark:border-stroke rounded-[10px] px-3 py-2 text-content-primary text-sm focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary/opacity-medium transition-all duration-200 min-w-[120px] cursor-pointer hover:border-primary/opacity-heavy dark:hover:border-primary/opacity-heavy`},[(i(),b(v,null,t(fe,e=>y(`option`,{key:e,value:e,class:`bg-surface dark:bg-surface-elevated text-content-primary`},s(e===`all`?`All Types`:`Type ${e} (${Ne(parseInt(e))})`),9,Xe)),64))],512),[[w,L.value]])]),y(`div`,Ze,[n[9]||=y(`label`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},`Route`,-1),r(y(`select`,{"onUpdate:modelValue":n[1]||=e=>R.value=e,class:`glass-card border border-stroke-subtle dark:border-stroke rounded-[10px] px-3 py-2 text-content-primary text-sm focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary/opacity-medium transition-all duration-200 min-w-[120px] cursor-pointer hover:border-primary/opacity-heavy dark:hover:border-primary/opacity-heavy`},[(i(),b(v,null,t(pe,e=>y(`option`,{key:e,value:e,class:`bg-surface dark:bg-surface-elevated text-content-primary`},s(e===`all`?`All Routes`:`Route ${e} (${Y(parseInt(e))})`),9,Qe)),64))],512),[[w,R.value]])]),y(`div`,$e,[n[10]||=y(`label`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},`Filter`,-1),y(`button`,{onClick:Gn,class:f([`glass-card border rounded-[10px] px-4 py-2 text-sm transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium min-w-[120px]`,{"border-primary bg-primary/opacity-light text-primary":z.value,"border-stroke-subtle dark:border-stroke text-content-secondary dark:text-content-muted hover:border-primary dark:hover:border-primary hover:text-content-primary dark:hover:text-content-primary hover:bg-primary/opacity-light":!z.value}])},s(z.value?`New Only`:`Show New`),3)]),y(`div`,et,[n[11]||=y(`label`,{class:`text-transparent text-xs mb-1`},`.`,-1),y(`button`,{onClick:Wn,class:f([`glass-card border border-stroke-subtle dark:border-stroke hover:border-primary dark:hover:border-primary rounded-[10px] px-4 py-2 text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary text-sm transition-all duration-200 focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary/opacity-medium`,{"opacity-50 cursor-not-allowed hover:border-stroke-subtle dark:hover:border-stroke hover:text-content-secondary dark:hover:text-content-muted":L.value===`all`&&R.value===`all`&&!z.value,"hover:bg-primary/opacity-light":L.value!==`all`||R.value!==`all`||z.value}]),disabled:L.value===`all`&&R.value===`all`&&!z.value},` Reset `,10,tt)])])]),n[30]||=l(``,1),y(`div`,nt,[(i(!0),b(v,null,t(me.value,e=>(i(),b(`div`,{key:e.key,class:f([`space-y-2 w-full`,e.hasDuplicates?`duplicate-group-container rounded-[12px] overflow-hidden`:``])},[(i(!0),b(v,null,t(Ae(e),(r,a)=>(i(),b(`div`,{key:`${e.key}_${r.packet_hash}_${r.timestamp}_${a}`,class:f([`packet-row w-full border-b border-stroke-subtle dark:border-dark-border/50 pb-4 hover:bg-background-mute dark:hover:bg-stroke/opacity-subtle transition-colors duration-150 cursor-pointer rounded-[10px] p-2 border-l-4`,[zn(r.type),Le(r),Ce(r)?`duplicate-packet-row`:``,we(r)?`duplicate-group-expanded-row`:``]]),onClick:e=>ie(r)},[ke(r)?(i(),b(`div`,it,[n[12]||=y(`span`,{class:`text-[10px] font-semibold uppercase tracking-wide text-primary`},`Duplicate Group`,-1),y(`span`,at,s(Oe(r)-1)+` duplicate`+s(Oe(r)-1==1?``:`s`),1)])):m(``,!0),y(`div`,ot,[y(`div`,st,[y(`div`,ct,s(Me(r.timestamp)),1),y(`div`,lt,[y(`div`,{class:f([`w-2 h-2 rounded-full`,ze(r.type)])},null,2),y(`div`,ut,[y(`span`,dt,s(Ne(r.type)),1),r.type===4&&$(r)?(i(),b(`span`,{key:0,class:`text-accent-red/opacity-heavy text-[10px] font-medium max-w-[80px] truncate`,title:$(r)||void 0},s($(r)),9,ft)):m(``,!0)])]),y(`div`,pt,[y(`span`,{class:f([`inline-block px-2 py-1 rounded text-xs font-medium`,Re(r.route)])},s(Y(r.route)),3)]),y(`div`,mt,s(r.length)+`B `,1),y(`div`,ht,s(r.rssi==null?`N/A`:r.rssi.toFixed(0)+` dBm`),1),y(`div`,gt,[r.rssi==null?m(``,!0):(i(),c(ce,{key:0,bars:o(d)(r.snr).bars,color:o(d)(r.snr).color},null,8,[`bars`,`color`])),_(` `+s(r.snr==null?`N/A`:r.snr.toFixed(1)+`dB`),1)]),y(`div`,_t,s(r.score==null?`N/A`:r.score.toFixed(2)),1),y(`div`,vt,[Number(r.tx_delay_ms)>0?(i(),b(`div`,yt,[r.transmitted?(i(),b(`div`,{key:0,class:f([`w-1.5 h-1.5 rounded-full flex-shrink-0`,Bn(r)])},null,2)):m(``,!0),y(`span`,null,s(Vn(Number(r.tx_delay_ms))),1)])):m(``,!0)]),y(`div`,bt,[y(`div`,null,[y(`div`,xt,[y(`span`,{class:f([`text-xs font-medium`,Pe(r)])},s(Fe(r)),3),Ie(r)?(i(),b(`span`,St,[...n[13]||=[y(`svg`,{class:`w-3 h-3`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`,"aria-hidden":`true`},[y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 3l7 4v5c0 5-3.5 8-7 9-3.5-1-7-4-7-9V7l7-4z`}),y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 8l8 8`})],-1)]])):m(``,!0)]),Te(r)?(i(),b(`div`,Ct,[y(`button`,{type:`button`,class:`inline-flex items-center gap-1 rounded-md px-2 py-1 text-[10px] font-semibold transition-all duration-200 border bg-primary/opacity-medium hover:bg-primary/opacity-medium border-primary/opacity-heavy text-primary`,onClick:T(e=>je(r),[`stop`])},[(i(),b(`svg`,{class:f([`w-2.5 h-2.5 transition-transform duration-200`,{"rotate-180":J(r)}]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...n[14]||=[y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2.5`,d:`M19 9l-7 7-7-7`},null,-1)]],2)),_(` `+s(J(r)?`Hide`:`Show`)+` `+s(q(r))+` duplicate`+s(q(r)===1?``:`s`),1)],8,wt)])):Ce(r)?(i(),b(`div`,Tt,` Duplicate #`+s(K(r)?.duplicateIndex),1)):m(``,!0),r.drop_reason?(i(),b(`p`,Et,s(r.drop_reason),1)):m(``,!0)])])]),y(`div`,Dt,[y(`div`,Ot,[y(`div`,kt,[Q(r)?(i(),b(v,{key:0},[y(`div`,At,[n[15]||=y(`span`,{class:`text-[9px] uppercase tracking-wide text-content-muted font-semibold`},` Path `,-1),y(`span`,jt,s(Un(Q(r).hops)),1)]),y(`div`,Mt,[(i(!0),b(v,null,t(Q(r).nodes,(e,t)=>(i(),b(v,{key:t},[y(`span`,{class:f([`inline-block max-w-full truncate px-1.5 py-0.5 rounded text-[9px] font-mono font-semibold leading-tight tracking-tight`,t===0?`bg-badge-cyan-bg text-badge-cyan-text`:`bg-background-mute/opacity-medium text-content-muted`]),title:e},s(e),11,Nt),tje(r),[`stop`])},[n[18]||=y(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`,"aria-hidden":`true`},[y(`rect`,{x:`9`,y:`9`,width:`11`,height:`11`,rx:`2`,ry:`2`,"stroke-width":`2`}),y(`path`,{d:`M6 15H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v1`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`})],-1),y(`span`,Zt,s(q(r)),1)],10,Xt)):m(``,!0)])]),y(`div`,Qt,[y(`div`,$t,[n[19]||=y(`span`,{class:`text-primary text-xs font-semibold uppercase tracking-wide`},`Path`,-1),y(`span`,en,s(Q(r)?Un(Q(r).hops):`Unknown`),1)]),Q(r)?(i(),b(`div`,tn,[(i(!0),b(v,null,t(Q(r).nodes,(e,t)=>(i(),b(v,{key:`mobile-path-${t}`},[y(`span`,{class:f([`mobile-path-chip inline-flex items-center px-2 py-1 rounded-lg text-xs font-mono font-semibold leading-tight`,t===0?`bg-badge-cyan-bg text-badge-cyan-text`:`text-content-secondary dark:text-content-muted`]),title:e},s(e),11,nn),t0&&r.transmitted?(i(),b(`div`,{key:0,class:f([`w-1.5 h-1.5 rounded-full flex-shrink-0`,Bn(r)])},null,2)):m(``,!0),y(`span`,_n,s(Number(r.tx_delay_ms)>0?Vn(Number(r.tx_delay_ms)):`--`),1)])])])]),r.drop_reason?(i(),b(`div`,vn,s(r.drop_reason),1)):m(``,!0)])])],10,rt))),128))],2))),128))]),G.value>1?(i(),b(`div`,yn,[y(`div`,bn,[y(`span`,xn,[_(` Showing `+s((C.value-1)*X+1)+` - `+s(Math.min(C.value*X,U.value.length))+` of `+s(U.value.length)+` hash groups `,1),y(`span`,Sn,`(`+s(H.value.length)+` packets)`,1)]),xe.value?(i(),b(`div`,Cn,[n[25]||=y(`span`,{class:`text-content-secondary dark:text-content-muted text-xs`},`•`,-1),y(`button`,{onClick:Jn,disabled:k.value,class:f([`glass-card border border-primary rounded-[8px] px-3 py-1.5 text-xs transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium hover:bg-primary/opacity-light`,{"text-primary border-primary cursor-pointer":!k.value,"text-content-secondary dark:text-content-muted border-stroke-subtle dark:border-stroke cursor-not-allowed opacity-50":k.value}])},s(k.value?`Loading...`:`Load ${Math.min(200,Z-E.value)} more`),11,wn),y(`span`,Tn,`(`+s(E.value)+`/`+s(Z)+` max)`,1)])):m(``,!0)]),y(`div`,En,[y(`button`,{onClick:n[2]||=e=>--C.value,disabled:C.value<=1,class:f([`glass-card border rounded-[10px] px-3 py-2 text-sm transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium prev-next-btn`,{"border-stroke-subtle dark:border-stroke text-content-muted cursor-not-allowed opacity-50":C.value<=1,"border-stroke-subtle dark:border-stroke text-content-primary hover:border-primary dark:hover:border-primary hover:text-primary hover:bg-primary/opacity-light":C.value>1}])},[...n[26]||=[y(`span`,{class:`hidden sm:inline`},`Previous`,-1),y(`span`,{class:`sm:hidden`},`‹`,-1)]],10,Dn),y(`div`,On,[C.value>3?(i(),b(`button`,{key:0,onClick:n[3]||=e=>C.value=1,class:`glass-card border border-stroke-subtle dark:border-stroke hover:border-primary dark:hover:border-primary rounded-[8px] px-3 py-2 text-sm text-content-primary hover:text-primary hover:bg-primary/opacity-light transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium`},` 1 `)):m(``,!0),C.value>4?(i(),b(`span`,kn,`...`)):m(``,!0),(i(!0),b(v,null,t(Array.from({length:Math.min(5,G.value)},(e,t)=>Math.max(1,Math.min(C.value-2,G.value-4))+t).filter(e=>e<=G.value),e=>(i(),b(`button`,{key:e,onClick:t=>C.value=e,class:f([`glass-card border rounded-[8px] px-3 py-2 text-sm transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium page-number`,{"border-primary bg-primary/opacity-light text-primary":C.value===e,"border-stroke-subtle dark:border-stroke text-content-primary hover:border-primary dark:hover:border-primary hover:text-primary hover:bg-primary/opacity-light":C.value!==e}])},s(e),11,An))),128)),C.valueC.value=G.value,class:`glass-card border border-stroke-subtle dark:border-stroke hover:border-primary dark:hover:border-primary rounded-[8px] px-3 py-2 text-sm text-content-primary hover:text-primary hover:bg-primary/opacity-light transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium`},s(G.value),1)):m(``,!0)]),y(`button`,{onClick:n[5]||=e=>C.value+=1,disabled:C.value>=G.value,class:f([`glass-card border rounded-[10px] px-3 py-2 text-sm transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium prev-next-btn`,{"border-stroke-subtle dark:border-stroke text-content-muted cursor-not-allowed opacity-50":C.value>=G.value,"border-stroke-subtle dark:border-stroke text-content-primary hover:border-primary dark:hover:border-primary hover:text-primary hover:bg-primary/opacity-light":C.value(i(),b(`div`,null,[h(pe),y(`div`,Bn,[h(Fe),h(K)]),h(zn)]))}});export{Vn as default}; \ No newline at end of file +import{C as e,D as t,N as n,P as r,T as i,U as a,X as o,_t as s,c,f as l,gt as u,h as d,ht as f,j as p,l as m,m as h,o as g,p as _,r as v,s as y,u as b,x,y as S,z as C}from"./runtime-core.esm-bundler-CINEgm0a.js";import{a as w,l as T}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as ee}from"./packets-CItQO6OO.js";import{t as E}from"./system-CuO1gaHr.js";import{t as D}from"./dataService-C8lExiaM.js";import{t as O}from"./Spinner-CMJUE3iy.js";import{t as k}from"./websocket-D8vz2gnn.js";import{c as A,d as j,s as te,t as M}from"./index-DF5glAZc.js";import{d as N,f as P,g as F,l as ne,n as I,o as re,s as ie,t as ae,u as oe}from"./ChartCard-D5XCldya.js";import{n as se,t as ce}from"./SignalBars-CwCyvrs-.js";import{t as le}from"./PacketDetailsModal-Cp96QhHp.js";var ue={class:`sparkline-card`},de={class:`card-header`},L={class:`card-title`},R={class:`card-values`},z={class:`card-chart`},B=j(d({name:`ChartSparkline`,__name:`ChartSparkline`,props:{title:{},value:{},color:{},data:{default:()=>[]},showChart:{type:Boolean,default:!0},secondaryValue:{default:void 0},secondaryLabel:{default:``},secondaryColor:{default:``},secondaryData:{default:()=>[]}},setup(t){ie.register(re,N,P,oe,ne,F);let n=t,r=a(null),o=a(null),c=e=>{let t=e.trim();if(typeof window>`u`)return t;let n=t;for(let e=0;e<4&&n.startsWith(`var(`);e++){let e=n.match(/^var\(\s*(--[\w-]+)\s*(?:,\s*([^\)]+))?\s*\)$/);if(!e)break;let[,t,r]=e;n=window.getComputedStyle(document.documentElement).getPropertyValue(t).trim()||(r?.trim()??n)}return n},l=e=>{if(e.length<3)return e;let t=Math.min(15,Math.max(3,Math.floor(e.length*.2))),n=[];for(let r=0;re+t,0)/s.length)}let r=Math.min(12,n.length),i=n.length/r,a=[];for(let e=0;e!n.data||n.data.length===0?[]:l(n.data)),f=g(()=>!n.secondaryData||n.secondaryData.length===0?[]:l(n.secondaryData)),h=()=>{if(!r.value)return;let e=r.value.getContext(`2d`);if(!e)return;o.value&&=(o.value.destroy(),null);let t=d.value;if(t.length<2)return;let i=[{data:t,borderColor:c(n.color),borderWidth:2.5,fill:!1,tension:.4,pointRadius:0,pointHoverRadius:0}],a=f.value;a.length>=2&&n.secondaryColor&&i.push({data:a,borderColor:c(n.secondaryColor),borderWidth:2,borderDash:[4,3],fill:!1,tension:.4,pointRadius:0,pointHoverRadius:0}),o.value=C(new ie(e,{type:`line`,data:{labels:t.map((e,t)=>t.toString()),datasets:i},options:{responsive:!0,maintainAspectRatio:!1,animation:{duration:800,easing:`easeOutQuart`},plugins:{legend:{display:!1},tooltip:{enabled:!1}},scales:{x:{display:!1,grid:{display:!1}},y:{display:!1,grid:{display:!1},grace:`10%`}},elements:{line:{capBezierPoints:!0}}}}))},_=()=>{if(!o.value){h();return}let e=d.value;if(e.length<2)return;o.value.data.labels=e.map((e,t)=>t.toString()),o.value.data.datasets[0].data=e;let t=f.value;t.length>=2&&n.secondaryColor&&(o.value.data.datasets.length<2?o.value.data.datasets.push({data:t,borderColor:c(n.secondaryColor),borderWidth:2,borderDash:[4,3],fill:!1,tension:.4,pointRadius:0,pointHoverRadius:0}):o.value.data.datasets[1].data=t),o.value.update(`default`)};return p(()=>n.data,()=>{S(()=>_())},{deep:!0}),p(()=>n.color,()=>{o.value&&(o.value.data.datasets[0].borderColor=c(n.color),o.value.update(`none`))}),p(()=>n.secondaryColor,()=>{o.value&&o.value.data.datasets.length>1&&(o.value.data.datasets[1].borderColor=c(n.secondaryColor),o.value.update(`none`))}),e(()=>{S(()=>h())}),x(()=>{o.value&&=(o.value.destroy(),null)}),(e,n)=>(i(),b(`div`,ue,[y(`div`,de,[y(`p`,L,s(t.title),1),y(`div`,R,[y(`span`,{class:`card-value`,style:u({color:t.color})},s(typeof t.value==`number`?t.value.toLocaleString():t.value),5),t.secondaryValue===void 0?m(``,!0):(i(),b(`span`,{key:0,class:`card-secondary-value`,style:u({color:t.secondaryColor})},s(t.secondaryLabel)+s(typeof t.secondaryValue==`number`?t.secondaryValue.toLocaleString():t.secondaryValue),5))])]),y(`div`,z,[t.showChart?(i(),b(`canvas`,{key:0,ref_key:`canvasRef`,ref:r},null,512)):m(``,!0)])]))}}),[[`__scopeId`,`data-v-9b0980f5`]]),fe={class:`grid grid-cols-2 md:grid-cols-3 lg:grid-cols-7 gap-3 lg:gap-4 mb-5 stats-cards-container`},pe=j(d({name:`StatsCards`,__name:`StatsCards`,setup(t){let n={uptime:`var(--color-primary)`,rx:`var(--color-primary)`,forward:`var(--color-secondary)`,dropped:`var(--color-accent-red)`,policy:`var(--color-accent-cyan)`,crcErrors:`var(--color-accent-red)`,hashCache:`var(--color-secondary)`},r=ee(),a=E(),o=D(),s=e=>{let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}d ${n}h`:n>0?`${n}h ${r}m`:`${r}m`},c=g(()=>{let e=r.packetStats,t=a.stats?.uptime_seconds||0,n=e?.total_packets||0,i=e?.dropped_packets||0,o=e?.drop_reasons?.reduce((e,t)=>typeof t?.reason==`string`&&t.reason.startsWith(`Policy blocked packet`)?e+(t.count||0):e,0)||0;return{packetsReceived:n,packetsForwarded:e?.transmitted_packets||0,uptimeFormatted:s(t),droppedPackets:i,policyEvents:o,crcErrorCount:r.crcErrorCount,hashCacheSize:r.systemStats?.duplicate_cache_size??0}}),l=g(()=>r.sparklineData);return e(()=>{o.ensure(`sparklines`)}),(e,t)=>(i(),b(`div`,fe,[h(B,{title:`Up Time`,value:c.value.uptimeFormatted,color:n.uptime,data:[],showChart:!1,class:`stat-card`},null,8,[`value`,`color`]),h(B,{title:`RX Packets`,value:c.value.packetsReceived,color:n.rx,data:l.value.totalPackets,class:`stat-card`},null,8,[`value`,`color`,`data`]),h(B,{title:`Forward`,value:c.value.packetsForwarded,color:n.forward,data:l.value.transmittedPackets,class:`stat-card`},null,8,[`value`,`color`,`data`]),h(B,{title:`Dropped`,value:c.value.droppedPackets,color:n.dropped,data:l.value.droppedPackets,class:`stat-card`},null,8,[`value`,`color`,`data`]),h(B,{title:`Policy Events`,value:c.value.policyEvents,color:n.policy,data:l.value.policyEvents,class:`stat-card`},null,8,[`value`,`color`,`data`]),h(B,{title:`CRC Errors`,value:c.value.crcErrorCount,color:n.crcErrors,data:l.value.crcErrors,class:`stat-card`},null,8,[`value`,`color`,`data`]),h(B,{title:`Hash Cache`,value:c.value.hashCacheSize,color:n.hashCache,showChart:!1,class:`stat-card`},null,8,[`value`,`color`])]))}}),[[`__scopeId`,`data-v-c0acbf34`]]),V={class:`glass-card rounded-[10px] p-4 lg:p-6`},H={key:0,class:`absolute inset-0 flex items-center justify-center`},U={key:1,class:`h-full flex flex-col`},me={key:0,class:`absolute top-2 left-1/2 -translate-x-1/2 bg-surface dark:bg-surface-elevated border border-stroke-subtle dark:border-stroke rounded-lg px-3 py-2 z-10 pointer-events-none min-w-48`},W={class:`text-content-primary text-sm font-medium mb-1`},he={class:`text-content-primary`},ge={class:`flex-1 flex items-end justify-evenly gap-4 px-4`},_e=[`onMouseenter`],ve={class:`text-content-primary text-xs sm:text-sm font-semibold text-center w-full pb-1`},G={class:`text-content-secondary dark:text-content-muted text-xs mt-2 text-center`},ye={key:0,class:`mt-4 flex flex-wrap justify-center gap-3 sm:gap-4 px-2 sm:px-4 text-[10px] sm:text-xs text-content-secondary dark:text-content-muted`},be={class:`truncate text-left`},xe={key:1,class:`mt-3 text-xs text-content-secondary dark:text-content-muted text-center`},K=j(d({name:`PacketTypesChart`,__name:`PacketTypesChart`,setup(r){let o=(e,t)=>typeof window>`u`?t:window.getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t,c=a([]),l=ee(),d=k(),f=a(!0),_=a(!1),x=a(null),S=a(`Connecting...`),C=a(null),w=[{name:`Payload`,types:[`Plain Text Message`,`Group Text Message`,`Group Datagram`,`Multi-part Packet`],subColors:[o(`--color-primary`,`deepskyblue`),o(`--openhop-blue-light`,`lightskyblue`),o(`--color-badge-cyan-text`,`dodgerblue`),o(`--color-badge-cyan-bg`,`lightblue`)]},{name:`Requests`,types:[`Request`,`Response`,`Anonymous Request`],subColors:[o(`--color-accent-green`,`limegreen`),o(`--color-accent-green-bg`,`lightgreen`),o(`--color-glass-green-border`,`mediumseagreen`)]},{name:`Control`,types:[`Node Advertisement`,`Acknowledgment`,`Returned Path`],subColors:[o(`--color-accent-cyan`,`cyan`),o(`--color-accent-cyan-bg`,`paleturquoise`),o(`--color-primary-bg`,`khaki`)]},{name:`Routing`,types:[`Trace`],subColors:[o(`--color-secondary`,`violet`)]},{name:`Reserved`,types:[`Reserved Type 11`,`Reserved Type 12`,`Reserved Type 13`],subColors:[o(`--color-text-muted`,`gray`),o(`--color-border-hover`,`darkgray`),o(`--color-border`,`silver`)]}],T=g(()=>w.map(e=>{let t=c.value.filter(t=>e.types.some(e=>t.name.includes(e)||t.name===e)).sort((e,t)=>t.count-e.count).map((t,n)=>({...t,color:e.subColors[n%e.subColors.length]}));return{name:e.name,color:e.subColors[0],items:t,total:t.reduce((e,t)=>e+t.count,0)}}).filter(e=>e.total>0)),E=g(()=>Math.max(...T.value.map(e=>e.total),1)),D=g(()=>T.value.reduce((e,t)=>e+t.total,0)),O=async()=>{S.value=`Connecting...`,x.value=null,f.value||(_.value=!0);try{let e=await I(`/packet_type_graph_data`,void 0,{onPhaseChange:e=>{S.value=e===`receiving`?`Receiving data...`:`Connecting...`}});if(e?.success&&e?.data){let t=e.data;if(t?.series){let e=[];t.series.forEach((t,n)=>{let r=0;t.data&&Array.isArray(t.data)&&(r=t.data.reduce((e,t)=>e+(t[1]||0),0)),r>0&&e.push({name:t.name||`Type ${t.type}`,type:t.type,count:r,color:``})}),c.value=e,f.value=!1,_.value=!1}else x.value=`No series data in server response`,f.value=!1,_.value=!1}else x.value=`Invalid response from server`,f.value=!1,_.value=!1}catch(e){x.value=e instanceof Error?e.message:`Failed to load data`,f.value=!1,_.value=!1}},A={0:`Request`,1:`Response`,2:`Plain Text Message`,3:`Acknowledgment`,4:`Node Advertisement`,5:`Group Text Message`,6:`Group Datagram`,7:`Anonymous Request`,8:`Returned Path`,9:`Trace`,10:`Multi-part Packet`,15:`Custom Packet`},j=()=>{let e=l.packetTypeBreakdown;!e||e.length===0||(c.value=e.map(e=>({name:A[Number(e.type)]||`Type ${e.type}`,type:e.type,count:e.count,color:``})),f.value=!1,x.value=null)},te=e=>Math.max(e/E.value*90,2),N=(e,t)=>t===0?0:e/t*100;return e(()=>{O()}),p(()=>l.packetTypeBreakdown,()=>j(),{deep:!0,immediate:!0}),M(O,{intervalMs:3e4,enabled:()=>!d.isConnected,immediate:!0}),(e,r)=>(i(),b(`div`,V,[r[2]||=y(`div`,{class:`flex items-baseline justify-between mb-3 lg:mb-4`},[y(`h3`,{class:`text-content-primary text-lg lg:text-xl font-semibold`},` Packet Types `),y(`p`,{class:`text-content-secondary dark:text-content-muted text-xs lg:text-sm uppercase`},` Distribution by Type `)],-1),h(ae,{class:`h-48 lg:h-56`,"is-loading":f.value,"is-updating":_.value,error:x.value,status:S.value,onRetry:O},{default:n(()=>[T.value.length===0&&!f.value&&!x.value?(i(),b(`div`,H,[...r[1]||=[y(`div`,{class:`text-content-secondary dark:text-content-primary text-sm lg:text-base`},` No packet data available `,-1)]])):m(``,!0),T.value.length>0?(i(),b(`div`,U,[C.value?(i(),b(`div`,me,[y(`div`,W,s(C.value.name)+` · `+s(C.value.total.toLocaleString()),1),(i(!0),b(v,null,t(C.value.items,e=>(i(),b(`div`,{key:e.type,class:`flex justify-between gap-4 text-xs text-content-secondary dark:text-content-muted`},[y(`span`,null,s(e.name),1),y(`span`,he,s(e.count.toLocaleString()),1)]))),128))])):m(``,!0),y(`div`,ge,[(i(!0),b(v,null,t(T.value,e=>(i(),b(`div`,{key:e.name,class:`flex flex-col items-center flex-1 max-w-32 h-full justify-end cursor-pointer`,onMouseenter:t=>C.value=e,onMouseleave:r[0]||=e=>C.value=null},[y(`span`,ve,s(e.total.toLocaleString()),1),y(`div`,{class:`w-full rounded-[5px] transition-all duration-300 ease-out hover:opacity-90 overflow-hidden flex flex-col-reverse`,style:u({height:te(e.total)+`%`,minHeight:`8px`})},[(i(!0),b(v,null,t(e.items,t=>(i(),b(`div`,{key:t.type,style:u({height:N(t.count,e.total)+`%`,backgroundColor:t.color})},null,4))),128))],4),y(`span`,G,s(e.name),1)],40,_e))),128))])])):m(``,!0)]),_:1},8,[`is-loading`,`is-updating`,`error`,`status`]),T.value.length>0?(i(),b(`div`,ye,[(i(!0),b(v,null,t(T.value,e=>(i(),b(`div`,{key:`legend-`+e.name,class:`flex flex-col gap-0.5 min-w-[100px] max-w-[140px] flex-shrink-0`},[(i(!0),b(v,null,t(e.items,e=>(i(),b(`div`,{key:e.type,class:`flex items-center gap-1.5`},[y(`span`,{class:`w-2 h-2 rounded-sm shrink-0`,style:u({backgroundColor:e.color})},null,4),y(`span`,be,s(e.name),1)]))),128))]))),128))])):m(``,!0),T.value.length>0?(i(),b(`div`,xe,` Total: `+s(D.value.toLocaleString())+` packets `,1)):m(``,!0)]))}}),[[`__scopeId`,`data-v-b302d2e6`]]),Se={class:`glass-card rounded-[10px] p-4 lg:p-6`},Ce={class:`mt-3 lg:mt-4 grid grid-cols-2 gap-3 lg:gap-4`},we={class:`text-center`},Te={class:`text-lg lg:text-2xl font-bold text-content-primary`},q={class:`text-center`},Ee={class:`text-lg lg:text-2xl font-bold text-content-primary`},J={class:`mt-2 lg:mt-3 grid grid-cols-3 gap-2 lg:gap-3 text-center`},De={class:`text-xs lg:text-sm font-semibold text-accent-purple flex items-center justify-center gap-1`},Oe={key:0,class:`inline-block w-1.5 h-1.5 rounded-full bg-secondary opacity-70`,title:`Early data - limited uptime`},ke={class:`text-xs text-content-secondary dark:text-content-muted`},Ae={class:`text-xs lg:text-sm font-semibold text-accent-red flex items-center justify-center gap-1`},je={key:0,class:`inline-block w-1.5 h-1.5 rounded-full bg-secondary opacity-70`,title:`Early data - limited uptime`},Me={class:`text-xs text-content-secondary dark:text-content-muted`},Ne={class:`text-xs lg:text-sm font-semibold text-accent-red`},Y=null,Pe=12e4,Fe=j(d({name:`AirtimeUtilizationChart`,__name:`AirtimeUtilizationChart`,setup(t){let r=(e,t)=>typeof window>`u`?t:window.getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t,c={rx:r(`--color-secondary`,`violet`),tx:r(`--color-accent-red`,`tomato`)},u=()=>({gridLine:r(`--color-border-subtle`,`lightgray`),axisLabel:r(`--color-text-muted`,`gray`)}),d=ee(),f=E(),p=a(null),v=a([]),C=a(!1),w=a(!0),T=a(!1),D=a(null),O=a(`Connecting...`),k=a(30),A=a({totalReceived:0,totalTransmitted:0,dropped:0,firstPacketTime:0}),j=a({sf:9,bwHz:62500,cr:5,preamble:17}),te=(e,t=60)=>{if(e.length===0)return[];let n=1-.5**(1/t),r=Math.min(e.length,Math.max(10,Math.floor(t/3))),i=0,a=0;for(let t=0;t(i=n*e.rxUtil+(1-n)*i,a=n*e.txUtil+(1-n)*a,{...e,rxUtil:i,txUtil:a}))},N=g(()=>{let e=d.packetStats?.total_packets||0,t=d.packetStats?.transmitted_packets||0,n=f.stats?.uptime_seconds||0,r=e||A.value.totalReceived,i=t||A.value.totalTransmitted,a=A.value.firstPacketTime>0?Math.floor(Date.now()/1e3)-A.value.firstPacketTime:0,o=n||a,s=Math.max(o/3600,.1);if(s<1){let e=Math.max(o/60,1);return{rxRate:{value:Math.round(r/e*100)/100,label:s<.5?`RX/min (early)`:`RX/min`},txRate:{value:Math.round(i/e*100)/100,label:s<.5?`TX/min (early)`:`TX/min`},confidence:`low`}}let c=Math.round(r/s*100)/100,l=Math.round(i/s*100)/100,u,p;return s<6?(u=`RX/hr (${Math.round(s)}h)`,p=`medium`):s<24?(u=`RX/hr (${Math.round(s)}h)`,p=`high`):(u=`RX/hr`,p=`high`),{rxRate:{value:c,label:u},txRate:{value:l,label:u.replace(`RX`,`TX`)},confidence:p}}),P=async()=>{O.value=`Connecting...`,D.value=null,w.value||(T.value=!0);try{let e=60*1e3,t=Math.floor(Date.now()/1e3),n=t-24*3600,r=f.stats?.config?.radio;r&&(j.value={sf:r.spreading_factor??9,bwHz:r.bandwidth??62500,cr:r.coding_rate??5,preamble:r.preamble_length??17});let i=await I(`/airtime_chart_data`,{start_timestamp:n,end_timestamp:t,bucket_seconds:60,sf:j.value.sf,bw_hz:j.value.bwHz,cr:j.value.cr,preamble:j.value.preamble},{onPhaseChange:e=>{O.value=e===`receiving`?`Receiving data...`:`Connecting...`}});if(!i.success){v.value=[],C.value=!1,w.value=!1,T.value=!1,S(()=>F());return}let a=i.data,o=a.buckets||[];A.value={totalReceived:a.rx_total||0,totalTransmitted:a.tx_total||0,dropped:d.packetStats?.dropped_packets??0,firstPacketTime:o.length>0?o[0].timestamp:t};let s=24*3600/60,c=new Float64Array(s),l=new Float64Array(s);for(let t of o){let r=Math.floor((t.timestamp-n)/60);r>=0&&r[e.rxUtil,e.txUtil]))*1.05;k.value=Math.max(5,Math.ceil(g/5)*5),Y={data:h,yAxisMax:k.value,fetchedAt:Date.now()},C.value=!1,w.value=!1,T.value=!1,D.value=null,S(()=>F())}catch(e){console.error(`Failed to fetch airtime data:`,e),v.value=[],C.value=!1,w.value=!1,T.value=!1,D.value=e instanceof Error?e.message:`Failed to load chart data`,S(()=>F())}},F=()=>{if(!p.value)return;let e=p.value,t=e.getContext(`2d`);if(!t)return;let n=e.parentElement;if(!n)return;let r=n.getBoundingClientRect(),i=r.width,a=r.height;if(e.width=i*window.devicePixelRatio,e.height=a*window.devicePixelRatio,e.style.width=i+`px`,e.style.height=a+`px`,t.scale(window.devicePixelRatio,window.devicePixelRatio),t.clearRect(0,0,i,a),C.value){t.fillStyle=u().axisLabel,t.font=`16px system-ui`,t.textAlign=`center`,t.fillText(`Loading chart data...`,i/2,a/2);return}if(v.value.length===0){t.fillStyle=u().axisLabel,t.font=`16px system-ui`,t.textAlign=`center`,t.fillText(`No data available`,i/2,a/2);return}let o=i-45-20,s=a-40,l=k.value,d=k.value,f=u();t.strokeStyle=f.gridLine,t.lineWidth=1,t.font=`10px system-ui`,t.textAlign=`right`;for(let e=0;e<=5;e++){let n=20+s*e/5;t.beginPath(),t.moveTo(45,n),t.lineTo(i-20,n),t.stroke();let r=l-e/5*d;t.fillStyle=f.axisLabel,t.fillText(`${r.toFixed(0)}%`,40,n+3)}for(let e=0;e<=6;e++){let n=45+o*e/6;t.beginPath(),t.moveTo(n,20),t.lineTo(n,a-20),t.stroke()}v.value.length>1&&(t.strokeStyle=c.rx,t.lineWidth=2,t.beginPath(),v.value.forEach((e,n)=>{let r=45+o*n/(v.value.length-1),i=a-20-Math.min(e.rxUtil,k.value)/d*s;n===0?t.moveTo(r,i):t.lineTo(r,i)}),t.stroke()),v.value.length>1&&(t.strokeStyle=c.tx,t.lineWidth=2,t.beginPath(),v.value.forEach((e,n)=>{let r=45+o*n/(v.value.length-1),i=a-20-Math.min(e.txUtil,k.value)/d*s;n===0?t.moveTo(r,i):t.lineTo(r,i)}),t.stroke())};return M(P,{intervalMs:12e4,immediate:!1}),e(()=>{Y&&Date.now()-Y.fetchedAt{F(),setTimeout(()=>F(),100)}),window.addEventListener(`resize`,F)}),x(()=>{window.removeEventListener(`resize`,F)}),(e,t)=>(i(),b(`div`,Se,[t[3]||=l(`

Airtime Utilization

Activity (Last 24 Hours)

Rx Util
Tx Util
`,3),h(ae,{class:`h-40 lg:h-48`,"is-loading":w.value,"is-updating":T.value,error:D.value,status:O.value,onRetry:P},{default:n(()=>[y(`canvas`,{ref_key:`chartRef`,ref:p,class:`absolute inset-0 w-full h-full`},null,512)]),_:1},8,[`is-loading`,`is-updating`,`error`,`status`]),y(`div`,Ce,[y(`div`,we,[y(`div`,Te,s(o(d).packetStats?.total_packets||A.value.totalReceived),1),t[0]||=y(`div`,{class:`text-xs text-content-secondary dark:text-content-muted uppercase tracking-wide`},` Total Received `,-1)]),y(`div`,q,[y(`div`,Ee,s(o(d).packetStats?.transmitted_packets||A.value.totalTransmitted),1),t[1]||=y(`div`,{class:`text-xs text-content-secondary dark:text-content-muted uppercase tracking-wide`},` Total Transmitted `,-1)])]),y(`div`,J,[y(`div`,null,[y(`div`,De,[_(s(N.value.rxRate.value)+` `,1),N.value.confidence===`low`?(i(),b(`span`,Oe)):m(``,!0)]),y(`div`,ke,s(N.value.rxRate.label),1)]),y(`div`,null,[y(`div`,Ae,[_(s(N.value.txRate.value)+` `,1),N.value.confidence===`low`?(i(),b(`span`,je)):m(``,!0)]),y(`div`,Me,s(N.value.txRate.label),1)]),y(`div`,null,[y(`div`,Ne,s(o(d).packetStats?.dropped_packets||A.value.dropped),1),t[2]||=y(`div`,{class:`text-xs text-content-secondary dark:text-content-muted`},`Dropped`,-1)])])]))}}),[[`__scopeId`,`data-v-dff649e7`]]),Ie={},Le={viewBox:`0 0 20 16`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,"aria-hidden":`true`};function Re(e,t){return i(),b(`svg`,Le,[...t[0]||=[l(``,7)]])}var ze=j(Ie,[[`render`,Re]]),Be=j(d({__name:`HopConnector`,props:{status:{default:`received`}},setup(e){return(t,n)=>(i(),b(`span`,{class:f([`hop-connector`,`hop-connector-${e.status}`]),title:`Rabbit hop`},[h(ze,{class:`hop-rabbit`})],2))}}),[[`__scopeId`,`data-v-5fc98e84`]]),Ve={class:`glass-card w-full max-w-none rounded-[20px] p-6`},He={class:`flex flex-col lg:flex-row lg:justify-between lg:items-center mb-6 gap-4 filter-container`},Ue={class:`flex items-center gap-2 header-info relative`},We={class:`text-content-secondary dark:text-content-muted text-sm packet-count`},Ge=[`title`],Ke={class:`hidden sm:inline`},qe={key:1,class:`text-accent-red text-sm error-indicator`},Je={class:`flex items-center gap-3 lg:flex filter-controls`},Ye={class:`flex flex-col`},Xe=[`value`],Ze={class:`flex flex-col`},Qe=[`value`],$e={class:`flex flex-col`},et={class:`flex flex-col reset-container`},tt=[`disabled`],nt={class:`space-y-4 w-full`},rt=[`onClick`],it={key:0,class:`duplicate-group-banner mb-2 flex items-center justify-between gap-2 rounded-[8px] px-2 py-1`},at={class:`text-[10px] text-content-secondary dark:text-content-muted`},ot={class:`hidden lg:block w-full space-y-2`},st={class:`grid w-full grid-cols-11 gap-2 items-center`},ct={class:`col-span-1 text-content-primary text-sm`},lt={class:`col-span-1 flex items-center gap-2`},ut={class:`flex flex-col`},dt={class:`text-content-primary text-xs`},ft=[`title`],pt={class:`col-span-2`},mt={class:`col-span-1 text-content-primary text-xs`},ht={class:`col-span-1 text-content-primary text-xs`},gt={class:`col-span-1 text-content-primary text-xs flex items-center gap-1`},_t={class:`col-span-1 text-content-primary text-xs`},vt={class:`col-span-1 text-content-primary text-xs`},yt={key:0,class:`flex items-center gap-1`},bt={class:`col-span-2`},xt={class:`flex items-center gap-1`},St={key:0,class:`inline-flex items-center text-[10px] font-medium text-accent-amber`,title:`Policy blocked`},Ct={key:0,class:`mt-1 flex items-center gap-2`},wt=[`onClick`],Tt={key:1,class:`mt-1 text-[10px] text-content-secondary dark:text-content-muted`},Et={key:2,class:`text-accent-red text-[8px] italic truncate`},Dt={class:`grid w-full grid-cols-11 gap-2 items-start`},Ot={class:`col-span-11`},kt={class:`space-y-1`},At={class:`flex items-center gap-2`},jt={class:`text-[9px] text-content-muted`},Mt={class:`flex items-center gap-0.5 flex-wrap`},Nt=[`title`],Pt={key:1,class:`flex items-center gap-1`},Ft={class:`inline-block px-2 py-0.5 rounded bg-badge-cyan-bg text-badge-cyan-text text-xs font-mono`},It={class:`lg:hidden space-y-2`},Lt={class:`mobile-packet-card space-y-3 rounded-[16px] p-4`},Rt={class:`flex items-start justify-between gap-3`},zt={class:`flex items-start gap-3 min-w-0`},Bt={class:`min-w-0`},Vt={class:`flex items-center gap-2 flex-wrap`},Ht={class:`text-content-primary text-xl font-semibold tracking-wide`},Ut={key:0,class:`text-content-secondary dark:text-content-muted text-[10px] font-medium leading-tight`},Wt=[`title`],Gt={class:`flex items-start gap-2 flex-shrink-0`},Kt={class:`flex flex-col items-end`},qt={class:`text-content-secondary dark:text-content-muted text-xs`},Jt={class:`mt-1 flex items-center gap-1 justify-end`},Yt={key:0,class:`inline-flex items-center text-[10px] font-medium text-accent-amber`,title:`Policy blocked`},Xt=[`title`,`aria-label`,`onClick`],Zt={class:`absolute -top-1 -right-1 min-w-[18px] h-[18px] px-1 rounded-full bg-surface dark:bg-surface-elevated border border-primary/opacity-heavy text-[10px] leading-none font-semibold text-primary flex items-center justify-center`},Qt={class:`space-y-2`},$t={class:`flex items-center gap-2`},en={class:`text-content-muted text-xs`},tn={key:0,class:`flex flex-wrap items-center gap-1.5`},nn=[`title`],rn={key:1,class:`flex items-center gap-1`},an={class:`inline-block px-2 py-0.5 rounded bg-badge-cyan-bg text-badge-cyan-text text-xs font-mono font-semibold`},on={class:`pt-3 border-t border-stroke-subtle/70 dark:border-stroke/opacity-heavy`},sn={class:`mobile-metrics-grid grid gap-0`},cn={class:`mobile-metric-cell`},ln={class:`text-content-primary text-base font-semibold`},un={class:`mobile-metric-cell`},dn={class:`text-content-primary text-base font-semibold`},fn={class:`mobile-metric-cell`},pn={class:`flex items-center gap-1 min-w-0`},mn={class:`text-content-primary text-[11px] font-medium leading-tight`},hn={class:`mobile-metric-cell`},gn={class:`flex items-center gap-1`},_n={class:`text-content-primary text-base font-semibold`},vn={key:0,class:`text-accent-red text-xs italic`},yn={key:0,class:`flex justify-between items-center mt-6 pt-4 border-t border-stroke-subtle dark:border-stroke pagination-container`},bn={class:`flex items-center gap-4 pagination-info`},xn={class:`text-content-secondary dark:text-content-muted text-sm`},Sn={class:`text-xs`},Cn={key:0,class:`flex items-center gap-2 load-more-section`},wn=[`disabled`],Tn={class:`text-content-secondary dark:text-content-muted text-xs load-more-count`},En={class:`flex items-center gap-2 pagination-controls`},Dn=[`disabled`],On={class:`flex items-center gap-1 page-numbers`},kn={key:1,class:`text-content-secondary dark:text-content-muted text-sm px-2 ellipsis`},An=[`onClick`],jn={key:2,class:`text-content-secondary dark:text-content-muted text-sm px-2 ellipsis`},Mn=[`disabled`],Nn={key:1,class:`flex justify-center mt-6 pt-4 border-t border-stroke-subtle dark:border-stroke`},Pn={class:`flex items-center gap-4`},Fn={class:`text-content-secondary dark:text-content-muted text-sm`},In={class:`text-content-secondary dark:text-content-muted text-xs`},Ln={key:2,class:`flex justify-center mt-6 pt-4 border-t border-stroke-subtle dark:border-stroke`},Rn={class:`flex items-center gap-2`},X=10,Z=1e3,zn=j(d({name:`PacketTable`,__name:`PacketTable`,setup(n){let u=ee(),{getSignalQualityFromSNR:d}=se(),S=D(),C=a(1),E=a(100),k=a(!1),j=a(!1),M=null;p(()=>u.isLoading,e=>{e?(M&&=(clearTimeout(M),null),j.value=!0):M=window.setTimeout(()=>{j.value=!1,M=null},600)});let N=a(null),P=a(!1),F=a(null),ne=a(0),I=(e,t)=>!e||!t?!1:e.packet_hash===t.packet_hash&&e.timestamp===t.timestamp&&e.type===t.type&&e.route===t.route&&e.src_hash===t.src_hash&&e.dst_hash===t.dst_hash&&e.length===t.length,re=async(e,t)=>{if((e.id||e.packet_hash)&&(!e.header||!e.raw_packet)){let n=++ne.value;try{let r=e.id==null?await u.getPacketByHash(e.packet_hash):await u.getPacketById(e.id);r&&ne.value===n&&N.value&&I(N.value,e)&&F.value===t&&(N.value={...N.value,...r})}catch{}}},ie=async e=>{let t=W.value.findIndex(t=>I(t,e));F.value=t>=0?t:null,N.value=e,P.value=!0,await re(e,F.value)},ae=async e=>{let t=W.value[e];t&&(F.value=e,N.value=t,P.value=!0,await re(t,e))},oe=async()=>{F.value==null||F.value<=0||await ae(F.value-1)},ue=async()=>{F.value==null||F.value>=W.value.length-1||await ae(F.value+1)},de=()=>{P.value=!1,N.value=null,F.value=null,ne.value+=1},L=a(te(`packetTable_selectedType`,`all`)),R=a(te(`packetTable_selectedRoute`,`all`)),z=a(!1),B=a(null),fe=[`all`,`0`,`1`,`2`,`3`,`4`,`5`,`6`,`7`,`8`,`9`,`10`,`11`],pe=[`all`,`1`,`2`],V=a(new Set);p(L,e=>{A(`packetTable_selectedType`,e),C.value=1}),p(R,e=>{A(`packetTable_selectedRoute`,e),C.value=1}),p(z,()=>{C.value=1});let H=g(()=>{let e=u.recentPackets;if(L.value!==`all`){let t=parseInt(L.value);e=e.filter(e=>e.type===t)}if(R.value!==`all`){let t=parseInt(R.value);e=e.filter(e=>e.route===t)}return z.value&&B.value!==null&&(e=e.filter(e=>e.timestamp>=B.value)),e}),U=g(()=>{let e=new Map,t=[];return H.value.forEach((n,r)=>{let i=n.packet_hash?.trim(),a=i?`hash:${i}`:`nohash:${n.timestamp}:${r}`,o=e.get(a);if(o){o.packets.push(n);return}let s={key:a,packetHash:i??``,packets:[n],primary:n,duplicates:[],duplicateCount:0,hasDuplicates:!1};e.set(a,s),t.push(s)}),t.map(e=>{let t=e.packets.findIndex(e=>!e.is_duplicate),n=t>=0?t:e.packets.findIndex(e=>e.transmitted&&!e.drop_reason),r=n>=0?n:e.packets.findIndex(e=>e.transmitted),i=r>=0?r:0,a=e.packets[i],o=e.packets.filter((e,t)=>t!==i);return{...e,primary:a,duplicates:o,duplicateCount:o.length,hasDuplicates:o.length>0}})}),me=g(()=>{let e=(C.value-1)*X,t=e+X;return U.value.slice(e,t)}),W=g(()=>U.value.flatMap(e=>[e.primary,...e.duplicates])),he=g(()=>{let e=N.value;return e?U.value.find(t=>t.packets.some(t=>I(t,e)))?.packets??[]:[]}),ge=g(()=>F.value!=null&&F.value>0),_e=g(()=>F.value!=null&&F.value{let e=new Map;for(let t of me.value)e.set(t.primary,{group:t,isPrimary:!0,duplicateIndex:0}),t.duplicates.forEach((n,r)=>{e.set(n,{group:t,isPrimary:!1,duplicateIndex:r+1})});return e}),G=g(()=>Math.ceil(U.value.length/X));p(U,e=>{let t=new Set(e.filter(e=>e.hasDuplicates).map(e=>e.key)),n=new Set([...V.value].filter(e=>t.has(e)));n.size!==V.value.size&&(V.value=n),G.value>0&&C.value>G.value&&(C.value=G.value)},{immediate:!0}),p([W,N,P],([e,t,n])=>{if(!n||!t)return;let r=e.findIndex(e=>I(e,t));F.value=r>=0?r:null},{immediate:!0});let ye=g(()=>C.value===G.value),be=g(()=>u.recentPackets.length>=E.value&&E.valueye.value&&be.value&&!k.value),K=e=>ve.value.get(e),Se=e=>K(e)?.isPrimary??!0,Ce=e=>!Se(e),we=e=>Te(e)&&J(e),Te=e=>{let t=K(e);return!!(t?.isPrimary&&t.group.hasDuplicates)},q=e=>{let t=K(e);return t?.isPrimary?t.group.duplicateCount:0},Ee=e=>{let t=q(e);return`${J(e)?`Hide`:`Show`} ${t} duplicate${t===1?``:`s`}`},J=e=>{let t=K(e);return t?.isPrimary?V.value.has(t.group.key):!1},De=e=>{let t=K(e);return!t||t.isPrimary?0:t.duplicateIndex},Oe=e=>K(e)?.group.packets.length??1,ke=e=>De(e)===1,Ae=e=>e.hasDuplicates&&V.value.has(e.key)?[e.primary,...e.duplicates]:[e.primary],je=e=>{let t=K(e);if(!t?.isPrimary||!t.group.hasDuplicates)return;let n=new Set(V.value);n.has(t.group.key)?n.delete(t.group.key):n.add(t.group.key),V.value=n},Me=e=>new Date(e*1e3).toLocaleTimeString(void 0,{hour12:!0}),Ne=e=>({0:`REQ`,1:`RESPONSE`,2:`TXT_MSG`,3:`ACK`,4:`ADVERT`,5:`GRP_TXT`,6:`GRP_DATA`,7:`ANON_REQ`,8:`PATH`,9:`TRACE`,10:`MULTI_PART`,11:`CONTROL`})[e]||`TYPE_${e}`,Y=e=>({0:`T-Flood`,1:`Flood`,2:`Direct`,3:`T-Direct`})[e]||`Route ${e}`,Pe=e=>e.transmitted?`text-accent-green`:`text-primary`,Fe=e=>e.drop_reason?`Dropped`:e.transmitted?`Forward`:`Received`,Ie=e=>{let t=e.drop_reason?.toLowerCase();return!!(t&&t.includes(`policy blocked`))},Le=e=>(Ie(e),``),Re=e=>e===1?`bg-badge-cyan-bg text-badge-cyan-text`:`bg-badge-neutral-bg text-badge-neutral-text`,ze=e=>({0:`bg-primary`,1:`bg-accent-green`,2:`bg-secondary`,3:`bg-accent-purple`,4:`bg-accent-red`,5:`bg-accent-cyan`,6:`bg-primary`,7:`bg-accent-purple`,8:`bg-accent-green`,9:`bg-secondary`})[e]||`bg-background-mute`,zn=e=>({0:`border-l-primary`,1:`border-l-accent-green`,2:`border-l-accent-amber`,3:`border-l-accent-purple`,4:`border-l-accent-red`,5:`border-l-accent-cyan`,6:`border-l-primary`,7:`border-l-accent-purple`,8:`border-l-accent-green`,9:`border-l-accent-amber`})[e]||`border-l-gray-500`,Bn=e=>!e.transmitted||!e.lbt_attempts||e.lbt_attempts===0?`status-dot-green`:e.lbt_attempts===1?`status-dot-muted`:e.lbt_attempts===2?`status-dot-amber`:`status-dot-red`,Vn=e=>e>=1e3?(e/1e3).toFixed(2)+`s`:e.toFixed(1)+`ms`,Hn=e=>{if(!e)return[];if(Array.isArray(e))return e;if(typeof e==`string`)try{let t=JSON.parse(e);return typeof t==`string`?JSON.parse(t):Array.isArray(t)?t:[]}catch{return[]}return[]},Q=e=>{let t=Hn(e.original_path),n=Hn(e.forwarded_path),r=e.transmitted&&n.length>0?n:t.length>0?t:n;return r.length===0?null:{hops:r.length-1,nodes:r.map(e=>e.toUpperCase())}},Un=e=>e<=0?`Direct`:`${e} hop${e>1?`s`:``}`,$=e=>{if(e.type!==4||!e.payload)return null;try{let t=e.payload.replace(/\s+/g,``).toUpperCase(),n=t,r=0;if(t.length/2>=100)if(t.length>200)n=t.slice(200),r=0;else return null;if(n.length>=2){let e=parseInt(n.slice(0,2),16);r+=2;let t=!!(e&16),i=!!(e&32),a=!!(e&64);if(!(e&128))return null;if(t&&n.length>=r+16&&(r+=16),i&&n.length>=r+4&&(r+=4),a&&n.length>=r+4&&(r+=4),n.length>r){let e=(n.slice(r).match(/.{2}/g)||[]).map(e=>{let t=parseInt(e,16);return t>=32&&t<=126?String.fromCharCode(t):`.`}).join(``).replace(/\.*$/,``);return e.length>0?e:null}}}catch(e){console.error(`Error parsing ADVERT node name:`,e)}return null},Wn=()=>{L.value=`all`,R.value=`all`,z.value=!1,B.value=null,C.value=1},Gn=()=>{z.value?(z.value=!1,B.value=null):(z.value=!0,B.value=Date.now()/1e3),C.value=1},Kn=g(()=>B.value?new Date(B.value*1e3).toLocaleTimeString(void 0,{hour12:!0}):``),qn=async e=>{try{let t=e||E.value;await u.fetchRecentPackets({limit:t})}catch(e){console.error(`Error fetching packet data:`,e)}},Jn=async()=>{if(!(k.value||E.value>=Z)){k.value=!0;try{let e=Math.min(E.value+200,Z);E.value=e,await qn(e)}catch(e){console.error(`Error loading more records:`,e)}finally{k.value=!1}}};return e(()=>{S.ensure(`recentPackets`)}),x(()=>{M&&clearTimeout(M)}),(e,n)=>(i(),b(v,null,[y(`div`,Ve,[y(`div`,He,[y(`div`,Ue,[n[7]||=y(`h3`,{class:`text-content-primary text-xl font-semibold`},` Recent Packets `,-1),y(`span`,We,` (`+s(H.value.length)+` of `+s(o(u).recentPackets.length)+`) `,1),z.value?(i(),b(`span`,{key:0,class:`text-primary text-xs sm:text-sm bg-primary/opacity-light px-2 py-1 rounded-md border border-primary/opacity-medium live-mode-badge whitespace-nowrap`,title:`Filter activated at ${Kn.value}`},[y(`span`,Ke,`Live Mode (since `+s(Kn.value)+`)`,1),n[6]||=y(`span`,{class:`sm:hidden`},`Live`,-1)],8,Ge)):m(``,!0),o(u).error?(i(),b(`span`,qe,s(o(u).error),1)):m(``,!0)]),y(`div`,Je,[y(`div`,Ye,[n[8]||=y(`label`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},`Type`,-1),r(y(`select`,{"onUpdate:modelValue":n[0]||=e=>L.value=e,class:`glass-card border border-stroke-subtle dark:border-stroke rounded-[10px] px-3 py-2 text-content-primary text-sm focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary/opacity-medium transition-all duration-200 min-w-[120px] cursor-pointer hover:border-primary/opacity-heavy dark:hover:border-primary/opacity-heavy`},[(i(),b(v,null,t(fe,e=>y(`option`,{key:e,value:e,class:`bg-surface dark:bg-surface-elevated text-content-primary`},s(e===`all`?`All Types`:`Type ${e} (${Ne(parseInt(e))})`),9,Xe)),64))],512),[[w,L.value]])]),y(`div`,Ze,[n[9]||=y(`label`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},`Route`,-1),r(y(`select`,{"onUpdate:modelValue":n[1]||=e=>R.value=e,class:`glass-card border border-stroke-subtle dark:border-stroke rounded-[10px] px-3 py-2 text-content-primary text-sm focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary/opacity-medium transition-all duration-200 min-w-[120px] cursor-pointer hover:border-primary/opacity-heavy dark:hover:border-primary/opacity-heavy`},[(i(),b(v,null,t(pe,e=>y(`option`,{key:e,value:e,class:`bg-surface dark:bg-surface-elevated text-content-primary`},s(e===`all`?`All Routes`:`Route ${e} (${Y(parseInt(e))})`),9,Qe)),64))],512),[[w,R.value]])]),y(`div`,$e,[n[10]||=y(`label`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},`Filter`,-1),y(`button`,{onClick:Gn,class:f([`glass-card border rounded-[10px] px-4 py-2 text-sm transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium min-w-[120px]`,{"border-primary bg-primary/opacity-light text-primary":z.value,"border-stroke-subtle dark:border-stroke text-content-secondary dark:text-content-muted hover:border-primary dark:hover:border-primary hover:text-content-primary dark:hover:text-content-primary hover:bg-primary/opacity-light":!z.value}])},s(z.value?`New Only`:`Show New`),3)]),y(`div`,et,[n[11]||=y(`label`,{class:`text-transparent text-xs mb-1`},`.`,-1),y(`button`,{onClick:Wn,class:f([`glass-card border border-stroke-subtle dark:border-stroke hover:border-primary dark:hover:border-primary rounded-[10px] px-4 py-2 text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary text-sm transition-all duration-200 focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary/opacity-medium`,{"opacity-50 cursor-not-allowed hover:border-stroke-subtle dark:hover:border-stroke hover:text-content-secondary dark:hover:text-content-muted":L.value===`all`&&R.value===`all`&&!z.value,"hover:bg-primary/opacity-light":L.value!==`all`||R.value!==`all`||z.value}]),disabled:L.value===`all`&&R.value===`all`&&!z.value},` Reset `,10,tt)])])]),n[30]||=l(``,1),y(`div`,nt,[(i(!0),b(v,null,t(me.value,e=>(i(),b(`div`,{key:e.key,class:f([`space-y-2 w-full`,e.hasDuplicates?`duplicate-group-container rounded-[12px] overflow-hidden`:``])},[(i(!0),b(v,null,t(Ae(e),(r,a)=>(i(),b(`div`,{key:`${e.key}_${r.packet_hash}_${r.timestamp}_${a}`,class:f([`packet-row w-full border-b border-stroke-subtle dark:border-dark-border/50 pb-4 hover:bg-background-mute dark:hover:bg-stroke/opacity-subtle transition-colors duration-150 cursor-pointer rounded-[10px] p-2 border-l-4`,[zn(r.type),Le(r),Ce(r)?`duplicate-packet-row`:``,we(r)?`duplicate-group-expanded-row`:``]]),onClick:e=>ie(r)},[ke(r)?(i(),b(`div`,it,[n[12]||=y(`span`,{class:`text-[10px] font-semibold uppercase tracking-wide text-primary`},`Duplicate Group`,-1),y(`span`,at,s(Oe(r)-1)+` duplicate`+s(Oe(r)-1==1?``:`s`),1)])):m(``,!0),y(`div`,ot,[y(`div`,st,[y(`div`,ct,s(Me(r.timestamp)),1),y(`div`,lt,[y(`div`,{class:f([`w-2 h-2 rounded-full`,ze(r.type)])},null,2),y(`div`,ut,[y(`span`,dt,s(Ne(r.type)),1),r.type===4&&$(r)?(i(),b(`span`,{key:0,class:`text-accent-red/opacity-heavy text-[10px] font-medium max-w-[80px] truncate`,title:$(r)||void 0},s($(r)),9,ft)):m(``,!0)])]),y(`div`,pt,[y(`span`,{class:f([`inline-block px-2 py-1 rounded text-xs font-medium`,Re(r.route)])},s(Y(r.route)),3)]),y(`div`,mt,s(r.length)+`B `,1),y(`div`,ht,s(r.rssi==null?`N/A`:r.rssi.toFixed(0)+` dBm`),1),y(`div`,gt,[r.rssi==null?m(``,!0):(i(),c(ce,{key:0,bars:o(d)(r.snr).bars,color:o(d)(r.snr).color},null,8,[`bars`,`color`])),_(` `+s(r.snr==null?`N/A`:r.snr.toFixed(1)+`dB`),1)]),y(`div`,_t,s(r.score==null?`N/A`:r.score.toFixed(2)),1),y(`div`,vt,[Number(r.tx_delay_ms)>0?(i(),b(`div`,yt,[r.transmitted?(i(),b(`div`,{key:0,class:f([`w-1.5 h-1.5 rounded-full flex-shrink-0`,Bn(r)])},null,2)):m(``,!0),y(`span`,null,s(Vn(Number(r.tx_delay_ms))),1)])):m(``,!0)]),y(`div`,bt,[y(`div`,null,[y(`div`,xt,[y(`span`,{class:f([`text-xs font-medium`,Pe(r)])},s(Fe(r)),3),Ie(r)?(i(),b(`span`,St,[...n[13]||=[y(`svg`,{class:`w-3 h-3`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`,"aria-hidden":`true`},[y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 3l7 4v5c0 5-3.5 8-7 9-3.5-1-7-4-7-9V7l7-4z`}),y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 8l8 8`})],-1)]])):m(``,!0)]),Te(r)?(i(),b(`div`,Ct,[y(`button`,{type:`button`,class:`inline-flex items-center gap-1 rounded-md px-2 py-1 text-[10px] font-semibold transition-all duration-200 border bg-primary/opacity-medium hover:bg-primary/opacity-medium border-primary/opacity-heavy text-primary`,onClick:T(e=>je(r),[`stop`])},[(i(),b(`svg`,{class:f([`w-2.5 h-2.5 transition-transform duration-200`,{"rotate-180":J(r)}]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...n[14]||=[y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2.5`,d:`M19 9l-7 7-7-7`},null,-1)]],2)),_(` `+s(J(r)?`Hide`:`Show`)+` `+s(q(r))+` duplicate`+s(q(r)===1?``:`s`),1)],8,wt)])):Ce(r)?(i(),b(`div`,Tt,` Duplicate #`+s(K(r)?.duplicateIndex),1)):m(``,!0),r.drop_reason?(i(),b(`p`,Et,s(r.drop_reason),1)):m(``,!0)])])]),y(`div`,Dt,[y(`div`,Ot,[y(`div`,kt,[Q(r)?(i(),b(v,{key:0},[y(`div`,At,[n[15]||=y(`span`,{class:`text-[9px] uppercase tracking-wide text-content-muted font-semibold`},` Path `,-1),y(`span`,jt,s(Un(Q(r).hops)),1)]),y(`div`,Mt,[(i(!0),b(v,null,t(Q(r).nodes,(e,t)=>(i(),b(v,{key:t},[y(`span`,{class:f([`inline-block max-w-full truncate px-1.5 py-0.5 rounded text-[9px] font-mono font-semibold leading-tight tracking-tight`,t===0?`bg-badge-cyan-bg text-badge-cyan-text`:`bg-background-mute/opacity-medium text-content-muted`]),title:e},s(e),11,Nt),tje(r),[`stop`])},[n[18]||=y(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`,"aria-hidden":`true`},[y(`rect`,{x:`9`,y:`9`,width:`11`,height:`11`,rx:`2`,ry:`2`,"stroke-width":`2`}),y(`path`,{d:`M6 15H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v1`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`})],-1),y(`span`,Zt,s(q(r)),1)],10,Xt)):m(``,!0)])]),y(`div`,Qt,[y(`div`,$t,[n[19]||=y(`span`,{class:`text-primary text-xs font-semibold uppercase tracking-wide`},`Path`,-1),y(`span`,en,s(Q(r)?Un(Q(r).hops):`Unknown`),1)]),Q(r)?(i(),b(`div`,tn,[(i(!0),b(v,null,t(Q(r).nodes,(e,t)=>(i(),b(v,{key:`mobile-path-${t}`},[y(`span`,{class:f([`mobile-path-chip inline-flex items-center px-2 py-1 rounded-lg text-xs font-mono font-semibold leading-tight`,t===0?`bg-badge-cyan-bg text-badge-cyan-text`:`text-content-secondary dark:text-content-muted`]),title:e},s(e),11,nn),t0&&r.transmitted?(i(),b(`div`,{key:0,class:f([`w-1.5 h-1.5 rounded-full flex-shrink-0`,Bn(r)])},null,2)):m(``,!0),y(`span`,_n,s(Number(r.tx_delay_ms)>0?Vn(Number(r.tx_delay_ms)):`--`),1)])])])]),r.drop_reason?(i(),b(`div`,vn,s(r.drop_reason),1)):m(``,!0)])])],10,rt))),128))],2))),128))]),G.value>1?(i(),b(`div`,yn,[y(`div`,bn,[y(`span`,xn,[_(` Showing `+s((C.value-1)*X+1)+` - `+s(Math.min(C.value*X,U.value.length))+` of `+s(U.value.length)+` hash groups `,1),y(`span`,Sn,`(`+s(H.value.length)+` packets)`,1)]),xe.value?(i(),b(`div`,Cn,[n[25]||=y(`span`,{class:`text-content-secondary dark:text-content-muted text-xs`},`•`,-1),y(`button`,{onClick:Jn,disabled:k.value,class:f([`glass-card border border-primary rounded-[8px] px-3 py-1.5 text-xs transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium hover:bg-primary/opacity-light`,{"text-primary border-primary cursor-pointer":!k.value,"text-content-secondary dark:text-content-muted border-stroke-subtle dark:border-stroke cursor-not-allowed opacity-50":k.value}])},s(k.value?`Loading...`:`Load ${Math.min(200,Z-E.value)} more`),11,wn),y(`span`,Tn,`(`+s(E.value)+`/`+s(Z)+` max)`,1)])):m(``,!0)]),y(`div`,En,[y(`button`,{onClick:n[2]||=e=>--C.value,disabled:C.value<=1,class:f([`glass-card border rounded-[10px] px-3 py-2 text-sm transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium prev-next-btn`,{"border-stroke-subtle dark:border-stroke text-content-muted cursor-not-allowed opacity-50":C.value<=1,"border-stroke-subtle dark:border-stroke text-content-primary hover:border-primary dark:hover:border-primary hover:text-primary hover:bg-primary/opacity-light":C.value>1}])},[...n[26]||=[y(`span`,{class:`hidden sm:inline`},`Previous`,-1),y(`span`,{class:`sm:hidden`},`‹`,-1)]],10,Dn),y(`div`,On,[C.value>3?(i(),b(`button`,{key:0,onClick:n[3]||=e=>C.value=1,class:`glass-card border border-stroke-subtle dark:border-stroke hover:border-primary dark:hover:border-primary rounded-[8px] px-3 py-2 text-sm text-content-primary hover:text-primary hover:bg-primary/opacity-light transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium`},` 1 `)):m(``,!0),C.value>4?(i(),b(`span`,kn,`...`)):m(``,!0),(i(!0),b(v,null,t(Array.from({length:Math.min(5,G.value)},(e,t)=>Math.max(1,Math.min(C.value-2,G.value-4))+t).filter(e=>e<=G.value),e=>(i(),b(`button`,{key:e,onClick:t=>C.value=e,class:f([`glass-card border rounded-[8px] px-3 py-2 text-sm transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium page-number`,{"border-primary bg-primary/opacity-light text-primary":C.value===e,"border-stroke-subtle dark:border-stroke text-content-primary hover:border-primary dark:hover:border-primary hover:text-primary hover:bg-primary/opacity-light":C.value!==e}])},s(e),11,An))),128)),C.valueC.value=G.value,class:`glass-card border border-stroke-subtle dark:border-stroke hover:border-primary dark:hover:border-primary rounded-[8px] px-3 py-2 text-sm text-content-primary hover:text-primary hover:bg-primary/opacity-light transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium`},s(G.value),1)):m(``,!0)]),y(`button`,{onClick:n[5]||=e=>C.value+=1,disabled:C.value>=G.value,class:f([`glass-card border rounded-[10px] px-3 py-2 text-sm transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium prev-next-btn`,{"border-stroke-subtle dark:border-stroke text-content-muted cursor-not-allowed opacity-50":C.value>=G.value,"border-stroke-subtle dark:border-stroke text-content-primary hover:border-primary dark:hover:border-primary hover:text-primary hover:bg-primary/opacity-light":C.value(i(),b(`div`,null,[h(pe),y(`div`,Bn,[h(Fe),h(K)]),h(zn)]))}});export{Vn as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/GPSDiagnostics-DkqSbCiV.js b/repeater/web/html/assets/GPSDiagnostics-C9LIlcS7.js similarity index 99% rename from repeater/web/html/assets/GPSDiagnostics-DkqSbCiV.js rename to repeater/web/html/assets/GPSDiagnostics-C9LIlcS7.js index 4c0c57c..e2d16f8 100644 --- a/repeater/web/html/assets/GPSDiagnostics-DkqSbCiV.js +++ b/repeater/web/html/assets/GPSDiagnostics-C9LIlcS7.js @@ -1,4 +1,4 @@ -import{C as e,D as t,P as n,T as r,U as i,_t as a,gt as o,h as s,ht as c,j as l,l as u,o as d,p as f,r as p,s as m,u as h,w as g,x as _,y as v}from"./runtime-core.esm-bundler-CINEgm0a.js";import{s as y}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{l as b,t as x}from"./api-CP9MgmUS.js";import{d as S}from"./index-Cl4Dij8v.js";var C={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},w={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},T=1e3,E=1001,D=1002,O=1003,k=1004,A=1005,j=1006,ee=1007,te=1008,ne=1009,M=1010,N=1011,re=1012,ie=1013,ae=1014,oe=1015,P=1016,se=1017,ce=1018,le=1020,ue=35902,de=35899,fe=1021,pe=1022,me=1023,he=1026,ge=1027,_e=1028,ve=1029,ye=1030,be=1031,xe=1033,F=33776,Se=33777,Ce=33778,we=33779,Te=35840,Ee=35841,De=35842,Oe=35843,ke=36196,I=37492,Ae=37496,L=37488,je=37489,R=37490,z=37491,B=37808,V=37809,Me=37810,Ne=37811,Pe=37812,Fe=37813,Ie=37814,Le=37815,Re=37816,ze=37817,Be=37818,Ve=37819,He=37820,Ue=37821,We=36492,Ge=36494,Ke=36495,qe=36283,Je=36284,Ye=36285,Xe=36286,Ze=2300,Qe=2301,$e=2302,et=2303,tt=2400,nt=2401,rt=2402,it=3200,at=`srgb`,ot=`srgb-linear`,st=`linear`,ct=`srgb`,lt=7680,ut=35044,dt=35048,ft=2e3;function pt(e){for(let t=e.length-1;t>=0;--t)if(e[t]>=65535)return!0;return!1}function mt(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}function ht(e){return document.createElementNS(`http://www.w3.org/1999/xhtml`,e)}function gt(){let e=ht(`canvas`);return e.style.display=`block`,e}var _t={},vt=null;function yt(...e){let t=`THREE.`+e.shift();vt?vt(`log`,t,...e):console.log(t,...e)}function bt(e){let t=e[0];if(typeof t==`string`&&t.startsWith(`TSL:`)){let t=e[1];t&&t.isStackTrace?e[0]+=` `+t.getLocation():e[1]=`Stack trace not available. Enable "THREE.Node.captureStackTrace" to capture stack traces.`}return e}function H(...e){e=bt(e);let t=`THREE.`+e.shift();if(vt)vt(`warn`,t,...e);else{let n=e[0];n&&n.isStackTrace?console.warn(n.getError(t)):console.warn(t,...e)}}function U(...e){e=bt(e);let t=`THREE.`+e.shift();if(vt)vt(`error`,t,...e);else{let n=e[0];n&&n.isStackTrace?console.error(n.getError(t)):console.error(t,...e)}}function xt(...e){let t=e.join(` `);t in _t||(_t[t]=!0,H(...e))}function St(e,t,n){return new Promise(function(r,i){function a(){switch(e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0)){case e.WAIT_FAILED:i();break;case e.TIMEOUT_EXPIRED:setTimeout(a,n);break;default:r()}}setTimeout(a,n)})}var Ct={0:1,2:6,4:7,3:5,1:0,6:2,7:4,5:3},wt=class{addEventListener(e,t){this._listeners===void 0&&(this._listeners={});let n=this._listeners;n[e]===void 0&&(n[e]=[]),n[e].indexOf(t)===-1&&n[e].push(t)}hasEventListener(e,t){let n=this._listeners;return n===void 0?!1:n[e]!==void 0&&n[e].indexOf(t)!==-1}removeEventListener(e,t){let n=this._listeners;if(n===void 0)return;let r=n[e];if(r!==void 0){let e=r.indexOf(t);e!==-1&&r.splice(e,1)}}dispatchEvent(e){let t=this._listeners;if(t===void 0)return;let n=t[e.type];if(n!==void 0){e.target=this;let t=n.slice(0);for(let n=0,r=t.length;n>8&255]+Tt[e>>16&255]+Tt[e>>24&255]+`-`+Tt[t&255]+Tt[t>>8&255]+`-`+Tt[t>>16&15|64]+Tt[t>>24&255]+`-`+Tt[n&63|128]+Tt[n>>8&255]+`-`+Tt[n>>16&255]+Tt[n>>24&255]+Tt[r&255]+Tt[r>>8&255]+Tt[r>>16&255]+Tt[r>>24&255]).toLowerCase()}function W(e,t,n){return Math.max(t,Math.min(n,e))}function At(e,t){return(e%t+t)%t}function jt(e,t,n,r,i){return r+(e-t)*(i-r)/(n-t)}function Mt(e,t,n){return e===t?0:(n-e)/(t-e)}function Nt(e,t,n){return(1-n)*e+n*t}function Pt(e,t,n,r){return Nt(e,t,1-Math.exp(-n*r))}function Ft(e,t=1){return t-Math.abs(At(e,t*2)-t)}function It(e,t,n){return e<=t?0:e>=n?1:(e=(e-t)/(n-t),e*e*(3-2*e))}function Lt(e,t,n){return e<=t?0:e>=n?1:(e=(e-t)/(n-t),e*e*e*(e*(e*6-15)+10))}function Rt(e,t){return e+Math.floor(Math.random()*(t-e+1))}function zt(e,t){return e+Math.random()*(t-e)}function Bt(e){return e*(.5-Math.random())}function Vt(e){e!==void 0&&(Et=e);let t=Et+=1831565813;return t=Math.imul(t^t>>>15,t|1),t^=t+Math.imul(t^t>>>7,t|61),((t^t>>>14)>>>0)/4294967296}function Ht(e){return e*Dt}function Ut(e){return e*Ot}function Wt(e){return(e&e-1)==0&&e!==0}function Gt(e){return 2**Math.ceil(Math.log(e)/Math.LN2)}function Kt(e){return 2**Math.floor(Math.log(e)/Math.LN2)}function qt(e,t,n,r,i){let a=Math.cos,o=Math.sin,s=a(n/2),c=o(n/2),l=a((t+r)/2),u=o((t+r)/2),d=a((t-r)/2),f=o((t-r)/2),p=a((r-t)/2),m=o((r-t)/2);switch(i){case`XYX`:e.set(s*u,c*d,c*f,s*l);break;case`YZY`:e.set(c*f,s*u,c*d,s*l);break;case`ZXZ`:e.set(c*d,c*f,s*u,s*l);break;case`XZX`:e.set(s*u,c*m,c*p,s*l);break;case`YXY`:e.set(c*p,s*u,c*m,s*l);break;case`ZYZ`:e.set(c*m,c*p,s*u,s*l);break;default:H(`MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: `+i)}}function Jt(e,t){switch(t.constructor){case Float32Array:return e;case Uint32Array:return e/4294967295;case Uint16Array:return e/65535;case Uint8Array:return e/255;case Int32Array:return Math.max(e/2147483647,-1);case Int16Array:return Math.max(e/32767,-1);case Int8Array:return Math.max(e/127,-1);default:throw Error(`Invalid component type.`)}}function G(e,t){switch(t.constructor){case Float32Array:return e;case Uint32Array:return Math.round(e*4294967295);case Uint16Array:return Math.round(e*65535);case Uint8Array:return Math.round(e*255);case Int32Array:return Math.round(e*2147483647);case Int16Array:return Math.round(e*32767);case Int8Array:return Math.round(e*127);default:throw Error(`Invalid component type.`)}}var Yt={DEG2RAD:Dt,RAD2DEG:Ot,generateUUID:kt,clamp:W,euclideanModulo:At,mapLinear:jt,inverseLerp:Mt,lerp:Nt,damp:Pt,pingpong:Ft,smoothstep:It,smootherstep:Lt,randInt:Rt,randFloat:zt,randFloatSpread:Bt,seededRandom:Vt,degToRad:Ht,radToDeg:Ut,isPowerOfTwo:Wt,ceilPowerOfTwo:Gt,floorPowerOfTwo:Kt,setQuaternionFromProperEuler:qt,normalize:G,denormalize:Jt},K=class e{static{e.prototype.isVector2=!0}constructor(e=0,t=0){this.x=e,this.y=t}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,t){return this.x=e,this.y=t,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw Error(`index is out of range: `+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw Error(`index is out of range: `+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){let t=this.x,n=this.y,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6],this.y=r[1]*t+r[4]*n+r[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,t){return this.x=W(this.x,e.x,t.x),this.y=W(this.y,e.y,t.y),this}clampScalar(e,t){return this.x=W(this.x,e,t),this.y=W(this.y,e,t),this}clampLength(e,t){let n=this.length();return this.divideScalar(n||1).multiplyScalar(W(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){let t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;let n=this.dot(e)/t;return Math.acos(W(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){let t=this.x-e.x,n=this.y-e.y;return t*t+n*n}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this}rotateAround(e,t){let n=Math.cos(t),r=Math.sin(t),i=this.x-e.x,a=this.y-e.y;return this.x=i*n-a*r+e.x,this.y=i*r+a*n+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}},Xt=class{constructor(e=0,t=0,n=0,r=1){this.isQuaternion=!0,this._x=e,this._y=t,this._z=n,this._w=r}static slerpFlat(e,t,n,r,i,a,o){let s=n[r+0],c=n[r+1],l=n[r+2],u=n[r+3],d=i[a+0],f=i[a+1],p=i[a+2],m=i[a+3];if(u!==m||s!==d||c!==f||l!==p){let e=s*d+c*f+l*p+u*m;e<0&&(d=-d,f=-f,p=-p,m=-m,e=-e);let t=1-o;if(e<.9995){let n=Math.acos(e),r=Math.sin(n);t=Math.sin(t*n)/r,o=Math.sin(o*n)/r,s=s*t+d*o,c=c*t+f*o,l=l*t+p*o,u=u*t+m*o}else{s=s*t+d*o,c=c*t+f*o,l=l*t+p*o,u=u*t+m*o;let e=1/Math.sqrt(s*s+c*c+l*l+u*u);s*=e,c*=e,l*=e,u*=e}}e[t]=s,e[t+1]=c,e[t+2]=l,e[t+3]=u}static multiplyQuaternionsFlat(e,t,n,r,i,a){let o=n[r],s=n[r+1],c=n[r+2],l=n[r+3],u=i[a],d=i[a+1],f=i[a+2],p=i[a+3];return e[t]=o*p+l*u+s*f-c*d,e[t+1]=s*p+l*d+c*u-o*f,e[t+2]=c*p+l*f+o*d-s*u,e[t+3]=l*p-o*u-s*d-c*f,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,t,n,r){return this._x=e,this._y=t,this._z=n,this._w=r,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,t=!0){let n=e._x,r=e._y,i=e._z,a=e._order,o=Math.cos,s=Math.sin,c=o(n/2),l=o(r/2),u=o(i/2),d=s(n/2),f=s(r/2),p=s(i/2);switch(a){case`XYZ`:this._x=d*l*u+c*f*p,this._y=c*f*u-d*l*p,this._z=c*l*p+d*f*u,this._w=c*l*u-d*f*p;break;case`YXZ`:this._x=d*l*u+c*f*p,this._y=c*f*u-d*l*p,this._z=c*l*p-d*f*u,this._w=c*l*u+d*f*p;break;case`ZXY`:this._x=d*l*u-c*f*p,this._y=c*f*u+d*l*p,this._z=c*l*p+d*f*u,this._w=c*l*u-d*f*p;break;case`ZYX`:this._x=d*l*u-c*f*p,this._y=c*f*u+d*l*p,this._z=c*l*p-d*f*u,this._w=c*l*u+d*f*p;break;case`YZX`:this._x=d*l*u+c*f*p,this._y=c*f*u+d*l*p,this._z=c*l*p-d*f*u,this._w=c*l*u-d*f*p;break;case`XZY`:this._x=d*l*u-c*f*p,this._y=c*f*u-d*l*p,this._z=c*l*p+d*f*u,this._w=c*l*u+d*f*p;break;default:H(`Quaternion: .setFromEuler() encountered an unknown order: `+a)}return t===!0&&this._onChangeCallback(),this}setFromAxisAngle(e,t){let n=t/2,r=Math.sin(n);return this._x=e.x*r,this._y=e.y*r,this._z=e.z*r,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(e){let t=e.elements,n=t[0],r=t[4],i=t[8],a=t[1],o=t[5],s=t[9],c=t[2],l=t[6],u=t[10],d=n+o+u;if(d>0){let e=.5/Math.sqrt(d+1);this._w=.25/e,this._x=(l-s)*e,this._y=(i-c)*e,this._z=(a-r)*e}else if(n>o&&n>u){let e=2*Math.sqrt(1+n-o-u);this._w=(l-s)/e,this._x=.25*e,this._y=(r+a)/e,this._z=(i+c)/e}else if(o>u){let e=2*Math.sqrt(1+o-n-u);this._w=(i-c)/e,this._x=(r+a)/e,this._y=.25*e,this._z=(s+l)/e}else{let e=2*Math.sqrt(1+u-n-o);this._w=(a-r)/e,this._x=(i+c)/e,this._y=(s+l)/e,this._z=.25*e}return this._onChangeCallback(),this}setFromUnitVectors(e,t){let n=e.dot(t)+1;return n<1e-8?(n=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=n):(this._x=0,this._y=-e.z,this._z=e.y,this._w=n)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=n),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(W(this.dot(e),-1,1)))}rotateTowards(e,t){let n=this.angleTo(e);if(n===0)return this;let r=Math.min(1,t/n);return this.slerp(e,r),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x*=e,this._y*=e,this._z*=e,this._w*=e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,t){let n=e._x,r=e._y,i=e._z,a=e._w,o=t._x,s=t._y,c=t._z,l=t._w;return this._x=n*l+a*o+r*c-i*s,this._y=r*l+a*s+i*o-n*c,this._z=i*l+a*c+n*s-r*o,this._w=a*l-n*o-r*s-i*c,this._onChangeCallback(),this}slerp(e,t){let n=e._x,r=e._y,i=e._z,a=e._w,o=this.dot(e);o<0&&(n=-n,r=-r,i=-i,a=-a,o=-o);let s=1-t;if(o<.9995){let e=Math.acos(o),c=Math.sin(e);s=Math.sin(s*e)/c,t=Math.sin(t*e)/c,this._x=this._x*s+n*t,this._y=this._y*s+r*t,this._z=this._z*s+i*t,this._w=this._w*s+a*t,this._onChangeCallback()}else this._x=this._x*s+n*t,this._y=this._y*s+r*t,this._z=this._z*s+i*t,this._w=this._w*s+a*t,this.normalize();return this}slerpQuaternions(e,t,n){return this.copy(e).slerp(t,n)}random(){let e=2*Math.PI*Math.random(),t=2*Math.PI*Math.random(),n=Math.random(),r=Math.sqrt(1-n),i=Math.sqrt(n);return this.set(r*Math.sin(e),r*Math.cos(e),i*Math.sin(t),i*Math.cos(t))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,t=0){return this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e}fromBufferAttribute(e,t){return this._x=e.getX(t),this._y=e.getY(t),this._z=e.getZ(t),this._w=e.getW(t),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}},q=class e{static{e.prototype.isVector3=!0}constructor(e=0,t=0,n=0){this.x=e,this.y=t,this.z=n}set(e,t,n){return n===void 0&&(n=this.z),this.x=e,this.y=t,this.z=n,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw Error(`index is out of range: `+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error(`index is out of range: `+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this}applyEuler(e){return this.applyQuaternion(Qt.setFromEuler(e))}applyAxisAngle(e,t){return this.applyQuaternion(Qt.setFromAxisAngle(e,t))}applyMatrix3(e){let t=this.x,n=this.y,r=this.z,i=e.elements;return this.x=i[0]*t+i[3]*n+i[6]*r,this.y=i[1]*t+i[4]*n+i[7]*r,this.z=i[2]*t+i[5]*n+i[8]*r,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){let t=this.x,n=this.y,r=this.z,i=e.elements,a=1/(i[3]*t+i[7]*n+i[11]*r+i[15]);return this.x=(i[0]*t+i[4]*n+i[8]*r+i[12])*a,this.y=(i[1]*t+i[5]*n+i[9]*r+i[13])*a,this.z=(i[2]*t+i[6]*n+i[10]*r+i[14])*a,this}applyQuaternion(e){let t=this.x,n=this.y,r=this.z,i=e.x,a=e.y,o=e.z,s=e.w,c=2*(a*r-o*n),l=2*(o*t-i*r),u=2*(i*n-a*t);return this.x=t+s*c+a*u-o*l,this.y=n+s*l+o*c-i*u,this.z=r+s*u+i*l-a*c,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){let t=this.x,n=this.y,r=this.z,i=e.elements;return this.x=i[0]*t+i[4]*n+i[8]*r,this.y=i[1]*t+i[5]*n+i[9]*r,this.z=i[2]*t+i[6]*n+i[10]*r,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,t){return this.x=W(this.x,e.x,t.x),this.y=W(this.y,e.y,t.y),this.z=W(this.z,e.z,t.z),this}clampScalar(e,t){return this.x=W(this.x,e,t),this.y=W(this.y,e,t),this.z=W(this.z,e,t),this}clampLength(e,t){let n=this.length();return this.divideScalar(n||1).multiplyScalar(W(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,t){let n=e.x,r=e.y,i=e.z,a=t.x,o=t.y,s=t.z;return this.x=r*s-i*o,this.y=i*a-n*s,this.z=n*o-r*a,this}projectOnVector(e){let t=e.lengthSq();if(t===0)return this.set(0,0,0);let n=e.dot(this)/t;return this.copy(e).multiplyScalar(n)}projectOnPlane(e){return Zt.copy(this).projectOnVector(e),this.sub(Zt)}reflect(e){return this.sub(Zt.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){let t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;let n=this.dot(e)/t;return Math.acos(W(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){let t=this.x-e.x,n=this.y-e.y,r=this.z-e.z;return t*t+n*n+r*r}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,t,n){let r=Math.sin(t)*e;return this.x=r*Math.sin(n),this.y=Math.cos(t)*e,this.z=r*Math.cos(n),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,t,n){return this.x=e*Math.sin(t),this.y=n,this.z=e*Math.cos(t),this}setFromMatrixPosition(e){let t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(e){let t=this.setFromMatrixColumn(e,0).length(),n=this.setFromMatrixColumn(e,1).length(),r=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=n,this.z=r,this}setFromMatrixColumn(e,t){return this.fromArray(e.elements,t*4)}setFromMatrix3Column(e,t){return this.fromArray(e.elements,t*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}setFromColor(e){return this.x=e.r,this.y=e.g,this.z=e.b,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){let e=Math.random()*Math.PI*2,t=Math.random()*2-1,n=Math.sqrt(1-t*t);return this.x=n*Math.cos(e),this.y=t,this.z=n*Math.sin(e),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}},Zt=new q,Qt=new Xt,J=class e{static{e.prototype.isMatrix3=!0}constructor(e,t,n,r,i,a,o,s,c){this.elements=[1,0,0,0,1,0,0,0,1],e!==void 0&&this.set(e,t,n,r,i,a,o,s,c)}set(e,t,n,r,i,a,o,s,c){let l=this.elements;return l[0]=e,l[1]=r,l[2]=o,l[3]=t,l[4]=i,l[5]=s,l[6]=n,l[7]=a,l[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){let t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this}extractBasis(e,t,n){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(e){let t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){let n=e.elements,r=t.elements,i=this.elements,a=n[0],o=n[3],s=n[6],c=n[1],l=n[4],u=n[7],d=n[2],f=n[5],p=n[8],m=r[0],h=r[3],g=r[6],_=r[1],v=r[4],y=r[7],b=r[2],x=r[5],S=r[8];return i[0]=a*m+o*_+s*b,i[3]=a*h+o*v+s*x,i[6]=a*g+o*y+s*S,i[1]=c*m+l*_+u*b,i[4]=c*h+l*v+u*x,i[7]=c*g+l*y+u*S,i[2]=d*m+f*_+p*b,i[5]=d*h+f*v+p*x,i[8]=d*g+f*y+p*S,this}multiplyScalar(e){let t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this}determinant(){let e=this.elements,t=e[0],n=e[1],r=e[2],i=e[3],a=e[4],o=e[5],s=e[6],c=e[7],l=e[8];return t*a*l-t*o*c-n*i*l+n*o*s+r*i*c-r*a*s}invert(){let e=this.elements,t=e[0],n=e[1],r=e[2],i=e[3],a=e[4],o=e[5],s=e[6],c=e[7],l=e[8],u=l*a-o*c,d=o*s-l*i,f=c*i-a*s,p=t*u+n*d+r*f;if(p===0)return this.set(0,0,0,0,0,0,0,0,0);let m=1/p;return e[0]=u*m,e[1]=(r*c-l*n)*m,e[2]=(o*n-r*a)*m,e[3]=d*m,e[4]=(l*t-r*s)*m,e[5]=(r*i-o*t)*m,e[6]=f*m,e[7]=(n*s-c*t)*m,e[8]=(a*t-n*i)*m,this}transpose(){let e,t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){let t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this}setUvTransform(e,t,n,r,i,a,o){let s=Math.cos(i),c=Math.sin(i);return this.set(n*s,n*c,-n*(s*a+c*o)+a+e,-r*c,r*s,-r*(-c*a+s*o)+o+t,0,0,1),this}scale(e,t){return this.premultiply($t.makeScale(e,t)),this}rotate(e){return this.premultiply($t.makeRotation(-e)),this}translate(e,t){return this.premultiply($t.makeTranslation(e,t)),this}makeTranslation(e,t){return e.isVector2?this.set(1,0,e.x,0,1,e.y,0,0,1):this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){let t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,n,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}equals(e){let t=this.elements,n=e.elements;for(let e=0;e<9;e++)if(t[e]!==n[e])return!1;return!0}fromArray(e,t=0){for(let n=0;n<9;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){let n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e}clone(){return new this.constructor().fromArray(this.elements)}},$t=new J,en=new J().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),tn=new J().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function nn(){let e={enabled:!0,workingColorSpace:ot,spaces:{},convert:function(e,t,n){return this.enabled===!1||t===n||!t||!n?e:(this.spaces[t].transfer===`srgb`&&(e.r=rn(e.r),e.g=rn(e.g),e.b=rn(e.b)),this.spaces[t].primaries!==this.spaces[n].primaries&&(e.applyMatrix3(this.spaces[t].toXYZ),e.applyMatrix3(this.spaces[n].fromXYZ)),this.spaces[n].transfer===`srgb`&&(e.r=an(e.r),e.g=an(e.g),e.b=an(e.b)),e)},workingToColorSpace:function(e,t){return this.convert(e,this.workingColorSpace,t)},colorSpaceToWorking:function(e,t){return this.convert(e,t,this.workingColorSpace)},getPrimaries:function(e){return this.spaces[e].primaries},getTransfer:function(e){return e===``?st:this.spaces[e].transfer},getToneMappingMode:function(e){return this.spaces[e].outputColorSpaceConfig.toneMappingMode||`standard`},getLuminanceCoefficients:function(e,t=this.workingColorSpace){return e.fromArray(this.spaces[t].luminanceCoefficients)},define:function(e){Object.assign(this.spaces,e)},_getMatrix:function(e,t,n){return e.copy(this.spaces[t].toXYZ).multiply(this.spaces[n].fromXYZ)},_getDrawingBufferColorSpace:function(e){return this.spaces[e].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(e=this.workingColorSpace){return this.spaces[e].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(t,n){return xt(`ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace().`),e.workingToColorSpace(t,n)},toWorkingColorSpace:function(t,n){return xt(`ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking().`),e.colorSpaceToWorking(t,n)}},t=[.64,.33,.3,.6,.15,.06],n=[.2126,.7152,.0722],r=[.3127,.329];return e.define({[ot]:{primaries:t,whitePoint:r,transfer:st,toXYZ:en,fromXYZ:tn,luminanceCoefficients:n,workingColorSpaceConfig:{unpackColorSpace:at},outputColorSpaceConfig:{drawingBufferColorSpace:at}},[at]:{primaries:t,whitePoint:r,transfer:ct,toXYZ:en,fromXYZ:tn,luminanceCoefficients:n,outputColorSpaceConfig:{drawingBufferColorSpace:at}}}),e}var Y=nn();function rn(e){return e<.04045?e*.0773993808:(e*.9478672986+.0521327014)**2.4}function an(e){return e<.0031308?e*12.92:1.055*e**.41666-.055}var on,sn=class{static getDataURL(e,t=`image/png`){if(/^data:/i.test(e.src)||typeof HTMLCanvasElement>`u`)return e.src;let n;if(e instanceof HTMLCanvasElement)n=e;else{on===void 0&&(on=ht(`canvas`)),on.width=e.width,on.height=e.height;let t=on.getContext(`2d`);e instanceof ImageData?t.putImageData(e,0,0):t.drawImage(e,0,0,e.width,e.height),n=on}return n.toDataURL(t)}static sRGBToLinear(e){if(typeof HTMLImageElement<`u`&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<`u`&&e instanceof HTMLCanvasElement||typeof ImageBitmap<`u`&&e instanceof ImageBitmap){let t=ht(`canvas`);t.width=e.width,t.height=e.height;let n=t.getContext(`2d`);n.drawImage(e,0,0,e.width,e.height);let r=n.getImageData(0,0,e.width,e.height),i=r.data;for(let e=0;e1),this.pmremVersion=0,this.normalized=!1}get width(){return this.source.getSize(fn).x}get height(){return this.source.getSize(fn).y}get depth(){return this.source.getSize(fn).z}get image(){return this.source.data}set image(e){this.source.data=e}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return new this.constructor().copy(this)}copy(e){return this.name=e.name,this.source=e.source,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.channel=e.channel,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.internalFormat=e.internalFormat,this.type=e.type,this.normalized=e.normalized,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.colorSpace=e.colorSpace,this.renderTarget=e.renderTarget,this.isRenderTargetTexture=e.isRenderTargetTexture,this.isArrayTexture=e.isArrayTexture,this.userData=JSON.parse(JSON.stringify(e.userData)),this.needsUpdate=!0,this}setValues(e){for(let t in e){let n=e[t];if(n===void 0){H(`Texture.setValues(): parameter '${t}' has value of undefined.`);continue}let r=this[t];if(r===void 0){H(`Texture.setValues(): property '${t}' does not exist.`);continue}r&&n&&r.isVector2&&n.isVector2||r&&n&&r.isVector3&&n.isVector3||r&&n&&r.isMatrix3&&n.isMatrix3?r.copy(n):this[t]=n}}toJSON(e){let t=e===void 0||typeof e==`string`;if(!t&&e.textures[this.uuid]!==void 0)return e.textures[this.uuid];let n={metadata:{version:4.7,type:`Texture`,generator:`Texture.toJSON`},uuid:this.uuid,name:this.name,image:this.source.toJSON(e).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,normalized:this.normalized,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(n.userData=this.userData),t||(e.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:`dispose`})}transformUv(e){if(this.mapping!==300)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case T:e.x-=Math.floor(e.x);break;case E:e.x=e.x<0?0:1;break;case D:Math.abs(Math.floor(e.x)%2)===1?e.x=Math.ceil(e.x)-e.x:e.x-=Math.floor(e.x);break}if(e.y<0||e.y>1)switch(this.wrapT){case T:e.y-=Math.floor(e.y);break;case E:e.y=e.y<0?0:1;break;case D:Math.abs(Math.floor(e.y)%2)===1?e.y=Math.ceil(e.y)-e.y:e.y-=Math.floor(e.y);break}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){e===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(e){e===!0&&this.pmremVersion++}};pn.DEFAULT_IMAGE=null,pn.DEFAULT_MAPPING=300,pn.DEFAULT_ANISOTROPY=1;var mn=class e{static{e.prototype.isVector4=!0}constructor(e=0,t=0,n=0,r=1){this.x=e,this.y=t,this.z=n,this.w=r}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,t,n,r){return this.x=e,this.y=t,this.z=n,this.w=r,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw Error(`index is out of range: `+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error(`index is out of range: `+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w===void 0?1:e.w,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){let t=this.x,n=this.y,r=this.z,i=this.w,a=e.elements;return this.x=a[0]*t+a[4]*n+a[8]*r+a[12]*i,this.y=a[1]*t+a[5]*n+a[9]*r+a[13]*i,this.z=a[2]*t+a[6]*n+a[10]*r+a[14]*i,this.w=a[3]*t+a[7]*n+a[11]*r+a[15]*i,this}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this.w/=e.w,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);let t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this}setAxisAngleFromRotationMatrix(e){let t,n,r,i,a=.01,o=.1,s=e.elements,c=s[0],l=s[4],u=s[8],d=s[1],f=s[5],p=s[9],m=s[2],h=s[6],g=s[10];if(Math.abs(l-d)s&&e>_?e_?s1);this.dispose()}this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t)}clone(){return new this.constructor().copy(this)}copy(e){this.width=e.width,this.height=e.height,this.depth=e.depth,this.scissor.copy(e.scissor),this.scissorTest=e.scissorTest,this.viewport.copy(e.viewport),this.textures.length=0;for(let t=0,n=e.textures.length;t>>0}enable(e){this.mask|=1<1){for(let e=0;e1){for(let e=0;e0&&(r.userData=this.userData),r.layers=this.layers.mask,r.matrix=this.matrix.toArray(),r.up=this.up.toArray(),this.pivot!==null&&(r.pivot=this.pivot.toArray()),this.matrixAutoUpdate===!1&&(r.matrixAutoUpdate=!1),this.morphTargetDictionary!==void 0&&(r.morphTargetDictionary=Object.assign({},this.morphTargetDictionary)),this.morphTargetInfluences!==void 0&&(r.morphTargetInfluences=this.morphTargetInfluences.slice()),this.isInstancedMesh&&(r.type=`InstancedMesh`,r.count=this.count,r.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(r.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(r.type=`BatchedMesh`,r.perObjectFrustumCulled=this.perObjectFrustumCulled,r.sortObjects=this.sortObjects,r.drawRanges=this._drawRanges,r.reservedRanges=this._reservedRanges,r.geometryInfo=this._geometryInfo.map(e=>({...e,boundingBox:e.boundingBox?e.boundingBox.toJSON():void 0,boundingSphere:e.boundingSphere?e.boundingSphere.toJSON():void 0})),r.instanceInfo=this._instanceInfo.map(e=>({...e})),r.availableInstanceIds=this._availableInstanceIds.slice(),r.availableGeometryIds=this._availableGeometryIds.slice(),r.nextIndexStart=this._nextIndexStart,r.nextVertexStart=this._nextVertexStart,r.geometryCount=this._geometryCount,r.maxInstanceCount=this._maxInstanceCount,r.maxVertexCount=this._maxVertexCount,r.maxIndexCount=this._maxIndexCount,r.geometryInitialized=this._geometryInitialized,r.matricesTexture=this._matricesTexture.toJSON(e),r.indirectTexture=this._indirectTexture.toJSON(e),this._colorsTexture!==null&&(r.colorsTexture=this._colorsTexture.toJSON(e)),this.boundingSphere!==null&&(r.boundingSphere=this.boundingSphere.toJSON()),this.boundingBox!==null&&(r.boundingBox=this.boundingBox.toJSON()));function i(t,n){return t[n.uuid]===void 0&&(t[n.uuid]=n.toJSON(e)),n.uuid}if(this.isScene)this.background&&(this.background.isColor?r.background=this.background.toJSON():this.background.isTexture&&(r.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(r.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){r.geometry=i(e.geometries,this.geometry);let t=this.geometry.parameters;if(t!==void 0&&t.shapes!==void 0){let n=t.shapes;if(Array.isArray(n))for(let t=0,r=n.length;t0){r.children=[];for(let t=0;t0){r.animations=[];for(let t=0;t0&&(n.geometries=t),r.length>0&&(n.materials=r),i.length>0&&(n.textures=i),o.length>0&&(n.images=o),s.length>0&&(n.shapes=s),c.length>0&&(n.skeletons=c),l.length>0&&(n.animations=l),u.length>0&&(n.nodes=u)}return n.object=r,n;function a(e){let t=[];for(let n in e){let r=e[n];delete r.metadata,t.push(r)}return t}}clone(e){return new this.constructor().copy(this,e)}copy(e,t=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.pivot=e.pivot===null?null:e.pivot.clone(),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldAutoUpdate=e.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.static=e.static,this.animations=e.animations.slice(),this.userData=JSON.parse(JSON.stringify(e.userData)),t===!0)for(let t=0;ts+l?(c.inputState.pinching=!1,this.dispatchEvent({type:`pinchend`,handedness:e.handedness,target:this})):!c.inputState.pinching&&o<=s-l&&(c.inputState.pinching=!0,this.dispatchEvent({type:`pinchstart`,handedness:e.handedness,target:this}))}else s!==null&&e.gripSpace&&(i=t.getPose(e.gripSpace,n),i!==null&&(s.matrix.fromArray(i.transform.matrix),s.matrix.decompose(s.position,s.rotation,s.scale),s.matrixWorldNeedsUpdate=!0,i.linearVelocity?(s.hasLinearVelocity=!0,s.linearVelocity.copy(i.linearVelocity)):s.hasLinearVelocity=!1,i.angularVelocity?(s.hasAngularVelocity=!0,s.angularVelocity.copy(i.angularVelocity)):s.hasAngularVelocity=!1,s.eventsEnabled&&s.dispatchEvent({type:`gripUpdated`,data:e,target:this})));o!==null&&(r=t.getPose(e.targetRaySpace,n),r===null&&i!==null&&(r=i),r!==null&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(Jn)))}return o!==null&&(o.visible=r!==null),s!==null&&(s.visible=i!==null),c!==null&&(c.visible=a!==null),this}_getHandJoint(e,t){if(e.joints[t.jointName]===void 0){let n=new qn;n.matrixAutoUpdate=!1,n.visible=!1,e.joints[t.jointName]=n,e.add(n)}return e.joints[t.jointName]}},Xn={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Zn={h:0,s:0,l:0},Qn={h:0,s:0,l:0};function $n(e,t,n){return n<0&&(n+=1),n>1&&--n,n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*6*(2/3-n):e}var X=class{constructor(e,t,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(e,t,n)}set(e,t,n){if(t===void 0&&n===void 0){let t=e;t&&t.isColor?this.copy(t):typeof t==`number`?this.setHex(t):typeof t==`string`&&this.setStyle(t)}else this.setRGB(e,t,n);return this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,t=at){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(e&255)/255,Y.colorSpaceToWorking(this,t),this}setRGB(e,t,n,r=Y.workingColorSpace){return this.r=e,this.g=t,this.b=n,Y.colorSpaceToWorking(this,r),this}setHSL(e,t,n,r=Y.workingColorSpace){if(e=At(e,1),t=W(t,0,1),n=W(n,0,1),t===0)this.r=this.g=this.b=n;else{let r=n<=.5?n*(1+t):n+t-n*t,i=2*n-r;this.r=$n(i,r,e+1/3),this.g=$n(i,r,e),this.b=$n(i,r,e-1/3)}return Y.colorSpaceToWorking(this,r),this}setStyle(e,t=at){function n(t){t!==void 0&&parseFloat(t)<1&&H(`Color: Alpha component of `+e+` will be ignored.`)}let r;if(r=/^(\w+)\(([^\)]*)\)/.exec(e)){let i,a=r[1],o=r[2];switch(a){case`rgb`:case`rgba`:if(i=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(i[4]),this.setRGB(Math.min(255,parseInt(i[1],10))/255,Math.min(255,parseInt(i[2],10))/255,Math.min(255,parseInt(i[3],10))/255,t);if(i=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(i[4]),this.setRGB(Math.min(100,parseInt(i[1],10))/100,Math.min(100,parseInt(i[2],10))/100,Math.min(100,parseInt(i[3],10))/100,t);break;case`hsl`:case`hsla`:if(i=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(i[4]),this.setHSL(parseFloat(i[1])/360,parseFloat(i[2])/100,parseFloat(i[3])/100,t);break;default:H(`Color: Unknown color model `+e)}}else if(r=/^\#([A-Fa-f\d]+)$/.exec(e)){let n=r[1],i=n.length;if(i===3)return this.setRGB(parseInt(n.charAt(0),16)/15,parseInt(n.charAt(1),16)/15,parseInt(n.charAt(2),16)/15,t);if(i===6)return this.setHex(parseInt(n,16),t);H(`Color: Invalid hex color `+e)}else if(e&&e.length>0)return this.setColorName(e,t);return this}setColorName(e,t=at){let n=Xn[e.toLowerCase()];return n===void 0?H(`Color: Unknown color `+e):this.setHex(n,t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=rn(e.r),this.g=rn(e.g),this.b=rn(e.b),this}copyLinearToSRGB(e){return this.r=an(e.r),this.g=an(e.g),this.b=an(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=at){return Y.workingToColorSpace(er.copy(this),e),Math.round(W(er.r*255,0,255))*65536+Math.round(W(er.g*255,0,255))*256+Math.round(W(er.b*255,0,255))}getHexString(e=at){return(`000000`+this.getHex(e).toString(16)).slice(-6)}getHSL(e,t=Y.workingColorSpace){Y.workingToColorSpace(er.copy(this),t);let n=er.r,r=er.g,i=er.b,a=Math.max(n,r,i),o=Math.min(n,r,i),s,c,l=(o+a)/2;if(o===a)s=0,c=0;else{let e=a-o;switch(c=l<=.5?e/(a+o):e/(2-a-o),a){case n:s=(r-i)/e+(r0&&(t.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(t.object.backgroundIntensity=this.backgroundIntensity),t.object.backgroundRotation=this.backgroundRotation.toArray(),this.environmentIntensity!==1&&(t.object.environmentIntensity=this.environmentIntensity),t.object.environmentRotation=this.environmentRotation.toArray(),t}},nr=new q,rr=new q,ir=new q,ar=new q,or=new q,sr=new q,cr=new q,lr=new q,ur=new q,dr=new q,fr=new mn,pr=new mn,mr=new mn,hr=class e{constructor(e=new q,t=new q,n=new q){this.a=e,this.b=t,this.c=n}static getNormal(e,t,n,r){r.subVectors(n,t),nr.subVectors(e,t),r.cross(nr);let i=r.lengthSq();return i>0?r.multiplyScalar(1/Math.sqrt(i)):r.set(0,0,0)}static getBarycoord(e,t,n,r,i){nr.subVectors(r,t),rr.subVectors(n,t),ir.subVectors(e,t);let a=nr.dot(nr),o=nr.dot(rr),s=nr.dot(ir),c=rr.dot(rr),l=rr.dot(ir),u=a*c-o*o;if(u===0)return i.set(0,0,0),null;let d=1/u,f=(c*s-o*l)*d,p=(a*l-o*s)*d;return i.set(1-f-p,p,f)}static containsPoint(e,t,n,r){return this.getBarycoord(e,t,n,r,ar)===null?!1:ar.x>=0&&ar.y>=0&&ar.x+ar.y<=1}static getInterpolation(e,t,n,r,i,a,o,s){return this.getBarycoord(e,t,n,r,ar)===null?(s.x=0,s.y=0,`z`in s&&(s.z=0),`w`in s&&(s.w=0),null):(s.setScalar(0),s.addScaledVector(i,ar.x),s.addScaledVector(a,ar.y),s.addScaledVector(o,ar.z),s)}static getInterpolatedAttribute(e,t,n,r,i,a){return fr.setScalar(0),pr.setScalar(0),mr.setScalar(0),fr.fromBufferAttribute(e,t),pr.fromBufferAttribute(e,n),mr.fromBufferAttribute(e,r),a.setScalar(0),a.addScaledVector(fr,i.x),a.addScaledVector(pr,i.y),a.addScaledVector(mr,i.z),a}static isFrontFacing(e,t,n,r){return nr.subVectors(n,t),rr.subVectors(e,t),nr.cross(rr).dot(r)<0}set(e,t,n){return this.a.copy(e),this.b.copy(t),this.c.copy(n),this}setFromPointsAndIndices(e,t,n,r){return this.a.copy(e[t]),this.b.copy(e[n]),this.c.copy(e[r]),this}setFromAttributeAndIndices(e,t,n,r){return this.a.fromBufferAttribute(e,t),this.b.fromBufferAttribute(e,n),this.c.fromBufferAttribute(e,r),this}clone(){return new this.constructor().copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return nr.subVectors(this.c,this.b),rr.subVectors(this.a,this.b),nr.cross(rr).length()*.5}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return e.getNormal(this.a,this.b,this.c,t)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,n){return e.getBarycoord(t,this.a,this.b,this.c,n)}getInterpolation(t,n,r,i,a){return e.getInterpolation(t,this.a,this.b,this.c,n,r,i,a)}containsPoint(t){return e.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return e.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,t){let n=this.a,r=this.b,i=this.c,a,o;or.subVectors(r,n),sr.subVectors(i,n),lr.subVectors(e,n);let s=or.dot(lr),c=sr.dot(lr);if(s<=0&&c<=0)return t.copy(n);ur.subVectors(e,r);let l=or.dot(ur),u=sr.dot(ur);if(l>=0&&u<=l)return t.copy(r);let d=s*u-l*c;if(d<=0&&s>=0&&l<=0)return a=s/(s-l),t.copy(n).addScaledVector(or,a);dr.subVectors(e,i);let f=or.dot(dr),p=sr.dot(dr);if(p>=0&&f<=p)return t.copy(i);let m=f*c-s*p;if(m<=0&&c>=0&&p<=0)return o=c/(c-p),t.copy(n).addScaledVector(sr,o);let h=l*p-f*u;if(h<=0&&u-l>=0&&f-p>=0)return cr.subVectors(i,r),o=(u-l)/(u-l+(f-p)),t.copy(r).addScaledVector(cr,o);let g=1/(h+m+d);return a=m*g,o=d*g,t.copy(n).addScaledVector(or,a).addScaledVector(sr,o)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}},gr=class{constructor(e=new q(1/0,1/0,1/0),t=new q(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=e,this.max=t}set(e,t){return this.min.copy(e),this.max.copy(t),this}setFromArray(e){this.makeEmpty();for(let t=0,n=e.length;t=this.min.x&&e.x<=this.max.x&&e.y>=this.min.y&&e.y<=this.max.y&&e.z>=this.min.z&&e.z<=this.max.z}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,t){return t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return e.max.x>=this.min.x&&e.min.x<=this.max.x&&e.max.y>=this.min.y&&e.min.y<=this.max.y&&e.max.z>=this.min.z&&e.min.z<=this.max.z}intersectsSphere(e){return this.clampPoint(e.center,vr),vr.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let t,n;return e.normal.x>0?(t=e.normal.x*this.min.x,n=e.normal.x*this.max.x):(t=e.normal.x*this.max.x,n=e.normal.x*this.min.x),e.normal.y>0?(t+=e.normal.y*this.min.y,n+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,n+=e.normal.y*this.min.y),e.normal.z>0?(t+=e.normal.z*this.min.z,n+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,n+=e.normal.z*this.min.z),t<=-e.constant&&n>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(Er),Dr.subVectors(this.max,Er),br.subVectors(e.a,Er),xr.subVectors(e.b,Er),Sr.subVectors(e.c,Er),Cr.subVectors(xr,br),wr.subVectors(Sr,xr),Tr.subVectors(br,Sr);let t=[0,-Cr.z,Cr.y,0,-wr.z,wr.y,0,-Tr.z,Tr.y,Cr.z,0,-Cr.x,wr.z,0,-wr.x,Tr.z,0,-Tr.x,-Cr.y,Cr.x,0,-wr.y,wr.x,0,-Tr.y,Tr.x,0];return!Ar(t,br,xr,Sr,Dr)||(t=[1,0,0,0,1,0,0,0,1],!Ar(t,br,xr,Sr,Dr))?!1:(Or.crossVectors(Cr,wr),t=[Or.x,Or.y,Or.z],Ar(t,br,xr,Sr,Dr))}clampPoint(e,t){return t.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,vr).distanceTo(e)}getBoundingSphere(e){return this.isEmpty()?e.makeEmpty():(this.getCenter(e.center),e.radius=this.getSize(vr).length()*.5),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()?this:(_r[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),_r[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),_r[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),_r[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),_r[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),_r[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),_r[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),_r[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(_r),this)}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(e){return this.min.fromArray(e.min),this.max.fromArray(e.max),this}},_r=[new q,new q,new q,new q,new q,new q,new q,new q],vr=new q,yr=new gr,br=new q,xr=new q,Sr=new q,Cr=new q,wr=new q,Tr=new q,Er=new q,Dr=new q,Or=new q,kr=new q;function Ar(e,t,n,r,i){for(let a=0,o=e.length-3;a<=o;a+=3){kr.fromArray(e,a);let o=i.x*Math.abs(kr.x)+i.y*Math.abs(kr.y)+i.z*Math.abs(kr.z),s=t.dot(kr),c=n.dot(kr),l=r.dot(kr);if(Math.max(-Math.max(s,c,l),Math.min(s,c,l))>o)return!1}return!0}var jr=new q,Mr=new K,Nr=0,Pr=class extends wt{constructor(e,t,n=!1){if(super(),Array.isArray(e))throw TypeError(`THREE.BufferAttribute: array should be a Typed Array.`);this.isBufferAttribute=!0,Object.defineProperty(this,`id`,{value:Nr++}),this.name=``,this.array=e,this.itemSize=t,this.count=e===void 0?0:e.length/t,this.normalized=n,this.usage=ut,this.updateRanges=[],this.gpuType=oe,this.version=0}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this.gpuType=e.gpuType,this}copyAt(e,t,n){e*=this.itemSize,n*=t.itemSize;for(let r=0,i=this.itemSize;rthis.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius*=e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){if(this.isEmpty())return this.center.copy(e),this.radius=0,this;zr.subVectors(e,this.center);let t=zr.lengthSq();if(t>this.radius*this.radius){let e=Math.sqrt(t),n=(e-this.radius)*.5;this.center.addScaledVector(zr,n/e),this.radius+=n}return this}union(e){return e.isEmpty()?this:this.isEmpty()?(this.copy(e),this):(this.center.equals(e.center)===!0?this.radius=Math.max(this.radius,e.radius):(Br.subVectors(e.center,this.center).setLength(e.radius),this.expandByPoint(zr.copy(e.center).add(Br)),this.expandByPoint(zr.copy(e.center).sub(Br))),this)}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return new this.constructor().copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(e){return this.radius=e.radius,this.center.fromArray(e.center),this}},Hr=0,Ur=new yn,Wr=new Kn,Gr=new q,Kr=new gr,qr=new gr,Jr=new q,Yr=class e extends wt{constructor(){super(),this.isBufferGeometry=!0,Object.defineProperty(this,`id`,{value:Hr++}),this.uuid=kt(),this.name=``,this.type=`BufferGeometry`,this.index=null,this.indirect=null,this.indirectOffset=0,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(e){return Array.isArray(e)?this.index=new(pt(e)?Ir:Fr)(e,1):this.index=e,this}setIndirect(e,t=0){return this.indirect=e,this.indirectOffset=t,this}getIndirect(){return this.indirect}getAttribute(e){return this.attributes[e]}setAttribute(e,t){return this.attributes[e]=t,this}deleteAttribute(e){return delete this.attributes[e],this}hasAttribute(e){return this.attributes[e]!==void 0}addGroup(e,t,n=0){this.groups.push({start:e,count:t,materialIndex:n})}clearGroups(){this.groups=[]}setDrawRange(e,t){this.drawRange.start=e,this.drawRange.count=t}applyMatrix4(e){let t=this.attributes.position;t!==void 0&&(t.applyMatrix4(e),t.needsUpdate=!0);let n=this.attributes.normal;if(n!==void 0){let t=new J().getNormalMatrix(e);n.applyNormalMatrix(t),n.needsUpdate=!0}let r=this.attributes.tangent;return r!==void 0&&(r.transformDirection(e),r.needsUpdate=!0),this.boundingBox!==null&&this.computeBoundingBox(),this.boundingSphere!==null&&this.computeBoundingSphere(),this}applyQuaternion(e){return Ur.makeRotationFromQuaternion(e),this.applyMatrix4(Ur),this}rotateX(e){return Ur.makeRotationX(e),this.applyMatrix4(Ur),this}rotateY(e){return Ur.makeRotationY(e),this.applyMatrix4(Ur),this}rotateZ(e){return Ur.makeRotationZ(e),this.applyMatrix4(Ur),this}translate(e,t,n){return Ur.makeTranslation(e,t,n),this.applyMatrix4(Ur),this}scale(e,t,n){return Ur.makeScale(e,t,n),this.applyMatrix4(Ur),this}lookAt(e){return Wr.lookAt(e),Wr.updateMatrix(),this.applyMatrix4(Wr.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(Gr).negate(),this.translate(Gr.x,Gr.y,Gr.z),this}setFromPoints(e){let t=this.getAttribute(`position`);if(t===void 0){let t=[];for(let n=0,r=e.length;nt.count&&H(`BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry.`),t.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new gr);let e=this.attributes.position,t=this.morphAttributes.position;if(e&&e.isGLBufferAttribute){U(`BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.`,this),this.boundingBox.set(new q(-1/0,-1/0,-1/0),new q(1/0,1/0,1/0));return}if(e!==void 0){if(this.boundingBox.setFromBufferAttribute(e),t)for(let e=0,n=t.length;e0&&(e.userData=this.userData),this.parameters!==void 0){let t=this.parameters;for(let n in t)t[n]!==void 0&&(e[n]=t[n]);return e}e.data={attributes:{}};let t=this.index;t!==null&&(e.data.index={type:t.array.constructor.name,array:Array.prototype.slice.call(t.array)});let n=this.attributes;for(let t in n){let r=n[t];e.data.attributes[t]=r.toJSON(e.data)}let r={},i=!1;for(let t in this.morphAttributes){let n=this.morphAttributes[t],a=[];for(let t=0,r=n.length;t0&&(r[t]=a,i=!0)}i&&(e.data.morphAttributes=r,e.data.morphTargetsRelative=this.morphTargetsRelative);let a=this.groups;a.length>0&&(e.data.groups=JSON.parse(JSON.stringify(a)));let o=this.boundingSphere;return o!==null&&(e.data.boundingSphere=o.toJSON()),e}clone(){return new this.constructor().copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;let t={};this.name=e.name;let n=e.index;n!==null&&this.setIndex(n.clone());let r=e.attributes;for(let e in r){let n=r[e];this.setAttribute(e,n.clone(t))}let i=e.morphAttributes;for(let e in i){let n=[],r=i[e];for(let e=0,i=r.length;e0!=e>0&&this.version++,this._alphaTest=e}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(e!==void 0)for(let t in e){let n=e[t];if(n===void 0){H(`Material: parameter '${t}' has value of undefined.`);continue}let r=this[t];if(r===void 0){H(`Material: '${t}' is not a property of THREE.${this.type}.`);continue}r&&r.isColor?r.set(n):r&&r.isVector3&&n&&n.isVector3?r.copy(n):this[t]=n}}toJSON(e){let t=e===void 0||typeof e==`string`;t&&(e={textures:{},images:{}});let n={metadata:{version:4.7,type:`Material`,generator:`Material.toJSON`}};n.uuid=this.uuid,n.type=this.type,this.name!==``&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(n.sheenColorMap=this.sheenColorMap.toJSON(e).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(n.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(e).uuid),this.dispersion!==void 0&&(n.dispersion=this.dispersion),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(e).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(e).uuid),this.anisotropy!==void 0&&(n.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(e).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(e).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(e).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(e).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(e).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(e).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(e).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapRotation!==void 0&&(n.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(e).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(e).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(e).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.shadowSide!==null&&(n.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==1&&(n.blending=this.blending),this.side!==0&&(n.side=this.side),this.vertexColors===!0&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),this.transparent===!0&&(n.transparent=!0),this.blendSrc!==204&&(n.blendSrc=this.blendSrc),this.blendDst!==205&&(n.blendDst=this.blendDst),this.blendEquation!==100&&(n.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(n.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(n.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(n.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(n.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(n.blendAlpha=this.blendAlpha),this.depthFunc!==3&&(n.depthFunc=this.depthFunc),this.depthTest===!1&&(n.depthTest=this.depthTest),this.depthWrite===!1&&(n.depthWrite=this.depthWrite),this.colorWrite===!1&&(n.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(n.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==519&&(n.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(n.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(n.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==7680&&(n.stencilFail=this.stencilFail),this.stencilZFail!==7680&&(n.stencilZFail=this.stencilZFail),this.stencilZPass!==7680&&(n.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(n.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(n.rotation=this.rotation),this.polygonOffset===!0&&(n.polygonOffset=!0),this.polygonOffsetFactor!==0&&(n.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(n.linewidth=this.linewidth),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.dithering===!0&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),this.alphaHash===!0&&(n.alphaHash=!0),this.alphaToCoverage===!0&&(n.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(n.premultipliedAlpha=!0),this.forceSinglePass===!0&&(n.forceSinglePass=!0),this.allowOverride===!1&&(n.allowOverride=!1),this.wireframe===!0&&(n.wireframe=!0),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!==`round`&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!==`round`&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(n.flatShading=!0),this.visible===!1&&(n.visible=!1),this.toneMapped===!1&&(n.toneMapped=!1),this.fog===!1&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData);function r(e){let t=[];for(let n in e){let r=e[n];delete r.metadata,t.push(r)}return t}if(t){let t=r(e.textures),i=r(e.images);t.length>0&&(n.textures=t),i.length>0&&(n.images=i)}return n}clone(){return new this.constructor().copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.blendColor.copy(e.blendColor),this.blendAlpha=e.blendAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;let t=e.clippingPlanes,n=null;if(t!==null){let e=t.length;n=Array(e);for(let r=0;r!==e;++r)n[r]=t[r].clone()}return this.clippingPlanes=n,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaHash=e.alphaHash,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.forceSinglePass=e.forceSinglePass,this.allowOverride=e.allowOverride,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:`dispose`})}set needsUpdate(e){e===!0&&this.version++}},ti=class extends ei{constructor(e){super(),this.isSpriteMaterial=!0,this.type=`SpriteMaterial`,this.color=new X(16777215),this.map=null,this.alphaMap=null,this.rotation=0,this.sizeAttenuation=!0,this.transparent=!0,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.alphaMap=e.alphaMap,this.rotation=e.rotation,this.sizeAttenuation=e.sizeAttenuation,this.fog=e.fog,this}},ni,ri=new q,ii=new q,ai=new q,oi=new K,si=new K,ci=new yn,li=new q,ui=new q,di=new q,fi=new K,pi=new K,mi=new K,hi=class extends Kn{constructor(e=new ti){if(super(),this.isSprite=!0,this.type=`Sprite`,ni===void 0){ni=new Yr;let e=new Xr(new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]),5);ni.setIndex([0,1,2,0,2,3]),ni.setAttribute(`position`,new Qr(e,3,0,!1)),ni.setAttribute(`uv`,new Qr(e,2,3,!1))}this.geometry=ni,this.material=e,this.center=new K(.5,.5),this.count=1}raycast(e,t){e.camera===null&&U(`Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.`),ii.setFromMatrixScale(this.matrixWorld),ci.copy(e.camera.matrixWorld),this.modelViewMatrix.multiplyMatrices(e.camera.matrixWorldInverse,this.matrixWorld),ai.setFromMatrixPosition(this.modelViewMatrix),e.camera.isPerspectiveCamera&&this.material.sizeAttenuation===!1&&ii.multiplyScalar(-ai.z);let n=this.material.rotation,r,i;n!==0&&(i=Math.cos(n),r=Math.sin(n));let a=this.center;gi(li.set(-.5,-.5,0),ai,a,ii,r,i),gi(ui.set(.5,-.5,0),ai,a,ii,r,i),gi(di.set(.5,.5,0),ai,a,ii,r,i),fi.set(0,0),pi.set(1,0),mi.set(1,1);let o=e.ray.intersectTriangle(li,ui,di,!1,ri);if(o===null&&(gi(ui.set(-.5,.5,0),ai,a,ii,r,i),pi.set(0,1),o=e.ray.intersectTriangle(li,di,ui,!1,ri),o===null))return;let s=e.ray.origin.distanceTo(ri);se.far||t.push({distance:s,point:ri.clone(),uv:hr.getInterpolation(ri,li,ui,di,fi,pi,mi,new K),face:null,object:this})}copy(e,t){return super.copy(e,t),e.center!==void 0&&this.center.copy(e.center),this.material=e.material,this}};function gi(e,t,n,r,i,a){oi.subVectors(e,n).addScalar(.5).multiply(r),i===void 0?si.copy(oi):(si.x=a*oi.x-i*oi.y,si.y=i*oi.x+a*oi.y),e.copy(t),e.x+=si.x,e.y+=si.y,e.applyMatrix4(ci)}var _i=new q,vi=new q,yi=new q,bi=new q,xi=new q,Si=new q,Ci=new q,wi=class{constructor(e=new q,t=new q(0,0,-1)){this.origin=e,this.direction=t}set(e,t){return this.origin.copy(e),this.direction.copy(t),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,t){return t.copy(this.origin).addScaledVector(this.direction,e)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,_i)),this}closestPointToPoint(e,t){t.subVectors(e,this.origin);let n=t.dot(this.direction);return n<0?t.copy(this.origin):t.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){let t=_i.subVectors(e,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(e):(_i.copy(this.origin).addScaledVector(this.direction,t),_i.distanceToSquared(e))}distanceSqToSegment(e,t,n,r){vi.copy(e).add(t).multiplyScalar(.5),yi.copy(t).sub(e).normalize(),bi.copy(this.origin).sub(vi);let i=e.distanceTo(t)*.5,a=-this.direction.dot(yi),o=bi.dot(this.direction),s=-bi.dot(yi),c=bi.lengthSq(),l=Math.abs(1-a*a),u,d,f,p;if(l>0)if(u=a*s-o,d=a*o-s,p=i*l,u>=0)if(d>=-p)if(d<=p){let e=1/l;u*=e,d*=e,f=u*(u+a*d+2*o)+d*(a*u+d+2*s)+c}else d=i,u=Math.max(0,-(a*d+o)),f=-u*u+d*(d+2*s)+c;else d=-i,u=Math.max(0,-(a*d+o)),f=-u*u+d*(d+2*s)+c;else d<=-p?(u=Math.max(0,-(-a*i+o)),d=u>0?-i:Math.min(Math.max(-i,-s),i),f=-u*u+d*(d+2*s)+c):d<=p?(u=0,d=Math.min(Math.max(-i,-s),i),f=d*(d+2*s)+c):(u=Math.max(0,-(a*i+o)),d=u>0?i:Math.min(Math.max(-i,-s),i),f=-u*u+d*(d+2*s)+c);else d=a>0?-i:i,u=Math.max(0,-(a*d+o)),f=-u*u+d*(d+2*s)+c;return n&&n.copy(this.origin).addScaledVector(this.direction,u),r&&r.copy(vi).addScaledVector(yi,d),f}intersectSphere(e,t){_i.subVectors(e.center,this.origin);let n=_i.dot(this.direction),r=_i.dot(_i)-n*n,i=e.radius*e.radius;if(r>i)return null;let a=Math.sqrt(i-r),o=n-a,s=n+a;return s<0?null:o<0?this.at(s,t):this.at(o,t)}intersectsSphere(e){return e.radius<0?!1:this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){let t=e.normal.dot(this.direction);if(t===0)return e.distanceToPoint(this.origin)===0?0:null;let n=-(this.origin.dot(e.normal)+e.constant)/t;return n>=0?n:null}intersectPlane(e,t){let n=this.distanceToPlane(e);return n===null?null:this.at(n,t)}intersectsPlane(e){let t=e.distanceToPoint(this.origin);return t===0||e.normal.dot(this.direction)*t<0}intersectBox(e,t){let n,r,i,a,o,s,c=1/this.direction.x,l=1/this.direction.y,u=1/this.direction.z,d=this.origin;return c>=0?(n=(e.min.x-d.x)*c,r=(e.max.x-d.x)*c):(n=(e.max.x-d.x)*c,r=(e.min.x-d.x)*c),l>=0?(i=(e.min.y-d.y)*l,a=(e.max.y-d.y)*l):(i=(e.max.y-d.y)*l,a=(e.min.y-d.y)*l),n>a||i>r||((i>n||isNaN(n))&&(n=i),(a=0?(o=(e.min.z-d.z)*u,s=(e.max.z-d.z)*u):(o=(e.max.z-d.z)*u,s=(e.min.z-d.z)*u),n>s||o>r)||((o>n||n!==n)&&(n=o),(s=0?n:r,t)}intersectsBox(e){return this.intersectBox(e,_i)!==null}intersectTriangle(e,t,n,r,i){xi.subVectors(t,e),Si.subVectors(n,e),Ci.crossVectors(xi,Si);let a=this.direction.dot(Ci),o;if(a>0){if(r)return null;o=1}else if(a<0)o=-1,a=-a;else return null;bi.subVectors(this.origin,e);let s=o*this.direction.dot(Si.crossVectors(bi,Si));if(s<0)return null;let c=o*this.direction.dot(xi.cross(bi));if(c<0||s+c>a)return null;let l=-o*bi.dot(Ci);return l<0?null:this.at(l/a,i)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}},Ti=class extends ei{constructor(e){super(),this.isMeshBasicMaterial=!0,this.type=`MeshBasicMaterial`,this.color=new X(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new kn,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap=`round`,this.wireframeLinejoin=`round`,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}},Ei=new yn,Di=new wi,Oi=new Vr,ki=new q,Ai=new q,ji=new q,Mi=new q,Ni=new q,Pi=new q,Fi=new q,Ii=new q,Li=class extends Kn{constructor(e=new Yr,t=new Ti){super(),this.isMesh=!0,this.type=`Mesh`,this.geometry=e,this.material=t,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.count=1,this.updateMorphTargets()}copy(e,t){return super.copy(e,t),e.morphTargetInfluences!==void 0&&(this.morphTargetInfluences=e.morphTargetInfluences.slice()),e.morphTargetDictionary!==void 0&&(this.morphTargetDictionary=Object.assign({},e.morphTargetDictionary)),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}updateMorphTargets(){let e=this.geometry.morphAttributes,t=Object.keys(e);if(t.length>0){let n=e[t[0]];if(n!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,t=n.length;e(e.far-e.near)**2))&&(Ei.copy(i).invert(),Di.copy(e.ray).applyMatrix4(Ei),!(n.boundingBox!==null&&Di.intersectsBox(n.boundingBox)===!1)&&this._computeIntersections(e,t,Di)))}_computeIntersections(e,t,n){let r,i=this.geometry,a=this.material,o=i.index,s=i.attributes.position,c=i.attributes.uv,l=i.attributes.uv1,u=i.attributes.normal,d=i.groups,f=i.drawRange;if(o!==null)if(Array.isArray(a))for(let i=0,s=d.length;in.far?null:{distance:l,point:Ii.clone(),object:e}}function zi(e,t,n,r,i,a,o,s,c,l){e.getVertexPosition(s,Ai),e.getVertexPosition(c,ji),e.getVertexPosition(l,Mi);let u=Ri(e,t,n,r,Ai,ji,Mi,Fi);if(u){let e=new q;hr.getBarycoord(Fi,Ai,ji,Mi,e),i&&(u.uv=hr.getInterpolatedAttribute(i,s,c,l,e,new K)),a&&(u.uv1=hr.getInterpolatedAttribute(a,s,c,l,e,new K)),o&&(u.normal=hr.getInterpolatedAttribute(o,s,c,l,e,new q),u.normal.dot(r.direction)>0&&u.normal.multiplyScalar(-1));let t={a:s,b:c,c:l,normal:new q,materialIndex:0};hr.getNormal(Ai,ji,Mi,t.normal),u.face=t,u.barycoord=e}return u}var Bi=class extends pn{constructor(e=null,t=1,n=1,r,i,a,o,s,c=O,l=O,u,d){super(null,a,o,s,c,l,r,i,u,d),this.isDataTexture=!0,this.image={data:e,width:t,height:n},this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}},Vi=new q,Hi=new q,Ui=new J,Wi=class{constructor(e=new q(1,0,0),t=0){this.isPlane=!0,this.normal=e,this.constant=t}set(e,t){return this.normal.copy(e),this.constant=t,this}setComponents(e,t,n,r){return this.normal.set(e,t,n),this.constant=r,this}setFromNormalAndCoplanarPoint(e,t){return this.normal.copy(e),this.constant=-t.dot(this.normal),this}setFromCoplanarPoints(e,t,n){let r=Vi.subVectors(n,t).cross(Hi.subVectors(e,t)).normalize();return this.setFromNormalAndCoplanarPoint(r,e),this}copy(e){return this.normal.copy(e.normal),this.constant=e.constant,this}normalize(){let e=1/this.normal.length();return this.normal.multiplyScalar(e),this.constant*=e,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}distanceToSphere(e){return this.distanceToPoint(e.center)-e.radius}projectPoint(e,t){return t.copy(e).addScaledVector(this.normal,-this.distanceToPoint(e))}intersectLine(e,t,n=!0){let r=e.delta(Vi),i=this.normal.dot(r);if(i===0)return this.distanceToPoint(e.start)===0?t.copy(e.start):null;let a=-(e.start.dot(this.normal)+this.constant)/i;return n===!0&&(a<0||a>1)?null:t.copy(e.start).addScaledVector(r,a)}intersectsLine(e){let t=this.distanceToPoint(e.start),n=this.distanceToPoint(e.end);return t<0&&n>0||n<0&&t>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,t){let n=t||Ui.getNormalMatrix(e),r=this.coplanarPoint(Vi).applyMatrix4(e),i=this.normal.applyMatrix3(n).normalize();return this.constant=-r.dot(i),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return new this.constructor().copy(this)}},Gi=new Vr,Ki=new K(.5,.5),qi=new q,Ji=class{constructor(e=new Wi,t=new Wi,n=new Wi,r=new Wi,i=new Wi,a=new Wi){this.planes=[e,t,n,r,i,a]}set(e,t,n,r,i,a){let o=this.planes;return o[0].copy(e),o[1].copy(t),o[2].copy(n),o[3].copy(r),o[4].copy(i),o[5].copy(a),this}copy(e){let t=this.planes;for(let n=0;n<6;n++)t[n].copy(e.planes[n]);return this}setFromProjectionMatrix(e,t=ft,n=!1){let r=this.planes,i=e.elements,a=i[0],o=i[1],s=i[2],c=i[3],l=i[4],u=i[5],d=i[6],f=i[7],p=i[8],m=i[9],h=i[10],g=i[11],_=i[12],v=i[13],y=i[14],b=i[15];if(r[0].setComponents(c-a,f-l,g-p,b-_).normalize(),r[1].setComponents(c+a,f+l,g+p,b+_).normalize(),r[2].setComponents(c+o,f+u,g+m,b+v).normalize(),r[3].setComponents(c-o,f-u,g-m,b-v).normalize(),n)r[4].setComponents(s,d,h,y).normalize(),r[5].setComponents(c-s,f-d,g-h,b-y).normalize();else if(r[4].setComponents(c-s,f-d,g-h,b-y).normalize(),t===2e3)r[5].setComponents(c+s,f+d,g+h,b+y).normalize();else if(t===2001)r[5].setComponents(s,d,h,y).normalize();else throw Error(`THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: `+t);return this}intersectsObject(e){if(e.boundingSphere!==void 0)e.boundingSphere===null&&e.computeBoundingSphere(),Gi.copy(e.boundingSphere).applyMatrix4(e.matrixWorld);else{let t=e.geometry;t.boundingSphere===null&&t.computeBoundingSphere(),Gi.copy(t.boundingSphere).applyMatrix4(e.matrixWorld)}return this.intersectsSphere(Gi)}intersectsSprite(e){return Gi.center.set(0,0,0),Gi.radius=.7071067811865476+Ki.distanceTo(e.center),Gi.applyMatrix4(e.matrixWorld),this.intersectsSphere(Gi)}intersectsSphere(e){let t=this.planes,n=e.center,r=-e.radius;for(let e=0;e<6;e++)if(t[e].distanceToPoint(n)0?e.max.x:e.min.x,qi.y=r.normal.y>0?e.max.y:e.min.y,qi.z=r.normal.z>0?e.max.z:e.min.z,r.distanceToPoint(qi)<0)return!1}return!0}containsPoint(e){let t=this.planes;for(let n=0;n<6;n++)if(t[n].distanceToPoint(e)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}},Yi=class extends ei{constructor(e){super(),this.isLineBasicMaterial=!0,this.type=`LineBasicMaterial`,this.color=new X(16777215),this.map=null,this.linewidth=1,this.linecap=`round`,this.linejoin=`round`,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this.fog=e.fog,this}},Xi=new q,Zi=new q,Qi=new yn,$i=new wi,ea=new Vr,ta=new q,na=new q,ra=class extends Kn{constructor(e=new Yr,t=new Yi){super(),this.isLine=!0,this.type=`Line`,this.geometry=e,this.material=t,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.updateMorphTargets()}copy(e,t){return super.copy(e,t),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}computeLineDistances(){let e=this.geometry;if(e.index===null){let t=e.attributes.position,n=[0];for(let e=1,r=t.count;e0){let n=e[t[0]];if(n!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,t=n.length;er)return;ta.applyMatrix4(e.matrixWorld);let c=t.ray.origin.distanceTo(ta);if(!(ct.far))return{distance:c,point:na.clone().applyMatrix4(e.matrixWorld),index:o,face:null,faceIndex:null,barycoord:null,object:e}}var aa=class extends pn{constructor(e=[],t=301,n,r,i,a,o,s,c,l){super(e,t,n,r,i,a,o,s,c,l),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(e){this.image=e}},oa=class extends pn{constructor(e,t,n,r,i,a,o,s,c){super(e,t,n,r,i,a,o,s,c),this.isCanvasTexture=!0,this.needsUpdate=!0}},sa=class extends pn{constructor(e,t,n=ae,r,i,a,o=O,s=O,c,l=he,u=1){if(l!==1026&&l!==1027)throw Error(`DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat`);super({width:e,height:t,depth:u},r,i,a,o,s,l,n,c),this.isDepthTexture=!0,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(e){return super.copy(e),this.source=new ln(Object.assign({},e.image)),this.compareFunction=e.compareFunction,this}toJSON(e){let t=super.toJSON(e);return this.compareFunction!==null&&(t.compareFunction=this.compareFunction),t}},ca=class extends sa{constructor(e,t=ae,n=301,r,i,a=O,o=O,s,c=he){let l={width:e,height:e,depth:1},u=[l,l,l,l,l,l];super(e,e,t,n,r,i,a,o,s,c),this.image=u,this.isCubeDepthTexture=!0,this.isCubeTexture=!0}get images(){return this.image}set images(e){this.image=e}},la=class extends pn{constructor(e=null){super(),this.sourceTexture=e,this.isExternalTexture=!0}copy(e){return super.copy(e),this.sourceTexture=e.sourceTexture,this}},ua=class e extends Yr{constructor(e=1,t=1,n=1,r=1,i=1,a=1){super(),this.type=`BoxGeometry`,this.parameters={width:e,height:t,depth:n,widthSegments:r,heightSegments:i,depthSegments:a};let o=this;r=Math.floor(r),i=Math.floor(i),a=Math.floor(a);let s=[],c=[],l=[],u=[],d=0,f=0;p(`z`,`y`,`x`,-1,-1,n,t,e,a,i,0),p(`z`,`y`,`x`,1,-1,n,t,-e,a,i,1),p(`x`,`z`,`y`,1,1,e,n,t,r,a,2),p(`x`,`z`,`y`,1,-1,e,n,-t,r,a,3),p(`x`,`y`,`z`,1,-1,e,t,n,r,i,4),p(`x`,`y`,`z`,-1,-1,e,t,-n,r,i,5),this.setIndex(s),this.setAttribute(`position`,new Lr(c,3)),this.setAttribute(`normal`,new Lr(l,3)),this.setAttribute(`uv`,new Lr(u,2));function p(e,t,n,r,i,a,p,m,h,g,_){let v=a/h,y=p/g,b=a/2,x=p/2,S=m/2,C=h+1,w=g+1,T=0,E=0,D=new q;for(let a=0;a0?1:-1,l.push(D.x,D.y,D.z),u.push(s/h),u.push(1-a/g),T+=1}for(let e=0;e0)&&f.push(t,i,c),(e!==n-1||s=0;--t)if(e[t]>=65535)return!0;return!1}function mt(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}function ht(e){return document.createElementNS(`http://www.w3.org/1999/xhtml`,e)}function gt(){let e=ht(`canvas`);return e.style.display=`block`,e}var _t={},vt=null;function yt(...e){let t=`THREE.`+e.shift();vt?vt(`log`,t,...e):console.log(t,...e)}function bt(e){let t=e[0];if(typeof t==`string`&&t.startsWith(`TSL:`)){let t=e[1];t&&t.isStackTrace?e[0]+=` `+t.getLocation():e[1]=`Stack trace not available. Enable "THREE.Node.captureStackTrace" to capture stack traces.`}return e}function H(...e){e=bt(e);let t=`THREE.`+e.shift();if(vt)vt(`warn`,t,...e);else{let n=e[0];n&&n.isStackTrace?console.warn(n.getError(t)):console.warn(t,...e)}}function U(...e){e=bt(e);let t=`THREE.`+e.shift();if(vt)vt(`error`,t,...e);else{let n=e[0];n&&n.isStackTrace?console.error(n.getError(t)):console.error(t,...e)}}function xt(...e){let t=e.join(` `);t in _t||(_t[t]=!0,H(...e))}function St(e,t,n){return new Promise(function(r,i){function a(){switch(e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0)){case e.WAIT_FAILED:i();break;case e.TIMEOUT_EXPIRED:setTimeout(a,n);break;default:r()}}setTimeout(a,n)})}var Ct={0:1,2:6,4:7,3:5,1:0,6:2,7:4,5:3},wt=class{addEventListener(e,t){this._listeners===void 0&&(this._listeners={});let n=this._listeners;n[e]===void 0&&(n[e]=[]),n[e].indexOf(t)===-1&&n[e].push(t)}hasEventListener(e,t){let n=this._listeners;return n===void 0?!1:n[e]!==void 0&&n[e].indexOf(t)!==-1}removeEventListener(e,t){let n=this._listeners;if(n===void 0)return;let r=n[e];if(r!==void 0){let e=r.indexOf(t);e!==-1&&r.splice(e,1)}}dispatchEvent(e){let t=this._listeners;if(t===void 0)return;let n=t[e.type];if(n!==void 0){e.target=this;let t=n.slice(0);for(let n=0,r=t.length;n>8&255]+Tt[e>>16&255]+Tt[e>>24&255]+`-`+Tt[t&255]+Tt[t>>8&255]+`-`+Tt[t>>16&15|64]+Tt[t>>24&255]+`-`+Tt[n&63|128]+Tt[n>>8&255]+`-`+Tt[n>>16&255]+Tt[n>>24&255]+Tt[r&255]+Tt[r>>8&255]+Tt[r>>16&255]+Tt[r>>24&255]).toLowerCase()}function W(e,t,n){return Math.max(t,Math.min(n,e))}function At(e,t){return(e%t+t)%t}function jt(e,t,n,r,i){return r+(e-t)*(i-r)/(n-t)}function Mt(e,t,n){return e===t?0:(n-e)/(t-e)}function Nt(e,t,n){return(1-n)*e+n*t}function Pt(e,t,n,r){return Nt(e,t,1-Math.exp(-n*r))}function Ft(e,t=1){return t-Math.abs(At(e,t*2)-t)}function It(e,t,n){return e<=t?0:e>=n?1:(e=(e-t)/(n-t),e*e*(3-2*e))}function Lt(e,t,n){return e<=t?0:e>=n?1:(e=(e-t)/(n-t),e*e*e*(e*(e*6-15)+10))}function Rt(e,t){return e+Math.floor(Math.random()*(t-e+1))}function zt(e,t){return e+Math.random()*(t-e)}function Bt(e){return e*(.5-Math.random())}function Vt(e){e!==void 0&&(Et=e);let t=Et+=1831565813;return t=Math.imul(t^t>>>15,t|1),t^=t+Math.imul(t^t>>>7,t|61),((t^t>>>14)>>>0)/4294967296}function Ht(e){return e*Dt}function Ut(e){return e*Ot}function Wt(e){return(e&e-1)==0&&e!==0}function Gt(e){return 2**Math.ceil(Math.log(e)/Math.LN2)}function Kt(e){return 2**Math.floor(Math.log(e)/Math.LN2)}function qt(e,t,n,r,i){let a=Math.cos,o=Math.sin,s=a(n/2),c=o(n/2),l=a((t+r)/2),u=o((t+r)/2),d=a((t-r)/2),f=o((t-r)/2),p=a((r-t)/2),m=o((r-t)/2);switch(i){case`XYX`:e.set(s*u,c*d,c*f,s*l);break;case`YZY`:e.set(c*f,s*u,c*d,s*l);break;case`ZXZ`:e.set(c*d,c*f,s*u,s*l);break;case`XZX`:e.set(s*u,c*m,c*p,s*l);break;case`YXY`:e.set(c*p,s*u,c*m,s*l);break;case`ZYZ`:e.set(c*m,c*p,s*u,s*l);break;default:H(`MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: `+i)}}function Jt(e,t){switch(t.constructor){case Float32Array:return e;case Uint32Array:return e/4294967295;case Uint16Array:return e/65535;case Uint8Array:return e/255;case Int32Array:return Math.max(e/2147483647,-1);case Int16Array:return Math.max(e/32767,-1);case Int8Array:return Math.max(e/127,-1);default:throw Error(`Invalid component type.`)}}function G(e,t){switch(t.constructor){case Float32Array:return e;case Uint32Array:return Math.round(e*4294967295);case Uint16Array:return Math.round(e*65535);case Uint8Array:return Math.round(e*255);case Int32Array:return Math.round(e*2147483647);case Int16Array:return Math.round(e*32767);case Int8Array:return Math.round(e*127);default:throw Error(`Invalid component type.`)}}var Yt={DEG2RAD:Dt,RAD2DEG:Ot,generateUUID:kt,clamp:W,euclideanModulo:At,mapLinear:jt,inverseLerp:Mt,lerp:Nt,damp:Pt,pingpong:Ft,smoothstep:It,smootherstep:Lt,randInt:Rt,randFloat:zt,randFloatSpread:Bt,seededRandom:Vt,degToRad:Ht,radToDeg:Ut,isPowerOfTwo:Wt,ceilPowerOfTwo:Gt,floorPowerOfTwo:Kt,setQuaternionFromProperEuler:qt,normalize:G,denormalize:Jt},K=class e{static{e.prototype.isVector2=!0}constructor(e=0,t=0){this.x=e,this.y=t}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,t){return this.x=e,this.y=t,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw Error(`index is out of range: `+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw Error(`index is out of range: `+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){let t=this.x,n=this.y,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6],this.y=r[1]*t+r[4]*n+r[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,t){return this.x=W(this.x,e.x,t.x),this.y=W(this.y,e.y,t.y),this}clampScalar(e,t){return this.x=W(this.x,e,t),this.y=W(this.y,e,t),this}clampLength(e,t){let n=this.length();return this.divideScalar(n||1).multiplyScalar(W(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){let t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;let n=this.dot(e)/t;return Math.acos(W(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){let t=this.x-e.x,n=this.y-e.y;return t*t+n*n}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this}rotateAround(e,t){let n=Math.cos(t),r=Math.sin(t),i=this.x-e.x,a=this.y-e.y;return this.x=i*n-a*r+e.x,this.y=i*r+a*n+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}},Xt=class{constructor(e=0,t=0,n=0,r=1){this.isQuaternion=!0,this._x=e,this._y=t,this._z=n,this._w=r}static slerpFlat(e,t,n,r,i,a,o){let s=n[r+0],c=n[r+1],l=n[r+2],u=n[r+3],d=i[a+0],f=i[a+1],p=i[a+2],m=i[a+3];if(u!==m||s!==d||c!==f||l!==p){let e=s*d+c*f+l*p+u*m;e<0&&(d=-d,f=-f,p=-p,m=-m,e=-e);let t=1-o;if(e<.9995){let n=Math.acos(e),r=Math.sin(n);t=Math.sin(t*n)/r,o=Math.sin(o*n)/r,s=s*t+d*o,c=c*t+f*o,l=l*t+p*o,u=u*t+m*o}else{s=s*t+d*o,c=c*t+f*o,l=l*t+p*o,u=u*t+m*o;let e=1/Math.sqrt(s*s+c*c+l*l+u*u);s*=e,c*=e,l*=e,u*=e}}e[t]=s,e[t+1]=c,e[t+2]=l,e[t+3]=u}static multiplyQuaternionsFlat(e,t,n,r,i,a){let o=n[r],s=n[r+1],c=n[r+2],l=n[r+3],u=i[a],d=i[a+1],f=i[a+2],p=i[a+3];return e[t]=o*p+l*u+s*f-c*d,e[t+1]=s*p+l*d+c*u-o*f,e[t+2]=c*p+l*f+o*d-s*u,e[t+3]=l*p-o*u-s*d-c*f,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,t,n,r){return this._x=e,this._y=t,this._z=n,this._w=r,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,t=!0){let n=e._x,r=e._y,i=e._z,a=e._order,o=Math.cos,s=Math.sin,c=o(n/2),l=o(r/2),u=o(i/2),d=s(n/2),f=s(r/2),p=s(i/2);switch(a){case`XYZ`:this._x=d*l*u+c*f*p,this._y=c*f*u-d*l*p,this._z=c*l*p+d*f*u,this._w=c*l*u-d*f*p;break;case`YXZ`:this._x=d*l*u+c*f*p,this._y=c*f*u-d*l*p,this._z=c*l*p-d*f*u,this._w=c*l*u+d*f*p;break;case`ZXY`:this._x=d*l*u-c*f*p,this._y=c*f*u+d*l*p,this._z=c*l*p+d*f*u,this._w=c*l*u-d*f*p;break;case`ZYX`:this._x=d*l*u-c*f*p,this._y=c*f*u+d*l*p,this._z=c*l*p-d*f*u,this._w=c*l*u+d*f*p;break;case`YZX`:this._x=d*l*u+c*f*p,this._y=c*f*u+d*l*p,this._z=c*l*p-d*f*u,this._w=c*l*u-d*f*p;break;case`XZY`:this._x=d*l*u-c*f*p,this._y=c*f*u-d*l*p,this._z=c*l*p+d*f*u,this._w=c*l*u+d*f*p;break;default:H(`Quaternion: .setFromEuler() encountered an unknown order: `+a)}return t===!0&&this._onChangeCallback(),this}setFromAxisAngle(e,t){let n=t/2,r=Math.sin(n);return this._x=e.x*r,this._y=e.y*r,this._z=e.z*r,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(e){let t=e.elements,n=t[0],r=t[4],i=t[8],a=t[1],o=t[5],s=t[9],c=t[2],l=t[6],u=t[10],d=n+o+u;if(d>0){let e=.5/Math.sqrt(d+1);this._w=.25/e,this._x=(l-s)*e,this._y=(i-c)*e,this._z=(a-r)*e}else if(n>o&&n>u){let e=2*Math.sqrt(1+n-o-u);this._w=(l-s)/e,this._x=.25*e,this._y=(r+a)/e,this._z=(i+c)/e}else if(o>u){let e=2*Math.sqrt(1+o-n-u);this._w=(i-c)/e,this._x=(r+a)/e,this._y=.25*e,this._z=(s+l)/e}else{let e=2*Math.sqrt(1+u-n-o);this._w=(a-r)/e,this._x=(i+c)/e,this._y=(s+l)/e,this._z=.25*e}return this._onChangeCallback(),this}setFromUnitVectors(e,t){let n=e.dot(t)+1;return n<1e-8?(n=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=n):(this._x=0,this._y=-e.z,this._z=e.y,this._w=n)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=n),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(W(this.dot(e),-1,1)))}rotateTowards(e,t){let n=this.angleTo(e);if(n===0)return this;let r=Math.min(1,t/n);return this.slerp(e,r),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x*=e,this._y*=e,this._z*=e,this._w*=e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,t){let n=e._x,r=e._y,i=e._z,a=e._w,o=t._x,s=t._y,c=t._z,l=t._w;return this._x=n*l+a*o+r*c-i*s,this._y=r*l+a*s+i*o-n*c,this._z=i*l+a*c+n*s-r*o,this._w=a*l-n*o-r*s-i*c,this._onChangeCallback(),this}slerp(e,t){let n=e._x,r=e._y,i=e._z,a=e._w,o=this.dot(e);o<0&&(n=-n,r=-r,i=-i,a=-a,o=-o);let s=1-t;if(o<.9995){let e=Math.acos(o),c=Math.sin(e);s=Math.sin(s*e)/c,t=Math.sin(t*e)/c,this._x=this._x*s+n*t,this._y=this._y*s+r*t,this._z=this._z*s+i*t,this._w=this._w*s+a*t,this._onChangeCallback()}else this._x=this._x*s+n*t,this._y=this._y*s+r*t,this._z=this._z*s+i*t,this._w=this._w*s+a*t,this.normalize();return this}slerpQuaternions(e,t,n){return this.copy(e).slerp(t,n)}random(){let e=2*Math.PI*Math.random(),t=2*Math.PI*Math.random(),n=Math.random(),r=Math.sqrt(1-n),i=Math.sqrt(n);return this.set(r*Math.sin(e),r*Math.cos(e),i*Math.sin(t),i*Math.cos(t))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,t=0){return this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e}fromBufferAttribute(e,t){return this._x=e.getX(t),this._y=e.getY(t),this._z=e.getZ(t),this._w=e.getW(t),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}},q=class e{static{e.prototype.isVector3=!0}constructor(e=0,t=0,n=0){this.x=e,this.y=t,this.z=n}set(e,t,n){return n===void 0&&(n=this.z),this.x=e,this.y=t,this.z=n,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw Error(`index is out of range: `+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error(`index is out of range: `+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this}applyEuler(e){return this.applyQuaternion(Qt.setFromEuler(e))}applyAxisAngle(e,t){return this.applyQuaternion(Qt.setFromAxisAngle(e,t))}applyMatrix3(e){let t=this.x,n=this.y,r=this.z,i=e.elements;return this.x=i[0]*t+i[3]*n+i[6]*r,this.y=i[1]*t+i[4]*n+i[7]*r,this.z=i[2]*t+i[5]*n+i[8]*r,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){let t=this.x,n=this.y,r=this.z,i=e.elements,a=1/(i[3]*t+i[7]*n+i[11]*r+i[15]);return this.x=(i[0]*t+i[4]*n+i[8]*r+i[12])*a,this.y=(i[1]*t+i[5]*n+i[9]*r+i[13])*a,this.z=(i[2]*t+i[6]*n+i[10]*r+i[14])*a,this}applyQuaternion(e){let t=this.x,n=this.y,r=this.z,i=e.x,a=e.y,o=e.z,s=e.w,c=2*(a*r-o*n),l=2*(o*t-i*r),u=2*(i*n-a*t);return this.x=t+s*c+a*u-o*l,this.y=n+s*l+o*c-i*u,this.z=r+s*u+i*l-a*c,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){let t=this.x,n=this.y,r=this.z,i=e.elements;return this.x=i[0]*t+i[4]*n+i[8]*r,this.y=i[1]*t+i[5]*n+i[9]*r,this.z=i[2]*t+i[6]*n+i[10]*r,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,t){return this.x=W(this.x,e.x,t.x),this.y=W(this.y,e.y,t.y),this.z=W(this.z,e.z,t.z),this}clampScalar(e,t){return this.x=W(this.x,e,t),this.y=W(this.y,e,t),this.z=W(this.z,e,t),this}clampLength(e,t){let n=this.length();return this.divideScalar(n||1).multiplyScalar(W(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,t){let n=e.x,r=e.y,i=e.z,a=t.x,o=t.y,s=t.z;return this.x=r*s-i*o,this.y=i*a-n*s,this.z=n*o-r*a,this}projectOnVector(e){let t=e.lengthSq();if(t===0)return this.set(0,0,0);let n=e.dot(this)/t;return this.copy(e).multiplyScalar(n)}projectOnPlane(e){return Zt.copy(this).projectOnVector(e),this.sub(Zt)}reflect(e){return this.sub(Zt.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){let t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;let n=this.dot(e)/t;return Math.acos(W(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){let t=this.x-e.x,n=this.y-e.y,r=this.z-e.z;return t*t+n*n+r*r}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,t,n){let r=Math.sin(t)*e;return this.x=r*Math.sin(n),this.y=Math.cos(t)*e,this.z=r*Math.cos(n),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,t,n){return this.x=e*Math.sin(t),this.y=n,this.z=e*Math.cos(t),this}setFromMatrixPosition(e){let t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(e){let t=this.setFromMatrixColumn(e,0).length(),n=this.setFromMatrixColumn(e,1).length(),r=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=n,this.z=r,this}setFromMatrixColumn(e,t){return this.fromArray(e.elements,t*4)}setFromMatrix3Column(e,t){return this.fromArray(e.elements,t*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}setFromColor(e){return this.x=e.r,this.y=e.g,this.z=e.b,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){let e=Math.random()*Math.PI*2,t=Math.random()*2-1,n=Math.sqrt(1-t*t);return this.x=n*Math.cos(e),this.y=t,this.z=n*Math.sin(e),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}},Zt=new q,Qt=new Xt,J=class e{static{e.prototype.isMatrix3=!0}constructor(e,t,n,r,i,a,o,s,c){this.elements=[1,0,0,0,1,0,0,0,1],e!==void 0&&this.set(e,t,n,r,i,a,o,s,c)}set(e,t,n,r,i,a,o,s,c){let l=this.elements;return l[0]=e,l[1]=r,l[2]=o,l[3]=t,l[4]=i,l[5]=s,l[6]=n,l[7]=a,l[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){let t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this}extractBasis(e,t,n){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(e){let t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){let n=e.elements,r=t.elements,i=this.elements,a=n[0],o=n[3],s=n[6],c=n[1],l=n[4],u=n[7],d=n[2],f=n[5],p=n[8],m=r[0],h=r[3],g=r[6],_=r[1],v=r[4],y=r[7],b=r[2],x=r[5],S=r[8];return i[0]=a*m+o*_+s*b,i[3]=a*h+o*v+s*x,i[6]=a*g+o*y+s*S,i[1]=c*m+l*_+u*b,i[4]=c*h+l*v+u*x,i[7]=c*g+l*y+u*S,i[2]=d*m+f*_+p*b,i[5]=d*h+f*v+p*x,i[8]=d*g+f*y+p*S,this}multiplyScalar(e){let t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this}determinant(){let e=this.elements,t=e[0],n=e[1],r=e[2],i=e[3],a=e[4],o=e[5],s=e[6],c=e[7],l=e[8];return t*a*l-t*o*c-n*i*l+n*o*s+r*i*c-r*a*s}invert(){let e=this.elements,t=e[0],n=e[1],r=e[2],i=e[3],a=e[4],o=e[5],s=e[6],c=e[7],l=e[8],u=l*a-o*c,d=o*s-l*i,f=c*i-a*s,p=t*u+n*d+r*f;if(p===0)return this.set(0,0,0,0,0,0,0,0,0);let m=1/p;return e[0]=u*m,e[1]=(r*c-l*n)*m,e[2]=(o*n-r*a)*m,e[3]=d*m,e[4]=(l*t-r*s)*m,e[5]=(r*i-o*t)*m,e[6]=f*m,e[7]=(n*s-c*t)*m,e[8]=(a*t-n*i)*m,this}transpose(){let e,t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){let t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this}setUvTransform(e,t,n,r,i,a,o){let s=Math.cos(i),c=Math.sin(i);return this.set(n*s,n*c,-n*(s*a+c*o)+a+e,-r*c,r*s,-r*(-c*a+s*o)+o+t,0,0,1),this}scale(e,t){return this.premultiply($t.makeScale(e,t)),this}rotate(e){return this.premultiply($t.makeRotation(-e)),this}translate(e,t){return this.premultiply($t.makeTranslation(e,t)),this}makeTranslation(e,t){return e.isVector2?this.set(1,0,e.x,0,1,e.y,0,0,1):this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){let t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,n,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}equals(e){let t=this.elements,n=e.elements;for(let e=0;e<9;e++)if(t[e]!==n[e])return!1;return!0}fromArray(e,t=0){for(let n=0;n<9;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){let n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e}clone(){return new this.constructor().fromArray(this.elements)}},$t=new J,en=new J().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),tn=new J().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function nn(){let e={enabled:!0,workingColorSpace:ot,spaces:{},convert:function(e,t,n){return this.enabled===!1||t===n||!t||!n?e:(this.spaces[t].transfer===`srgb`&&(e.r=rn(e.r),e.g=rn(e.g),e.b=rn(e.b)),this.spaces[t].primaries!==this.spaces[n].primaries&&(e.applyMatrix3(this.spaces[t].toXYZ),e.applyMatrix3(this.spaces[n].fromXYZ)),this.spaces[n].transfer===`srgb`&&(e.r=an(e.r),e.g=an(e.g),e.b=an(e.b)),e)},workingToColorSpace:function(e,t){return this.convert(e,this.workingColorSpace,t)},colorSpaceToWorking:function(e,t){return this.convert(e,t,this.workingColorSpace)},getPrimaries:function(e){return this.spaces[e].primaries},getTransfer:function(e){return e===``?st:this.spaces[e].transfer},getToneMappingMode:function(e){return this.spaces[e].outputColorSpaceConfig.toneMappingMode||`standard`},getLuminanceCoefficients:function(e,t=this.workingColorSpace){return e.fromArray(this.spaces[t].luminanceCoefficients)},define:function(e){Object.assign(this.spaces,e)},_getMatrix:function(e,t,n){return e.copy(this.spaces[t].toXYZ).multiply(this.spaces[n].fromXYZ)},_getDrawingBufferColorSpace:function(e){return this.spaces[e].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(e=this.workingColorSpace){return this.spaces[e].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(t,n){return xt(`ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace().`),e.workingToColorSpace(t,n)},toWorkingColorSpace:function(t,n){return xt(`ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking().`),e.colorSpaceToWorking(t,n)}},t=[.64,.33,.3,.6,.15,.06],n=[.2126,.7152,.0722],r=[.3127,.329];return e.define({[ot]:{primaries:t,whitePoint:r,transfer:st,toXYZ:en,fromXYZ:tn,luminanceCoefficients:n,workingColorSpaceConfig:{unpackColorSpace:at},outputColorSpaceConfig:{drawingBufferColorSpace:at}},[at]:{primaries:t,whitePoint:r,transfer:ct,toXYZ:en,fromXYZ:tn,luminanceCoefficients:n,outputColorSpaceConfig:{drawingBufferColorSpace:at}}}),e}var Y=nn();function rn(e){return e<.04045?e*.0773993808:(e*.9478672986+.0521327014)**2.4}function an(e){return e<.0031308?e*12.92:1.055*e**.41666-.055}var on,sn=class{static getDataURL(e,t=`image/png`){if(/^data:/i.test(e.src)||typeof HTMLCanvasElement>`u`)return e.src;let n;if(e instanceof HTMLCanvasElement)n=e;else{on===void 0&&(on=ht(`canvas`)),on.width=e.width,on.height=e.height;let t=on.getContext(`2d`);e instanceof ImageData?t.putImageData(e,0,0):t.drawImage(e,0,0,e.width,e.height),n=on}return n.toDataURL(t)}static sRGBToLinear(e){if(typeof HTMLImageElement<`u`&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<`u`&&e instanceof HTMLCanvasElement||typeof ImageBitmap<`u`&&e instanceof ImageBitmap){let t=ht(`canvas`);t.width=e.width,t.height=e.height;let n=t.getContext(`2d`);n.drawImage(e,0,0,e.width,e.height);let r=n.getImageData(0,0,e.width,e.height),i=r.data;for(let e=0;e1),this.pmremVersion=0,this.normalized=!1}get width(){return this.source.getSize(fn).x}get height(){return this.source.getSize(fn).y}get depth(){return this.source.getSize(fn).z}get image(){return this.source.data}set image(e){this.source.data=e}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return new this.constructor().copy(this)}copy(e){return this.name=e.name,this.source=e.source,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.channel=e.channel,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.internalFormat=e.internalFormat,this.type=e.type,this.normalized=e.normalized,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.colorSpace=e.colorSpace,this.renderTarget=e.renderTarget,this.isRenderTargetTexture=e.isRenderTargetTexture,this.isArrayTexture=e.isArrayTexture,this.userData=JSON.parse(JSON.stringify(e.userData)),this.needsUpdate=!0,this}setValues(e){for(let t in e){let n=e[t];if(n===void 0){H(`Texture.setValues(): parameter '${t}' has value of undefined.`);continue}let r=this[t];if(r===void 0){H(`Texture.setValues(): property '${t}' does not exist.`);continue}r&&n&&r.isVector2&&n.isVector2||r&&n&&r.isVector3&&n.isVector3||r&&n&&r.isMatrix3&&n.isMatrix3?r.copy(n):this[t]=n}}toJSON(e){let t=e===void 0||typeof e==`string`;if(!t&&e.textures[this.uuid]!==void 0)return e.textures[this.uuid];let n={metadata:{version:4.7,type:`Texture`,generator:`Texture.toJSON`},uuid:this.uuid,name:this.name,image:this.source.toJSON(e).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,normalized:this.normalized,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(n.userData=this.userData),t||(e.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:`dispose`})}transformUv(e){if(this.mapping!==300)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case T:e.x-=Math.floor(e.x);break;case E:e.x=e.x<0?0:1;break;case D:Math.abs(Math.floor(e.x)%2)===1?e.x=Math.ceil(e.x)-e.x:e.x-=Math.floor(e.x);break}if(e.y<0||e.y>1)switch(this.wrapT){case T:e.y-=Math.floor(e.y);break;case E:e.y=e.y<0?0:1;break;case D:Math.abs(Math.floor(e.y)%2)===1?e.y=Math.ceil(e.y)-e.y:e.y-=Math.floor(e.y);break}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){e===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(e){e===!0&&this.pmremVersion++}};pn.DEFAULT_IMAGE=null,pn.DEFAULT_MAPPING=300,pn.DEFAULT_ANISOTROPY=1;var mn=class e{static{e.prototype.isVector4=!0}constructor(e=0,t=0,n=0,r=1){this.x=e,this.y=t,this.z=n,this.w=r}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,t,n,r){return this.x=e,this.y=t,this.z=n,this.w=r,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw Error(`index is out of range: `+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error(`index is out of range: `+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w===void 0?1:e.w,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){let t=this.x,n=this.y,r=this.z,i=this.w,a=e.elements;return this.x=a[0]*t+a[4]*n+a[8]*r+a[12]*i,this.y=a[1]*t+a[5]*n+a[9]*r+a[13]*i,this.z=a[2]*t+a[6]*n+a[10]*r+a[14]*i,this.w=a[3]*t+a[7]*n+a[11]*r+a[15]*i,this}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this.w/=e.w,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);let t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this}setAxisAngleFromRotationMatrix(e){let t,n,r,i,a=.01,o=.1,s=e.elements,c=s[0],l=s[4],u=s[8],d=s[1],f=s[5],p=s[9],m=s[2],h=s[6],g=s[10];if(Math.abs(l-d)s&&e>_?e_?s1);this.dispose()}this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t)}clone(){return new this.constructor().copy(this)}copy(e){this.width=e.width,this.height=e.height,this.depth=e.depth,this.scissor.copy(e.scissor),this.scissorTest=e.scissorTest,this.viewport.copy(e.viewport),this.textures.length=0;for(let t=0,n=e.textures.length;t>>0}enable(e){this.mask|=1<1){for(let e=0;e1){for(let e=0;e0&&(r.userData=this.userData),r.layers=this.layers.mask,r.matrix=this.matrix.toArray(),r.up=this.up.toArray(),this.pivot!==null&&(r.pivot=this.pivot.toArray()),this.matrixAutoUpdate===!1&&(r.matrixAutoUpdate=!1),this.morphTargetDictionary!==void 0&&(r.morphTargetDictionary=Object.assign({},this.morphTargetDictionary)),this.morphTargetInfluences!==void 0&&(r.morphTargetInfluences=this.morphTargetInfluences.slice()),this.isInstancedMesh&&(r.type=`InstancedMesh`,r.count=this.count,r.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(r.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(r.type=`BatchedMesh`,r.perObjectFrustumCulled=this.perObjectFrustumCulled,r.sortObjects=this.sortObjects,r.drawRanges=this._drawRanges,r.reservedRanges=this._reservedRanges,r.geometryInfo=this._geometryInfo.map(e=>({...e,boundingBox:e.boundingBox?e.boundingBox.toJSON():void 0,boundingSphere:e.boundingSphere?e.boundingSphere.toJSON():void 0})),r.instanceInfo=this._instanceInfo.map(e=>({...e})),r.availableInstanceIds=this._availableInstanceIds.slice(),r.availableGeometryIds=this._availableGeometryIds.slice(),r.nextIndexStart=this._nextIndexStart,r.nextVertexStart=this._nextVertexStart,r.geometryCount=this._geometryCount,r.maxInstanceCount=this._maxInstanceCount,r.maxVertexCount=this._maxVertexCount,r.maxIndexCount=this._maxIndexCount,r.geometryInitialized=this._geometryInitialized,r.matricesTexture=this._matricesTexture.toJSON(e),r.indirectTexture=this._indirectTexture.toJSON(e),this._colorsTexture!==null&&(r.colorsTexture=this._colorsTexture.toJSON(e)),this.boundingSphere!==null&&(r.boundingSphere=this.boundingSphere.toJSON()),this.boundingBox!==null&&(r.boundingBox=this.boundingBox.toJSON()));function i(t,n){return t[n.uuid]===void 0&&(t[n.uuid]=n.toJSON(e)),n.uuid}if(this.isScene)this.background&&(this.background.isColor?r.background=this.background.toJSON():this.background.isTexture&&(r.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(r.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){r.geometry=i(e.geometries,this.geometry);let t=this.geometry.parameters;if(t!==void 0&&t.shapes!==void 0){let n=t.shapes;if(Array.isArray(n))for(let t=0,r=n.length;t0){r.children=[];for(let t=0;t0){r.animations=[];for(let t=0;t0&&(n.geometries=t),r.length>0&&(n.materials=r),i.length>0&&(n.textures=i),o.length>0&&(n.images=o),s.length>0&&(n.shapes=s),c.length>0&&(n.skeletons=c),l.length>0&&(n.animations=l),u.length>0&&(n.nodes=u)}return n.object=r,n;function a(e){let t=[];for(let n in e){let r=e[n];delete r.metadata,t.push(r)}return t}}clone(e){return new this.constructor().copy(this,e)}copy(e,t=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.pivot=e.pivot===null?null:e.pivot.clone(),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldAutoUpdate=e.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.static=e.static,this.animations=e.animations.slice(),this.userData=JSON.parse(JSON.stringify(e.userData)),t===!0)for(let t=0;ts+l?(c.inputState.pinching=!1,this.dispatchEvent({type:`pinchend`,handedness:e.handedness,target:this})):!c.inputState.pinching&&o<=s-l&&(c.inputState.pinching=!0,this.dispatchEvent({type:`pinchstart`,handedness:e.handedness,target:this}))}else s!==null&&e.gripSpace&&(i=t.getPose(e.gripSpace,n),i!==null&&(s.matrix.fromArray(i.transform.matrix),s.matrix.decompose(s.position,s.rotation,s.scale),s.matrixWorldNeedsUpdate=!0,i.linearVelocity?(s.hasLinearVelocity=!0,s.linearVelocity.copy(i.linearVelocity)):s.hasLinearVelocity=!1,i.angularVelocity?(s.hasAngularVelocity=!0,s.angularVelocity.copy(i.angularVelocity)):s.hasAngularVelocity=!1,s.eventsEnabled&&s.dispatchEvent({type:`gripUpdated`,data:e,target:this})));o!==null&&(r=t.getPose(e.targetRaySpace,n),r===null&&i!==null&&(r=i),r!==null&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(Jn)))}return o!==null&&(o.visible=r!==null),s!==null&&(s.visible=i!==null),c!==null&&(c.visible=a!==null),this}_getHandJoint(e,t){if(e.joints[t.jointName]===void 0){let n=new qn;n.matrixAutoUpdate=!1,n.visible=!1,e.joints[t.jointName]=n,e.add(n)}return e.joints[t.jointName]}},Xn={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Zn={h:0,s:0,l:0},Qn={h:0,s:0,l:0};function $n(e,t,n){return n<0&&(n+=1),n>1&&--n,n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*6*(2/3-n):e}var X=class{constructor(e,t,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(e,t,n)}set(e,t,n){if(t===void 0&&n===void 0){let t=e;t&&t.isColor?this.copy(t):typeof t==`number`?this.setHex(t):typeof t==`string`&&this.setStyle(t)}else this.setRGB(e,t,n);return this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,t=at){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(e&255)/255,Y.colorSpaceToWorking(this,t),this}setRGB(e,t,n,r=Y.workingColorSpace){return this.r=e,this.g=t,this.b=n,Y.colorSpaceToWorking(this,r),this}setHSL(e,t,n,r=Y.workingColorSpace){if(e=At(e,1),t=W(t,0,1),n=W(n,0,1),t===0)this.r=this.g=this.b=n;else{let r=n<=.5?n*(1+t):n+t-n*t,i=2*n-r;this.r=$n(i,r,e+1/3),this.g=$n(i,r,e),this.b=$n(i,r,e-1/3)}return Y.colorSpaceToWorking(this,r),this}setStyle(e,t=at){function n(t){t!==void 0&&parseFloat(t)<1&&H(`Color: Alpha component of `+e+` will be ignored.`)}let r;if(r=/^(\w+)\(([^\)]*)\)/.exec(e)){let i,a=r[1],o=r[2];switch(a){case`rgb`:case`rgba`:if(i=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(i[4]),this.setRGB(Math.min(255,parseInt(i[1],10))/255,Math.min(255,parseInt(i[2],10))/255,Math.min(255,parseInt(i[3],10))/255,t);if(i=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(i[4]),this.setRGB(Math.min(100,parseInt(i[1],10))/100,Math.min(100,parseInt(i[2],10))/100,Math.min(100,parseInt(i[3],10))/100,t);break;case`hsl`:case`hsla`:if(i=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(i[4]),this.setHSL(parseFloat(i[1])/360,parseFloat(i[2])/100,parseFloat(i[3])/100,t);break;default:H(`Color: Unknown color model `+e)}}else if(r=/^\#([A-Fa-f\d]+)$/.exec(e)){let n=r[1],i=n.length;if(i===3)return this.setRGB(parseInt(n.charAt(0),16)/15,parseInt(n.charAt(1),16)/15,parseInt(n.charAt(2),16)/15,t);if(i===6)return this.setHex(parseInt(n,16),t);H(`Color: Invalid hex color `+e)}else if(e&&e.length>0)return this.setColorName(e,t);return this}setColorName(e,t=at){let n=Xn[e.toLowerCase()];return n===void 0?H(`Color: Unknown color `+e):this.setHex(n,t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=rn(e.r),this.g=rn(e.g),this.b=rn(e.b),this}copyLinearToSRGB(e){return this.r=an(e.r),this.g=an(e.g),this.b=an(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=at){return Y.workingToColorSpace(er.copy(this),e),Math.round(W(er.r*255,0,255))*65536+Math.round(W(er.g*255,0,255))*256+Math.round(W(er.b*255,0,255))}getHexString(e=at){return(`000000`+this.getHex(e).toString(16)).slice(-6)}getHSL(e,t=Y.workingColorSpace){Y.workingToColorSpace(er.copy(this),t);let n=er.r,r=er.g,i=er.b,a=Math.max(n,r,i),o=Math.min(n,r,i),s,c,l=(o+a)/2;if(o===a)s=0,c=0;else{let e=a-o;switch(c=l<=.5?e/(a+o):e/(2-a-o),a){case n:s=(r-i)/e+(r0&&(t.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(t.object.backgroundIntensity=this.backgroundIntensity),t.object.backgroundRotation=this.backgroundRotation.toArray(),this.environmentIntensity!==1&&(t.object.environmentIntensity=this.environmentIntensity),t.object.environmentRotation=this.environmentRotation.toArray(),t}},nr=new q,rr=new q,ir=new q,ar=new q,or=new q,sr=new q,cr=new q,lr=new q,ur=new q,dr=new q,fr=new mn,pr=new mn,mr=new mn,hr=class e{constructor(e=new q,t=new q,n=new q){this.a=e,this.b=t,this.c=n}static getNormal(e,t,n,r){r.subVectors(n,t),nr.subVectors(e,t),r.cross(nr);let i=r.lengthSq();return i>0?r.multiplyScalar(1/Math.sqrt(i)):r.set(0,0,0)}static getBarycoord(e,t,n,r,i){nr.subVectors(r,t),rr.subVectors(n,t),ir.subVectors(e,t);let a=nr.dot(nr),o=nr.dot(rr),s=nr.dot(ir),c=rr.dot(rr),l=rr.dot(ir),u=a*c-o*o;if(u===0)return i.set(0,0,0),null;let d=1/u,f=(c*s-o*l)*d,p=(a*l-o*s)*d;return i.set(1-f-p,p,f)}static containsPoint(e,t,n,r){return this.getBarycoord(e,t,n,r,ar)===null?!1:ar.x>=0&&ar.y>=0&&ar.x+ar.y<=1}static getInterpolation(e,t,n,r,i,a,o,s){return this.getBarycoord(e,t,n,r,ar)===null?(s.x=0,s.y=0,`z`in s&&(s.z=0),`w`in s&&(s.w=0),null):(s.setScalar(0),s.addScaledVector(i,ar.x),s.addScaledVector(a,ar.y),s.addScaledVector(o,ar.z),s)}static getInterpolatedAttribute(e,t,n,r,i,a){return fr.setScalar(0),pr.setScalar(0),mr.setScalar(0),fr.fromBufferAttribute(e,t),pr.fromBufferAttribute(e,n),mr.fromBufferAttribute(e,r),a.setScalar(0),a.addScaledVector(fr,i.x),a.addScaledVector(pr,i.y),a.addScaledVector(mr,i.z),a}static isFrontFacing(e,t,n,r){return nr.subVectors(n,t),rr.subVectors(e,t),nr.cross(rr).dot(r)<0}set(e,t,n){return this.a.copy(e),this.b.copy(t),this.c.copy(n),this}setFromPointsAndIndices(e,t,n,r){return this.a.copy(e[t]),this.b.copy(e[n]),this.c.copy(e[r]),this}setFromAttributeAndIndices(e,t,n,r){return this.a.fromBufferAttribute(e,t),this.b.fromBufferAttribute(e,n),this.c.fromBufferAttribute(e,r),this}clone(){return new this.constructor().copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return nr.subVectors(this.c,this.b),rr.subVectors(this.a,this.b),nr.cross(rr).length()*.5}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return e.getNormal(this.a,this.b,this.c,t)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,n){return e.getBarycoord(t,this.a,this.b,this.c,n)}getInterpolation(t,n,r,i,a){return e.getInterpolation(t,this.a,this.b,this.c,n,r,i,a)}containsPoint(t){return e.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return e.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,t){let n=this.a,r=this.b,i=this.c,a,o;or.subVectors(r,n),sr.subVectors(i,n),lr.subVectors(e,n);let s=or.dot(lr),c=sr.dot(lr);if(s<=0&&c<=0)return t.copy(n);ur.subVectors(e,r);let l=or.dot(ur),u=sr.dot(ur);if(l>=0&&u<=l)return t.copy(r);let d=s*u-l*c;if(d<=0&&s>=0&&l<=0)return a=s/(s-l),t.copy(n).addScaledVector(or,a);dr.subVectors(e,i);let f=or.dot(dr),p=sr.dot(dr);if(p>=0&&f<=p)return t.copy(i);let m=f*c-s*p;if(m<=0&&c>=0&&p<=0)return o=c/(c-p),t.copy(n).addScaledVector(sr,o);let h=l*p-f*u;if(h<=0&&u-l>=0&&f-p>=0)return cr.subVectors(i,r),o=(u-l)/(u-l+(f-p)),t.copy(r).addScaledVector(cr,o);let g=1/(h+m+d);return a=m*g,o=d*g,t.copy(n).addScaledVector(or,a).addScaledVector(sr,o)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}},gr=class{constructor(e=new q(1/0,1/0,1/0),t=new q(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=e,this.max=t}set(e,t){return this.min.copy(e),this.max.copy(t),this}setFromArray(e){this.makeEmpty();for(let t=0,n=e.length;t=this.min.x&&e.x<=this.max.x&&e.y>=this.min.y&&e.y<=this.max.y&&e.z>=this.min.z&&e.z<=this.max.z}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,t){return t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return e.max.x>=this.min.x&&e.min.x<=this.max.x&&e.max.y>=this.min.y&&e.min.y<=this.max.y&&e.max.z>=this.min.z&&e.min.z<=this.max.z}intersectsSphere(e){return this.clampPoint(e.center,vr),vr.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let t,n;return e.normal.x>0?(t=e.normal.x*this.min.x,n=e.normal.x*this.max.x):(t=e.normal.x*this.max.x,n=e.normal.x*this.min.x),e.normal.y>0?(t+=e.normal.y*this.min.y,n+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,n+=e.normal.y*this.min.y),e.normal.z>0?(t+=e.normal.z*this.min.z,n+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,n+=e.normal.z*this.min.z),t<=-e.constant&&n>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(Er),Dr.subVectors(this.max,Er),br.subVectors(e.a,Er),xr.subVectors(e.b,Er),Sr.subVectors(e.c,Er),Cr.subVectors(xr,br),wr.subVectors(Sr,xr),Tr.subVectors(br,Sr);let t=[0,-Cr.z,Cr.y,0,-wr.z,wr.y,0,-Tr.z,Tr.y,Cr.z,0,-Cr.x,wr.z,0,-wr.x,Tr.z,0,-Tr.x,-Cr.y,Cr.x,0,-wr.y,wr.x,0,-Tr.y,Tr.x,0];return!Ar(t,br,xr,Sr,Dr)||(t=[1,0,0,0,1,0,0,0,1],!Ar(t,br,xr,Sr,Dr))?!1:(Or.crossVectors(Cr,wr),t=[Or.x,Or.y,Or.z],Ar(t,br,xr,Sr,Dr))}clampPoint(e,t){return t.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,vr).distanceTo(e)}getBoundingSphere(e){return this.isEmpty()?e.makeEmpty():(this.getCenter(e.center),e.radius=this.getSize(vr).length()*.5),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()?this:(_r[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),_r[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),_r[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),_r[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),_r[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),_r[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),_r[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),_r[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(_r),this)}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(e){return this.min.fromArray(e.min),this.max.fromArray(e.max),this}},_r=[new q,new q,new q,new q,new q,new q,new q,new q],vr=new q,yr=new gr,br=new q,xr=new q,Sr=new q,Cr=new q,wr=new q,Tr=new q,Er=new q,Dr=new q,Or=new q,kr=new q;function Ar(e,t,n,r,i){for(let a=0,o=e.length-3;a<=o;a+=3){kr.fromArray(e,a);let o=i.x*Math.abs(kr.x)+i.y*Math.abs(kr.y)+i.z*Math.abs(kr.z),s=t.dot(kr),c=n.dot(kr),l=r.dot(kr);if(Math.max(-Math.max(s,c,l),Math.min(s,c,l))>o)return!1}return!0}var jr=new q,Mr=new K,Nr=0,Pr=class extends wt{constructor(e,t,n=!1){if(super(),Array.isArray(e))throw TypeError(`THREE.BufferAttribute: array should be a Typed Array.`);this.isBufferAttribute=!0,Object.defineProperty(this,`id`,{value:Nr++}),this.name=``,this.array=e,this.itemSize=t,this.count=e===void 0?0:e.length/t,this.normalized=n,this.usage=ut,this.updateRanges=[],this.gpuType=oe,this.version=0}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this.gpuType=e.gpuType,this}copyAt(e,t,n){e*=this.itemSize,n*=t.itemSize;for(let r=0,i=this.itemSize;rthis.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius*=e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){if(this.isEmpty())return this.center.copy(e),this.radius=0,this;zr.subVectors(e,this.center);let t=zr.lengthSq();if(t>this.radius*this.radius){let e=Math.sqrt(t),n=(e-this.radius)*.5;this.center.addScaledVector(zr,n/e),this.radius+=n}return this}union(e){return e.isEmpty()?this:this.isEmpty()?(this.copy(e),this):(this.center.equals(e.center)===!0?this.radius=Math.max(this.radius,e.radius):(Br.subVectors(e.center,this.center).setLength(e.radius),this.expandByPoint(zr.copy(e.center).add(Br)),this.expandByPoint(zr.copy(e.center).sub(Br))),this)}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return new this.constructor().copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(e){return this.radius=e.radius,this.center.fromArray(e.center),this}},Hr=0,Ur=new yn,Wr=new Kn,Gr=new q,Kr=new gr,qr=new gr,Jr=new q,Yr=class e extends wt{constructor(){super(),this.isBufferGeometry=!0,Object.defineProperty(this,`id`,{value:Hr++}),this.uuid=kt(),this.name=``,this.type=`BufferGeometry`,this.index=null,this.indirect=null,this.indirectOffset=0,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(e){return Array.isArray(e)?this.index=new(pt(e)?Ir:Fr)(e,1):this.index=e,this}setIndirect(e,t=0){return this.indirect=e,this.indirectOffset=t,this}getIndirect(){return this.indirect}getAttribute(e){return this.attributes[e]}setAttribute(e,t){return this.attributes[e]=t,this}deleteAttribute(e){return delete this.attributes[e],this}hasAttribute(e){return this.attributes[e]!==void 0}addGroup(e,t,n=0){this.groups.push({start:e,count:t,materialIndex:n})}clearGroups(){this.groups=[]}setDrawRange(e,t){this.drawRange.start=e,this.drawRange.count=t}applyMatrix4(e){let t=this.attributes.position;t!==void 0&&(t.applyMatrix4(e),t.needsUpdate=!0);let n=this.attributes.normal;if(n!==void 0){let t=new J().getNormalMatrix(e);n.applyNormalMatrix(t),n.needsUpdate=!0}let r=this.attributes.tangent;return r!==void 0&&(r.transformDirection(e),r.needsUpdate=!0),this.boundingBox!==null&&this.computeBoundingBox(),this.boundingSphere!==null&&this.computeBoundingSphere(),this}applyQuaternion(e){return Ur.makeRotationFromQuaternion(e),this.applyMatrix4(Ur),this}rotateX(e){return Ur.makeRotationX(e),this.applyMatrix4(Ur),this}rotateY(e){return Ur.makeRotationY(e),this.applyMatrix4(Ur),this}rotateZ(e){return Ur.makeRotationZ(e),this.applyMatrix4(Ur),this}translate(e,t,n){return Ur.makeTranslation(e,t,n),this.applyMatrix4(Ur),this}scale(e,t,n){return Ur.makeScale(e,t,n),this.applyMatrix4(Ur),this}lookAt(e){return Wr.lookAt(e),Wr.updateMatrix(),this.applyMatrix4(Wr.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(Gr).negate(),this.translate(Gr.x,Gr.y,Gr.z),this}setFromPoints(e){let t=this.getAttribute(`position`);if(t===void 0){let t=[];for(let n=0,r=e.length;nt.count&&H(`BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry.`),t.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new gr);let e=this.attributes.position,t=this.morphAttributes.position;if(e&&e.isGLBufferAttribute){U(`BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.`,this),this.boundingBox.set(new q(-1/0,-1/0,-1/0),new q(1/0,1/0,1/0));return}if(e!==void 0){if(this.boundingBox.setFromBufferAttribute(e),t)for(let e=0,n=t.length;e0&&(e.userData=this.userData),this.parameters!==void 0){let t=this.parameters;for(let n in t)t[n]!==void 0&&(e[n]=t[n]);return e}e.data={attributes:{}};let t=this.index;t!==null&&(e.data.index={type:t.array.constructor.name,array:Array.prototype.slice.call(t.array)});let n=this.attributes;for(let t in n){let r=n[t];e.data.attributes[t]=r.toJSON(e.data)}let r={},i=!1;for(let t in this.morphAttributes){let n=this.morphAttributes[t],a=[];for(let t=0,r=n.length;t0&&(r[t]=a,i=!0)}i&&(e.data.morphAttributes=r,e.data.morphTargetsRelative=this.morphTargetsRelative);let a=this.groups;a.length>0&&(e.data.groups=JSON.parse(JSON.stringify(a)));let o=this.boundingSphere;return o!==null&&(e.data.boundingSphere=o.toJSON()),e}clone(){return new this.constructor().copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;let t={};this.name=e.name;let n=e.index;n!==null&&this.setIndex(n.clone());let r=e.attributes;for(let e in r){let n=r[e];this.setAttribute(e,n.clone(t))}let i=e.morphAttributes;for(let e in i){let n=[],r=i[e];for(let e=0,i=r.length;e0!=e>0&&this.version++,this._alphaTest=e}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(e!==void 0)for(let t in e){let n=e[t];if(n===void 0){H(`Material: parameter '${t}' has value of undefined.`);continue}let r=this[t];if(r===void 0){H(`Material: '${t}' is not a property of THREE.${this.type}.`);continue}r&&r.isColor?r.set(n):r&&r.isVector3&&n&&n.isVector3?r.copy(n):this[t]=n}}toJSON(e){let t=e===void 0||typeof e==`string`;t&&(e={textures:{},images:{}});let n={metadata:{version:4.7,type:`Material`,generator:`Material.toJSON`}};n.uuid=this.uuid,n.type=this.type,this.name!==``&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(n.sheenColorMap=this.sheenColorMap.toJSON(e).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(n.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(e).uuid),this.dispersion!==void 0&&(n.dispersion=this.dispersion),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(e).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(e).uuid),this.anisotropy!==void 0&&(n.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(e).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(e).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(e).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(e).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(e).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(e).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(e).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapRotation!==void 0&&(n.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(e).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(e).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(e).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.shadowSide!==null&&(n.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==1&&(n.blending=this.blending),this.side!==0&&(n.side=this.side),this.vertexColors===!0&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),this.transparent===!0&&(n.transparent=!0),this.blendSrc!==204&&(n.blendSrc=this.blendSrc),this.blendDst!==205&&(n.blendDst=this.blendDst),this.blendEquation!==100&&(n.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(n.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(n.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(n.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(n.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(n.blendAlpha=this.blendAlpha),this.depthFunc!==3&&(n.depthFunc=this.depthFunc),this.depthTest===!1&&(n.depthTest=this.depthTest),this.depthWrite===!1&&(n.depthWrite=this.depthWrite),this.colorWrite===!1&&(n.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(n.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==519&&(n.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(n.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(n.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==7680&&(n.stencilFail=this.stencilFail),this.stencilZFail!==7680&&(n.stencilZFail=this.stencilZFail),this.stencilZPass!==7680&&(n.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(n.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(n.rotation=this.rotation),this.polygonOffset===!0&&(n.polygonOffset=!0),this.polygonOffsetFactor!==0&&(n.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(n.linewidth=this.linewidth),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.dithering===!0&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),this.alphaHash===!0&&(n.alphaHash=!0),this.alphaToCoverage===!0&&(n.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(n.premultipliedAlpha=!0),this.forceSinglePass===!0&&(n.forceSinglePass=!0),this.allowOverride===!1&&(n.allowOverride=!1),this.wireframe===!0&&(n.wireframe=!0),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!==`round`&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!==`round`&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(n.flatShading=!0),this.visible===!1&&(n.visible=!1),this.toneMapped===!1&&(n.toneMapped=!1),this.fog===!1&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData);function r(e){let t=[];for(let n in e){let r=e[n];delete r.metadata,t.push(r)}return t}if(t){let t=r(e.textures),i=r(e.images);t.length>0&&(n.textures=t),i.length>0&&(n.images=i)}return n}clone(){return new this.constructor().copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.blendColor.copy(e.blendColor),this.blendAlpha=e.blendAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;let t=e.clippingPlanes,n=null;if(t!==null){let e=t.length;n=Array(e);for(let r=0;r!==e;++r)n[r]=t[r].clone()}return this.clippingPlanes=n,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaHash=e.alphaHash,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.forceSinglePass=e.forceSinglePass,this.allowOverride=e.allowOverride,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:`dispose`})}set needsUpdate(e){e===!0&&this.version++}},ti=class extends ei{constructor(e){super(),this.isSpriteMaterial=!0,this.type=`SpriteMaterial`,this.color=new X(16777215),this.map=null,this.alphaMap=null,this.rotation=0,this.sizeAttenuation=!0,this.transparent=!0,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.alphaMap=e.alphaMap,this.rotation=e.rotation,this.sizeAttenuation=e.sizeAttenuation,this.fog=e.fog,this}},ni,ri=new q,ii=new q,ai=new q,oi=new K,si=new K,ci=new yn,li=new q,ui=new q,di=new q,fi=new K,pi=new K,mi=new K,hi=class extends Kn{constructor(e=new ti){if(super(),this.isSprite=!0,this.type=`Sprite`,ni===void 0){ni=new Yr;let e=new Xr(new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]),5);ni.setIndex([0,1,2,0,2,3]),ni.setAttribute(`position`,new Qr(e,3,0,!1)),ni.setAttribute(`uv`,new Qr(e,2,3,!1))}this.geometry=ni,this.material=e,this.center=new K(.5,.5),this.count=1}raycast(e,t){e.camera===null&&U(`Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.`),ii.setFromMatrixScale(this.matrixWorld),ci.copy(e.camera.matrixWorld),this.modelViewMatrix.multiplyMatrices(e.camera.matrixWorldInverse,this.matrixWorld),ai.setFromMatrixPosition(this.modelViewMatrix),e.camera.isPerspectiveCamera&&this.material.sizeAttenuation===!1&&ii.multiplyScalar(-ai.z);let n=this.material.rotation,r,i;n!==0&&(i=Math.cos(n),r=Math.sin(n));let a=this.center;gi(li.set(-.5,-.5,0),ai,a,ii,r,i),gi(ui.set(.5,-.5,0),ai,a,ii,r,i),gi(di.set(.5,.5,0),ai,a,ii,r,i),fi.set(0,0),pi.set(1,0),mi.set(1,1);let o=e.ray.intersectTriangle(li,ui,di,!1,ri);if(o===null&&(gi(ui.set(-.5,.5,0),ai,a,ii,r,i),pi.set(0,1),o=e.ray.intersectTriangle(li,di,ui,!1,ri),o===null))return;let s=e.ray.origin.distanceTo(ri);se.far||t.push({distance:s,point:ri.clone(),uv:hr.getInterpolation(ri,li,ui,di,fi,pi,mi,new K),face:null,object:this})}copy(e,t){return super.copy(e,t),e.center!==void 0&&this.center.copy(e.center),this.material=e.material,this}};function gi(e,t,n,r,i,a){oi.subVectors(e,n).addScalar(.5).multiply(r),i===void 0?si.copy(oi):(si.x=a*oi.x-i*oi.y,si.y=i*oi.x+a*oi.y),e.copy(t),e.x+=si.x,e.y+=si.y,e.applyMatrix4(ci)}var _i=new q,vi=new q,yi=new q,bi=new q,xi=new q,Si=new q,Ci=new q,wi=class{constructor(e=new q,t=new q(0,0,-1)){this.origin=e,this.direction=t}set(e,t){return this.origin.copy(e),this.direction.copy(t),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,t){return t.copy(this.origin).addScaledVector(this.direction,e)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,_i)),this}closestPointToPoint(e,t){t.subVectors(e,this.origin);let n=t.dot(this.direction);return n<0?t.copy(this.origin):t.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){let t=_i.subVectors(e,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(e):(_i.copy(this.origin).addScaledVector(this.direction,t),_i.distanceToSquared(e))}distanceSqToSegment(e,t,n,r){vi.copy(e).add(t).multiplyScalar(.5),yi.copy(t).sub(e).normalize(),bi.copy(this.origin).sub(vi);let i=e.distanceTo(t)*.5,a=-this.direction.dot(yi),o=bi.dot(this.direction),s=-bi.dot(yi),c=bi.lengthSq(),l=Math.abs(1-a*a),u,d,f,p;if(l>0)if(u=a*s-o,d=a*o-s,p=i*l,u>=0)if(d>=-p)if(d<=p){let e=1/l;u*=e,d*=e,f=u*(u+a*d+2*o)+d*(a*u+d+2*s)+c}else d=i,u=Math.max(0,-(a*d+o)),f=-u*u+d*(d+2*s)+c;else d=-i,u=Math.max(0,-(a*d+o)),f=-u*u+d*(d+2*s)+c;else d<=-p?(u=Math.max(0,-(-a*i+o)),d=u>0?-i:Math.min(Math.max(-i,-s),i),f=-u*u+d*(d+2*s)+c):d<=p?(u=0,d=Math.min(Math.max(-i,-s),i),f=d*(d+2*s)+c):(u=Math.max(0,-(a*i+o)),d=u>0?i:Math.min(Math.max(-i,-s),i),f=-u*u+d*(d+2*s)+c);else d=a>0?-i:i,u=Math.max(0,-(a*d+o)),f=-u*u+d*(d+2*s)+c;return n&&n.copy(this.origin).addScaledVector(this.direction,u),r&&r.copy(vi).addScaledVector(yi,d),f}intersectSphere(e,t){_i.subVectors(e.center,this.origin);let n=_i.dot(this.direction),r=_i.dot(_i)-n*n,i=e.radius*e.radius;if(r>i)return null;let a=Math.sqrt(i-r),o=n-a,s=n+a;return s<0?null:o<0?this.at(s,t):this.at(o,t)}intersectsSphere(e){return e.radius<0?!1:this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){let t=e.normal.dot(this.direction);if(t===0)return e.distanceToPoint(this.origin)===0?0:null;let n=-(this.origin.dot(e.normal)+e.constant)/t;return n>=0?n:null}intersectPlane(e,t){let n=this.distanceToPlane(e);return n===null?null:this.at(n,t)}intersectsPlane(e){let t=e.distanceToPoint(this.origin);return t===0||e.normal.dot(this.direction)*t<0}intersectBox(e,t){let n,r,i,a,o,s,c=1/this.direction.x,l=1/this.direction.y,u=1/this.direction.z,d=this.origin;return c>=0?(n=(e.min.x-d.x)*c,r=(e.max.x-d.x)*c):(n=(e.max.x-d.x)*c,r=(e.min.x-d.x)*c),l>=0?(i=(e.min.y-d.y)*l,a=(e.max.y-d.y)*l):(i=(e.max.y-d.y)*l,a=(e.min.y-d.y)*l),n>a||i>r||((i>n||isNaN(n))&&(n=i),(a=0?(o=(e.min.z-d.z)*u,s=(e.max.z-d.z)*u):(o=(e.max.z-d.z)*u,s=(e.min.z-d.z)*u),n>s||o>r)||((o>n||n!==n)&&(n=o),(s=0?n:r,t)}intersectsBox(e){return this.intersectBox(e,_i)!==null}intersectTriangle(e,t,n,r,i){xi.subVectors(t,e),Si.subVectors(n,e),Ci.crossVectors(xi,Si);let a=this.direction.dot(Ci),o;if(a>0){if(r)return null;o=1}else if(a<0)o=-1,a=-a;else return null;bi.subVectors(this.origin,e);let s=o*this.direction.dot(Si.crossVectors(bi,Si));if(s<0)return null;let c=o*this.direction.dot(xi.cross(bi));if(c<0||s+c>a)return null;let l=-o*bi.dot(Ci);return l<0?null:this.at(l/a,i)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}},Ti=class extends ei{constructor(e){super(),this.isMeshBasicMaterial=!0,this.type=`MeshBasicMaterial`,this.color=new X(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new kn,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap=`round`,this.wireframeLinejoin=`round`,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}},Ei=new yn,Di=new wi,Oi=new Vr,ki=new q,Ai=new q,ji=new q,Mi=new q,Ni=new q,Pi=new q,Fi=new q,Ii=new q,Li=class extends Kn{constructor(e=new Yr,t=new Ti){super(),this.isMesh=!0,this.type=`Mesh`,this.geometry=e,this.material=t,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.count=1,this.updateMorphTargets()}copy(e,t){return super.copy(e,t),e.morphTargetInfluences!==void 0&&(this.morphTargetInfluences=e.morphTargetInfluences.slice()),e.morphTargetDictionary!==void 0&&(this.morphTargetDictionary=Object.assign({},e.morphTargetDictionary)),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}updateMorphTargets(){let e=this.geometry.morphAttributes,t=Object.keys(e);if(t.length>0){let n=e[t[0]];if(n!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,t=n.length;e(e.far-e.near)**2))&&(Ei.copy(i).invert(),Di.copy(e.ray).applyMatrix4(Ei),!(n.boundingBox!==null&&Di.intersectsBox(n.boundingBox)===!1)&&this._computeIntersections(e,t,Di)))}_computeIntersections(e,t,n){let r,i=this.geometry,a=this.material,o=i.index,s=i.attributes.position,c=i.attributes.uv,l=i.attributes.uv1,u=i.attributes.normal,d=i.groups,f=i.drawRange;if(o!==null)if(Array.isArray(a))for(let i=0,s=d.length;in.far?null:{distance:l,point:Ii.clone(),object:e}}function zi(e,t,n,r,i,a,o,s,c,l){e.getVertexPosition(s,Ai),e.getVertexPosition(c,ji),e.getVertexPosition(l,Mi);let u=Ri(e,t,n,r,Ai,ji,Mi,Fi);if(u){let e=new q;hr.getBarycoord(Fi,Ai,ji,Mi,e),i&&(u.uv=hr.getInterpolatedAttribute(i,s,c,l,e,new K)),a&&(u.uv1=hr.getInterpolatedAttribute(a,s,c,l,e,new K)),o&&(u.normal=hr.getInterpolatedAttribute(o,s,c,l,e,new q),u.normal.dot(r.direction)>0&&u.normal.multiplyScalar(-1));let t={a:s,b:c,c:l,normal:new q,materialIndex:0};hr.getNormal(Ai,ji,Mi,t.normal),u.face=t,u.barycoord=e}return u}var Bi=class extends pn{constructor(e=null,t=1,n=1,r,i,a,o,s,c=O,l=O,u,d){super(null,a,o,s,c,l,r,i,u,d),this.isDataTexture=!0,this.image={data:e,width:t,height:n},this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}},Vi=new q,Hi=new q,Ui=new J,Wi=class{constructor(e=new q(1,0,0),t=0){this.isPlane=!0,this.normal=e,this.constant=t}set(e,t){return this.normal.copy(e),this.constant=t,this}setComponents(e,t,n,r){return this.normal.set(e,t,n),this.constant=r,this}setFromNormalAndCoplanarPoint(e,t){return this.normal.copy(e),this.constant=-t.dot(this.normal),this}setFromCoplanarPoints(e,t,n){let r=Vi.subVectors(n,t).cross(Hi.subVectors(e,t)).normalize();return this.setFromNormalAndCoplanarPoint(r,e),this}copy(e){return this.normal.copy(e.normal),this.constant=e.constant,this}normalize(){let e=1/this.normal.length();return this.normal.multiplyScalar(e),this.constant*=e,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}distanceToSphere(e){return this.distanceToPoint(e.center)-e.radius}projectPoint(e,t){return t.copy(e).addScaledVector(this.normal,-this.distanceToPoint(e))}intersectLine(e,t,n=!0){let r=e.delta(Vi),i=this.normal.dot(r);if(i===0)return this.distanceToPoint(e.start)===0?t.copy(e.start):null;let a=-(e.start.dot(this.normal)+this.constant)/i;return n===!0&&(a<0||a>1)?null:t.copy(e.start).addScaledVector(r,a)}intersectsLine(e){let t=this.distanceToPoint(e.start),n=this.distanceToPoint(e.end);return t<0&&n>0||n<0&&t>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,t){let n=t||Ui.getNormalMatrix(e),r=this.coplanarPoint(Vi).applyMatrix4(e),i=this.normal.applyMatrix3(n).normalize();return this.constant=-r.dot(i),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return new this.constructor().copy(this)}},Gi=new Vr,Ki=new K(.5,.5),qi=new q,Ji=class{constructor(e=new Wi,t=new Wi,n=new Wi,r=new Wi,i=new Wi,a=new Wi){this.planes=[e,t,n,r,i,a]}set(e,t,n,r,i,a){let o=this.planes;return o[0].copy(e),o[1].copy(t),o[2].copy(n),o[3].copy(r),o[4].copy(i),o[5].copy(a),this}copy(e){let t=this.planes;for(let n=0;n<6;n++)t[n].copy(e.planes[n]);return this}setFromProjectionMatrix(e,t=ft,n=!1){let r=this.planes,i=e.elements,a=i[0],o=i[1],s=i[2],c=i[3],l=i[4],u=i[5],d=i[6],f=i[7],p=i[8],m=i[9],h=i[10],g=i[11],_=i[12],v=i[13],y=i[14],b=i[15];if(r[0].setComponents(c-a,f-l,g-p,b-_).normalize(),r[1].setComponents(c+a,f+l,g+p,b+_).normalize(),r[2].setComponents(c+o,f+u,g+m,b+v).normalize(),r[3].setComponents(c-o,f-u,g-m,b-v).normalize(),n)r[4].setComponents(s,d,h,y).normalize(),r[5].setComponents(c-s,f-d,g-h,b-y).normalize();else if(r[4].setComponents(c-s,f-d,g-h,b-y).normalize(),t===2e3)r[5].setComponents(c+s,f+d,g+h,b+y).normalize();else if(t===2001)r[5].setComponents(s,d,h,y).normalize();else throw Error(`THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: `+t);return this}intersectsObject(e){if(e.boundingSphere!==void 0)e.boundingSphere===null&&e.computeBoundingSphere(),Gi.copy(e.boundingSphere).applyMatrix4(e.matrixWorld);else{let t=e.geometry;t.boundingSphere===null&&t.computeBoundingSphere(),Gi.copy(t.boundingSphere).applyMatrix4(e.matrixWorld)}return this.intersectsSphere(Gi)}intersectsSprite(e){return Gi.center.set(0,0,0),Gi.radius=.7071067811865476+Ki.distanceTo(e.center),Gi.applyMatrix4(e.matrixWorld),this.intersectsSphere(Gi)}intersectsSphere(e){let t=this.planes,n=e.center,r=-e.radius;for(let e=0;e<6;e++)if(t[e].distanceToPoint(n)0?e.max.x:e.min.x,qi.y=r.normal.y>0?e.max.y:e.min.y,qi.z=r.normal.z>0?e.max.z:e.min.z,r.distanceToPoint(qi)<0)return!1}return!0}containsPoint(e){let t=this.planes;for(let n=0;n<6;n++)if(t[n].distanceToPoint(e)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}},Yi=class extends ei{constructor(e){super(),this.isLineBasicMaterial=!0,this.type=`LineBasicMaterial`,this.color=new X(16777215),this.map=null,this.linewidth=1,this.linecap=`round`,this.linejoin=`round`,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this.fog=e.fog,this}},Xi=new q,Zi=new q,Qi=new yn,$i=new wi,ea=new Vr,ta=new q,na=new q,ra=class extends Kn{constructor(e=new Yr,t=new Yi){super(),this.isLine=!0,this.type=`Line`,this.geometry=e,this.material=t,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.updateMorphTargets()}copy(e,t){return super.copy(e,t),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}computeLineDistances(){let e=this.geometry;if(e.index===null){let t=e.attributes.position,n=[0];for(let e=1,r=t.count;e0){let n=e[t[0]];if(n!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,t=n.length;er)return;ta.applyMatrix4(e.matrixWorld);let c=t.ray.origin.distanceTo(ta);if(!(ct.far))return{distance:c,point:na.clone().applyMatrix4(e.matrixWorld),index:o,face:null,faceIndex:null,barycoord:null,object:e}}var aa=class extends pn{constructor(e=[],t=301,n,r,i,a,o,s,c,l){super(e,t,n,r,i,a,o,s,c,l),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(e){this.image=e}},oa=class extends pn{constructor(e,t,n,r,i,a,o,s,c){super(e,t,n,r,i,a,o,s,c),this.isCanvasTexture=!0,this.needsUpdate=!0}},sa=class extends pn{constructor(e,t,n=ae,r,i,a,o=O,s=O,c,l=he,u=1){if(l!==1026&&l!==1027)throw Error(`DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat`);super({width:e,height:t,depth:u},r,i,a,o,s,l,n,c),this.isDepthTexture=!0,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(e){return super.copy(e),this.source=new ln(Object.assign({},e.image)),this.compareFunction=e.compareFunction,this}toJSON(e){let t=super.toJSON(e);return this.compareFunction!==null&&(t.compareFunction=this.compareFunction),t}},ca=class extends sa{constructor(e,t=ae,n=301,r,i,a=O,o=O,s,c=he){let l={width:e,height:e,depth:1},u=[l,l,l,l,l,l];super(e,e,t,n,r,i,a,o,s,c),this.image=u,this.isCubeDepthTexture=!0,this.isCubeTexture=!0}get images(){return this.image}set images(e){this.image=e}},la=class extends pn{constructor(e=null){super(),this.sourceTexture=e,this.isExternalTexture=!0}copy(e){return super.copy(e),this.sourceTexture=e.sourceTexture,this}},ua=class e extends Yr{constructor(e=1,t=1,n=1,r=1,i=1,a=1){super(),this.type=`BoxGeometry`,this.parameters={width:e,height:t,depth:n,widthSegments:r,heightSegments:i,depthSegments:a};let o=this;r=Math.floor(r),i=Math.floor(i),a=Math.floor(a);let s=[],c=[],l=[],u=[],d=0,f=0;p(`z`,`y`,`x`,-1,-1,n,t,e,a,i,0),p(`z`,`y`,`x`,1,-1,n,t,-e,a,i,1),p(`x`,`z`,`y`,1,1,e,n,t,r,a,2),p(`x`,`z`,`y`,1,-1,e,n,-t,r,a,3),p(`x`,`y`,`z`,1,-1,e,t,n,r,i,4),p(`x`,`y`,`z`,-1,-1,e,t,-n,r,i,5),this.setIndex(s),this.setAttribute(`position`,new Lr(c,3)),this.setAttribute(`normal`,new Lr(l,3)),this.setAttribute(`uv`,new Lr(u,2));function p(e,t,n,r,i,a,p,m,h,g,_){let v=a/h,y=p/g,b=a/2,x=p/2,S=m/2,C=h+1,w=g+1,T=0,E=0,D=new q;for(let a=0;a0?1:-1,l.push(D.x,D.y,D.z),u.push(s/h),u.push(1-a/g),T+=1}for(let e=0;e0)&&f.push(t,i,c),(e!==n-1||si.map(i=>d[i]); -import{r as e}from"./chunk-DECur_0Z.js";import{P as t,T as n,U as r,c as i,h as a,i as o,j as s,l as c,p as l,s as u,u as d,w as f,y as p}from"./runtime-core.esm-bundler-CINEgm0a.js";import{l as m,o as h}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{o as g}from"./api-CP9MgmUS.js";import{d as _}from"./index-Cl4Dij8v.js";/* empty css */var v={class:`glass-card border border-stroke-subtle dark:border-white/opacity-medium rounded-[15px] w-full max-w-3xl max-h-[90vh] flex flex-col shadow-2xl`},y={class:`flex-1 relative min-h-[400px]`},b={class:`p-6 border-t border-stroke-subtle dark:border-stroke/opacity-light space-y-4`},x={class:`grid grid-cols-2 gap-4`},S=_(a({__name:`LocationPicker`,props:{isOpen:{type:Boolean},latitude:{},longitude:{}},emits:[`close`,`select`],setup(a,{emit:_}){let S=a,C=_,w=e=>Math.round(e*1e6)/1e6,T=r(null),E=r(w(S.latitude||0)),D=r(w(S.longitude||0)),O=null,k=null,A=async()=>{if(T.value){j();try{let t=(await g(async()=>{let{default:t}=await import(`./leaflet-src-rW8DhqPH.js`).then(t=>e(t.t(),1));return{default:t}},__vite__mapDeps([0,1]))).default;delete t.Icon.Default.prototype._getIconUrl,t.Icon.Default.mergeOptions({iconRetinaUrl:`https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon-2x.png`,iconUrl:`https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon.png`,shadowUrl:`https://unpkg.com/leaflet@1.9.4/dist/images/marker-shadow.png`}),await p();let n=E.value||0,r=D.value||0,i=n===0&&r===0?2:13;O=t.map(T.value).setView([n,r],i);try{let e=t.tileLayer(`https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png`,{maxZoom:19,attribution:`© OpenStreetMap contributors © CARTO`,errorTileUrl:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==`}),n=t.tileLayer(`https://{s}.basemaps.cartocdn.com/dark_only_labels/{z}/{x}/{y}{r}.png`,{maxZoom:19,attribution:``,errorTileUrl:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==`});e.addTo(O),n.addTo(O)}catch(e){console.warn(`Error loading tiles:`,e)}(n!==0||r!==0)&&(k=t.marker([n,r]).addTo(O)),O.on(`click`,e=>{E.value=w(e.latlng.lat),D.value=w(e.latlng.lng),k?k.setLatLng(e.latlng):k=t.marker(e.latlng).addTo(O)}),setTimeout(()=>{O?.invalidateSize()},200)}catch(e){console.error(`Failed to initialize map:`,e)}}},j=()=>{O&&(O.remove(),O=null,k=null)};s(()=>S.isOpen,async e=>{e?(await p(),await A()):j()}),s(()=>[S.latitude,S.longitude],([e,t])=>{E.value=w(e),D.value=w(t)});let M=()=>{C(`select`,{latitude:w(E.value),longitude:w(D.value)}),C(`close`)},N=()=>{C(`close`)},P=()=>{navigator.geolocation?navigator.geolocation.getCurrentPosition(async t=>{if(E.value=w(t.coords.latitude),D.value=w(t.coords.longitude),O){O.setView([E.value,D.value],13);let t=(await g(async()=>{let{default:t}=await import(`./leaflet-src-rW8DhqPH.js`).then(t=>e(t.t(),1));return{default:t}},__vite__mapDeps([0,1]))).default;k?k.setLatLng([E.value,D.value]):k=t.marker([E.value,D.value]).addTo(O)}},e=>{console.error(`Error getting location:`,e),alert(`Unable to get current location. Please check browser permissions.`)}):alert(`Geolocation is not supported by this browser.`)};return f(()=>{j()}),(e,r)=>(n(),i(o,{to:`body`},[a.isOpen?(n(),d(`div`,{key:0,class:`modal-backdrop z-[400]!`,onClick:m(N,[`self`])},[u(`div`,v,[u(`div`,{class:`flex items-center justify-between p-6 border-b border-stroke-subtle dark:border-stroke/opacity-light`},[r[3]||=u(`h3`,{class:`text-xl font-semibold text-content-primary`},` Select Location `,-1),u(`button`,{onClick:N,class:`text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary transition-colors`},[...r[2]||=[u(`svg`,{class:`w-6 h-6`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[u(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),u(`div`,y,[u(`div`,{ref_key:`mapContainer`,ref:T,class:`absolute inset-0 rounded-b-[15px] overflow-hidden`},null,512)]),u(`div`,b,[u(`div`,x,[u(`div`,null,[r[4]||=u(`label`,{class:`block text-sm font-medium text-content-secondary dark:text-content-muted mb-2`},`Latitude`,-1),t(u(`input`,{"onUpdate:modelValue":r[0]||=e=>E.value=e,type:`number`,step:`0.000001`,class:`modal-input-readonly`,readonly:``},null,512),[[h,E.value,void 0,{number:!0}]])]),u(`div`,null,[r[5]||=u(`label`,{class:`block text-sm font-medium text-content-secondary dark:text-content-muted mb-2`},`Longitude`,-1),t(u(`input`,{"onUpdate:modelValue":r[1]||=e=>D.value=e,type:`number`,step:`0.000001`,class:`modal-input-readonly`,readonly:``},null,512),[[h,D.value,void 0,{number:!0}]])])]),u(`div`,{class:`flex gap-3`},[u(`button`,{onClick:P,class:`modal-btn-cancel flex items-center justify-center gap-2`},[...r[6]||=[u(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[u(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z`}),u(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 11a3 3 0 11-6 0 3 3 0 016 0z`})],-1),l(` Use Current Location `,-1)]]),u(`button`,{onClick:N,class:`px-6 py-2 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light text-content-primary rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium transition-colors text-sm`},` Cancel `),u(`button`,{onClick:M,class:`px-6 py-2 bg-primary/opacity-medium hover:bg-primary/opacity-medium text-content-primary rounded-lg border border-primary/opacity-heavy transition-colors text-sm`},` Select Location `)]),r[7]||=u(`p`,{class:`text-content-muted text-xs text-center`},` Click on the map to select a location `,-1)])])])):c(``,!0)]))}}),[[`__scopeId`,`data-v-0d3c199b`]]);export{S as t}; \ No newline at end of file +import{r as e}from"./chunk-DECur_0Z.js";import{P as t,T as n,U as r,c as i,h as a,i as o,j as s,l as c,p as l,s as u,u as d,w as f,y as p}from"./runtime-core.esm-bundler-CINEgm0a.js";import{l as m,o as h}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{o as g}from"./api-EpLa-SS4.js";import{d as _}from"./index-DF5glAZc.js";/* empty css */var v={class:`glass-card border border-stroke-subtle dark:border-white/opacity-medium rounded-[15px] w-full max-w-3xl max-h-[90vh] flex flex-col shadow-2xl`},y={class:`flex-1 relative min-h-[400px]`},b={class:`p-6 border-t border-stroke-subtle dark:border-stroke/opacity-light space-y-4`},x={class:`grid grid-cols-2 gap-4`},S=_(a({__name:`LocationPicker`,props:{isOpen:{type:Boolean},latitude:{},longitude:{}},emits:[`close`,`select`],setup(a,{emit:_}){let S=a,C=_,w=e=>Math.round(e*1e6)/1e6,T=r(null),E=r(w(S.latitude||0)),D=r(w(S.longitude||0)),O=null,k=null,A=async()=>{if(T.value){j();try{let t=(await g(async()=>{let{default:t}=await import(`./leaflet-src-rW8DhqPH.js`).then(t=>e(t.t(),1));return{default:t}},__vite__mapDeps([0,1]))).default;delete t.Icon.Default.prototype._getIconUrl,t.Icon.Default.mergeOptions({iconRetinaUrl:`https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon-2x.png`,iconUrl:`https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon.png`,shadowUrl:`https://unpkg.com/leaflet@1.9.4/dist/images/marker-shadow.png`}),await p();let n=E.value||0,r=D.value||0,i=n===0&&r===0?2:13;O=t.map(T.value).setView([n,r],i);try{let e=t.tileLayer(`https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png`,{maxZoom:19,attribution:`© OpenStreetMap contributors © CARTO`,errorTileUrl:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==`}),n=t.tileLayer(`https://{s}.basemaps.cartocdn.com/dark_only_labels/{z}/{x}/{y}{r}.png`,{maxZoom:19,attribution:``,errorTileUrl:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==`});e.addTo(O),n.addTo(O)}catch(e){console.warn(`Error loading tiles:`,e)}(n!==0||r!==0)&&(k=t.marker([n,r]).addTo(O)),O.on(`click`,e=>{E.value=w(e.latlng.lat),D.value=w(e.latlng.lng),k?k.setLatLng(e.latlng):k=t.marker(e.latlng).addTo(O)}),setTimeout(()=>{O?.invalidateSize()},200)}catch(e){console.error(`Failed to initialize map:`,e)}}},j=()=>{O&&(O.remove(),O=null,k=null)};s(()=>S.isOpen,async e=>{e?(await p(),await A()):j()}),s(()=>[S.latitude,S.longitude],([e,t])=>{E.value=w(e),D.value=w(t)});let M=()=>{C(`select`,{latitude:w(E.value),longitude:w(D.value)}),C(`close`)},N=()=>{C(`close`)},P=()=>{navigator.geolocation?navigator.geolocation.getCurrentPosition(async t=>{if(E.value=w(t.coords.latitude),D.value=w(t.coords.longitude),O){O.setView([E.value,D.value],13);let t=(await g(async()=>{let{default:t}=await import(`./leaflet-src-rW8DhqPH.js`).then(t=>e(t.t(),1));return{default:t}},__vite__mapDeps([0,1]))).default;k?k.setLatLng([E.value,D.value]):k=t.marker([E.value,D.value]).addTo(O)}},e=>{console.error(`Error getting location:`,e),alert(`Unable to get current location. Please check browser permissions.`)}):alert(`Geolocation is not supported by this browser.`)};return f(()=>{j()}),(e,r)=>(n(),i(o,{to:`body`},[a.isOpen?(n(),d(`div`,{key:0,class:`modal-backdrop z-[400]!`,onClick:m(N,[`self`])},[u(`div`,v,[u(`div`,{class:`flex items-center justify-between p-6 border-b border-stroke-subtle dark:border-stroke/opacity-light`},[r[3]||=u(`h3`,{class:`text-xl font-semibold text-content-primary`},` Select Location `,-1),u(`button`,{onClick:N,class:`text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary transition-colors`},[...r[2]||=[u(`svg`,{class:`w-6 h-6`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[u(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),u(`div`,y,[u(`div`,{ref_key:`mapContainer`,ref:T,class:`absolute inset-0 rounded-b-[15px] overflow-hidden`},null,512)]),u(`div`,b,[u(`div`,x,[u(`div`,null,[r[4]||=u(`label`,{class:`block text-sm font-medium text-content-secondary dark:text-content-muted mb-2`},`Latitude`,-1),t(u(`input`,{"onUpdate:modelValue":r[0]||=e=>E.value=e,type:`number`,step:`0.000001`,class:`modal-input-readonly`,readonly:``},null,512),[[h,E.value,void 0,{number:!0}]])]),u(`div`,null,[r[5]||=u(`label`,{class:`block text-sm font-medium text-content-secondary dark:text-content-muted mb-2`},`Longitude`,-1),t(u(`input`,{"onUpdate:modelValue":r[1]||=e=>D.value=e,type:`number`,step:`0.000001`,class:`modal-input-readonly`,readonly:``},null,512),[[h,D.value,void 0,{number:!0}]])])]),u(`div`,{class:`flex gap-3`},[u(`button`,{onClick:P,class:`modal-btn-cancel flex items-center justify-center gap-2`},[...r[6]||=[u(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[u(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z`}),u(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 11a3 3 0 11-6 0 3 3 0 016 0z`})],-1),l(` Use Current Location `,-1)]]),u(`button`,{onClick:N,class:`px-6 py-2 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light text-content-primary rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium transition-colors text-sm`},` Cancel `),u(`button`,{onClick:M,class:`px-6 py-2 bg-primary/opacity-medium hover:bg-primary/opacity-medium text-content-primary rounded-lg border border-primary/opacity-heavy transition-colors text-sm`},` Select Location `)]),r[7]||=u(`p`,{class:`text-content-muted text-xs text-center`},` Click on the map to select a location `,-1)])])])):c(``,!0)]))}}),[[`__scopeId`,`data-v-0d3c199b`]]);export{S as t}; \ No newline at end of file diff --git a/repeater/web/html/assets/Login-BShabpmj.js b/repeater/web/html/assets/Login-B6KB1F1E.js similarity index 98% rename from repeater/web/html/assets/Login-BShabpmj.js rename to repeater/web/html/assets/Login-B6KB1F1E.js index a1d4045..5d8adf7 100644 --- a/repeater/web/html/assets/Login-BShabpmj.js +++ b/repeater/web/html/assets/Login-B6KB1F1E.js @@ -1 +1 @@ -import{C as e,P as t,T as n,U as r,_t as i,c as a,h as ee,l as o,m as s,o as c,s as l,u,x as d}from"./runtime-core.esm-bundler-CINEgm0a.js";import{l as te,o as f}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{c as ne,f as p,g as m,i as h,r as g}from"./api-CP9MgmUS.js";import{t as _}from"./useTheme-vbCn9P26.js";import{t as re}from"./Spinner-CMJUE3iy.js";import{a as ie,d as v,i as ae,l as oe,n as se,u as ce}from"./index-Cl4Dij8v.js";var le={class:`min-h-screen bg-background dark:bg-background overflow-hidden relative flex items-start sm:items-center justify-center p-2 sm:p-4 pt-1`},ue={class:`absolute top-4 right-4 z-20`},de={class:`login-card relative z-10 w-full max-w-md p-6 sm:p-10 rounded-[16px] sm:rounded-[24px] border-0 sm:border sm:border-stroke-subtle dark:sm:border-stroke/opacity-medium backdrop-blur-xl`},fe={class:`relative login-content`},pe={class:`text-center`},me={class:`flex justify-center`},he=[`src`],y={key:0,class:`text-content-primary text-sm sm:text-base font-semibold mb-1`},b={class:`form-group`},x={class:`relative`},S=[`disabled`],C={class:`form-group`},w={class:`relative`},T=[`disabled`],E={key:0,class:`bg-accent-red/opacity-light border border-accent-red/opacity-medium rounded-[12px] p-2.5 sm:p-3.5 backdrop-blur-sm animate-shake`},D={class:`text-accent-red text-xs sm:text-sm font-medium`},O=[`disabled`],k={key:1,class:`w-4 h-4 sm:w-5 sm:h-5 group-hover:translate-x-1 transition-transform duration-300`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},A={class:`relative`},j={class:`mt-4 sm:mt-5 pt-3 sm:pt-4 border-t border-stroke-subtle dark:border-stroke/opacity-light`},M={class:`flex items-center justify-center gap-3`},N={href:`https://github.com/rightup`,target:`_blank`,class:`inline-flex items-center justify-center w-9 h-9 sm:w-10 sm:h-10 rounded-xl bg-content-primary dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-medium hover:bg-primary/opacity-medium dark:hover:bg-primary/opacity-medium hover:border-primary/opacity-heavy dark:hover:border-primary/opacity-heavy transition-all duration-300 hover:scale-110 group backdrop-blur-sm`,title:`GitHub`},P={href:`https://buymeacoffee.com/rightup`,target:`_blank`,class:`inline-flex items-center justify-center w-9 h-9 sm:w-10 sm:h-10 rounded-xl bg-content-primary dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-medium hover:bg-secondary/opacity-light hover:border-secondary/opacity-heavy dark:hover:border-secondary/opacity-heavy transition-all duration-300 hover:scale-110 group backdrop-blur-sm`,title:`Buy Me a Coffee`},F=v(ee({name:`LoginView`,__name:`Login`,setup(ee){let v=m(),F=h(),{theme:ge}=_(),I=c(()=>ie),L=r(`admin`),R=r(``),z=r(!1),B=r(``),V=r(0),H=r(!1),U=r(!1),W=r(``),G=c(()=>V.value>0),K=null,q=null,J=e=>{let t=document.querySelector(`meta[name="viewport"]`);if(t){if(e){q===null&&(q=t.getAttribute(`content`)),t.setAttribute(`content`,`width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover`);return}q===null?t.setAttribute(`content`,`width=device-width, initial-scale=1, viewport-fit=cover`):(t.setAttribute(`content`,q),q=null)}},_e=()=>{let e=document.activeElement;e instanceof HTMLElement&&e.blur()},Y=()=>new Promise(e=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{e()})})}),ve=async()=>{let e=window.visualViewport;if(!e||e.scale<=1.01)return;let t=document.querySelector(`meta[name="viewport"]`);if(!t)return;let n=t.getAttribute(`content`)||`width=device-width, initial-scale=1, viewport-fit=cover`;t.setAttribute(`content`,`width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover`),await Y(),t.setAttribute(`content`,n),await Y()},X=async()=>{_e(),await Y(),await ve(),window.scrollTo({top:0,left:0,behavior:`auto`}),await v.replace(`/`),await Y(),window.dispatchEvent(new Event(`resize`))},Z=()=>{K&&=(clearInterval(K),null)},ye=e=>{V.value=Math.max(1,Math.floor(e)),Z(),K=setInterval(()=>{if(V.value<=1){V.value=0,Z();return}--V.value},1e3)};d(()=>{Z(),J(!1)}),e(async()=>{try{W.value=(await g.get(`/api/site_info`)).data?.site_name??``}catch{}});let be=async()=>{if(G.value){B.value=`Too many login attempts. Please try again in ${V.value}s.`;return}B.value=``,z.value=!0;try{let e=ne(),t=(await g.post(`/auth/login`,{username:L.value,password:R.value,client_id:e})).data;t.success&&t.token?(V.value=0,Z(),R.value===`admin123`?(p(t.token),F.markAuthenticated(),U.value=!0,H.value=!0):(p(t.token),F.markAuthenticated(),await X())):B.value=t.error||`Login failed`}catch(e){console.error(`Login error:`,e);let t=e,n=t.response?.status,r=Number(t.response?.headers?.[`retry-after`]??0),i=Number(t.response?.data?.retry_after??0),a=Math.max(r,i);n===429&&a>0?(ye(a),B.value=t.response?.data?.error||`Too many login attempts. Please try again in ${V.value}s.`):B.value=t.response?.data?.error||`Connection error. Please try again.`}finally{z.value=!1}},xe=()=>{H.value=!1,X()},Se=()=>{H.value=!1,U.value&&X()},Q=()=>{J(!0)},$=()=>{J(!1)};return(e,r)=>(n(),u(`div`,le,[l(`div`,ue,[s(ae)]),r[11]||=l(`div`,{class:`bg-gradient-light dark:bg-gradient-dark absolute rounded-full -rotate-[24.22deg] w-[705px] h-[512px] blur-[120px] opacity-80 animate-pulse-slow -top-[79px] left-[575px] mix-blend-multiply dark:mix-blend-screen pointer-events-none`},null,-1),r[12]||=l(`div`,{class:`bg-gradient-light dark:bg-gradient-dark absolute rounded-full -rotate-[24.22deg] w-[705px] h-[512px] blur-[120px] opacity-75 animate-pulse-slower -top-[94px] -left-[92px] mix-blend-multiply dark:mix-blend-screen pointer-events-none`},null,-1),r[13]||=l(`div`,{class:`bg-gradient-light dark:bg-gradient-dark absolute rounded-full -rotate-[24.22deg] w-[705px] h-[512px] blur-[120px] opacity-80 animate-pulse-slowest top-[373px] left-[246px] mix-blend-multiply dark:mix-blend-screen pointer-events-none`},null,-1),l(`div`,de,[r[10]||=l(`div`,{class:`absolute inset-0 rounded-[24px] bg-gradient-to-br from-primary/3 dark:from-primary/opacity-subtle to-transparent pointer-events-none`},null,-1),l(`div`,fe,[l(`div`,pe,[l(`div`,me,[l(`img`,{src:I.value,alt:`openHop`,class:`logo-image h-[178px] sm:h-[210px] relative z-10`},null,8,he)]),r[2]||=l(`h1`,{class:`text-content-primary text-xl sm:text-2xl font-heading font-bold mt-1 mb-1`},` Repeater `,-1),W.value?(n(),u(`p`,y,i(W.value),1)):o(``,!0),r[3]||=l(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm pt-2`},` Sign in to access your dashboard `,-1)]),l(`form`,{onSubmit:te(be,[`prevent`]),autocomplete:`on`,action:`/`,class:`space-y-3 sm:space-y-4`},[l(`div`,b,[r[5]||=l(`label`,{for:`username`,class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-xs sm:text-sm font-medium mb-2`},` Username `,-1),l(`div`,x,[t(l(`input`,{id:`username`,name:`username`,"onUpdate:modelValue":r[0]||=e=>L.value=e,type:`text`,autocomplete:`username`,autocapitalize:`none`,autocorrect:`off`,spellcheck:`false`,onFocus:Q,onBlur:$,required:``,class:`input-glass w-full px-3 sm:px-4 py-2.5 sm:py-3.5 rounded-[12px] text-content-primary text-sm placeholder-content-muted dark:placeholder-content-muted focus:outline-none focus:border-primary/opacity-heavy transition-all duration-300`,placeholder:`Enter username`,disabled:z.value||G.value},null,40,S),[[f,L.value]]),r[4]||=l(`div`,{class:`absolute inset-0 rounded-[12px] pointer-events-none input-glow`},null,-1)])]),l(`div`,C,[r[7]||=l(`label`,{for:`password`,class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-xs sm:text-sm font-medium mb-2`},` Password `,-1),l(`div`,w,[t(l(`input`,{id:`password`,name:`password`,"onUpdate:modelValue":r[1]||=e=>R.value=e,type:`password`,autocomplete:`current-password`,autocapitalize:`none`,autocorrect:`off`,spellcheck:`false`,onFocus:Q,onBlur:$,required:``,class:`input-glass w-full px-3 sm:px-4 py-2.5 sm:py-3.5 rounded-[12px] text-content-primary text-sm placeholder-content-muted dark:placeholder-content-muted focus:outline-none focus:border-primary/opacity-heavy transition-all duration-300`,placeholder:`Enter password`,disabled:z.value||G.value},null,40,T),[[f,R.value]]),r[6]||=l(`div`,{class:`absolute inset-0 rounded-[12px] pointer-events-none input-glow`},null,-1)])]),B.value?(n(),u(`div`,E,[l(`p`,D,i(B.value),1)])):o(``,!0),l(`button`,{type:`submit`,disabled:z.value||G.value,class:`button-glass w-full relative overflow-hidden bg-primary/opacity-medium hover:bg-primary/opacity-medium active:scale-[0.98] text-primary font-semibold py-3 sm:py-4 px-4 rounded-[12px] border border-primary/opacity-heavy hover:border-primary/opacity-heavy transition-all duration-300 focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2 sm:gap-2.5 group mt-6 sm:mt-8 text-sm sm:text-base backdrop-blur-sm`},[z.value?(n(),a(re,{key:0,size:`sm`,color:`white`})):(n(),u(`svg`,k,[...r[8]||=[l(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M11 16l-4-4m0 0l4-4m-4 4h14m-5 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h7a3 3 0 013 3v1`},null,-1)]])),l(`span`,A,i(z.value?`Signing in...`:G.value?`Try again in ${V.value}s`:`Sign In`),1)],8,O)],32),l(`div`,j,[r[9]||=l(`div`,{class:`flex flex-col items-center justify-center mb-4`},[l(`p`,{class:`text-content-muted text-[10px] sm:text-xs mb-1.5 tracking-wide uppercase opacity-60`},`Powered by`),l(`img`,{src:`/assets/meshcore-DQNtEl5I.svg`,alt:`MeshCore`,class:`h-4 sm:h-5 opacity-50 brightness-0 dark:brightness-100`})],-1),l(`div`,M,[l(`a`,N,[s(ce,{class:`w-5 h-5 sm:w-6 sm:h-6 text-white group-hover:text-primary transition-colors`})]),l(`a`,P,[s(oe,{class:`w-5 h-5 sm:w-6 sm:h-6 text-white group-hover:text-secondary transition-colors`})])])])])]),s(se,{"is-open":H.value,"can-skip":!0,onClose:Se,onSuccess:xe},null,8,[`is-open`])]))}}),[[`__scopeId`,`data-v-eec727a3`]]);export{F as default}; \ No newline at end of file +import{C as e,P as t,T as n,U as r,_t as i,c as a,h as ee,l as o,m as s,o as c,s as l,u,x as d}from"./runtime-core.esm-bundler-CINEgm0a.js";import{l as te,o as f}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{c as ne,f as p,g as m,i as h,r as g}from"./api-EpLa-SS4.js";import{t as _}from"./useTheme-vbCn9P26.js";import{t as re}from"./Spinner-CMJUE3iy.js";import{a as ie,d as v,i as ae,l as oe,n as se,u as ce}from"./index-DF5glAZc.js";var le={class:`min-h-screen bg-background dark:bg-background overflow-hidden relative flex items-start sm:items-center justify-center p-2 sm:p-4 pt-1`},ue={class:`absolute top-4 right-4 z-20`},de={class:`login-card relative z-10 w-full max-w-md p-6 sm:p-10 rounded-[16px] sm:rounded-[24px] border-0 sm:border sm:border-stroke-subtle dark:sm:border-stroke/opacity-medium backdrop-blur-xl`},fe={class:`relative login-content`},pe={class:`text-center`},me={class:`flex justify-center`},he=[`src`],y={key:0,class:`text-content-primary text-sm sm:text-base font-semibold mb-1`},b={class:`form-group`},x={class:`relative`},S=[`disabled`],C={class:`form-group`},w={class:`relative`},T=[`disabled`],E={key:0,class:`bg-accent-red/opacity-light border border-accent-red/opacity-medium rounded-[12px] p-2.5 sm:p-3.5 backdrop-blur-sm animate-shake`},D={class:`text-accent-red text-xs sm:text-sm font-medium`},O=[`disabled`],k={key:1,class:`w-4 h-4 sm:w-5 sm:h-5 group-hover:translate-x-1 transition-transform duration-300`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},A={class:`relative`},j={class:`mt-4 sm:mt-5 pt-3 sm:pt-4 border-t border-stroke-subtle dark:border-stroke/opacity-light`},M={class:`flex items-center justify-center gap-3`},N={href:`https://github.com/rightup`,target:`_blank`,class:`inline-flex items-center justify-center w-9 h-9 sm:w-10 sm:h-10 rounded-xl bg-content-primary dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-medium hover:bg-primary/opacity-medium dark:hover:bg-primary/opacity-medium hover:border-primary/opacity-heavy dark:hover:border-primary/opacity-heavy transition-all duration-300 hover:scale-110 group backdrop-blur-sm`,title:`GitHub`},P={href:`https://buymeacoffee.com/rightup`,target:`_blank`,class:`inline-flex items-center justify-center w-9 h-9 sm:w-10 sm:h-10 rounded-xl bg-content-primary dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-medium hover:bg-secondary/opacity-light hover:border-secondary/opacity-heavy dark:hover:border-secondary/opacity-heavy transition-all duration-300 hover:scale-110 group backdrop-blur-sm`,title:`Buy Me a Coffee`},F=v(ee({name:`LoginView`,__name:`Login`,setup(ee){let v=m(),F=h(),{theme:ge}=_(),I=c(()=>ie),L=r(`admin`),R=r(``),z=r(!1),B=r(``),V=r(0),H=r(!1),U=r(!1),W=r(``),G=c(()=>V.value>0),K=null,q=null,J=e=>{let t=document.querySelector(`meta[name="viewport"]`);if(t){if(e){q===null&&(q=t.getAttribute(`content`)),t.setAttribute(`content`,`width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover`);return}q===null?t.setAttribute(`content`,`width=device-width, initial-scale=1, viewport-fit=cover`):(t.setAttribute(`content`,q),q=null)}},_e=()=>{let e=document.activeElement;e instanceof HTMLElement&&e.blur()},Y=()=>new Promise(e=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{e()})})}),ve=async()=>{let e=window.visualViewport;if(!e||e.scale<=1.01)return;let t=document.querySelector(`meta[name="viewport"]`);if(!t)return;let n=t.getAttribute(`content`)||`width=device-width, initial-scale=1, viewport-fit=cover`;t.setAttribute(`content`,`width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover`),await Y(),t.setAttribute(`content`,n),await Y()},X=async()=>{_e(),await Y(),await ve(),window.scrollTo({top:0,left:0,behavior:`auto`}),await v.replace(`/`),await Y(),window.dispatchEvent(new Event(`resize`))},Z=()=>{K&&=(clearInterval(K),null)},ye=e=>{V.value=Math.max(1,Math.floor(e)),Z(),K=setInterval(()=>{if(V.value<=1){V.value=0,Z();return}--V.value},1e3)};d(()=>{Z(),J(!1)}),e(async()=>{try{W.value=(await g.get(`/api/site_info`)).data?.site_name??``}catch{}});let be=async()=>{if(G.value){B.value=`Too many login attempts. Please try again in ${V.value}s.`;return}B.value=``,z.value=!0;try{let e=ne(),t=(await g.post(`/auth/login`,{username:L.value,password:R.value,client_id:e})).data;t.success&&t.token?(V.value=0,Z(),R.value===`admin123`?(p(t.token),F.markAuthenticated(),U.value=!0,H.value=!0):(p(t.token),F.markAuthenticated(),await X())):B.value=t.error||`Login failed`}catch(e){console.error(`Login error:`,e);let t=e,n=t.response?.status,r=Number(t.response?.headers?.[`retry-after`]??0),i=Number(t.response?.data?.retry_after??0),a=Math.max(r,i);n===429&&a>0?(ye(a),B.value=t.response?.data?.error||`Too many login attempts. Please try again in ${V.value}s.`):B.value=t.response?.data?.error||`Connection error. Please try again.`}finally{z.value=!1}},xe=()=>{H.value=!1,X()},Se=()=>{H.value=!1,U.value&&X()},Q=()=>{J(!0)},$=()=>{J(!1)};return(e,r)=>(n(),u(`div`,le,[l(`div`,ue,[s(ae)]),r[11]||=l(`div`,{class:`bg-gradient-light dark:bg-gradient-dark absolute rounded-full -rotate-[24.22deg] w-[705px] h-[512px] blur-[120px] opacity-80 animate-pulse-slow -top-[79px] left-[575px] mix-blend-multiply dark:mix-blend-screen pointer-events-none`},null,-1),r[12]||=l(`div`,{class:`bg-gradient-light dark:bg-gradient-dark absolute rounded-full -rotate-[24.22deg] w-[705px] h-[512px] blur-[120px] opacity-75 animate-pulse-slower -top-[94px] -left-[92px] mix-blend-multiply dark:mix-blend-screen pointer-events-none`},null,-1),r[13]||=l(`div`,{class:`bg-gradient-light dark:bg-gradient-dark absolute rounded-full -rotate-[24.22deg] w-[705px] h-[512px] blur-[120px] opacity-80 animate-pulse-slowest top-[373px] left-[246px] mix-blend-multiply dark:mix-blend-screen pointer-events-none`},null,-1),l(`div`,de,[r[10]||=l(`div`,{class:`absolute inset-0 rounded-[24px] bg-gradient-to-br from-primary/3 dark:from-primary/opacity-subtle to-transparent pointer-events-none`},null,-1),l(`div`,fe,[l(`div`,pe,[l(`div`,me,[l(`img`,{src:I.value,alt:`openHop`,class:`logo-image h-[178px] sm:h-[210px] relative z-10`},null,8,he)]),r[2]||=l(`h1`,{class:`text-content-primary text-xl sm:text-2xl font-heading font-bold mt-1 mb-1`},` Repeater `,-1),W.value?(n(),u(`p`,y,i(W.value),1)):o(``,!0),r[3]||=l(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm pt-2`},` Sign in to access your dashboard `,-1)]),l(`form`,{onSubmit:te(be,[`prevent`]),autocomplete:`on`,action:`/`,class:`space-y-3 sm:space-y-4`},[l(`div`,b,[r[5]||=l(`label`,{for:`username`,class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-xs sm:text-sm font-medium mb-2`},` Username `,-1),l(`div`,x,[t(l(`input`,{id:`username`,name:`username`,"onUpdate:modelValue":r[0]||=e=>L.value=e,type:`text`,autocomplete:`username`,autocapitalize:`none`,autocorrect:`off`,spellcheck:`false`,onFocus:Q,onBlur:$,required:``,class:`input-glass w-full px-3 sm:px-4 py-2.5 sm:py-3.5 rounded-[12px] text-content-primary text-sm placeholder-content-muted dark:placeholder-content-muted focus:outline-none focus:border-primary/opacity-heavy transition-all duration-300`,placeholder:`Enter username`,disabled:z.value||G.value},null,40,S),[[f,L.value]]),r[4]||=l(`div`,{class:`absolute inset-0 rounded-[12px] pointer-events-none input-glow`},null,-1)])]),l(`div`,C,[r[7]||=l(`label`,{for:`password`,class:`block text-content-secondary dark:text-content-primary/opacity-heavy text-xs sm:text-sm font-medium mb-2`},` Password `,-1),l(`div`,w,[t(l(`input`,{id:`password`,name:`password`,"onUpdate:modelValue":r[1]||=e=>R.value=e,type:`password`,autocomplete:`current-password`,autocapitalize:`none`,autocorrect:`off`,spellcheck:`false`,onFocus:Q,onBlur:$,required:``,class:`input-glass w-full px-3 sm:px-4 py-2.5 sm:py-3.5 rounded-[12px] text-content-primary text-sm placeholder-content-muted dark:placeholder-content-muted focus:outline-none focus:border-primary/opacity-heavy transition-all duration-300`,placeholder:`Enter password`,disabled:z.value||G.value},null,40,T),[[f,R.value]]),r[6]||=l(`div`,{class:`absolute inset-0 rounded-[12px] pointer-events-none input-glow`},null,-1)])]),B.value?(n(),u(`div`,E,[l(`p`,D,i(B.value),1)])):o(``,!0),l(`button`,{type:`submit`,disabled:z.value||G.value,class:`button-glass w-full relative overflow-hidden bg-primary/opacity-medium hover:bg-primary/opacity-medium active:scale-[0.98] text-primary font-semibold py-3 sm:py-4 px-4 rounded-[12px] border border-primary/opacity-heavy hover:border-primary/opacity-heavy transition-all duration-300 focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2 sm:gap-2.5 group mt-6 sm:mt-8 text-sm sm:text-base backdrop-blur-sm`},[z.value?(n(),a(re,{key:0,size:`sm`,color:`white`})):(n(),u(`svg`,k,[...r[8]||=[l(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M11 16l-4-4m0 0l4-4m-4 4h14m-5 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h7a3 3 0 013 3v1`},null,-1)]])),l(`span`,A,i(z.value?`Signing in...`:G.value?`Try again in ${V.value}s`:`Sign In`),1)],8,O)],32),l(`div`,j,[r[9]||=l(`div`,{class:`flex flex-col items-center justify-center mb-4`},[l(`p`,{class:`text-content-muted text-[10px] sm:text-xs mb-1.5 tracking-wide uppercase opacity-60`},`Powered by`),l(`img`,{src:`/assets/meshcore-DQNtEl5I.svg`,alt:`MeshCore`,class:`h-4 sm:h-5 opacity-50 brightness-0 dark:brightness-100`})],-1),l(`div`,M,[l(`a`,N,[s(ce,{class:`w-5 h-5 sm:w-6 sm:h-6 text-white group-hover:text-primary transition-colors`})]),l(`a`,P,[s(oe,{class:`w-5 h-5 sm:w-6 sm:h-6 text-white group-hover:text-secondary transition-colors`})])])])])]),s(se,{"is-open":H.value,"can-skip":!0,onClose:Se,onSuccess:xe},null,8,[`is-open`])]))}}),[[`__scopeId`,`data-v-eec727a3`]]);export{F as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/Logs-CrHzoPRp.js b/repeater/web/html/assets/Logs-CNUMuKWB.js similarity index 99% rename from repeater/web/html/assets/Logs-CrHzoPRp.js rename to repeater/web/html/assets/Logs-CNUMuKWB.js index db41bd8..d516250 100644 --- a/repeater/web/html/assets/Logs-CrHzoPRp.js +++ b/repeater/web/html/assets/Logs-CNUMuKWB.js @@ -1 +1 @@ -import{C as e,D as t,P as n,T as r,U as i,_t as a,h as ee,ht as o,l as s,m as te,o as c,p as l,r as u,s as d,u as f,x as ne,y as re}from"./runtime-core.esm-bundler-CINEgm0a.js";import{o as p}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{l as ie,t as ae}from"./api-CP9MgmUS.js";import{t as oe}from"./Spinner-CMJUE3iy.js";var se={class:`space-y-6`},ce={class:`glass-card backdrop-blur border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-6 space-y-5`},le={class:`flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between`},ue={class:`flex flex-wrap items-center gap-2`},de=[`disabled`],fe={class:`grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-4`},pe={class:`rounded-xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle px-4 py-3`},me={class:`mt-1 text-xl font-semibold text-content-primary`},he={class:`text-xs text-content-secondary dark:text-content-muted`},ge={class:`rounded-xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle px-4 py-3`},_e={class:`mt-1 text-xl font-semibold text-content-primary`},ve={class:`text-xs text-content-secondary dark:text-content-muted`},ye={class:`rounded-xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle px-4 py-3`},be={class:`mt-1 text-xl font-semibold text-content-primary`},xe={class:`text-xs text-content-secondary dark:text-content-muted`},Se={class:`rounded-xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle px-4 py-3`},Ce={class:`mt-1 text-sm font-semibold text-content-primary`},we={class:`text-xs text-content-secondary dark:text-content-muted`},Te={class:`rounded-2xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-main dark:bg-surface-900 p-4 space-y-4`},Ee={class:`grid grid-cols-1 xl:grid-cols-12 gap-4`},De={class:`xl:col-span-8`},Oe={class:`xl:col-span-4`},ke={class:`flex flex-wrap items-center gap-2 xl:justify-end`},Ae={class:`grid grid-cols-1 xl:grid-cols-2 gap-4`},je={class:`rounded-xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-mute/opacity-heavy dark:bg-white/[0.03] p-4`},Me={class:`flex flex-wrap items-center justify-between gap-2 mb-3`},Ne={class:`text-xs text-content-secondary dark:text-content-muted`},Pe={class:`flex flex-wrap gap-2`},Fe=[`onClick`],Ie={class:`rounded-xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-mute/opacity-heavy dark:bg-white/[0.03] overflow-hidden`},Le={class:`text-xs text-content-secondary dark:text-content-muted`},Re={key:0,class:`border-t border-stroke-subtle dark:border-stroke/opacity-medium px-4 py-4 space-y-3`},ze={class:`flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between`},Be={class:`max-h-52 overflow-y-auto pr-1`},Ve={key:0,class:`flex flex-wrap gap-2`},He=[`onClick`],Ue={key:1,class:`text-sm text-content-secondary dark:text-content-muted py-6 text-center`},We={class:`glass-card backdrop-blur border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] overflow-hidden`},Ge={key:0,class:`p-8 text-center`},Ke={key:1,class:`p-8 text-center`},qe={class:`text-content-secondary dark:text-content-muted mb-4`},Je={key:2,class:`relative`},Ye={key:0,class:`p-10 text-center text-content-secondary`},Xe={key:1,class:`divide-y divide-stroke-subtle dark:divide-white/opacity-subtle`},Ze=[`onClick`],Qe={class:`flex flex-col gap-0.5 xl:flex-row xl:items-start`},$e={class:`flex flex-wrap items-center gap-1.5 xl:min-w-[260px] xl:max-w-[260px] xl:flex-none`},et={class:`text-[11px] text-content-muted`},tt={class:`px-1.5 py-0.5 text-[10px] font-semibold rounded-full border border-stroke-subtle dark:border-white/opacity-light bg-stroke-subtle/50 dark:bg-white/opacity-subtle text-content-secondary dark:text-content-muted`},nt={class:`min-w-0 flex-1`},rt={class:`text-xs leading-4 break-words text-content-primary`},it={key:0,class:`mt-3 rounded-xl border border-stroke-subtle dark:border-white/opacity-light bg-background-mute dark:bg-black/opacity-medium p-3 space-y-3 text-xs text-content-secondary`},at={class:`grid grid-cols-1 gap-3 md:grid-cols-2 xl:grid-cols-4`},ot={class:`mt-1 text-content-primary`},st={class:`mt-1 text-content-primary`},ct={class:`mt-1 text-content-primary`},lt={class:`mt-1 text-content-primary`},ut={class:`whitespace-pre-wrap break-words text-content-primary`},dt={key:0},ft={class:`whitespace-pre-wrap break-words text-accent-red/opacity-heavy`},pt={key:0,class:`absolute bottom-4 right-4`},m=1e3,mt=3e3,h=ee({name:`LogsView`,__name:`Logs`,setup(ee){let h=i([]),g=i(new Set),_=i(new Set([`DEBUG`,`INFO`,`WARNING`,`ERROR`,`WARN`])),v=i(new Set),y=i(new Set),b=i(!0),x=i(!1),S=i(null),C=i(`connecting`),w=i(!0),T=i(!0),E=i(0),D=i(``),O=i(``),k=i(null),A=i(!1),j=i(null),M=i(null),N=i(null),P=null,F=(e,t)=>{if(e.size!==t.size)return!1;for(let n of e)if(!t.has(n))return!1;return!0},I=e=>{if(e.logger)return e.logger;let t=e.message.match(/- ([^-]+) - (?:DEBUG|INFO|WARNING|ERROR|WARN) -/);return t?t[1].trim():`Unknown`},L=e=>{let t=e.message.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - [^-]+ - (?:DEBUG|INFO|WARNING|ERROR|WARN) - (.+)$/);return t?t[1]:e.message},ht=e=>new Date(e).toLocaleTimeString(`en-US`,{hour12:!1,hour:`2-digit`,minute:`2-digit`,second:`2-digit`}),R=e=>new Date(e).toLocaleString(`en-US`,{hour12:!1,year:`numeric`,month:`short`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`}),gt=e=>({ERROR:`text-accent-red bg-accent-red/opacity-light border-accent-red/opacity-medium`,WARNING:`text-accent-amber bg-accent-amber/opacity-light border-accent-amber/opacity-medium`,WARN:`text-accent-amber bg-accent-amber/opacity-light border-accent-amber/opacity-medium`,INFO:`text-accent-cyan bg-accent-cyan/opacity-light border-accent-cyan/opacity-medium`,DEBUG:`text-content-muted bg-background-mute/opacity-light border-slate-500/20`})[e]||`text-content-muted bg-background-mute/opacity-light border-slate-500/20`,_t=(e,t)=>t?{ERROR:`border-accent-red/opacity-heavy bg-accent-red/opacity-light text-accent-red`,WARNING:`border-accent-amber/opacity-heavy bg-accent-amber/opacity-light text-accent-amber`,WARN:`border-accent-amber/opacity-heavy bg-accent-amber/opacity-light text-accent-amber`,INFO:`border-accent-cyan/opacity-heavy bg-accent-cyan/opacity-light text-accent-cyan`,DEBUG:`border-slate-500/40 bg-background-mute/opacity-light text-content-muted`}[e]||`border-primary/opacity-heavy bg-primary/opacity-light text-primary`:`border-stroke-subtle dark:border-stroke/opacity-medium text-content-muted bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle hover:bg-background-mute dark:hover:bg-white/opacity-light`,vt=c(()=>({connecting:`border-accent-amber/opacity-medium bg-accent-amber/opacity-light text-accent-amber`,live:`border-accent-green/opacity-medium bg-accent-green/opacity-light text-accent-green`,paused:`border-stroke/opacity-medium bg-background-mute text-content-muted`,reconnecting:`border-accent-amber/opacity-medium bg-accent-amber/opacity-light text-accent-amber`,offline:`border-accent-red/opacity-medium bg-accent-red/opacity-light text-accent-red`})[C.value]),yt=c(()=>({connecting:`Connecting`,live:`Live`,paused:`Paused`,reconnecting:`Reconnecting`,offline:`Offline`})[C.value]),bt=c(()=>{let e=[`ERROR`,`WARNING`,`WARN`,`INFO`,`DEBUG`];return Array.from(y.value).sort((t,n)=>{let r=e.indexOf(t),i=e.indexOf(n);return r!==-1&&i!==-1?r-i:t.localeCompare(n)})}),z=c(()=>{let e=O.value.trim().toLowerCase();return Array.from(v.value).sort().filter(t=>!e||t.toLowerCase().includes(e))}),B=c(()=>{let e=D.value.trim().toLowerCase();return h.value.filter(t=>{let n=I(t),r=g.value.has(n),i=_.value.has(t.level);return!r||!i?!1:e?[n,t.level,L(t),t.exception??``,t.module??``,t.process??``].join(` `).toLowerCase().includes(e):!0})}),V=c(()=>g.value.size),H=c(()=>_.value.size),xt=c(()=>h.value.length),St=c(()=>B.value.length),U=c(()=>h.value[h.value.length-1]?.id??0);c(()=>k.value===null?null:h.value.find(e=>e.id===k.value)??null);function W(){if(!M.value)return!0;let e=M.value;return e.scrollHeight-e.scrollTop-e.clientHeight<32}function G(e=!1){re(()=>{let t=M.value;t&&(t.scrollTop=t.scrollHeight,e&&(T.value=!0,E.value=0))})}function Ct(e){let t=new Set,n=new Set;e.forEach(e=>{t.add(I(e)),n.add(e.level)});let r=g.value.size===0||F(g.value,v.value),i=_.value.size===0||F(_.value,y.value);v.value=t,y.value=n,r||g.value.size===0?g.value=new Set(t):g.value=new Set(Array.from(g.value).filter(e=>t.has(e))),i||_.value.size===0?_.value=new Set(n):_.value=new Set(Array.from(_.value).filter(e=>n.has(e)))}function wt(e){return{id:typeof e.id==`number`?e.id:void 0,message:String(e.message??``),timestamp:String(e.timestamp??new Date().toISOString()),level:String(e.level??`INFO`),logger:e.logger?String(e.logger):void 0,exception:e.exception?String(e.exception):void 0,module:e.module?String(e.module):void 0,pathname:e.pathname?String(e.pathname):void 0,line:typeof e.line==`number`?e.line:void 0,thread:e.thread?String(e.thread):void 0,process:e.process?String(e.process):void 0}}function K(e,t={}){let n=e.map(wt),r=W(),i=0;if(t.replace)h.value=n.sort((e,t)=>(e.id??0)-(t.id??0)).slice(-m);else{let e=new Set(h.value.map(e=>e.id).filter(e=>typeof e==`number`)),t=n.filter(t=>typeof t.id==`number`?!e.has(t.id):!0);if(i=t.length,!t.length)return;h.value=[...h.value,...t].sort((e,t)=>(e.id??0)-(t.id??0)).slice(-m)}Ct(h.value),k.value!==null&&!h.value.some(e=>e.id===k.value)&&(k.value=null),t.fromStream&&i>0?T.value&&r?G():E.value+=i:T.value&&G()}async function q(e=`refresh`){e===`initial`?b.value=!0:x.value=!0;try{K((await ae.getLogs()).logs,{replace:!0}),S.value=null}catch(e){console.error(`Error loading logs:`,e),S.value=e instanceof Error?e.message:`Failed to load logs`,h.value.length||(C.value=`offline`)}finally{b.value=!1,x.value=!1}}function J(){P&&=(clearTimeout(P),null)}function Y(e=`paused`){J(),N.value&&=(N.value.close(),null),C.value=e}function Tt(){w.value&&(J(),C.value=`reconnecting`,P=setTimeout(()=>{P=null,X()},mt))}function X(){if(!w.value){C.value=`paused`;return}Y(`connecting`);let e=ie(),t=new URLSearchParams;e&&t.set(`token`,e),U.value>0&&t.set(`since_id`,String(U.value));let n=t.toString(),r=`/api/logs_stream${n?`?${n}`:``}`,i=new EventSource(r);N.value=i,i.onopen=()=>{(C.value===`connecting`||C.value===`reconnecting`)&&(C.value=`live`),j.value=new Date().toISOString(),S.value=null},i.addEventListener(`connected`,e=>{if(C.value=`live`,j.value=new Date().toISOString(),e instanceof MessageEvent&&e.data)try{(JSON.parse(e.data).latest_id??0)>U.value&&q(`refresh`)}catch{}}),i.addEventListener(`log`,e=>{if(e instanceof MessageEvent)try{let t=JSON.parse(e.data);t.entry&&K([t.entry],{fromStream:!0}),C.value=`live`,j.value=new Date().toISOString(),S.value=null}catch(e){console.error(`Failed to parse log stream payload:`,e)}}),i.addEventListener(`keepalive`,()=>{j.value=new Date().toISOString(),C.value!==`paused`&&(C.value=`live`)}),i.onerror=()=>{if(!w.value){Y(`paused`);return}N.value&&=(N.value.close(),null),Tt()}}function Et(){w.value=!w.value,w.value?X():Y(`paused`)}function Dt(){let e=W();T.value=e,e&&(E.value=0)}function Z(){G(!0)}function Ot(e){k.value=k.value===e.id?null:e.id??null}function kt(e){_.value.has(e)?_.value.delete(e):_.value.add(e),_.value=new Set(_.value)}function At(e){g.value.has(e)?g.value.delete(e):g.value.add(e),g.value=new Set(g.value)}function Q(){g.value=new Set(v.value)}function jt(){g.value=new Set}function $(){_.value=new Set(y.value)}function Mt(){_.value=new Set}function Nt(){D.value=``,O.value=``,Q(),$()}return e(async()=>{await q(`initial`),X()}),ne(()=>{Y(`offline`)}),(e,i)=>(r(),f(`div`,se,[d(`div`,ce,[d(`div`,le,[i[8]||=d(`div`,null,[d(`h1`,{class:`text-content-primary text-2xl font-semibold mb-2`},` System Logs `),d(`p`,{class:`text-content-secondary dark:text-content-muted max-w-2xl`},` Live tail for repeater logs with pause, follow, search, and logger-level filtering. `)],-1),d(`div`,ue,[d(`span`,{class:o([`inline-flex items-center gap-2 rounded-full border px-3 py-1.5 text-xs font-semibold`,vt.value])},[i[6]||=d(`span`,{class:`h-2 w-2 rounded-full bg-current`},null,-1),l(` `+a(yt.value),1)],2),d(`button`,{onClick:Et,class:`btn-secondary`},a(w.value?`Pause Live`:`Resume Live`),1),d(`button`,{onClick:i[0]||=e=>q(`refresh`),disabled:x.value,class:`btn-primary flex items-center gap-2`},[(r(),f(`svg`,{class:o([`w-4 h-4`,{"animate-spin":x.value}]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...i[7]||=[d(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15`},null,-1)]],2)),l(` `+a(x.value?`Refreshing…`:`Refresh Snapshot`),1)],8,de)])]),d(`div`,fe,[d(`div`,pe,[i[9]||=d(`div`,{class:`text-xs uppercase tracking-wide text-content-muted`},`Visible`,-1),d(`div`,me,a(St.value),1),d(`div`,he,`of `+a(xt.value)+` retained lines`,1)]),d(`div`,ge,[i[10]||=d(`div`,{class:`text-xs uppercase tracking-wide text-content-muted`},`Logger Filters`,-1),d(`div`,_e,a(V.value),1),d(`div`,ve,`of `+a(v.value.size)+` selected`,1)]),d(`div`,ye,[i[11]||=d(`div`,{class:`text-xs uppercase tracking-wide text-content-muted`},`Level Filters`,-1),d(`div`,be,a(H.value),1),d(`div`,xe,`of `+a(y.value.size)+` selected`,1)]),d(`div`,Se,[i[12]||=d(`div`,{class:`text-xs uppercase tracking-wide text-content-muted`},`Last Activity`,-1),d(`div`,Ce,a(j.value?R(j.value):`Waiting for stream`),1),d(`div`,we,a(E.value?`${E.value} new line${E.value===1?``:`s`} waiting`:`Up to date`),1)])]),d(`div`,Te,[d(`div`,Ee,[d(`div`,De,[i[13]||=d(`label`,{class:`block text-xs font-semibold uppercase tracking-wide text-content-muted mb-2`},` Search Logs `,-1),n(d(`input`,{"onUpdate:modelValue":i[1]||=e=>D.value=e,type:`text`,class:`cfg-input`,placeholder:`Search logger, message, exception, module...`},null,512),[[p,D.value]])]),d(`div`,Oe,[i[14]||=d(`label`,{class:`block text-xs font-semibold uppercase tracking-wide text-content-muted mb-2`},` Actions `,-1),d(`div`,ke,[d(`button`,{onClick:i[2]||=e=>T.value=!T.value,class:`btn-secondary`},a(T.value?`Following Tail`:`Follow Off`),1),E.value?(r(),f(`button`,{key:0,onClick:Z,class:`btn-primary`},` Jump to Latest (`+a(E.value)+`) `,1)):s(``,!0),d(`button`,{onClick:Nt,class:`btn-secondary`},`Reset Filters`)])])]),d(`div`,Ae,[d(`div`,je,[d(`div`,Me,[d(`div`,null,[i[15]||=d(`div`,{class:`text-sm font-semibold text-content-primary`},`Level Filters`,-1),d(`div`,Ne,a(H.value)+` of `+a(y.value.size)+` selected`,1)]),d(`div`,{class:`flex items-center gap-2`},[d(`button`,{onClick:$,class:`btn-success-xs`},`All`),d(`button`,{onClick:Mt,class:`btn-danger-xs`},`None`)])]),d(`div`,Pe,[(r(!0),f(u,null,t(bt.value,e=>(r(),f(`button`,{key:e,onClick:t=>kt(e),class:o([`px-3 py-1.5 text-xs border rounded-full transition-colors font-semibold`,_t(e,_.value.has(e))])},a(e),11,Fe))),128))])]),d(`div`,Ie,[d(`button`,{onClick:i[3]||=e=>A.value=!A.value,class:`w-full flex items-center justify-between px-4 py-3 text-left`},[d(`div`,null,[i[16]||=d(`div`,{class:`text-sm font-semibold text-content-primary`},`Logger Filters`,-1),d(`div`,Le,a(V.value)+` of `+a(v.value.size)+` selected`,1)]),(r(),f(`svg`,{class:o([`w-4 h-4 text-content-muted transition-transform`,{"rotate-180":A.value}]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...i[17]||=[d(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 9l-7 7-7-7`},null,-1)]],2))]),A.value?(r(),f(`div`,Re,[d(`div`,ze,[n(d(`input`,{"onUpdate:modelValue":i[4]||=e=>O.value=e,type:`text`,class:`cfg-input lg:max-w-sm`,placeholder:`Find a logger...`},null,512),[[p,O.value]]),d(`div`,{class:`flex flex-wrap items-center gap-2`},[d(`button`,{onClick:Q,class:`btn-success-xs`},`All Loggers`),d(`button`,{onClick:jt,class:`btn-danger-xs`},`Clear Loggers`)])]),d(`div`,Be,[z.value.length?(r(),f(`div`,Ve,[(r(!0),f(u,null,t(z.value,e=>(r(),f(`button`,{key:e,onClick:t=>At(e),class:o([`px-3 py-1.5 text-xs border rounded-full transition-colors`,g.value.has(e)?`bg-primary/opacity-light border-primary/opacity-heavy text-primary`:`bg-background-main dark:bg-white/opacity-subtle border-stroke-subtle dark:border-stroke/opacity-medium text-content-secondary dark:text-content-muted hover:bg-background-mute dark:hover:bg-white/opacity-light`])},a(e),11,He))),128))])):(r(),f(`div`,Ue,` No loggers match this filter. `))])])):s(``,!0)])])])]),d(`div`,We,[b.value&&h.value.length===0?(r(),f(`div`,Ge,[te(oe,{class:`mx-auto mb-4`}),i[18]||=d(`p`,{class:`text-content-secondary dark:text-content-muted`},`Loading log history...`,-1)])):S.value&&h.value.length===0?(r(),f(`div`,Ke,[i[19]||=d(`div`,{class:`text-accent-red mb-4`},[d(`svg`,{class:`w-12 h-12 mx-auto mb-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[d(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`})])],-1),i[20]||=d(`h3`,{class:`text-content-primary text-lg font-medium mb-2`},`Error Loading Logs`,-1),d(`p`,qe,a(S.value),1),d(`button`,{onClick:i[5]||=e=>q(`refresh`),class:`btn-primary`},`Try Again`)])):(r(),f(`div`,Je,[d(`div`,{ref_key:`logContainer`,ref:M,class:`max-h-[70vh] overflow-y-auto bg-background-mute dark:bg-background-mute/opacity-heavy text-content-primary`,onScroll:Dt},[B.value.length===0?(r(),f(`div`,Ye,[...i[21]||=[d(`h3`,{class:`text-lg font-medium text-content-primary mb-2`},`No Logs to Display`,-1),d(`p`,{class:`text-sm text-content-muted`},`The current search and filter settings removed every retained line.`,-1)]])):(r(),f(`div`,Xe,[(r(!0),f(u,null,t(B.value,(e,t)=>(r(),f(`div`,{key:e.id??`${e.timestamp}-${t}`,class:o([`px-3 py-1 transition-colors cursor-pointer`,k.value===e.id?`bg-stroke-subtle dark:bg-white/opacity-subtle`:`hover:bg-stroke-subtle/50 dark:hover:bg-white/opacity-light`]),onClick:t=>Ot(e)},[d(`div`,Qe,[d(`div`,$e,[d(`span`,et,a(ht(e.timestamp)),1),d(`span`,tt,a(I(e)),1),d(`span`,{class:o([`px-1.5 py-0.5 text-[10px] font-semibold rounded-full border`,gt(e.level)])},a(e.level),3)]),d(`div`,nt,[d(`div`,rt,a(L(e)),1),k.value===e.id?(r(),f(`div`,it,[d(`div`,at,[d(`div`,null,[i[22]||=d(`div`,{class:`uppercase tracking-wide text-content-muted`},`Timestamp`,-1),d(`div`,ot,a(R(e.timestamp)),1)]),d(`div`,null,[i[23]||=d(`div`,{class:`uppercase tracking-wide text-content-muted`},`Logger`,-1),d(`div`,st,a(I(e)),1)]),d(`div`,null,[i[24]||=d(`div`,{class:`uppercase tracking-wide text-content-muted`},`Module`,-1),d(`div`,ct,a(e.module||`—`),1)]),d(`div`,null,[i[25]||=d(`div`,{class:`uppercase tracking-wide text-content-muted`},`Line`,-1),d(`div`,lt,a(e.line??`—`),1)])]),d(`div`,null,[i[26]||=d(`div`,{class:`uppercase tracking-wide text-content-muted mb-1`},`Full Message`,-1),d(`pre`,ut,a(e.message),1)]),e.exception?(r(),f(`div`,dt,[i[27]||=d(`div`,{class:`uppercase tracking-wide text-content-muted mb-1`},`Exception`,-1),d(`pre`,ft,a(e.exception),1)])):s(``,!0)])):s(``,!0)])])],10,Ze))),128))]))],544),!T.value&&E.value?(r(),f(`div`,pt,[d(`button`,{onClick:Z,class:`rounded-full border border-primary/opacity-heavy bg-primary/opacity-medium hover:bg-primary/opacity-medium text-primary px-4 py-2 shadow-lg`},a(E.value)+` new line`+a(E.value===1?``:`s`),1)])):s(``,!0)]))])]))}});export{h as default}; \ No newline at end of file +import{C as e,D as t,P as n,T as r,U as i,_t as a,h as ee,ht as o,l as s,m as te,o as c,p as l,r as u,s as d,u as f,x as ne,y as re}from"./runtime-core.esm-bundler-CINEgm0a.js";import{o as p}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{l as ie,t as ae}from"./api-EpLa-SS4.js";import{t as oe}from"./Spinner-CMJUE3iy.js";var se={class:`space-y-6`},ce={class:`glass-card backdrop-blur border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-6 space-y-5`},le={class:`flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between`},ue={class:`flex flex-wrap items-center gap-2`},de=[`disabled`],fe={class:`grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-4`},pe={class:`rounded-xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle px-4 py-3`},me={class:`mt-1 text-xl font-semibold text-content-primary`},he={class:`text-xs text-content-secondary dark:text-content-muted`},ge={class:`rounded-xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle px-4 py-3`},_e={class:`mt-1 text-xl font-semibold text-content-primary`},ve={class:`text-xs text-content-secondary dark:text-content-muted`},ye={class:`rounded-xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle px-4 py-3`},be={class:`mt-1 text-xl font-semibold text-content-primary`},xe={class:`text-xs text-content-secondary dark:text-content-muted`},Se={class:`rounded-xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle px-4 py-3`},Ce={class:`mt-1 text-sm font-semibold text-content-primary`},we={class:`text-xs text-content-secondary dark:text-content-muted`},Te={class:`rounded-2xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-main dark:bg-surface-900 p-4 space-y-4`},Ee={class:`grid grid-cols-1 xl:grid-cols-12 gap-4`},De={class:`xl:col-span-8`},Oe={class:`xl:col-span-4`},ke={class:`flex flex-wrap items-center gap-2 xl:justify-end`},Ae={class:`grid grid-cols-1 xl:grid-cols-2 gap-4`},je={class:`rounded-xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-mute/opacity-heavy dark:bg-white/[0.03] p-4`},Me={class:`flex flex-wrap items-center justify-between gap-2 mb-3`},Ne={class:`text-xs text-content-secondary dark:text-content-muted`},Pe={class:`flex flex-wrap gap-2`},Fe=[`onClick`],Ie={class:`rounded-xl border border-stroke-subtle dark:border-stroke/opacity-medium bg-background-mute/opacity-heavy dark:bg-white/[0.03] overflow-hidden`},Le={class:`text-xs text-content-secondary dark:text-content-muted`},Re={key:0,class:`border-t border-stroke-subtle dark:border-stroke/opacity-medium px-4 py-4 space-y-3`},ze={class:`flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between`},Be={class:`max-h-52 overflow-y-auto pr-1`},Ve={key:0,class:`flex flex-wrap gap-2`},He=[`onClick`],Ue={key:1,class:`text-sm text-content-secondary dark:text-content-muted py-6 text-center`},We={class:`glass-card backdrop-blur border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] overflow-hidden`},Ge={key:0,class:`p-8 text-center`},Ke={key:1,class:`p-8 text-center`},qe={class:`text-content-secondary dark:text-content-muted mb-4`},Je={key:2,class:`relative`},Ye={key:0,class:`p-10 text-center text-content-secondary`},Xe={key:1,class:`divide-y divide-stroke-subtle dark:divide-white/opacity-subtle`},Ze=[`onClick`],Qe={class:`flex flex-col gap-0.5 xl:flex-row xl:items-start`},$e={class:`flex flex-wrap items-center gap-1.5 xl:min-w-[260px] xl:max-w-[260px] xl:flex-none`},et={class:`text-[11px] text-content-muted`},tt={class:`px-1.5 py-0.5 text-[10px] font-semibold rounded-full border border-stroke-subtle dark:border-white/opacity-light bg-stroke-subtle/50 dark:bg-white/opacity-subtle text-content-secondary dark:text-content-muted`},nt={class:`min-w-0 flex-1`},rt={class:`text-xs leading-4 break-words text-content-primary`},it={key:0,class:`mt-3 rounded-xl border border-stroke-subtle dark:border-white/opacity-light bg-background-mute dark:bg-black/opacity-medium p-3 space-y-3 text-xs text-content-secondary`},at={class:`grid grid-cols-1 gap-3 md:grid-cols-2 xl:grid-cols-4`},ot={class:`mt-1 text-content-primary`},st={class:`mt-1 text-content-primary`},ct={class:`mt-1 text-content-primary`},lt={class:`mt-1 text-content-primary`},ut={class:`whitespace-pre-wrap break-words text-content-primary`},dt={key:0},ft={class:`whitespace-pre-wrap break-words text-accent-red/opacity-heavy`},pt={key:0,class:`absolute bottom-4 right-4`},m=1e3,mt=3e3,h=ee({name:`LogsView`,__name:`Logs`,setup(ee){let h=i([]),g=i(new Set),_=i(new Set([`DEBUG`,`INFO`,`WARNING`,`ERROR`,`WARN`])),v=i(new Set),y=i(new Set),b=i(!0),x=i(!1),S=i(null),C=i(`connecting`),w=i(!0),T=i(!0),E=i(0),D=i(``),O=i(``),k=i(null),A=i(!1),j=i(null),M=i(null),N=i(null),P=null,F=(e,t)=>{if(e.size!==t.size)return!1;for(let n of e)if(!t.has(n))return!1;return!0},I=e=>{if(e.logger)return e.logger;let t=e.message.match(/- ([^-]+) - (?:DEBUG|INFO|WARNING|ERROR|WARN) -/);return t?t[1].trim():`Unknown`},L=e=>{let t=e.message.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - [^-]+ - (?:DEBUG|INFO|WARNING|ERROR|WARN) - (.+)$/);return t?t[1]:e.message},ht=e=>new Date(e).toLocaleTimeString(`en-US`,{hour12:!1,hour:`2-digit`,minute:`2-digit`,second:`2-digit`}),R=e=>new Date(e).toLocaleString(`en-US`,{hour12:!1,year:`numeric`,month:`short`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`}),gt=e=>({ERROR:`text-accent-red bg-accent-red/opacity-light border-accent-red/opacity-medium`,WARNING:`text-accent-amber bg-accent-amber/opacity-light border-accent-amber/opacity-medium`,WARN:`text-accent-amber bg-accent-amber/opacity-light border-accent-amber/opacity-medium`,INFO:`text-accent-cyan bg-accent-cyan/opacity-light border-accent-cyan/opacity-medium`,DEBUG:`text-content-muted bg-background-mute/opacity-light border-slate-500/20`})[e]||`text-content-muted bg-background-mute/opacity-light border-slate-500/20`,_t=(e,t)=>t?{ERROR:`border-accent-red/opacity-heavy bg-accent-red/opacity-light text-accent-red`,WARNING:`border-accent-amber/opacity-heavy bg-accent-amber/opacity-light text-accent-amber`,WARN:`border-accent-amber/opacity-heavy bg-accent-amber/opacity-light text-accent-amber`,INFO:`border-accent-cyan/opacity-heavy bg-accent-cyan/opacity-light text-accent-cyan`,DEBUG:`border-slate-500/40 bg-background-mute/opacity-light text-content-muted`}[e]||`border-primary/opacity-heavy bg-primary/opacity-light text-primary`:`border-stroke-subtle dark:border-stroke/opacity-medium text-content-muted bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle hover:bg-background-mute dark:hover:bg-white/opacity-light`,vt=c(()=>({connecting:`border-accent-amber/opacity-medium bg-accent-amber/opacity-light text-accent-amber`,live:`border-accent-green/opacity-medium bg-accent-green/opacity-light text-accent-green`,paused:`border-stroke/opacity-medium bg-background-mute text-content-muted`,reconnecting:`border-accent-amber/opacity-medium bg-accent-amber/opacity-light text-accent-amber`,offline:`border-accent-red/opacity-medium bg-accent-red/opacity-light text-accent-red`})[C.value]),yt=c(()=>({connecting:`Connecting`,live:`Live`,paused:`Paused`,reconnecting:`Reconnecting`,offline:`Offline`})[C.value]),bt=c(()=>{let e=[`ERROR`,`WARNING`,`WARN`,`INFO`,`DEBUG`];return Array.from(y.value).sort((t,n)=>{let r=e.indexOf(t),i=e.indexOf(n);return r!==-1&&i!==-1?r-i:t.localeCompare(n)})}),z=c(()=>{let e=O.value.trim().toLowerCase();return Array.from(v.value).sort().filter(t=>!e||t.toLowerCase().includes(e))}),B=c(()=>{let e=D.value.trim().toLowerCase();return h.value.filter(t=>{let n=I(t),r=g.value.has(n),i=_.value.has(t.level);return!r||!i?!1:e?[n,t.level,L(t),t.exception??``,t.module??``,t.process??``].join(` `).toLowerCase().includes(e):!0})}),V=c(()=>g.value.size),H=c(()=>_.value.size),xt=c(()=>h.value.length),St=c(()=>B.value.length),U=c(()=>h.value[h.value.length-1]?.id??0);c(()=>k.value===null?null:h.value.find(e=>e.id===k.value)??null);function W(){if(!M.value)return!0;let e=M.value;return e.scrollHeight-e.scrollTop-e.clientHeight<32}function G(e=!1){re(()=>{let t=M.value;t&&(t.scrollTop=t.scrollHeight,e&&(T.value=!0,E.value=0))})}function Ct(e){let t=new Set,n=new Set;e.forEach(e=>{t.add(I(e)),n.add(e.level)});let r=g.value.size===0||F(g.value,v.value),i=_.value.size===0||F(_.value,y.value);v.value=t,y.value=n,r||g.value.size===0?g.value=new Set(t):g.value=new Set(Array.from(g.value).filter(e=>t.has(e))),i||_.value.size===0?_.value=new Set(n):_.value=new Set(Array.from(_.value).filter(e=>n.has(e)))}function wt(e){return{id:typeof e.id==`number`?e.id:void 0,message:String(e.message??``),timestamp:String(e.timestamp??new Date().toISOString()),level:String(e.level??`INFO`),logger:e.logger?String(e.logger):void 0,exception:e.exception?String(e.exception):void 0,module:e.module?String(e.module):void 0,pathname:e.pathname?String(e.pathname):void 0,line:typeof e.line==`number`?e.line:void 0,thread:e.thread?String(e.thread):void 0,process:e.process?String(e.process):void 0}}function K(e,t={}){let n=e.map(wt),r=W(),i=0;if(t.replace)h.value=n.sort((e,t)=>(e.id??0)-(t.id??0)).slice(-m);else{let e=new Set(h.value.map(e=>e.id).filter(e=>typeof e==`number`)),t=n.filter(t=>typeof t.id==`number`?!e.has(t.id):!0);if(i=t.length,!t.length)return;h.value=[...h.value,...t].sort((e,t)=>(e.id??0)-(t.id??0)).slice(-m)}Ct(h.value),k.value!==null&&!h.value.some(e=>e.id===k.value)&&(k.value=null),t.fromStream&&i>0?T.value&&r?G():E.value+=i:T.value&&G()}async function q(e=`refresh`){e===`initial`?b.value=!0:x.value=!0;try{K((await ae.getLogs()).logs,{replace:!0}),S.value=null}catch(e){console.error(`Error loading logs:`,e),S.value=e instanceof Error?e.message:`Failed to load logs`,h.value.length||(C.value=`offline`)}finally{b.value=!1,x.value=!1}}function J(){P&&=(clearTimeout(P),null)}function Y(e=`paused`){J(),N.value&&=(N.value.close(),null),C.value=e}function Tt(){w.value&&(J(),C.value=`reconnecting`,P=setTimeout(()=>{P=null,X()},mt))}function X(){if(!w.value){C.value=`paused`;return}Y(`connecting`);let e=ie(),t=new URLSearchParams;e&&t.set(`token`,e),U.value>0&&t.set(`since_id`,String(U.value));let n=t.toString(),r=`/api/logs_stream${n?`?${n}`:``}`,i=new EventSource(r);N.value=i,i.onopen=()=>{(C.value===`connecting`||C.value===`reconnecting`)&&(C.value=`live`),j.value=new Date().toISOString(),S.value=null},i.addEventListener(`connected`,e=>{if(C.value=`live`,j.value=new Date().toISOString(),e instanceof MessageEvent&&e.data)try{(JSON.parse(e.data).latest_id??0)>U.value&&q(`refresh`)}catch{}}),i.addEventListener(`log`,e=>{if(e instanceof MessageEvent)try{let t=JSON.parse(e.data);t.entry&&K([t.entry],{fromStream:!0}),C.value=`live`,j.value=new Date().toISOString(),S.value=null}catch(e){console.error(`Failed to parse log stream payload:`,e)}}),i.addEventListener(`keepalive`,()=>{j.value=new Date().toISOString(),C.value!==`paused`&&(C.value=`live`)}),i.onerror=()=>{if(!w.value){Y(`paused`);return}N.value&&=(N.value.close(),null),Tt()}}function Et(){w.value=!w.value,w.value?X():Y(`paused`)}function Dt(){let e=W();T.value=e,e&&(E.value=0)}function Z(){G(!0)}function Ot(e){k.value=k.value===e.id?null:e.id??null}function kt(e){_.value.has(e)?_.value.delete(e):_.value.add(e),_.value=new Set(_.value)}function At(e){g.value.has(e)?g.value.delete(e):g.value.add(e),g.value=new Set(g.value)}function Q(){g.value=new Set(v.value)}function jt(){g.value=new Set}function $(){_.value=new Set(y.value)}function Mt(){_.value=new Set}function Nt(){D.value=``,O.value=``,Q(),$()}return e(async()=>{await q(`initial`),X()}),ne(()=>{Y(`offline`)}),(e,i)=>(r(),f(`div`,se,[d(`div`,ce,[d(`div`,le,[i[8]||=d(`div`,null,[d(`h1`,{class:`text-content-primary text-2xl font-semibold mb-2`},` System Logs `),d(`p`,{class:`text-content-secondary dark:text-content-muted max-w-2xl`},` Live tail for repeater logs with pause, follow, search, and logger-level filtering. `)],-1),d(`div`,ue,[d(`span`,{class:o([`inline-flex items-center gap-2 rounded-full border px-3 py-1.5 text-xs font-semibold`,vt.value])},[i[6]||=d(`span`,{class:`h-2 w-2 rounded-full bg-current`},null,-1),l(` `+a(yt.value),1)],2),d(`button`,{onClick:Et,class:`btn-secondary`},a(w.value?`Pause Live`:`Resume Live`),1),d(`button`,{onClick:i[0]||=e=>q(`refresh`),disabled:x.value,class:`btn-primary flex items-center gap-2`},[(r(),f(`svg`,{class:o([`w-4 h-4`,{"animate-spin":x.value}]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...i[7]||=[d(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15`},null,-1)]],2)),l(` `+a(x.value?`Refreshing…`:`Refresh Snapshot`),1)],8,de)])]),d(`div`,fe,[d(`div`,pe,[i[9]||=d(`div`,{class:`text-xs uppercase tracking-wide text-content-muted`},`Visible`,-1),d(`div`,me,a(St.value),1),d(`div`,he,`of `+a(xt.value)+` retained lines`,1)]),d(`div`,ge,[i[10]||=d(`div`,{class:`text-xs uppercase tracking-wide text-content-muted`},`Logger Filters`,-1),d(`div`,_e,a(V.value),1),d(`div`,ve,`of `+a(v.value.size)+` selected`,1)]),d(`div`,ye,[i[11]||=d(`div`,{class:`text-xs uppercase tracking-wide text-content-muted`},`Level Filters`,-1),d(`div`,be,a(H.value),1),d(`div`,xe,`of `+a(y.value.size)+` selected`,1)]),d(`div`,Se,[i[12]||=d(`div`,{class:`text-xs uppercase tracking-wide text-content-muted`},`Last Activity`,-1),d(`div`,Ce,a(j.value?R(j.value):`Waiting for stream`),1),d(`div`,we,a(E.value?`${E.value} new line${E.value===1?``:`s`} waiting`:`Up to date`),1)])]),d(`div`,Te,[d(`div`,Ee,[d(`div`,De,[i[13]||=d(`label`,{class:`block text-xs font-semibold uppercase tracking-wide text-content-muted mb-2`},` Search Logs `,-1),n(d(`input`,{"onUpdate:modelValue":i[1]||=e=>D.value=e,type:`text`,class:`cfg-input`,placeholder:`Search logger, message, exception, module...`},null,512),[[p,D.value]])]),d(`div`,Oe,[i[14]||=d(`label`,{class:`block text-xs font-semibold uppercase tracking-wide text-content-muted mb-2`},` Actions `,-1),d(`div`,ke,[d(`button`,{onClick:i[2]||=e=>T.value=!T.value,class:`btn-secondary`},a(T.value?`Following Tail`:`Follow Off`),1),E.value?(r(),f(`button`,{key:0,onClick:Z,class:`btn-primary`},` Jump to Latest (`+a(E.value)+`) `,1)):s(``,!0),d(`button`,{onClick:Nt,class:`btn-secondary`},`Reset Filters`)])])]),d(`div`,Ae,[d(`div`,je,[d(`div`,Me,[d(`div`,null,[i[15]||=d(`div`,{class:`text-sm font-semibold text-content-primary`},`Level Filters`,-1),d(`div`,Ne,a(H.value)+` of `+a(y.value.size)+` selected`,1)]),d(`div`,{class:`flex items-center gap-2`},[d(`button`,{onClick:$,class:`btn-success-xs`},`All`),d(`button`,{onClick:Mt,class:`btn-danger-xs`},`None`)])]),d(`div`,Pe,[(r(!0),f(u,null,t(bt.value,e=>(r(),f(`button`,{key:e,onClick:t=>kt(e),class:o([`px-3 py-1.5 text-xs border rounded-full transition-colors font-semibold`,_t(e,_.value.has(e))])},a(e),11,Fe))),128))])]),d(`div`,Ie,[d(`button`,{onClick:i[3]||=e=>A.value=!A.value,class:`w-full flex items-center justify-between px-4 py-3 text-left`},[d(`div`,null,[i[16]||=d(`div`,{class:`text-sm font-semibold text-content-primary`},`Logger Filters`,-1),d(`div`,Le,a(V.value)+` of `+a(v.value.size)+` selected`,1)]),(r(),f(`svg`,{class:o([`w-4 h-4 text-content-muted transition-transform`,{"rotate-180":A.value}]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...i[17]||=[d(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 9l-7 7-7-7`},null,-1)]],2))]),A.value?(r(),f(`div`,Re,[d(`div`,ze,[n(d(`input`,{"onUpdate:modelValue":i[4]||=e=>O.value=e,type:`text`,class:`cfg-input lg:max-w-sm`,placeholder:`Find a logger...`},null,512),[[p,O.value]]),d(`div`,{class:`flex flex-wrap items-center gap-2`},[d(`button`,{onClick:Q,class:`btn-success-xs`},`All Loggers`),d(`button`,{onClick:jt,class:`btn-danger-xs`},`Clear Loggers`)])]),d(`div`,Be,[z.value.length?(r(),f(`div`,Ve,[(r(!0),f(u,null,t(z.value,e=>(r(),f(`button`,{key:e,onClick:t=>At(e),class:o([`px-3 py-1.5 text-xs border rounded-full transition-colors`,g.value.has(e)?`bg-primary/opacity-light border-primary/opacity-heavy text-primary`:`bg-background-main dark:bg-white/opacity-subtle border-stroke-subtle dark:border-stroke/opacity-medium text-content-secondary dark:text-content-muted hover:bg-background-mute dark:hover:bg-white/opacity-light`])},a(e),11,He))),128))])):(r(),f(`div`,Ue,` No loggers match this filter. `))])])):s(``,!0)])])])]),d(`div`,We,[b.value&&h.value.length===0?(r(),f(`div`,Ge,[te(oe,{class:`mx-auto mb-4`}),i[18]||=d(`p`,{class:`text-content-secondary dark:text-content-muted`},`Loading log history...`,-1)])):S.value&&h.value.length===0?(r(),f(`div`,Ke,[i[19]||=d(`div`,{class:`text-accent-red mb-4`},[d(`svg`,{class:`w-12 h-12 mx-auto mb-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[d(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`})])],-1),i[20]||=d(`h3`,{class:`text-content-primary text-lg font-medium mb-2`},`Error Loading Logs`,-1),d(`p`,qe,a(S.value),1),d(`button`,{onClick:i[5]||=e=>q(`refresh`),class:`btn-primary`},`Try Again`)])):(r(),f(`div`,Je,[d(`div`,{ref_key:`logContainer`,ref:M,class:`max-h-[70vh] overflow-y-auto bg-background-mute dark:bg-background-mute/opacity-heavy text-content-primary`,onScroll:Dt},[B.value.length===0?(r(),f(`div`,Ye,[...i[21]||=[d(`h3`,{class:`text-lg font-medium text-content-primary mb-2`},`No Logs to Display`,-1),d(`p`,{class:`text-sm text-content-muted`},`The current search and filter settings removed every retained line.`,-1)]])):(r(),f(`div`,Xe,[(r(!0),f(u,null,t(B.value,(e,t)=>(r(),f(`div`,{key:e.id??`${e.timestamp}-${t}`,class:o([`px-3 py-1 transition-colors cursor-pointer`,k.value===e.id?`bg-stroke-subtle dark:bg-white/opacity-subtle`:`hover:bg-stroke-subtle/50 dark:hover:bg-white/opacity-light`]),onClick:t=>Ot(e)},[d(`div`,Qe,[d(`div`,$e,[d(`span`,et,a(ht(e.timestamp)),1),d(`span`,tt,a(I(e)),1),d(`span`,{class:o([`px-1.5 py-0.5 text-[10px] font-semibold rounded-full border`,gt(e.level)])},a(e.level),3)]),d(`div`,nt,[d(`div`,rt,a(L(e)),1),k.value===e.id?(r(),f(`div`,it,[d(`div`,at,[d(`div`,null,[i[22]||=d(`div`,{class:`uppercase tracking-wide text-content-muted`},`Timestamp`,-1),d(`div`,ot,a(R(e.timestamp)),1)]),d(`div`,null,[i[23]||=d(`div`,{class:`uppercase tracking-wide text-content-muted`},`Logger`,-1),d(`div`,st,a(I(e)),1)]),d(`div`,null,[i[24]||=d(`div`,{class:`uppercase tracking-wide text-content-muted`},`Module`,-1),d(`div`,ct,a(e.module||`—`),1)]),d(`div`,null,[i[25]||=d(`div`,{class:`uppercase tracking-wide text-content-muted`},`Line`,-1),d(`div`,lt,a(e.line??`—`),1)])]),d(`div`,null,[i[26]||=d(`div`,{class:`uppercase tracking-wide text-content-muted mb-1`},`Full Message`,-1),d(`pre`,ut,a(e.message),1)]),e.exception?(r(),f(`div`,dt,[i[27]||=d(`div`,{class:`uppercase tracking-wide text-content-muted mb-1`},`Exception`,-1),d(`pre`,ft,a(e.exception),1)])):s(``,!0)])):s(``,!0)])])],10,Ze))),128))]))],544),!T.value&&E.value?(r(),f(`div`,pt,[d(`button`,{onClick:Z,class:`rounded-full border border-primary/opacity-heavy bg-primary/opacity-medium hover:bg-primary/opacity-medium text-primary px-4 py-2 shadow-lg`},a(E.value)+` new line`+a(E.value===1?``:`s`),1)])):s(``,!0)]))])]))}});export{h as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/Neighbors-DjY7zrgE.js b/repeater/web/html/assets/Neighbors-s6MU6vjM.js similarity index 99% rename from repeater/web/html/assets/Neighbors-DjY7zrgE.js rename to repeater/web/html/assets/Neighbors-s6MU6vjM.js index 06fc6c5..ed924bd 100644 --- a/repeater/web/html/assets/Neighbors-DjY7zrgE.js +++ b/repeater/web/html/assets/Neighbors-s6MU6vjM.js @@ -1,4 +1,4 @@ -import{r as e}from"./chunk-DECur_0Z.js";import{C as t,D as n,N as r,P as i,T as a,U as o,X as s,_t as c,c as l,f as u,gt as d,h as f,ht as p,i as m,j as h,l as g,m as _,o as v,p as y,r as b,s as x,u as S,w as C,y as w}from"./runtime-core.esm-bundler-CINEgm0a.js";import{a as T,l as E,o as D,s as O,t as k}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as A}from"./api-CP9MgmUS.js";import{t as j}from"./system-CGj1WgG8.js";import{n as M,r as N,t as ee}from"./dataService-CodM3OZh.js";import{t as P}from"./Spinner-CMJUE3iy.js";import{c as F,d as I,s as L}from"./index-Cl4Dij8v.js";import{t as R}from"./leaflet-src-rW8DhqPH.js";/* empty css */import{n as z,t as B}from"./CopyLabel-7zw0wWsl.js";import{a as V,i as H,l as U,o as W,r as te,s as G,u as K}from"./formatters-DVmMQB0F.js";import{n as q,t as J}from"./SignalBars-Ca14Gu_3.js";var ne={class:`modal-card max-w-md`},re={class:`bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light rounded-lg p-4 mb-6`},ie={class:`flex items-center gap-3`},ae={class:`flex-1 min-w-0`},oe={class:`text-content-primary font-medium truncate`},se={class:`text-content-secondary dark:text-content-muted text-sm font-mono`},ce={key:0,class:`text-white/50 text-xs`},le={key:1,class:`text-white/50 text-xs`},ue=f({__name:`DeleteNeighborModal`,props:{show:{type:Boolean},neighbor:{}},emits:[`close`,`delete`],setup(e,{emit:t}){let n=e,r=t,i=()=>{n.neighbor&&(r(`delete`,n.neighbor.id),o())},o=()=>{r(`close`)};return(t,n)=>(a(),l(m,{to:`body`},[e.show&&e.neighbor?(a(),S(`div`,{key:0,onClick:n[0]||=E(e=>o(),[`self`]),class:`modal-backdrop-heavy`},[x(`div`,ne,[x(`div`,{class:`flex items-center gap-3 mb-6`},[n[2]||=x(`svg`,{class:`w-6 h-6 text-accent-red`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z`})],-1),n[3]||=x(`div`,null,[x(`h3`,{class:`text-xl font-semibold text-content-primary`},` Delete Neighbor `),x(`p`,{class:`text-content-secondary dark:text-content-muted text-sm mt-1`},` Are you sure you want to delete this neighbor? `)],-1),x(`button`,{onClick:o,class:`ml-auto text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary transition-colors`},[...n[1]||=[x(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),x(`div`,re,[x(`div`,ie,[x(`div`,ae,[x(`div`,oe,c(e.neighbor?.node_name||e.neighbor?.long_name||e.neighbor?.short_name||`Unknown`),1),x(`div`,se,` ID: `+c(e.neighbor?.node_num_hex||e.neighbor?.node_num||e.neighbor?.id||`N/A`),1),e.neighbor?.contact_type?(a(),S(`div`,ce,c(e.neighbor.contact_type),1)):g(``,!0),e.neighbor?.hw_model?(a(),S(`div`,le,c(e.neighbor.hw_model),1)):g(``,!0)])])]),n[4]||=x(`div`,{class:`bg-accent-red/opacity-light border border-accent-red/opacity-medium rounded-lg p-4 mb-6`},[x(`div`,{class:`flex items-center gap-2 text-accent-red text-sm`},[x(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`})]),x(`span`,null,`This action cannot be undone`)])],-1),x(`div`,{class:`flex gap-3`},[x(`button`,{onClick:o,class:`flex-1 px-4 py-3 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light border border-stroke-subtle dark:border-stroke/opacity-medium text-content-primary rounded-lg transition-colors`},` Cancel `),x(`button`,{onClick:i,class:`modal-btn-danger`},` Delete `)])])])):g(``,!0)]))}}),Y={class:`bg-gradient-to-r from-primary/20 to-accent-cyan/20 border-b border-stroke-subtle dark:border-stroke/opacity-light px-6 py-4`},de={class:`flex items-center justify-between`},fe={class:`flex items-center gap-3`},pe={key:0,class:`text-sm text-content-secondary dark:text-content-muted`},me={class:`p-6`},he={key:0,class:`text-center py-8`},ge={key:1,class:`text-center py-8`},_e={class:`text-content-secondary dark:text-content-muted text-sm`},ve={key:2,class:`space-y-4`},ye={class:`p-4`},be={class:`flex items-center gap-2 mb-2`},xe={class:`flex items-baseline gap-2`},Se={class:`text-3xl font-bold text-content-primary`},Ce={class:`grid grid-cols-3 gap-3`},we={class:`p-4`},Te={class:`flex items-baseline gap-1`},Ee={class:`text-xl font-bold text-content-primary`},De={class:`p-4`},Oe={class:`flex items-baseline gap-1`},ke={class:`text-xl font-bold text-content-primary`},Ae={class:`p-4`},je={class:`flex items-center gap-2`},Me={key:0,class:`flex items-start gap-3 bg-accent-amber/opacity-light border border-accent-amber/opacity-medium rounded-[12px] p-3`},Ne={class:`text-xs leading-relaxed`},Pe={class:`font-semibold text-accent-amber mb-0.5`},Fe={class:`p-4`},Ie={class:`relative`},Le={class:`flex items-center gap-2 overflow-x-auto pb-2`},Re={key:0,class:`relative flex items-center`},ze={key:0,class:`absolute left-1/2 -translate-x-1/2 animate-pulse`},Be={class:`text-content-muted text-xs mt-2 flex items-center justify-between`},Ve={key:0,class:`text-accent-cyan dark:text-primary animate-pulse`},He={class:`flex items-center justify-between text-xs text-content-muted pt-2`},Ue=I(f({__name:`PingResultModal`,props:{show:{type:Boolean},nodeName:{default:null},result:{default:null},error:{default:null},loading:{type:Boolean,default:!1}},emits:[`close`],setup(e,{emit:t}){let i=e,s=t,u=j(),{getSignalQuality:d}=q(),f=o(0),y=o(!1),C=v(()=>{let e=u.stats?.config?.radio?.spreading_factor??7,t=u.stats?.config?.radio?.bandwidth??125,n=u.stats?.config?.radio?.coding_rate??5;return 2**e/t*(8+4.25*(n-4)+20)}),w=v(()=>{if(!i.result)return{color:`text-content-muted`,label:`Unknown`};let e=i.result.rtt_ms,t=C.value,n=i.result.path.length,r=2*t*n+500*n;return e{if(!i.result)return{bars:0,color:`text-content-muted`,quality:`None`};let e=d(i.result.rssi);return{bars:e.bars,color:e.color,quality:e.quality}}),D=v(()=>{if(!i.result)return 0;if(i.result.path_hash_mode!==void 0)return i.result.path_hash_mode;let e=i.result.path.reduce((e,t)=>{let n=t.replace(/^0x/i,``);return Math.max(e,n.length)},0);return e>4?2:e>2?1:0}),O=v(()=>D.value>0),A=v(()=>({0:`1-byte`,1:`2-byte`,2:`3-byte`})[D.value]??`1-byte`);h(()=>i.result,e=>{if(e&&!y.value){y.value=!0,f.value=0;let t=e.path.length,n=1500/(t*2),r=0,i=t*2-2,a=()=>{r<=i?(f.value=r/i,r++,setTimeout(a,n)):(y.value=!1,f.value=1)};setTimeout(a,100)}},{immediate:!0});let M=v(()=>{if(!i.result||!y.value)return-1;let e=i.result.path.length;if(e<=1)return-1;let t=f.value,n=.5;if(t<=n)return t/n*(e-1);{let r=(t-n)/n;return(e-1)*(1-r)}}),N=()=>{s(`close`)};return(t,i)=>(a(),l(m,{to:`body`},[_(k,{name:`modal`},{default:r(()=>[e.show?(a(),S(`div`,{key:0,class:`modal-backdrop`,onClick:E(N,[`self`])},[x(`div`,{class:`modal-card-glass max-w-md overflow-hidden`,onClick:i[0]||=E(()=>{},[`stop`])},[x(`div`,Y,[x(`div`,de,[x(`div`,fe,[i[2]||=x(`div`,{class:`p-2 bg-accent-cyan/opacity-medium dark:bg-primary/opacity-medium rounded-lg`},[x(`svg`,{class:`w-5 h-5 text-accent-cyan dark:text-primary`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8.111 16.404a5.5 5.5 0 017.778 0M12 20h.01m-7.08-7.071c3.904-3.905 10.236-3.905 14.141 0M1.394 9.393c5.857-5.857 15.355-5.857 21.213 0`})])],-1),x(`div`,null,[i[1]||=x(`h2`,{class:`text-xl font-bold text-content-primary`},` Ping Result `,-1),e.nodeName?(a(),S(`p`,pe,c(e.nodeName),1)):g(``,!0)])]),x(`button`,{onClick:N,class:`p-2 hover:bg-stroke-subtle dark:hover:bg-white/opacity-light rounded-lg transition-colors text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary`},[...i[3]||=[x(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])])]),x(`div`,me,[e.loading?(a(),S(`div`,he,[_(P,{size:`lg`,class:`mx-auto mb-4`}),i[4]||=x(`p`,{class:`text-content-secondary dark:text-content-muted`},`Sending ping...`,-1),i[5]||=x(`p`,{class:`text-content-muted text-sm mt-1`},` Waiting for response... `,-1)])):e.error?(a(),S(`div`,ge,[i[6]||=x(`div`,{class:`p-3 bg-accent-red/opacity-light rounded-full w-16 h-16 mx-auto mb-4 flex items-center justify-center`},[x(`svg`,{class:`w-8 h-8 text-accent-red`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-1.964-1.333-2.732 0L3.268 16c-.77 1.333.192 3 1.732 3z`})])],-1),i[7]||=x(`h3`,{class:`text-accent-red font-semibold mb-2`},`Ping Failed`,-1),x(`p`,_e,c(e.error),1)])):e.result?(a(),S(`div`,ve,[x(`div`,ye,[x(`div`,be,[i[8]||=x(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Round-Trip Time`,-1),x(`span`,{class:p([`text-xs font-medium px-2 py-1 rounded-full`,w.value.color,`bg-current/10`])},c(w.value.label),3)]),x(`div`,xe,[x(`span`,Se,c(e.result.rtt_ms.toFixed(2)),1),i[9]||=x(`span`,{class:`text-content-secondary dark:text-content-muted`},`ms`,-1)])]),x(`div`,Ce,[x(`div`,we,[i[11]||=x(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-2`},`RSSI`,-1),x(`div`,Te,[x(`span`,Ee,c(e.result.rssi),1),i[10]||=x(`span`,{class:`text-content-secondary dark:text-content-muted text-xs`},`dBm`,-1)])]),x(`div`,De,[i[13]||=x(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-2`},`SNR`,-1),x(`div`,Oe,[x(`span`,ke,c(e.result.snr_db),1),i[12]||=x(`span`,{class:`text-content-secondary dark:text-content-muted text-xs`},`dB`,-1)])]),x(`div`,Ae,[i[14]||=x(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-2`},`Signal`,-1),x(`div`,je,[_(J,{bars:T.value.bars,color:T.value.color},null,8,[`bars`,`color`]),x(`span`,{class:p([`text-sm font-medium`,T.value.color])},c(T.value.quality),3)])])]),O.value?(a(),S(`div`,Me,[i[16]||=x(`svg`,{class:`w-5 h-5 text-accent-amber flex-shrink-0 mt-0.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-1.964-1.333-2.732 0L3.268 16c-.77 1.333.192 3 1.732 3z`})],-1),x(`div`,Ne,[x(`p`,Pe,c(A.value)+` path hashes active `,1),i[15]||=x(`p`,{class:`text-content-secondary dark:text-content-muted`},` This result uses multi-byte path hashes. The repeater being traced must be running firmware that supports multi-byte path hashes. Repeaters on older firmware will not respond to or correctly route these trace packets. `,-1)])])):g(``,!0),x(`div`,Fe,[i[19]||=x(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-3`},` Network Path `,-1),x(`div`,Ie,[x(`div`,Le,[(a(!0),S(b,null,n(e.result.path,(t,n)=>(a(),S(`div`,{key:n,class:`flex items-center gap-2 flex-shrink-0 relative`},[x(`div`,{class:p([`bg-accent-cyan/opacity-medium dark:bg-primary/opacity-medium text-accent-cyan dark:text-primary border border-accent-cyan/opacity-heavy dark:border-primary/opacity-medium px-3 py-1.5 rounded-lg text-sm font-mono transition-all duration-300`,y.value&&Math.floor(M.value)===n?`ring-2 ring-cyan-400/50 dark:ring-primary/opacity-heavy scale-105`:``])},c(t),3),n[y.value&&M.value>=n&&M.value({Unknown:`Unknown`,"Chat Node":`Chat Node`,Repeater:`Repeater`,"Room Server":`Room Server`,"Hybrid Node":`Hybrid Node`})[e]||e,w=e=>({Unknown:`text-content-muted`,"Chat Node":`text-primary`,Repeater:`text-accent-green`,"Room Server":`text-secondary`,"Hybrid Node":`text-accent-amber`})[e]||`text-content-muted`,T=()=>{!d.neighbor?.latitude||!d.neighbor?.longitude||i(`${d.neighbor.latitude.toFixed(6)}, ${d.neighbor.longitude.toFixed(6)}`)},D=v(()=>{if(!d.neighbor?.latitude||!d.neighbor?.longitude||!d.baseLatitude||!d.baseLongitude)return null;let e=(d.neighbor.latitude-d.baseLatitude)*Math.PI/180,t=(d.neighbor.longitude-d.baseLongitude)*Math.PI/180,n=Math.sin(e/2)*Math.sin(e/2)+Math.cos(d.baseLatitude*Math.PI/180)*Math.cos(d.neighbor.latitude*Math.PI/180)*Math.sin(t/2)*Math.sin(t/2);return 6371*(2*Math.atan2(Math.sqrt(n),Math.sqrt(1-n)))}),O=v(()=>d.neighbor?.latitude!==null&&d.neighbor?.longitude!==null&&d.neighbor?.latitude!==0&&d.neighbor?.longitude!==0&&Math.abs(d.neighbor?.latitude??0)<=90&&Math.abs(d.neighbor?.longitude??0)<=180),A=()=>{if(!y.value||!d.neighbor||!O.value)return;b&&=(b.remove(),null);let e=document.documentElement.classList.contains(`dark`);b=X.default.map(y.value,{center:[d.neighbor.latitude,d.neighbor.longitude],zoom:13,zoomControl:!0,attributionControl:!1});let t=e?`https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png`:`https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png`;X.default.tileLayer(t,{maxZoom:19,attribution:`© OpenStreetMap © CARTO`}).addTo(b);let n=X.default.divIcon({className:`custom-marker`,html:`
${d.neighbor.node_name?.charAt(0)||`?`}
`,iconSize:[32,32],iconAnchor:[16,16]});if(X.default.marker([d.neighbor.latitude,d.neighbor.longitude],{icon:n}).addTo(b).bindPopup(`${d.neighbor.node_name||`Unknown`}
${d.neighbor.pubkey.slice(0,8)}...`),d.baseLatitude!==null&&d.baseLongitude!==null&&d.baseLatitude!==0&&d.baseLongitude!==0&&Math.abs(d.baseLatitude)<=90&&Math.abs(d.baseLongitude)<=180){let e=window.getComputedStyle(document.documentElement).getPropertyValue(`--color-primary`).trim()||`deepskyblue`,t=X.default.divIcon({className:`custom-marker`,html:`
B
`,iconSize:[32,32],iconAnchor:[16,16]});X.default.marker([d.baseLatitude,d.baseLongitude],{icon:t}).addTo(b).bindPopup(`Base Station`),X.default.polyline([[d.baseLatitude,d.baseLongitude],[d.neighbor.latitude,d.neighbor.longitude]],{color:e,weight:2,opacity:.6,dashArray:`5, 10`}).addTo(b);let n=X.default.latLngBounds([d.baseLatitude,d.baseLongitude],[d.neighbor.latitude,d.neighbor.longitude]);b.fitBounds(n,{padding:[50,50]})}},j=e=>{e.key===`Escape`&&f(`close`)},M=e=>{e.target===e.currentTarget&&f(`close`)};h(()=>d.isOpen,e=>{e?(document.body.style.overflow=`hidden`,setTimeout(()=>{O.value&&A()},100)):(document.body.style.overflow=``,b&&=(b.remove(),null))},{immediate:!0});let N=v(()=>d.neighbor?n(d.neighbor.rssi):null);return(t,n)=>(a(),l(m,{to:`body`},[_(k,{name:`modal`,appear:``},{default:r(()=>[e.isOpen&&e.neighbor?(a(),S(`div`,{key:0,class:`modal-backdrop overflow-hidden`,onClick:M,onKeydown:j,tabindex:`0`},[x(`div`,{class:`relative w-full max-w-4xl max-h-[90vh] flex flex-col`,onClick:n[2]||=E(()=>{},[`stop`])},[x(`div`,We,[x(`div`,Ge,[x(`div`,Ke,[x(`h2`,qe,c(e.neighbor.node_name||`Unknown Node`),1),x(`p`,Je,c(e.neighbor.pubkey),1)]),x(`div`,Ye,[x(`button`,{onClick:n[0]||=e=>f(`close`),class:`w-8 h-8 flex items-center justify-center rounded-full bg-background-mute dark:bg-white/opacity-light hover:bg-stroke-subtle dark:hover:bg-white/opacity-medium transition-colors duration-200 text-content-secondary dark:text-content-primary`},[...n[3]||=[x(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])])]),x(`div`,Xe,[x(`div`,Ze,[n[8]||=x(`h3`,{class:`text-lg font-semibold text-content-primary mb-4`},` Basic Information `,-1),x(`div`,Qe,[x(`div`,$e,[n[4]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` Contact Type `,-1),x(`div`,{class:p([`font-medium`,w(e.neighbor.contact_type)])},c(C(e.neighbor.contact_type)),3)]),x(`div`,et,[n[5]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` Route Type `,-1),x(`div`,tt,c(s(W)(e.neighbor.route_type)),1)]),x(`div`,nt,[n[6]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` Zero Hop `,-1),x(`div`,{class:p([`font-medium`,e.neighbor.zero_hop?`text-accent-green`:`text-content-muted`])},c(e.neighbor.zero_hop?`Yes`:`No`),3)]),x(`div`,rt,[n[7]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` Advert Count `,-1),x(`div`,it,c(e.neighbor.advert_count.toLocaleString()),1)])])]),x(`div`,at,[n[12]||=x(`h3`,{class:`text-lg font-semibold text-content-primary mb-4`},` Signal Quality `,-1),x(`div`,ot,[x(`div`,st,[n[9]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` RSSI `,-1),x(`div`,ct,c(s(V)(e.neighbor.rssi)),1)]),x(`div`,lt,[n[10]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` SNR `,-1),x(`div`,ut,c(s(G)(e.neighbor.snr)),1)]),N.value?(a(),S(`div`,dt,[n[11]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` Signal Strength `,-1),x(`div`,ft,[_(J,{bars:N.value.bars,color:N.value.color},null,8,[`bars`,`color`]),x(`span`,{class:p([`text-sm font-medium`,N.value.color])},c(N.value.quality),3)])])):g(``,!0)])]),x(`div`,pt,[n[15]||=x(`h3`,{class:`text-lg font-semibold text-content-primary mb-4`},` Timeline `,-1),x(`div`,mt,[x(`div`,ht,[n[13]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` First Seen `,-1),x(`div`,gt,c(s(U)(e.neighbor.first_seen)),1)]),x(`div`,_t,[n[14]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` Last Seen `,-1),x(`div`,vt,c(s(U)(e.neighbor.last_seen)),1)])])]),O.value?(a(),S(`div`,yt,[n[19]||=x(`h3`,{class:`text-lg font-semibold text-content-primary mb-4`},` Location `,-1),x(`div`,bt,[x(`div`,xt,[n[16]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` Latitude `,-1),x(`div`,St,c(e.neighbor.latitude?.toFixed(6)),1)]),x(`div`,Ct,[n[17]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` Longitude `,-1),x(`div`,wt,c(e.neighbor.longitude?.toFixed(6)),1)]),x(`div`,Tt,[x(`div`,Et,c(D.value===null?`Coordinates`:`Distance`),1),D.value===null?(a(),S(`button`,{key:1,onClick:T,class:`w-full px-3 py-1.5 rounded-lg text-sm font-medium transition-colors flex items-center justify-center gap-1.5 bg-primary/opacity-medium hover:bg-primary/opacity-medium border border-primary/opacity-heavy text-primary`},[n[18]||=x(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z`})],-1),_(B,{copied:s(u)},null,8,[`copied`])])):(a(),S(`div`,Dt,c(`${D.value.toFixed(2)} km`),1))])]),x(`div`,{ref_key:`mapContainer`,ref:y,class:`w-full h-96 rounded-[12px] overflow-hidden border border-stroke-subtle dark:border-white/opacity-light`},null,512)])):g(``,!0)]),x(`div`,Ot,[x(`button`,{onClick:n[1]||=e=>f(`close`),class:`w-full px-4 py-2.5 rounded-lg font-medium transition-colors bg-primary/opacity-medium hover:bg-primary/opacity-medium border border-primary/opacity-heavy text-primary`},` Close `)])])])],32)):g(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-9c14dc26`]]),At=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],jt=1,Mt=8,Nt=class e{static from(t){if(!(t instanceof ArrayBuffer))throw Error(`Data must be an instance of ArrayBuffer.`);let[n,r]=new Uint8Array(t,0,2);if(n!==219)throw Error(`Data does not appear to be in a KDBush format.`);let i=r>>4;if(i!==jt)throw Error(`Got v${i} data when expected v${jt}.`);let a=At[r&15];if(!a)throw Error(`Unrecognized array type.`);let[o]=new Uint16Array(t,2,1),[s]=new Uint32Array(t,4,1);return new e(s,o,a,t)}constructor(e,t=64,n=Float64Array,r){if(isNaN(e)||e<0)throw Error(`Unpexpected numItems value: ${e}.`);this.numItems=+e,this.nodeSize=Math.min(Math.max(+t,2),65535),this.ArrayType=n,this.IndexArrayType=e<65536?Uint16Array:Uint32Array;let i=At.indexOf(this.ArrayType),a=e*2*this.ArrayType.BYTES_PER_ELEMENT,o=e*this.IndexArrayType.BYTES_PER_ELEMENT,s=(8-o%8)%8;if(i<0)throw Error(`Unexpected typed array class: ${n}.`);r&&r instanceof ArrayBuffer?(this.data=r,this.ids=new this.IndexArrayType(this.data,Mt,e),this.coords=new this.ArrayType(this.data,Mt+o+s,e*2),this._pos=e*2,this._finished=!0):(this.data=new ArrayBuffer(Mt+a+o+s),this.ids=new this.IndexArrayType(this.data,Mt,e),this.coords=new this.ArrayType(this.data,Mt+o+s,e*2),this._pos=0,this._finished=!1,new Uint8Array(this.data,0,2).set([219,(jt<<4)+i]),new Uint16Array(this.data,2,1)[0]=t,new Uint32Array(this.data,4,1)[0]=e)}add(e,t){let n=this._pos>>1;return this.ids[n]=n,this.coords[this._pos++]=e,this.coords[this._pos++]=t,n}finish(){let e=this._pos>>1;if(e!==this.numItems)throw Error(`Added ${e} items when expected ${this.numItems}.`);return Pt(this.ids,this.coords,this.nodeSize,0,this.numItems-1,0),this._finished=!0,this}range(e,t,n,r){if(!this._finished)throw Error(`Data not yet indexed - call index.finish().`);let{ids:i,coords:a,nodeSize:o}=this,s=[0,i.length-1,0],c=[];for(;s.length;){let l=s.pop()||0,u=s.pop()||0,d=s.pop()||0;if(u-d<=o){for(let o=d;o<=u;o++){let s=a[2*o],l=a[2*o+1];s>=e&&s<=n&&l>=t&&l<=r&&c.push(i[o])}continue}let f=d+u>>1,p=a[2*f],m=a[2*f+1];p>=e&&p<=n&&m>=t&&m<=r&&c.push(i[f]),(l===0?e<=p:t<=m)&&(s.push(d),s.push(f-1),s.push(1-l)),(l===0?n>=p:r>=m)&&(s.push(f+1),s.push(u),s.push(1-l))}return c}within(e,t,n){if(!this._finished)throw Error(`Data not yet indexed - call index.finish().`);let{ids:r,coords:i,nodeSize:a}=this,o=[0,r.length-1,0],s=[],c=n*n;for(;o.length;){let l=o.pop()||0,u=o.pop()||0,d=o.pop()||0;if(u-d<=a){for(let n=d;n<=u;n++)Rt(i[2*n],i[2*n+1],e,t)<=c&&s.push(r[n]);continue}let f=d+u>>1,p=i[2*f],m=i[2*f+1];Rt(p,m,e,t)<=c&&s.push(r[f]),(l===0?e-n<=p:t-n<=m)&&(o.push(d),o.push(f-1),o.push(1-l)),(l===0?e+n>=p:t+n>=m)&&(o.push(f+1),o.push(u),o.push(1-l))}return s}};function Pt(e,t,n,r,i,a){if(i-r<=n)return;let o=r+i>>1;Ft(e,t,o,r,i,a),Pt(e,t,n,r,o-1,1-a),Pt(e,t,n,o+1,i,1-a)}function Ft(e,t,n,r,i,a){for(;i>r;){if(i-r>600){let o=i-r+1,s=n-r+1,c=Math.log(o),l=.5*Math.exp(2*c/3),u=.5*Math.sqrt(c*l*(o-l)/o)*(s-o/2<0?-1:1);Ft(e,t,n,Math.max(r,Math.floor(n-s*l/o+u)),Math.min(i,Math.floor(n+(o-s)*l/o+u)),a)}let o=t[2*n+a],s=r,c=i;for(It(e,t,r,n),t[2*i+a]>o&&It(e,t,r,i);so;)c--}t[2*r+a]===o?It(e,t,r,c):(c++,It(e,t,c,i)),c<=n&&(r=c+1),n<=c&&(i=c-1)}}function It(e,t,n,r){Lt(e,n,r),Lt(t,2*n,2*r),Lt(t,2*n+1,2*r+1)}function Lt(e,t,n){let r=e[t];e[t]=e[n],e[n]=r}function Rt(e,t,n,r){let i=e-n,a=t-r;return i*i+a*a}var zt={minZoom:0,maxZoom:16,minPoints:2,radius:40,extent:512,nodeSize:64,log:!1,generateId:!1,reduce:null,map:e=>e},Bt=Math.fround||(e=>(t=>(e[0]=+t,e[0])))(new Float32Array(1)),Z=2,Q=3,Vt=4,$=5,Ht=6,Ut=class{constructor(e){this.options=Object.assign(Object.create(zt),e),this.trees=Array(this.options.maxZoom+1),this.stride=this.options.reduce?7:6,this.clusterProps=[]}load(e){let{log:t,minZoom:n,maxZoom:r}=this.options;t&&console.time(`total time`);let i=`prepare ${e.length} points`;t&&console.time(i),this.points=e;let a=[];for(let t=0;t=n;e--){let n=+Date.now();o=this.trees[e]=this._createTree(this._cluster(o,e)),t&&console.log(`z%d: %d clusters in %dms`,e,o.numItems,+Date.now()-n)}return t&&console.timeEnd(`total time`),this}getClusters(e,t){let n=((e[0]+180)%360+360)%360-180,r=Math.max(-90,Math.min(90,e[1])),i=e[2]===180?180:((e[2]+180)%360+360)%360-180,a=Math.max(-90,Math.min(90,e[3]));if(e[2]-e[0]>=360)n=-180,i=180;else if(n>i){let e=this.getClusters([n,r,180,a],t),o=this.getClusters([-180,r,i,a],t);return e.concat(o)}let o=this.trees[this._limitZoom(t)],s=o.range(Kt(n),qt(a),Kt(i),qt(r)),c=o.data,l=[];for(let e of s){let t=this.stride*e;l.push(c[t+$]>1?Wt(c,t,this.clusterProps):this.points[c[t+Q]])}return l}getChildren(e){let t=this._getOriginId(e),n=this._getOriginZoom(e),r=`No cluster with the specified id.`,i=this.trees[n];if(!i)throw Error(r);let a=i.data;if(t*this.stride>=a.length)throw Error(r);let o=this.options.radius/(this.options.extent*2**(n-1)),s=a[t*this.stride],c=a[t*this.stride+1],l=i.within(s,c,o),u=[];for(let t of l){let n=t*this.stride;a[n+Vt]===e&&u.push(a[n+$]>1?Wt(a,n,this.clusterProps):this.points[a[n+Q]])}if(u.length===0)throw Error(r);return u}getLeaves(e,t,n){t||=10,n||=0;let r=[];return this._appendLeaves(r,e,t,n,0),r}getTile(e,t,n){let r=this.trees[this._limitZoom(e)],i=2**e,{extent:a,radius:o}=this.options,s=o/a,c=(n-s)/i,l=(n+1+s)/i,u={features:[]};return this._addTileFeatures(r.range((t-s)/i,c,(t+1+s)/i,l),r.data,t,n,i,u),t===0&&this._addTileFeatures(r.range(1-s/i,c,1,l),r.data,i,n,i,u),t===i-1&&this._addTileFeatures(r.range(0,c,s/i,l),r.data,-1,n,i,u),u.features.length?u:null}getClusterExpansionZoom(e){let t=this._getOriginZoom(e)-1;for(;t<=this.options.maxZoom;){let n=this.getChildren(e);if(t++,n.length!==1)break;e=n[0].properties.cluster_id}return t}_appendLeaves(e,t,n,r,i){let a=this.getChildren(t);for(let t of a){let a=t.properties;if(a&&a.cluster?i+a.point_count<=r?i+=a.point_count:i=this._appendLeaves(e,a.cluster_id,n,r,i):i1,c,l,u;if(s)c=Gt(t,e,this.clusterProps),l=t[e],u=t[e+1];else{let n=this.points[t[e+Q]];c=n.properties;let[r,i]=n.geometry.coordinates;l=Kt(r),u=qt(i)}let d={type:1,geometry:[[Math.round(this.options.extent*(l*i-n)),Math.round(this.options.extent*(u*i-r))]],tags:c},f;f=s||this.options.generateId?t[e+Q]:this.points[t[e+Q]].id,f!==void 0&&(d.id=f),a.features.push(d)}}_limitZoom(e){return Math.max(this.options.minZoom,Math.min(Math.floor(+e),this.options.maxZoom+1))}_cluster(e,t){let{radius:n,extent:r,reduce:i,minPoints:a}=this.options,o=n/(r*2**t),s=e.data,c=[],l=this.stride;for(let n=0;nt&&(p+=s[n+$])}if(p>f&&p>=a){let e=r*f,a=u*f,o,m=-1,h=((n/l|0)<<5)+(t+1)+this.points.length;for(let r of d){let c=r*l;if(s[c+Z]<=t)continue;s[c+Z]=t;let u=s[c+$];e+=s[c]*u,a+=s[c+1]*u,s[c+Vt]=h,i&&(o||(o=this._map(s,n,!0),m=this.clusterProps.length,this.clusterProps.push(o)),i(o,this._map(s,c)))}s[n+Vt]=h,c.push(e/p,a/p,1/0,h,-1,p),i&&c.push(m)}else{for(let e=0;e1)for(let e of d){let n=e*l;if(!(s[n+Z]<=t)){s[n+Z]=t;for(let e=0;e>5}_getOriginZoom(e){return(e-this.points.length)%32}_map(e,t,n){if(e[t+$]>1){let r=this.clusterProps[e[t+Ht]];return n?Object.assign({},r):r}let r=this.points[e[t+Q]].properties,i=this.options.map(r);return n&&i===r?Object.assign({},i):i}};function Wt(e,t,n){return{type:`Feature`,id:e[t+Q],properties:Gt(e,t,n),geometry:{type:`Point`,coordinates:[Jt(e[t]),Yt(e[t+1])]}}}function Gt(e,t,n){let r=e[t+$],i=r>=1e4?`${Math.round(r/1e3)}k`:r>=1e3?`${Math.round(r/100)/10}k`:r,a=e[t+Ht],o=a===-1?{}:Object.assign({},n[a]);return Object.assign(o,{cluster:!0,cluster_id:e[t+Q],point_count:r,point_count_abbreviated:i})}function Kt(e){return e/360+.5}function qt(e){let t=Math.sin(e*Math.PI/180),n=.5-.25*Math.log((1+t)/(1-t))/Math.PI;return n<0?0:n>1?1:n}function Jt(e){return(e-.5)*360}function Yt(e){let t=(180-e*360)*Math.PI/180;return 360*Math.atan(Math.exp(t))/Math.PI-90}var Xt={class:`map-container`},Zt={key:0,class:`flex items-center justify-center h-96 glass-card backdrop-blur border border-stroke-subtle rounded-xl shadow-sm dark:shadow-none`},Qt={key:0,class:`flex items-center gap-2 text-content-secondary dark:text-content-muted`},$t={key:1,class:`text-center text-content-primary`},en={class:`hidden sm:inline`},tn={key:3,class:`map-legend z-200`},nn={class:`legend-footer`},rn={key:4,class:`map-attribution z-200`},an=I(f({__name:`NetworkMap`,props:{adverts:{},baseLatitude:{default:null},baseLongitude:{default:null},statsLoading:{type:Boolean,default:!1},showLegend:{type:Boolean,default:!0}},emits:[`update:showLegend`],setup(e,{expose:n,emit:r}){typeof window<`u`&&!window.chrome&&(window.chrome={runtime:{}});let i=e,s=r,l=()=>{s(`update:showLegend`,!i.showLegend)},d=o(),f=null,p=o(new Map),m=null,y=o(new Map),b=o([]),T=o(!0),E=o(60),D=o(14),O=o(document.documentElement.classList.contains(`dark`)),k={base:`var(--color-accent-red)`,unknown:`var(--color-text-muted)`,chatNode:`var(--color-primary)`,repeater:`var(--color-secondary)`,roomServer:`var(--color-secondary)`,hybrid:`var(--color-accent-cyan)`,directLine:`var(--color-primary)`,transportDirectLine:`var(--color-secondary)`,floodLine:`var(--color-accent-cyan)`,transportFloodLine:`var(--color-accent-red)`,cluster:`var(--color-primary)`,popupText:`var(--color-text-secondary)`,popupSubtle:`var(--color-text-muted)`,popupHeading:`var(--color-text-primary)`},A=new MutationObserver(()=>{let e=document.documentElement.classList.contains(`dark`);e!==O.value&&(O.value=e,f&&ee())}),j=v(()=>i.baseLatitude!==null&&i.baseLongitude!==null&&typeof i.baseLatitude==`number`&&typeof i.baseLongitude==`number`&&i.baseLatitude!==0&&i.baseLongitude!==0&&Math.abs(i.baseLatitude)<=90&&Math.abs(i.baseLongitude)<=180),M=(e,t,n,r)=>{let i=(n-e)*Math.PI/180,a=(r-t)*Math.PI/180,o=Math.sin(i/2)*Math.sin(i/2)+Math.cos(e*Math.PI/180)*Math.cos(n*Math.PI/180)*Math.sin(a/2)*Math.sin(a/2);return 6371*(2*Math.atan2(Math.sqrt(o),Math.sqrt(1-o)))},N=()=>{f&&=(b.value.forEach(e=>{f&&e.remove()}),b.value.length=0,f.remove(),null),p.value.clear(),y.value.clear(),m=null},ee=async()=>{let e=f?.getZoom()||11,t=f?.getCenter()||(j.value?[i.baseLatitude,i.baseLongitude]:[0,0]);N(),await w(),await L(),f&&f.setView(t,e)},F=e=>{let t=new Map;return e.filter(e=>e.latitude!==null&&e.longitude!==null).map(e=>{let n=e.latitude,r=e.longitude,i=`${n.toFixed(6)}_${r.toFixed(6)}`,a=t.get(i)||0;if(t.set(i,a+1),a>0){let e=.001,t=a*60*(Math.PI/180);n+=Math.sin(t)*e*(a*.5),r+=Math.cos(t)*e*(a*.5)}return{type:`Feature`,properties:{advert:{...e,jittered_latitude:n,jittered_longitude:r}},geometry:{type:`Point`,coordinates:[r,n]}}})},I=e=>{m=new Ut({radius:E.value,maxZoom:D.value,minPoints:2}),m.load(e)},L=async()=>{if(!d.value||!j.value){console.warn(`Cannot initialize map: missing container or coordinates`);return}N(),await w();let e=i.baseLatitude,t=i.baseLongitude;f=X.default.map(d.value,{center:[e,t],zoom:11,zoomControl:!0,attributionControl:!1,preferCanvas:!1});try{let e=O.value?`https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png`:`https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png`,t=O.value?`https://{s}.basemaps.cartocdn.com/dark_only_labels/{z}/{x}/{y}{r}.png`:`https://{s}.basemaps.cartocdn.com/light_only_labels/{z}/{x}/{y}{r}.png`,n=X.default.tileLayer(e,{maxZoom:19,attribution:`© OpenStreetMap contributors © CARTO`,errorTileUrl:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==`}),r=X.default.tileLayer(t,{maxZoom:19,attribution:``,errorTileUrl:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==`});n.addTo(f),r.addTo(f)}catch(e){console.warn(`Error loading tiles:`,e)}try{let n=(e,t=!1)=>{let n=t?16:12;return X.default.divIcon({className:`custom-div-icon`,html:`
`,iconSize:[n+4,n+4],iconAnchor:[(n+4)/2,(n+4)/2]})},r=e=>{let t=e<10?30:e<100?40:50;return X.default.divIcon({className:`custom-cluster-icon`,html:` +import{r as e}from"./chunk-DECur_0Z.js";import{C as t,D as n,N as r,P as i,T as a,U as o,X as s,_t as c,c as l,f as u,gt as d,h as f,ht as p,i as m,j as h,l as g,m as _,o as v,p as y,r as b,s as x,u as S,w as C,y as w}from"./runtime-core.esm-bundler-CINEgm0a.js";import{a as T,l as E,o as D,s as O,t as k}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as A}from"./api-EpLa-SS4.js";import{t as j}from"./system-CuO1gaHr.js";import{n as M,r as N,t as ee}from"./dataService-C8lExiaM.js";import{t as P}from"./Spinner-CMJUE3iy.js";import{c as F,d as I,s as L}from"./index-DF5glAZc.js";import{t as R}from"./leaflet-src-rW8DhqPH.js";/* empty css */import{n as z,t as B}from"./CopyLabel-7zw0wWsl.js";import{a as V,i as H,l as U,o as W,r as te,s as G,u as K}from"./formatters-DVmMQB0F.js";import{n as q,t as J}from"./SignalBars-CwCyvrs-.js";var ne={class:`modal-card max-w-md`},re={class:`bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light rounded-lg p-4 mb-6`},ie={class:`flex items-center gap-3`},ae={class:`flex-1 min-w-0`},oe={class:`text-content-primary font-medium truncate`},se={class:`text-content-secondary dark:text-content-muted text-sm font-mono`},ce={key:0,class:`text-white/50 text-xs`},le={key:1,class:`text-white/50 text-xs`},ue=f({__name:`DeleteNeighborModal`,props:{show:{type:Boolean},neighbor:{}},emits:[`close`,`delete`],setup(e,{emit:t}){let n=e,r=t,i=()=>{n.neighbor&&(r(`delete`,n.neighbor.id),o())},o=()=>{r(`close`)};return(t,n)=>(a(),l(m,{to:`body`},[e.show&&e.neighbor?(a(),S(`div`,{key:0,onClick:n[0]||=E(e=>o(),[`self`]),class:`modal-backdrop-heavy`},[x(`div`,ne,[x(`div`,{class:`flex items-center gap-3 mb-6`},[n[2]||=x(`svg`,{class:`w-6 h-6 text-accent-red`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z`})],-1),n[3]||=x(`div`,null,[x(`h3`,{class:`text-xl font-semibold text-content-primary`},` Delete Neighbor `),x(`p`,{class:`text-content-secondary dark:text-content-muted text-sm mt-1`},` Are you sure you want to delete this neighbor? `)],-1),x(`button`,{onClick:o,class:`ml-auto text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary transition-colors`},[...n[1]||=[x(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),x(`div`,re,[x(`div`,ie,[x(`div`,ae,[x(`div`,oe,c(e.neighbor?.node_name||e.neighbor?.long_name||e.neighbor?.short_name||`Unknown`),1),x(`div`,se,` ID: `+c(e.neighbor?.node_num_hex||e.neighbor?.node_num||e.neighbor?.id||`N/A`),1),e.neighbor?.contact_type?(a(),S(`div`,ce,c(e.neighbor.contact_type),1)):g(``,!0),e.neighbor?.hw_model?(a(),S(`div`,le,c(e.neighbor.hw_model),1)):g(``,!0)])])]),n[4]||=x(`div`,{class:`bg-accent-red/opacity-light border border-accent-red/opacity-medium rounded-lg p-4 mb-6`},[x(`div`,{class:`flex items-center gap-2 text-accent-red text-sm`},[x(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`})]),x(`span`,null,`This action cannot be undone`)])],-1),x(`div`,{class:`flex gap-3`},[x(`button`,{onClick:o,class:`flex-1 px-4 py-3 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light border border-stroke-subtle dark:border-stroke/opacity-medium text-content-primary rounded-lg transition-colors`},` Cancel `),x(`button`,{onClick:i,class:`modal-btn-danger`},` Delete `)])])])):g(``,!0)]))}}),Y={class:`bg-gradient-to-r from-primary/20 to-accent-cyan/20 border-b border-stroke-subtle dark:border-stroke/opacity-light px-6 py-4`},de={class:`flex items-center justify-between`},fe={class:`flex items-center gap-3`},pe={key:0,class:`text-sm text-content-secondary dark:text-content-muted`},me={class:`p-6`},he={key:0,class:`text-center py-8`},ge={key:1,class:`text-center py-8`},_e={class:`text-content-secondary dark:text-content-muted text-sm`},ve={key:2,class:`space-y-4`},ye={class:`p-4`},be={class:`flex items-center gap-2 mb-2`},xe={class:`flex items-baseline gap-2`},Se={class:`text-3xl font-bold text-content-primary`},Ce={class:`grid grid-cols-3 gap-3`},we={class:`p-4`},Te={class:`flex items-baseline gap-1`},Ee={class:`text-xl font-bold text-content-primary`},De={class:`p-4`},Oe={class:`flex items-baseline gap-1`},ke={class:`text-xl font-bold text-content-primary`},Ae={class:`p-4`},je={class:`flex items-center gap-2`},Me={key:0,class:`flex items-start gap-3 bg-accent-amber/opacity-light border border-accent-amber/opacity-medium rounded-[12px] p-3`},Ne={class:`text-xs leading-relaxed`},Pe={class:`font-semibold text-accent-amber mb-0.5`},Fe={class:`p-4`},Ie={class:`relative`},Le={class:`flex items-center gap-2 overflow-x-auto pb-2`},Re={key:0,class:`relative flex items-center`},ze={key:0,class:`absolute left-1/2 -translate-x-1/2 animate-pulse`},Be={class:`text-content-muted text-xs mt-2 flex items-center justify-between`},Ve={key:0,class:`text-accent-cyan dark:text-primary animate-pulse`},He={class:`flex items-center justify-between text-xs text-content-muted pt-2`},Ue=I(f({__name:`PingResultModal`,props:{show:{type:Boolean},nodeName:{default:null},result:{default:null},error:{default:null},loading:{type:Boolean,default:!1}},emits:[`close`],setup(e,{emit:t}){let i=e,s=t,u=j(),{getSignalQuality:d}=q(),f=o(0),y=o(!1),C=v(()=>{let e=u.stats?.config?.radio?.spreading_factor??7,t=u.stats?.config?.radio?.bandwidth??125,n=u.stats?.config?.radio?.coding_rate??5;return 2**e/t*(8+4.25*(n-4)+20)}),w=v(()=>{if(!i.result)return{color:`text-content-muted`,label:`Unknown`};let e=i.result.rtt_ms,t=C.value,n=i.result.path.length,r=2*t*n+500*n;return e{if(!i.result)return{bars:0,color:`text-content-muted`,quality:`None`};let e=d(i.result.rssi);return{bars:e.bars,color:e.color,quality:e.quality}}),D=v(()=>{if(!i.result)return 0;if(i.result.path_hash_mode!==void 0)return i.result.path_hash_mode;let e=i.result.path.reduce((e,t)=>{let n=t.replace(/^0x/i,``);return Math.max(e,n.length)},0);return e>4?2:e>2?1:0}),O=v(()=>D.value>0),A=v(()=>({0:`1-byte`,1:`2-byte`,2:`3-byte`})[D.value]??`1-byte`);h(()=>i.result,e=>{if(e&&!y.value){y.value=!0,f.value=0;let t=e.path.length,n=1500/(t*2),r=0,i=t*2-2,a=()=>{r<=i?(f.value=r/i,r++,setTimeout(a,n)):(y.value=!1,f.value=1)};setTimeout(a,100)}},{immediate:!0});let M=v(()=>{if(!i.result||!y.value)return-1;let e=i.result.path.length;if(e<=1)return-1;let t=f.value,n=.5;if(t<=n)return t/n*(e-1);{let r=(t-n)/n;return(e-1)*(1-r)}}),N=()=>{s(`close`)};return(t,i)=>(a(),l(m,{to:`body`},[_(k,{name:`modal`},{default:r(()=>[e.show?(a(),S(`div`,{key:0,class:`modal-backdrop`,onClick:E(N,[`self`])},[x(`div`,{class:`modal-card-glass max-w-md overflow-hidden`,onClick:i[0]||=E(()=>{},[`stop`])},[x(`div`,Y,[x(`div`,de,[x(`div`,fe,[i[2]||=x(`div`,{class:`p-2 bg-accent-cyan/opacity-medium dark:bg-primary/opacity-medium rounded-lg`},[x(`svg`,{class:`w-5 h-5 text-accent-cyan dark:text-primary`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8.111 16.404a5.5 5.5 0 017.778 0M12 20h.01m-7.08-7.071c3.904-3.905 10.236-3.905 14.141 0M1.394 9.393c5.857-5.857 15.355-5.857 21.213 0`})])],-1),x(`div`,null,[i[1]||=x(`h2`,{class:`text-xl font-bold text-content-primary`},` Ping Result `,-1),e.nodeName?(a(),S(`p`,pe,c(e.nodeName),1)):g(``,!0)])]),x(`button`,{onClick:N,class:`p-2 hover:bg-stroke-subtle dark:hover:bg-white/opacity-light rounded-lg transition-colors text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary`},[...i[3]||=[x(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])])]),x(`div`,me,[e.loading?(a(),S(`div`,he,[_(P,{size:`lg`,class:`mx-auto mb-4`}),i[4]||=x(`p`,{class:`text-content-secondary dark:text-content-muted`},`Sending ping...`,-1),i[5]||=x(`p`,{class:`text-content-muted text-sm mt-1`},` Waiting for response... `,-1)])):e.error?(a(),S(`div`,ge,[i[6]||=x(`div`,{class:`p-3 bg-accent-red/opacity-light rounded-full w-16 h-16 mx-auto mb-4 flex items-center justify-center`},[x(`svg`,{class:`w-8 h-8 text-accent-red`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-1.964-1.333-2.732 0L3.268 16c-.77 1.333.192 3 1.732 3z`})])],-1),i[7]||=x(`h3`,{class:`text-accent-red font-semibold mb-2`},`Ping Failed`,-1),x(`p`,_e,c(e.error),1)])):e.result?(a(),S(`div`,ve,[x(`div`,ye,[x(`div`,be,[i[8]||=x(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Round-Trip Time`,-1),x(`span`,{class:p([`text-xs font-medium px-2 py-1 rounded-full`,w.value.color,`bg-current/10`])},c(w.value.label),3)]),x(`div`,xe,[x(`span`,Se,c(e.result.rtt_ms.toFixed(2)),1),i[9]||=x(`span`,{class:`text-content-secondary dark:text-content-muted`},`ms`,-1)])]),x(`div`,Ce,[x(`div`,we,[i[11]||=x(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-2`},`RSSI`,-1),x(`div`,Te,[x(`span`,Ee,c(e.result.rssi),1),i[10]||=x(`span`,{class:`text-content-secondary dark:text-content-muted text-xs`},`dBm`,-1)])]),x(`div`,De,[i[13]||=x(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-2`},`SNR`,-1),x(`div`,Oe,[x(`span`,ke,c(e.result.snr_db),1),i[12]||=x(`span`,{class:`text-content-secondary dark:text-content-muted text-xs`},`dB`,-1)])]),x(`div`,Ae,[i[14]||=x(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-2`},`Signal`,-1),x(`div`,je,[_(J,{bars:T.value.bars,color:T.value.color},null,8,[`bars`,`color`]),x(`span`,{class:p([`text-sm font-medium`,T.value.color])},c(T.value.quality),3)])])]),O.value?(a(),S(`div`,Me,[i[16]||=x(`svg`,{class:`w-5 h-5 text-accent-amber flex-shrink-0 mt-0.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-1.964-1.333-2.732 0L3.268 16c-.77 1.333.192 3 1.732 3z`})],-1),x(`div`,Ne,[x(`p`,Pe,c(A.value)+` path hashes active `,1),i[15]||=x(`p`,{class:`text-content-secondary dark:text-content-muted`},` This result uses multi-byte path hashes. The repeater being traced must be running firmware that supports multi-byte path hashes. Repeaters on older firmware will not respond to or correctly route these trace packets. `,-1)])])):g(``,!0),x(`div`,Fe,[i[19]||=x(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-3`},` Network Path `,-1),x(`div`,Ie,[x(`div`,Le,[(a(!0),S(b,null,n(e.result.path,(t,n)=>(a(),S(`div`,{key:n,class:`flex items-center gap-2 flex-shrink-0 relative`},[x(`div`,{class:p([`bg-accent-cyan/opacity-medium dark:bg-primary/opacity-medium text-accent-cyan dark:text-primary border border-accent-cyan/opacity-heavy dark:border-primary/opacity-medium px-3 py-1.5 rounded-lg text-sm font-mono transition-all duration-300`,y.value&&Math.floor(M.value)===n?`ring-2 ring-cyan-400/50 dark:ring-primary/opacity-heavy scale-105`:``])},c(t),3),n[y.value&&M.value>=n&&M.value({Unknown:`Unknown`,"Chat Node":`Chat Node`,Repeater:`Repeater`,"Room Server":`Room Server`,"Hybrid Node":`Hybrid Node`})[e]||e,w=e=>({Unknown:`text-content-muted`,"Chat Node":`text-primary`,Repeater:`text-accent-green`,"Room Server":`text-secondary`,"Hybrid Node":`text-accent-amber`})[e]||`text-content-muted`,T=()=>{!d.neighbor?.latitude||!d.neighbor?.longitude||i(`${d.neighbor.latitude.toFixed(6)}, ${d.neighbor.longitude.toFixed(6)}`)},D=v(()=>{if(!d.neighbor?.latitude||!d.neighbor?.longitude||!d.baseLatitude||!d.baseLongitude)return null;let e=(d.neighbor.latitude-d.baseLatitude)*Math.PI/180,t=(d.neighbor.longitude-d.baseLongitude)*Math.PI/180,n=Math.sin(e/2)*Math.sin(e/2)+Math.cos(d.baseLatitude*Math.PI/180)*Math.cos(d.neighbor.latitude*Math.PI/180)*Math.sin(t/2)*Math.sin(t/2);return 6371*(2*Math.atan2(Math.sqrt(n),Math.sqrt(1-n)))}),O=v(()=>d.neighbor?.latitude!==null&&d.neighbor?.longitude!==null&&d.neighbor?.latitude!==0&&d.neighbor?.longitude!==0&&Math.abs(d.neighbor?.latitude??0)<=90&&Math.abs(d.neighbor?.longitude??0)<=180),A=()=>{if(!y.value||!d.neighbor||!O.value)return;b&&=(b.remove(),null);let e=document.documentElement.classList.contains(`dark`);b=X.default.map(y.value,{center:[d.neighbor.latitude,d.neighbor.longitude],zoom:13,zoomControl:!0,attributionControl:!1});let t=e?`https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png`:`https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png`;X.default.tileLayer(t,{maxZoom:19,attribution:`© OpenStreetMap © CARTO`}).addTo(b);let n=X.default.divIcon({className:`custom-marker`,html:`
${d.neighbor.node_name?.charAt(0)||`?`}
`,iconSize:[32,32],iconAnchor:[16,16]});if(X.default.marker([d.neighbor.latitude,d.neighbor.longitude],{icon:n}).addTo(b).bindPopup(`${d.neighbor.node_name||`Unknown`}
${d.neighbor.pubkey.slice(0,8)}...`),d.baseLatitude!==null&&d.baseLongitude!==null&&d.baseLatitude!==0&&d.baseLongitude!==0&&Math.abs(d.baseLatitude)<=90&&Math.abs(d.baseLongitude)<=180){let e=window.getComputedStyle(document.documentElement).getPropertyValue(`--color-primary`).trim()||`deepskyblue`,t=X.default.divIcon({className:`custom-marker`,html:`
B
`,iconSize:[32,32],iconAnchor:[16,16]});X.default.marker([d.baseLatitude,d.baseLongitude],{icon:t}).addTo(b).bindPopup(`Base Station`),X.default.polyline([[d.baseLatitude,d.baseLongitude],[d.neighbor.latitude,d.neighbor.longitude]],{color:e,weight:2,opacity:.6,dashArray:`5, 10`}).addTo(b);let n=X.default.latLngBounds([d.baseLatitude,d.baseLongitude],[d.neighbor.latitude,d.neighbor.longitude]);b.fitBounds(n,{padding:[50,50]})}},j=e=>{e.key===`Escape`&&f(`close`)},M=e=>{e.target===e.currentTarget&&f(`close`)};h(()=>d.isOpen,e=>{e?(document.body.style.overflow=`hidden`,setTimeout(()=>{O.value&&A()},100)):(document.body.style.overflow=``,b&&=(b.remove(),null))},{immediate:!0});let N=v(()=>d.neighbor?n(d.neighbor.rssi):null);return(t,n)=>(a(),l(m,{to:`body`},[_(k,{name:`modal`,appear:``},{default:r(()=>[e.isOpen&&e.neighbor?(a(),S(`div`,{key:0,class:`modal-backdrop overflow-hidden`,onClick:M,onKeydown:j,tabindex:`0`},[x(`div`,{class:`relative w-full max-w-4xl max-h-[90vh] flex flex-col`,onClick:n[2]||=E(()=>{},[`stop`])},[x(`div`,We,[x(`div`,Ge,[x(`div`,Ke,[x(`h2`,qe,c(e.neighbor.node_name||`Unknown Node`),1),x(`p`,Je,c(e.neighbor.pubkey),1)]),x(`div`,Ye,[x(`button`,{onClick:n[0]||=e=>f(`close`),class:`w-8 h-8 flex items-center justify-center rounded-full bg-background-mute dark:bg-white/opacity-light hover:bg-stroke-subtle dark:hover:bg-white/opacity-medium transition-colors duration-200 text-content-secondary dark:text-content-primary`},[...n[3]||=[x(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])])]),x(`div`,Xe,[x(`div`,Ze,[n[8]||=x(`h3`,{class:`text-lg font-semibold text-content-primary mb-4`},` Basic Information `,-1),x(`div`,Qe,[x(`div`,$e,[n[4]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` Contact Type `,-1),x(`div`,{class:p([`font-medium`,w(e.neighbor.contact_type)])},c(C(e.neighbor.contact_type)),3)]),x(`div`,et,[n[5]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` Route Type `,-1),x(`div`,tt,c(s(W)(e.neighbor.route_type)),1)]),x(`div`,nt,[n[6]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` Zero Hop `,-1),x(`div`,{class:p([`font-medium`,e.neighbor.zero_hop?`text-accent-green`:`text-content-muted`])},c(e.neighbor.zero_hop?`Yes`:`No`),3)]),x(`div`,rt,[n[7]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` Advert Count `,-1),x(`div`,it,c(e.neighbor.advert_count.toLocaleString()),1)])])]),x(`div`,at,[n[12]||=x(`h3`,{class:`text-lg font-semibold text-content-primary mb-4`},` Signal Quality `,-1),x(`div`,ot,[x(`div`,st,[n[9]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` RSSI `,-1),x(`div`,ct,c(s(V)(e.neighbor.rssi)),1)]),x(`div`,lt,[n[10]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` SNR `,-1),x(`div`,ut,c(s(G)(e.neighbor.snr)),1)]),N.value?(a(),S(`div`,dt,[n[11]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` Signal Strength `,-1),x(`div`,ft,[_(J,{bars:N.value.bars,color:N.value.color},null,8,[`bars`,`color`]),x(`span`,{class:p([`text-sm font-medium`,N.value.color])},c(N.value.quality),3)])])):g(``,!0)])]),x(`div`,pt,[n[15]||=x(`h3`,{class:`text-lg font-semibold text-content-primary mb-4`},` Timeline `,-1),x(`div`,mt,[x(`div`,ht,[n[13]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` First Seen `,-1),x(`div`,gt,c(s(U)(e.neighbor.first_seen)),1)]),x(`div`,_t,[n[14]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` Last Seen `,-1),x(`div`,vt,c(s(U)(e.neighbor.last_seen)),1)])])]),O.value?(a(),S(`div`,yt,[n[19]||=x(`h3`,{class:`text-lg font-semibold text-content-primary mb-4`},` Location `,-1),x(`div`,bt,[x(`div`,xt,[n[16]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` Latitude `,-1),x(`div`,St,c(e.neighbor.latitude?.toFixed(6)),1)]),x(`div`,Ct,[n[17]||=x(`div`,{class:`text-content-muted text-xs uppercase tracking-wide mb-1`},` Longitude `,-1),x(`div`,wt,c(e.neighbor.longitude?.toFixed(6)),1)]),x(`div`,Tt,[x(`div`,Et,c(D.value===null?`Coordinates`:`Distance`),1),D.value===null?(a(),S(`button`,{key:1,onClick:T,class:`w-full px-3 py-1.5 rounded-lg text-sm font-medium transition-colors flex items-center justify-center gap-1.5 bg-primary/opacity-medium hover:bg-primary/opacity-medium border border-primary/opacity-heavy text-primary`},[n[18]||=x(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[x(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z`})],-1),_(B,{copied:s(u)},null,8,[`copied`])])):(a(),S(`div`,Dt,c(`${D.value.toFixed(2)} km`),1))])]),x(`div`,{ref_key:`mapContainer`,ref:y,class:`w-full h-96 rounded-[12px] overflow-hidden border border-stroke-subtle dark:border-white/opacity-light`},null,512)])):g(``,!0)]),x(`div`,Ot,[x(`button`,{onClick:n[1]||=e=>f(`close`),class:`w-full px-4 py-2.5 rounded-lg font-medium transition-colors bg-primary/opacity-medium hover:bg-primary/opacity-medium border border-primary/opacity-heavy text-primary`},` Close `)])])])],32)):g(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-9c14dc26`]]),At=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],jt=1,Mt=8,Nt=class e{static from(t){if(!(t instanceof ArrayBuffer))throw Error(`Data must be an instance of ArrayBuffer.`);let[n,r]=new Uint8Array(t,0,2);if(n!==219)throw Error(`Data does not appear to be in a KDBush format.`);let i=r>>4;if(i!==jt)throw Error(`Got v${i} data when expected v${jt}.`);let a=At[r&15];if(!a)throw Error(`Unrecognized array type.`);let[o]=new Uint16Array(t,2,1),[s]=new Uint32Array(t,4,1);return new e(s,o,a,t)}constructor(e,t=64,n=Float64Array,r){if(isNaN(e)||e<0)throw Error(`Unpexpected numItems value: ${e}.`);this.numItems=+e,this.nodeSize=Math.min(Math.max(+t,2),65535),this.ArrayType=n,this.IndexArrayType=e<65536?Uint16Array:Uint32Array;let i=At.indexOf(this.ArrayType),a=e*2*this.ArrayType.BYTES_PER_ELEMENT,o=e*this.IndexArrayType.BYTES_PER_ELEMENT,s=(8-o%8)%8;if(i<0)throw Error(`Unexpected typed array class: ${n}.`);r&&r instanceof ArrayBuffer?(this.data=r,this.ids=new this.IndexArrayType(this.data,Mt,e),this.coords=new this.ArrayType(this.data,Mt+o+s,e*2),this._pos=e*2,this._finished=!0):(this.data=new ArrayBuffer(Mt+a+o+s),this.ids=new this.IndexArrayType(this.data,Mt,e),this.coords=new this.ArrayType(this.data,Mt+o+s,e*2),this._pos=0,this._finished=!1,new Uint8Array(this.data,0,2).set([219,(jt<<4)+i]),new Uint16Array(this.data,2,1)[0]=t,new Uint32Array(this.data,4,1)[0]=e)}add(e,t){let n=this._pos>>1;return this.ids[n]=n,this.coords[this._pos++]=e,this.coords[this._pos++]=t,n}finish(){let e=this._pos>>1;if(e!==this.numItems)throw Error(`Added ${e} items when expected ${this.numItems}.`);return Pt(this.ids,this.coords,this.nodeSize,0,this.numItems-1,0),this._finished=!0,this}range(e,t,n,r){if(!this._finished)throw Error(`Data not yet indexed - call index.finish().`);let{ids:i,coords:a,nodeSize:o}=this,s=[0,i.length-1,0],c=[];for(;s.length;){let l=s.pop()||0,u=s.pop()||0,d=s.pop()||0;if(u-d<=o){for(let o=d;o<=u;o++){let s=a[2*o],l=a[2*o+1];s>=e&&s<=n&&l>=t&&l<=r&&c.push(i[o])}continue}let f=d+u>>1,p=a[2*f],m=a[2*f+1];p>=e&&p<=n&&m>=t&&m<=r&&c.push(i[f]),(l===0?e<=p:t<=m)&&(s.push(d),s.push(f-1),s.push(1-l)),(l===0?n>=p:r>=m)&&(s.push(f+1),s.push(u),s.push(1-l))}return c}within(e,t,n){if(!this._finished)throw Error(`Data not yet indexed - call index.finish().`);let{ids:r,coords:i,nodeSize:a}=this,o=[0,r.length-1,0],s=[],c=n*n;for(;o.length;){let l=o.pop()||0,u=o.pop()||0,d=o.pop()||0;if(u-d<=a){for(let n=d;n<=u;n++)Rt(i[2*n],i[2*n+1],e,t)<=c&&s.push(r[n]);continue}let f=d+u>>1,p=i[2*f],m=i[2*f+1];Rt(p,m,e,t)<=c&&s.push(r[f]),(l===0?e-n<=p:t-n<=m)&&(o.push(d),o.push(f-1),o.push(1-l)),(l===0?e+n>=p:t+n>=m)&&(o.push(f+1),o.push(u),o.push(1-l))}return s}};function Pt(e,t,n,r,i,a){if(i-r<=n)return;let o=r+i>>1;Ft(e,t,o,r,i,a),Pt(e,t,n,r,o-1,1-a),Pt(e,t,n,o+1,i,1-a)}function Ft(e,t,n,r,i,a){for(;i>r;){if(i-r>600){let o=i-r+1,s=n-r+1,c=Math.log(o),l=.5*Math.exp(2*c/3),u=.5*Math.sqrt(c*l*(o-l)/o)*(s-o/2<0?-1:1);Ft(e,t,n,Math.max(r,Math.floor(n-s*l/o+u)),Math.min(i,Math.floor(n+(o-s)*l/o+u)),a)}let o=t[2*n+a],s=r,c=i;for(It(e,t,r,n),t[2*i+a]>o&&It(e,t,r,i);so;)c--}t[2*r+a]===o?It(e,t,r,c):(c++,It(e,t,c,i)),c<=n&&(r=c+1),n<=c&&(i=c-1)}}function It(e,t,n,r){Lt(e,n,r),Lt(t,2*n,2*r),Lt(t,2*n+1,2*r+1)}function Lt(e,t,n){let r=e[t];e[t]=e[n],e[n]=r}function Rt(e,t,n,r){let i=e-n,a=t-r;return i*i+a*a}var zt={minZoom:0,maxZoom:16,minPoints:2,radius:40,extent:512,nodeSize:64,log:!1,generateId:!1,reduce:null,map:e=>e},Bt=Math.fround||(e=>(t=>(e[0]=+t,e[0])))(new Float32Array(1)),Z=2,Q=3,Vt=4,$=5,Ht=6,Ut=class{constructor(e){this.options=Object.assign(Object.create(zt),e),this.trees=Array(this.options.maxZoom+1),this.stride=this.options.reduce?7:6,this.clusterProps=[]}load(e){let{log:t,minZoom:n,maxZoom:r}=this.options;t&&console.time(`total time`);let i=`prepare ${e.length} points`;t&&console.time(i),this.points=e;let a=[];for(let t=0;t=n;e--){let n=+Date.now();o=this.trees[e]=this._createTree(this._cluster(o,e)),t&&console.log(`z%d: %d clusters in %dms`,e,o.numItems,+Date.now()-n)}return t&&console.timeEnd(`total time`),this}getClusters(e,t){let n=((e[0]+180)%360+360)%360-180,r=Math.max(-90,Math.min(90,e[1])),i=e[2]===180?180:((e[2]+180)%360+360)%360-180,a=Math.max(-90,Math.min(90,e[3]));if(e[2]-e[0]>=360)n=-180,i=180;else if(n>i){let e=this.getClusters([n,r,180,a],t),o=this.getClusters([-180,r,i,a],t);return e.concat(o)}let o=this.trees[this._limitZoom(t)],s=o.range(Kt(n),qt(a),Kt(i),qt(r)),c=o.data,l=[];for(let e of s){let t=this.stride*e;l.push(c[t+$]>1?Wt(c,t,this.clusterProps):this.points[c[t+Q]])}return l}getChildren(e){let t=this._getOriginId(e),n=this._getOriginZoom(e),r=`No cluster with the specified id.`,i=this.trees[n];if(!i)throw Error(r);let a=i.data;if(t*this.stride>=a.length)throw Error(r);let o=this.options.radius/(this.options.extent*2**(n-1)),s=a[t*this.stride],c=a[t*this.stride+1],l=i.within(s,c,o),u=[];for(let t of l){let n=t*this.stride;a[n+Vt]===e&&u.push(a[n+$]>1?Wt(a,n,this.clusterProps):this.points[a[n+Q]])}if(u.length===0)throw Error(r);return u}getLeaves(e,t,n){t||=10,n||=0;let r=[];return this._appendLeaves(r,e,t,n,0),r}getTile(e,t,n){let r=this.trees[this._limitZoom(e)],i=2**e,{extent:a,radius:o}=this.options,s=o/a,c=(n-s)/i,l=(n+1+s)/i,u={features:[]};return this._addTileFeatures(r.range((t-s)/i,c,(t+1+s)/i,l),r.data,t,n,i,u),t===0&&this._addTileFeatures(r.range(1-s/i,c,1,l),r.data,i,n,i,u),t===i-1&&this._addTileFeatures(r.range(0,c,s/i,l),r.data,-1,n,i,u),u.features.length?u:null}getClusterExpansionZoom(e){let t=this._getOriginZoom(e)-1;for(;t<=this.options.maxZoom;){let n=this.getChildren(e);if(t++,n.length!==1)break;e=n[0].properties.cluster_id}return t}_appendLeaves(e,t,n,r,i){let a=this.getChildren(t);for(let t of a){let a=t.properties;if(a&&a.cluster?i+a.point_count<=r?i+=a.point_count:i=this._appendLeaves(e,a.cluster_id,n,r,i):i1,c,l,u;if(s)c=Gt(t,e,this.clusterProps),l=t[e],u=t[e+1];else{let n=this.points[t[e+Q]];c=n.properties;let[r,i]=n.geometry.coordinates;l=Kt(r),u=qt(i)}let d={type:1,geometry:[[Math.round(this.options.extent*(l*i-n)),Math.round(this.options.extent*(u*i-r))]],tags:c},f;f=s||this.options.generateId?t[e+Q]:this.points[t[e+Q]].id,f!==void 0&&(d.id=f),a.features.push(d)}}_limitZoom(e){return Math.max(this.options.minZoom,Math.min(Math.floor(+e),this.options.maxZoom+1))}_cluster(e,t){let{radius:n,extent:r,reduce:i,minPoints:a}=this.options,o=n/(r*2**t),s=e.data,c=[],l=this.stride;for(let n=0;nt&&(p+=s[n+$])}if(p>f&&p>=a){let e=r*f,a=u*f,o,m=-1,h=((n/l|0)<<5)+(t+1)+this.points.length;for(let r of d){let c=r*l;if(s[c+Z]<=t)continue;s[c+Z]=t;let u=s[c+$];e+=s[c]*u,a+=s[c+1]*u,s[c+Vt]=h,i&&(o||(o=this._map(s,n,!0),m=this.clusterProps.length,this.clusterProps.push(o)),i(o,this._map(s,c)))}s[n+Vt]=h,c.push(e/p,a/p,1/0,h,-1,p),i&&c.push(m)}else{for(let e=0;e1)for(let e of d){let n=e*l;if(!(s[n+Z]<=t)){s[n+Z]=t;for(let e=0;e>5}_getOriginZoom(e){return(e-this.points.length)%32}_map(e,t,n){if(e[t+$]>1){let r=this.clusterProps[e[t+Ht]];return n?Object.assign({},r):r}let r=this.points[e[t+Q]].properties,i=this.options.map(r);return n&&i===r?Object.assign({},i):i}};function Wt(e,t,n){return{type:`Feature`,id:e[t+Q],properties:Gt(e,t,n),geometry:{type:`Point`,coordinates:[Jt(e[t]),Yt(e[t+1])]}}}function Gt(e,t,n){let r=e[t+$],i=r>=1e4?`${Math.round(r/1e3)}k`:r>=1e3?`${Math.round(r/100)/10}k`:r,a=e[t+Ht],o=a===-1?{}:Object.assign({},n[a]);return Object.assign(o,{cluster:!0,cluster_id:e[t+Q],point_count:r,point_count_abbreviated:i})}function Kt(e){return e/360+.5}function qt(e){let t=Math.sin(e*Math.PI/180),n=.5-.25*Math.log((1+t)/(1-t))/Math.PI;return n<0?0:n>1?1:n}function Jt(e){return(e-.5)*360}function Yt(e){let t=(180-e*360)*Math.PI/180;return 360*Math.atan(Math.exp(t))/Math.PI-90}var Xt={class:`map-container`},Zt={key:0,class:`flex items-center justify-center h-96 glass-card backdrop-blur border border-stroke-subtle rounded-xl shadow-sm dark:shadow-none`},Qt={key:0,class:`flex items-center gap-2 text-content-secondary dark:text-content-muted`},$t={key:1,class:`text-center text-content-primary`},en={class:`hidden sm:inline`},tn={key:3,class:`map-legend z-200`},nn={class:`legend-footer`},rn={key:4,class:`map-attribution z-200`},an=I(f({__name:`NetworkMap`,props:{adverts:{},baseLatitude:{default:null},baseLongitude:{default:null},statsLoading:{type:Boolean,default:!1},showLegend:{type:Boolean,default:!0}},emits:[`update:showLegend`],setup(e,{expose:n,emit:r}){typeof window<`u`&&!window.chrome&&(window.chrome={runtime:{}});let i=e,s=r,l=()=>{s(`update:showLegend`,!i.showLegend)},d=o(),f=null,p=o(new Map),m=null,y=o(new Map),b=o([]),T=o(!0),E=o(60),D=o(14),O=o(document.documentElement.classList.contains(`dark`)),k={base:`var(--color-accent-red)`,unknown:`var(--color-text-muted)`,chatNode:`var(--color-primary)`,repeater:`var(--color-secondary)`,roomServer:`var(--color-secondary)`,hybrid:`var(--color-accent-cyan)`,directLine:`var(--color-primary)`,transportDirectLine:`var(--color-secondary)`,floodLine:`var(--color-accent-cyan)`,transportFloodLine:`var(--color-accent-red)`,cluster:`var(--color-primary)`,popupText:`var(--color-text-secondary)`,popupSubtle:`var(--color-text-muted)`,popupHeading:`var(--color-text-primary)`},A=new MutationObserver(()=>{let e=document.documentElement.classList.contains(`dark`);e!==O.value&&(O.value=e,f&&ee())}),j=v(()=>i.baseLatitude!==null&&i.baseLongitude!==null&&typeof i.baseLatitude==`number`&&typeof i.baseLongitude==`number`&&i.baseLatitude!==0&&i.baseLongitude!==0&&Math.abs(i.baseLatitude)<=90&&Math.abs(i.baseLongitude)<=180),M=(e,t,n,r)=>{let i=(n-e)*Math.PI/180,a=(r-t)*Math.PI/180,o=Math.sin(i/2)*Math.sin(i/2)+Math.cos(e*Math.PI/180)*Math.cos(n*Math.PI/180)*Math.sin(a/2)*Math.sin(a/2);return 6371*(2*Math.atan2(Math.sqrt(o),Math.sqrt(1-o)))},N=()=>{f&&=(b.value.forEach(e=>{f&&e.remove()}),b.value.length=0,f.remove(),null),p.value.clear(),y.value.clear(),m=null},ee=async()=>{let e=f?.getZoom()||11,t=f?.getCenter()||(j.value?[i.baseLatitude,i.baseLongitude]:[0,0]);N(),await w(),await L(),f&&f.setView(t,e)},F=e=>{let t=new Map;return e.filter(e=>e.latitude!==null&&e.longitude!==null).map(e=>{let n=e.latitude,r=e.longitude,i=`${n.toFixed(6)}_${r.toFixed(6)}`,a=t.get(i)||0;if(t.set(i,a+1),a>0){let e=.001,t=a*60*(Math.PI/180);n+=Math.sin(t)*e*(a*.5),r+=Math.cos(t)*e*(a*.5)}return{type:`Feature`,properties:{advert:{...e,jittered_latitude:n,jittered_longitude:r}},geometry:{type:`Point`,coordinates:[r,n]}}})},I=e=>{m=new Ut({radius:E.value,maxZoom:D.value,minPoints:2}),m.load(e)},L=async()=>{if(!d.value||!j.value){console.warn(`Cannot initialize map: missing container or coordinates`);return}N(),await w();let e=i.baseLatitude,t=i.baseLongitude;f=X.default.map(d.value,{center:[e,t],zoom:11,zoomControl:!0,attributionControl:!1,preferCanvas:!1});try{let e=O.value?`https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png`:`https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png`,t=O.value?`https://{s}.basemaps.cartocdn.com/dark_only_labels/{z}/{x}/{y}{r}.png`:`https://{s}.basemaps.cartocdn.com/light_only_labels/{z}/{x}/{y}{r}.png`,n=X.default.tileLayer(e,{maxZoom:19,attribution:`© OpenStreetMap contributors © CARTO`,errorTileUrl:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==`}),r=X.default.tileLayer(t,{maxZoom:19,attribution:``,errorTileUrl:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==`});n.addTo(f),r.addTo(f)}catch(e){console.warn(`Error loading tiles:`,e)}try{let n=(e,t=!1)=>{let n=t?16:12;return X.default.divIcon({className:`custom-div-icon`,html:`
`,iconSize:[n+4,n+4],iconAnchor:[(n+4)/2,(n+4)/2]})},r=e=>{let t=e<10?30:e<100?40:50;return X.default.divIcon({className:`custom-cluster-icon`,html:`
new Date(e*1e3).toLocaleString(),wn=e=>e.transmitted?e.is_duplicate?`text-accent-amber`:e.drop_reason?`text-accent-red`:`text-accent-green`:`text-accent-red`,B=e=>e.transmitted?e.is_duplicate?`Duplicate`:e.drop_reason?`Dropped`:`Forwarded`:`Dropped`,Tn=m(()=>(I.packets?.length??0)>1),V=m(()=>!!I.canGoPrevious),H=m(()=>!!I.canGoNext),En=m(()=>{let e=I.packets?.length??0;return e===0?``:I.currentIndex==null||I.currentIndex<0?`- / ${e}`:`${I.currentIndex+1} / ${e}`}),Dn=(e,t)=>e.id!=null&&t.id!=null?e.id===t.id:e.packet_hash===t.packet_hash&&e.timestamp===t.timestamp&&e.type===t.type&&e.route===t.route&&e.src_hash===t.src_hash&&e.dst_hash===t.dst_hash&&e.length===t.length,U=(e,t=``,n=null)=>e==null?`N/A`:typeof e==`number`?Number.isFinite(e)?`${n==null?e.toString():e.toFixed(n)}${t}`:`N/A`:typeof e==`boolean`?e?`Yes`:`No`:e||`N/A`,On=e=>{let t=Y(e);return t.length===0?`None`:t.join(` → `).toUpperCase()},kn=e=>{let t=Y(e.original_path),n=Y(e.forwarded_path);return e.transmitted&&n.length>0?n:t.length>0?t:n},An=e=>On(kn(e)),jn=(e,t)=>{let n=[],r=(e,t,r)=>{t!==r&&n.push({label:e,currentValue:t,duplicateValue:r})};return r(`Type`,G(e.type),G(t.type)),r(`Route`,K(e.route),K(t.route)),r(`Status`,B(e),B(t)),r(`Length`,`${e.length}B`,`${t.length}B`),r(`RSSI`,U(e.rssi,` dBm`,0),U(t.rssi,` dBm`,0)),r(`SNR`,U(e.snr,` dB`,1),U(t.snr,` dB`,1)),r(`Score`,U(e.score,``,2),U(t.score,``,2)),r(`TX Delay`,U(e.tx_delay_ms,` ms`,1),U(t.tx_delay_ms,` ms`,1)),r(`Source`,U(e.src_hash),U(t.src_hash)),r(`Destination`,U(e.dst_hash||`Broadcast`),U(t.dst_hash||`Broadcast`)),r(`Drop Reason`,U(e.drop_reason||`None`),U(t.drop_reason||`None`)),n},W=m(()=>{let e=I.packet,t=I.linkedDuplicatePackets??[];return!e||t.length===0?[]:t.filter(t=>!Dn(t,e)).map(t=>({packet:t,effectivePath:An(t),differences:jn(e,t)})).sort((e,t)=>t.packet.timestamp-e.packet.timestamp)}),Mn=()=>{V.value&&L(`previous`)},Nn=()=>{H.value&&L(`next`)},G=e=>({0:`Request`,1:`Response`,2:`Plain Text Message`,3:`Acknowledgment`,4:`Node Advertisement`,5:`Group Text Message`,6:`Group Datagram`,7:`Anonymous Request`,8:`Returned Path`,9:`Trace`,10:`Multi-part Packet`,15:`Custom Packet`})[e]||`Unknown Type (${e})`,K=e=>({0:`Transport Flood`,1:`Flood`,2:`Direct`,3:`Transport Direct`})[e]||`Unknown Route (${e})`,Pn=e=>{if(!e)return`None`;let t=e.replace(/\s+/g,``).toUpperCase().match(/.{2}/g)||[],n=[];for(let e=0;e{try{let r=0,i=t.length/2;if(i>=100){if(t.length>=r+64){let i=t.slice(r,r+64);e.push({name:`Public Key`,byteRange:`${(n+r)/2}-${(n+r+63)/2}`,hexData:i.match(/.{8}/g)?.join(` `)||i,description:`Ed25519 public key of the node (32 bytes)`,fields:[{bits:`0-255`,name:`Ed25519 Public Key`,value:`${i.slice(0,16)}...${i.slice(-16)}`,binary:`32 bytes (256 bits)`}]}),r+=64}if(t.length>=r+8){let i=t.slice(r,r+8),a=parseInt(i,16),o=new Date(a*1e3);e.push({name:`Timestamp`,byteRange:`${(n+r)/2}-${(n+r+7)/2}`,hexData:i.match(/.{2}/g)?.join(` `)||i,description:`Unix timestamp of advertisement`,fields:[{bits:`0-31`,name:`Unix Timestamp`,value:`${a} (${o.toLocaleString()})`,binary:a.toString(2).padStart(32,`0`)}]}),r+=8}if(t.length>=r+128){let i=t.slice(r,r+128);e.push({name:`Signature`,byteRange:`${(n+r)/2}-${(n+r+127)/2}`,hexData:i.match(/.{8}/g)?.join(` `)||i,description:`Ed25519 signature of public key, timestamp, and appdata`,fields:[{bits:`0-511`,name:`Ed25519 Signature`,value:`${i.slice(0,16)}...${i.slice(-16)}`,binary:`64 bytes (512 bits)`}]}),r+=128}t.length>r&&J(e,t.slice(r),n+r)}else e.push({name:`ADVERT AppData (Partial)`,byteRange:`${n/2}-${n/2+i-1}`,hexData:t.match(/.{2}/g)?.join(` `)||t,description:`Partial ADVERT data - appears to be just AppData portion (${i} bytes)`,fields:[{bits:`0-${i*8-1}`,name:`Partial Data`,value:`${i} bytes - attempting to decode as AppData`,binary:`${i} bytes (${i*8} bits)`}]}),J(e,t,n)}catch(n){e.push({name:`ADVERT Parse Error`,byteRange:`N/A`,hexData:t.slice(0,32)+`...`,description:`Failed to parse ADVERT payload structure`,fields:[{bits:`N/A`,name:`Error`,value:`Parse error: ${n instanceof Error?n.message:`Unknown error`}`,binary:`Invalid`}]})}},J=(e,t,n)=>{try{let r=t.length/2;e.push({name:`AppData`,byteRange:`${n/2}-${n/2+r-1}`,hexData:t.match(/.{2}/g)?.join(` `)||t,description:`Node advertisement application data (${r} bytes)`,fields:[{bits:`0-${r*8-1}`,name:`Application Data`,value:`${r} bytes (contains flags, location, name, etc.)`,binary:`${r} bytes (${r*8} bits)`}]});let i=0;if(t.length>=2){let r=parseInt(t.slice(i,i+2),16),a=[],o=!!(r&16),s=!!(r&32),c=!!(r&64),l=!!(r&128);if(r&1&&a.push(`is chat node`),r&2&&a.push(`is repeater`),r&4&&a.push(`is room server`),r&8&&a.push(`is sensor`),o&&a.push(`has location`),s&&a.push(`has feature 1`),c&&a.push(`has feature 2`),l&&a.push(`has name`),e.push({name:`AppData Flags`,byteRange:`${(n+i)/2}`,hexData:`0x${t.slice(i,i+2)}`,description:`Flags indicating which optional fields are present`,fields:[{bits:`0-7`,name:`Flags`,value:a.join(`, `)||`none`,binary:r.toString(2).padStart(8,`0`)}]}),i+=2,o&&t.length>=i+16){let r=t.slice(i,i+8),a=[];for(let e=6;e>=0;e-=2)a.push(r.slice(e,e+2));let o=parseInt(a.join(``),16),s=o>2147483647?o-4294967296:o,c=s/1e6,l=t.slice(i+8,i+16),u=[];for(let e=6;e>=0;e-=2)u.push(l.slice(e,e+2));let d=parseInt(u.join(``),16),f=d>2147483647?d-4294967296:d,p=f/1e6;e.push({name:`Location Data`,byteRange:`${(n+i)/2}-${(n+i+15)/2}`,hexData:`${r.match(/.{2}/g)?.join(` `)||r} ${l.match(/.{2}/g)?.join(` `)||l}`,description:`GPS coordinates (latitude and longitude)`,fields:[{bits:`0-31`,name:`Latitude`,value:`${c.toFixed(6)}° (raw: ${s})`,binary:s.toString(2).padStart(32,`0`)},{bits:`32-63`,name:`Longitude`,value:`${p.toFixed(6)}° (raw: ${f})`,binary:f.toString(2).padStart(32,`0`)}]}),i+=16}if(s&&t.length>=i+4){let r=t.slice(i,i+4),a=parseInt(r,16);e.push({name:`Feature 1`,byteRange:`${(n+i)/2}-${(n+i+3)/2}`,hexData:r.match(/.{2}/g)?.join(` `)||r,description:`Reserved feature 1 (2 bytes)`,fields:[{bits:`0-15`,name:`Feature 1 Value`,value:`${a}`,binary:a.toString(2).padStart(16,`0`)}]}),i+=4}if(c&&t.length>=i+4){let r=t.slice(i,i+4),a=parseInt(r,16);e.push({name:`Feature 2`,byteRange:`${(n+i)/2}-${(n+i+3)/2}`,hexData:r.match(/.{2}/g)?.join(` `)||r,description:`Reserved feature 2 (2 bytes)`,fields:[{bits:`0-15`,name:`Feature 2 Value`,value:`${a}`,binary:a.toString(2).padStart(16,`0`)}]}),i+=4}if(l&&t.length>i){let r=t.slice(i),a=r.match(/.{2}/g)||[],o=a.map(e=>{let t=parseInt(e,16);return t>=32&&t<=126?String.fromCharCode(t):`.`}).join(``).replace(/\.+$/,``);e.push({name:`Node Name`,byteRange:`${(n+i)/2}-${(n+t.length-1)/2}`,hexData:r.match(/.{2}/g)?.join(` `)||r,description:`Node name string (${a.length} bytes)`,fields:[{bits:`0-${a.length*8-1}`,name:`Node Name`,value:`"${o}"`,binary:`ASCII text (${a.length} bytes)`}]})}}}catch(n){e.push({name:`AppData Parse Error`,byteRange:`N/A`,hexData:t.slice(0,Math.min(32,t.length)),description:`Failed to parse AppData structure`,fields:[{bits:`N/A`,name:`Error`,value:`Parse error: ${n instanceof Error?n.message:`Unknown error`}`,binary:`Invalid`}]})}},Y=e=>{if(!e)return[];if(Array.isArray(e))return e;if(typeof e==`string`)try{return JSON.parse(e)}catch{return[]}return[]},X=e=>{let t=Y(e.original_path),n=Y(e.forwarded_path),r=Math.max(t.length,n.length);return Array.from({length:r},(e,r)=>{let i=t[r]||``,a=n[r]||``,o=i.toUpperCase(),s=a.toUpperCase();return{hop:r+1,original:o,forwarded:s,changed:o!==s,status:o&&s?o===s?`same`:`changed`:o?`original-only`:`forwarded-only`,localOriginal:!!I.localHash&&o===I.localHash.toUpperCase(),localForwarded:!!I.localHash&&s===I.localHash.toUpperCase()}})},Fn=e=>{let t=Y(e.original_path),n=Y(e.forwarded_path);return JSON.stringify(t)!==JSON.stringify(n)},In=e=>{let t=[];if(!e)return t;try{let n=e.raw_packet;if(n){let e=n.replace(/\s+/g,``).toUpperCase(),r=0;if(e.length>=2){let n=e.slice(r,r+2),i=parseInt(n,16),a=i&3,o=(i&60)>>2,s=(i&192)>>6;if(t.push({name:`Header`,byteRange:`0`,hexData:`0x${n}`,description:`Contains routing type, payload type, and payload version`,fields:[{bits:`0-1`,name:`Route Type`,value:{0:`Transport Flood`,1:`Flood`,2:`Direct`,3:`Transport Direct`}[a]||`Unknown`,binary:a.toString(2).padStart(2,`0`)},{bits:`2-5`,name:`Payload Type`,value:{0:`REQ`,1:`RESPONSE`,2:`TXT_MSG`,3:`ACK`,4:`ADVERT`,5:`GRP_TXT`,6:`GRP_DATA`,7:`ANON_REQ`,8:`PATH`,9:`TRACE`,10:`MULTIPART`,15:`RAW_CUSTOM`}[o]||`Unknown`,binary:o.toString(2).padStart(4,`0`)},{bits:`6-7`,name:`Version`,value:s.toString(),binary:s.toString(2).padStart(2,`0`)}]}),r+=2,(a===0||a===3)&&e.length>=r+8){let n=e.slice(r,r+8),i=parseInt(n.slice(0,4),16),a=parseInt(n.slice(4,8),16);t.push({name:`Transport Codes`,byteRange:`1-4`,hexData:`${n.slice(0,4)} ${n.slice(4,8)}`,description:`2x 16-bit transport codes for routing optimization`,fields:[{bits:`0-15`,name:`Code 1`,value:i.toString(),binary:i.toString(2).padStart(16,`0`)},{bits:`16-31`,name:`Code 2`,value:a.toString(),binary:a.toString(2).padStart(16,`0`)}]}),r+=8}if(e.length>=r+2){let n=e.slice(r,r+2),i=parseInt(n,16),a=(i>>6)+1,o=i&63,s=o*a;if(t.push({name:`Path Length`,byteRange:`${r/2}`,hexData:`0x${n}`,description:`${o} hop${o===1?``:`s`}, ${a}-byte hash${a>1?`es`:``} (${s} bytes)`,fields:[{bits:`6-7`,name:`Hash Size`,value:`${a}-byte`,binary:(i>>6&3).toString(2).padStart(2,`0`)},{bits:`0-5`,name:`Hop Count`,value:`${o}`,binary:(i&63).toString(2).padStart(6,`0`)}]}),r+=2,s>0&&e.length>=r+s*2){let n=e.slice(r,r+s*2),i=RegExp(`.{${a*2}}`,`g`),c=n.match(i)||[];t.push({name:`Path Data`,byteRange:`${r/2}-${(r+s*2-2)/2}`,hexData:c.join(` `)||n,description:`${o} × ${a}-byte routing hash${o===1?``:`es`}`,fields:c.map((e,t)=>({bits:`${t*a*8}-${(t+1)*a*8-1}`,name:`Hop ${t+1}`,value:e.toUpperCase(),binary:`${a} byte${a>1?`s`:``}`}))}),r+=s*2}}if(e.length>r){let n=e.slice(r),i=n.length/2;o===4?q(t,n,r):t.push({name:`Payload Data`,byteRange:`${r/2}-${r/2+i-1}`,hexData:n.match(/.{2}/g)?.join(` `)||n,description:`Application data content`,fields:[{bits:`0-${i*8-1}`,name:`Application Data`,value:`${i} bytes`,binary:`${i} bytes (${i*8} bits)`}]})}}}else{if(e.header){let n=e.header.replace(/0x/gi,``).replace(/\s+/g,``).toUpperCase(),r=parseInt(n,16),i=r&3,a=(r&60)>>2,o=(r&192)>>6;t.push({name:`Header`,byteRange:`0`,hexData:`0x${n}`,description:`Contains routing type, payload type, and payload version`,fields:[{bits:`0-1`,name:`Route Type`,value:{0:`Transport Flood`,1:`Flood`,2:`Direct`,3:`Transport Direct`}[i]||`Unknown`,binary:i.toString(2).padStart(2,`0`)},{bits:`2-5`,name:`Payload Type`,value:{0:`REQ`,1:`RESPONSE`,2:`TXT_MSG`,3:`ACK`,4:`ADVERT`,5:`GRP_TXT`,6:`GRP_DATA`,7:`ANON_REQ`,8:`PATH`,9:`TRACE`,10:`MULTIPART`,15:`RAW_CUSTOM`}[a]||`Unknown`,binary:a.toString(2).padStart(4,`0`)},{bits:`6-7`,name:`Version`,value:o.toString(),binary:o.toString(2).padStart(2,`0`)}]}),e.transport_codes&&t.push({name:`Transport Codes`,byteRange:`1-4`,hexData:e.transport_codes,description:`2x 16-bit transport codes for routing optimization`,fields:[{bits:`0-31`,name:`Transport Codes`,value:e.transport_codes,binary:`Available in separate field`}]}),e.original_path&&e.original_path.length>0&&t.push({name:`Original Path`,byteRange:`?`,hexData:e.original_path.join(` `),description:`Original routing path (${e.original_path.length} nodes)`,fields:[{bits:`0-?`,name:`Path Nodes`,value:`${e.original_path.length} nodes`,binary:`Available as node list`}]}),e.forwarded_path&&e.forwarded_path.length>0&&t.push({name:`Forwarded Path`,byteRange:`?`,hexData:e.forwarded_path.join(` `),description:`Forwarded routing path (${e.forwarded_path.length} nodes)`,fields:[{bits:`0-?`,name:`Path Nodes`,value:`${e.forwarded_path.length} nodes`,binary:`Available as node list`}]})}if(e.payload){let n=e.payload.replace(/\s+/g,``).toUpperCase(),r=n.length/2;e.type===4?q(t,n,0):t.push({name:`Payload Data`,byteRange:`0-${r-1}`,hexData:n.match(/.{2}/g)?.join(` `)||n,description:`Application data content (${r} bytes)`,fields:[{bits:`0-${r*8-1}`,name:`Application Data`,value:`${r} bytes`,binary:`${r} bytes (${r*8} bits)`}]})}}}catch{t.push({name:`Parse Error`,byteRange:`N/A`,hexData:`Error`,description:`Unable to parse packet structure`,fields:[{bits:`N/A`,name:`Error`,value:`Parse failed`,binary:`Invalid`}]})}return t},Z=(e,t)=>e==null||t==null?`text-content-muted`:F(t).color,Q=e=>{if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}},$=e=>e>=1e3?`${(e/1e3).toFixed(2)}s`:`${Math.round(e)}ms`,Ln=e=>{if(e.key===`Escape`){L(`close`);return}if(e.key===`ArrowUp`){V.value&&(e.preventDefault(),L(`previous`));return}e.key===`ArrowDown`&&H.value&&(e.preventDefault(),L(`next`))},Rn=e=>{e.target===e.currentTarget&&L(`close`)};return d(()=>I.isOpen,e=>{e?document.body.style.overflow=`hidden`:document.body.style.overflow=``},{immediate:!0}),(r,d)=>(n(),o(u,{to:`body`},[p(te,{name:`modal`,appear:``},{default:t(()=>[c.isOpen&&c.packet?(n(),v(`div`,{key:0,class:`modal-backdrop overflow-hidden !p-2 sm:!p-4`,onClick:Rn,onKeydown:Ln,tabindex:`0`},[_(`div`,{class:`relative w-full max-w-4xl max-h-[95vh] sm:max-h-[90vh] flex flex-col`,onClick:d[3]||=ee(()=>{},[`stop`])},[_(`div`,ie,[_(`div`,ae,[_(`div`,oe,[d[4]||=_(`h2`,{class:`text-lg sm:text-2xl font-bold text-content-primary mb-1`},` Packet Details `,-1),_(`div`,se,[_(`span`,ce,a(G(c.packet.type)),1),_(`span`,le,a(K(c.packet.route)),1)])]),_(`div`,ue,[Tn.value?(n(),v(`div`,de,[_(`div`,fe,[_(`button`,{type:`button`,class:`w-8 h-8 flex items-center justify-center text-content-secondary dark:text-content-muted hover:text-primary hover:bg-primary/opacity-light transition-colors disabled:opacity-40 disabled:cursor-not-allowed`,disabled:!V.value,title:`Previous packet (↑)`,onClick:Mn},[...d[5]||=[_(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 15l7-7 7 7`})],-1)]],8,pe),_(`button`,{type:`button`,class:`w-8 h-8 flex items-center justify-center text-content-secondary dark:text-content-muted hover:text-primary hover:bg-primary/opacity-light transition-colors border-l border-stroke-subtle dark:border-stroke/opacity-medium disabled:opacity-40 disabled:cursor-not-allowed`,disabled:!H.value,title:`Next packet (↓)`,onClick:Nn},[...d[6]||=[_(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 9l-7 7-7-7`})],-1)]],8,me)]),_(`span`,he,a(En.value),1)])):f(``,!0),_(`button`,{onClick:d[0]||=e=>R.value=!R.value,class:l([`flex-1 sm:flex-none flex items-center justify-center gap-2 px-3 py-2 rounded-lg transition-all duration-200`,R.value?`bg-accent-cyan/opacity-medium border border-accent-cyan/opacity-medium text-accent-cyan`:`bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-medium text-content-secondary dark:text-content-muted`]),title:R.value?`Hide binary values`:`Show binary values`},[...d[7]||=[_(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4`})],-1),_(`span`,{class:`text-xs font-medium`},`Binary`,-1)]],10,ge),_(`button`,{type:`button`,onClick:d[1]||=e=>L(`close`),"aria-label":`Close packet details`,title:`Close`,class:`w-9 h-9 flex items-center justify-center rounded-lg bg-background-mute dark:bg-white/opacity-light hover:bg-stroke-subtle dark:hover:bg-white/opacity-medium transition-colors duration-200 text-content-secondary dark:text-content-primary hover:text-content-primary dark:hover:text-content-primary`},[...d[8]||=[_(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])])]),_(`div`,_e,[_(`div`,ve,[d[15]||=_(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-4 flex items-center`},[_(`div`,{class:`w-2 h-2 rounded-full bg-accent-cyan/opacity-light mr-3`}),h(` Basic Information `)],-1),_(`div`,ye,[_(`div`,be,[_(`div`,b,[_(`div`,x,[d[9]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Timestamp`,-1),_(`span`,S,a(z(c.packet.timestamp)),1)]),_(`div`,C,[d[10]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Packet Hash`,-1),_(`span`,w,a(c.packet.packet_hash),1)]),c.packet.header?(n(),v(`div`,T,[d[11]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Header`,-1),_(`span`,E,a(c.packet.header),1)])):f(``,!0)]),_(`div`,D,[_(`div`,O,[d[12]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Type`,-1),_(`span`,k,a(c.packet.type)+` (`+a(G(c.packet.type))+`)`,1)]),_(`div`,A,[d[13]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Route`,-1),_(`span`,j,a(c.packet.route)+` (`+a(K(c.packet.route))+`)`,1)]),_(`div`,M,[d[14]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Status`,-1),_(`span`,{class:l([`font-semibold`,wn(c.packet)])},a(B(c.packet)),3)])])])])]),W.value.length>0?(n(),v(`div`,N,[_(`h3`,xe,[d[16]||=_(`div`,{class:`w-2 h-2 rounded-full bg-accent-amber/opacity-heavy mr-3`},null,-1),h(` Linked Duplicates (`+a(W.value.length)+`) `,1)]),_(`div`,Se,[(n(!0),v(g,null,e(W.value,(t,r)=>(n(),v(`div`,{key:`${t.packet.packet_hash}_${t.packet.timestamp}_${r}`,class:`glass-card bg-background-mute dark:bg-white/opacity-subtle rounded-[10px] p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},[_(`div`,Ce,[_(`span`,we,` Duplicate #`+a(r+1),1),_(`span`,Te,a(z(t.packet.timestamp)),1)]),_(`div`,Ee,[d[17]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-xs`},` Path `,-1),_(`span`,De,a(t.effectivePath),1)]),t.differences.length>0?(n(),v(`div`,Oe,[(n(!0),v(g,null,e(t.differences,e=>(n(),v(`div`,{key:`${t.packet.timestamp}_${e.label}`,class:`flex flex-wrap items-start justify-between gap-2 py-1 border-b border-stroke-subtle/60 dark:border-stroke/opacity-light last:border-b-0`},[_(`span`,ke,a(e.label),1),_(`span`,Ae,a(e.currentValue)+` → `+a(e.duplicateValue),1)]))),128))])):(n(),v(`p`,je,` No additional field differences beyond timestamp. `))]))),128))])])):f(``,!0),_(`div`,Me,[d[29]||=_(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-4 flex items-center`},[_(`div`,{class:`w-2 h-2 rounded-full bg-accent-orange/opacity-light mr-3`}),h(` Payload Data `)],-1),_(`div`,Ne,[_(`div`,Pe,[_(`div`,Fe,[d[18]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Payload Length`,-1),_(`span`,Ie,a(c.packet.payload_length||c.packet.length)+` bytes`,1)]),c.packet.payload?(n(),v(`div`,Le,[d[27]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-3`},` Payload Analysis `,-1),_(`div`,Re,[d[19]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-2 font-semibold`},` Raw Hex Data `,-1),_(`div`,ze,[_(`pre`,Be,a(Pn(c.packet.payload)),1)])]),(n(!0),v(g,null,e(In(c.packet).filter(e=>!e.name.includes(`Parse Error`)&&![`Path Length`,`Path Data`,`Original Path`,`Forwarded Path`].includes(e.name)),(t,r)=>(n(),v(`div`,{key:r,class:`mb-4`},[_(`div`,Ve,[_(`h4`,He,a(t.name),1),_(`span`,Ue,`Bytes `+a(t.byteRange),1)]),_(`div`,We,[_(`div`,Ge,a(t.hexData),1)]),_(`div`,Ke,[_(`div`,{class:l([`hidden md:grid gap-3 p-3 bg-background-mute dark:bg-white/opacity-subtle text-content-secondary dark:text-content-muted text-xs font-semibold uppercase tracking-wide`,R.value?`grid-cols-4`:`grid-cols-3`])},[d[20]||=_(`div`,{class:`min-w-0`},`Bits`,-1),d[21]||=_(`div`,{class:`min-w-0`},`Field`,-1),d[22]||=_(`div`,{class:`min-w-0`},`Value`,-1),R.value?(n(),v(`div`,qe,`Binary`)):f(``,!0)],2),(n(!0),v(g,null,e(t.fields,(e,t)=>(n(),v(`div`,{key:t,class:l([`hidden md:grid gap-3 p-3 border-b border-stroke-subtle dark:border-stroke/opacity-light last:border-b-0 hover:bg-background-mute dark:hover:bg-stroke/opacity-subtle transition-colors`,R.value?`grid-cols-4`:`grid-cols-3`])},[_(`div`,Je,a(e.bits),1),_(`div`,Ye,a(e.name),1),_(`div`,Xe,[_(`span`,{class:`block`,title:e.value},a(e.value),9,Ze)]),R.value?(n(),v(`div`,Qe,[_(`span`,{class:`block`,title:e.binary},a(e.binary),9,$e)])):f(``,!0)],2))),128)),(n(!0),v(g,null,e(t.fields,(e,t)=>(n(),v(`div`,{key:`mobile-${t}`,class:`md:hidden p-3 border-b border-stroke-subtle dark:border-stroke/opacity-light last:border-b-0 space-y-2`},[_(`div`,et,[_(`div`,null,[d[23]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-xs uppercase tracking-wide`},`Bits:`,-1),_(`div`,tt,a(e.bits),1)]),_(`div`,null,[d[24]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-xs uppercase tracking-wide`},`Field:`,-1),_(`div`,nt,a(e.name),1)])]),_(`div`,null,[d[25]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-xs uppercase tracking-wide`},`Value:`,-1),_(`div`,{class:`text-content-primary text-sm font-semibold break-all`,title:e.value},a(e.value),9,rt)]),R.value?(n(),v(`div`,it,[d[26]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-xs uppercase tracking-wide`},`Binary:`,-1),_(`div`,{class:`text-accent-orange text-xs font-mono break-all`,title:e.binary},a(e.binary),9,at)])):f(``,!0)]))),128))]),t.description?(n(),v(`div`,ot,a(t.description),1)):f(``,!0)]))),128))])):(n(),v(`div`,st,[...d[28]||=[_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Payload:`,-1),_(`span`,{class:`text-content-muted ml-2`},`None`,-1)]]))])])]),_(`div`,ct,[d[36]||=_(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-4 flex items-center`},[_(`div`,{class:`w-2 h-2 rounded-full status-dot-secondary mr-3`}),h(` Path Information `)],-1),_(`div`,lt,[_(`div`,ut,[_(`div`,dt,[_(`div`,ft,[d[30]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Source Hash`,-1),_(`span`,{class:l([`text-content-primary font-mono text-xs`,I.localHash&&c.packet.src_hash===I.localHash?`bg-accent-cyan/opacity-medium text-accent-cyan px-1 rounded`:``])},a(c.packet.src_hash||`Unknown`),3)]),_(`div`,pt,[d[31]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Destination Hash`,-1),_(`span`,{class:l([`text-content-primary font-mono text-xs`,I.localHash&&c.packet.dst_hash===I.localHash?`bg-accent-cyan/opacity-medium text-accent-cyan px-1 rounded`:``])},a(c.packet.dst_hash||`Broadcast`),3)])]),X(c.packet).length>0?(n(),v(`div`,mt,[_(`div`,ht,[d[32]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm font-medium`},` Path Table `,-1),_(`span`,gt,a(Y(c.packet.original_path).length)+` original hops `,1),c.packet.transmitted&&Y(c.packet.forwarded_path).length>0?(n(),v(`span`,_t,a(Y(c.packet.forwarded_path).length)+` forwarded hops `,1)):f(``,!0),c.packet.transmitted&&Fn(c.packet)?(n(),v(`span`,vt,` Modified `)):f(``,!0)]),_(`div`,yt,[d[35]||=_(`div`,{class:`hidden md:grid grid-cols-[56px_1fr_1fr_96px] gap-3 p-3 bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle text-content-secondary dark:text-content-muted text-xs font-semibold uppercase tracking-wide`},[_(`div`,null,`Hop`),_(`div`,null,`Original`),_(`div`,null,`Forwarded`),_(`div`,null,`Status`)],-1),(n(!0),v(g,null,e(X(c.packet),e=>(n(),v(`div`,{key:`desktop-${e.hop}`,class:`hidden md:grid grid-cols-[56px_1fr_1fr_96px] gap-3 p-3 border-t border-stroke-subtle dark:border-stroke/opacity-light items-center`},[_(`div`,bt,` #`+a(e.hop),1),_(`div`,xt,[_(`div`,{class:l([`font-mono text-xs sm:text-sm rounded-md px-2 py-1 border truncate`,e.original?e.localOriginal?`bg-accent-cyan/opacity-medium border-accent-cyan/opacity-heavy text-accent-cyan`:`bg-accent-cyan/opacity-light border-accent-cyan/opacity-medium text-content-primary`:`bg-background-mute/opacity-heavy border-stroke-subtle text-content-muted`]),title:e.original||`No hop`},a(e.original||`-`),11,St)]),_(`div`,Ct,[_(`div`,{class:l([`font-mono text-xs sm:text-sm rounded-md px-2 py-1 border truncate`,e.forwarded?e.localForwarded?`bg-accent-amber/opacity-medium border-accent-amber/opacity-heavy text-accent-amber`:`bg-accent-orange/opacity-light border-accent-orange/opacity-medium text-content-primary`:`bg-background-mute/opacity-heavy border-stroke-subtle text-content-muted`]),title:e.forwarded||`No hop`},a(e.forwarded||`-`),11,wt)]),_(`div`,null,[_(`span`,{class:l([`inline-flex items-center rounded-full px-2 py-0.5 text-[11px] font-medium`,e.status===`same`?`bg-accent-green/opacity-medium text-accent-green`:e.status===`changed`?`bg-accent-amber/opacity-medium text-accent-amber`:e.status===`original-only`?`bg-accent-cyan/opacity-medium text-accent-cyan`:`bg-accent-orange/opacity-medium text-accent-orange`])},a(e.status===`same`?`Same`:e.status===`changed`?`Changed`:e.status===`original-only`?`Original only`:`Forwarded only`),3)])]))),128)),_(`div`,Tt,[(n(!0),v(g,null,e(X(c.packet),e=>(n(),v(`div`,{key:`mobile-${e.hop}`,class:`p-3 space-y-2`},[_(`div`,Et,[_(`span`,Dt,` Hop #`+a(e.hop),1),_(`span`,{class:l([`inline-flex items-center rounded-full px-2 py-0.5 text-[11px] font-medium`,e.status===`same`?`bg-accent-green/opacity-medium text-accent-green`:e.status===`changed`?`bg-accent-amber/opacity-medium text-accent-amber`:e.status===`original-only`?`bg-accent-cyan/opacity-medium text-accent-cyan`:`bg-accent-orange/opacity-medium text-accent-orange`])},a(e.status===`same`?`Same`:e.status===`changed`?`Changed`:e.status===`original-only`?`Original only`:`Forwarded only`),3)]),_(`div`,Ot,[_(`div`,P,[d[33]||=_(`div`,{class:`text-[11px] uppercase tracking-wide text-content-muted`},` Original `,-1),_(`div`,{class:l([`font-mono text-xs rounded-md px-2 py-1 border truncate`,e.original?e.localOriginal?`bg-accent-cyan/opacity-medium border-accent-cyan/opacity-heavy text-accent-cyan`:`bg-accent-cyan/opacity-light border-accent-cyan/opacity-medium text-content-primary`:`bg-background-mute/opacity-heavy border-stroke-subtle text-content-muted`]),title:e.original||`No hop`},a(e.original||`-`),11,kt)]),_(`div`,At,[d[34]||=_(`div`,{class:`text-[11px] uppercase tracking-wide text-content-muted`},` Forwarded `,-1),_(`div`,{class:l([`font-mono text-xs rounded-md px-2 py-1 border truncate`,e.forwarded?e.localForwarded?`bg-accent-amber/opacity-medium border-accent-amber/opacity-heavy text-accent-amber`:`bg-accent-orange/opacity-light border-accent-orange/opacity-medium text-content-primary`:`bg-background-mute/opacity-heavy border-stroke-subtle text-content-muted`]),title:e.forwarded||`No hop`},a(e.forwarded||`-`),11,jt)])])]))),128))])])])):f(``,!0)])])]),_(`div`,Mt,[d[53]||=_(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-4 flex items-center`},[_(`div`,{class:`w-2 h-2 rounded-full bg-accent-green/opacity-light mr-3`}),h(` Signal & Processing `)],-1),_(`div`,Nt,[_(`div`,Pt,[_(`div`,Ft,[d[37]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` RSSI `,-1),_(`div`,It,a(typeof c.packet.rssi==`number`?c.packet.rssi:`N/A`),1),d[38]||=_(`div`,{class:`text-content-muted text-xs`},`dBm`,-1)]),_(`div`,Lt,[d[39]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` SNR `,-1),_(`div`,{class:l([`text-lg font-bold`,Z(c.packet.snr,c.packet.rssi)])},a(typeof c.packet.snr==`number`?c.packet.snr.toFixed(1):`N/A`),3),d[40]||=_(`div`,{class:`text-content-muted text-xs`},`dB`,-1)]),_(`div`,Rt,[d[41]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` Score `,-1),_(`div`,zt,a(typeof c.packet.score==`number`?c.packet.score.toFixed(3):`N/A`),1)])]),c.packet.rssi==null?(n(),v(`div`,Ht,[...d[43]||=[_(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-2`},` Signal Quality `,-1),_(`div`,{class:`text-content-muted text-sm italic`},` N/A (TX Packet) `,-1)]])):(n(),v(`div`,Bt,[d[42]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-2`},` Signal Quality `,-1),_(`div`,Vt,[p(re,{bars:i(F)(c.packet.rssi).bars,color:i(F)(c.packet.rssi).color},null,8,[`bars`,`color`]),_(`span`,{class:l([`text-sm font-medium`,i(F)(c.packet.rssi).color])},a(i(F)(c.packet.rssi).quality),3)])])),c.packet.is_trace&&c.packet.path_snr_details&&c.packet.path_snr_details.length>0?(n(),v(`div`,Ut,[_(`div`,Wt,` Path SNR Details (`+a(c.packet.path_snr_details.length)+` hops) `,1),_(`div`,Gt,[(n(!0),v(g,null,e(c.packet.path_snr_details,(e,t)=>(n(),v(`div`,{key:t,class:`flex items-center justify-between p-2 glass-card bg-background-mute dark:bg-white/opacity-subtle rounded-[8px]`},[_(`div`,Kt,[_(`span`,qt,a(t+1)+`.`,1),_(`span`,{class:l([`font-mono text-xs text-content-primary`,I.localHash&&e.hash===I.localHash?`bg-accent-cyan/opacity-medium text-accent-cyan px-1 rounded`:``])},a(e.hash.toUpperCase()),3)]),_(`span`,{class:l([`text-sm font-bold`,Z(e.snr_db,null)])},a(e.snr_db.toFixed(1))+`dB `,3)]))),128))])])):f(``,!0),c.packet.transmitted&&c.packet.lbt_attempts!==void 0?(n(),v(`div`,Jt,[d[48]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-3 flex items-center`},[_(`svg`,{class:`w-4 h-4 mr-2`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z`})]),h(` Listen Before Talk (LBT) Metrics `)],-1),_(`div`,Yt,[_(`div`,Xt,[d[44]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` CAD Attempts `,-1),_(`div`,Zt,a(c.packet.lbt_attempts),1)]),_(`div`,Qt,[d[45]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` Total LBT Delay `,-1),_(`div`,$t,a($(Q(c.packet.lbt_backoff_delays_ms).reduce((e,t)=>e+t,0))),1),_(`div`,en,a(Q(c.packet.lbt_backoff_delays_ms).length)+` backoffs `,1)]),_(`div`,tn,[d[46]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` Channel Status `,-1),_(`div`,{class:l([`text-lg font-bold`,c.packet.lbt_channel_busy?`text-accent-amber`:`text-accent-green`])},a(c.packet.lbt_channel_busy?`BUSY`:`CLEAR`),3),_(`div`,nn,a(c.packet.lbt_channel_busy?`Waited for clear`:`Immediate TX`),1)])]),Q(c.packet.lbt_backoff_delays_ms).length>0?(n(),v(`div`,rn,[d[47]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-3 font-semibold`},` Backoff Pattern (Exponential with Jitter) `,-1),_(`div`,an,[(n(!0),v(g,null,e(Q(c.packet.lbt_backoff_delays_ms),(e,t)=>(n(),v(`div`,{key:t,class:`flex items-center gap-3`},[_(`div`,on,[_(`span`,sn,`Attempt `+a(t+1),1)]),_(`div`,cn,[_(`div`,ln,[_(`div`,{class:l([`h-full rounded-lg transition-all duration-300`,[t===0?`bg-gradient-to-r from-cyan-500/50 to-cyan-600/50`:t===1?`bg-gradient-to-r from-yellow-500/50 to-yellow-600/50`:t===2?`bg-gradient-to-r from-orange-500/50 to-orange-600/50`:`bg-gradient-to-r from-red-500/50 to-red-600/50`]]),style:s({width:`${Math.min(100,e/Math.max(...Q(c.packet.lbt_backoff_delays_ms))*100)}%`})},[_(`div`,un,[_(`span`,dn,a($(e)),1)])],6)])]),_(`div`,fn,[_(`span`,pn,a(Math.round(e/Q(c.packet.lbt_backoff_delays_ms).reduce((e,t)=>e+t,0)*100))+`% `,1)])]))),128))])])):f(``,!0)])):f(``,!0),_(`div`,mn,[_(`div`,hn,[_(`div`,gn,[d[49]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`TX Delay`,-1),_(`span`,_n,a(Number(c.packet.tx_delay_ms)>0?Number(c.packet.tx_delay_ms).toFixed(1)+`ms`:`-`),1)]),_(`div`,vn,[d[50]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Transmitted`,-1),_(`span`,{class:l(c.packet.transmitted?`text-accent-green`:`text-accent-red`)},a(c.packet.transmitted?`Yes`:`No`),3)])]),_(`div`,yn,[_(`div`,bn,[d[51]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Is Duplicate`,-1),_(`span`,{class:l(c.packet.is_duplicate?`text-accent-amber`:`text-content-muted`)},a(c.packet.is_duplicate?`Yes`:`No`),3)]),c.packet.drop_reason?(n(),v(`div`,xn,[d[52]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Drop Reason`,-1),_(`span`,Sn,a(c.packet.drop_reason),1)])):f(``,!0)])])])])]),_(`div`,Cn,[_(`button`,{type:`button`,onClick:d[2]||=e=>L(`close`),"aria-label":`Close packet details`,class:`w-full sm:w-auto px-6 py-2 bg-gradient-to-r from-cyan-500/20 to-cyan-400/20 hover:from-cyan-500/30 hover:to-cyan-400/30 border border-accent-cyan/opacity-medium rounded-[10px] text-content-primary transition-all duration-200 backdrop-blur-sm`},` Close `)])])])],32)):f(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-1119acac`]]);export{F as t}; \ No newline at end of file diff --git a/repeater/web/html/assets/PacketDetailsModal-Cp96QhHp.js b/repeater/web/html/assets/PacketDetailsModal-Cp96QhHp.js new file mode 100644 index 0000000..0569e97 --- /dev/null +++ b/repeater/web/html/assets/PacketDetailsModal-Cp96QhHp.js @@ -0,0 +1,2 @@ +import{D as e,N as t,T as n,U as r,X as i,_t as a,c as o,gt as s,h as c,ht as l,i as u,j as d,l as f,m as p,o as m,p as h,r as g,s as _,u as v}from"./runtime-core.esm-bundler-CINEgm0a.js";import{l as ee,t as te}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as y}from"./api-EpLa-SS4.js";import{d as b}from"./index-DF5glAZc.js";import{n as ne,t as re}from"./SignalBars-CwCyvrs-.js";var ie={class:`bg-white dark:bg-surface-elevated backdrop-blur-xl rounded-[16px] sm:rounded-[20px] shadow-2xl border border-stroke-subtle dark:border-white/opacity-medium flex flex-col h-full overflow-hidden`},ae={class:`flex flex-col sm:flex-row sm:items-start sm:justify-between p-4 sm:p-6 lg:p-8 pb-3 sm:pb-4 shrink-0 gap-3 sm:gap-4`},oe={class:`min-w-0 flex-1`},se={class:`flex flex-wrap gap-2 mt-2`},ce={class:`inline-flex items-center rounded-full bg-accent-cyan/opacity-light text-accent-cyan px-2 py-0.5 text-[11px] sm:text-xs font-medium max-w-full truncate`},le={class:`inline-flex items-center rounded-full bg-accent-orange/opacity-light text-accent-orange px-2 py-0.5 text-[11px] sm:text-xs font-medium max-w-full truncate`},ue={class:`w-full sm:w-auto flex flex-wrap items-center justify-between sm:justify-end gap-2 pt-1 sm:pt-0`},de={key:0,class:`flex items-center gap-2`},fe={class:`flex items-center rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium overflow-hidden bg-background-mute dark:bg-white/opacity-subtle`},pe=[`disabled`],me=[`disabled`],he={class:`text-xs text-content-secondary dark:text-content-muted font-medium`},ge=[`title`],_e={class:`flex-1 overflow-y-auto custom-scrollbar px-4 sm:px-6 lg:px-8`},ve={class:`mb-6`},ye={class:`glass-card bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle rounded-[15px] p-4`},be={class:`grid grid-cols-1 sm:grid-cols-2 gap-4`},xe={class:`space-y-3`},Se={class:`flex justify-between py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},Ce={class:`text-content-primary font-mono text-sm`},we={class:`flex justify-between py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},Te={class:`text-content-primary font-mono text-xs break-all`},Ee={key:0,class:`flex justify-between py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},De={class:`text-content-primary font-mono text-xs`},Oe={class:`space-y-3`},ke={class:`flex justify-between py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},Ae={class:`text-content-primary font-semibold`},je={class:`flex justify-between py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},Me={class:`text-content-primary font-semibold`},x={class:`flex justify-between py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},Ne={key:0,class:`mb-6`},Pe={class:`text-base sm:text-lg font-semibold text-content-primary mb-4 flex items-center`},Fe={class:`bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle rounded-[15px] p-4 border border-stroke-subtle dark:border-stroke/opacity-light space-y-3`},Ie={class:`flex items-center justify-between gap-2 mb-2`},Le={class:`text-content-primary text-sm font-semibold`},Re={class:`text-content-secondary dark:text-content-muted text-xs font-mono`},ze={class:`mb-2 flex flex-wrap items-start justify-between gap-2 py-1 border-b border-stroke-subtle/60 dark:border-stroke/opacity-light`},Be={class:`text-content-primary text-xs font-mono break-all text-right`},Ve={key:0,class:`space-y-1`},He={class:`text-content-secondary dark:text-content-muted text-xs`},Ue={class:`text-content-primary text-xs font-mono break-all text-right`},We={key:1,class:`text-content-secondary dark:text-content-muted text-xs italic`},Ge={class:`mb-6`},Ke={class:`bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle rounded-[15px] p-4 border border-stroke-subtle dark:border-stroke/opacity-light`},qe={class:`space-y-3`},Je={class:`flex justify-between py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},Ye={class:`text-content-primary`},Xe={key:0,class:`pt-2`},Ze={class:`glass-card bg-background-mute dark:bg-white/opacity-subtle rounded-[10px] p-4 mb-4`},Qe={class:`w-full overflow-x-auto`},$e={class:`text-content-primary/opacity-heavy text-xs font-mono whitespace-pre leading-relaxed min-w-full`},et={class:`flex items-center justify-between mb-3`},tt={class:`text-content-secondary dark:text-content-primary/opacity-heavy text-sm font-semibold`},nt={class:`text-content-muted text-xs`},rt={class:`bg-background-mute dark:bg-white/opacity-subtle rounded-[8px] p-3 mb-3`},it={class:`font-mono text-xs text-content-primary break-all whitespace-pre-wrap leading-relaxed`},at={class:`bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle rounded-[10px] overflow-hidden`},ot={key:0,class:`min-w-0`},st={class:`text-accent-cyan text-sm font-mono break-words min-w-0`},ct={class:`text-content-primary text-sm break-words min-w-0`},lt={class:`text-content-primary text-sm font-semibold break-all min-w-0 overflow-hidden`},ut=[`title`],dt={key:0,class:`text-accent-orange text-xs font-mono break-all min-w-0 overflow-hidden`},ft=[`title`],pt={class:`grid grid-cols-2 gap-2`},mt={class:`text-accent-cyan text-sm font-mono break-words`},ht={class:`text-content-primary text-sm break-words`},gt=[`title`],_t={key:0},vt=[`title`],yt={key:0,class:`text-content-muted text-xs italic mt-2 px-1`},bt={key:1,class:`py-2`},xt={class:`mb-6`},St={class:`bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle rounded-[15px] p-4 border border-stroke-subtle dark:border-stroke/opacity-light`},Ct={class:`space-y-4`},wt={class:`grid grid-cols-1 sm:grid-cols-2 gap-4`},Tt={class:`flex justify-between py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},Et={class:`flex justify-between py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},Dt={key:0,class:`py-2`},Ot={class:`flex flex-wrap items-center gap-2 mb-3`},kt={class:`text-xs px-2 py-0.5 rounded-full bg-accent-cyan/opacity-light text-accent-cyan`},At={key:0,class:`text-xs px-2 py-0.5 rounded-full bg-accent-amber/opacity-medium text-accent-amber`},jt={key:1,class:`text-xs px-2 py-0.5 rounded-full bg-accent-red/opacity-medium text-accent-red`},Mt={key:2,class:`text-xs px-2 py-0.5 rounded-full bg-background-mute text-content-muted`},Nt={class:`bg-background-mute dark:bg-white/opacity-subtle rounded-[10px] border border-stroke-subtle dark:border-stroke/opacity-light p-3 sm:p-4`},Pt={class:`relative space-y-3`},Ft={class:`relative flex items-center justify-center self-stretch`},It={key:0,class:`absolute left-1/2 -translate-x-1/2 top-[-6px] bottom-[calc(50%+18px)] sm:bottom-[calc(50%+20px)] w-px bg-primary/opacity-medium`},Lt={key:1,class:`absolute left-1/2 -translate-x-1/2 top-[calc(50%+18px)] sm:top-[calc(50%+20px)] bottom-[-6px] w-px bg-primary/opacity-medium`},Rt={class:`glass-card bg-background-mute dark:bg-white/opacity-subtle rounded-[10px] p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},zt={class:`flex items-start justify-between gap-3`},Bt={class:`min-w-0 flex-1`},Vt=[`title`],Ht=[`onClick`],Ut={key:2,class:`text-[10px] sm:text-[11px] leading-tight mt-0.5 text-accent-cyan`},Wt={key:3,class:`mt-2 space-y-1`},Gt={class:`text-content-secondary dark:text-content-muted truncate`},Kt={class:`font-mono text-content-muted`},qt=[`title`],Jt={class:`mt-2`},Yt={class:`h-1.5 rounded-full bg-background-mute dark:bg-stroke/opacity-subtle overflow-hidden border border-stroke-subtle/60 dark:border-stroke/opacity-light`},Xt={class:`mb-6`},Zt={class:`glass-card bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle rounded-[15px] p-4`},Qt={class:`grid grid-cols-2 md:grid-cols-3 gap-3 sm:gap-4 mb-4`},$t={class:`text-center p-3 glass-card bg-background-mute dark:bg-white/opacity-subtle rounded-[10px]`},en={class:`text-lg font-bold text-content-primary`},tn={class:`text-center p-3 glass-card bg-background-mute dark:bg-white/opacity-subtle rounded-[10px]`},nn={class:`text-center p-3 glass-card bg-background-mute dark:bg-white/opacity-subtle rounded-[10px] col-span-2 md:col-span-1`},rn={class:`text-lg font-bold text-content-primary`},an={key:0,class:`mb-4`},on={class:`flex items-center gap-2`},sn={key:1,class:`mb-4`},cn={key:2,class:`mb-4`},ln={class:`text-content-secondary dark:text-content-muted text-sm mb-3`},un={class:`space-y-2`},dn={class:`flex items-center gap-3`},fn={class:`text-content-muted text-sm`},S={key:3,class:`mt-6 pt-4 border-t border-stroke-subtle dark:border-stroke/opacity-light`},pn={class:`grid grid-cols-2 md:grid-cols-3 gap-3 mb-4`},mn={class:`text-center p-3 glass-card bg-background-mute dark:bg-white/opacity-subtle rounded-[10px] col-span-2 md:col-span-1`},hn={class:`text-2xl font-bold text-content-primary`},gn={class:`text-center p-3 glass-card bg-background-mute dark:bg-white/opacity-subtle rounded-[10px]`},_n={class:`text-2xl font-bold text-content-primary`},vn={class:`text-content-muted text-xs mt-1`},yn={class:`text-center p-3 glass-card bg-background-mute dark:bg-white/opacity-subtle rounded-[10px]`},bn={class:`text-content-muted text-xs mt-1`},xn={key:0,class:`glass-card bg-background-mute dark:bg-white/opacity-subtle rounded-[10px] p-4`},Sn={class:`space-y-3`},Cn={class:`flex-shrink-0 w-16 text-right`},wn={class:`text-content-secondary dark:text-content-muted text-xs`},Tn={class:`flex-1 relative`},En={class:`h-8 rounded-lg overflow-hidden bg-background-mute dark:bg-stroke/opacity-subtle relative`},Dn={class:`absolute inset-0 flex items-center px-3`},On={class:`text-content-primary text-xs font-mono font-semibold`},kn={class:`flex-shrink-0 w-12 text-left`},An={class:`text-content-muted text-xs`},jn={class:`grid grid-cols-1 sm:grid-cols-2 gap-4`},Mn={class:`space-y-2`},Nn={class:`flex justify-between py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},Pn={class:`text-content-primary`},Fn={class:`flex justify-between py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},In={class:`space-y-2`},Ln={class:`flex justify-between py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},Rn={key:0,class:`flex justify-between py-2 border-b border-stroke-subtle dark:border-stroke/opacity-light`},zn={class:`text-accent-red text-sm`},Bn={class:`p-4 sm:p-6 lg:p-8 pt-3 sm:pt-4 border-t border-stroke-subtle dark:border-stroke/opacity-light flex justify-end flex-shrink-0`},Vn=300*1e3,C=b(c({name:`PacketDetailsModal`,__name:`PacketDetailsModal`,props:{packet:{},packets:{},linkedDuplicatePackets:{},currentIndex:{},canGoPrevious:{type:Boolean},canGoNext:{type:Boolean},isOpen:{type:Boolean},localHash:{}},emits:[`close`,`previous`,`next`],setup(c,{emit:b}){let{getSignalQuality:C}=ne(),w=c,T=b,E=r(!1),D=r([]),O=r(!1),k=r(null),Hn=[`Unknown`,`Chat Node`,`Repeater`,`Room Server`,`Hybrid Node`],A=e=>typeof e==`object`&&!!e&&!Array.isArray(e),j=e=>typeof e==`string`?e.replace(/^0x/i,``).replace(/[^0-9a-fA-F]/g,``).toUpperCase():``,Un=(e,t)=>{for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t.trim()}return``},M=e=>{if(Array.isArray(e))return e.filter(e=>A(e));if(!A(e))return[];let t=e.data;return Array.isArray(t)?t.filter(e=>A(e)):A(t)&&Array.isArray(t.data)?t.data.filter(e=>A(e)):[]},N=(e,t)=>e.map(e=>{let n=j(e.pub_key??e.pubkey??e.public_key),r=Un(e,[`name`,`node_name`,`display_name`,`alias`]);return!n||!r?null:{pubkey:n,name:r,source:t}}).filter(e=>e!==null),Wn=()=>k.value==null?!0:Date.now()-k.value>Vn,Gn=async()=>{if(!O.value){O.value=!0;try{let[e,t]=await Promise.all([y.get(`/companion/contacts`),Promise.all(Hn.map(e=>y.get(`/adverts_by_contact_type`,{contact_type:e,hours:168,limit:500}).catch(()=>null)))]),n=N(M(e),`contact`),r=t.flatMap(e=>e?N(M(e),`advert`):[]),i=new Map;[...n,...r].forEach(e=>{i.has(e.pubkey)||i.set(e.pubkey,e)}),D.value=Array.from(i.values()),k.value=Date.now()}catch{}finally{O.value=!1}}},P=r([]),F=e=>P.value.includes(e),Kn=e=>{if(F(e)){P.value=P.value.filter(t=>t!==e);return}P.value=[...P.value,e]},qn=e=>e.length<=10?e:`${e.slice(0,6)}...${e.slice(-4)}`,I=e=>{let t=j(e);if(!t)return null;let n=D.value.filter(e=>e.pubkey.startsWith(t));if(n.length===0)return null;let r=n[0],i=new Set(n.map(e=>e.pubkey)),a=Math.max(1,Math.round(100/i.size));return{name:r.name,confidencePercent:a,candidates:n.slice(0,8)}},L=e=>new Date(e*1e3).toLocaleString(),Jn=e=>e.transmitted?e.is_duplicate?`text-accent-amber`:e.drop_reason?`text-accent-red`:`text-accent-green`:`text-accent-red`,R=e=>e.transmitted?e.is_duplicate?`Duplicate`:e.drop_reason?`Dropped`:`Forwarded`:`Dropped`,Yn=m(()=>(w.packets?.length??0)>1),z=m(()=>!!w.canGoPrevious),B=m(()=>!!w.canGoNext),Xn=m(()=>{let e=w.packets?.length??0;return e===0?``:w.currentIndex==null||w.currentIndex<0?`- / ${e}`:`${w.currentIndex+1} / ${e}`}),Zn=(e,t)=>e.id!=null&&t.id!=null?e.id===t.id:e.packet_hash===t.packet_hash&&e.timestamp===t.timestamp&&e.type===t.type&&e.route===t.route&&e.src_hash===t.src_hash&&e.dst_hash===t.dst_hash&&e.length===t.length,V=(e,t=``,n=null)=>e==null?`N/A`:typeof e==`number`?Number.isFinite(e)?`${n==null?e.toString():e.toFixed(n)}${t}`:`N/A`:typeof e==`boolean`?e?`Yes`:`No`:e||`N/A`,Qn=e=>{let t=q(e);return t.length===0?`None`:t.join(` → `).toUpperCase()},$n=e=>{let t=q(e.original_path),n=q(e.forwarded_path);return e.transmitted&&n.length>0?n:t.length>0?t:n},er=e=>Qn($n(e)),tr=(e,t)=>{let n=[],r=(e,t,r)=>{t!==r&&n.push({label:e,currentValue:t,duplicateValue:r})};return r(`Type`,U(e.type),U(t.type)),r(`Route`,W(e.route),W(t.route)),r(`Status`,R(e),R(t)),r(`Length`,`${e.length}B`,`${t.length}B`),r(`RSSI`,V(e.rssi,` dBm`,0),V(t.rssi,` dBm`,0)),r(`SNR`,V(e.snr,` dB`,1),V(t.snr,` dB`,1)),r(`Score`,V(e.score,``,2),V(t.score,``,2)),r(`TX Delay`,V(e.tx_delay_ms,` ms`,1),V(t.tx_delay_ms,` ms`,1)),r(`Source`,V(e.src_hash),V(t.src_hash)),r(`Destination`,V(e.dst_hash||`Broadcast`),V(t.dst_hash||`Broadcast`)),r(`Drop Reason`,V(e.drop_reason||`None`),V(t.drop_reason||`None`)),n},H=m(()=>{let e=w.packet,t=w.linkedDuplicatePackets??[];return!e||t.length===0?[]:t.filter(t=>!Zn(t,e)).map(t=>({packet:t,effectivePath:er(t),differences:tr(e,t)})).sort((e,t)=>t.packet.timestamp-e.packet.timestamp)}),nr=()=>{z.value&&T(`previous`)},rr=()=>{B.value&&T(`next`)},U=e=>({0:`Request`,1:`Response`,2:`Plain Text Message`,3:`Acknowledgment`,4:`Node Advertisement`,5:`Group Text Message`,6:`Group Datagram`,7:`Anonymous Request`,8:`Returned Path`,9:`Trace`,10:`Multi-part Packet`,15:`Custom Packet`})[e]||`Unknown Type (${e})`,W=e=>({0:`Transport Flood`,1:`Flood`,2:`Direct`,3:`Transport Direct`})[e]||`Unknown Route (${e})`,ir=e=>{if(!e)return`None`;let t=e.replace(/\s+/g,``).toUpperCase().match(/.{2}/g)||[],n=[];for(let e=0;e{try{let r=0,i=t.length/2;if(i>=100){if(t.length>=r+64){let i=t.slice(r,r+64);e.push({name:`Public Key`,byteRange:`${(n+r)/2}-${(n+r+63)/2}`,hexData:i.match(/.{8}/g)?.join(` `)||i,description:`Ed25519 public key of the node (32 bytes)`,fields:[{bits:`0-255`,name:`Ed25519 Public Key`,value:`${i.slice(0,16)}...${i.slice(-16)}`,binary:`32 bytes (256 bits)`}]}),r+=64}if(t.length>=r+8){let i=t.slice(r,r+8),a=parseInt(i,16),o=new Date(a*1e3);e.push({name:`Timestamp`,byteRange:`${(n+r)/2}-${(n+r+7)/2}`,hexData:i.match(/.{2}/g)?.join(` `)||i,description:`Unix timestamp of advertisement`,fields:[{bits:`0-31`,name:`Unix Timestamp`,value:`${a} (${o.toLocaleString()})`,binary:a.toString(2).padStart(32,`0`)}]}),r+=8}if(t.length>=r+128){let i=t.slice(r,r+128);e.push({name:`Signature`,byteRange:`${(n+r)/2}-${(n+r+127)/2}`,hexData:i.match(/.{8}/g)?.join(` `)||i,description:`Ed25519 signature of public key, timestamp, and appdata`,fields:[{bits:`0-511`,name:`Ed25519 Signature`,value:`${i.slice(0,16)}...${i.slice(-16)}`,binary:`64 bytes (512 bits)`}]}),r+=128}t.length>r&&K(e,t.slice(r),n+r)}else e.push({name:`ADVERT AppData (Partial)`,byteRange:`${n/2}-${n/2+i-1}`,hexData:t.match(/.{2}/g)?.join(` `)||t,description:`Partial ADVERT data - appears to be just AppData portion (${i} bytes)`,fields:[{bits:`0-${i*8-1}`,name:`Partial Data`,value:`${i} bytes - attempting to decode as AppData`,binary:`${i} bytes (${i*8} bits)`}]}),K(e,t,n)}catch(n){e.push({name:`ADVERT Parse Error`,byteRange:`N/A`,hexData:t.slice(0,32)+`...`,description:`Failed to parse ADVERT payload structure`,fields:[{bits:`N/A`,name:`Error`,value:`Parse error: ${n instanceof Error?n.message:`Unknown error`}`,binary:`Invalid`}]})}},K=(e,t,n)=>{try{let r=t.length/2;e.push({name:`AppData`,byteRange:`${n/2}-${n/2+r-1}`,hexData:t.match(/.{2}/g)?.join(` `)||t,description:`Node advertisement application data (${r} bytes)`,fields:[{bits:`0-${r*8-1}`,name:`Application Data`,value:`${r} bytes (contains flags, location, name, etc.)`,binary:`${r} bytes (${r*8} bits)`}]});let i=0;if(t.length>=2){let r=parseInt(t.slice(i,i+2),16),a=[],o=!!(r&16),s=!!(r&32),c=!!(r&64),l=!!(r&128);if(r&1&&a.push(`is chat node`),r&2&&a.push(`is repeater`),r&4&&a.push(`is room server`),r&8&&a.push(`is sensor`),o&&a.push(`has location`),s&&a.push(`has feature 1`),c&&a.push(`has feature 2`),l&&a.push(`has name`),e.push({name:`AppData Flags`,byteRange:`${(n+i)/2}`,hexData:`0x${t.slice(i,i+2)}`,description:`Flags indicating which optional fields are present`,fields:[{bits:`0-7`,name:`Flags`,value:a.join(`, `)||`none`,binary:r.toString(2).padStart(8,`0`)}]}),i+=2,o&&t.length>=i+16){let r=t.slice(i,i+8),a=[];for(let e=6;e>=0;e-=2)a.push(r.slice(e,e+2));let o=parseInt(a.join(``),16),s=o>2147483647?o-4294967296:o,c=s/1e6,l=t.slice(i+8,i+16),u=[];for(let e=6;e>=0;e-=2)u.push(l.slice(e,e+2));let d=parseInt(u.join(``),16),f=d>2147483647?d-4294967296:d,p=f/1e6;e.push({name:`Location Data`,byteRange:`${(n+i)/2}-${(n+i+15)/2}`,hexData:`${r.match(/.{2}/g)?.join(` `)||r} ${l.match(/.{2}/g)?.join(` `)||l}`,description:`GPS coordinates (latitude and longitude)`,fields:[{bits:`0-31`,name:`Latitude`,value:`${c.toFixed(6)}° (raw: ${s})`,binary:s.toString(2).padStart(32,`0`)},{bits:`32-63`,name:`Longitude`,value:`${p.toFixed(6)}° (raw: ${f})`,binary:f.toString(2).padStart(32,`0`)}]}),i+=16}if(s&&t.length>=i+4){let r=t.slice(i,i+4),a=parseInt(r,16);e.push({name:`Feature 1`,byteRange:`${(n+i)/2}-${(n+i+3)/2}`,hexData:r.match(/.{2}/g)?.join(` `)||r,description:`Reserved feature 1 (2 bytes)`,fields:[{bits:`0-15`,name:`Feature 1 Value`,value:`${a}`,binary:a.toString(2).padStart(16,`0`)}]}),i+=4}if(c&&t.length>=i+4){let r=t.slice(i,i+4),a=parseInt(r,16);e.push({name:`Feature 2`,byteRange:`${(n+i)/2}-${(n+i+3)/2}`,hexData:r.match(/.{2}/g)?.join(` `)||r,description:`Reserved feature 2 (2 bytes)`,fields:[{bits:`0-15`,name:`Feature 2 Value`,value:`${a}`,binary:a.toString(2).padStart(16,`0`)}]}),i+=4}if(l&&t.length>i){let r=t.slice(i),a=r.match(/.{2}/g)||[],o=a.map(e=>{let t=parseInt(e,16);return t>=32&&t<=126?String.fromCharCode(t):`.`}).join(``).replace(/\.+$/,``);e.push({name:`Node Name`,byteRange:`${(n+i)/2}-${(n+t.length-1)/2}`,hexData:r.match(/.{2}/g)?.join(` `)||r,description:`Node name string (${a.length} bytes)`,fields:[{bits:`0-${a.length*8-1}`,name:`Node Name`,value:`"${o}"`,binary:`ASCII text (${a.length} bytes)`}]})}}}catch(n){e.push({name:`AppData Parse Error`,byteRange:`N/A`,hexData:t.slice(0,Math.min(32,t.length)),description:`Failed to parse AppData structure`,fields:[{bits:`N/A`,name:`Error`,value:`Parse error: ${n instanceof Error?n.message:`Unknown error`}`,binary:`Invalid`}]})}},q=e=>{if(!e)return[];if(Array.isArray(e))return e;if(typeof e==`string`)try{return JSON.parse(e)}catch{return[]}return[]},ar=e=>{let t=j(e),n=j(w.localHash);return!t||!n?!1:n.startsWith(t)||t.startsWith(n)},or=(e,t,n)=>n?{name:`This repeater`,matchDetail:``,matchConfidence:null,matchCandidates:[]}:t?{name:t.name,matchDetail:`${t.confidencePercent}% key match`,matchConfidence:t.confidencePercent,matchCandidates:t.candidates}:{name:`Unknown contact`,matchDetail:``,matchConfidence:null,matchCandidates:[]},J=e=>{let t=q(e.original_path),n=q(e.forwarded_path),r=Math.max(t.length,n.length);return Array.from({length:r},(r,i)=>{let a=t[i]||``,o=n[i]||``,s=a.toUpperCase(),c=o.toUpperCase(),l=!!s,u=!!c,d=l&&u&&s===c,f=c||s,p=e.transmitted&&u&&n.length>0&&i===n.length-1,m=ar(f)||p,h=or(f,I(f),m);return{hop:i+1,hash:f,name:h.name,matchDetail:h.matchDetail,matchConfidence:h.matchConfidence,matchCandidates:h.matchCandidates,seen:s,relayed:c,seenName:I(s)?.name??null,relayedName:I(c)?.name??null,isUnchanged:d,changedFromSeen:l&&u&&!d,status:l&&u?d?`unchanged`:`rewritten`:l?`seen-only`:`relayed-only`,localMatch:m}})},Y=(e,t)=>e!=null&&e<100&&t.length>1,X=e=>{let t=J(e).map(e=>e.matchConfidence).filter(e=>e!=null);return t.length===0?null:Math.max(...t)},sr=e=>J(e).some(e=>e.matchConfidence!=null&&e.matchConfidence<50),cr=(e,t)=>t?`text-accent-cyan`:e==null?`text-content-muted`:e>=80?`text-accent-green`:e>=50?`text-accent-amber`:`text-accent-red`,lr=(e,t)=>t?`bg-accent-cyan/opacity-heavy`:e==null?`bg-stroke-subtle`:e>=80?`bg-accent-green/opacity-heavy`:e>=50?`bg-accent-amber/opacity-heavy`:`bg-accent-red/opacity-heavy`,ur=(e,t)=>t?`100%`:e==null?`20%`:`${Math.max(8,e)}%`,dr=(e,t)=>t?`border-accent-cyan text-accent-cyan`:e==null?`border-stroke-subtle text-content-muted`:e>=80?`border-accent-green text-accent-green`:e>=50?`border-accent-amber text-accent-amber`:`border-accent-red text-accent-red`,fr=e=>{let t=[];if(!e)return t;try{let n=e.raw_packet;if(n){let e=n.replace(/\s+/g,``).toUpperCase(),r=0;if(e.length>=2){let n=e.slice(r,r+2),i=parseInt(n,16),a=i&3,o=(i&60)>>2,s=(i&192)>>6;if(t.push({name:`Header`,byteRange:`0`,hexData:`0x${n}`,description:`Contains routing type, payload type, and payload version`,fields:[{bits:`0-1`,name:`Route Type`,value:{0:`Transport Flood`,1:`Flood`,2:`Direct`,3:`Transport Direct`}[a]||`Unknown`,binary:a.toString(2).padStart(2,`0`)},{bits:`2-5`,name:`Payload Type`,value:{0:`REQ`,1:`RESPONSE`,2:`TXT_MSG`,3:`ACK`,4:`ADVERT`,5:`GRP_TXT`,6:`GRP_DATA`,7:`ANON_REQ`,8:`PATH`,9:`TRACE`,10:`MULTIPART`,15:`RAW_CUSTOM`}[o]||`Unknown`,binary:o.toString(2).padStart(4,`0`)},{bits:`6-7`,name:`Version`,value:s.toString(),binary:s.toString(2).padStart(2,`0`)}]}),r+=2,(a===0||a===3)&&e.length>=r+8){let n=e.slice(r,r+8),i=parseInt(n.slice(0,4),16),a=parseInt(n.slice(4,8),16);t.push({name:`Transport Codes`,byteRange:`1-4`,hexData:`${n.slice(0,4)} ${n.slice(4,8)}`,description:`2x 16-bit transport codes for routing optimization`,fields:[{bits:`0-15`,name:`Code 1`,value:i.toString(),binary:i.toString(2).padStart(16,`0`)},{bits:`16-31`,name:`Code 2`,value:a.toString(),binary:a.toString(2).padStart(16,`0`)}]}),r+=8}if(e.length>=r+2){let n=e.slice(r,r+2),i=parseInt(n,16),a=(i>>6)+1,o=i&63,s=o*a;if(t.push({name:`Path Length`,byteRange:`${r/2}`,hexData:`0x${n}`,description:`${o} hop${o===1?``:`s`}, ${a}-byte hash${a>1?`es`:``} (${s} bytes)`,fields:[{bits:`6-7`,name:`Hash Size`,value:`${a}-byte`,binary:(i>>6&3).toString(2).padStart(2,`0`)},{bits:`0-5`,name:`Hop Count`,value:`${o}`,binary:(i&63).toString(2).padStart(6,`0`)}]}),r+=2,s>0&&e.length>=r+s*2){let n=e.slice(r,r+s*2),i=RegExp(`.{${a*2}}`,`g`),c=n.match(i)||[];t.push({name:`Path Data`,byteRange:`${r/2}-${(r+s*2-2)/2}`,hexData:c.join(` `)||n,description:`${o} × ${a}-byte routing hash${o===1?``:`es`}`,fields:c.map((e,t)=>({bits:`${t*a*8}-${(t+1)*a*8-1}`,name:`Hop ${t+1}`,value:e.toUpperCase(),binary:`${a} byte${a>1?`s`:``}`}))}),r+=s*2}}if(e.length>r){let n=e.slice(r),i=n.length/2;o===4?G(t,n,r):t.push({name:`Payload Data`,byteRange:`${r/2}-${r/2+i-1}`,hexData:n.match(/.{2}/g)?.join(` `)||n,description:`Application data content`,fields:[{bits:`0-${i*8-1}`,name:`Application Data`,value:`${i} bytes`,binary:`${i} bytes (${i*8} bits)`}]})}}}else{if(e.header){let n=e.header.replace(/0x/gi,``).replace(/\s+/g,``).toUpperCase(),r=parseInt(n,16),i=r&3,a=(r&60)>>2,o=(r&192)>>6;t.push({name:`Header`,byteRange:`0`,hexData:`0x${n}`,description:`Contains routing type, payload type, and payload version`,fields:[{bits:`0-1`,name:`Route Type`,value:{0:`Transport Flood`,1:`Flood`,2:`Direct`,3:`Transport Direct`}[i]||`Unknown`,binary:i.toString(2).padStart(2,`0`)},{bits:`2-5`,name:`Payload Type`,value:{0:`REQ`,1:`RESPONSE`,2:`TXT_MSG`,3:`ACK`,4:`ADVERT`,5:`GRP_TXT`,6:`GRP_DATA`,7:`ANON_REQ`,8:`PATH`,9:`TRACE`,10:`MULTIPART`,15:`RAW_CUSTOM`}[a]||`Unknown`,binary:a.toString(2).padStart(4,`0`)},{bits:`6-7`,name:`Version`,value:o.toString(),binary:o.toString(2).padStart(2,`0`)}]}),e.transport_codes&&t.push({name:`Transport Codes`,byteRange:`1-4`,hexData:e.transport_codes,description:`2x 16-bit transport codes for routing optimization`,fields:[{bits:`0-31`,name:`Transport Codes`,value:e.transport_codes,binary:`Available in separate field`}]}),e.original_path&&e.original_path.length>0&&t.push({name:`Original Path`,byteRange:`?`,hexData:e.original_path.join(` `),description:`Original routing path (${e.original_path.length} nodes)`,fields:[{bits:`0-?`,name:`Path Nodes`,value:`${e.original_path.length} nodes`,binary:`Available as node list`}]}),e.forwarded_path&&e.forwarded_path.length>0&&t.push({name:`Forwarded Path`,byteRange:`?`,hexData:e.forwarded_path.join(` `),description:`Forwarded routing path (${e.forwarded_path.length} nodes)`,fields:[{bits:`0-?`,name:`Path Nodes`,value:`${e.forwarded_path.length} nodes`,binary:`Available as node list`}]})}if(e.payload){let n=e.payload.replace(/\s+/g,``).toUpperCase(),r=n.length/2;e.type===4?G(t,n,0):t.push({name:`Payload Data`,byteRange:`0-${r-1}`,hexData:n.match(/.{2}/g)?.join(` `)||n,description:`Application data content (${r} bytes)`,fields:[{bits:`0-${r*8-1}`,name:`Application Data`,value:`${r} bytes`,binary:`${r} bytes (${r*8} bits)`}]})}}}catch{t.push({name:`Parse Error`,byteRange:`N/A`,hexData:`Error`,description:`Unable to parse packet structure`,fields:[{bits:`N/A`,name:`Error`,value:`Parse failed`,binary:`Invalid`}]})}return t},Z=(e,t)=>e==null||t==null?`text-content-muted`:C(t).color,Q=e=>{if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}},$=e=>e>=1e3?`${(e/1e3).toFixed(2)}s`:`${Math.round(e)}ms`,pr=e=>{if(e.key===`Escape`){T(`close`);return}if(e.key===`ArrowUp`){z.value&&(e.preventDefault(),T(`previous`));return}e.key===`ArrowDown`&&B.value&&(e.preventDefault(),T(`next`))},mr=e=>{e.target===e.currentTarget&&T(`close`)};return d(()=>w.isOpen,e=>{e?(document.body.style.overflow=`hidden`,Wn()&&Gn()):document.body.style.overflow=``},{immediate:!0}),d(()=>w.packet?.packet_hash,()=>{P.value=[]}),(r,d)=>(n(),o(u,{to:`body`},[p(te,{name:`modal`,appear:``},{default:t(()=>[c.isOpen&&c.packet?(n(),v(`div`,{key:0,class:`modal-backdrop overflow-hidden !p-2 sm:!p-4`,onClick:mr,onKeydown:pr,tabindex:`0`},[_(`div`,{class:`relative w-full max-w-4xl max-h-[95vh] sm:max-h-[90vh] flex flex-col`,onClick:d[3]||=ee(()=>{},[`stop`])},[_(`div`,ie,[_(`div`,ae,[_(`div`,oe,[d[4]||=_(`h2`,{class:`text-lg sm:text-2xl font-bold text-content-primary mb-1`},` Packet Details `,-1),_(`div`,se,[_(`span`,ce,a(U(c.packet.type)),1),_(`span`,le,a(W(c.packet.route)),1)])]),_(`div`,ue,[Yn.value?(n(),v(`div`,de,[_(`div`,fe,[_(`button`,{type:`button`,class:`w-8 h-8 flex items-center justify-center text-content-secondary dark:text-content-muted hover:text-primary hover:bg-primary/opacity-light transition-colors disabled:opacity-40 disabled:cursor-not-allowed`,disabled:!z.value,title:`Previous packet (↑)`,onClick:nr},[...d[5]||=[_(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 15l7-7 7 7`})],-1)]],8,pe),_(`button`,{type:`button`,class:`w-8 h-8 flex items-center justify-center text-content-secondary dark:text-content-muted hover:text-primary hover:bg-primary/opacity-light transition-colors border-l border-stroke-subtle dark:border-stroke/opacity-medium disabled:opacity-40 disabled:cursor-not-allowed`,disabled:!B.value,title:`Next packet (↓)`,onClick:rr},[...d[6]||=[_(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 9l-7 7-7-7`})],-1)]],8,me)]),_(`span`,he,a(Xn.value),1)])):f(``,!0),_(`button`,{onClick:d[0]||=e=>E.value=!E.value,class:l([`flex-1 sm:flex-none flex items-center justify-center gap-2 px-3 py-2 rounded-lg transition-all duration-200`,E.value?`bg-accent-cyan/opacity-medium border border-accent-cyan/opacity-medium text-accent-cyan`:`bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-medium text-content-secondary dark:text-content-muted`]),title:E.value?`Hide binary values`:`Show binary values`},[...d[7]||=[_(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4`})],-1),_(`span`,{class:`text-xs font-medium`},`Binary`,-1)]],10,ge),_(`button`,{type:`button`,onClick:d[1]||=e=>T(`close`),"aria-label":`Close packet details`,title:`Close`,class:`w-9 h-9 flex items-center justify-center rounded-lg bg-background-mute dark:bg-white/opacity-light hover:bg-stroke-subtle dark:hover:bg-white/opacity-medium transition-colors duration-200 text-content-secondary dark:text-content-primary hover:text-content-primary dark:hover:text-content-primary`},[...d[8]||=[_(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])])]),_(`div`,_e,[_(`div`,ve,[d[15]||=_(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-4 flex items-center`},[_(`div`,{class:`w-2 h-2 rounded-full bg-accent-cyan/opacity-light mr-3`}),h(` Basic Information `)],-1),_(`div`,ye,[_(`div`,be,[_(`div`,xe,[_(`div`,Se,[d[9]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Timestamp`,-1),_(`span`,Ce,a(L(c.packet.timestamp)),1)]),_(`div`,we,[d[10]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Packet Hash`,-1),_(`span`,Te,a(c.packet.packet_hash),1)]),c.packet.header?(n(),v(`div`,Ee,[d[11]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Header`,-1),_(`span`,De,a(c.packet.header),1)])):f(``,!0)]),_(`div`,Oe,[_(`div`,ke,[d[12]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Type`,-1),_(`span`,Ae,a(c.packet.type)+` (`+a(U(c.packet.type))+`)`,1)]),_(`div`,je,[d[13]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Route`,-1),_(`span`,Me,a(c.packet.route)+` (`+a(W(c.packet.route))+`)`,1)]),_(`div`,x,[d[14]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Status`,-1),_(`span`,{class:l([`font-semibold`,Jn(c.packet)])},a(R(c.packet)),3)])])])])]),H.value.length>0?(n(),v(`div`,Ne,[_(`h3`,Pe,[d[16]||=_(`div`,{class:`w-2 h-2 rounded-full bg-accent-amber/opacity-heavy mr-3`},null,-1),h(` Linked Duplicates (`+a(H.value.length)+`) `,1)]),_(`div`,Fe,[(n(!0),v(g,null,e(H.value,(t,r)=>(n(),v(`div`,{key:`${t.packet.packet_hash}_${t.packet.timestamp}_${r}`,class:`glass-card bg-background-mute dark:bg-white/opacity-subtle rounded-[10px] p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},[_(`div`,Ie,[_(`span`,Le,` Duplicate #`+a(r+1),1),_(`span`,Re,a(L(t.packet.timestamp)),1)]),_(`div`,ze,[d[17]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-xs`},` Path `,-1),_(`span`,Be,a(t.effectivePath),1)]),t.differences.length>0?(n(),v(`div`,Ve,[(n(!0),v(g,null,e(t.differences,e=>(n(),v(`div`,{key:`${t.packet.timestamp}_${e.label}`,class:`flex flex-wrap items-start justify-between gap-2 py-1 border-b border-stroke-subtle/60 dark:border-stroke/opacity-light last:border-b-0`},[_(`span`,He,a(e.label),1),_(`span`,Ue,a(e.currentValue)+` → `+a(e.duplicateValue),1)]))),128))])):(n(),v(`p`,We,` No additional field differences beyond timestamp. `))]))),128))])])):f(``,!0),_(`div`,Ge,[d[29]||=_(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-4 flex items-center`},[_(`div`,{class:`w-2 h-2 rounded-full bg-accent-orange/opacity-light mr-3`}),h(` Payload Data `)],-1),_(`div`,Ke,[_(`div`,qe,[_(`div`,Je,[d[18]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Payload Length`,-1),_(`span`,Ye,a(c.packet.payload_length||c.packet.length)+` bytes`,1)]),c.packet.payload?(n(),v(`div`,Xe,[d[27]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-3`},` Payload Analysis `,-1),_(`div`,Ze,[d[19]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-2 font-semibold`},` Raw Hex Data `,-1),_(`div`,Qe,[_(`pre`,$e,a(ir(c.packet.payload)),1)])]),(n(!0),v(g,null,e(fr(c.packet).filter(e=>!e.name.includes(`Parse Error`)&&![`Path Length`,`Path Data`,`Original Path`,`Forwarded Path`].includes(e.name)),(t,r)=>(n(),v(`div`,{key:r,class:`mb-4`},[_(`div`,et,[_(`h4`,tt,a(t.name),1),_(`span`,nt,`Bytes `+a(t.byteRange),1)]),_(`div`,rt,[_(`div`,it,a(t.hexData),1)]),_(`div`,at,[_(`div`,{class:l([`hidden md:grid gap-3 p-3 bg-background-mute dark:bg-white/opacity-subtle text-content-secondary dark:text-content-muted text-xs font-semibold uppercase tracking-wide`,E.value?`grid-cols-4`:`grid-cols-3`])},[d[20]||=_(`div`,{class:`min-w-0`},`Bits`,-1),d[21]||=_(`div`,{class:`min-w-0`},`Field`,-1),d[22]||=_(`div`,{class:`min-w-0`},`Value`,-1),E.value?(n(),v(`div`,ot,`Binary`)):f(``,!0)],2),(n(!0),v(g,null,e(t.fields,(e,t)=>(n(),v(`div`,{key:t,class:l([`hidden md:grid gap-3 p-3 border-b border-stroke-subtle dark:border-stroke/opacity-light last:border-b-0 hover:bg-background-mute dark:hover:bg-stroke/opacity-subtle transition-colors`,E.value?`grid-cols-4`:`grid-cols-3`])},[_(`div`,st,a(e.bits),1),_(`div`,ct,a(e.name),1),_(`div`,lt,[_(`span`,{class:`block`,title:e.value},a(e.value),9,ut)]),E.value?(n(),v(`div`,dt,[_(`span`,{class:`block`,title:e.binary},a(e.binary),9,ft)])):f(``,!0)],2))),128)),(n(!0),v(g,null,e(t.fields,(e,t)=>(n(),v(`div`,{key:`mobile-${t}`,class:`md:hidden p-3 border-b border-stroke-subtle dark:border-stroke/opacity-light last:border-b-0 space-y-2`},[_(`div`,pt,[_(`div`,null,[d[23]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-xs uppercase tracking-wide`},`Bits:`,-1),_(`div`,mt,a(e.bits),1)]),_(`div`,null,[d[24]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-xs uppercase tracking-wide`},`Field:`,-1),_(`div`,ht,a(e.name),1)])]),_(`div`,null,[d[25]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-xs uppercase tracking-wide`},`Value:`,-1),_(`div`,{class:`text-content-primary text-sm font-semibold break-all`,title:e.value},a(e.value),9,gt)]),E.value?(n(),v(`div`,_t,[d[26]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-xs uppercase tracking-wide`},`Binary:`,-1),_(`div`,{class:`text-accent-orange text-xs font-mono break-all`,title:e.binary},a(e.binary),9,vt)])):f(``,!0)]))),128))]),t.description?(n(),v(`div`,yt,a(t.description),1)):f(``,!0)]))),128))])):(n(),v(`div`,bt,[...d[28]||=[_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Payload:`,-1),_(`span`,{class:`text-content-muted ml-2`},`None`,-1)]]))])])]),_(`div`,xt,[d[33]||=_(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-4 flex items-center`},[_(`div`,{class:`w-2 h-2 rounded-full status-dot-secondary mr-3`}),h(` Path Information `)],-1),_(`div`,St,[_(`div`,Ct,[_(`div`,wt,[_(`div`,Tt,[d[30]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Source Hash`,-1),_(`span`,{class:l([`text-content-primary font-mono text-xs`,w.localHash&&c.packet.src_hash===w.localHash?`bg-accent-cyan/opacity-medium text-accent-cyan px-1 rounded`:``])},a(c.packet.src_hash||`Unknown`),3)]),_(`div`,Et,[d[31]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Destination Hash`,-1),_(`span`,{class:l([`text-content-primary font-mono text-xs`,w.localHash&&c.packet.dst_hash===w.localHash?`bg-accent-cyan/opacity-medium text-accent-cyan px-1 rounded`:``])},a(c.packet.dst_hash||`Broadcast`),3)])]),J(c.packet).length>0?(n(),v(`div`,Dt,[_(`div`,Ot,[d[32]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm font-medium`},` Repeater Path View `,-1),_(`span`,kt,a(J(c.packet).length)+` hops `,1),X(c.packet)==null?f(``,!0):(n(),v(`span`,At,` Best match `+a(X(c.packet))+`% `,1)),sr(c.packet)?(n(),v(`span`,jt,` Low confidence `)):f(``,!0),O.value?(n(),v(`span`,Mt,` Resolving names... `)):f(``,!0)]),_(`div`,Nt,[_(`div`,Pt,[(n(!0),v(g,null,e(J(c.packet),(t,r)=>(n(),v(`div`,{key:`timeline-${t.hop}`,class:`relative z-10 grid grid-cols-[42px_1fr] sm:grid-cols-[52px_1fr] gap-3 items-center`},[_(`div`,Ft,[r>0?(n(),v(`div`,It)):f(``,!0),rKn(t.hop)},a(F(t.hop)?`Hide possible matches`:`Show ${t.matchCandidates.length-1} possible matches`),9,Ht)):t.localMatch?(n(),v(`div`,Ut,` current repeater `)):f(``,!0),Y(t.matchConfidence,t.matchCandidates)&&F(t.hop)?(n(),v(`div`,Wt,[(n(!0),v(g,null,e(t.matchCandidates.slice(1),(e,r)=>(n(),v(`div`,{key:`${t.hop}-${e.pubkey}-${r}`,class:`flex items-center justify-between gap-2 text-[10px] sm:text-[11px] rounded-md px-2 py-1 bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light`},[_(`span`,Gt,a(e.name),1),_(`span`,Kt,a(qn(e.pubkey)),1)]))),128))])):f(``,!0)]),_(`div`,{class:l([`font-mono text-sm sm:text-lg rounded-[10px] px-3 sm:px-4 py-1.5 sm:py-2 border min-w-[64px] sm:min-w-[84px] text-center`,t.hash?t.localMatch?`bg-accent-cyan/opacity-medium border-accent-cyan/opacity-heavy text-accent-cyan`:`bg-background-mute dark:bg-white/opacity-subtle border-primary/opacity-heavy text-content-primary`:`bg-background-mute/opacity-heavy border-stroke-subtle text-content-muted`]),title:t.hash||`No hop`},a(t.hash||`-`),11,qt)]),_(`div`,Jt,[_(`div`,Yt,[_(`div`,{class:l([`h-full rounded-full transition-all duration-300`,lr(t.matchConfidence,t.localMatch)]),style:s({width:ur(t.matchConfidence,t.localMatch)})},null,6)])])])]))),128))])])])):f(``,!0)])])]),_(`div`,Xt,[d[50]||=_(`h3`,{class:`text-base sm:text-lg font-semibold text-content-primary mb-4 flex items-center`},[_(`div`,{class:`w-2 h-2 rounded-full bg-accent-green/opacity-light mr-3`}),h(` Signal & Processing `)],-1),_(`div`,Zt,[_(`div`,Qt,[_(`div`,$t,[d[34]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` RSSI `,-1),_(`div`,en,a(typeof c.packet.rssi==`number`?c.packet.rssi:`N/A`),1),d[35]||=_(`div`,{class:`text-content-muted text-xs`},`dBm`,-1)]),_(`div`,tn,[d[36]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` SNR `,-1),_(`div`,{class:l([`text-lg font-bold`,Z(c.packet.snr,c.packet.rssi)])},a(typeof c.packet.snr==`number`?c.packet.snr.toFixed(1):`N/A`),3),d[37]||=_(`div`,{class:`text-content-muted text-xs`},`dB`,-1)]),_(`div`,nn,[d[38]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` Score `,-1),_(`div`,rn,a(typeof c.packet.score==`number`?c.packet.score.toFixed(3):`N/A`),1)])]),c.packet.rssi==null?(n(),v(`div`,sn,[...d[40]||=[_(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-2`},` Signal Quality `,-1),_(`div`,{class:`text-content-muted text-sm italic`},` N/A (TX Packet) `,-1)]])):(n(),v(`div`,an,[d[39]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-2`},` Signal Quality `,-1),_(`div`,on,[p(re,{bars:i(C)(c.packet.rssi).bars,color:i(C)(c.packet.rssi).color},null,8,[`bars`,`color`]),_(`span`,{class:l([`text-sm font-medium`,i(C)(c.packet.rssi).color])},a(i(C)(c.packet.rssi).quality),3)])])),c.packet.is_trace&&c.packet.path_snr_details&&c.packet.path_snr_details.length>0?(n(),v(`div`,cn,[_(`div`,ln,` Path SNR Details (`+a(c.packet.path_snr_details.length)+` hops) `,1),_(`div`,un,[(n(!0),v(g,null,e(c.packet.path_snr_details,(e,t)=>(n(),v(`div`,{key:t,class:`flex items-center justify-between p-2 glass-card bg-background-mute dark:bg-white/opacity-subtle rounded-[8px]`},[_(`div`,dn,[_(`span`,fn,a(t+1)+`.`,1),_(`span`,{class:l([`font-mono text-xs text-content-primary`,w.localHash&&e.hash===w.localHash?`bg-accent-cyan/opacity-medium text-accent-cyan px-1 rounded`:``])},a(e.hash.toUpperCase()),3)]),_(`span`,{class:l([`text-sm font-bold`,Z(e.snr_db,null)])},a(e.snr_db.toFixed(1))+`dB `,3)]))),128))])])):f(``,!0),c.packet.transmitted&&c.packet.lbt_attempts!==void 0?(n(),v(`div`,S,[d[45]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-3 flex items-center`},[_(`svg`,{class:`w-4 h-4 mr-2`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[_(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z`})]),h(` Listen Before Talk (LBT) Metrics `)],-1),_(`div`,pn,[_(`div`,mn,[d[41]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` CAD Attempts `,-1),_(`div`,hn,a(c.packet.lbt_attempts),1)]),_(`div`,gn,[d[42]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` Total LBT Delay `,-1),_(`div`,_n,a($(Q(c.packet.lbt_backoff_delays_ms).reduce((e,t)=>e+t,0))),1),_(`div`,vn,a(Q(c.packet.lbt_backoff_delays_ms).length)+` backoffs `,1)]),_(`div`,yn,[d[43]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` Channel Status `,-1),_(`div`,{class:l([`text-lg font-bold`,c.packet.lbt_channel_busy?`text-accent-amber`:`text-accent-green`])},a(c.packet.lbt_channel_busy?`BUSY`:`CLEAR`),3),_(`div`,bn,a(c.packet.lbt_channel_busy?`Waited for clear`:`Immediate TX`),1)])]),Q(c.packet.lbt_backoff_delays_ms).length>0?(n(),v(`div`,xn,[d[44]||=_(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-3 font-semibold`},` Backoff Pattern (Exponential with Jitter) `,-1),_(`div`,Sn,[(n(!0),v(g,null,e(Q(c.packet.lbt_backoff_delays_ms),(e,t)=>(n(),v(`div`,{key:t,class:`flex items-center gap-3`},[_(`div`,Cn,[_(`span`,wn,`Attempt `+a(t+1),1)]),_(`div`,Tn,[_(`div`,En,[_(`div`,{class:l([`h-full rounded-lg transition-all duration-300`,[t===0?`bg-gradient-to-r from-cyan-500/50 to-cyan-600/50`:t===1?`bg-gradient-to-r from-yellow-500/50 to-yellow-600/50`:t===2?`bg-gradient-to-r from-orange-500/50 to-orange-600/50`:`bg-gradient-to-r from-red-500/50 to-red-600/50`]]),style:s({width:`${Math.min(100,e/Math.max(...Q(c.packet.lbt_backoff_delays_ms))*100)}%`})},[_(`div`,Dn,[_(`span`,On,a($(e)),1)])],6)])]),_(`div`,kn,[_(`span`,An,a(Math.round(e/Q(c.packet.lbt_backoff_delays_ms).reduce((e,t)=>e+t,0)*100))+`% `,1)])]))),128))])])):f(``,!0)])):f(``,!0),_(`div`,jn,[_(`div`,Mn,[_(`div`,Nn,[d[46]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`TX Delay`,-1),_(`span`,Pn,a(Number(c.packet.tx_delay_ms)>0?Number(c.packet.tx_delay_ms).toFixed(1)+`ms`:`-`),1)]),_(`div`,Fn,[d[47]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Transmitted`,-1),_(`span`,{class:l(c.packet.transmitted?`text-accent-green`:`text-accent-red`)},a(c.packet.transmitted?`Yes`:`No`),3)])]),_(`div`,In,[_(`div`,Ln,[d[48]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Is Duplicate`,-1),_(`span`,{class:l(c.packet.is_duplicate?`text-accent-amber`:`text-content-muted`)},a(c.packet.is_duplicate?`Yes`:`No`),3)]),c.packet.drop_reason?(n(),v(`div`,Rn,[d[49]||=_(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`Drop Reason`,-1),_(`span`,zn,a(c.packet.drop_reason),1)])):f(``,!0)])])])])]),_(`div`,Bn,[_(`button`,{type:`button`,onClick:d[2]||=e=>T(`close`),"aria-label":`Close packet details`,class:`w-full sm:w-auto px-6 py-2 bg-gradient-to-r from-cyan-500/20 to-cyan-400/20 hover:from-cyan-500/30 hover:to-cyan-400/30 border border-accent-cyan/opacity-medium rounded-[10px] text-content-primary transition-all duration-200 backdrop-blur-sm`},` Close `)])])])],32)):f(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-e95d3629`]]);export{C as t}; \ No newline at end of file diff --git a/repeater/web/html/assets/PacketDetailsModal-DOmYHvNq.css b/repeater/web/html/assets/PacketDetailsModal-DOmYHvNq.css deleted file mode 100644 index 0322205..0000000 --- a/repeater/web/html/assets/PacketDetailsModal-DOmYHvNq.css +++ /dev/null @@ -1 +0,0 @@ -.modal-enter-active[data-v-1119acac]{transition:all .3s cubic-bezier(.4,0,.2,1)}.modal-leave-active[data-v-1119acac]{transition:all .2s ease-in}.modal-enter-from[data-v-1119acac]{opacity:0;transform:scale(.95)translateY(-10px)}.modal-leave-to[data-v-1119acac]{opacity:0;transform:scale(1.05)}.custom-scrollbar[data-v-1119acac]{scrollbar-width:thin;scrollbar-color:color-mix(in srgb, var(--color-surface) 35%, transparent) transparent}.custom-scrollbar[data-v-1119acac]::-webkit-scrollbar{width:6px}.custom-scrollbar[data-v-1119acac]::-webkit-scrollbar-track{background:color-mix(in srgb, var(--color-surface) 12%, transparent);border-radius:3px}.custom-scrollbar[data-v-1119acac]::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--color-surface) 35%, transparent);border-radius:3px}.custom-scrollbar[data-v-1119acac]::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb, var(--color-surface) 45%, transparent)}.glass-card[data-v-1119acac]{-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px)} diff --git a/repeater/web/html/assets/RfHealthCorrelation-ByArBbzJ.js b/repeater/web/html/assets/RfHealthCorrelation-Hq8s45i4.js similarity index 99% rename from repeater/web/html/assets/RfHealthCorrelation-ByArBbzJ.js rename to repeater/web/html/assets/RfHealthCorrelation-Hq8s45i4.js index 3ac49a9..315b1d4 100644 --- a/repeater/web/html/assets/RfHealthCorrelation-ByArBbzJ.js +++ b/repeater/web/html/assets/RfHealthCorrelation-Hq8s45i4.js @@ -1 +1 @@ -import{C as e,D as t,K as n,N as r,P as i,T as a,U as o,X as s,_t as c,c as l,h as u,ht as d,i as f,j as p,l as m,m as h,o as g,p as _,r as v,s as y,u as b,x,y as ee,z as S}from"./runtime-core.esm-bundler-CINEgm0a.js";import{a as te,l as C,t as w}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as T}from"./api-CP9MgmUS.js";import{d as E,t as ne}from"./index-Cl4Dij8v.js";import{_ as D,a as O,d as re,f as ie,g as ae,i as k,l as A,m as j,n as M,o as oe,s as N,t as P,u as F,v as se,y as I}from"./ChartCard-DSqBTrdz.js";import{t as L}from"./PacketDetailsModal-CeDGHosS.js";import"./chartjs-adapter-date-fns.esm-DfIbzYql.js";var R={class:`bg-gradient-to-r from-accent-amber/20 to-accent-red/20 border-b border-stroke-subtle dark:border-stroke/opacity-light px-6 py-4`},z={class:`flex items-center justify-between`},B={class:`flex items-center gap-3`},V={class:`text-sm text-content-secondary dark:text-content-muted`},H={class:`max-h-[75vh] overflow-y-auto`},U={class:`px-6 py-4 space-y-6`},ce={class:`flex items-center gap-3`},W={class:`grid grid-cols-2 gap-4`},G={class:`bg-surface-primary rounded-lg p-4`},K={class:`text-content-primary font-medium`},q={class:`bg-surface-primary rounded-lg p-4`},J={class:`text-content-primary font-medium`},Y={class:`bg-surface-primary rounded-lg p-4`},le={class:`text-2xl text-content-primary font-semibold`},ue={class:`grid grid-cols-2 gap-4`},de={class:`bg-surface-primary rounded-lg p-4 border-l-4 border-accent-red`},fe={class:`text-3xl text-accent-red font-bold`},pe={class:`bg-surface-primary rounded-lg p-4 border-l-4 border-accent-amber`},me={class:`text-3xl text-accent-amber font-bold`},he={class:`bg-surface-primary rounded-lg p-4`},ge={class:`space-y-2 text-sm text-content-secondary`},X={class:`flex gap-2`},_e={class:`flex gap-2`},ve={class:`bg-surface-primary rounded-lg p-4`},Z={class:`flex items-center justify-between gap-3`},ye={class:`text-xs text-content-secondary mt-1`},be={class:`flex items-center gap-2`},xe=[`value`],Se={key:0,class:`text-sm text-content-secondary mt-3`},Ce={key:1,class:`text-sm text-accent-red mt-3`},we={key:2,class:`mt-3 space-y-3`},Q={class:`grid grid-cols-2 md:grid-cols-4 gap-2 text-xs`},Te={class:`rounded-md border border-stroke-subtle px-2 py-2`},Ee={class:`text-content-primary font-semibold`},De={class:`rounded-md border border-stroke-subtle px-2 py-2`},Oe={class:`text-content-primary font-semibold`},ke={class:`rounded-md border border-stroke-subtle px-2 py-2`},Ae={class:`text-content-primary font-semibold`},je={class:`rounded-md border border-stroke-subtle px-2 py-2`},Me={class:`text-content-primary font-semibold`},Ne={class:`text-xs text-content-secondary`},Pe={class:`grid grid-cols-1 md:grid-cols-2 gap-3`},Fe={class:`rounded-md border border-stroke-subtle p-3`},Ie={key:0,class:`text-xs text-content-secondary`},Le={key:1,class:`space-y-1.5`},Re={class:`font-medium text-content-primary`},ze={class:`rounded-md border border-stroke-subtle p-3`},Be={key:0,class:`text-xs text-content-secondary`},Ve={key:1,class:`space-y-1.5`},He=[`title`],Ue={class:`font-medium text-content-primary`},We={class:`glass-card border border-stroke-subtle dark:border-stroke rounded-xl overflow-hidden`},Ge={key:0,class:`px-3 py-3 text-sm text-content-secondary`},Ke={key:1,class:`max-h-56 overflow-y-auto`},qe={class:`md:col-span-2 text-content-secondary text-xs`},Je={class:`md:col-span-2 text-content-primary text-xs font-medium`},Ye=[`title`],Xe={class:`md:col-span-2 md:text-right`},Ze=[`onClick`],Qe={class:`border-t border-stroke-subtle dark:border-stroke/opacity-light px-6 py-4`},$e={class:`modal-actions`},et=E(u({__name:`IncidentDetailsModal`,props:{incident:{default:null}},emits:[`close`],setup(e,{emit:n}){let u=e,x=n,ee=Array.from({length:15},(e,t)=>t+1),S=o(10),E=o([]),ne=o(!1),D=o(null),O=o(null),re=o(!1),ie=e=>new Date(e).toLocaleString(`en-US`,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`}),ae=(e,t)=>{let n=Math.max(0,t-e),r=Math.floor(n/1e3),i=Math.floor(r/60),a=Math.floor(i/60);return a>0?`${a}h ${i%60}m`:i>0?`${i}m ${r%60}s`:`${r}s`},k=g(()=>{if(!u.incident)return null;let e=u.incident;return{startTime:ie(e.startMs),endTime:ie(e.endMs),duration:ae(e.startMs,e.endMs),peakNoise:e.peakNoiseDelta.toFixed(2),totalCrc:e.totalCrc.toLocaleString(),severityColor:e.severity===`high`?`bg-accent-red/opacity-light text-accent-red`:e.severity===`medium`?`bg-accent-amber/opacity-light text-accent-amber`:`bg-accent-green/opacity-light text-accent-green`}}),A=g(()=>u.incident?{startTs:Math.floor(u.incident.startMs/1e3)-S.value,endTs:Math.ceil(u.incident.endMs/1e3)+S.value,contextSeconds:S.value}:null),j=e=>e<1e10?e*1e3:e,M=e=>new Date(j(e)).toLocaleTimeString(`en-US`,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`}),oe=e=>({0:`REQ`,1:`RESP`,2:`MSG`,3:`ACK`,4:`ADVERT`,5:`GRP_TXT`,6:`GRP_DATA`,7:`ANON_REQ`,8:`PATH`,9:`TRACE`,10:`MP`,15:`CUSTOM`})[e]??`T${e}`,N=e=>({0:`Transport Flood`,1:`Flood`,2:`Direct`,3:`Transport Direct`})[e]??`Route ${e}`,P=e=>e.is_duplicate?`Duplicate`:!e.transmitted||e.drop_reason?`Dropped`:`Forwarded`,F=e=>{if(Array.isArray(e))return e.filter(e=>typeof e==`string`);if(typeof e==`string`)try{let t=JSON.parse(e);if(Array.isArray(t))return t.filter(e=>typeof e==`string`)}catch{return[]}return[]},se=e=>{let t=F(e.original_path).length,n=F(e.forwarded_path).length;return!t&&!n?`No path`:t&&n?`${t}->${n} hops`:`${Math.max(t,n)} hops`},I=g(()=>{let e=E.value,t=e.filter(e=>!e.transmitted||!!e.drop_reason).length,n=e.filter(e=>!!e.is_duplicate).length,r=e.filter(e=>F(e.original_path).length>0||F(e.forwarded_path).length>0).length,i=new Map;for(let t of e)t.drop_reason&&i.set(t.drop_reason,(i.get(t.drop_reason)??0)+1);let a=Array.from(i.entries()).sort((e,t)=>t[1]-e[1]).slice(0,3).map(([e,t])=>`${e} (${t})`);return{total:e.length,dropped:t,duplicates:n,withPath:r,topDropReasons:a}}),et=g(()=>[...E.value].sort((e,t)=>j(e.timestamp)-j(t.timestamp)).slice(0,20)),tt=e=>`${F(e.original_path).join(`>`)}|${F(e.forwarded_path).join(`>`)}`,$=g(()=>{let e=new Map,t=new Map;for(let n of E.value){let r=n.packet_hash||`unknown`,i=e.get(r)??{count:0,samples:[]};i.count+=1,i.samples.length<3&&i.samples.push(n),e.set(r,i);let a=tt(n);if(!a||a===`|`)continue;let o=t.get(a)??{count:0,samples:[]};o.count+=1,o.samples.length<3&&o.samples.push(n),t.set(a,o)}return{repeatedHashes:Array.from(e.entries()).filter(([,e])=>e.count>1).sort((e,t)=>t[1].count-e[1].count).slice(0,6).map(([e,t])=>({hash:e,count:t.count,samples:t.samples})),repeatedPaths:Array.from(t.entries()).filter(([,e])=>e.count>1).sort((e,t)=>t[1].count-e[1].count).slice(0,6).map(([e,t])=>({path:e,count:t.count,samples:t.samples}))}}),nt=async e=>{if(O.value=e,re.value=!0,e.packet_hash&&(!e.header||!e.raw_packet))try{let t=await T.get(`/packet_by_hash`,{packet_hash:e.packet_hash});t.data&&O.value?.packet_hash===e.packet_hash&&(O.value={...O.value,...t.data})}catch{}},rt=()=>{re.value=!1,O.value=null},it=async()=>{if(!A.value){E.value=[];return}ne.value=!0,D.value=null;try{let e=await T.get(`/filtered_packets`,{start_timestamp:A.value.startTs,end_timestamp:A.value.endTs,limit:250});E.value=Array.isArray(e.data)?e.data:[]}catch(e){E.value=[],D.value=e instanceof Error?e.message:`Failed to load packet context`}finally{ne.value=!1}};p(()=>u.incident?.id,async e=>{if(!e){E.value=[],D.value=null;return}await it()},{immediate:!0}),p(S,async()=>{u.incident&&await it()});let at=e=>{e.target===e.currentTarget&&x(`close`)};return(n,o)=>(a(),l(f,{to:`body`},[h(w,{name:`fade`},{default:r(()=>[e.incident?(a(),b(`div`,{key:0,class:`modal-backdrop`,onClick:at},[y(`div`,{class:`modal-card-glass max-w-2xl overflow-hidden`,onClick:o[3]||=C(()=>{},[`stop`])},[y(`div`,R,[y(`div`,z,[y(`div`,B,[o[5]||=y(`div`,{class:`p-2 bg-accent-amber/opacity-medium rounded-lg`},[y(`svg`,{class:`w-5 h-5 text-accent-amber`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z`})])],-1),y(`div`,null,[o[4]||=y(`h2`,{class:`text-xl font-bold text-content-primary`},`RF Degradation Event`,-1),y(`p`,V,c(k.value?.startTime),1)])]),y(`button`,{onClick:o[0]||=e=>x(`close`),class:`p-2 hover:bg-stroke-subtle dark:hover:bg-white/opacity-light rounded-lg transition-colors text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary`},[...o[6]||=[y(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])])]),y(`div`,H,[y(`div`,U,[y(`div`,ce,[y(`div`,{class:d([`px-4 py-2 rounded-lg font-medium text-sm`,k.value?.severityColor])},` Severity: `+c(e.incident.severity.toUpperCase()),3)]),y(`div`,W,[y(`div`,G,[o[7]||=y(`div`,{class:`text-xs text-content-tertiary uppercase tracking-wide mb-1`},`Start Time`,-1),y(`div`,K,c(k.value?.startTime),1)]),y(`div`,q,[o[8]||=y(`div`,{class:`text-xs text-content-tertiary uppercase tracking-wide mb-1`},`End Time`,-1),y(`div`,J,c(k.value?.endTime),1)])]),y(`div`,Y,[o[9]||=y(`div`,{class:`text-xs text-content-tertiary uppercase tracking-wide mb-1`},`Duration`,-1),y(`div`,le,c(k.value?.duration),1)]),y(`div`,ue,[y(`div`,de,[o[10]||=y(`div`,{class:`text-xs text-content-tertiary uppercase tracking-wide mb-1`},`Peak Noise Delta`,-1),y(`div`,fe,`+`+c(k.value?.peakNoise),1),o[11]||=y(`div`,{class:`text-xs text-content-secondary mt-1`},`dB above baseline`,-1)]),y(`div`,pe,[o[12]||=y(`div`,{class:`text-xs text-content-tertiary uppercase tracking-wide mb-1`},`Total CRC Errors`,-1),y(`div`,me,c(k.value?.totalCrc),1),o[13]||=y(`div`,{class:`text-xs text-content-secondary mt-1`},`detected during event`,-1)])]),y(`div`,he,[o[17]||=y(`div`,{class:`text-sm font-medium text-content-primary mb-3`},`What This Means`,-1),y(`ul`,ge,[y(`li`,X,[o[14]||=y(`span`,{class:`text-accent-red font-bold`},`•`,-1),y(`span`,null,`Noise floor increased `+c(k.value?.peakNoise)+` dB above baseline, indicating RF interference or environmental factors.`,1)]),y(`li`,_e,[o[15]||=y(`span`,{class:`text-accent-amber font-bold`},`•`,-1),y(`span`,null,c(k.value?.totalCrc)+` CRC errors occurred during this period, suggesting packet corruption.`,1)]),o[16]||=y(`li`,{class:`flex gap-2`},[y(`span`,{class:`text-content-tertiary font-bold`},`•`),y(`span`,null,`The strong correlation between noise and CRC errors indicates the noise floor was the primary cause of packet degradation.`)],-1)])]),y(`div`,ve,[y(`div`,Z,[y(`div`,null,[o[18]||=y(`div`,{class:`text-sm font-medium text-content-primary`},`Packet Context Around Incident`,-1),y(`div`,ye,` ±`+c(A.value?.contextSeconds??0)+`s around window `,1)]),y(`div`,be,[i(y(`select`,{"onUpdate:modelValue":o[1]||=e=>S.value=e,class:`px-2 py-1 text-xs rounded-md border border-stroke-subtle bg-background-mute text-content-primary`},[(a(!0),b(v,null,t(s(ee),e=>(a(),b(`option`,{key:e,value:e},` ±`+c(e)+`s `,9,xe))),128))],512),[[te,S.value,void 0,{number:!0}]]),y(`button`,{class:`px-2 py-1 text-xs rounded-md border border-stroke-subtle text-content-secondary hover:text-content-primary hover:bg-surface-hover`,onClick:it},` Refresh `)])]),ne.value?(a(),b(`div`,Se,`Loading nearby packets...`)):D.value?(a(),b(`div`,Ce,c(D.value),1)):(a(),b(`div`,we,[y(`div`,Q,[y(`div`,Te,[o[19]||=y(`div`,{class:`text-content-tertiary`},`Total`,-1),y(`div`,Ee,c(I.value.total),1)]),y(`div`,De,[o[20]||=y(`div`,{class:`text-content-tertiary`},`Dropped`,-1),y(`div`,Oe,c(I.value.dropped),1)]),y(`div`,ke,[o[21]||=y(`div`,{class:`text-content-tertiary`},`Duplicates`,-1),y(`div`,Ae,c(I.value.duplicates),1)]),y(`div`,je,[o[22]||=y(`div`,{class:`text-content-tertiary`},`With path data`,-1),y(`div`,Me,c(I.value.withPath),1)])]),y(`div`,Ne,[o[23]||=y(`span`,{class:`font-medium text-content-primary`},`Top drop reasons:`,-1),_(` `+c(I.value.topDropReasons.length?I.value.topDropReasons.join(`, `):`None`),1)]),y(`div`,Pe,[y(`div`,Fe,[o[24]||=y(`div`,{class:`text-xs font-semibold text-content-tertiary uppercase tracking-wide mb-2`},` Repeated Packet Hashes `,-1),$.value.repeatedHashes.length===0?(a(),b(`div`,Ie,` No repeated hashes in this window. `)):(a(),b(`div`,Le,[(a(!0),b(v,null,t($.value.repeatedHashes,e=>(a(),b(`div`,{key:e.hash,class:`text-xs text-content-secondary`},[y(`span`,Re,c(e.hash),1),_(` x`+c(e.count),1)]))),128))]))]),y(`div`,ze,[o[25]||=y(`div`,{class:`text-xs font-semibold text-content-tertiary uppercase tracking-wide mb-2`},` Repeated Paths `,-1),$.value.repeatedPaths.length===0?(a(),b(`div`,Be,` No repeated paths in this window. `)):(a(),b(`div`,Ve,[(a(!0),b(v,null,t($.value.repeatedPaths,e=>(a(),b(`div`,{key:e.path,class:`text-xs text-content-secondary truncate`,title:e.path},[y(`span`,Ue,c(e.path),1),_(` x`+c(e.count),1)],8,He))),128))]))])]),y(`div`,We,[o[30]||=y(`div`,{class:`hidden md:grid grid-cols-12 gap-2 px-3 py-2 border-b border-stroke-subtle dark:border-stroke text-content-secondary dark:text-content-muted text-[11px] font-semibold uppercase tracking-wide`},[y(`div`,{class:`col-span-2`},`Time`),y(`div`,{class:`col-span-2`},`Type`),y(`div`,{class:`col-span-2`},`Status`),y(`div`,{class:`col-span-4`},`Route / Path / Reason`),y(`div`,{class:`col-span-2 text-right`},`Inspect`)],-1),et.value.length===0?(a(),b(`div`,Ge,` No packets found in this context window. `)):(a(),b(`div`,Ke,[(a(!0),b(v,null,t(et.value,e=>(a(),b(`div`,{key:`${e.packet_hash}-${e.timestamp}`,class:`packet-context-row grid grid-cols-1 md:grid-cols-12 gap-2 px-3 py-2 border-b border-stroke-subtle dark:border-dark-border/50 hover:bg-background-mute dark:hover:bg-stroke/opacity-subtle transition-colors duration-150`},[y(`div`,qe,[o[26]||=y(`span`,{class:`md:hidden text-content-tertiary font-semibold uppercase tracking-wide mr-1`},`Time:`,-1),_(` `+c(M(e.timestamp)),1)]),y(`div`,Je,[o[27]||=y(`span`,{class:`md:hidden text-content-tertiary font-semibold uppercase tracking-wide mr-1`},`Type:`,-1),_(` `+c(oe(e.type)),1)]),y(`div`,{class:d([`md:col-span-2 text-xs font-medium`,{"text-accent-amber":P(e)===`Duplicate`,"text-accent-red":P(e)===`Dropped`,"text-accent-green":P(e)===`Forwarded`}])},[o[28]||=y(`span`,{class:`md:hidden text-content-tertiary font-semibold uppercase tracking-wide mr-1`},`Status:`,-1),_(` `+c(P(e)),1)],2),y(`div`,{class:`md:col-span-4 text-content-secondary text-xs truncate`,title:`${N(e.route)} | ${se(e)} | ${e.drop_reason??`no drop reason`}`},[o[29]||=y(`span`,{class:`md:hidden text-content-tertiary font-semibold uppercase tracking-wide mr-1`},`Details:`,-1),_(` `+c(N(e.route))+` | `+c(se(e))+` | `+c(e.drop_reason??`ok`),1)],8,Ye),y(`div`,Xe,[y(`button`,{class:`glass-card border border-stroke-subtle dark:border-stroke hover:border-primary dark:hover:border-primary rounded-lg px-2 py-1 text-[11px] text-content-primary hover:text-primary hover:bg-primary/opacity-light transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium`,onClick:t=>nt(e)},` Open `,8,Ze)])]))),128))]))])]))])])]),y(`div`,Qe,[y(`div`,$e,[y(`button`,{type:`button`,class:`modal-btn-primary`,onClick:o[2]||=e=>x(`close`)},`Close`)])])])])):m(``,!0)]),_:1}),h(L,{packet:O.value,"is-open":re.value,onClose:rt},null,8,[`packet`,`is-open`])]))}}),[[`__scopeId`,`data-v-1709062a`]]),tt={class:`p-3 sm:p-6 space-y-4 sm:space-y-6`},$={class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`},nt={class:`flex items-center gap-2 sm:gap-3`},rt=[`value`],it={class:`grid grid-cols-2 lg:grid-cols-4 gap-3 sm:gap-4`},at={class:`glass-card rounded-[15px] p-4`},ot={class:`mt-2 text-2xl font-semibold text-content-primary`},st={class:`glass-card rounded-[15px] p-4`},ct={class:`mt-2 text-2xl font-semibold text-content-primary`},lt={class:`glass-card rounded-[15px] p-4`},ut={class:`mt-2 text-2xl font-semibold text-content-primary`},dt={class:`glass-card rounded-[15px] p-4`},ft={class:`mt-2 text-2xl font-semibold text-content-primary`},pt={class:`mt-1 text-xs text-content-muted`},mt={class:`glass-card rounded-[15px] p-3 sm:p-5`},ht={class:`grid grid-cols-1 xl:grid-cols-2 gap-4 sm:gap-6`},gt={class:`glass-card rounded-[15px] p-4 sm:p-6`},_t={class:`space-y-3`},vt={class:`text-content-primary font-medium`},yt={class:`text-content-secondary text-sm mt-1`},bt={class:`text-content-secondary text-sm mt-1`},xt={class:`glass-card rounded-[15px] p-4 sm:p-6`},St={key:0,class:`text-content-secondary text-sm`},Ct={key:1,class:`space-y-3 max-h-[26rem] overflow-y-auto pr-1`},wt=[`onClick`],Tt={class:`flex items-center justify-between gap-2`},Et={class:`text-content-primary font-medium`},Dt={class:`grid grid-cols-2 gap-2 mt-3 text-xs sm:text-sm text-content-secondary group-hover:text-content-primary transition-colors`},Ot={class:`glass-card rounded-[15px] p-4 sm:p-6`},kt={class:`grid grid-cols-2 md:grid-cols-5 gap-3 text-sm`},At={class:`border border-stroke-subtle rounded-lg p-3`},jt={class:`text-content-primary font-medium`},Mt={class:`border border-stroke-subtle rounded-lg p-3`},Nt={class:`text-content-primary font-medium`},Pt={class:`border border-stroke-subtle rounded-lg p-3`},Ft={class:`text-content-primary font-medium`},It={class:`border border-stroke-subtle rounded-lg p-3`},Lt={class:`text-content-primary font-medium`},Rt=u({name:`RfHealthCorrelationView`,__name:`RfHealthCorrelation`,setup(l){N.register(oe,re,ie,F,A,k,se,I,D,O,ae,j);let u=[{value:1,label:`1 Hour`},{value:6,label:`6 Hours`},{value:24,label:`24 Hours`},{value:48,label:`2 Days`},{value:168,label:`1 Week`}],f=o(24),p=o(null),m=o(null),_=o(!1),C=o(!1),w=o(!0),T=o(null),E=o(`Connecting...`),L=o({}),R=o([]),z=o([]),B=o([]),V=o([]),H=o([]),U=o(null),ce=(e,t)=>typeof window>`u`?t:window.getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t,W=e=>{if(!e.startsWith(`var(`))return e;let t=e.match(/var\((--[^,)]+)/);return t?ce(t[1],e):e},G={noise:`var(--color-primary)`,crc:`var(--color-accent-red)`,packetCount:`var(--color-accent-green)`,grid:`var(--color-border-subtle)`,ticks:`var(--color-text-secondary)`,tooltipBg:`var(--color-surface-elevated)`,tooltipText:`var(--color-text-primary)`,tooltipBorder:`var(--color-border-subtle)`},K=e=>{if(typeof e==`number`&&Number.isFinite(e))return e;if(typeof e==`string`){let t=Number(e);if(Number.isFinite(t))return t}return null},q=e=>{let t=K(e);return t===null?null:t>0x38d7ea4c68000?Math.round(t/1e3):t>0xe8d4a51000?Math.round(t):t>1e9?Math.round(t*1e3):null},J=e=>!e||typeof e!=`object`||Array.isArray(e)?null:e,Y=(e,t)=>{if(e.length===0)return 0;let n=[...e].sort((e,t)=>e-t);return n[Math.max(0,Math.min(n.length-1,Math.round((n.length-1)*t)))]},le=e=>Y(e,.5),ue=(e,t,n)=>Math.min(n,Math.max(t,e)),de=e=>{let t=[],n=J(e)?.data??e,r=e=>{e.forEach(e=>{let n=J(e);if(!n)return;let r=q(n.timestamp),i=K(n.noise_floor_dbm??n.noise_floor??n.value);r!==null&&i!==null&&t.push({t:r,v:i})})};if(Array.isArray(n))r(n);else{let e=J(n);e&&(Array.isArray(e.history)&&r(e.history),Array.isArray(e.chart_data)&&r(e.chart_data),Array.isArray(e.values)&&r(e.values))}return t.sort((e,t)=>e.t-t.t)},fe=e=>{let t=[],n=J(e)?.data??e,r=e=>{e.forEach(e=>{let n=J(e);if(!n)return;let r=q(n.timestamp),i=K(n.count??n.crc_errors??n.value);r!==null&&i!==null&&t.push({t:r,v:i})})};if(Array.isArray(n))r(n);else{let e=J(n);e&&Array.isArray(e.history)&&r(e.history)}return t.sort((e,t)=>e.t-t.t)},pe=(e,t)=>{let n=[],r=J(J(e)?.data??e);if(!r||!Array.isArray(r.series))return n;let i=Array.isArray(r.timestamps)?r.timestamps.map(e=>q(e)).filter(e=>e!==null):[];return r.series.forEach(e=>{let r=J(e);if(!r)return;let a=String(r.type??``),o=String(r.name??``);if(!(a===t||o===t))return;let s=r.data;if(Array.isArray(s)){if(s.length>0&&Array.isArray(s[0])){s.forEach(e=>{if(!Array.isArray(e)||e.length<2)return;let t=q(e[0]),r=K(e[1]);t!==null&&r!==null&&n.push({t,v:r})});return}s.forEach((e,t)=>{let r=i[t]??null,a=K(e);r!==null&&a!==null&&n.push({t:r,v:a})})}}),n.sort((e,t)=>e.t-t.t)},me=e=>{let t=pe(e,`rx_count`),n=pe(e,`tx_count`),r=new Map;return t.forEach(e=>{r.set(e.t,(r.get(e.t)??0)+e.v)}),n.forEach(e=>{r.set(e.t,(r.get(e.t)??0)+e.v)}),Array.from(r.entries()).map(([e,t])=>({t:e,v:t})).sort((e,t)=>e.t-t.t)},he=(e,t,n)=>{let r=new Map;e.forEach(e=>{let n=Math.floor(e.t/t)*t;r.has(n)||r.set(n,[]),r.get(n)?.push(e.v)});let i=new Map;return r.forEach((e,t)=>{if(e.length!==0){if(n===`sum`){i.set(t,e.reduce((e,t)=>e+t,0));return}i.set(t,e.reduce((e,t)=>e+t,0)/e.length)}}),i},ge=()=>{let e=Math.max(3e4,Math.round(f.value*60*60*1e3/120)),t=he(R.value,e,`avg`),n=he(z.value,e,`sum`),r=he(B.value,e,`sum`),i=new Set([...t.keys(),...n.keys(),...r.keys()]);return Array.from(i).sort((e,t)=>e-t).map(e=>({bucketMs:e,noise:t.has(e)?t.get(e)??null:null,crc:n.get(e)??0,packets:r.has(e)?r.get(e)??0:0}))},X=(e,t)=>{if(e.length!==t.length||e.length<3)return null;let n=e.reduce((e,t)=>e+t,0)/e.length,r=t.reduce((e,t)=>e+t,0)/t.length,i=0,a=0,o=0;for(let s=0;sn<0?null:n===0?X(e,t):e.length<=n||t.length<=n?null:X(e.slice(0,e.length-n),t.slice(n)),ve=e=>{if(e.length===0)return[];let t=e.map(e=>e.noise).filter(e=>e!==null);if(t.length<5)return[];let n=le(t),r=n+Math.max(2,Y(t,.9)-n),i=Math.max(1,Y(e.map(e=>e.crc),.9)),a=e.filter(e=>{if(e.noise===null)return!1;let t=e.noise>=r,n=e.crc>=i;return t&&n});if(a.length===0)return[];let o=e.length>1?e[1].bucketMs-e[0].bucketMs:6e4,s=[],c=a[0].bucketMs,l=a[0].bucketMs,u=[a[0]],d=()=>{let e=u.map(e=>e.noise===null?0:e.noise-n),t=Math.max(...e),r=u.reduce((e,t)=>e+t.crc,0),i=t*2.5+r*.8,a=i>=20?`high`:i>=8?`medium`:`low`;s.push({id:`${c}-${l}`,startMs:c,endMs:l,peakNoiseDelta:t,totalCrc:r,totalDrops:0,severity:a})};for(let e=1;et.startMs-e.startMs).slice(0,12)},Z=g(()=>{let e=K(L.value.total_packets);if(e!==null)return e;let t=K(L.value.received)??0,n=K(L.value.transmitted)??0;return Math.max(t,n)}),ye=g(()=>{let e=K(L.value.dropped);if(e!==null)return e;let t=K(L.value.received)??0,n=K(L.value.transmitted)??0;return Math.max(0,t-n)}),be=g(()=>Z.value<=0?0:ye.value/Z.value),xe=g(()=>R.value.length===0?null:R.value[R.value.length-1].v),Se=g(()=>R.value.length<3?null:le(R.value.map(e=>e.v))),Ce=g(()=>z.value.reduce((e,t)=>e+t.v,0)),we=g(()=>{let e=xe.value,t=Se.value,n=0;e!==null&&t!==null&&(n=Math.max(0,e-t)*2.2);let r=(Z.value>0?Ce.value/Z.value:0)*120,i=be.value*100;return ue(Math.round(100-(n+r+i)),0,100)}),Q=g(()=>{let e=R.value.length>0?R.value[R.value.length-1].t:0,t=z.value.length>0?z.value[z.value.length-1].t:0,n=B.value.length>0?B.value[B.value.length-1].t:0,r=Math.max(e,t,n),i=r>0?Math.max(0,Math.round((Date.now()-r)/1e3)):null;return{noiseSamples:R.value.length,crcSamples:z.value.length,packetSamples:B.value.length,freshnessSeconds:i}}),Te=e=>new Date(e).toLocaleString(`en-US`,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`}),Ee=(e,t)=>{let n=Math.max(0,t-e),r=Math.floor(n/1e3),i=Math.floor(r/60),a=Math.floor(i/60);return a>0?`${a}h ${i%60}m`:i>0?`${i}m ${r%60}s`:`${r}s`};g(()=>{if(!U.value)return null;let e=U.value;return{startTime:Te(e.startMs),endTime:Te(e.endMs),duration:Ee(e.startMs,e.endMs),peakNoise:e.peakNoiseDelta.toFixed(2),totalCrc:e.totalCrc.toLocaleString(),severityColor:e.severity===`high`?`bg-accent-red/opacity-light text-accent-red`:e.severity===`medium`?`bg-accent-amber/opacity-light text-accent-amber`:`bg-accent-green/opacity-light text-accent-green`}});let De=g(()=>{let e=V.value.filter(e=>e.noise!==null),t=e.map(e=>e.noise),n=e.map(e=>e.crc),r=e.map(e=>e.packets),i=X(t,n),a=X(t,r),o=0,s=i,c=0,l=a;for(let e=1;e<=3;e+=1){let i=_e(t,n,e),a=_e(t,r,e);(i??0)>(s??-1/0)&&(o=e,s=i),(a??0)>(l??-1/0)&&(c=e,l=a)}return[{label:`Noise vs CRC errors`,correlation:i,strongestLagBuckets:o,strongestLagCorrelation:s},{label:`Noise vs packet activity`,correlation:a,strongestLagBuckets:c,strongestLagCorrelation:l}]}),Oe=e=>e===null||Number.isNaN(e)?`Insufficient samples`:e.toFixed(3),ke=e=>new Date(e).toLocaleString([],{hour:`2-digit`,minute:`2-digit`,month:`short`,day:`numeric`}),Ae=e=>e===null?`Unknown`:e<60?`${e}s ago`:e<3600?`${Math.round(e/60)}m ago`:`${Math.round(e/3600)}h ago`,je=async()=>{_.value?C.value=!0:w.value=!0,T.value=null;try{let[e,t,n,r]=await Promise.all([M(`/packet_stats`,{hours:f.value}),M(`/noise_floor_history`,{hours:f.value},{idleTimeoutMs:3e4,onPhaseChange:e=>{E.value=e===`receiving`?`Receiving data...`:`Connecting...`}}),M(`/crc_error_history`,{hours:f.value}),M(`/metrics_graph_data`,{hours:f.value,resolution:`average`,metrics:`rx_count,tx_count`})]),i=J(e.data)??{},a=J(i.data)??i;L.value={total_packets:K(a.total_packets)??void 0,received:K(a.received)??void 0,transmitted:K(a.transmitted)??void 0,dropped:K(a.dropped)??void 0},R.value=de(t.data),z.value=fe(n.data),B.value=me(r.data),V.value=ge(),H.value=ve(V.value),V.value.length===0&&(T.value=`No correlation data available for the selected time range.`),await ee(),Ne(),_.value=!0}catch(e){T.value=e instanceof Error?e.message:`Failed to load RF health correlation data.`}finally{w.value=!1,C.value=!1}},Me=()=>{m.value&&=(n(m.value).destroy(),null)},Ne=()=>{if(!p.value||V.value.length===0){Me();return}let e=p.value.getContext(`2d`);if(!e)return;let t=V.value.filter(e=>e.noise!==null).map(e=>({x:e.bucketMs,y:e.noise})),r=V.value.map(e=>({x:e.bucketMs,y:e.crc})),i=Math.max(1,...r.map(e=>e.y)),a=V.value.map(e=>({x:e.bucketMs,y:e.packets})),o=a.map(e=>e.y),s=o.length>0?Y(o,.95):1,c=Math.max(1,Math.ceil(s*1.25)),l=f.value>48?`day`:`hour`,u={type:`bar`,data:{datasets:[{type:`line`,label:`Noise floor (dBm)`,yAxisID:`yNoise`,data:t,borderColor:W(G.noise),backgroundColor:W(G.noise),borderWidth:2,tension:.25,pointRadius:0,pointHoverRadius:3},{type:`line`,label:`Packet count (bucket)`,yAxisID:`yPacketCount`,data:a,borderColor:W(G.packetCount),backgroundColor:W(G.packetCount),borderWidth:2,tension:.25,pointRadius:0,pointHoverRadius:3},{type:`bar`,label:`CRC errors`,yAxisID:`yCount`,data:r,borderWidth:0,backgroundColor:W(G.crc),barPercentage:.9,categoryPercentage:1}]},options:{responsive:!0,maintainAspectRatio:!1,interaction:{mode:`index`,intersect:!1},plugins:{legend:{position:`top`,labels:{color:W(G.ticks)}},tooltip:{backgroundColor:W(G.tooltipBg),titleColor:W(G.tooltipText),bodyColor:W(G.tooltipText),borderColor:W(G.tooltipBorder),borderWidth:1}},scales:{x:{type:`time`,time:{unit:l},min:Date.now()-f.value*60*60*1e3,max:Date.now(),grid:{color:W(G.grid)},ticks:{color:W(G.ticks),maxTicksLimit:8}},yNoise:{type:`linear`,position:`left`,title:{display:!0,text:`Noise floor (dBm)`,color:W(G.ticks)},grid:{color:W(G.grid)},ticks:{color:W(G.ticks)}},yCount:{type:`linear`,position:`right`,beginAtZero:!0,max:Math.ceil(i*1.2),title:{display:!0,text:`CRC errors`,color:W(G.ticks)},grid:{drawOnChartArea:!1},ticks:{color:W(G.ticks)}},yPacketCount:{type:`linear`,position:`right`,offset:!0,beginAtZero:!0,max:Math.ceil(c*1.2),title:{display:!0,text:`Packet count`,color:W(G.ticks)},grid:{drawOnChartArea:!1},ticks:{color:W(G.ticks)}}}}};if(m.value){let e=n(m.value);e.data=u.data,e.options=u.options,e.update();return}m.value=S(new N(e,u))},Pe=()=>{w.value=!0,Ie.runNow()},Fe=()=>{m.value&&window.setTimeout(()=>{n(m.value)?.resize()},80)},Ie=ne(je,{intervalMs:3e4,immediate:!0});return e(()=>{window.addEventListener(`resize`,Fe)}),x(()=>{window.removeEventListener(`resize`,Fe),Me()}),(e,n)=>(a(),b(`div`,tt,[y(`div`,$,[n[4]||=y(`div`,null,[y(`h2`,{class:`text-xl sm:text-2xl font-bold text-content-primary`},`RF Health Correlation`),y(`p`,{class:`text-xs sm:text-sm text-content-secondary mt-1`},` Live correlation of noise floor, CRC errors, and packet activity so you can spot traffic-related peaks. `)],-1),h(et,{incident:U.value,onClose:n[0]||=e=>U.value=null},null,8,[`incident`]),y(`div`,nt,[n[3]||=y(`label`,{class:`text-content-secondary text-xs sm:text-sm`},`Window:`,-1),i(y(`select`,{"onUpdate:modelValue":n[1]||=e=>f.value=e,class:`modal-select w-auto`,onChange:Pe},[(a(),b(v,null,t(u,e=>y(`option`,{key:e.value,value:e.value,class:`bg-surface text-content-primary`},c(e.label),9,rt)),64))],544),[[te,f.value]])])]),y(`div`,it,[y(`div`,at,[n[5]||=y(`div`,{class:`text-content-secondary text-xs uppercase tracking-wide`},`RF health score`,-1),y(`div`,ot,c(we.value),1)]),y(`div`,st,[n[6]||=y(`div`,{class:`text-content-secondary text-xs uppercase tracking-wide`},`Current noise floor`,-1),y(`div`,ct,c(xe.value===null?`N/A`:`${xe.value.toFixed(1)} dBm`),1)]),y(`div`,lt,[n[7]||=y(`div`,{class:`text-content-secondary text-xs uppercase tracking-wide`},`CRC errors`,-1),y(`div`,ut,c(Math.round(Ce.value).toLocaleString()),1)]),y(`div`,dt,[n[8]||=y(`div`,{class:`text-content-secondary text-xs uppercase tracking-wide`},`Dropped packets (reported)`,-1),y(`div`,ft,c(Math.round(ye.value).toLocaleString()),1),y(`div`,pt,`Drop rate: `+c((be.value*100).toFixed(2))+`%`,1)])]),y(`div`,mt,[n[9]||=y(`h3`,{class:`text-content-primary text-lg sm:text-xl font-semibold mb-3`},`Correlation timeline`,-1),h(P,{class:`h-[17rem] sm:h-[22rem]`,"is-loading":w.value,"is-updating":C.value,error:T.value,status:E.value,onRetry:n[2]||=()=>s(Ie).runNow()},{default:r(()=>[y(`canvas`,{ref_key:`chartCanvasRef`,ref:p,class:`w-full h-full`},null,512)]),_:1},8,[`is-loading`,`is-updating`,`error`,`status`])]),y(`div`,ht,[y(`div`,gt,[n[10]||=y(`h3`,{class:`text-content-primary text-lg font-semibold mb-4`},`Correlation details`,-1),y(`div`,_t,[(a(!0),b(v,null,t(De.value,e=>(a(),b(`div`,{key:e.label,class:`border border-stroke-subtle rounded-lg p-3`},[y(`div`,vt,c(e.label),1),y(`div`,yt,` Base correlation: `+c(Oe(e.correlation)),1),y(`div`,bt,` Strongest lag: +`+c(e.strongestLagBuckets)+` bucket(s), `+c(Oe(e.strongestLagCorrelation)),1)]))),128))])]),y(`div`,xt,[n[12]||=y(`h3`,{class:`text-content-primary text-lg font-semibold mb-4`},`Detected incidents`,-1),H.value.length===0?(a(),b(`div`,St,` No degradation windows detected for the selected time range. `)):(a(),b(`div`,Ct,[(a(!0),b(v,null,t(H.value,e=>(a(),b(`div`,{key:e.id,class:`border border-stroke-subtle rounded-lg p-3 hover:bg-surface-hover/opacity-subtle cursor-pointer transition-colors group`,onClick:t=>U.value=e},[y(`div`,Tt,[y(`div`,Et,c(ke(e.startMs))+` to `+c(ke(e.endMs)),1),y(`span`,{class:d([`text-xs font-semibold px-2 py-1 rounded-full`,{"bg-accent-red-bg text-accent-red":e.severity===`high`,"bg-accent-amber/opacity-light text-accent-amber":e.severity===`medium`,"bg-accent-green-bg text-accent-green":e.severity===`low`}])},c(e.severity),3)]),y(`div`,Dt,[y(`div`,null,`Noise delta: +`+c(e.peakNoiseDelta.toFixed(1))+` dB`,1),y(`div`,null,`CRC burst: `+c(Math.round(e.totalCrc).toLocaleString())+` errors`,1)]),n[11]||=y(`div`,{class:`text-xs text-content-tertiary mt-2 opacity-0 group-hover:opacity-100 transition-opacity`},`Click to view details`,-1)],8,wt))),128))]))])]),y(`div`,Ot,[n[17]||=y(`h3`,{class:`text-content-primary text-lg font-semibold mb-4`},`Data quality`,-1),y(`div`,kt,[y(`div`,At,[n[13]||=y(`div`,{class:`text-content-secondary`},`Noise samples`,-1),y(`div`,jt,c(Q.value.noiseSamples),1)]),y(`div`,Mt,[n[14]||=y(`div`,{class:`text-content-secondary`},`CRC samples`,-1),y(`div`,Nt,c(Q.value.crcSamples),1)]),y(`div`,Pt,[n[15]||=y(`div`,{class:`text-content-secondary`},`Packet events`,-1),y(`div`,Ft,c(Q.value.packetSamples),1)]),y(`div`,It,[n[16]||=y(`div`,{class:`text-content-secondary`},`Freshness`,-1),y(`div`,Lt,c(Ae(Q.value.freshnessSeconds)),1)])])])]))}});export{Rt as default}; \ No newline at end of file +import{C as e,D as t,K as n,N as r,P as i,T as a,U as o,X as s,_t as c,c as l,h as u,ht as d,i as f,j as p,l as m,m as h,o as g,p as _,r as v,s as y,u as b,x,y as ee,z as S}from"./runtime-core.esm-bundler-CINEgm0a.js";import{a as te,l as C,t as w}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as T}from"./api-EpLa-SS4.js";import{d as E,t as ne}from"./index-DF5glAZc.js";import{_ as D,a as O,d as re,f as ie,g as ae,i as k,l as A,m as j,n as M,o as oe,s as N,t as P,u as F,v as se,y as I}from"./ChartCard-D5XCldya.js";import{t as L}from"./PacketDetailsModal-Cp96QhHp.js";import"./chartjs-adapter-date-fns.esm-kFk3lIdz.js";var R={class:`bg-gradient-to-r from-accent-amber/20 to-accent-red/20 border-b border-stroke-subtle dark:border-stroke/opacity-light px-6 py-4`},z={class:`flex items-center justify-between`},B={class:`flex items-center gap-3`},V={class:`text-sm text-content-secondary dark:text-content-muted`},H={class:`max-h-[75vh] overflow-y-auto`},U={class:`px-6 py-4 space-y-6`},ce={class:`flex items-center gap-3`},W={class:`grid grid-cols-2 gap-4`},G={class:`bg-surface-primary rounded-lg p-4`},K={class:`text-content-primary font-medium`},q={class:`bg-surface-primary rounded-lg p-4`},J={class:`text-content-primary font-medium`},Y={class:`bg-surface-primary rounded-lg p-4`},le={class:`text-2xl text-content-primary font-semibold`},ue={class:`grid grid-cols-2 gap-4`},de={class:`bg-surface-primary rounded-lg p-4 border-l-4 border-accent-red`},fe={class:`text-3xl text-accent-red font-bold`},pe={class:`bg-surface-primary rounded-lg p-4 border-l-4 border-accent-amber`},me={class:`text-3xl text-accent-amber font-bold`},he={class:`bg-surface-primary rounded-lg p-4`},ge={class:`space-y-2 text-sm text-content-secondary`},X={class:`flex gap-2`},_e={class:`flex gap-2`},ve={class:`bg-surface-primary rounded-lg p-4`},Z={class:`flex items-center justify-between gap-3`},ye={class:`text-xs text-content-secondary mt-1`},be={class:`flex items-center gap-2`},xe=[`value`],Se={key:0,class:`text-sm text-content-secondary mt-3`},Ce={key:1,class:`text-sm text-accent-red mt-3`},we={key:2,class:`mt-3 space-y-3`},Q={class:`grid grid-cols-2 md:grid-cols-4 gap-2 text-xs`},Te={class:`rounded-md border border-stroke-subtle px-2 py-2`},Ee={class:`text-content-primary font-semibold`},De={class:`rounded-md border border-stroke-subtle px-2 py-2`},Oe={class:`text-content-primary font-semibold`},ke={class:`rounded-md border border-stroke-subtle px-2 py-2`},Ae={class:`text-content-primary font-semibold`},je={class:`rounded-md border border-stroke-subtle px-2 py-2`},Me={class:`text-content-primary font-semibold`},Ne={class:`text-xs text-content-secondary`},Pe={class:`grid grid-cols-1 md:grid-cols-2 gap-3`},Fe={class:`rounded-md border border-stroke-subtle p-3`},Ie={key:0,class:`text-xs text-content-secondary`},Le={key:1,class:`space-y-1.5`},Re={class:`font-medium text-content-primary`},ze={class:`rounded-md border border-stroke-subtle p-3`},Be={key:0,class:`text-xs text-content-secondary`},Ve={key:1,class:`space-y-1.5`},He=[`title`],Ue={class:`font-medium text-content-primary`},We={class:`glass-card border border-stroke-subtle dark:border-stroke rounded-xl overflow-hidden`},Ge={key:0,class:`px-3 py-3 text-sm text-content-secondary`},Ke={key:1,class:`max-h-56 overflow-y-auto`},qe={class:`md:col-span-2 text-content-secondary text-xs`},Je={class:`md:col-span-2 text-content-primary text-xs font-medium`},Ye=[`title`],Xe={class:`md:col-span-2 md:text-right`},Ze=[`onClick`],Qe={class:`border-t border-stroke-subtle dark:border-stroke/opacity-light px-6 py-4`},$e={class:`modal-actions`},et=E(u({__name:`IncidentDetailsModal`,props:{incident:{default:null}},emits:[`close`],setup(e,{emit:n}){let u=e,x=n,ee=Array.from({length:15},(e,t)=>t+1),S=o(10),E=o([]),ne=o(!1),D=o(null),O=o(null),re=o(!1),ie=e=>new Date(e).toLocaleString(`en-US`,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`}),ae=(e,t)=>{let n=Math.max(0,t-e),r=Math.floor(n/1e3),i=Math.floor(r/60),a=Math.floor(i/60);return a>0?`${a}h ${i%60}m`:i>0?`${i}m ${r%60}s`:`${r}s`},k=g(()=>{if(!u.incident)return null;let e=u.incident;return{startTime:ie(e.startMs),endTime:ie(e.endMs),duration:ae(e.startMs,e.endMs),peakNoise:e.peakNoiseDelta.toFixed(2),totalCrc:e.totalCrc.toLocaleString(),severityColor:e.severity===`high`?`bg-accent-red/opacity-light text-accent-red`:e.severity===`medium`?`bg-accent-amber/opacity-light text-accent-amber`:`bg-accent-green/opacity-light text-accent-green`}}),A=g(()=>u.incident?{startTs:Math.floor(u.incident.startMs/1e3)-S.value,endTs:Math.ceil(u.incident.endMs/1e3)+S.value,contextSeconds:S.value}:null),j=e=>e<1e10?e*1e3:e,M=e=>new Date(j(e)).toLocaleTimeString(`en-US`,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`}),oe=e=>({0:`REQ`,1:`RESP`,2:`MSG`,3:`ACK`,4:`ADVERT`,5:`GRP_TXT`,6:`GRP_DATA`,7:`ANON_REQ`,8:`PATH`,9:`TRACE`,10:`MP`,15:`CUSTOM`})[e]??`T${e}`,N=e=>({0:`Transport Flood`,1:`Flood`,2:`Direct`,3:`Transport Direct`})[e]??`Route ${e}`,P=e=>e.is_duplicate?`Duplicate`:!e.transmitted||e.drop_reason?`Dropped`:`Forwarded`,F=e=>{if(Array.isArray(e))return e.filter(e=>typeof e==`string`);if(typeof e==`string`)try{let t=JSON.parse(e);if(Array.isArray(t))return t.filter(e=>typeof e==`string`)}catch{return[]}return[]},se=e=>{let t=F(e.original_path).length,n=F(e.forwarded_path).length;return!t&&!n?`No path`:t&&n?`${t}->${n} hops`:`${Math.max(t,n)} hops`},I=g(()=>{let e=E.value,t=e.filter(e=>!e.transmitted||!!e.drop_reason).length,n=e.filter(e=>!!e.is_duplicate).length,r=e.filter(e=>F(e.original_path).length>0||F(e.forwarded_path).length>0).length,i=new Map;for(let t of e)t.drop_reason&&i.set(t.drop_reason,(i.get(t.drop_reason)??0)+1);let a=Array.from(i.entries()).sort((e,t)=>t[1]-e[1]).slice(0,3).map(([e,t])=>`${e} (${t})`);return{total:e.length,dropped:t,duplicates:n,withPath:r,topDropReasons:a}}),et=g(()=>[...E.value].sort((e,t)=>j(e.timestamp)-j(t.timestamp)).slice(0,20)),tt=e=>`${F(e.original_path).join(`>`)}|${F(e.forwarded_path).join(`>`)}`,$=g(()=>{let e=new Map,t=new Map;for(let n of E.value){let r=n.packet_hash||`unknown`,i=e.get(r)??{count:0,samples:[]};i.count+=1,i.samples.length<3&&i.samples.push(n),e.set(r,i);let a=tt(n);if(!a||a===`|`)continue;let o=t.get(a)??{count:0,samples:[]};o.count+=1,o.samples.length<3&&o.samples.push(n),t.set(a,o)}return{repeatedHashes:Array.from(e.entries()).filter(([,e])=>e.count>1).sort((e,t)=>t[1].count-e[1].count).slice(0,6).map(([e,t])=>({hash:e,count:t.count,samples:t.samples})),repeatedPaths:Array.from(t.entries()).filter(([,e])=>e.count>1).sort((e,t)=>t[1].count-e[1].count).slice(0,6).map(([e,t])=>({path:e,count:t.count,samples:t.samples}))}}),nt=async e=>{if(O.value=e,re.value=!0,e.packet_hash&&(!e.header||!e.raw_packet))try{let t=await T.get(`/packet_by_hash`,{packet_hash:e.packet_hash});t.data&&O.value?.packet_hash===e.packet_hash&&(O.value={...O.value,...t.data})}catch{}},rt=()=>{re.value=!1,O.value=null},it=async()=>{if(!A.value){E.value=[];return}ne.value=!0,D.value=null;try{let e=await T.get(`/filtered_packets`,{start_timestamp:A.value.startTs,end_timestamp:A.value.endTs,limit:250});E.value=Array.isArray(e.data)?e.data:[]}catch(e){E.value=[],D.value=e instanceof Error?e.message:`Failed to load packet context`}finally{ne.value=!1}};p(()=>u.incident?.id,async e=>{if(!e){E.value=[],D.value=null;return}await it()},{immediate:!0}),p(S,async()=>{u.incident&&await it()});let at=e=>{e.target===e.currentTarget&&x(`close`)};return(n,o)=>(a(),l(f,{to:`body`},[h(w,{name:`fade`},{default:r(()=>[e.incident?(a(),b(`div`,{key:0,class:`modal-backdrop`,onClick:at},[y(`div`,{class:`modal-card-glass max-w-2xl overflow-hidden`,onClick:o[3]||=C(()=>{},[`stop`])},[y(`div`,R,[y(`div`,z,[y(`div`,B,[o[5]||=y(`div`,{class:`p-2 bg-accent-amber/opacity-medium rounded-lg`},[y(`svg`,{class:`w-5 h-5 text-accent-amber`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z`})])],-1),y(`div`,null,[o[4]||=y(`h2`,{class:`text-xl font-bold text-content-primary`},`RF Degradation Event`,-1),y(`p`,V,c(k.value?.startTime),1)])]),y(`button`,{onClick:o[0]||=e=>x(`close`),class:`p-2 hover:bg-stroke-subtle dark:hover:bg-white/opacity-light rounded-lg transition-colors text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary`},[...o[6]||=[y(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[y(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])])]),y(`div`,H,[y(`div`,U,[y(`div`,ce,[y(`div`,{class:d([`px-4 py-2 rounded-lg font-medium text-sm`,k.value?.severityColor])},` Severity: `+c(e.incident.severity.toUpperCase()),3)]),y(`div`,W,[y(`div`,G,[o[7]||=y(`div`,{class:`text-xs text-content-tertiary uppercase tracking-wide mb-1`},`Start Time`,-1),y(`div`,K,c(k.value?.startTime),1)]),y(`div`,q,[o[8]||=y(`div`,{class:`text-xs text-content-tertiary uppercase tracking-wide mb-1`},`End Time`,-1),y(`div`,J,c(k.value?.endTime),1)])]),y(`div`,Y,[o[9]||=y(`div`,{class:`text-xs text-content-tertiary uppercase tracking-wide mb-1`},`Duration`,-1),y(`div`,le,c(k.value?.duration),1)]),y(`div`,ue,[y(`div`,de,[o[10]||=y(`div`,{class:`text-xs text-content-tertiary uppercase tracking-wide mb-1`},`Peak Noise Delta`,-1),y(`div`,fe,`+`+c(k.value?.peakNoise),1),o[11]||=y(`div`,{class:`text-xs text-content-secondary mt-1`},`dB above baseline`,-1)]),y(`div`,pe,[o[12]||=y(`div`,{class:`text-xs text-content-tertiary uppercase tracking-wide mb-1`},`Total CRC Errors`,-1),y(`div`,me,c(k.value?.totalCrc),1),o[13]||=y(`div`,{class:`text-xs text-content-secondary mt-1`},`detected during event`,-1)])]),y(`div`,he,[o[17]||=y(`div`,{class:`text-sm font-medium text-content-primary mb-3`},`What This Means`,-1),y(`ul`,ge,[y(`li`,X,[o[14]||=y(`span`,{class:`text-accent-red font-bold`},`•`,-1),y(`span`,null,`Noise floor increased `+c(k.value?.peakNoise)+` dB above baseline, indicating RF interference or environmental factors.`,1)]),y(`li`,_e,[o[15]||=y(`span`,{class:`text-accent-amber font-bold`},`•`,-1),y(`span`,null,c(k.value?.totalCrc)+` CRC errors occurred during this period, suggesting packet corruption.`,1)]),o[16]||=y(`li`,{class:`flex gap-2`},[y(`span`,{class:`text-content-tertiary font-bold`},`•`),y(`span`,null,`The strong correlation between noise and CRC errors indicates the noise floor was the primary cause of packet degradation.`)],-1)])]),y(`div`,ve,[y(`div`,Z,[y(`div`,null,[o[18]||=y(`div`,{class:`text-sm font-medium text-content-primary`},`Packet Context Around Incident`,-1),y(`div`,ye,` ±`+c(A.value?.contextSeconds??0)+`s around window `,1)]),y(`div`,be,[i(y(`select`,{"onUpdate:modelValue":o[1]||=e=>S.value=e,class:`px-2 py-1 text-xs rounded-md border border-stroke-subtle bg-background-mute text-content-primary`},[(a(!0),b(v,null,t(s(ee),e=>(a(),b(`option`,{key:e,value:e},` ±`+c(e)+`s `,9,xe))),128))],512),[[te,S.value,void 0,{number:!0}]]),y(`button`,{class:`px-2 py-1 text-xs rounded-md border border-stroke-subtle text-content-secondary hover:text-content-primary hover:bg-surface-hover`,onClick:it},` Refresh `)])]),ne.value?(a(),b(`div`,Se,`Loading nearby packets...`)):D.value?(a(),b(`div`,Ce,c(D.value),1)):(a(),b(`div`,we,[y(`div`,Q,[y(`div`,Te,[o[19]||=y(`div`,{class:`text-content-tertiary`},`Total`,-1),y(`div`,Ee,c(I.value.total),1)]),y(`div`,De,[o[20]||=y(`div`,{class:`text-content-tertiary`},`Dropped`,-1),y(`div`,Oe,c(I.value.dropped),1)]),y(`div`,ke,[o[21]||=y(`div`,{class:`text-content-tertiary`},`Duplicates`,-1),y(`div`,Ae,c(I.value.duplicates),1)]),y(`div`,je,[o[22]||=y(`div`,{class:`text-content-tertiary`},`With path data`,-1),y(`div`,Me,c(I.value.withPath),1)])]),y(`div`,Ne,[o[23]||=y(`span`,{class:`font-medium text-content-primary`},`Top drop reasons:`,-1),_(` `+c(I.value.topDropReasons.length?I.value.topDropReasons.join(`, `):`None`),1)]),y(`div`,Pe,[y(`div`,Fe,[o[24]||=y(`div`,{class:`text-xs font-semibold text-content-tertiary uppercase tracking-wide mb-2`},` Repeated Packet Hashes `,-1),$.value.repeatedHashes.length===0?(a(),b(`div`,Ie,` No repeated hashes in this window. `)):(a(),b(`div`,Le,[(a(!0),b(v,null,t($.value.repeatedHashes,e=>(a(),b(`div`,{key:e.hash,class:`text-xs text-content-secondary`},[y(`span`,Re,c(e.hash),1),_(` x`+c(e.count),1)]))),128))]))]),y(`div`,ze,[o[25]||=y(`div`,{class:`text-xs font-semibold text-content-tertiary uppercase tracking-wide mb-2`},` Repeated Paths `,-1),$.value.repeatedPaths.length===0?(a(),b(`div`,Be,` No repeated paths in this window. `)):(a(),b(`div`,Ve,[(a(!0),b(v,null,t($.value.repeatedPaths,e=>(a(),b(`div`,{key:e.path,class:`text-xs text-content-secondary truncate`,title:e.path},[y(`span`,Ue,c(e.path),1),_(` x`+c(e.count),1)],8,He))),128))]))])]),y(`div`,We,[o[30]||=y(`div`,{class:`hidden md:grid grid-cols-12 gap-2 px-3 py-2 border-b border-stroke-subtle dark:border-stroke text-content-secondary dark:text-content-muted text-[11px] font-semibold uppercase tracking-wide`},[y(`div`,{class:`col-span-2`},`Time`),y(`div`,{class:`col-span-2`},`Type`),y(`div`,{class:`col-span-2`},`Status`),y(`div`,{class:`col-span-4`},`Route / Path / Reason`),y(`div`,{class:`col-span-2 text-right`},`Inspect`)],-1),et.value.length===0?(a(),b(`div`,Ge,` No packets found in this context window. `)):(a(),b(`div`,Ke,[(a(!0),b(v,null,t(et.value,e=>(a(),b(`div`,{key:`${e.packet_hash}-${e.timestamp}`,class:`packet-context-row grid grid-cols-1 md:grid-cols-12 gap-2 px-3 py-2 border-b border-stroke-subtle dark:border-dark-border/50 hover:bg-background-mute dark:hover:bg-stroke/opacity-subtle transition-colors duration-150`},[y(`div`,qe,[o[26]||=y(`span`,{class:`md:hidden text-content-tertiary font-semibold uppercase tracking-wide mr-1`},`Time:`,-1),_(` `+c(M(e.timestamp)),1)]),y(`div`,Je,[o[27]||=y(`span`,{class:`md:hidden text-content-tertiary font-semibold uppercase tracking-wide mr-1`},`Type:`,-1),_(` `+c(oe(e.type)),1)]),y(`div`,{class:d([`md:col-span-2 text-xs font-medium`,{"text-accent-amber":P(e)===`Duplicate`,"text-accent-red":P(e)===`Dropped`,"text-accent-green":P(e)===`Forwarded`}])},[o[28]||=y(`span`,{class:`md:hidden text-content-tertiary font-semibold uppercase tracking-wide mr-1`},`Status:`,-1),_(` `+c(P(e)),1)],2),y(`div`,{class:`md:col-span-4 text-content-secondary text-xs truncate`,title:`${N(e.route)} | ${se(e)} | ${e.drop_reason??`no drop reason`}`},[o[29]||=y(`span`,{class:`md:hidden text-content-tertiary font-semibold uppercase tracking-wide mr-1`},`Details:`,-1),_(` `+c(N(e.route))+` | `+c(se(e))+` | `+c(e.drop_reason??`ok`),1)],8,Ye),y(`div`,Xe,[y(`button`,{class:`glass-card border border-stroke-subtle dark:border-stroke hover:border-primary dark:hover:border-primary rounded-lg px-2 py-1 text-[11px] text-content-primary hover:text-primary hover:bg-primary/opacity-light transition-all duration-200 focus:outline-none focus:ring-1 focus:ring-primary/opacity-medium`,onClick:t=>nt(e)},` Open `,8,Ze)])]))),128))]))])]))])])]),y(`div`,Qe,[y(`div`,$e,[y(`button`,{type:`button`,class:`modal-btn-primary`,onClick:o[2]||=e=>x(`close`)},`Close`)])])])])):m(``,!0)]),_:1}),h(L,{packet:O.value,"is-open":re.value,onClose:rt},null,8,[`packet`,`is-open`])]))}}),[[`__scopeId`,`data-v-1709062a`]]),tt={class:`p-3 sm:p-6 space-y-4 sm:space-y-6`},$={class:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`},nt={class:`flex items-center gap-2 sm:gap-3`},rt=[`value`],it={class:`grid grid-cols-2 lg:grid-cols-4 gap-3 sm:gap-4`},at={class:`glass-card rounded-[15px] p-4`},ot={class:`mt-2 text-2xl font-semibold text-content-primary`},st={class:`glass-card rounded-[15px] p-4`},ct={class:`mt-2 text-2xl font-semibold text-content-primary`},lt={class:`glass-card rounded-[15px] p-4`},ut={class:`mt-2 text-2xl font-semibold text-content-primary`},dt={class:`glass-card rounded-[15px] p-4`},ft={class:`mt-2 text-2xl font-semibold text-content-primary`},pt={class:`mt-1 text-xs text-content-muted`},mt={class:`glass-card rounded-[15px] p-3 sm:p-5`},ht={class:`grid grid-cols-1 xl:grid-cols-2 gap-4 sm:gap-6`},gt={class:`glass-card rounded-[15px] p-4 sm:p-6`},_t={class:`space-y-3`},vt={class:`text-content-primary font-medium`},yt={class:`text-content-secondary text-sm mt-1`},bt={class:`text-content-secondary text-sm mt-1`},xt={class:`glass-card rounded-[15px] p-4 sm:p-6`},St={key:0,class:`text-content-secondary text-sm`},Ct={key:1,class:`space-y-3 max-h-[26rem] overflow-y-auto pr-1`},wt=[`onClick`],Tt={class:`flex items-center justify-between gap-2`},Et={class:`text-content-primary font-medium`},Dt={class:`grid grid-cols-2 gap-2 mt-3 text-xs sm:text-sm text-content-secondary group-hover:text-content-primary transition-colors`},Ot={class:`glass-card rounded-[15px] p-4 sm:p-6`},kt={class:`grid grid-cols-2 md:grid-cols-5 gap-3 text-sm`},At={class:`border border-stroke-subtle rounded-lg p-3`},jt={class:`text-content-primary font-medium`},Mt={class:`border border-stroke-subtle rounded-lg p-3`},Nt={class:`text-content-primary font-medium`},Pt={class:`border border-stroke-subtle rounded-lg p-3`},Ft={class:`text-content-primary font-medium`},It={class:`border border-stroke-subtle rounded-lg p-3`},Lt={class:`text-content-primary font-medium`},Rt=u({name:`RfHealthCorrelationView`,__name:`RfHealthCorrelation`,setup(l){N.register(oe,re,ie,F,A,k,se,I,D,O,ae,j);let u=[{value:1,label:`1 Hour`},{value:6,label:`6 Hours`},{value:24,label:`24 Hours`},{value:48,label:`2 Days`},{value:168,label:`1 Week`}],f=o(24),p=o(null),m=o(null),_=o(!1),C=o(!1),w=o(!0),T=o(null),E=o(`Connecting...`),L=o({}),R=o([]),z=o([]),B=o([]),V=o([]),H=o([]),U=o(null),ce=(e,t)=>typeof window>`u`?t:window.getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t,W=e=>{if(!e.startsWith(`var(`))return e;let t=e.match(/var\((--[^,)]+)/);return t?ce(t[1],e):e},G={noise:`var(--color-primary)`,crc:`var(--color-accent-red)`,packetCount:`var(--color-accent-green)`,grid:`var(--color-border-subtle)`,ticks:`var(--color-text-secondary)`,tooltipBg:`var(--color-surface-elevated)`,tooltipText:`var(--color-text-primary)`,tooltipBorder:`var(--color-border-subtle)`},K=e=>{if(typeof e==`number`&&Number.isFinite(e))return e;if(typeof e==`string`){let t=Number(e);if(Number.isFinite(t))return t}return null},q=e=>{let t=K(e);return t===null?null:t>0x38d7ea4c68000?Math.round(t/1e3):t>0xe8d4a51000?Math.round(t):t>1e9?Math.round(t*1e3):null},J=e=>!e||typeof e!=`object`||Array.isArray(e)?null:e,Y=(e,t)=>{if(e.length===0)return 0;let n=[...e].sort((e,t)=>e-t);return n[Math.max(0,Math.min(n.length-1,Math.round((n.length-1)*t)))]},le=e=>Y(e,.5),ue=(e,t,n)=>Math.min(n,Math.max(t,e)),de=e=>{let t=[],n=J(e)?.data??e,r=e=>{e.forEach(e=>{let n=J(e);if(!n)return;let r=q(n.timestamp),i=K(n.noise_floor_dbm??n.noise_floor??n.value);r!==null&&i!==null&&t.push({t:r,v:i})})};if(Array.isArray(n))r(n);else{let e=J(n);e&&(Array.isArray(e.history)&&r(e.history),Array.isArray(e.chart_data)&&r(e.chart_data),Array.isArray(e.values)&&r(e.values))}return t.sort((e,t)=>e.t-t.t)},fe=e=>{let t=[],n=J(e)?.data??e,r=e=>{e.forEach(e=>{let n=J(e);if(!n)return;let r=q(n.timestamp),i=K(n.count??n.crc_errors??n.value);r!==null&&i!==null&&t.push({t:r,v:i})})};if(Array.isArray(n))r(n);else{let e=J(n);e&&Array.isArray(e.history)&&r(e.history)}return t.sort((e,t)=>e.t-t.t)},pe=(e,t)=>{let n=[],r=J(J(e)?.data??e);if(!r||!Array.isArray(r.series))return n;let i=Array.isArray(r.timestamps)?r.timestamps.map(e=>q(e)).filter(e=>e!==null):[];return r.series.forEach(e=>{let r=J(e);if(!r)return;let a=String(r.type??``),o=String(r.name??``);if(!(a===t||o===t))return;let s=r.data;if(Array.isArray(s)){if(s.length>0&&Array.isArray(s[0])){s.forEach(e=>{if(!Array.isArray(e)||e.length<2)return;let t=q(e[0]),r=K(e[1]);t!==null&&r!==null&&n.push({t,v:r})});return}s.forEach((e,t)=>{let r=i[t]??null,a=K(e);r!==null&&a!==null&&n.push({t:r,v:a})})}}),n.sort((e,t)=>e.t-t.t)},me=e=>{let t=pe(e,`rx_count`),n=pe(e,`tx_count`),r=new Map;return t.forEach(e=>{r.set(e.t,(r.get(e.t)??0)+e.v)}),n.forEach(e=>{r.set(e.t,(r.get(e.t)??0)+e.v)}),Array.from(r.entries()).map(([e,t])=>({t:e,v:t})).sort((e,t)=>e.t-t.t)},he=(e,t,n)=>{let r=new Map;e.forEach(e=>{let n=Math.floor(e.t/t)*t;r.has(n)||r.set(n,[]),r.get(n)?.push(e.v)});let i=new Map;return r.forEach((e,t)=>{if(e.length!==0){if(n===`sum`){i.set(t,e.reduce((e,t)=>e+t,0));return}i.set(t,e.reduce((e,t)=>e+t,0)/e.length)}}),i},ge=()=>{let e=Math.max(3e4,Math.round(f.value*60*60*1e3/120)),t=he(R.value,e,`avg`),n=he(z.value,e,`sum`),r=he(B.value,e,`sum`),i=new Set([...t.keys(),...n.keys(),...r.keys()]);return Array.from(i).sort((e,t)=>e-t).map(e=>({bucketMs:e,noise:t.has(e)?t.get(e)??null:null,crc:n.get(e)??0,packets:r.has(e)?r.get(e)??0:0}))},X=(e,t)=>{if(e.length!==t.length||e.length<3)return null;let n=e.reduce((e,t)=>e+t,0)/e.length,r=t.reduce((e,t)=>e+t,0)/t.length,i=0,a=0,o=0;for(let s=0;sn<0?null:n===0?X(e,t):e.length<=n||t.length<=n?null:X(e.slice(0,e.length-n),t.slice(n)),ve=e=>{if(e.length===0)return[];let t=e.map(e=>e.noise).filter(e=>e!==null);if(t.length<5)return[];let n=le(t),r=n+Math.max(2,Y(t,.9)-n),i=Math.max(1,Y(e.map(e=>e.crc),.9)),a=e.filter(e=>{if(e.noise===null)return!1;let t=e.noise>=r,n=e.crc>=i;return t&&n});if(a.length===0)return[];let o=e.length>1?e[1].bucketMs-e[0].bucketMs:6e4,s=[],c=a[0].bucketMs,l=a[0].bucketMs,u=[a[0]],d=()=>{let e=u.map(e=>e.noise===null?0:e.noise-n),t=Math.max(...e),r=u.reduce((e,t)=>e+t.crc,0),i=t*2.5+r*.8,a=i>=20?`high`:i>=8?`medium`:`low`;s.push({id:`${c}-${l}`,startMs:c,endMs:l,peakNoiseDelta:t,totalCrc:r,totalDrops:0,severity:a})};for(let e=1;et.startMs-e.startMs).slice(0,12)},Z=g(()=>{let e=K(L.value.total_packets);if(e!==null)return e;let t=K(L.value.received)??0,n=K(L.value.transmitted)??0;return Math.max(t,n)}),ye=g(()=>{let e=K(L.value.dropped);if(e!==null)return e;let t=K(L.value.received)??0,n=K(L.value.transmitted)??0;return Math.max(0,t-n)}),be=g(()=>Z.value<=0?0:ye.value/Z.value),xe=g(()=>R.value.length===0?null:R.value[R.value.length-1].v),Se=g(()=>R.value.length<3?null:le(R.value.map(e=>e.v))),Ce=g(()=>z.value.reduce((e,t)=>e+t.v,0)),we=g(()=>{let e=xe.value,t=Se.value,n=0;e!==null&&t!==null&&(n=Math.max(0,e-t)*2.2);let r=(Z.value>0?Ce.value/Z.value:0)*120,i=be.value*100;return ue(Math.round(100-(n+r+i)),0,100)}),Q=g(()=>{let e=R.value.length>0?R.value[R.value.length-1].t:0,t=z.value.length>0?z.value[z.value.length-1].t:0,n=B.value.length>0?B.value[B.value.length-1].t:0,r=Math.max(e,t,n),i=r>0?Math.max(0,Math.round((Date.now()-r)/1e3)):null;return{noiseSamples:R.value.length,crcSamples:z.value.length,packetSamples:B.value.length,freshnessSeconds:i}}),Te=e=>new Date(e).toLocaleString(`en-US`,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`}),Ee=(e,t)=>{let n=Math.max(0,t-e),r=Math.floor(n/1e3),i=Math.floor(r/60),a=Math.floor(i/60);return a>0?`${a}h ${i%60}m`:i>0?`${i}m ${r%60}s`:`${r}s`};g(()=>{if(!U.value)return null;let e=U.value;return{startTime:Te(e.startMs),endTime:Te(e.endMs),duration:Ee(e.startMs,e.endMs),peakNoise:e.peakNoiseDelta.toFixed(2),totalCrc:e.totalCrc.toLocaleString(),severityColor:e.severity===`high`?`bg-accent-red/opacity-light text-accent-red`:e.severity===`medium`?`bg-accent-amber/opacity-light text-accent-amber`:`bg-accent-green/opacity-light text-accent-green`}});let De=g(()=>{let e=V.value.filter(e=>e.noise!==null),t=e.map(e=>e.noise),n=e.map(e=>e.crc),r=e.map(e=>e.packets),i=X(t,n),a=X(t,r),o=0,s=i,c=0,l=a;for(let e=1;e<=3;e+=1){let i=_e(t,n,e),a=_e(t,r,e);(i??0)>(s??-1/0)&&(o=e,s=i),(a??0)>(l??-1/0)&&(c=e,l=a)}return[{label:`Noise vs CRC errors`,correlation:i,strongestLagBuckets:o,strongestLagCorrelation:s},{label:`Noise vs packet activity`,correlation:a,strongestLagBuckets:c,strongestLagCorrelation:l}]}),Oe=e=>e===null||Number.isNaN(e)?`Insufficient samples`:e.toFixed(3),ke=e=>new Date(e).toLocaleString([],{hour:`2-digit`,minute:`2-digit`,month:`short`,day:`numeric`}),Ae=e=>e===null?`Unknown`:e<60?`${e}s ago`:e<3600?`${Math.round(e/60)}m ago`:`${Math.round(e/3600)}h ago`,je=async()=>{_.value?C.value=!0:w.value=!0,T.value=null;try{let[e,t,n,r]=await Promise.all([M(`/packet_stats`,{hours:f.value}),M(`/noise_floor_history`,{hours:f.value},{idleTimeoutMs:3e4,onPhaseChange:e=>{E.value=e===`receiving`?`Receiving data...`:`Connecting...`}}),M(`/crc_error_history`,{hours:f.value}),M(`/metrics_graph_data`,{hours:f.value,resolution:`average`,metrics:`rx_count,tx_count`})]),i=J(e.data)??{},a=J(i.data)??i;L.value={total_packets:K(a.total_packets)??void 0,received:K(a.received)??void 0,transmitted:K(a.transmitted)??void 0,dropped:K(a.dropped)??void 0},R.value=de(t.data),z.value=fe(n.data),B.value=me(r.data),V.value=ge(),H.value=ve(V.value),V.value.length===0&&(T.value=`No correlation data available for the selected time range.`),await ee(),Ne(),_.value=!0}catch(e){T.value=e instanceof Error?e.message:`Failed to load RF health correlation data.`}finally{w.value=!1,C.value=!1}},Me=()=>{m.value&&=(n(m.value).destroy(),null)},Ne=()=>{if(!p.value||V.value.length===0){Me();return}let e=p.value.getContext(`2d`);if(!e)return;let t=V.value.filter(e=>e.noise!==null).map(e=>({x:e.bucketMs,y:e.noise})),r=V.value.map(e=>({x:e.bucketMs,y:e.crc})),i=Math.max(1,...r.map(e=>e.y)),a=V.value.map(e=>({x:e.bucketMs,y:e.packets})),o=a.map(e=>e.y),s=o.length>0?Y(o,.95):1,c=Math.max(1,Math.ceil(s*1.25)),l=f.value>48?`day`:`hour`,u={type:`bar`,data:{datasets:[{type:`line`,label:`Noise floor (dBm)`,yAxisID:`yNoise`,data:t,borderColor:W(G.noise),backgroundColor:W(G.noise),borderWidth:2,tension:.25,pointRadius:0,pointHoverRadius:3},{type:`line`,label:`Packet count (bucket)`,yAxisID:`yPacketCount`,data:a,borderColor:W(G.packetCount),backgroundColor:W(G.packetCount),borderWidth:2,tension:.25,pointRadius:0,pointHoverRadius:3},{type:`bar`,label:`CRC errors`,yAxisID:`yCount`,data:r,borderWidth:0,backgroundColor:W(G.crc),barPercentage:.9,categoryPercentage:1}]},options:{responsive:!0,maintainAspectRatio:!1,interaction:{mode:`index`,intersect:!1},plugins:{legend:{position:`top`,labels:{color:W(G.ticks)}},tooltip:{backgroundColor:W(G.tooltipBg),titleColor:W(G.tooltipText),bodyColor:W(G.tooltipText),borderColor:W(G.tooltipBorder),borderWidth:1}},scales:{x:{type:`time`,time:{unit:l},min:Date.now()-f.value*60*60*1e3,max:Date.now(),grid:{color:W(G.grid)},ticks:{color:W(G.ticks),maxTicksLimit:8}},yNoise:{type:`linear`,position:`left`,title:{display:!0,text:`Noise floor (dBm)`,color:W(G.ticks)},grid:{color:W(G.grid)},ticks:{color:W(G.ticks)}},yCount:{type:`linear`,position:`right`,beginAtZero:!0,max:Math.ceil(i*1.2),title:{display:!0,text:`CRC errors`,color:W(G.ticks)},grid:{drawOnChartArea:!1},ticks:{color:W(G.ticks)}},yPacketCount:{type:`linear`,position:`right`,offset:!0,beginAtZero:!0,max:Math.ceil(c*1.2),title:{display:!0,text:`Packet count`,color:W(G.ticks)},grid:{drawOnChartArea:!1},ticks:{color:W(G.ticks)}}}}};if(m.value){let e=n(m.value);e.data=u.data,e.options=u.options,e.update();return}m.value=S(new N(e,u))},Pe=()=>{w.value=!0,Ie.runNow()},Fe=()=>{m.value&&window.setTimeout(()=>{n(m.value)?.resize()},80)},Ie=ne(je,{intervalMs:3e4,immediate:!0});return e(()=>{window.addEventListener(`resize`,Fe)}),x(()=>{window.removeEventListener(`resize`,Fe),Me()}),(e,n)=>(a(),b(`div`,tt,[y(`div`,$,[n[4]||=y(`div`,null,[y(`h2`,{class:`text-xl sm:text-2xl font-bold text-content-primary`},`RF Health Correlation`),y(`p`,{class:`text-xs sm:text-sm text-content-secondary mt-1`},` Live correlation of noise floor, CRC errors, and packet activity so you can spot traffic-related peaks. `)],-1),h(et,{incident:U.value,onClose:n[0]||=e=>U.value=null},null,8,[`incident`]),y(`div`,nt,[n[3]||=y(`label`,{class:`text-content-secondary text-xs sm:text-sm`},`Window:`,-1),i(y(`select`,{"onUpdate:modelValue":n[1]||=e=>f.value=e,class:`modal-select w-auto`,onChange:Pe},[(a(),b(v,null,t(u,e=>y(`option`,{key:e.value,value:e.value,class:`bg-surface text-content-primary`},c(e.label),9,rt)),64))],544),[[te,f.value]])])]),y(`div`,it,[y(`div`,at,[n[5]||=y(`div`,{class:`text-content-secondary text-xs uppercase tracking-wide`},`RF health score`,-1),y(`div`,ot,c(we.value),1)]),y(`div`,st,[n[6]||=y(`div`,{class:`text-content-secondary text-xs uppercase tracking-wide`},`Current noise floor`,-1),y(`div`,ct,c(xe.value===null?`N/A`:`${xe.value.toFixed(1)} dBm`),1)]),y(`div`,lt,[n[7]||=y(`div`,{class:`text-content-secondary text-xs uppercase tracking-wide`},`CRC errors`,-1),y(`div`,ut,c(Math.round(Ce.value).toLocaleString()),1)]),y(`div`,dt,[n[8]||=y(`div`,{class:`text-content-secondary text-xs uppercase tracking-wide`},`Dropped packets (reported)`,-1),y(`div`,ft,c(Math.round(ye.value).toLocaleString()),1),y(`div`,pt,`Drop rate: `+c((be.value*100).toFixed(2))+`%`,1)])]),y(`div`,mt,[n[9]||=y(`h3`,{class:`text-content-primary text-lg sm:text-xl font-semibold mb-3`},`Correlation timeline`,-1),h(P,{class:`h-[17rem] sm:h-[22rem]`,"is-loading":w.value,"is-updating":C.value,error:T.value,status:E.value,onRetry:n[2]||=()=>s(Ie).runNow()},{default:r(()=>[y(`canvas`,{ref_key:`chartCanvasRef`,ref:p,class:`w-full h-full`},null,512)]),_:1},8,[`is-loading`,`is-updating`,`error`,`status`])]),y(`div`,ht,[y(`div`,gt,[n[10]||=y(`h3`,{class:`text-content-primary text-lg font-semibold mb-4`},`Correlation details`,-1),y(`div`,_t,[(a(!0),b(v,null,t(De.value,e=>(a(),b(`div`,{key:e.label,class:`border border-stroke-subtle rounded-lg p-3`},[y(`div`,vt,c(e.label),1),y(`div`,yt,` Base correlation: `+c(Oe(e.correlation)),1),y(`div`,bt,` Strongest lag: +`+c(e.strongestLagBuckets)+` bucket(s), `+c(Oe(e.strongestLagCorrelation)),1)]))),128))])]),y(`div`,xt,[n[12]||=y(`h3`,{class:`text-content-primary text-lg font-semibold mb-4`},`Detected incidents`,-1),H.value.length===0?(a(),b(`div`,St,` No degradation windows detected for the selected time range. `)):(a(),b(`div`,Ct,[(a(!0),b(v,null,t(H.value,e=>(a(),b(`div`,{key:e.id,class:`border border-stroke-subtle rounded-lg p-3 hover:bg-surface-hover/opacity-subtle cursor-pointer transition-colors group`,onClick:t=>U.value=e},[y(`div`,Tt,[y(`div`,Et,c(ke(e.startMs))+` to `+c(ke(e.endMs)),1),y(`span`,{class:d([`text-xs font-semibold px-2 py-1 rounded-full`,{"bg-accent-red-bg text-accent-red":e.severity===`high`,"bg-accent-amber/opacity-light text-accent-amber":e.severity===`medium`,"bg-accent-green-bg text-accent-green":e.severity===`low`}])},c(e.severity),3)]),y(`div`,Dt,[y(`div`,null,`Noise delta: +`+c(e.peakNoiseDelta.toFixed(1))+` dB`,1),y(`div`,null,`CRC burst: `+c(Math.round(e.totalCrc).toLocaleString())+` errors`,1)]),n[11]||=y(`div`,{class:`text-xs text-content-tertiary mt-2 opacity-0 group-hover:opacity-100 transition-opacity`},`Click to view details`,-1)],8,wt))),128))]))])]),y(`div`,Ot,[n[17]||=y(`h3`,{class:`text-content-primary text-lg font-semibold mb-4`},`Data quality`,-1),y(`div`,kt,[y(`div`,At,[n[13]||=y(`div`,{class:`text-content-secondary`},`Noise samples`,-1),y(`div`,jt,c(Q.value.noiseSamples),1)]),y(`div`,Mt,[n[14]||=y(`div`,{class:`text-content-secondary`},`CRC samples`,-1),y(`div`,Nt,c(Q.value.crcSamples),1)]),y(`div`,Pt,[n[15]||=y(`div`,{class:`text-content-secondary`},`Packet events`,-1),y(`div`,Ft,c(Q.value.packetSamples),1)]),y(`div`,It,[n[16]||=y(`div`,{class:`text-content-secondary`},`Freshness`,-1),y(`div`,Lt,c(Ae(Q.value.freshnessSeconds)),1)])])])]))}});export{Rt as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/RoomServers-BUo8HwN-.js b/repeater/web/html/assets/RoomServers-t1qcIom6.js similarity index 99% rename from repeater/web/html/assets/RoomServers-BUo8HwN-.js rename to repeater/web/html/assets/RoomServers-t1qcIom6.js index c6ac0f9..bd3fe07 100644 --- a/repeater/web/html/assets/RoomServers-BUo8HwN-.js +++ b/repeater/web/html/assets/RoomServers-t1qcIom6.js @@ -1 +1 @@ -import{C as e,D as t,N as n,P as r,T as i,U as a,_t as o,c as s,f as ee,h as te,ht as c,i as l,j as ne,l as u,m as d,o as f,p,r as m,s as h,u as g}from"./runtime-core.esm-bundler-CINEgm0a.js";import{c as re,l as _,o as v,r as ie,t as ae}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as y}from"./api-CP9MgmUS.js";import{t as oe}from"./system-CGj1WgG8.js";import{t as b}from"./Spinner-CMJUE3iy.js";import{c as se,r as ce,s as le}from"./index-Cl4Dij8v.js";import{t as ue}from"./ConfirmDialog-Dl1jglkT.js";import{t as de}from"./MessageDialog-Dcp03-LQ.js";import{t as fe}from"./LocationPicker-BfCGxfpG.js";var pe={class:`p-6 space-y-6`},me={key:0,class:`grid grid-cols-1 md:grid-cols-3 gap-4`},he={class:`glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-5`},ge={class:`flex items-center justify-between`},_e={class:`text-3xl font-bold text-content-primary mb-1`},ve={class:`glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-5`},ye={class:`flex items-center justify-between`},be={class:`text-3xl font-bold text-primary mb-1`},xe={class:`glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-5`},Se={class:`flex items-center justify-between`},Ce={key:0,class:`w-6 h-6 text-accent-green`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},we={key:1,class:`w-6 h-6 text-accent-yellow`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Te={class:`glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-6`},Ee={key:0,class:`flex items-center justify-center py-12`},De={class:`text-center`},Oe={key:1,class:`flex items-center justify-center py-12`},ke={class:`text-center`},Ae={class:`text-content-secondary dark:text-content-muted text-sm mb-4`},je={key:2,class:`space-y-4`},Me={class:`flex items-start justify-between`},Ne={class:`flex-1`},Pe={class:`flex items-center gap-3 mb-4`},Fe={class:`relative`},Ie={key:0,class:`absolute inset-0 bg-accent-green/opacity-heavy rounded-full animate-ping`},Le={class:`text-xl font-bold text-content-primary`},Re={key:0,class:`text-content-muted text-sm`},ze={class:`grid grid-cols-1 md:grid-cols-2 gap-3 text-sm mb-3`},Be={class:`text-content-primary/opacity-heavy ml-2`},Ve={class:`flex items-center gap-2`},He={key:0,class:`text-content-primary/opacity-heavy font-mono ml-2 text-xs`},Ue={key:1,class:`text-content-muted ml-2 text-xs`},We=[`onClick`],Ge={class:`text-content-primary/opacity-heavy ml-2`},Ke={key:0},qe={class:`text-content-primary/opacity-heavy ml-2`},Je={key:0,class:`text-accent-green`},Ye={key:1,class:`text-content-muted`},Xe={key:2,class:`text-primary`},Ze={class:`text-content-primary/opacity-heavy ml-2`},Qe={key:0,class:`text-xs text-content-muted font-mono`},$e={class:`ml-4 flex flex-wrap gap-2`},et=[`onClick`,`disabled`,`title`],tt=[`onClick`,`disabled`,`title`],nt=[`onClick`],rt=[`onClick`],it={key:3,class:`text-center py-12 text-content-secondary dark:text-content-muted`},at={class:`modal-card max-w-2xl w-full max-h-[90vh] overflow-y-auto`},ot={class:`modal-field-label-row`},st={key:0},ct={key:1,class:`text-content-secondary dark:text-content-muted text-sm`},lt={class:`grid grid-cols-2 gap-5`},ut={class:`grid grid-cols-2 gap-5`},dt={class:`rounded-[12px] border border-stroke-subtle dark:border-white/opacity-light bg-background-card dark:bg-white/opacity-subtle p-4`},ft={class:`flex items-start gap-3 cursor-pointer`},pt={class:`text-content-secondary dark:text-content-muted text-xs mt-1`},mt={class:`modal-card max-w-2xl w-full max-h-[90vh] overflow-y-auto`},ht={class:`modal-field-label-row`},gt={key:0},_t={key:1,class:`text-content-secondary dark:text-content-muted text-sm`},vt={class:`grid grid-cols-2 gap-5`},yt={class:`grid grid-cols-2 gap-5`},bt={class:`rounded-[12px] border border-stroke-subtle dark:border-white/opacity-light bg-background-card dark:bg-white/opacity-subtle p-4`},xt={class:`flex items-start gap-3 cursor-pointer`},St={class:`text-content-secondary dark:text-content-muted text-xs mt-1`},Ct={class:`bg-white dark:bg-surface-elevated backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[20px] p-6 max-w-4xl w-full h-[85vh] flex flex-col shadow-2xl`},wt={class:`relative overflow-hidden rounded-[15px] mb-6 p-5 bg-white/opacity-heavy dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-white/opacity-light`},Tt={class:`relative flex items-center justify-between`},Et={class:`flex items-center gap-4`},Dt={class:`text-content-secondary dark:text-content-muted text-sm flex items-center gap-2`},Ot={class:`text-primary font-semibold`},kt={class:`flex items-center gap-2`},At={class:`bg-primary/opacity-medium px-1.5 py-0.5 rounded-full text-[10px]`},jt={class:`flex-1 overflow-y-auto mb-4 space-y-3`},Mt={key:0,class:`flex items-center justify-center py-12`},Nt={class:`text-center`},Pt={key:1,class:`flex items-center justify-center py-12`},Ft={class:`text-center`},It={class:`text-content-secondary dark:text-content-muted text-sm mb-4`},Lt={key:2,class:`space-y-3`},Rt={class:`relative flex items-start justify-between gap-3`},zt={class:`flex-1 min-w-0`},Bt={class:`flex items-center gap-2 mb-3`},Vt={class:`flex items-center gap-2 flex-wrap`},Ht={key:0,class:`text-primary text-sm font-bold`},Ut={key:1,class:`text-primary/opacity-heavy text-xs font-mono bg-primary/opacity-light px-2 py-1 rounded-md border border-primary/opacity-medium`},Wt={key:2,class:`text-content-muted text-xs`},Gt={class:`text-content-secondary dark:text-content-muted text-xs flex items-center gap-1`},Kt={key:3,class:`text-content-muted/opacity-heavy text-[10px] font-mono bg-background-mute dark:bg-white/opacity-subtle px-1.5 py-0.5 rounded`},qt={class:`text-content-primary/opacity-heavy text-sm leading-relaxed break-words whitespace-pre-wrap bg-background-mute dark:bg-white/opacity-subtle p-3 rounded-[10px] border border-stroke-subtle dark:border-white/opacity-light`},Jt=[`onClick`],Yt={key:0,class:`text-center pt-4`},Xt={key:1,class:`text-center pt-4`},Zt={class:`flex items-center justify-center gap-2 text-content-secondary dark:text-content-muted text-sm`},Qt={key:3,class:`flex items-center justify-center h-full`},$t={class:`relative overflow-hidden rounded-[15px] border-t border-stroke-subtle dark:border-white/opacity-medium pt-4 mt-4`},en={class:`relative space-y-3`},tn={class:`flex gap-3`},nn={class:`flex-1 relative`},rn=[`onKeydown`],an=[`disabled`],on={key:0,class:`modal-backdrop z-[350]!`},sn={class:`bg-white dark:bg-surface-elevated backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-6 max-w-3xl w-full max-h-[80vh] flex flex-col`},cn={class:`flex items-center justify-between mb-4 pb-4 border-b border-stroke-subtle dark:border-white/opacity-light`},ln={class:`text-content-secondary dark:text-content-primary/opacity-heavy text-sm mt-1`},un={class:`text-primary`},dn={class:`flex-1 overflow-y-auto space-y-3`},fn={key:0,class:`text-center py-12`},pn={class:`space-y-2`},mn={class:`flex items-center justify-between`},hn={class:`flex items-center gap-2`},gn={class:`text-content-primary font-semibold`},_n={class:`flex items-center gap-2`},vn={class:`text-content-secondary dark:text-content-muted text-xs`},yn=[`onClick`],bn={class:`space-y-1 text-xs`},xn={class:`flex items-center gap-2`},Sn={class:`text-primary font-mono bg-primary/opacity-light px-2 py-0.5 rounded`},Cn={class:`flex items-center gap-2`},wn={class:`text-primary font-mono bg-primary/opacity-light px-2 py-0.5 rounded text-[10px] break-all`},Tn={class:`flex items-center justify-between text-xs text-content-secondary dark:text-content-muted`},En={class:`flex items-center gap-4`},Dn={key:0},On={key:1},kn={key:0},x=te({name:`RoomServersView`,__name:`RoomServers`,setup(te){let x=oe(),An=f(()=>x.stats?.config?.repeater?.latitude??0),jn=f(()=>x.stats?.config?.repeater?.longitude??0),Mn=a(!1),Nn=a(!1),Pn=a(!1),S=a(null),C=a(null),w=a(!1),T=a(!1),E=a(!1),D=a(null),O=a(``),k=a(!1),A=a(!1),j=a(new Set),Fn=f(()=>C.value?.configured?.filter(e=>e.registered).length??0),In=f(()=>C.value?.configured?.length??0),M=f(()=>Fn.value===In.value),N=a(!1),P=a(``),F=a(!1),I=a({message:``,variant:`success`}),L=a(!1),R=a(``),z=a(``),B=a([]),V=a(!1),H=a(null),U=a(``),W=a(le(`roomServers_messagesLimit`,50)),G=a(0),K=a(!0);ne(W,e=>se(`roomServers_messagesLimit`,e));let q=a([]),J=a(!1),Y=a({name:``,identity_key:``,type:`room_server`,settings:{node_name:``,latitude:0,longitude:0,admin_password:``,guest_password:``,allow_read_only:!0}});e(async()=>{await X()});async function X(){Pn.value=!0,S.value=null;try{let e=await y.getIdentities();e.success?C.value=e.data:S.value=e.error||`Failed to load identities`}catch(e){S.value=e instanceof Error?e.message:`Failed to load identities`}finally{Pn.value=!1}}function Ln(e){e.latitude=Math.round(e.latitude*1e6)/1e6,e.longitude=Math.round(e.longitude*1e6)/1e6}async function Rn(){Ln(Y.value.settings);try{let e=await y.createIdentity(Y.value);e.success?(w.value=!1,await X(),E.value=!0):Z(`Failed to create identity: ${e.error}`,`error`)}catch(e){Z(`Error creating identity: ${e}`,`error`)}}async function zn(){let e={...D.value,settings:{...D.value.settings}};Ln(e.settings),e.name===O.value?delete e.new_name:(e.new_name=e.name,e.name=O.value);try{let t=await y.updateIdentity(e);t.success?(T.value=!1,D.value=null,await X(),E.value=!0):Z(`Failed to update identity: ${t.error}`,`error`)}catch(e){Z(`Error updating identity: ${e}`,`error`)}}function Bn(e){P.value=e,N.value=!0}async function Vn(){let e=P.value;N.value=!1;try{let t=await y.deleteIdentity(e);t.success?(await X(),E.value=!0):Z(`Failed to delete identity: ${t.error}`,`error`)}catch(e){Z(`Error deleting identity: ${e}`,`error`)}finally{P.value=``}}function Z(e,t){I.value={message:e,variant:t},F.value=!0}async function Hn(e){try{let t=await y.sendRoomServerAdvert(e);t.success?Z(t.message||`Advert sent for '${e}'!`,`success`):Z(`Failed to send advert: ${t.error}`,`error`)}catch(e){Z(`Error sending advert: ${e}`,`error`)}}function Un(e){D.value=JSON.parse(JSON.stringify(e)),O.value=D.value.name,delete D.value.new_name,D.value.settings||(D.value.settings={}),D.value.settings.admin_password||(D.value.settings.admin_password=``),D.value.settings.guest_password||(D.value.settings.guest_password=``),D.value.settings.allow_read_only??(D.value.settings.allow_read_only=!0),D.value.settings.latitude??(D.value.settings.latitude=0),D.value.settings.longitude??(D.value.settings.longitude=0),A.value=!1,T.value=!0}function Wn(){Y.value={name:``,identity_key:``,type:`room_server`,settings:{node_name:``,latitude:An.value,longitude:jn.value,admin_password:``,guest_password:``,allow_read_only:!0}},Ln(Y.value.settings),k.value=!1}function Gn(){Wn(),w.value=!0}function Kn(e){Y.value.settings.latitude=e.latitude,Y.value.settings.longitude=e.longitude}function qn(e){D.value&&(D.value.settings.latitude=e.latitude,D.value.settings.longitude=e.longitude)}function Q(){w.value=!1,T.value=!1,D.value=null,k.value=!1,A.value=!1}function Jn(e){j.value.has(e)?j.value.delete(e):j.value.add(e)}function Yn(e){return e?.allow_read_only!==!1}async function Xn(e){R.value=e,L.value=!0,G.value=0,K.value=!0,z.value=C.value?.configured.find(t=>t.name===e)?.hash||``,await Zn(),await $(!0)}async function Zn(){try{let e=await y.getACLClients({identity_hash:z.value,identity_name:R.value});e.success&&e.data&&(q.value=e.data.clients||[])}catch(e){console.error(`Failed to fetch ACL clients:`,e)}}async function $(e=!1){e&&(G.value=0,B.value=[]),V.value=!0,H.value=null;try{let t=await y.getRoomMessages({room_name:R.value,limit:W.value,offset:G.value});if(t.success&&t.data){let n=t.data.messages||[];e?B.value=n:B.value=[...B.value,...n],K.value=n.length===W.value}else H.value=t.error||`Failed to load messages`}catch(e){H.value=e instanceof Error?e.message:`Failed to load messages`}finally{V.value=!1}}async function Qn(){G.value+=W.value,await $(!1)}async function $n(){if(U.value.trim())try{let e=await y.postRoomMessage({room_name:R.value,message:U.value,author_pubkey:`server`});e.success?(U.value=``,await $(!0)):Z(`Failed to send message: ${e.error}`,`error`)}catch(e){Z(`Error sending message: ${e}`,`error`)}}async function er(e){if(confirm(`Are you sure you want to delete this message?`))try{let t=await y.deleteRoomMessage({room_name:R.value,message_id:e});t.success?(await $(!0),Z(`Message deleted successfully`,`success`)):Z(`Failed to delete message: ${t.error}`,`error`)}catch(e){Z(`Error deleting message: ${e}`,`error`)}}function tr(){L.value=!1,R.value=``,z.value=``,B.value=[],U.value=``,H.value=null,q.value=[]}function nr(e){return e?new Date(e*1e3).toLocaleString():`Unknown`}async function rr(e,t){if(confirm(`Are you sure you want to remove this client from the ACL?`))try{let n=await y.removeACLClient({public_key:e,identity_hash:t});n.success?(await Zn(),Z(`Client removed successfully`,`success`)):Z(`Failed to remove client: ${n.error}`,`error`)}catch(e){Z(`Error removing client: ${e}`,`error`)}}return(e,a)=>(i(),g(m,null,[h(`div`,pe,[h(`div`,{class:`relative overflow-hidden rounded-[20px] p-6 mb-6 glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light`},[a[32]||=h(`div`,{class:`absolute inset-0 bg-gradient-to-br from-primary/20 via-secondary/10 to-accent-purple/20 opacity-50`},null,-1),a[33]||=h(`div`,{class:`absolute inset-0 bg-gradient-to-tl from-accent-green/10 via-transparent to-primary/10 animate-pulse`},null,-1),h(`div`,{class:`relative flex items-center justify-between`},[a[31]||=ee(`

Room Servers

Manage room server identities and messages

`,1),h(`button`,{onClick:Gn,class:`group relative px-6 py-3 bg-gradient-to-r from-primary/30 to-secondary/30 hover:from-primary/40 hover:to-secondary/40 text-content-primary rounded-[12px] border border-primary/opacity-heavy transition-all hover:scale-105 hover:shadow-lg hover:shadow-primary/opacity-medium`},[...a[30]||=[h(`span`,{class:`flex items-center gap-2`},[h(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 4v16m8-8H4`})]),p(` Add Room Server `)],-1)]])])]),C.value&&C.value.total_configured>0?(i(),g(`div`,me,[h(`div`,he,[h(`div`,ge,[h(`div`,null,[a[34]||=h(`div`,{class:`text-content-secondary dark:text-content-muted text-xs font-medium mb-2 uppercase tracking-wide`},` Total Configured `,-1),h(`div`,_e,o(In.value),1)]),a[35]||=h(`div`,{class:`bg-background-mute dark:bg-white/opacity-subtle p-3 rounded-[12px]`},[h(`svg`,{class:`w-6 h-6 text-content-secondary dark:text-content-primary/opacity-heavy`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10`})])],-1)])]),h(`div`,ve,[h(`div`,ye,[h(`div`,null,[a[36]||=h(`div`,{class:`text-content-secondary dark:text-content-muted text-xs font-medium mb-2 uppercase tracking-wide`},` Currently Registered `,-1),h(`div`,be,o(Fn.value),1)]),a[37]||=h(`div`,{class:`bg-primary/opacity-medium p-3 rounded-[12px]`},[h(`svg`,{class:`w-6 h-6 text-primary`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 13l4 4L19 7`})])],-1)])]),h(`div`,xe,[h(`div`,Se,[h(`div`,null,[a[38]||=h(`div`,{class:`text-content-secondary dark:text-content-muted text-xs font-medium mb-2 uppercase tracking-wide`},` Status `,-1),h(`div`,{class:c([`text-3xl font-bold`,M.value?`text-accent-green`:`text-accent-yellow`])},o(M.value?`Synced`:`Out of Sync`),3)]),h(`div`,{class:c([`p-3 rounded-[12px]`,M.value?`bg-accent-green/opacity-medium`:`bg-accent-yellow/20`])},[M.value?(i(),g(`svg`,Ce,[...a[39]||=[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z`},null,-1)]])):(i(),g(`svg`,we,[...a[40]||=[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`},null,-1)]]))],2)])])])):u(``,!0),h(`div`,Te,[Pn.value?(i(),g(`div`,Ee,[h(`div`,De,[d(b,{class:`mx-auto mb-4`}),a[41]||=h(`div`,{class:`text-content-secondary dark:text-content-primary/opacity-heavy`},` Loading room servers... `,-1)])])):S.value?(i(),g(`div`,Oe,[h(`div`,ke,[a[42]||=h(`div`,{class:`text-accent-red mb-2`},`Failed to load room servers`,-1),h(`div`,Ae,o(S.value),1),h(`button`,{onClick:X,class:`btn-primary`},` Retry `)])])):C.value&&C.value.configured.length>0?(i(),g(`div`,je,[(i(!0),g(m,null,t(C.value.configured,e=>(i(),g(`div`,{key:e.name,class:`glass-card backdrop-blur-xl rounded-[15px] p-5 border border-stroke-subtle dark:border-white/opacity-light`},[h(`div`,Me,[h(`div`,Ne,[h(`div`,Pe,[h(`div`,Fe,[e.registered?(i(),g(`div`,Ie)):u(``,!0),h(`div`,{class:c([`relative w-3 h-3 rounded-full`,e.registered?`bg-accent-green`:`bg-accent-red`])},null,2)]),h(`h3`,Le,o(e.name),1),h(`span`,{class:c([`px-3 py-1 text-xs font-semibold rounded-full`,e.registered?`bg-accent-green/opacity-medium text-accent-green border border-accent-green/opacity-medium`:`bg-accent-red/opacity-medium text-accent-red border border-accent-red/opacity-medium`])},o(e.registered?`● Active`:`○ Inactive`),3),e.hash?(i(),g(`span`,Re,o(e.hash),1)):u(``,!0)]),h(`div`,ze,[h(`div`,null,[a[43]||=h(`span`,{class:`text-content-muted`},`Node Name:`,-1),h(`span`,Be,o(e.settings?.node_name||`Not set`),1)]),h(`div`,Ve,[a[44]||=h(`span`,{class:`text-content-muted`},`Identity Key:`,-1),j.value.has(e.name)?(i(),g(`span`,He,o(e.identity_key),1)):(i(),g(`span`,Ue,` •••••••••••••••• `)),h(`button`,{onClick:t=>Jn(e.name),class:`text-primary/opacity-heavy hover:text-primary text-xs underline`},o(j.value.has(e.name)?`Hide`:`Show`),9,We)]),h(`div`,null,[a[45]||=h(`span`,{class:`text-content-muted`},`Location:`,-1),h(`span`,Ge,o(e.settings?.latitude||0)+`, `+o(e.settings?.longitude||0),1)]),e.settings?.admin_password||e.settings?.guest_password?(i(),g(`div`,Ke,[a[46]||=h(`span`,{class:`text-content-muted`},`Password Roles:`,-1),h(`span`,qe,[e.settings?.admin_password?(i(),g(`span`,Je,`Admin`)):u(``,!0),e.settings?.admin_password&&e.settings?.guest_password?(i(),g(`span`,Ye,` / `)):u(``,!0),e.settings?.guest_password?(i(),g(`span`,Xe,`Guest (read/write)`)):u(``,!0)])])):u(``,!0),h(`div`,null,[a[47]||=h(`span`,{class:`text-content-muted`},`Blank Password Login:`,-1),h(`span`,Ze,[h(`span`,{class:c(Yn(e.settings)?`text-accent-amber`:`text-content-muted`)},o(Yn(e.settings)?`Allowed as read-only guest`:`Disabled`),3)])])]),e.address?(i(),g(`div`,Qe,` Address: `+o(e.address),1)):u(``,!0)]),h(`div`,$e,[h(`button`,{onClick:t=>Xn(e.name),disabled:!e.registered,class:c([`group px-4 py-2 rounded-[10px] text-xs font-medium transition-all duration-200 flex items-center gap-2`,e.registered?`bg-accent-amber/opacity-medium hover:bg-accent-amber/opacity-medium text-accent-amber border border-accent-amber/opacity-medium hover:scale-105 hover:shadow-lg hover:shadow-secondary/opacity-medium`:`bg-background-mute dark:bg-white/opacity-subtle text-content-muted/opacity-heavy cursor-not-allowed border border-stroke-subtle dark:border-stroke/opacity-light`]),title:e.registered?`Manage messages for this room`:`Room server must be active to manage messages`},[...a[48]||=[h(`svg`,{class:`w-4 h-4 group-hover:rotate-12 transition-transform`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z`})],-1),p(` Messages `,-1)]],10,et),h(`button`,{onClick:t=>Hn(e.name),disabled:!e.registered,class:c([`group px-4 py-2 rounded-[10px] text-xs font-medium transition-all duration-200 flex items-center gap-2`,e.registered?`bg-accent-green/opacity-medium hover:bg-accent-green/opacity-medium text-accent-green border border-accent-green/opacity-medium hover:scale-105 hover:shadow-lg hover:shadow-accent-green/opacity-medium`:`bg-background-mute dark:bg-white/opacity-subtle text-content-muted/opacity-heavy cursor-not-allowed border border-stroke-subtle dark:border-stroke/opacity-light`]),title:e.registered?`Send advert for this room server`:`Room server must be active to send advert`},[...a[49]||=[h(`svg`,{class:`w-4 h-4 group-hover:scale-110 transition-transform`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M13 10V3L4 14h7v7l9-11h-7z`})],-1),p(` Send Advert `,-1)]],10,tt),h(`button`,{onClick:t=>Un(e),class:`btn-primary-xs`},` Edit `,8,nt),h(`button`,{onClick:t=>Bn(e.name),class:`btn-danger-xs`},` Delete `,8,rt)])])]))),128))])):(i(),g(`div`,it,[a[50]||=h(`svg`,{class:`w-16 h-16 mx-auto mb-4 text-content-muted/opacity-heavy`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4`})],-1),a[51]||=h(`p`,{class:`text-lg mb-2`},`No room servers configured`,-1),a[52]||=h(`p`,{class:`text-sm mb-4`},`Add your first room server to get started`,-1),h(`button`,{onClick:Gn,class:`btn-primary`},` + Add Room Server `)]))]),(i(),s(l,{to:`body`},[d(ae,{"enter-active-class":`transition-opacity duration-200`,"enter-from-class":`opacity-0`,"leave-active-class":`transition-opacity duration-200`,"leave-to-class":`opacity-0`},{default:n(()=>[w.value?(i(),g(`div`,{key:0,class:`modal-backdrop`,onClick:_(Q,[`self`])},[h(`div`,at,[h(`div`,{class:`flex items-center justify-between mb-7`},[a[54]||=h(`div`,null,[h(`h3`,{class:`text-xl font-semibold text-content-primary`},` Add Room Server `),h(`p`,{class:`text-content-secondary dark:text-content-muted text-sm mt-1`},` Configure a new room server identity `)],-1),h(`button`,{onClick:Q,class:`text-content-secondary dark:text-white/60 hover:text-content-primary dark:hover:text-white transition-colors`},[...a[53]||=[h(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),h(`form`,{onSubmit:_(Rn,[`prevent`]),class:`modal-form`},[h(`div`,null,[a[55]||=h(`label`,{class:`modal-field-label`},[p(`Name `),h(`span`,{class:`text-accent-red`},`*`)],-1),r(h(`input`,{"onUpdate:modelValue":a[0]||=e=>Y.value.name=e,type:`text`,placeholder:`e.g., MainBBS`,class:`modal-input`},null,512),[[v,Y.value.name]])]),h(`div`,null,[h(`div`,ot,[a[56]||=h(`span`,{class:`text-xs font-medium text-content-secondary dark:text-content-muted`},`Identity Key (Optional)`,-1),h(`button`,{onClick:a[1]||=e=>k.value=!k.value,type:`button`,class:`text-primary/opacity-heavy hover:text-primary text-xs underline`},o(k.value?`Hide`:`Show/Edit`),1)]),k.value?(i(),g(`div`,st,[r(h(`input`,{"onUpdate:modelValue":a[2]||=e=>Y.value.identity_key=e,type:`text`,placeholder:`Leave empty to auto-generate`,class:`modal-input font-mono`},null,512),[[v,Y.value.identity_key]]),a[57]||=h(`p`,{class:`text-content-secondary dark:text-content-muted text-xs mt-1`},` Leave empty to automatically generate a secure key `,-1)])):(i(),g(`div`,ct,` Will be auto-generated if not provided `))]),h(`div`,null,[a[58]||=h(`label`,{class:`modal-field-label`},`Node Name`,-1),r(h(`input`,{"onUpdate:modelValue":a[3]||=e=>Y.value.settings.node_name=e,type:`text`,placeholder:`Display name for the room server`,class:`modal-input`},null,512),[[v,Y.value.settings.node_name]])]),h(`div`,null,[a[62]||=h(`label`,{class:`modal-field-label`},`Location`,-1),h(`button`,{type:`button`,onClick:a[4]||=e=>Mn.value=!0,class:`flex items-center gap-1.5 px-2.5 py-1 mb-3 text-xs bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light text-content-secondary dark:text-content-primary rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium transition-colors`,title:`Pick location on map`},[...a[59]||=[h(`svg`,{class:`w-3.5 h-3.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z`}),h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 11a3 3 0 11-6 0 3 3 0 016 0z`})],-1),p(` Pick on Map `,-1)]]),h(`div`,lt,[h(`div`,null,[a[60]||=h(`label`,{class:`modal-field-label`},`Latitude`,-1),r(h(`input`,{"onUpdate:modelValue":a[5]||=e=>Y.value.settings.latitude=e,type:`number`,step:`0.000001`,class:`modal-input`},null,512),[[v,Y.value.settings.latitude,void 0,{number:!0}]])]),h(`div`,null,[a[61]||=h(`label`,{class:`modal-field-label`},`Longitude`,-1),r(h(`input`,{"onUpdate:modelValue":a[6]||=e=>Y.value.settings.longitude=e,type:`number`,step:`0.000001`,class:`modal-input`},null,512),[[v,Y.value.settings.longitude,void 0,{number:!0}]])])])]),h(`div`,ut,[h(`div`,null,[a[63]||=h(`label`,{class:`modal-field-label`},`Admin Password (Optional)`,-1),r(h(`input`,{"onUpdate:modelValue":a[7]||=e=>Y.value.settings.admin_password=e,type:`password`,placeholder:`Leave empty for no password`,class:`modal-input`},null,512),[[v,Y.value.settings.admin_password]]),a[64]||=h(`p`,{class:`text-content-secondary dark:text-content-muted text-xs mt-1`},`Full access to room server`,-1)]),h(`div`,null,[a[65]||=h(`label`,{class:`modal-field-label`},`Guest Password (Optional)`,-1),r(h(`input`,{"onUpdate:modelValue":a[8]||=e=>Y.value.settings.guest_password=e,type:`password`,placeholder:`Leave empty for no password`,class:`modal-input`},null,512),[[v,Y.value.settings.guest_password]]),a[66]||=h(`p`,{class:`text-content-secondary dark:text-content-muted text-xs mt-1`},`Guest role with read/write posting (non-admin)`,-1)])]),h(`div`,dt,[h(`label`,ft,[r(h(`input`,{"onUpdate:modelValue":a[9]||=e=>Y.value.settings.allow_read_only=e,type:`checkbox`,class:`mt-0.5 h-4 w-4 rounded border-stroke-subtle text-primary focus:ring-primary/opacity-heavy`},null,512),[[ie,Y.value.settings.allow_read_only]]),h(`div`,null,[a[67]||=h(`p`,{class:`text-sm font-medium text-content-primary`},`Allow blank-password read-only login`,-1),h(`p`,pt,o(Y.value.settings.allow_read_only?`Clients without a password can login as read-only guests.`:`Clients must provide admin or guest password to login.`),1)])])]),h(`div`,{class:`modal-actions`},[h(`button`,{type:`button`,onClick:Q,class:`modal-btn-cancel`},`Cancel`),a[68]||=h(`button`,{type:`submit`,class:`modal-btn-primary`},`Create`,-1)])],32)])])):u(``,!0)]),_:1})])),d(fe,{"is-open":Mn.value,latitude:Y.value.settings.latitude,longitude:Y.value.settings.longitude,onClose:a[10]||=e=>Mn.value=!1,onSelect:Kn},null,8,[`is-open`,`latitude`,`longitude`]),(i(),s(l,{to:`body`},[d(ae,{"enter-active-class":`transition-opacity duration-200`,"enter-from-class":`opacity-0`,"leave-active-class":`transition-opacity duration-200`,"leave-to-class":`opacity-0`},{default:n(()=>[T.value&&D.value?(i(),g(`div`,{key:0,class:`modal-backdrop`,onClick:_(Q,[`self`])},[h(`div`,mt,[h(`div`,{class:`flex items-center justify-between mb-7`},[a[70]||=h(`div`,null,[h(`h3`,{class:`text-xl font-semibold text-content-primary`},` Edit Room Server `),h(`p`,{class:`text-content-secondary dark:text-content-muted text-sm mt-1`},` Update room server identity `)],-1),h(`button`,{onClick:Q,class:`text-content-secondary dark:text-white/60 hover:text-content-primary dark:hover:text-white transition-colors`},[...a[69]||=[h(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),h(`form`,{onSubmit:_(zn,[`prevent`]),class:`modal-form`},[h(`div`,null,[a[71]||=h(`label`,{class:`modal-field-label`},[p(`Name `),h(`span`,{class:`text-accent-red`},`*`)],-1),r(h(`input`,{"onUpdate:modelValue":a[11]||=e=>D.value.name=e,type:`text`,class:`modal-input`},null,512),[[v,D.value.name]])]),h(`div`,null,[h(`div`,ht,[a[72]||=h(`span`,{class:`text-xs font-medium text-content-secondary dark:text-content-muted`},`Identity Key (Optional)`,-1),h(`button`,{onClick:a[12]||=e=>A.value=!A.value,type:`button`,class:`text-primary/opacity-heavy hover:text-primary text-xs underline`},o(A.value?`Hide`:`Show/Edit`),1)]),A.value?(i(),g(`div`,gt,[r(h(`input`,{"onUpdate:modelValue":a[13]||=e=>D.value.identity_key=e,type:`text`,placeholder:`Leave empty to keep current key`,class:`modal-input font-mono`},null,512),[[v,D.value.identity_key]]),a[73]||=h(`p`,{class:`text-content-secondary dark:text-content-muted text-xs mt-1`},` Leave empty to keep the current identity key `,-1)])):(i(),g(`div`,_t,` Click "Show/Edit" to change the identity key `))]),h(`div`,null,[a[74]||=h(`label`,{class:`modal-field-label`},`Node Name`,-1),r(h(`input`,{"onUpdate:modelValue":a[14]||=e=>D.value.settings.node_name=e,type:`text`,class:`modal-input`},null,512),[[v,D.value.settings.node_name]])]),h(`div`,null,[a[78]||=h(`label`,{class:`modal-field-label`},`Location`,-1),h(`button`,{type:`button`,onClick:a[15]||=e=>Nn.value=!0,class:`flex items-center gap-1.5 px-2.5 py-1 mb-3 text-xs bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light text-content-secondary dark:text-content-primary rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium transition-colors`,title:`Pick location on map`},[...a[75]||=[h(`svg`,{class:`w-3.5 h-3.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z`}),h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 11a3 3 0 11-6 0 3 3 0 016 0z`})],-1),p(` Pick on Map `,-1)]]),h(`div`,vt,[h(`div`,null,[a[76]||=h(`label`,{class:`modal-field-label`},`Latitude`,-1),r(h(`input`,{"onUpdate:modelValue":a[16]||=e=>D.value.settings.latitude=e,type:`number`,step:`0.000001`,class:`modal-input`},null,512),[[v,D.value.settings.latitude,void 0,{number:!0}]])]),h(`div`,null,[a[77]||=h(`label`,{class:`modal-field-label`},`Longitude`,-1),r(h(`input`,{"onUpdate:modelValue":a[17]||=e=>D.value.settings.longitude=e,type:`number`,step:`0.000001`,class:`modal-input`},null,512),[[v,D.value.settings.longitude,void 0,{number:!0}]])])])]),h(`div`,yt,[h(`div`,null,[a[79]||=h(`label`,{class:`modal-field-label`},`Admin Password (Optional)`,-1),r(h(`input`,{"onUpdate:modelValue":a[18]||=e=>D.value.settings.admin_password=e,type:`password`,placeholder:`Leave empty for no password`,class:`modal-input`},null,512),[[v,D.value.settings.admin_password]]),a[80]||=h(`p`,{class:`text-content-secondary dark:text-content-muted text-xs mt-1`},`Full access to room server`,-1)]),h(`div`,null,[a[81]||=h(`label`,{class:`modal-field-label`},`Guest Password (Optional)`,-1),r(h(`input`,{"onUpdate:modelValue":a[19]||=e=>D.value.settings.guest_password=e,type:`password`,placeholder:`Leave empty for no password`,class:`modal-input`},null,512),[[v,D.value.settings.guest_password]]),a[82]||=h(`p`,{class:`text-content-secondary dark:text-content-muted text-xs mt-1`},`Guest role with read/write posting (non-admin)`,-1)])]),h(`div`,bt,[h(`label`,xt,[r(h(`input`,{"onUpdate:modelValue":a[20]||=e=>D.value.settings.allow_read_only=e,type:`checkbox`,class:`mt-0.5 h-4 w-4 rounded border-stroke-subtle text-primary focus:ring-primary/opacity-heavy`},null,512),[[ie,D.value.settings.allow_read_only]]),h(`div`,null,[a[83]||=h(`p`,{class:`text-sm font-medium text-content-primary`},`Allow blank-password read-only login`,-1),h(`p`,St,o(D.value.settings.allow_read_only?`Clients without a password can login as read-only guests.`:`Clients must provide admin or guest password to login.`),1)])])]),h(`div`,{class:`modal-actions`},[h(`button`,{type:`button`,onClick:Q,class:`modal-btn-cancel`},`Cancel`),a[84]||=h(`button`,{type:`submit`,class:`modal-btn-primary`},`Update`,-1)])],32)])])):u(``,!0)]),_:1})])),d(fe,{"is-open":Nn.value,latitude:D.value?.settings?.latitude,longitude:D.value?.settings?.longitude,onClose:a[21]||=e=>Nn.value=!1,onSelect:qn},null,8,[`is-open`,`latitude`,`longitude`])]),d(ue,{show:N.value,title:`Delete Room Server`,message:`Are you sure you want to delete '${P.value}'? This action cannot be undone.`,"confirm-text":`Delete`,"cancel-text":`Cancel`,variant:`danger`,onClose:a[22]||=e=>N.value=!1,onConfirm:Vn},null,8,[`show`,`message`]),d(de,{show:F.value,message:I.value.message,variant:I.value.variant,onClose:a[23]||=e=>F.value=!1},null,8,[`show`,`message`,`variant`]),d(ce,{modelValue:E.value,"onUpdate:modelValue":a[24]||=e=>E.value=e,message:`Room server settings have been saved. A service restart is required for the changes to take effect.`},null,8,[`modelValue`]),(i(),s(l,{to:`body`},[L.value?(i(),g(`div`,{key:0,class:`modal-backdrop`,onClick:a[28]||=_(e=>L.value=!1,[`self`])},[h(`div`,Ct,[h(`div`,wt,[a[91]||=h(`div`,{class:`absolute inset-0 bg-gradient-to-r from-secondary/20 via-primary/20 to-accent-purple/20`},null,-1),a[92]||=h(`div`,{class:`absolute inset-0 bg-gradient-to-br from-transparent via-white/opacity-subtle to-transparent`},null,-1),h(`div`,Tt,[h(`div`,Et,[a[87]||=h(`div`,{class:`relative`},[h(`div`,{class:`absolute inset-0 bg-accent-amber/opacity-heavy blur-xl rounded-full`}),h(`div`,{class:`relative bg-accent-amber/opacity-medium p-3 rounded-[12px] border border-accent-amber/opacity-medium`},[h(`svg`,{class:`w-6 h-6 text-accent-amber`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z`})])])],-1),h(`div`,null,[a[86]||=h(`h2`,{class:`text-2xl font-bold text-content-primary mb-1`},` Room Messages `,-1),h(`p`,Dt,[a[85]||=h(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z`})],-1),h(`span`,Ot,o(R.value),1)])])]),h(`div`,kt,[h(`button`,{onClick:a[25]||=e=>J.value=!0,class:`group px-3 py-2 bg-primary/opacity-medium hover:bg-primary/opacity-medium text-primary rounded-[10px] text-xs font-medium transition-all hover:scale-105 border border-primary/opacity-medium flex items-center gap-2`,title:`View active sessions`},[a[88]||=h(`svg`,{class:`w-4 h-4 group-hover:scale-110 transition-transform`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z`})],-1),a[89]||=h(`span`,{class:`hidden sm:inline`},`Sessions`,-1),h(`span`,At,o(q.value.length),1)]),h(`button`,{onClick:tr,class:`p-2 text-content-secondary dark:text-content-primary/opacity-heavy hover:text-content-primary dark:hover:text-content-primary hover:bg-stroke-subtle dark:hover:bg-white/opacity-light rounded-[10px] transition-all`},[...a[90]||=[h(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])])])]),h(`div`,jt,[V.value&&B.value.length===0?(i(),g(`div`,Mt,[h(`div`,Nt,[d(b,{class:`mx-auto mb-4`}),a[93]||=h(`div`,{class:`text-content-secondary dark:text-content-primary/opacity-heavy`},` Loading messages... `,-1)])])):H.value?(i(),g(`div`,Pt,[h(`div`,Ft,[a[94]||=h(`div`,{class:`text-accent-red mb-2`},`Failed to load messages`,-1),h(`div`,It,o(H.value),1),h(`button`,{onClick:a[26]||=e=>$(!0),class:`btn-primary`},` Retry `)])])):B.value.length>0?(i(),g(`div`,Lt,[(i(!0),g(m,null,t(B.value,(e,t)=>(i(),g(`div`,{key:e.id||t,class:`group relative overflow-hidden glass-card backdrop-blur-xl rounded-[12px] p-4 border border-stroke-subtle dark:border-white/opacity-light hover:border-accent-amber/opacity-medium dark:hover:border-accent-amber/opacity-medium transition-all duration-300 hover:shadow-lg hover:shadow-secondary/10`},[a[99]||=h(`div`,{class:`absolute inset-0 bg-gradient-to-r from-secondary/opacity-subtle to-transparent opacity-0 group-hover:opacity-100 transition-opacity`},null,-1),h(`div`,Rt,[h(`div`,zt,[h(`div`,Bt,[h(`div`,Vt,[a[96]||=h(`div`,{class:`w-6 h-6 rounded-full bg-gradient-to-br from-primary/30 to-secondary/30 flex items-center justify-center`},[h(`svg`,{class:`w-3 h-3 text-content-secondary dark:text-content-primary/opacity-heavy`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z`})])],-1),e.author_name?(i(),g(`span`,Ht,o(e.author_name),1)):u(``,!0),e.author_pubkey?(i(),g(`span`,Ut,o(e.author_pubkey.substring(0,8))+`... `,1)):(i(),g(`span`,Wt,` Anonymous `)),a[97]||=h(`span`,{class:`text-content-muted/opacity-heavy text-xs`},`•`,-1),h(`span`,Gt,[a[95]||=h(`svg`,{class:`w-3 h-3`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z`})],-1),p(` `+o(nr(e.timestamp)),1)]),e.id?(i(),g(`span`,Kt,` #`+o(e.id),1)):u(``,!0)])]),h(`div`,qt,o(e.message_text),1)]),h(`button`,{onClick:t=>er(e.id),class:`group/delete flex-shrink-0 p-2 bg-accent-red/opacity-light hover:bg-accent-red/opacity-medium text-accent-red rounded-[8px] transition-all hover:scale-110 border border-accent-red/opacity-medium`,title:`Delete this message`},[...a[98]||=[h(`svg`,{class:`w-4 h-4 group-hover/delete:rotate-12 transition-transform`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16`})],-1)]],8,Jt)])]))),128)),K.value&&!V.value?(i(),g(`div`,Yt,[h(`button`,{onClick:Qn,class:`group px-6 py-2.5 bg-gradient-to-r from-gray-100 dark:from-white/opacity-subtle to-gray-200 dark:to-white/10 hover:from-gray-200 dark:hover:from-white/10 hover:to-gray-300 dark:hover:to-white/15 text-content-primary rounded-[10px] transition-all hover:scale-105 text-sm font-medium border border-stroke-subtle dark:border-stroke/opacity-light flex items-center gap-2 mx-auto`},[...a[100]||=[h(`svg`,{class:`w-4 h-4 group-hover:translate-y-1 transition-transform`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 9l-7 7-7-7`})],-1),p(` Load More Messages `,-1)]])])):V.value?(i(),g(`div`,Xt,[h(`div`,Zt,[d(b,{size:`sm`}),a[101]||=p(` Loading... `,-1)])])):u(``,!0)])):(i(),g(`div`,Qt,[...a[102]||=[h(`div`,{class:`text-center py-12`},[h(`div`,{class:`relative mb-6`},[h(`div`,{class:`absolute inset-0 bg-accent-amber/opacity-medium blur-3xl rounded-full`}),h(`div`,{class:`relative bg-gradient-to-br from-secondary/20 to-primary/20 p-6 rounded-[20px] inline-block border border-stroke-subtle dark:border-white/opacity-light`},[h(`svg`,{class:`w-16 h-16 text-content-muted/opacity-heavy`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z`})])])]),h(`p`,{class:`text-xl font-bold text-content-primary mb-2`},` No messages yet `),h(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},` Be the first to start the conversation `)],-1)]]))]),h(`div`,$t,[a[105]||=h(`div`,{class:`absolute inset-0 bg-gradient-to-t from-primary/opacity-subtle to-transparent pointer-events-none`},null,-1),h(`div`,en,[h(`div`,tn,[h(`div`,nn,[r(h(`textarea`,{"onUpdate:modelValue":a[27]||=e=>U.value=e,onKeydown:[re(_($n,[`ctrl`]),[`enter`]),re(_($n,[`meta`]),[`enter`])],placeholder:`Type your message... (Ctrl+Enter to send)`,rows:`3`,class:`modal-input resize-none px-4 py-3`},null,40,rn),[[v,U.value]])]),h(`button`,{onClick:$n,disabled:!U.value.trim(),class:c([`group px-6 py-3 rounded-[12px] transition-all duration-200 flex items-center justify-center gap-2 font-medium`,U.value.trim()?`bg-gradient-to-r from-primary/30 to-secondary/30 hover:from-primary/40 hover:to-secondary/40 text-content-primary border border-primary/opacity-heavy hover:scale-105 hover:shadow-lg hover:shadow-primary/opacity-medium`:`bg-background-mute dark:bg-white/opacity-subtle text-content-muted/opacity-heavy cursor-not-allowed border border-stroke-subtle dark:border-stroke/opacity-light`])},[...a[103]||=[h(`svg`,{class:`w-5 h-5 group-hover:translate-x-1 transition-transform`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 19l9 2-9-18-9 18 9-2zm0 0v-8`})],-1),h(`span`,{class:`hidden sm:inline`},`Send`,-1)]],10,an)]),a[104]||=h(`p`,{class:`text-content-secondary dark:text-content-muted/opacity-heavy text-xs flex items-center gap-2`},[h(`svg`,{class:`w-3 h-3`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`})]),p(` Press Ctrl+Enter to send message quickly `)],-1)])])])])):u(``,!0)])),(i(),s(l,{to:`body`},[J.value?(i(),g(`div`,on,[h(`div`,sn,[h(`div`,cn,[h(`div`,null,[a[107]||=h(`h2`,{class:`text-xl font-bold text-content-primary`},` Active Sessions `,-1),h(`p`,ln,[a[106]||=p(` Room: `,-1),h(`span`,un,o(R.value),1)])]),h(`button`,{onClick:a[29]||=e=>J.value=!1,class:`text-content-secondary dark:text-content-primary/opacity-heavy hover:text-content-primary dark:hover:text-content-primary transition-colors`},[...a[108]||=[h(`svg`,{class:`w-6 h-6`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),h(`div`,dn,[q.value.length===0?(i(),g(`div`,fn,[...a[109]||=[h(`div`,{class:`text-content-secondary dark:text-content-muted`},`No active sessions found`,-1)]])):u(``,!0),(i(!0),g(m,null,t(q.value,(e,t)=>(i(),g(`div`,{key:e.public_key_full||t,class:`glass-card backdrop-blur-xl rounded-[10px] p-4 border border-stroke-subtle dark:border-white/opacity-light`},[h(`div`,pn,[h(`div`,mn,[h(`div`,hn,[h(`span`,gn,o(e.identity_name||`Unknown`),1),h(`span`,{class:c([`px-2 py-0.5 text-xs font-medium rounded`,e.permissions===`admin`?`bg-accent-green/opacity-medium text-accent-green`:`bg-accent-amber/opacity-medium text-accent-amber`])},o(e.permissions),3)]),h(`div`,_n,[h(`span`,vn,o(e.identity_type),1),h(`button`,{onClick:t=>rr(e.public_key_full,e.identity_hash),class:`px-2 py-1 bg-accent-red/opacity-medium hover:bg-accent-red/opacity-medium text-accent-red rounded text-xs transition-colors`,title:`Remove client from ACL`},` Remove `,8,yn)])]),h(`div`,bn,[h(`div`,xn,[a[110]||=h(`span`,{class:`text-content-secondary dark:text-content-muted`},`Short Key:`,-1),h(`code`,Sn,o(e.public_key),1)]),h(`div`,Cn,[a[111]||=h(`span`,{class:`text-content-secondary dark:text-content-muted`},`Full Key:`,-1),h(`code`,wn,o(e.public_key_full),1)])]),h(`div`,Tn,[h(`div`,En,[e.address?(i(),g(`span`,Dn,`📍 `+o(e.address),1)):u(``,!0),e.last_login_success?(i(),g(`span`,On,`Last Login: `+o(new Date(e.last_login_success*1e3).toLocaleString()),1)):u(``,!0)]),e.last_activity?(i(),g(`span`,kn,`Active: `+o(Math.floor((Date.now()/1e3-e.last_activity)/60))+`m ago`,1)):u(``,!0)])])]))),128))])])])):u(``,!0)]))],64))}});export{x as default}; \ No newline at end of file +import{C as e,D as t,N as n,P as r,T as i,U as a,_t as o,c as s,f as ee,h as te,ht as c,i as l,j as ne,l as u,m as d,o as f,p,r as m,s as h,u as g}from"./runtime-core.esm-bundler-CINEgm0a.js";import{c as re,l as _,o as v,r as ie,t as ae}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as y}from"./api-EpLa-SS4.js";import{t as oe}from"./system-CuO1gaHr.js";import{t as b}from"./Spinner-CMJUE3iy.js";import{c as se,r as ce,s as le}from"./index-DF5glAZc.js";import{t as ue}from"./ConfirmDialog-Dl1jglkT.js";import{t as de}from"./MessageDialog-Dcp03-LQ.js";import{t as fe}from"./LocationPicker-DEowGt6S.js";var pe={class:`p-6 space-y-6`},me={key:0,class:`grid grid-cols-1 md:grid-cols-3 gap-4`},he={class:`glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-5`},ge={class:`flex items-center justify-between`},_e={class:`text-3xl font-bold text-content-primary mb-1`},ve={class:`glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-5`},ye={class:`flex items-center justify-between`},be={class:`text-3xl font-bold text-primary mb-1`},xe={class:`glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-5`},Se={class:`flex items-center justify-between`},Ce={key:0,class:`w-6 h-6 text-accent-green`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},we={key:1,class:`w-6 h-6 text-accent-yellow`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Te={class:`glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-6`},Ee={key:0,class:`flex items-center justify-center py-12`},De={class:`text-center`},Oe={key:1,class:`flex items-center justify-center py-12`},ke={class:`text-center`},Ae={class:`text-content-secondary dark:text-content-muted text-sm mb-4`},je={key:2,class:`space-y-4`},Me={class:`flex items-start justify-between`},Ne={class:`flex-1`},Pe={class:`flex items-center gap-3 mb-4`},Fe={class:`relative`},Ie={key:0,class:`absolute inset-0 bg-accent-green/opacity-heavy rounded-full animate-ping`},Le={class:`text-xl font-bold text-content-primary`},Re={key:0,class:`text-content-muted text-sm`},ze={class:`grid grid-cols-1 md:grid-cols-2 gap-3 text-sm mb-3`},Be={class:`text-content-primary/opacity-heavy ml-2`},Ve={class:`flex items-center gap-2`},He={key:0,class:`text-content-primary/opacity-heavy font-mono ml-2 text-xs`},Ue={key:1,class:`text-content-muted ml-2 text-xs`},We=[`onClick`],Ge={class:`text-content-primary/opacity-heavy ml-2`},Ke={key:0},qe={class:`text-content-primary/opacity-heavy ml-2`},Je={key:0,class:`text-accent-green`},Ye={key:1,class:`text-content-muted`},Xe={key:2,class:`text-primary`},Ze={class:`text-content-primary/opacity-heavy ml-2`},Qe={key:0,class:`text-xs text-content-muted font-mono`},$e={class:`ml-4 flex flex-wrap gap-2`},et=[`onClick`,`disabled`,`title`],tt=[`onClick`,`disabled`,`title`],nt=[`onClick`],rt=[`onClick`],it={key:3,class:`text-center py-12 text-content-secondary dark:text-content-muted`},at={class:`modal-card max-w-2xl w-full max-h-[90vh] overflow-y-auto`},ot={class:`modal-field-label-row`},st={key:0},ct={key:1,class:`text-content-secondary dark:text-content-muted text-sm`},lt={class:`grid grid-cols-2 gap-5`},ut={class:`grid grid-cols-2 gap-5`},dt={class:`rounded-[12px] border border-stroke-subtle dark:border-white/opacity-light bg-background-card dark:bg-white/opacity-subtle p-4`},ft={class:`flex items-start gap-3 cursor-pointer`},pt={class:`text-content-secondary dark:text-content-muted text-xs mt-1`},mt={class:`modal-card max-w-2xl w-full max-h-[90vh] overflow-y-auto`},ht={class:`modal-field-label-row`},gt={key:0},_t={key:1,class:`text-content-secondary dark:text-content-muted text-sm`},vt={class:`grid grid-cols-2 gap-5`},yt={class:`grid grid-cols-2 gap-5`},bt={class:`rounded-[12px] border border-stroke-subtle dark:border-white/opacity-light bg-background-card dark:bg-white/opacity-subtle p-4`},xt={class:`flex items-start gap-3 cursor-pointer`},St={class:`text-content-secondary dark:text-content-muted text-xs mt-1`},Ct={class:`bg-white dark:bg-surface-elevated backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[20px] p-6 max-w-4xl w-full h-[85vh] flex flex-col shadow-2xl`},wt={class:`relative overflow-hidden rounded-[15px] mb-6 p-5 bg-white/opacity-heavy dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-white/opacity-light`},Tt={class:`relative flex items-center justify-between`},Et={class:`flex items-center gap-4`},Dt={class:`text-content-secondary dark:text-content-muted text-sm flex items-center gap-2`},Ot={class:`text-primary font-semibold`},kt={class:`flex items-center gap-2`},At={class:`bg-primary/opacity-medium px-1.5 py-0.5 rounded-full text-[10px]`},jt={class:`flex-1 overflow-y-auto mb-4 space-y-3`},Mt={key:0,class:`flex items-center justify-center py-12`},Nt={class:`text-center`},Pt={key:1,class:`flex items-center justify-center py-12`},Ft={class:`text-center`},It={class:`text-content-secondary dark:text-content-muted text-sm mb-4`},Lt={key:2,class:`space-y-3`},Rt={class:`relative flex items-start justify-between gap-3`},zt={class:`flex-1 min-w-0`},Bt={class:`flex items-center gap-2 mb-3`},Vt={class:`flex items-center gap-2 flex-wrap`},Ht={key:0,class:`text-primary text-sm font-bold`},Ut={key:1,class:`text-primary/opacity-heavy text-xs font-mono bg-primary/opacity-light px-2 py-1 rounded-md border border-primary/opacity-medium`},Wt={key:2,class:`text-content-muted text-xs`},Gt={class:`text-content-secondary dark:text-content-muted text-xs flex items-center gap-1`},Kt={key:3,class:`text-content-muted/opacity-heavy text-[10px] font-mono bg-background-mute dark:bg-white/opacity-subtle px-1.5 py-0.5 rounded`},qt={class:`text-content-primary/opacity-heavy text-sm leading-relaxed break-words whitespace-pre-wrap bg-background-mute dark:bg-white/opacity-subtle p-3 rounded-[10px] border border-stroke-subtle dark:border-white/opacity-light`},Jt=[`onClick`],Yt={key:0,class:`text-center pt-4`},Xt={key:1,class:`text-center pt-4`},Zt={class:`flex items-center justify-center gap-2 text-content-secondary dark:text-content-muted text-sm`},Qt={key:3,class:`flex items-center justify-center h-full`},$t={class:`relative overflow-hidden rounded-[15px] border-t border-stroke-subtle dark:border-white/opacity-medium pt-4 mt-4`},en={class:`relative space-y-3`},tn={class:`flex gap-3`},nn={class:`flex-1 relative`},rn=[`onKeydown`],an=[`disabled`],on={key:0,class:`modal-backdrop z-[350]!`},sn={class:`bg-white dark:bg-surface-elevated backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[15px] p-6 max-w-3xl w-full max-h-[80vh] flex flex-col`},cn={class:`flex items-center justify-between mb-4 pb-4 border-b border-stroke-subtle dark:border-white/opacity-light`},ln={class:`text-content-secondary dark:text-content-primary/opacity-heavy text-sm mt-1`},un={class:`text-primary`},dn={class:`flex-1 overflow-y-auto space-y-3`},fn={key:0,class:`text-center py-12`},pn={class:`space-y-2`},mn={class:`flex items-center justify-between`},hn={class:`flex items-center gap-2`},gn={class:`text-content-primary font-semibold`},_n={class:`flex items-center gap-2`},vn={class:`text-content-secondary dark:text-content-muted text-xs`},yn=[`onClick`],bn={class:`space-y-1 text-xs`},xn={class:`flex items-center gap-2`},Sn={class:`text-primary font-mono bg-primary/opacity-light px-2 py-0.5 rounded`},Cn={class:`flex items-center gap-2`},wn={class:`text-primary font-mono bg-primary/opacity-light px-2 py-0.5 rounded text-[10px] break-all`},Tn={class:`flex items-center justify-between text-xs text-content-secondary dark:text-content-muted`},En={class:`flex items-center gap-4`},Dn={key:0},On={key:1},kn={key:0},x=te({name:`RoomServersView`,__name:`RoomServers`,setup(te){let x=oe(),An=f(()=>x.stats?.config?.repeater?.latitude??0),jn=f(()=>x.stats?.config?.repeater?.longitude??0),Mn=a(!1),Nn=a(!1),Pn=a(!1),S=a(null),C=a(null),w=a(!1),T=a(!1),E=a(!1),D=a(null),O=a(``),k=a(!1),A=a(!1),j=a(new Set),Fn=f(()=>C.value?.configured?.filter(e=>e.registered).length??0),In=f(()=>C.value?.configured?.length??0),M=f(()=>Fn.value===In.value),N=a(!1),P=a(``),F=a(!1),I=a({message:``,variant:`success`}),L=a(!1),R=a(``),z=a(``),B=a([]),V=a(!1),H=a(null),U=a(``),W=a(le(`roomServers_messagesLimit`,50)),G=a(0),K=a(!0);ne(W,e=>se(`roomServers_messagesLimit`,e));let q=a([]),J=a(!1),Y=a({name:``,identity_key:``,type:`room_server`,settings:{node_name:``,latitude:0,longitude:0,admin_password:``,guest_password:``,allow_read_only:!0}});e(async()=>{await X()});async function X(){Pn.value=!0,S.value=null;try{let e=await y.getIdentities();e.success?C.value=e.data:S.value=e.error||`Failed to load identities`}catch(e){S.value=e instanceof Error?e.message:`Failed to load identities`}finally{Pn.value=!1}}function Ln(e){e.latitude=Math.round(e.latitude*1e6)/1e6,e.longitude=Math.round(e.longitude*1e6)/1e6}async function Rn(){Ln(Y.value.settings);try{let e=await y.createIdentity(Y.value);e.success?(w.value=!1,await X(),E.value=!0):Z(`Failed to create identity: ${e.error}`,`error`)}catch(e){Z(`Error creating identity: ${e}`,`error`)}}async function zn(){let e={...D.value,settings:{...D.value.settings}};Ln(e.settings),e.name===O.value?delete e.new_name:(e.new_name=e.name,e.name=O.value);try{let t=await y.updateIdentity(e);t.success?(T.value=!1,D.value=null,await X(),E.value=!0):Z(`Failed to update identity: ${t.error}`,`error`)}catch(e){Z(`Error updating identity: ${e}`,`error`)}}function Bn(e){P.value=e,N.value=!0}async function Vn(){let e=P.value;N.value=!1;try{let t=await y.deleteIdentity(e);t.success?(await X(),E.value=!0):Z(`Failed to delete identity: ${t.error}`,`error`)}catch(e){Z(`Error deleting identity: ${e}`,`error`)}finally{P.value=``}}function Z(e,t){I.value={message:e,variant:t},F.value=!0}async function Hn(e){try{let t=await y.sendRoomServerAdvert(e);t.success?Z(t.message||`Advert sent for '${e}'!`,`success`):Z(`Failed to send advert: ${t.error}`,`error`)}catch(e){Z(`Error sending advert: ${e}`,`error`)}}function Un(e){D.value=JSON.parse(JSON.stringify(e)),O.value=D.value.name,delete D.value.new_name,D.value.settings||(D.value.settings={}),D.value.settings.admin_password||(D.value.settings.admin_password=``),D.value.settings.guest_password||(D.value.settings.guest_password=``),D.value.settings.allow_read_only??(D.value.settings.allow_read_only=!0),D.value.settings.latitude??(D.value.settings.latitude=0),D.value.settings.longitude??(D.value.settings.longitude=0),A.value=!1,T.value=!0}function Wn(){Y.value={name:``,identity_key:``,type:`room_server`,settings:{node_name:``,latitude:An.value,longitude:jn.value,admin_password:``,guest_password:``,allow_read_only:!0}},Ln(Y.value.settings),k.value=!1}function Gn(){Wn(),w.value=!0}function Kn(e){Y.value.settings.latitude=e.latitude,Y.value.settings.longitude=e.longitude}function qn(e){D.value&&(D.value.settings.latitude=e.latitude,D.value.settings.longitude=e.longitude)}function Q(){w.value=!1,T.value=!1,D.value=null,k.value=!1,A.value=!1}function Jn(e){j.value.has(e)?j.value.delete(e):j.value.add(e)}function Yn(e){return e?.allow_read_only!==!1}async function Xn(e){R.value=e,L.value=!0,G.value=0,K.value=!0,z.value=C.value?.configured.find(t=>t.name===e)?.hash||``,await Zn(),await $(!0)}async function Zn(){try{let e=await y.getACLClients({identity_hash:z.value,identity_name:R.value});e.success&&e.data&&(q.value=e.data.clients||[])}catch(e){console.error(`Failed to fetch ACL clients:`,e)}}async function $(e=!1){e&&(G.value=0,B.value=[]),V.value=!0,H.value=null;try{let t=await y.getRoomMessages({room_name:R.value,limit:W.value,offset:G.value});if(t.success&&t.data){let n=t.data.messages||[];e?B.value=n:B.value=[...B.value,...n],K.value=n.length===W.value}else H.value=t.error||`Failed to load messages`}catch(e){H.value=e instanceof Error?e.message:`Failed to load messages`}finally{V.value=!1}}async function Qn(){G.value+=W.value,await $(!1)}async function $n(){if(U.value.trim())try{let e=await y.postRoomMessage({room_name:R.value,message:U.value,author_pubkey:`server`});e.success?(U.value=``,await $(!0)):Z(`Failed to send message: ${e.error}`,`error`)}catch(e){Z(`Error sending message: ${e}`,`error`)}}async function er(e){if(confirm(`Are you sure you want to delete this message?`))try{let t=await y.deleteRoomMessage({room_name:R.value,message_id:e});t.success?(await $(!0),Z(`Message deleted successfully`,`success`)):Z(`Failed to delete message: ${t.error}`,`error`)}catch(e){Z(`Error deleting message: ${e}`,`error`)}}function tr(){L.value=!1,R.value=``,z.value=``,B.value=[],U.value=``,H.value=null,q.value=[]}function nr(e){return e?new Date(e*1e3).toLocaleString():`Unknown`}async function rr(e,t){if(confirm(`Are you sure you want to remove this client from the ACL?`))try{let n=await y.removeACLClient({public_key:e,identity_hash:t});n.success?(await Zn(),Z(`Client removed successfully`,`success`)):Z(`Failed to remove client: ${n.error}`,`error`)}catch(e){Z(`Error removing client: ${e}`,`error`)}}return(e,a)=>(i(),g(m,null,[h(`div`,pe,[h(`div`,{class:`relative overflow-hidden rounded-[20px] p-6 mb-6 glass-card backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light`},[a[32]||=h(`div`,{class:`absolute inset-0 bg-gradient-to-br from-primary/20 via-secondary/10 to-accent-purple/20 opacity-50`},null,-1),a[33]||=h(`div`,{class:`absolute inset-0 bg-gradient-to-tl from-accent-green/10 via-transparent to-primary/10 animate-pulse`},null,-1),h(`div`,{class:`relative flex items-center justify-between`},[a[31]||=ee(`

Room Servers

Manage room server identities and messages

`,1),h(`button`,{onClick:Gn,class:`group relative px-6 py-3 bg-gradient-to-r from-primary/30 to-secondary/30 hover:from-primary/40 hover:to-secondary/40 text-content-primary rounded-[12px] border border-primary/opacity-heavy transition-all hover:scale-105 hover:shadow-lg hover:shadow-primary/opacity-medium`},[...a[30]||=[h(`span`,{class:`flex items-center gap-2`},[h(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 4v16m8-8H4`})]),p(` Add Room Server `)],-1)]])])]),C.value&&C.value.total_configured>0?(i(),g(`div`,me,[h(`div`,he,[h(`div`,ge,[h(`div`,null,[a[34]||=h(`div`,{class:`text-content-secondary dark:text-content-muted text-xs font-medium mb-2 uppercase tracking-wide`},` Total Configured `,-1),h(`div`,_e,o(In.value),1)]),a[35]||=h(`div`,{class:`bg-background-mute dark:bg-white/opacity-subtle p-3 rounded-[12px]`},[h(`svg`,{class:`w-6 h-6 text-content-secondary dark:text-content-primary/opacity-heavy`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10`})])],-1)])]),h(`div`,ve,[h(`div`,ye,[h(`div`,null,[a[36]||=h(`div`,{class:`text-content-secondary dark:text-content-muted text-xs font-medium mb-2 uppercase tracking-wide`},` Currently Registered `,-1),h(`div`,be,o(Fn.value),1)]),a[37]||=h(`div`,{class:`bg-primary/opacity-medium p-3 rounded-[12px]`},[h(`svg`,{class:`w-6 h-6 text-primary`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 13l4 4L19 7`})])],-1)])]),h(`div`,xe,[h(`div`,Se,[h(`div`,null,[a[38]||=h(`div`,{class:`text-content-secondary dark:text-content-muted text-xs font-medium mb-2 uppercase tracking-wide`},` Status `,-1),h(`div`,{class:c([`text-3xl font-bold`,M.value?`text-accent-green`:`text-accent-yellow`])},o(M.value?`Synced`:`Out of Sync`),3)]),h(`div`,{class:c([`p-3 rounded-[12px]`,M.value?`bg-accent-green/opacity-medium`:`bg-accent-yellow/20`])},[M.value?(i(),g(`svg`,Ce,[...a[39]||=[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z`},null,-1)]])):(i(),g(`svg`,we,[...a[40]||=[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`},null,-1)]]))],2)])])])):u(``,!0),h(`div`,Te,[Pn.value?(i(),g(`div`,Ee,[h(`div`,De,[d(b,{class:`mx-auto mb-4`}),a[41]||=h(`div`,{class:`text-content-secondary dark:text-content-primary/opacity-heavy`},` Loading room servers... `,-1)])])):S.value?(i(),g(`div`,Oe,[h(`div`,ke,[a[42]||=h(`div`,{class:`text-accent-red mb-2`},`Failed to load room servers`,-1),h(`div`,Ae,o(S.value),1),h(`button`,{onClick:X,class:`btn-primary`},` Retry `)])])):C.value&&C.value.configured.length>0?(i(),g(`div`,je,[(i(!0),g(m,null,t(C.value.configured,e=>(i(),g(`div`,{key:e.name,class:`glass-card backdrop-blur-xl rounded-[15px] p-5 border border-stroke-subtle dark:border-white/opacity-light`},[h(`div`,Me,[h(`div`,Ne,[h(`div`,Pe,[h(`div`,Fe,[e.registered?(i(),g(`div`,Ie)):u(``,!0),h(`div`,{class:c([`relative w-3 h-3 rounded-full`,e.registered?`bg-accent-green`:`bg-accent-red`])},null,2)]),h(`h3`,Le,o(e.name),1),h(`span`,{class:c([`px-3 py-1 text-xs font-semibold rounded-full`,e.registered?`bg-accent-green/opacity-medium text-accent-green border border-accent-green/opacity-medium`:`bg-accent-red/opacity-medium text-accent-red border border-accent-red/opacity-medium`])},o(e.registered?`● Active`:`○ Inactive`),3),e.hash?(i(),g(`span`,Re,o(e.hash),1)):u(``,!0)]),h(`div`,ze,[h(`div`,null,[a[43]||=h(`span`,{class:`text-content-muted`},`Node Name:`,-1),h(`span`,Be,o(e.settings?.node_name||`Not set`),1)]),h(`div`,Ve,[a[44]||=h(`span`,{class:`text-content-muted`},`Identity Key:`,-1),j.value.has(e.name)?(i(),g(`span`,He,o(e.identity_key),1)):(i(),g(`span`,Ue,` •••••••••••••••• `)),h(`button`,{onClick:t=>Jn(e.name),class:`text-primary/opacity-heavy hover:text-primary text-xs underline`},o(j.value.has(e.name)?`Hide`:`Show`),9,We)]),h(`div`,null,[a[45]||=h(`span`,{class:`text-content-muted`},`Location:`,-1),h(`span`,Ge,o(e.settings?.latitude||0)+`, `+o(e.settings?.longitude||0),1)]),e.settings?.admin_password||e.settings?.guest_password?(i(),g(`div`,Ke,[a[46]||=h(`span`,{class:`text-content-muted`},`Password Roles:`,-1),h(`span`,qe,[e.settings?.admin_password?(i(),g(`span`,Je,`Admin`)):u(``,!0),e.settings?.admin_password&&e.settings?.guest_password?(i(),g(`span`,Ye,` / `)):u(``,!0),e.settings?.guest_password?(i(),g(`span`,Xe,`Guest (read/write)`)):u(``,!0)])])):u(``,!0),h(`div`,null,[a[47]||=h(`span`,{class:`text-content-muted`},`Blank Password Login:`,-1),h(`span`,Ze,[h(`span`,{class:c(Yn(e.settings)?`text-accent-amber`:`text-content-muted`)},o(Yn(e.settings)?`Allowed as read-only guest`:`Disabled`),3)])])]),e.address?(i(),g(`div`,Qe,` Address: `+o(e.address),1)):u(``,!0)]),h(`div`,$e,[h(`button`,{onClick:t=>Xn(e.name),disabled:!e.registered,class:c([`group px-4 py-2 rounded-[10px] text-xs font-medium transition-all duration-200 flex items-center gap-2`,e.registered?`bg-accent-amber/opacity-medium hover:bg-accent-amber/opacity-medium text-accent-amber border border-accent-amber/opacity-medium hover:scale-105 hover:shadow-lg hover:shadow-secondary/opacity-medium`:`bg-background-mute dark:bg-white/opacity-subtle text-content-muted/opacity-heavy cursor-not-allowed border border-stroke-subtle dark:border-stroke/opacity-light`]),title:e.registered?`Manage messages for this room`:`Room server must be active to manage messages`},[...a[48]||=[h(`svg`,{class:`w-4 h-4 group-hover:rotate-12 transition-transform`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z`})],-1),p(` Messages `,-1)]],10,et),h(`button`,{onClick:t=>Hn(e.name),disabled:!e.registered,class:c([`group px-4 py-2 rounded-[10px] text-xs font-medium transition-all duration-200 flex items-center gap-2`,e.registered?`bg-accent-green/opacity-medium hover:bg-accent-green/opacity-medium text-accent-green border border-accent-green/opacity-medium hover:scale-105 hover:shadow-lg hover:shadow-accent-green/opacity-medium`:`bg-background-mute dark:bg-white/opacity-subtle text-content-muted/opacity-heavy cursor-not-allowed border border-stroke-subtle dark:border-stroke/opacity-light`]),title:e.registered?`Send advert for this room server`:`Room server must be active to send advert`},[...a[49]||=[h(`svg`,{class:`w-4 h-4 group-hover:scale-110 transition-transform`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M13 10V3L4 14h7v7l9-11h-7z`})],-1),p(` Send Advert `,-1)]],10,tt),h(`button`,{onClick:t=>Un(e),class:`btn-primary-xs`},` Edit `,8,nt),h(`button`,{onClick:t=>Bn(e.name),class:`btn-danger-xs`},` Delete `,8,rt)])])]))),128))])):(i(),g(`div`,it,[a[50]||=h(`svg`,{class:`w-16 h-16 mx-auto mb-4 text-content-muted/opacity-heavy`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4`})],-1),a[51]||=h(`p`,{class:`text-lg mb-2`},`No room servers configured`,-1),a[52]||=h(`p`,{class:`text-sm mb-4`},`Add your first room server to get started`,-1),h(`button`,{onClick:Gn,class:`btn-primary`},` + Add Room Server `)]))]),(i(),s(l,{to:`body`},[d(ae,{"enter-active-class":`transition-opacity duration-200`,"enter-from-class":`opacity-0`,"leave-active-class":`transition-opacity duration-200`,"leave-to-class":`opacity-0`},{default:n(()=>[w.value?(i(),g(`div`,{key:0,class:`modal-backdrop`,onClick:_(Q,[`self`])},[h(`div`,at,[h(`div`,{class:`flex items-center justify-between mb-7`},[a[54]||=h(`div`,null,[h(`h3`,{class:`text-xl font-semibold text-content-primary`},` Add Room Server `),h(`p`,{class:`text-content-secondary dark:text-content-muted text-sm mt-1`},` Configure a new room server identity `)],-1),h(`button`,{onClick:Q,class:`text-content-secondary dark:text-white/60 hover:text-content-primary dark:hover:text-white transition-colors`},[...a[53]||=[h(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),h(`form`,{onSubmit:_(Rn,[`prevent`]),class:`modal-form`},[h(`div`,null,[a[55]||=h(`label`,{class:`modal-field-label`},[p(`Name `),h(`span`,{class:`text-accent-red`},`*`)],-1),r(h(`input`,{"onUpdate:modelValue":a[0]||=e=>Y.value.name=e,type:`text`,placeholder:`e.g., MainBBS`,class:`modal-input`},null,512),[[v,Y.value.name]])]),h(`div`,null,[h(`div`,ot,[a[56]||=h(`span`,{class:`text-xs font-medium text-content-secondary dark:text-content-muted`},`Identity Key (Optional)`,-1),h(`button`,{onClick:a[1]||=e=>k.value=!k.value,type:`button`,class:`text-primary/opacity-heavy hover:text-primary text-xs underline`},o(k.value?`Hide`:`Show/Edit`),1)]),k.value?(i(),g(`div`,st,[r(h(`input`,{"onUpdate:modelValue":a[2]||=e=>Y.value.identity_key=e,type:`text`,placeholder:`Leave empty to auto-generate`,class:`modal-input font-mono`},null,512),[[v,Y.value.identity_key]]),a[57]||=h(`p`,{class:`text-content-secondary dark:text-content-muted text-xs mt-1`},` Leave empty to automatically generate a secure key `,-1)])):(i(),g(`div`,ct,` Will be auto-generated if not provided `))]),h(`div`,null,[a[58]||=h(`label`,{class:`modal-field-label`},`Node Name`,-1),r(h(`input`,{"onUpdate:modelValue":a[3]||=e=>Y.value.settings.node_name=e,type:`text`,placeholder:`Display name for the room server`,class:`modal-input`},null,512),[[v,Y.value.settings.node_name]])]),h(`div`,null,[a[62]||=h(`label`,{class:`modal-field-label`},`Location`,-1),h(`button`,{type:`button`,onClick:a[4]||=e=>Mn.value=!0,class:`flex items-center gap-1.5 px-2.5 py-1 mb-3 text-xs bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light text-content-secondary dark:text-content-primary rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium transition-colors`,title:`Pick location on map`},[...a[59]||=[h(`svg`,{class:`w-3.5 h-3.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z`}),h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 11a3 3 0 11-6 0 3 3 0 016 0z`})],-1),p(` Pick on Map `,-1)]]),h(`div`,lt,[h(`div`,null,[a[60]||=h(`label`,{class:`modal-field-label`},`Latitude`,-1),r(h(`input`,{"onUpdate:modelValue":a[5]||=e=>Y.value.settings.latitude=e,type:`number`,step:`0.000001`,class:`modal-input`},null,512),[[v,Y.value.settings.latitude,void 0,{number:!0}]])]),h(`div`,null,[a[61]||=h(`label`,{class:`modal-field-label`},`Longitude`,-1),r(h(`input`,{"onUpdate:modelValue":a[6]||=e=>Y.value.settings.longitude=e,type:`number`,step:`0.000001`,class:`modal-input`},null,512),[[v,Y.value.settings.longitude,void 0,{number:!0}]])])])]),h(`div`,ut,[h(`div`,null,[a[63]||=h(`label`,{class:`modal-field-label`},`Admin Password (Optional)`,-1),r(h(`input`,{"onUpdate:modelValue":a[7]||=e=>Y.value.settings.admin_password=e,type:`password`,placeholder:`Leave empty for no password`,class:`modal-input`},null,512),[[v,Y.value.settings.admin_password]]),a[64]||=h(`p`,{class:`text-content-secondary dark:text-content-muted text-xs mt-1`},`Full access to room server`,-1)]),h(`div`,null,[a[65]||=h(`label`,{class:`modal-field-label`},`Guest Password (Optional)`,-1),r(h(`input`,{"onUpdate:modelValue":a[8]||=e=>Y.value.settings.guest_password=e,type:`password`,placeholder:`Leave empty for no password`,class:`modal-input`},null,512),[[v,Y.value.settings.guest_password]]),a[66]||=h(`p`,{class:`text-content-secondary dark:text-content-muted text-xs mt-1`},`Guest role with read/write posting (non-admin)`,-1)])]),h(`div`,dt,[h(`label`,ft,[r(h(`input`,{"onUpdate:modelValue":a[9]||=e=>Y.value.settings.allow_read_only=e,type:`checkbox`,class:`mt-0.5 h-4 w-4 rounded border-stroke-subtle text-primary focus:ring-primary/opacity-heavy`},null,512),[[ie,Y.value.settings.allow_read_only]]),h(`div`,null,[a[67]||=h(`p`,{class:`text-sm font-medium text-content-primary`},`Allow blank-password read-only login`,-1),h(`p`,pt,o(Y.value.settings.allow_read_only?`Clients without a password can login as read-only guests.`:`Clients must provide admin or guest password to login.`),1)])])]),h(`div`,{class:`modal-actions`},[h(`button`,{type:`button`,onClick:Q,class:`modal-btn-cancel`},`Cancel`),a[68]||=h(`button`,{type:`submit`,class:`modal-btn-primary`},`Create`,-1)])],32)])])):u(``,!0)]),_:1})])),d(fe,{"is-open":Mn.value,latitude:Y.value.settings.latitude,longitude:Y.value.settings.longitude,onClose:a[10]||=e=>Mn.value=!1,onSelect:Kn},null,8,[`is-open`,`latitude`,`longitude`]),(i(),s(l,{to:`body`},[d(ae,{"enter-active-class":`transition-opacity duration-200`,"enter-from-class":`opacity-0`,"leave-active-class":`transition-opacity duration-200`,"leave-to-class":`opacity-0`},{default:n(()=>[T.value&&D.value?(i(),g(`div`,{key:0,class:`modal-backdrop`,onClick:_(Q,[`self`])},[h(`div`,mt,[h(`div`,{class:`flex items-center justify-between mb-7`},[a[70]||=h(`div`,null,[h(`h3`,{class:`text-xl font-semibold text-content-primary`},` Edit Room Server `),h(`p`,{class:`text-content-secondary dark:text-content-muted text-sm mt-1`},` Update room server identity `)],-1),h(`button`,{onClick:Q,class:`text-content-secondary dark:text-white/60 hover:text-content-primary dark:hover:text-white transition-colors`},[...a[69]||=[h(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),h(`form`,{onSubmit:_(zn,[`prevent`]),class:`modal-form`},[h(`div`,null,[a[71]||=h(`label`,{class:`modal-field-label`},[p(`Name `),h(`span`,{class:`text-accent-red`},`*`)],-1),r(h(`input`,{"onUpdate:modelValue":a[11]||=e=>D.value.name=e,type:`text`,class:`modal-input`},null,512),[[v,D.value.name]])]),h(`div`,null,[h(`div`,ht,[a[72]||=h(`span`,{class:`text-xs font-medium text-content-secondary dark:text-content-muted`},`Identity Key (Optional)`,-1),h(`button`,{onClick:a[12]||=e=>A.value=!A.value,type:`button`,class:`text-primary/opacity-heavy hover:text-primary text-xs underline`},o(A.value?`Hide`:`Show/Edit`),1)]),A.value?(i(),g(`div`,gt,[r(h(`input`,{"onUpdate:modelValue":a[13]||=e=>D.value.identity_key=e,type:`text`,placeholder:`Leave empty to keep current key`,class:`modal-input font-mono`},null,512),[[v,D.value.identity_key]]),a[73]||=h(`p`,{class:`text-content-secondary dark:text-content-muted text-xs mt-1`},` Leave empty to keep the current identity key `,-1)])):(i(),g(`div`,_t,` Click "Show/Edit" to change the identity key `))]),h(`div`,null,[a[74]||=h(`label`,{class:`modal-field-label`},`Node Name`,-1),r(h(`input`,{"onUpdate:modelValue":a[14]||=e=>D.value.settings.node_name=e,type:`text`,class:`modal-input`},null,512),[[v,D.value.settings.node_name]])]),h(`div`,null,[a[78]||=h(`label`,{class:`modal-field-label`},`Location`,-1),h(`button`,{type:`button`,onClick:a[15]||=e=>Nn.value=!0,class:`flex items-center gap-1.5 px-2.5 py-1 mb-3 text-xs bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light text-content-secondary dark:text-content-primary rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium transition-colors`,title:`Pick location on map`},[...a[75]||=[h(`svg`,{class:`w-3.5 h-3.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z`}),h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 11a3 3 0 11-6 0 3 3 0 016 0z`})],-1),p(` Pick on Map `,-1)]]),h(`div`,vt,[h(`div`,null,[a[76]||=h(`label`,{class:`modal-field-label`},`Latitude`,-1),r(h(`input`,{"onUpdate:modelValue":a[16]||=e=>D.value.settings.latitude=e,type:`number`,step:`0.000001`,class:`modal-input`},null,512),[[v,D.value.settings.latitude,void 0,{number:!0}]])]),h(`div`,null,[a[77]||=h(`label`,{class:`modal-field-label`},`Longitude`,-1),r(h(`input`,{"onUpdate:modelValue":a[17]||=e=>D.value.settings.longitude=e,type:`number`,step:`0.000001`,class:`modal-input`},null,512),[[v,D.value.settings.longitude,void 0,{number:!0}]])])])]),h(`div`,yt,[h(`div`,null,[a[79]||=h(`label`,{class:`modal-field-label`},`Admin Password (Optional)`,-1),r(h(`input`,{"onUpdate:modelValue":a[18]||=e=>D.value.settings.admin_password=e,type:`password`,placeholder:`Leave empty for no password`,class:`modal-input`},null,512),[[v,D.value.settings.admin_password]]),a[80]||=h(`p`,{class:`text-content-secondary dark:text-content-muted text-xs mt-1`},`Full access to room server`,-1)]),h(`div`,null,[a[81]||=h(`label`,{class:`modal-field-label`},`Guest Password (Optional)`,-1),r(h(`input`,{"onUpdate:modelValue":a[19]||=e=>D.value.settings.guest_password=e,type:`password`,placeholder:`Leave empty for no password`,class:`modal-input`},null,512),[[v,D.value.settings.guest_password]]),a[82]||=h(`p`,{class:`text-content-secondary dark:text-content-muted text-xs mt-1`},`Guest role with read/write posting (non-admin)`,-1)])]),h(`div`,bt,[h(`label`,xt,[r(h(`input`,{"onUpdate:modelValue":a[20]||=e=>D.value.settings.allow_read_only=e,type:`checkbox`,class:`mt-0.5 h-4 w-4 rounded border-stroke-subtle text-primary focus:ring-primary/opacity-heavy`},null,512),[[ie,D.value.settings.allow_read_only]]),h(`div`,null,[a[83]||=h(`p`,{class:`text-sm font-medium text-content-primary`},`Allow blank-password read-only login`,-1),h(`p`,St,o(D.value.settings.allow_read_only?`Clients without a password can login as read-only guests.`:`Clients must provide admin or guest password to login.`),1)])])]),h(`div`,{class:`modal-actions`},[h(`button`,{type:`button`,onClick:Q,class:`modal-btn-cancel`},`Cancel`),a[84]||=h(`button`,{type:`submit`,class:`modal-btn-primary`},`Update`,-1)])],32)])])):u(``,!0)]),_:1})])),d(fe,{"is-open":Nn.value,latitude:D.value?.settings?.latitude,longitude:D.value?.settings?.longitude,onClose:a[21]||=e=>Nn.value=!1,onSelect:qn},null,8,[`is-open`,`latitude`,`longitude`])]),d(ue,{show:N.value,title:`Delete Room Server`,message:`Are you sure you want to delete '${P.value}'? This action cannot be undone.`,"confirm-text":`Delete`,"cancel-text":`Cancel`,variant:`danger`,onClose:a[22]||=e=>N.value=!1,onConfirm:Vn},null,8,[`show`,`message`]),d(de,{show:F.value,message:I.value.message,variant:I.value.variant,onClose:a[23]||=e=>F.value=!1},null,8,[`show`,`message`,`variant`]),d(ce,{modelValue:E.value,"onUpdate:modelValue":a[24]||=e=>E.value=e,message:`Room server settings have been saved. A service restart is required for the changes to take effect.`},null,8,[`modelValue`]),(i(),s(l,{to:`body`},[L.value?(i(),g(`div`,{key:0,class:`modal-backdrop`,onClick:a[28]||=_(e=>L.value=!1,[`self`])},[h(`div`,Ct,[h(`div`,wt,[a[91]||=h(`div`,{class:`absolute inset-0 bg-gradient-to-r from-secondary/20 via-primary/20 to-accent-purple/20`},null,-1),a[92]||=h(`div`,{class:`absolute inset-0 bg-gradient-to-br from-transparent via-white/opacity-subtle to-transparent`},null,-1),h(`div`,Tt,[h(`div`,Et,[a[87]||=h(`div`,{class:`relative`},[h(`div`,{class:`absolute inset-0 bg-accent-amber/opacity-heavy blur-xl rounded-full`}),h(`div`,{class:`relative bg-accent-amber/opacity-medium p-3 rounded-[12px] border border-accent-amber/opacity-medium`},[h(`svg`,{class:`w-6 h-6 text-accent-amber`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z`})])])],-1),h(`div`,null,[a[86]||=h(`h2`,{class:`text-2xl font-bold text-content-primary mb-1`},` Room Messages `,-1),h(`p`,Dt,[a[85]||=h(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z`})],-1),h(`span`,Ot,o(R.value),1)])])]),h(`div`,kt,[h(`button`,{onClick:a[25]||=e=>J.value=!0,class:`group px-3 py-2 bg-primary/opacity-medium hover:bg-primary/opacity-medium text-primary rounded-[10px] text-xs font-medium transition-all hover:scale-105 border border-primary/opacity-medium flex items-center gap-2`,title:`View active sessions`},[a[88]||=h(`svg`,{class:`w-4 h-4 group-hover:scale-110 transition-transform`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z`})],-1),a[89]||=h(`span`,{class:`hidden sm:inline`},`Sessions`,-1),h(`span`,At,o(q.value.length),1)]),h(`button`,{onClick:tr,class:`p-2 text-content-secondary dark:text-content-primary/opacity-heavy hover:text-content-primary dark:hover:text-content-primary hover:bg-stroke-subtle dark:hover:bg-white/opacity-light rounded-[10px] transition-all`},[...a[90]||=[h(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])])])]),h(`div`,jt,[V.value&&B.value.length===0?(i(),g(`div`,Mt,[h(`div`,Nt,[d(b,{class:`mx-auto mb-4`}),a[93]||=h(`div`,{class:`text-content-secondary dark:text-content-primary/opacity-heavy`},` Loading messages... `,-1)])])):H.value?(i(),g(`div`,Pt,[h(`div`,Ft,[a[94]||=h(`div`,{class:`text-accent-red mb-2`},`Failed to load messages`,-1),h(`div`,It,o(H.value),1),h(`button`,{onClick:a[26]||=e=>$(!0),class:`btn-primary`},` Retry `)])])):B.value.length>0?(i(),g(`div`,Lt,[(i(!0),g(m,null,t(B.value,(e,t)=>(i(),g(`div`,{key:e.id||t,class:`group relative overflow-hidden glass-card backdrop-blur-xl rounded-[12px] p-4 border border-stroke-subtle dark:border-white/opacity-light hover:border-accent-amber/opacity-medium dark:hover:border-accent-amber/opacity-medium transition-all duration-300 hover:shadow-lg hover:shadow-secondary/10`},[a[99]||=h(`div`,{class:`absolute inset-0 bg-gradient-to-r from-secondary/opacity-subtle to-transparent opacity-0 group-hover:opacity-100 transition-opacity`},null,-1),h(`div`,Rt,[h(`div`,zt,[h(`div`,Bt,[h(`div`,Vt,[a[96]||=h(`div`,{class:`w-6 h-6 rounded-full bg-gradient-to-br from-primary/30 to-secondary/30 flex items-center justify-center`},[h(`svg`,{class:`w-3 h-3 text-content-secondary dark:text-content-primary/opacity-heavy`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z`})])],-1),e.author_name?(i(),g(`span`,Ht,o(e.author_name),1)):u(``,!0),e.author_pubkey?(i(),g(`span`,Ut,o(e.author_pubkey.substring(0,8))+`... `,1)):(i(),g(`span`,Wt,` Anonymous `)),a[97]||=h(`span`,{class:`text-content-muted/opacity-heavy text-xs`},`•`,-1),h(`span`,Gt,[a[95]||=h(`svg`,{class:`w-3 h-3`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z`})],-1),p(` `+o(nr(e.timestamp)),1)]),e.id?(i(),g(`span`,Kt,` #`+o(e.id),1)):u(``,!0)])]),h(`div`,qt,o(e.message_text),1)]),h(`button`,{onClick:t=>er(e.id),class:`group/delete flex-shrink-0 p-2 bg-accent-red/opacity-light hover:bg-accent-red/opacity-medium text-accent-red rounded-[8px] transition-all hover:scale-110 border border-accent-red/opacity-medium`,title:`Delete this message`},[...a[98]||=[h(`svg`,{class:`w-4 h-4 group-hover/delete:rotate-12 transition-transform`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16`})],-1)]],8,Jt)])]))),128)),K.value&&!V.value?(i(),g(`div`,Yt,[h(`button`,{onClick:Qn,class:`group px-6 py-2.5 bg-gradient-to-r from-gray-100 dark:from-white/opacity-subtle to-gray-200 dark:to-white/10 hover:from-gray-200 dark:hover:from-white/10 hover:to-gray-300 dark:hover:to-white/15 text-content-primary rounded-[10px] transition-all hover:scale-105 text-sm font-medium border border-stroke-subtle dark:border-stroke/opacity-light flex items-center gap-2 mx-auto`},[...a[100]||=[h(`svg`,{class:`w-4 h-4 group-hover:translate-y-1 transition-transform`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 9l-7 7-7-7`})],-1),p(` Load More Messages `,-1)]])])):V.value?(i(),g(`div`,Xt,[h(`div`,Zt,[d(b,{size:`sm`}),a[101]||=p(` Loading... `,-1)])])):u(``,!0)])):(i(),g(`div`,Qt,[...a[102]||=[h(`div`,{class:`text-center py-12`},[h(`div`,{class:`relative mb-6`},[h(`div`,{class:`absolute inset-0 bg-accent-amber/opacity-medium blur-3xl rounded-full`}),h(`div`,{class:`relative bg-gradient-to-br from-secondary/20 to-primary/20 p-6 rounded-[20px] inline-block border border-stroke-subtle dark:border-white/opacity-light`},[h(`svg`,{class:`w-16 h-16 text-content-muted/opacity-heavy`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z`})])])]),h(`p`,{class:`text-xl font-bold text-content-primary mb-2`},` No messages yet `),h(`p`,{class:`text-sm text-content-secondary dark:text-content-muted`},` Be the first to start the conversation `)],-1)]]))]),h(`div`,$t,[a[105]||=h(`div`,{class:`absolute inset-0 bg-gradient-to-t from-primary/opacity-subtle to-transparent pointer-events-none`},null,-1),h(`div`,en,[h(`div`,tn,[h(`div`,nn,[r(h(`textarea`,{"onUpdate:modelValue":a[27]||=e=>U.value=e,onKeydown:[re(_($n,[`ctrl`]),[`enter`]),re(_($n,[`meta`]),[`enter`])],placeholder:`Type your message... (Ctrl+Enter to send)`,rows:`3`,class:`modal-input resize-none px-4 py-3`},null,40,rn),[[v,U.value]])]),h(`button`,{onClick:$n,disabled:!U.value.trim(),class:c([`group px-6 py-3 rounded-[12px] transition-all duration-200 flex items-center justify-center gap-2 font-medium`,U.value.trim()?`bg-gradient-to-r from-primary/30 to-secondary/30 hover:from-primary/40 hover:to-secondary/40 text-content-primary border border-primary/opacity-heavy hover:scale-105 hover:shadow-lg hover:shadow-primary/opacity-medium`:`bg-background-mute dark:bg-white/opacity-subtle text-content-muted/opacity-heavy cursor-not-allowed border border-stroke-subtle dark:border-stroke/opacity-light`])},[...a[103]||=[h(`svg`,{class:`w-5 h-5 group-hover:translate-x-1 transition-transform`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 19l9 2-9-18-9 18 9-2zm0 0v-8`})],-1),h(`span`,{class:`hidden sm:inline`},`Send`,-1)]],10,an)]),a[104]||=h(`p`,{class:`text-content-secondary dark:text-content-muted/opacity-heavy text-xs flex items-center gap-2`},[h(`svg`,{class:`w-3 h-3`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z`})]),p(` Press Ctrl+Enter to send message quickly `)],-1)])])])])):u(``,!0)])),(i(),s(l,{to:`body`},[J.value?(i(),g(`div`,on,[h(`div`,sn,[h(`div`,cn,[h(`div`,null,[a[107]||=h(`h2`,{class:`text-xl font-bold text-content-primary`},` Active Sessions `,-1),h(`p`,ln,[a[106]||=p(` Room: `,-1),h(`span`,un,o(R.value),1)])]),h(`button`,{onClick:a[29]||=e=>J.value=!1,class:`text-content-secondary dark:text-content-primary/opacity-heavy hover:text-content-primary dark:hover:text-content-primary transition-colors`},[...a[108]||=[h(`svg`,{class:`w-6 h-6`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[h(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])]),h(`div`,dn,[q.value.length===0?(i(),g(`div`,fn,[...a[109]||=[h(`div`,{class:`text-content-secondary dark:text-content-muted`},`No active sessions found`,-1)]])):u(``,!0),(i(!0),g(m,null,t(q.value,(e,t)=>(i(),g(`div`,{key:e.public_key_full||t,class:`glass-card backdrop-blur-xl rounded-[10px] p-4 border border-stroke-subtle dark:border-white/opacity-light`},[h(`div`,pn,[h(`div`,mn,[h(`div`,hn,[h(`span`,gn,o(e.identity_name||`Unknown`),1),h(`span`,{class:c([`px-2 py-0.5 text-xs font-medium rounded`,e.permissions===`admin`?`bg-accent-green/opacity-medium text-accent-green`:`bg-accent-amber/opacity-medium text-accent-amber`])},o(e.permissions),3)]),h(`div`,_n,[h(`span`,vn,o(e.identity_type),1),h(`button`,{onClick:t=>rr(e.public_key_full,e.identity_hash),class:`px-2 py-1 bg-accent-red/opacity-medium hover:bg-accent-red/opacity-medium text-accent-red rounded text-xs transition-colors`,title:`Remove client from ACL`},` Remove `,8,yn)])]),h(`div`,bn,[h(`div`,xn,[a[110]||=h(`span`,{class:`text-content-secondary dark:text-content-muted`},`Short Key:`,-1),h(`code`,Sn,o(e.public_key),1)]),h(`div`,Cn,[a[111]||=h(`span`,{class:`text-content-secondary dark:text-content-muted`},`Full Key:`,-1),h(`code`,wn,o(e.public_key_full),1)])]),h(`div`,Tn,[h(`div`,En,[e.address?(i(),g(`span`,Dn,`📍 `+o(e.address),1)):u(``,!0),e.last_login_success?(i(),g(`span`,On,`Last Login: `+o(new Date(e.last_login_success*1e3).toLocaleString()),1)):u(``,!0)]),e.last_activity?(i(),g(`span`,kn,`Active: `+o(Math.floor((Date.now()/1e3-e.last_activity)/60))+`m ago`,1)):u(``,!0)])])]))),128))])])])):u(``,!0)]))],64))}});export{x as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/Sensors-CT9xtj3s.js b/repeater/web/html/assets/Sensors-CjVXAi_E.js similarity index 96% rename from repeater/web/html/assets/Sensors-CT9xtj3s.js rename to repeater/web/html/assets/Sensors-CjVXAi_E.js index ba3c036..8d5d59b 100644 --- a/repeater/web/html/assets/Sensors-CT9xtj3s.js +++ b/repeater/web/html/assets/Sensors-CjVXAi_E.js @@ -1 +1 @@ -import{D as e,T as t,_t as n,h as r,ht as i,l as a,o,r as s,s as c,u as l}from"./runtime-core.esm-bundler-CINEgm0a.js";import{t as u}from"./system-CGj1WgG8.js";import{t as d}from"./index-Cl4Dij8v.js";var f={class:`space-y-4`},p={class:`glass-card rounded-[15px] p-4 sm:p-6`},m={class:`mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-4`},h={class:`text-xs uppercase tracking-wide text-content-muted`},g={class:`mt-2 text-lg font-semibold text-content-heading`},_={key:0,class:`glass-card rounded-[15px] p-5 text-content-muted`},v={class:`flex flex-wrap items-center justify-between gap-3`},y={class:`text-lg font-semibold text-content-heading`},b={class:`text-sm text-content-muted`},x={class:`mt-3 grid grid-cols-1 gap-2 sm:grid-cols-2`},S={class:`text-sm`},C={class:`ml-2 text-content-heading`},w={key:0,class:`text-sm`},T={class:`ml-2 text-accent-red`},E={class:`mt-4 overflow-x-auto rounded-[12px] border border-stroke-subtle dark:border-white/opacity-light`},D={class:`min-w-full text-sm`},O={class:`px-3 py-2 font-medium text-content-heading`},k={class:`px-3 py-2 text-content-muted break-all`},A={key:0},j={key:1,class:`glass-card rounded-[15px] p-5 text-content-muted`},M=r({name:`SensorsView`,__name:`Sensors`,setup(r){let M=u(),N=o(()=>M.stats?.sensors??null),P=o(()=>N.value?.readings??[]),F=o(()=>{let e=N.value;return e?[{label:`Enabled`,value:e.enabled?`Yes`:`No`},{label:`Running`,value:e.running?`Yes`:`No`},{label:`Configured / Loaded`,value:`${e.configured??0} / ${e.loaded??0}`},{label:`Poll Interval`,value:typeof e.poll_interval_seconds==`number`?`${e.poll_interval_seconds.toFixed(1)}s`:`n/a`}]:[{label:`Enabled`,value:`n/a`},{label:`Running`,value:`n/a`},{label:`Configured`,value:`n/a`},{label:`Poll Interval`,value:`n/a`}]}),I=e=>{if(e==null)return`n/a`;if(typeof e==`boolean`)return e?`true`:`false`;if(typeof e==`number`)return Number.isFinite(e)?String(e):`n/a`;if(typeof e==`string`)return e;try{return JSON.stringify(e)}catch{return String(e)}},L=e=>{if(!e)return`n/a`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()},R=async()=>{await M.fetchStats()};return d(async()=>{await M.fetchStats()},{intervalMs:1e4,immediate:!0}),(r,o)=>(t(),l(`div`,f,[c(`div`,p,[c(`div`,{class:`flex items-start justify-between gap-4`},[o[0]||=c(`div`,null,[c(`h1`,{class:`text-xl sm:text-2xl font-semibold text-content-heading`},`Sensors`),c(`p`,{class:`mt-1 text-sm text-content-muted`},` Live sensor summary from the existing stats API. `)],-1),c(`button`,{class:`rounded-[10px] border border-stroke-subtle dark:border-white/opacity-light px-3 py-2 text-sm hover:bg-black/opacity-light dark:hover:bg-white/opacity-light`,onClick:R},` Refresh `)]),c(`div`,m,[(t(!0),l(s,null,e(F.value,e=>(t(),l(`div`,{key:e.label,class:`rounded-[12px] border border-stroke-subtle dark:border-white/opacity-light p-3`},[c(`p`,h,n(e.label),1),c(`p`,g,n(e.value),1)]))),128))])]),N.value?a(``,!0):(t(),l(`div`,_,` Sensor data is not available yet. Ensure the repeater has started and stats are loading. `)),(t(!0),l(s,null,e(P.value,(r,u)=>(t(),l(`div`,{key:`${r.name||`sensor`}-${u}`,class:`glass-card rounded-[15px] p-4 sm:p-5`},[c(`div`,v,[c(`div`,null,[c(`h2`,y,n(r.name||`Sensor ${u+1}`),1),c(`p`,b,`Type: `+n(r.type||`unknown`),1)]),c(`span`,{class:i([`rounded-full px-3 py-1 text-xs font-semibold`,r.ok?`bg-accent-green/opacity-light text-accent-green dark:bg-accent-green/opacity-medium dark:text-accent-green`:`bg-accent-red/opacity-light text-accent-red dark:bg-accent-red/opacity-medium dark:text-accent-red`])},n(r.ok?`OK`:`Error`),3)]),c(`div`,x,[c(`div`,S,[o[1]||=c(`span`,{class:`text-content-muted`},`Timestamp:`,-1),c(`span`,C,n(L(r.timestamp)),1)]),r.error?(t(),l(`div`,w,[o[2]||=c(`span`,{class:`text-content-muted`},`Error:`,-1),c(`span`,T,n(r.error),1)])):a(``,!0)]),c(`div`,E,[c(`table`,D,[o[4]||=c(`thead`,{class:`bg-black/opacity-light dark:bg-white/opacity-subtle`},[c(`tr`,null,[c(`th`,{class:`px-3 py-2 text-left text-content-muted`},`Field`),c(`th`,{class:`px-3 py-2 text-left text-content-muted`},`Value`)])],-1),c(`tbody`,null,[(t(!0),l(s,null,e(r.data||{},(e,r)=>(t(),l(`tr`,{key:String(r),class:`border-t border-stroke-subtle dark:border-white/opacity-light`},[c(`td`,O,n(r),1),c(`td`,k,n(I(e)),1)]))),128)),!r.data||Object.keys(r.data).length===0?(t(),l(`tr`,A,[...o[3]||=[c(`td`,{class:`px-3 py-3 text-content-muted`,colspan:`2`},`No fields in payload`,-1)]])):a(``,!0)])])])]))),128)),N.value&&P.value.length===0?(t(),l(`div`,j,` Sensors are configured but no readings are available yet. `)):a(``,!0)]))}});export{M as default}; \ No newline at end of file +import{D as e,T as t,_t as n,h as r,ht as i,l as a,o,r as s,s as c,u as l}from"./runtime-core.esm-bundler-CINEgm0a.js";import{t as u}from"./system-CuO1gaHr.js";import{t as d}from"./index-DF5glAZc.js";var f={class:`space-y-4`},p={class:`glass-card rounded-[15px] p-4 sm:p-6`},m={class:`mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-4`},h={class:`text-xs uppercase tracking-wide text-content-muted`},g={class:`mt-2 text-lg font-semibold text-content-heading`},_={key:0,class:`glass-card rounded-[15px] p-5 text-content-muted`},v={class:`flex flex-wrap items-center justify-between gap-3`},y={class:`text-lg font-semibold text-content-heading`},b={class:`text-sm text-content-muted`},x={class:`mt-3 grid grid-cols-1 gap-2 sm:grid-cols-2`},S={class:`text-sm`},C={class:`ml-2 text-content-heading`},w={key:0,class:`text-sm`},T={class:`ml-2 text-accent-red`},E={class:`mt-4 overflow-x-auto rounded-[12px] border border-stroke-subtle dark:border-white/opacity-light`},D={class:`min-w-full text-sm`},O={class:`px-3 py-2 font-medium text-content-heading`},k={class:`px-3 py-2 text-content-muted break-all`},A={key:0},j={key:1,class:`glass-card rounded-[15px] p-5 text-content-muted`},M=r({name:`SensorsView`,__name:`Sensors`,setup(r){let M=u(),N=o(()=>M.stats?.sensors??null),P=o(()=>N.value?.readings??[]),F=o(()=>{let e=N.value;return e?[{label:`Enabled`,value:e.enabled?`Yes`:`No`},{label:`Running`,value:e.running?`Yes`:`No`},{label:`Configured / Loaded`,value:`${e.configured??0} / ${e.loaded??0}`},{label:`Poll Interval`,value:typeof e.poll_interval_seconds==`number`?`${e.poll_interval_seconds.toFixed(1)}s`:`n/a`}]:[{label:`Enabled`,value:`n/a`},{label:`Running`,value:`n/a`},{label:`Configured`,value:`n/a`},{label:`Poll Interval`,value:`n/a`}]}),I=e=>{if(e==null)return`n/a`;if(typeof e==`boolean`)return e?`true`:`false`;if(typeof e==`number`)return Number.isFinite(e)?String(e):`n/a`;if(typeof e==`string`)return e;try{return JSON.stringify(e)}catch{return String(e)}},L=e=>{if(!e)return`n/a`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()},R=async()=>{await M.fetchStats()};return d(async()=>{await M.fetchStats()},{intervalMs:1e4,immediate:!0}),(r,o)=>(t(),l(`div`,f,[c(`div`,p,[c(`div`,{class:`flex items-start justify-between gap-4`},[o[0]||=c(`div`,null,[c(`h1`,{class:`text-xl sm:text-2xl font-semibold text-content-heading`},`Sensors`),c(`p`,{class:`mt-1 text-sm text-content-muted`},` Live sensor summary from the existing stats API. `)],-1),c(`button`,{class:`rounded-[10px] border border-stroke-subtle dark:border-white/opacity-light px-3 py-2 text-sm hover:bg-black/opacity-light dark:hover:bg-white/opacity-light`,onClick:R},` Refresh `)]),c(`div`,m,[(t(!0),l(s,null,e(F.value,e=>(t(),l(`div`,{key:e.label,class:`rounded-[12px] border border-stroke-subtle dark:border-white/opacity-light p-3`},[c(`p`,h,n(e.label),1),c(`p`,g,n(e.value),1)]))),128))])]),N.value?a(``,!0):(t(),l(`div`,_,` Sensor data is not available yet. Ensure the repeater has started and stats are loading. `)),(t(!0),l(s,null,e(P.value,(r,u)=>(t(),l(`div`,{key:`${r.name||`sensor`}-${u}`,class:`glass-card rounded-[15px] p-4 sm:p-5`},[c(`div`,v,[c(`div`,null,[c(`h2`,y,n(r.name||`Sensor ${u+1}`),1),c(`p`,b,`Type: `+n(r.type||`unknown`),1)]),c(`span`,{class:i([`rounded-full px-3 py-1 text-xs font-semibold`,r.ok?`bg-accent-green/opacity-light text-accent-green dark:bg-accent-green/opacity-medium dark:text-accent-green`:`bg-accent-red/opacity-light text-accent-red dark:bg-accent-red/opacity-medium dark:text-accent-red`])},n(r.ok?`OK`:`Error`),3)]),c(`div`,x,[c(`div`,S,[o[1]||=c(`span`,{class:`text-content-muted`},`Timestamp:`,-1),c(`span`,C,n(L(r.timestamp)),1)]),r.error?(t(),l(`div`,w,[o[2]||=c(`span`,{class:`text-content-muted`},`Error:`,-1),c(`span`,T,n(r.error),1)])):a(``,!0)]),c(`div`,E,[c(`table`,D,[o[4]||=c(`thead`,{class:`bg-black/opacity-light dark:bg-white/opacity-subtle`},[c(`tr`,null,[c(`th`,{class:`px-3 py-2 text-left text-content-muted`},`Field`),c(`th`,{class:`px-3 py-2 text-left text-content-muted`},`Value`)])],-1),c(`tbody`,null,[(t(!0),l(s,null,e(r.data||{},(e,r)=>(t(),l(`tr`,{key:String(r),class:`border-t border-stroke-subtle dark:border-white/opacity-light`},[c(`td`,O,n(r),1),c(`td`,k,n(I(e)),1)]))),128)),!r.data||Object.keys(r.data).length===0?(t(),l(`tr`,A,[...o[3]||=[c(`td`,{class:`px-3 py-3 text-content-muted`,colspan:`2`},`No fields in payload`,-1)]])):a(``,!0)])])])]))),128)),N.value&&P.value.length===0?(t(),l(`div`,j,` Sensors are configured but no readings are available yet. `)):a(``,!0)]))}});export{M as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/Sessions-ChyQpfIh.js b/repeater/web/html/assets/Sessions-BjPFjtvX.js similarity index 99% rename from repeater/web/html/assets/Sessions-ChyQpfIh.js rename to repeater/web/html/assets/Sessions-BjPFjtvX.js index 5d74834..1edd933 100644 --- a/repeater/web/html/assets/Sessions-ChyQpfIh.js +++ b/repeater/web/html/assets/Sessions-BjPFjtvX.js @@ -1 +1 @@ -import{C as e,D as t,P as n,T as r,U as i,_t as a,h as ee,ht as o,l as s,m as te,o as c,p as ne,r as l,s as u,u as d}from"./runtime-core.esm-bundler-CINEgm0a.js";import{a as re}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as f}from"./api-CP9MgmUS.js";import{t as ie}from"./Spinner-CMJUE3iy.js";var ae={class:`p-6 space-y-6`},oe={key:0,class:`grid grid-cols-1 md:grid-cols-4 gap-4`},se={class:`glass-card rounded-[15px] p-4`},ce={class:`text-2xl font-bold text-content-primary`},le={class:`glass-card rounded-[15px] p-4`},ue={class:`text-2xl font-bold text-primary`},de={class:`glass-card rounded-[15px] p-4`},fe={class:`text-2xl font-bold text-accent-green`},pe={class:`glass-card rounded-[15px] p-4`},me={class:`text-2xl font-bold text-secondary`},he={class:`glass-card rounded-[15px] p-6`},p={class:`flex flex-wrap border-b border-stroke-subtle dark:border-stroke/opacity-light mb-6`},m=[`onClick`],h={class:`flex items-center gap-2`},g={key:0,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},_={key:1,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},v={key:2,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},y={class:`min-h-[400px]`},b={key:0,class:`flex items-center justify-center py-12`},x={class:`text-center`},S={key:1,class:`flex items-center justify-center py-12`},C={class:`text-center`},w={class:`text-content-secondary dark:text-content-muted text-sm mb-4`},T={key:2,class:`space-y-4`},E={key:0,class:`text-center py-12 text-content-secondary dark:text-content-muted`},D={key:1,class:`space-y-4`},O={class:`flex items-start justify-between`},k={class:`flex-1 min-w-0`},A={class:`flex items-center gap-2 flex-wrap mb-3`},j={class:`text-lg font-semibold text-content-primary truncate`},M={class:`flex flex-wrap items-center gap-x-4 gap-y-2 text-sm`},N={key:0,class:`flex items-center gap-1.5`},P={class:`text-content-secondary dark:text-content-muted`},F={key:1,class:`flex items-center gap-1.5`},I={class:`text-content-secondary dark:text-content-muted`},L={key:2,class:`text-content-secondary dark:text-content-muted font-mono text-xs`},R={key:3,class:`text-content-muted font-mono text-xs`},ge={key:0,class:`text-content-muted text-xs mt-2 mb-0`},_e={class:`grid grid-cols-2 md:grid-cols-4 gap-4 mt-4`},ve={class:`text-content-primary font-medium`},ye={class:`text-primary font-medium`},be={class:`mt-3 flex items-center gap-2`},xe={key:3,class:`space-y-4`},Se={key:0,class:`text-center py-12 text-content-secondary dark:text-content-muted`},Ce={key:1,class:`overflow-x-auto`},we={class:`w-full`},Te={class:`py-3`},z={class:`font-mono text-sm text-content-primary`},Ee={class:`py-3`},De={class:`font-mono text-xs text-content-secondary dark:text-content-muted`},Oe={class:`py-3`},ke={class:`text-sm text-content-primary`},Ae={class:`text-xs text-content-muted`},je={class:`py-3`},Me={class:`py-3`},Ne={class:`text-sm text-content-secondary dark:text-content-muted`},Pe={class:`py-3`},Fe=[`onClick`],Ie={key:4,class:`space-y-4`},Le={class:`mb-4`},Re=[`value`],ze={key:0,class:`text-center py-12 text-content-secondary dark:text-content-muted`},Be={key:1,class:`grid grid-cols-1 gap-4`},Ve={class:`flex items-start justify-between`},He={class:`flex-1`},Ue={class:`flex items-center gap-3 mb-3`},We={class:`text-content-primary font-mono text-sm`},Ge={class:`grid grid-cols-1 md:grid-cols-2 gap-3 text-sm`},Ke={class:`text-content-primary/opacity-heavy font-mono ml-2`},qe={class:`text-content-primary/opacity-heavy ml-2`},Je={class:`text-content-primary/opacity-heavy ml-2`},Ye={class:`text-content-primary/opacity-heavy ml-2`},Xe=[`onClick`],Ze={class:`flex justify-end`},Qe=[`disabled`],B=ee({name:`SessionsView`,__name:`Sessions`,setup(ee){let B=i(`overview`),V=i(!1),H=i(!1),U=i(null),W=i(null),G=i([]),K=i(null),q=i(null),$e=[{id:`overview`,label:`Overview`,icon:`overview`},{id:`clients`,label:`Authenticated Clients`,icon:`clients`},{id:`identities`,label:`By Identity`,icon:`identities`}];e(async()=>{await J(),V.value=!0});async function J(){H.value=!0,U.value=null;try{let e=await f.getACLInfo();e.success&&(W.value=e.data);let t=await f.getACLClients();t.success&&t.data&&(G.value=t.data.clients||[]);let n=await f.getACLStats();n.success&&(K.value=n.data)}catch(e){U.value=e instanceof Error?e.message:`Failed to load ACL data`,console.error(`Error fetching ACL data:`,e)}finally{H.value=!1}}async function Y(e,t){if(confirm(`Are you sure you want to remove this client from the ACL?`))try{let n=await f.removeACLClient({public_key:e,identity_hash:t});n.success?await J():alert(`Failed to remove client: ${n.error}`)}catch(e){alert(`Error removing client: ${e}`)}}function X(e){return e?new Date(e*1e3).toLocaleString():`Never`}function et(e){B.value=e}let Z=c(()=>q.value?G.value.filter(e=>e.identity_name===q.value):G.value),Q=c(()=>W.value&&W.value.acls||[]);function tt(e){return e?.type===`companion`}function nt(e){return e===`repeater`?`bg-primary/opacity-medium text-primary`:e===`companion`?`bg-accent-purple/opacity-medium text-accent-purple`:`bg-secondary/opacity-medium text-secondary`}function $(e){return e==null?`N/A`:typeof e==`boolean`?e?`✓`:`✗`:String(e)}return(e,i)=>(r(),d(`div`,ae,[i[22]||=u(`div`,null,[u(`h1`,{class:`text-2xl font-bold text-content-primary`},` Sessions & Access Control `),u(`p`,{class:`text-content-secondary dark:text-content-muted mt-2`},` Manage authenticated clients and access control lists `),u(`p`,{class:`text-content-muted text-sm mt-1`},` Repeater, room servers, and companion identities; companions do not accept client logins. `)],-1),K.value?(r(),d(`div`,oe,[u(`div`,se,[i[1]||=u(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-1`},` Total Identities `,-1),u(`div`,ce,a(K.value.total_identities),1)]),u(`div`,le,[i[2]||=u(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-1`},` Authenticated Clients `,-1),u(`div`,ue,a(K.value.total_clients),1)]),u(`div`,de,[i[3]||=u(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-1`},`Admin Clients`,-1),u(`div`,fe,a(K.value.admin_clients),1)]),u(`div`,pe,[i[4]||=u(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-1`},`Guest Clients`,-1),u(`div`,me,a(K.value.guest_clients),1)])])):s(``,!0),u(`div`,he,[u(`div`,p,[(r(),d(l,null,t($e,e=>u(`button`,{key:e.id,onClick:t=>et(e.id),class:o([`px-4 py-2 text-sm font-medium transition-colors duration-200 border-b-2 mr-6 mb-2`,B.value===e.id?`text-primary border-primary`:`text-content-secondary dark:text-content-muted border-transparent hover:text-content-primary dark:hover:text-content-primary hover:border-stroke-subtle dark:hover:border-stroke/opacity-medium`])},[u(`div`,h,[e.icon===`overview`?(r(),d(`svg`,g,[...i[5]||=[u(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z`},null,-1)]])):e.icon===`clients`?(r(),d(`svg`,_,[...i[6]||=[u(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z`},null,-1)]])):e.icon===`identities`?(r(),d(`svg`,v,[...i[7]||=[u(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M10 6H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V8a2 2 0 00-2-2h-5m-4 0V5a2 2 0 114 0v1m-4 0a2 2 0 104 0m-5 8a2 2 0 100-4 2 2 0 000 4zm0 0c1.306 0 2.417.835 2.83 2M9 14a3.001 3.001 0 00-2.83 2M15 11h3m-3 4h2`},null,-1)]])):s(``,!0),ne(` `+a(e.label),1)])],10,m)),64))]),u(`div`,y,[H.value&&!V.value?(r(),d(`div`,b,[u(`div`,x,[te(ie,{class:`mx-auto mb-4`}),i[8]||=u(`div`,{class:`text-content-secondary dark:text-content-muted`},`Loading ACL data...`,-1)])])):U.value?(r(),d(`div`,S,[u(`div`,C,[i[9]||=u(`div`,{class:`text-accent-red mb-2`},`Failed to load ACL data`,-1),u(`div`,w,a(U.value),1),u(`button`,{onClick:J,class:`btn-primary`},` Retry `)])])):B.value===`overview`?(r(),d(`div`,T,[Q.value.length===0?(r(),d(`div`,E,` No identities configured `)):(r(),d(`div`,D,[(r(!0),d(l,null,t(Q.value,e=>(r(),d(`div`,{key:e.hash,class:`glass-card rounded-[10px] p-4 border border-stroke-subtle dark:border-white/opacity-light hover:border-primary/opacity-medium dark:hover:border-primary/opacity-medium transition-colors`},[u(`div`,O,[u(`div`,k,[u(`div`,A,[u(`h3`,j,a(e.name),1),u(`span`,{class:o([`px-2 py-0.5 text-xs font-medium rounded shrink-0`,nt(e.type)])},a(e.type),3)]),tt(e)?(r(),d(l,{key:0},[u(`div`,M,[e.registered===void 0?s(``,!0):(r(),d(`span`,N,[u(`span`,{class:o([`w-2 h-2 rounded-full shrink-0`,e.registered?`bg-accent-green`:`bg-accent-red`]),"aria-hidden":``},null,2),u(`span`,P,`Registered: `+a(e.registered?`Active`:`Inactive`),1)])),e.active===void 0?s(``,!0):(r(),d(`span`,F,[u(`span`,{class:o([`w-2 h-2 rounded-full shrink-0`,e.active?`bg-accent-green`:`bg-accent-red`]),"aria-hidden":``},null,2),u(`span`,I,`Bridge: `+a(e.active?`Connected`:`Disconnected`),1)])),e.client_ip?(r(),d(`span`,L,` Client: `+a(e.client_ip),1)):s(``,!0),e.hash?(r(),d(`span`,R,` Hash: `+a(e.hash),1)):s(``,!0)]),e.last_seen==null?s(``,!0):(r(),d(`p`,ge,` Last seen: `+a(X(e.last_seen)),1))],64)):(r(),d(l,{key:1},[u(`div`,_e,[u(`div`,null,[i[10]||=u(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` Max Clients `,-1),u(`div`,ve,a($(e.max_clients)),1)]),u(`div`,null,[i[11]||=u(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` Authenticated `,-1),u(`div`,ye,a($(e.authenticated_clients)),1)]),u(`div`,null,[i[12]||=u(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` Admin Password `,-1),u(`div`,{class:o(e.has_admin_password?`text-accent-green`:`text-accent-red`)},a(e.has_admin_password==null?`N/A`:e.has_admin_password?`✓ Set`:`✗ Not Set`),3)]),u(`div`,null,[i[13]||=u(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` Guest Password `,-1),u(`div`,{class:o(e.has_guest_password?`text-accent-green`:`text-accent-red`)},a(e.has_guest_password==null?`N/A`:e.has_guest_password?`✓ Set`:`✗ Not Set`),3)])]),u(`div`,be,[i[14]||=u(`span`,{class:`text-content-secondary dark:text-content-muted text-xs`},`Read-Only Access:`,-1),u(`span`,{class:o(e.allow_read_only?`text-accent-green`:`text-accent-red`)},a(e.allow_read_only==null?`N/A`:e.allow_read_only?`Allowed`:`Disabled`),3)])],64))])])]))),128))]))])):B.value===`clients`?(r(),d(`div`,xe,[G.value.length===0?(r(),d(`div`,Se,` No authenticated clients `)):(r(),d(`div`,Ce,[u(`table`,we,[i[15]||=u(`thead`,null,[u(`tr`,{class:`border-b border-stroke-subtle dark:border-stroke/opacity-light`},[u(`th`,{class:`text-left text-content-secondary dark:text-content-muted text-sm font-medium pb-3`},` Client `),u(`th`,{class:`text-left text-content-secondary dark:text-content-muted text-sm font-medium pb-3`},` Address `),u(`th`,{class:`text-left text-content-secondary dark:text-content-muted text-sm font-medium pb-3`},` Identity `),u(`th`,{class:`text-left text-content-secondary dark:text-content-muted text-sm font-medium pb-3`},` Permissions `),u(`th`,{class:`text-left text-content-secondary dark:text-content-muted text-sm font-medium pb-3`},` Last Activity `),u(`th`,{class:`text-left text-content-secondary dark:text-content-muted text-sm font-medium pb-3`},` Actions `)])],-1),u(`tbody`,null,[(r(!0),d(l,null,t(G.value,e=>(r(),d(`tr`,{key:e.public_key_full,class:`border-b border-stroke-subtle dark:border-white/opacity-light hover:bg-background-mute/opacity-heavy dark:hover:bg-white/opacity-light transition-colors`},[u(`td`,Te,[u(`div`,z,a(e.public_key),1)]),u(`td`,Ee,[u(`div`,De,a(e.address),1)]),u(`td`,Oe,[u(`div`,ke,a(e.identity_name),1),u(`div`,Ae,a(e.identity_hash),1)]),u(`td`,je,[u(`span`,{class:o([`px-2 py-1 text-xs font-medium rounded`,e.permissions===`admin`?`bg-accent-green/opacity-medium text-accent-green`:`bg-secondary/opacity-medium text-secondary`])},a(e.permissions),3)]),u(`td`,Me,[u(`div`,Ne,a(X(e.last_activity)),1)]),u(`td`,Pe,[u(`button`,{onClick:t=>Y(e.public_key_full,e.identity_hash),class:`btn-danger-xs`},` Remove `,8,Fe)])]))),128))])])]))])):B.value===`identities`?(r(),d(`div`,Ie,[u(`div`,Le,[i[17]||=u(`label`,{class:`block text-content-secondary dark:text-content-muted text-sm mb-2`},`Filter by Identity`,-1),n(u(`select`,{"onUpdate:modelValue":i[0]||=e=>q.value=e,class:`bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light rounded-lg px-4 py-2 text-content-primary focus:outline-none focus:border-primary/opacity-heavy transition-colors`},[i[16]||=u(`option`,{value:null},`All Identities`,-1),(r(!0),d(l,null,t(Q.value,e=>(r(),d(`option`,{key:e.name,value:e.name},a(e.name)+` (`+a(e.authenticated_clients??0)+` clients) `,9,Re))),128))],512),[[re,q.value]])]),Z.value.length===0?(r(),d(`div`,ze,` No clients for selected identity `)):(r(),d(`div`,Be,[(r(!0),d(l,null,t(Z.value,e=>(r(),d(`div`,{key:e.public_key_full,class:`glass-card rounded-[10px] p-4 border border-stroke-subtle dark:border-white/opacity-light`},[u(`div`,Ve,[u(`div`,He,[u(`div`,Ue,[u(`span`,{class:o([`px-2 py-1 text-xs font-medium rounded`,e.permissions===`admin`?`bg-accent-green/opacity-medium text-accent-green`:`bg-secondary/opacity-medium text-secondary`])},a(e.permissions),3),u(`span`,We,a(e.public_key),1)]),u(`div`,Ge,[u(`div`,null,[i[18]||=u(`span`,{class:`text-content-secondary dark:text-content-muted`},`Address:`,-1),u(`span`,Ke,a(e.address),1)]),u(`div`,null,[i[19]||=u(`span`,{class:`text-content-secondary dark:text-content-muted`},`Identity:`,-1),u(`span`,qe,a(e.identity_name)+` (`+a(e.identity_hash)+`)`,1)]),u(`div`,null,[i[20]||=u(`span`,{class:`text-content-secondary dark:text-content-muted`},`Last Activity:`,-1),u(`span`,Je,a(X(e.last_activity)),1)]),u(`div`,null,[i[21]||=u(`span`,{class:`text-content-secondary dark:text-content-muted`},`Last Login:`,-1),u(`span`,Ye,a(X(e.last_login_success)),1)])])]),u(`button`,{onClick:t=>Y(e.public_key_full,e.identity_hash),class:`ml-4 btn-danger-xs`},` Remove `,8,Xe)])]))),128))]))])):s(``,!0)])]),u(`div`,Ze,[u(`button`,{onClick:J,disabled:H.value,class:`btn-primary`},a(H.value?`Refreshing...`:`Refresh Data`),9,Qe)])]))}});export{B as default}; \ No newline at end of file +import{C as e,D as t,P as n,T as r,U as i,_t as a,h as ee,ht as o,l as s,m as te,o as c,p as ne,r as l,s as u,u as d}from"./runtime-core.esm-bundler-CINEgm0a.js";import{a as re}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as f}from"./api-EpLa-SS4.js";import{t as ie}from"./Spinner-CMJUE3iy.js";var ae={class:`p-6 space-y-6`},oe={key:0,class:`grid grid-cols-1 md:grid-cols-4 gap-4`},se={class:`glass-card rounded-[15px] p-4`},ce={class:`text-2xl font-bold text-content-primary`},le={class:`glass-card rounded-[15px] p-4`},ue={class:`text-2xl font-bold text-primary`},de={class:`glass-card rounded-[15px] p-4`},fe={class:`text-2xl font-bold text-accent-green`},pe={class:`glass-card rounded-[15px] p-4`},me={class:`text-2xl font-bold text-secondary`},he={class:`glass-card rounded-[15px] p-6`},p={class:`flex flex-wrap border-b border-stroke-subtle dark:border-stroke/opacity-light mb-6`},m=[`onClick`],h={class:`flex items-center gap-2`},g={key:0,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},_={key:1,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},v={key:2,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},y={class:`min-h-[400px]`},b={key:0,class:`flex items-center justify-center py-12`},x={class:`text-center`},S={key:1,class:`flex items-center justify-center py-12`},C={class:`text-center`},w={class:`text-content-secondary dark:text-content-muted text-sm mb-4`},T={key:2,class:`space-y-4`},E={key:0,class:`text-center py-12 text-content-secondary dark:text-content-muted`},D={key:1,class:`space-y-4`},O={class:`flex items-start justify-between`},k={class:`flex-1 min-w-0`},A={class:`flex items-center gap-2 flex-wrap mb-3`},j={class:`text-lg font-semibold text-content-primary truncate`},M={class:`flex flex-wrap items-center gap-x-4 gap-y-2 text-sm`},N={key:0,class:`flex items-center gap-1.5`},P={class:`text-content-secondary dark:text-content-muted`},F={key:1,class:`flex items-center gap-1.5`},I={class:`text-content-secondary dark:text-content-muted`},L={key:2,class:`text-content-secondary dark:text-content-muted font-mono text-xs`},R={key:3,class:`text-content-muted font-mono text-xs`},ge={key:0,class:`text-content-muted text-xs mt-2 mb-0`},_e={class:`grid grid-cols-2 md:grid-cols-4 gap-4 mt-4`},ve={class:`text-content-primary font-medium`},ye={class:`text-primary font-medium`},be={class:`mt-3 flex items-center gap-2`},xe={key:3,class:`space-y-4`},Se={key:0,class:`text-center py-12 text-content-secondary dark:text-content-muted`},Ce={key:1,class:`overflow-x-auto`},we={class:`w-full`},Te={class:`py-3`},z={class:`font-mono text-sm text-content-primary`},Ee={class:`py-3`},De={class:`font-mono text-xs text-content-secondary dark:text-content-muted`},Oe={class:`py-3`},ke={class:`text-sm text-content-primary`},Ae={class:`text-xs text-content-muted`},je={class:`py-3`},Me={class:`py-3`},Ne={class:`text-sm text-content-secondary dark:text-content-muted`},Pe={class:`py-3`},Fe=[`onClick`],Ie={key:4,class:`space-y-4`},Le={class:`mb-4`},Re=[`value`],ze={key:0,class:`text-center py-12 text-content-secondary dark:text-content-muted`},Be={key:1,class:`grid grid-cols-1 gap-4`},Ve={class:`flex items-start justify-between`},He={class:`flex-1`},Ue={class:`flex items-center gap-3 mb-3`},We={class:`text-content-primary font-mono text-sm`},Ge={class:`grid grid-cols-1 md:grid-cols-2 gap-3 text-sm`},Ke={class:`text-content-primary/opacity-heavy font-mono ml-2`},qe={class:`text-content-primary/opacity-heavy ml-2`},Je={class:`text-content-primary/opacity-heavy ml-2`},Ye={class:`text-content-primary/opacity-heavy ml-2`},Xe=[`onClick`],Ze={class:`flex justify-end`},Qe=[`disabled`],B=ee({name:`SessionsView`,__name:`Sessions`,setup(ee){let B=i(`overview`),V=i(!1),H=i(!1),U=i(null),W=i(null),G=i([]),K=i(null),q=i(null),$e=[{id:`overview`,label:`Overview`,icon:`overview`},{id:`clients`,label:`Authenticated Clients`,icon:`clients`},{id:`identities`,label:`By Identity`,icon:`identities`}];e(async()=>{await J(),V.value=!0});async function J(){H.value=!0,U.value=null;try{let e=await f.getACLInfo();e.success&&(W.value=e.data);let t=await f.getACLClients();t.success&&t.data&&(G.value=t.data.clients||[]);let n=await f.getACLStats();n.success&&(K.value=n.data)}catch(e){U.value=e instanceof Error?e.message:`Failed to load ACL data`,console.error(`Error fetching ACL data:`,e)}finally{H.value=!1}}async function Y(e,t){if(confirm(`Are you sure you want to remove this client from the ACL?`))try{let n=await f.removeACLClient({public_key:e,identity_hash:t});n.success?await J():alert(`Failed to remove client: ${n.error}`)}catch(e){alert(`Error removing client: ${e}`)}}function X(e){return e?new Date(e*1e3).toLocaleString():`Never`}function et(e){B.value=e}let Z=c(()=>q.value?G.value.filter(e=>e.identity_name===q.value):G.value),Q=c(()=>W.value&&W.value.acls||[]);function tt(e){return e?.type===`companion`}function nt(e){return e===`repeater`?`bg-primary/opacity-medium text-primary`:e===`companion`?`bg-accent-purple/opacity-medium text-accent-purple`:`bg-secondary/opacity-medium text-secondary`}function $(e){return e==null?`N/A`:typeof e==`boolean`?e?`✓`:`✗`:String(e)}return(e,i)=>(r(),d(`div`,ae,[i[22]||=u(`div`,null,[u(`h1`,{class:`text-2xl font-bold text-content-primary`},` Sessions & Access Control `),u(`p`,{class:`text-content-secondary dark:text-content-muted mt-2`},` Manage authenticated clients and access control lists `),u(`p`,{class:`text-content-muted text-sm mt-1`},` Repeater, room servers, and companion identities; companions do not accept client logins. `)],-1),K.value?(r(),d(`div`,oe,[u(`div`,se,[i[1]||=u(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-1`},` Total Identities `,-1),u(`div`,ce,a(K.value.total_identities),1)]),u(`div`,le,[i[2]||=u(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-1`},` Authenticated Clients `,-1),u(`div`,ue,a(K.value.total_clients),1)]),u(`div`,de,[i[3]||=u(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-1`},`Admin Clients`,-1),u(`div`,fe,a(K.value.admin_clients),1)]),u(`div`,pe,[i[4]||=u(`div`,{class:`text-content-secondary dark:text-content-muted text-sm mb-1`},`Guest Clients`,-1),u(`div`,me,a(K.value.guest_clients),1)])])):s(``,!0),u(`div`,he,[u(`div`,p,[(r(),d(l,null,t($e,e=>u(`button`,{key:e.id,onClick:t=>et(e.id),class:o([`px-4 py-2 text-sm font-medium transition-colors duration-200 border-b-2 mr-6 mb-2`,B.value===e.id?`text-primary border-primary`:`text-content-secondary dark:text-content-muted border-transparent hover:text-content-primary dark:hover:text-content-primary hover:border-stroke-subtle dark:hover:border-stroke/opacity-medium`])},[u(`div`,h,[e.icon===`overview`?(r(),d(`svg`,g,[...i[5]||=[u(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z`},null,-1)]])):e.icon===`clients`?(r(),d(`svg`,_,[...i[6]||=[u(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z`},null,-1)]])):e.icon===`identities`?(r(),d(`svg`,v,[...i[7]||=[u(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M10 6H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V8a2 2 0 00-2-2h-5m-4 0V5a2 2 0 114 0v1m-4 0a2 2 0 104 0m-5 8a2 2 0 100-4 2 2 0 000 4zm0 0c1.306 0 2.417.835 2.83 2M9 14a3.001 3.001 0 00-2.83 2M15 11h3m-3 4h2`},null,-1)]])):s(``,!0),ne(` `+a(e.label),1)])],10,m)),64))]),u(`div`,y,[H.value&&!V.value?(r(),d(`div`,b,[u(`div`,x,[te(ie,{class:`mx-auto mb-4`}),i[8]||=u(`div`,{class:`text-content-secondary dark:text-content-muted`},`Loading ACL data...`,-1)])])):U.value?(r(),d(`div`,S,[u(`div`,C,[i[9]||=u(`div`,{class:`text-accent-red mb-2`},`Failed to load ACL data`,-1),u(`div`,w,a(U.value),1),u(`button`,{onClick:J,class:`btn-primary`},` Retry `)])])):B.value===`overview`?(r(),d(`div`,T,[Q.value.length===0?(r(),d(`div`,E,` No identities configured `)):(r(),d(`div`,D,[(r(!0),d(l,null,t(Q.value,e=>(r(),d(`div`,{key:e.hash,class:`glass-card rounded-[10px] p-4 border border-stroke-subtle dark:border-white/opacity-light hover:border-primary/opacity-medium dark:hover:border-primary/opacity-medium transition-colors`},[u(`div`,O,[u(`div`,k,[u(`div`,A,[u(`h3`,j,a(e.name),1),u(`span`,{class:o([`px-2 py-0.5 text-xs font-medium rounded shrink-0`,nt(e.type)])},a(e.type),3)]),tt(e)?(r(),d(l,{key:0},[u(`div`,M,[e.registered===void 0?s(``,!0):(r(),d(`span`,N,[u(`span`,{class:o([`w-2 h-2 rounded-full shrink-0`,e.registered?`bg-accent-green`:`bg-accent-red`]),"aria-hidden":``},null,2),u(`span`,P,`Registered: `+a(e.registered?`Active`:`Inactive`),1)])),e.active===void 0?s(``,!0):(r(),d(`span`,F,[u(`span`,{class:o([`w-2 h-2 rounded-full shrink-0`,e.active?`bg-accent-green`:`bg-accent-red`]),"aria-hidden":``},null,2),u(`span`,I,`Bridge: `+a(e.active?`Connected`:`Disconnected`),1)])),e.client_ip?(r(),d(`span`,L,` Client: `+a(e.client_ip),1)):s(``,!0),e.hash?(r(),d(`span`,R,` Hash: `+a(e.hash),1)):s(``,!0)]),e.last_seen==null?s(``,!0):(r(),d(`p`,ge,` Last seen: `+a(X(e.last_seen)),1))],64)):(r(),d(l,{key:1},[u(`div`,_e,[u(`div`,null,[i[10]||=u(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` Max Clients `,-1),u(`div`,ve,a($(e.max_clients)),1)]),u(`div`,null,[i[11]||=u(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` Authenticated `,-1),u(`div`,ye,a($(e.authenticated_clients)),1)]),u(`div`,null,[i[12]||=u(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` Admin Password `,-1),u(`div`,{class:o(e.has_admin_password?`text-accent-green`:`text-accent-red`)},a(e.has_admin_password==null?`N/A`:e.has_admin_password?`✓ Set`:`✗ Not Set`),3)]),u(`div`,null,[i[13]||=u(`div`,{class:`text-content-secondary dark:text-content-muted text-xs mb-1`},` Guest Password `,-1),u(`div`,{class:o(e.has_guest_password?`text-accent-green`:`text-accent-red`)},a(e.has_guest_password==null?`N/A`:e.has_guest_password?`✓ Set`:`✗ Not Set`),3)])]),u(`div`,be,[i[14]||=u(`span`,{class:`text-content-secondary dark:text-content-muted text-xs`},`Read-Only Access:`,-1),u(`span`,{class:o(e.allow_read_only?`text-accent-green`:`text-accent-red`)},a(e.allow_read_only==null?`N/A`:e.allow_read_only?`Allowed`:`Disabled`),3)])],64))])])]))),128))]))])):B.value===`clients`?(r(),d(`div`,xe,[G.value.length===0?(r(),d(`div`,Se,` No authenticated clients `)):(r(),d(`div`,Ce,[u(`table`,we,[i[15]||=u(`thead`,null,[u(`tr`,{class:`border-b border-stroke-subtle dark:border-stroke/opacity-light`},[u(`th`,{class:`text-left text-content-secondary dark:text-content-muted text-sm font-medium pb-3`},` Client `),u(`th`,{class:`text-left text-content-secondary dark:text-content-muted text-sm font-medium pb-3`},` Address `),u(`th`,{class:`text-left text-content-secondary dark:text-content-muted text-sm font-medium pb-3`},` Identity `),u(`th`,{class:`text-left text-content-secondary dark:text-content-muted text-sm font-medium pb-3`},` Permissions `),u(`th`,{class:`text-left text-content-secondary dark:text-content-muted text-sm font-medium pb-3`},` Last Activity `),u(`th`,{class:`text-left text-content-secondary dark:text-content-muted text-sm font-medium pb-3`},` Actions `)])],-1),u(`tbody`,null,[(r(!0),d(l,null,t(G.value,e=>(r(),d(`tr`,{key:e.public_key_full,class:`border-b border-stroke-subtle dark:border-white/opacity-light hover:bg-background-mute/opacity-heavy dark:hover:bg-white/opacity-light transition-colors`},[u(`td`,Te,[u(`div`,z,a(e.public_key),1)]),u(`td`,Ee,[u(`div`,De,a(e.address),1)]),u(`td`,Oe,[u(`div`,ke,a(e.identity_name),1),u(`div`,Ae,a(e.identity_hash),1)]),u(`td`,je,[u(`span`,{class:o([`px-2 py-1 text-xs font-medium rounded`,e.permissions===`admin`?`bg-accent-green/opacity-medium text-accent-green`:`bg-secondary/opacity-medium text-secondary`])},a(e.permissions),3)]),u(`td`,Me,[u(`div`,Ne,a(X(e.last_activity)),1)]),u(`td`,Pe,[u(`button`,{onClick:t=>Y(e.public_key_full,e.identity_hash),class:`btn-danger-xs`},` Remove `,8,Fe)])]))),128))])])]))])):B.value===`identities`?(r(),d(`div`,Ie,[u(`div`,Le,[i[17]||=u(`label`,{class:`block text-content-secondary dark:text-content-muted text-sm mb-2`},`Filter by Identity`,-1),n(u(`select`,{"onUpdate:modelValue":i[0]||=e=>q.value=e,class:`bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light rounded-lg px-4 py-2 text-content-primary focus:outline-none focus:border-primary/opacity-heavy transition-colors`},[i[16]||=u(`option`,{value:null},`All Identities`,-1),(r(!0),d(l,null,t(Q.value,e=>(r(),d(`option`,{key:e.name,value:e.name},a(e.name)+` (`+a(e.authenticated_clients??0)+` clients) `,9,Re))),128))],512),[[re,q.value]])]),Z.value.length===0?(r(),d(`div`,ze,` No clients for selected identity `)):(r(),d(`div`,Be,[(r(!0),d(l,null,t(Z.value,e=>(r(),d(`div`,{key:e.public_key_full,class:`glass-card rounded-[10px] p-4 border border-stroke-subtle dark:border-white/opacity-light`},[u(`div`,Ve,[u(`div`,He,[u(`div`,Ue,[u(`span`,{class:o([`px-2 py-1 text-xs font-medium rounded`,e.permissions===`admin`?`bg-accent-green/opacity-medium text-accent-green`:`bg-secondary/opacity-medium text-secondary`])},a(e.permissions),3),u(`span`,We,a(e.public_key),1)]),u(`div`,Ge,[u(`div`,null,[i[18]||=u(`span`,{class:`text-content-secondary dark:text-content-muted`},`Address:`,-1),u(`span`,Ke,a(e.address),1)]),u(`div`,null,[i[19]||=u(`span`,{class:`text-content-secondary dark:text-content-muted`},`Identity:`,-1),u(`span`,qe,a(e.identity_name)+` (`+a(e.identity_hash)+`)`,1)]),u(`div`,null,[i[20]||=u(`span`,{class:`text-content-secondary dark:text-content-muted`},`Last Activity:`,-1),u(`span`,Je,a(X(e.last_activity)),1)]),u(`div`,null,[i[21]||=u(`span`,{class:`text-content-secondary dark:text-content-muted`},`Last Login:`,-1),u(`span`,Ye,a(X(e.last_login_success)),1)])])]),u(`button`,{onClick:t=>Y(e.public_key_full,e.identity_hash),class:`ml-4 btn-danger-xs`},` Remove `,8,Xe)])]))),128))]))])):s(``,!0)])]),u(`div`,Ze,[u(`button`,{onClick:J,disabled:H.value,class:`btn-primary`},a(H.value?`Refreshing...`:`Refresh Data`),9,Qe)])]))}});export{B as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/Setup-DDZDo4fU.js b/repeater/web/html/assets/Setup-CZMqH1nV.js similarity index 99% rename from repeater/web/html/assets/Setup-DDZDo4fU.js rename to repeater/web/html/assets/Setup-CZMqH1nV.js index 076f547..59e879b 100644 --- a/repeater/web/html/assets/Setup-DDZDo4fU.js +++ b/repeater/web/html/assets/Setup-CZMqH1nV.js @@ -1 +1 @@ -import{C as e,D as t,N as n,P as r,T as i,U as a,X as o,_t as s,c,f as ee,gt as te,h as ne,ht as l,j as u,l as d,m as f,o as p,p as m,r as h,s as g,u as _,y as re}from"./runtime-core.esm-bundler-CINEgm0a.js";import{a as v,l as ie,o as y,r as ae,t as b}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as oe}from"./api-CP9MgmUS.js";import{t as x}from"./createLucideIcon-D-_sbJKW.js";import{n as se,t as ce}from"./TxPowerNoticeModal-D8HswuZ5.js";import{t as le}from"./Spinner-CMJUE3iy.js";import{d as S,i as ue,o as de,r as fe}from"./index-Cl4Dij8v.js";var pe=x(`usb`,[[`circle`,{cx:`10`,cy:`7`,r:`1`,key:`dypaad`}],[`circle`,{cx:`4`,cy:`20`,r:`1`,key:`22iqad`}],[`path`,{d:`M4.7 19.3 19 5`,key:`1enqfc`}],[`path`,{d:`m21 3-3 1 2 2Z`,key:`d3ov82`}],[`path`,{d:`M9.26 7.68 5 12l2 5`,key:`1esawj`}],[`path`,{d:`m10 14 5 2 3.5-3.5`,key:`v8oal5`}],[`path`,{d:`m18 12 1-1 1 1-1 1Z`,key:`1bh22v`}]]),me=x(`wifi`,[[`path`,{d:`M12 20h.01`,key:`zekei9`}],[`path`,{d:`M2 8.82a15 15 0 0 1 20 0`,key:`dnpr2z`}],[`path`,{d:`M5 12.859a10 10 0 0 1 14 0`,key:`1x1e6c`}],[`path`,{d:`M8.5 16.429a5 5 0 0 1 7 0`,key:`1bycff`}]]),he={class:`min-h-screen bg-background dark:bg-background overflow-hidden relative flex items-center justify-center p-4`},ge={class:`absolute top-4 right-4 z-20`},_e={class:`w-full max-w-4xl relative z-10`},ve={class:`mb-8`},ye={class:`flex justify-between mb-2`},C={class:`text-content-secondary dark:text-content-muted text-sm`},w={class:`text-content-secondary dark:text-content-muted text-sm`},T={class:`h-2 bg-stroke-subtle dark:bg-stroke/opacity-subtle rounded-full overflow-hidden`},E={class:`bg-white dark:bg-surface-elevated backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[20px] p-6 sm:p-8 md:p-12`},D={class:`flex justify-center mb-8`},O={class:`flex gap-2`},k={class:`mb-8`},A={class:`text-2xl sm:text-3xl font-bold text-content-primary mb-2 text-center`},j={key:0,class:`space-y-6 mt-8`},M={key:1,class:`space-y-6 mt-8`},N={class:`max-w-md mx-auto`},P={key:2,class:`space-y-6 mt-8`},be={class:`grid grid-cols-1 md:grid-cols-3 gap-4 max-w-5xl mx-auto`},xe=[`onClick`],Se={class:`font-semibold text-lg text-content-primary mb-2`},Ce={class:`text-sm text-content-secondary dark:text-content-muted`},we={key:3,class:`mt-8`},Te={key:0,class:`text-center text-content-secondary dark:text-content-muted`},Ee={key:1,class:`text-center text-content-secondary dark:text-content-muted`},De={key:2,class:`text-center text-content-secondary dark:text-content-muted`},Oe={key:3,class:`max-w-3xl mx-auto space-y-8`},ke={class:`flex items-center gap-3 mb-4`},Ae={key:0,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},je={key:1},Me={class:`grid grid-cols-1 md:grid-cols-2 gap-3 pl-10`},Ne=[`onClick`],Pe={class:`flex items-start justify-between gap-2`},Fe={class:`font-medium text-content-primary mb-1`},Ie={class:`text-sm text-content-secondary dark:text-content-muted`},Le={key:0,class:`text-primary flex-shrink-0 mt-0.5`},Re={key:0},ze={key:0,class:`pl-10`},Be={class:`bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light rounded-[12px] p-5 space-y-4`},Ve={class:`space-y-2`},He={class:`flex gap-2`},Ue=[`disabled`],We=[`value`],Ge=[`value`],Ke=[`disabled`],qe={class:`flex items-center gap-2 text-xs text-content-secondary dark:text-content-muted`},Je={key:1,class:`text-xs text-accent-red`},Ye={key:1,class:`pl-10`},Xe={class:`bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light rounded-[12px] p-5 space-y-4`},Ze={class:`grid grid-cols-2 gap-4`},Qe={key:4,class:`space-y-6 mt-8`},$e={key:0,class:`text-center text-content-secondary dark:text-content-muted`},et={key:1,class:`text-center text-content-secondary dark:text-content-muted`},tt={key:2,class:`max-w-5xl mx-auto`},nt={class:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 mb-4`},rt=[`onClick`],it={class:`relative z-10`},at={class:`font-medium text-content-primary mb-1 flex items-start justify-between gap-2`},ot={class:`flex items-center gap-2`},st={class:`text-2xl`},ct={key:0,class:`text-primary flex-shrink-0`},lt={class:`text-xs text-content-secondary dark:text-content-muted mb-3`},ut={class:`grid grid-cols-2 gap-2 text-xs`},dt={class:`bg-background-mute dark:bg-white/opacity-subtle rounded px-2 py-1`},ft={class:`text-content-primary/opacity-heavy font-medium`},pt={class:`bg-background-mute dark:bg-white/opacity-subtle rounded px-2 py-1`},mt={class:`text-content-primary/opacity-heavy font-medium`},ht={class:`bg-background-mute dark:bg-white/opacity-subtle rounded px-2 py-1`},gt={class:`text-content-primary/opacity-heavy font-medium`},_t={class:`bg-background-mute dark:bg-white/opacity-subtle rounded px-2 py-1`},vt={class:`text-content-primary/opacity-heavy font-medium`},yt={class:`bg-background-mute dark:bg-white/opacity-subtle rounded px-2 py-1 col-span-2`},bt={class:`text-content-primary/opacity-heavy font-medium`},xt={class:`border-t border-stroke-subtle dark:border-stroke/opacity-light pt-6`},St={class:`flex items-center justify-between mb-2`},Ct={key:0,class:`text-primary`},wt={key:0,class:`mt-4 grid grid-cols-2 gap-4`},Tt={class:`col-span-2 sm:col-span-1`},Et={key:5,class:`space-y-6 mt-8`},Dt={class:`max-w-md mx-auto space-y-4`},Ot={key:0,class:`text-accent-red text-sm`},kt={key:0,class:`mb-6 bg-accent-red/opacity-light border border-accent-red/opacity-medium rounded-lg p-4 text-accent-red`},At={class:`flex justify-between gap-4`},jt={key:1},Mt=[`disabled`],Nt={key:1},Pt={key:2},Ft={key:3},It={key:4,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Lt={class:`text-2xl font-bold text-content-primary text-center mb-4`},Rt={class:`text-content-secondary dark:text-content-primary/opacity-heavy text-center mb-6`},F=S(ne({name:`SetupView`,__name:`Setup`,setup(ne){let x=se(),S=a(!1),F=a(``),I=a(``),zt=a(`error`),L=a(!1),R=a([]),z=a(!1),B=a(``),V=a(!1),H=a(!1),U=a(!1),W=a(!1),G=a(null),K=p(()=>{if(x.useCustomRadio){let e=Number(x.customRadio.tx_power);return Number.isFinite(e)?e:null}let e=Number(x.selectedRadioPreset?.tx_power??14);return Number.isFinite(e)?e:14});function Bt(){return x.selectedHardware?.key?.toLowerCase()??``}function Vt(){let e=Bt();return e===`kiss`||e===`pymc_usb`}async function q(){z.value=!0,B.value=``;try{let e=await oe.getSerialPorts();e.success&&Array.isArray(e.data)?R.value=e.data:(R.value=[],B.value=e.error||`Could not load USB serial devices`)}catch(e){let t=e;R.value=[],B.value=t.message||`Could not load USB serial devices`}finally{z.value=!1}}let Ht=e=>{let t=e.toLowerCase();return t.includes(`australia`)?`🇦🇺`:t.includes(`eu`)||t.includes(`uk`)?`🇪🇺`:t.includes(`czech`)?`🇨🇿`:t.includes(`new zealand`)?`🇳🇿`:t.includes(`portugal`)?`🇵🇹`:t.includes(`switzerland`)?`🇨🇭`:t.includes(`usa`)||t.includes(`canada`)?`🇺🇸`:t.includes(`vietnam`)?`🇻🇳`:`🌍`};e(async()=>{await Promise.all([x.fetchHardwareOptions(),x.fetchRadioPresets(),q()])}),u(()=>x.selectedHardware?.key,()=>{Vt()?q():V.value=!1}),u([()=>x.useCustomRadio,()=>x.selectedRadioPreset?.title,()=>x.customRadio.tx_power],()=>{W.value=!1,U.value=!1});let J=p(()=>x.currentStep/x.totalSteps*100),Ut=[{key:`gpio`,title:`HAT GPIO Based Device`,description:`Direct SPI/GPIO connected HATs and board-integrated radios.`},{key:`usb`,title:`USB Connection`,description:`USB-attached modems including CH341 and openHop USB modem.`},{key:`network`,title:`Network Wi-Fi Based`,description:`Remote modem reached over LAN/Wi-Fi using openHop TCP.`}];function Y(e){let t=e.key.toLowerCase();if(t===`kiss`)return`usb`;let n=String(e.config?.connection_type||``).toLowerCase();return n===`usb`||n===`network`||n===`gpio`?n:t.includes(`ch341`)||t===`pymc_usb`?`usb`:t===`pymc_tcp`?`network`:`gpio`}let X=p(()=>{let e=x.selectedHardwareConnection;return e?x.hardwareOptions.filter(t=>Y(t)===e):[]});function Wt(e){x.selectedHardwareConnection=e,x.selectedHardware&&!X.value.some(e=>e.key===x.selectedHardware?.key)&&(x.selectedHardware=null)}function Z(){re(()=>{G.value?.scrollIntoView({behavior:`smooth`,block:`center`})})}async function Q(){if(x.currentStep===5&&x.canGoNext&&!W.value&&K.value!==null){H.value=!0;return}if(x.isLastStep){let e=await x.completeSetup();e.success?L.value=!0:(zt.value=`error`,F.value=`Setup Failed`,I.value=e.error||`An unknown error occurred`,S.value=!0)}else x.nextStep()}function Gt(){H.value=!1,U.value=!1}async function Kt(){U.value&&(W.value=!0,H.value=!1,await Q())}function qt(){x.previousStep()}function $(){S.value=!1}let Jt=[`Welcome`,`Repeater Name`,`Connection Type`,`Hardware & Connection`,`Radio Configuration`,`Security Setup`];return(e,a)=>(i(),_(`div`,he,[g(`div`,ge,[f(ue)]),a[61]||=g(`div`,{class:`bg-gradient-light dark:bg-gradient-dark absolute rounded-full -rotate-[24.22deg] w-[705px] h-[512px] blur-[120px] opacity-80 animate-pulse-slow -top-[79px] left-[575px] mix-blend-multiply dark:mix-blend-screen pointer-events-none`},null,-1),a[62]||=g(`div`,{class:`bg-gradient-light dark:bg-gradient-dark absolute rounded-full -rotate-[24.22deg] w-[705px] h-[512px] blur-[120px] opacity-75 animate-pulse-slower -top-[94px] -left-[92px] mix-blend-multiply dark:mix-blend-screen pointer-events-none`},null,-1),a[63]||=g(`div`,{class:`bg-gradient-light dark:bg-gradient-dark absolute rounded-full -rotate-[24.22deg] w-[705px] h-[512px] blur-[120px] opacity-80 animate-pulse-slowest top-[373px] left-[246px] mix-blend-multiply dark:mix-blend-screen pointer-events-none`},null,-1),g(`div`,_e,[g(`div`,ve,[g(`div`,ye,[g(`span`,C,`Step `+s(o(x).currentStep)+` of `+s(o(x).totalSteps),1),g(`span`,w,s(Math.round(J.value))+`% Complete`,1)]),g(`div`,T,[g(`div`,{class:`h-full bg-gradient-to-r from-primary to-primary/80 transition-all duration-500`,style:te({width:`${J.value}%`})},null,4)])]),g(`div`,E,[g(`div`,D,[g(`div`,O,[(i(!0),_(h,null,t(o(x).totalSteps,e=>(i(),_(`div`,{key:e,class:l([`w-10 h-10 rounded-full flex items-center justify-center text-sm font-medium transition-all`,e===o(x).currentStep?`bg-primary/opacity-medium text-primary`:e

Welcome to your Repeater! Let's get you set up in just a few steps.

You'll configure:

  • Repeater name and identification
  • Hardware board selection
  • Radio frequency and settings
  • Admin password for secure access
`,1)]])):o(x).currentStep===2?(i(),_(`div`,M,[a[22]||=g(`p`,{class:`text-content-secondary dark:text-content-primary/opacity-heavy text-center mb-6`},` Choose a unique name for your repeater. This will be used for identification on the mesh network. `,-1),g(`div`,N,[a[20]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-2`},`Repeater Name`,-1),r(g(`input`,{"onUpdate:modelValue":a[0]||=e=>o(x).nodeName=e,type:`text`,class:`modal-input`,placeholder:`e.g., pyRpt0001`,maxlength:`32`},null,512),[[y,o(x).nodeName]]),a[21]||=g(`p`,{class:`text-content-secondary dark:text-content-muted text-xs mt-2`},` Use letters, numbers, hyphens, or underscores (3-32 characters) `,-1)])])):o(x).currentStep===3?(i(),_(`div`,P,[a[23]||=g(`p`,{class:`text-content-secondary dark:text-content-primary/opacity-heavy text-center mb-6`},` Choose how your radio hardware connects to this repeater. `,-1),g(`div`,be,[(i(),_(h,null,t(Ut,e=>g(`button`,{key:e.key,onClick:t=>Wt(e.key),class:l([`p-6 rounded-[16px] border transition-all duration-300 text-left backdrop-blur-sm min-h-[220px] flex flex-col`,o(x).selectedHardwareConnection===e.key?`bg-gradient-to-r from-primary/20 to-primary/10 border-primary/opacity-heavy shadow-lg shadow-primary/20`:`bg-background-mute dark:bg-white/opacity-subtle border-stroke-subtle dark:border-stroke/opacity-light hover:bg-stroke-subtle dark:hover:bg-white/opacity-light hover:border-stroke dark:hover:border-stroke/opacity-medium`])},[g(`div`,{class:l([`mb-5 w-16 h-16 rounded-2xl flex items-center justify-center border transition-all duration-300`,o(x).selectedHardwareConnection===e.key?`bg-primary/opacity-medium border-primary/opacity-heavy shadow-md shadow-primary/20`:`bg-white/60 dark:bg-white/opacity-subtle border-stroke-subtle dark:border-stroke/opacity-medium`])},[e.key===`gpio`?(i(),c(o(de),{key:0,class:`w-9 h-9 text-primary`,"stroke-width":1.8})):e.key===`usb`?(i(),c(o(pe),{key:1,class:`w-9 h-9 text-primary`,"stroke-width":1.8})):(i(),c(o(me),{key:2,class:`w-9 h-9 text-primary`,"stroke-width":1.8}))],2),g(`div`,Se,s(e.title),1),g(`div`,Ce,s(e.description),1)],10,xe)),64))])])):o(x).currentStep===4?(i(),_(`div`,we,[o(x).isLoading?(i(),_(`div`,Te,` Loading hardware options... `)):o(x).selectedHardwareConnection?X.value.length===0?(i(),_(`div`,De,` No hardware options available for this connection type `)):(i(),_(`div`,Oe,[g(`div`,null,[g(`div`,ke,[g(`div`,{class:l([`w-7 h-7 rounded-full flex items-center justify-center text-sm font-semibold flex-shrink-0 transition-all`,(o(x).selectedHardware,`bg-primary/opacity-medium text-primary`)])},[o(x).selectedHardware?(i(),_(`svg`,Ae,[...a[24]||=[g(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2.5`,d:`M5 13l4 4L19 7`},null,-1)]])):(i(),_(`span`,je,`1`))],2),a[25]||=g(`h3`,{class:`font-semibold text-content-primary`},`Select your hardware board`,-1)]),g(`div`,Me,[(i(!0),_(h,null,t(X.value,e=>(i(),_(`button`,{key:e.key,onClick:t=>{o(x).selectedHardware=e,Z()},class:l([`p-4 rounded-[12px] border transition-all duration-300 text-left backdrop-blur-sm`,o(x).selectedHardware?.key===e.key?`bg-gradient-to-r from-primary/20 to-primary/10 border-primary/opacity-heavy shadow-lg shadow-primary/20`:`bg-background-mute dark:bg-white/opacity-subtle border-stroke-subtle dark:border-stroke/opacity-light hover:bg-stroke-subtle dark:hover:bg-white/opacity-light hover:border-stroke dark:hover:border-stroke/opacity-medium`])},[g(`div`,Pe,[g(`div`,null,[g(`div`,Fe,s(e.name),1),g(`div`,Ie,s(e.description||e.key),1)]),o(x).selectedHardware?.key===e.key?(i(),_(`div`,Le,[...a[26]||=[g(`svg`,{class:`w-5 h-5`,fill:`currentColor`,viewBox:`0 0 20 20`},[g(`path`,{"fill-rule":`evenodd`,d:`M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z`,"clip-rule":`evenodd`})],-1)]])):d(``,!0)])],10,Ne))),128))])]),f(b,{name:`slide`},{default:n(()=>[o(x).selectedHardware&&(o(x).selectedHardware.key.toLowerCase()===`kiss`||o(x).selectedHardware.key.toLowerCase()===`pymc_usb`||o(x).selectedHardware.key.toLowerCase()===`pymc_tcp`)?(i(),_(`div`,Re,[a[36]||=g(`div`,{class:`flex items-center gap-3 mb-4`},[g(`div`,{class:`w-7 h-7 rounded-full bg-primary/opacity-medium text-primary flex items-center justify-center text-sm font-semibold flex-shrink-0`},` 2 `),g(`h3`,{class:`font-semibold text-content-primary`},` Configure the connection to your modem `)],-1),o(x).selectedHardware.key.toLowerCase()===`kiss`||o(x).selectedHardware.key.toLowerCase()===`pymc_usb`?(i(),_(`div`,ze,[g(`div`,Be,[g(`div`,null,[a[28]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-1.5`},` Serial Port `,-1),g(`div`,Ve,[g(`div`,He,[r(g(`select`,{"onUpdate:modelValue":a[1]||=e=>o(x).usbPort=e,class:`modal-select px-4 py-3 font-mono`,disabled:V.value},[o(x).usbPort&&!R.value.some(e=>e.device===o(x).usbPort)?(i(),_(`option`,{key:0,value:o(x).usbPort},s(o(x).usbPort)+` (current) `,9,We)):d(``,!0),(i(!0),_(h,null,t(R.value,e=>(i(),_(`option`,{key:e.device,value:e.device},s(e.description||e.device),9,Ge))),128))],8,Ue),[[v,o(x).usbPort]]),g(`button`,{type:`button`,class:`px-3 py-2 rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light text-sm text-content-primary bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light disabled:opacity-50`,disabled:z.value,onClick:q},s(z.value?`...`:`Refresh`),9,Ke)]),g(`label`,qe,[r(g(`input`,{"onUpdate:modelValue":a[2]||=e=>V.value=e,type:`checkbox`},null,512),[[ae,V.value]]),a[27]||=m(` Enter custom device path `,-1)]),V.value?r((i(),_(`input`,{key:0,"onUpdate:modelValue":a[3]||=e=>o(x).usbPort=e,type:`text`,class:`modal-input px-4 py-3 font-mono`,placeholder:`/dev/ttyACM0`},null,512)),[[y,o(x).usbPort]]):d(``,!0),B.value?(i(),_(`p`,Je,s(B.value),1)):d(``,!0)]),a[29]||=g(`p`,{class:`text-content-muted text-xs mt-2`},[m(` The USB-CDC device path for your modem. If you have the openHop udev rule installed it may appear as `),g(`span`,{class:`font-mono`},`/dev/lora-modem`),m(`. `)],-1)])])])):o(x).selectedHardware.key.toLowerCase()===`pymc_tcp`?(i(),_(`div`,Ye,[g(`div`,Xe,[g(`div`,null,[a[30]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-1.5`},[m(` Modem Hostname or IP Address `),g(`span`,{class:`text-accent-red`},`*`)],-1),r(g(`input`,{"onUpdate:modelValue":a[4]||=e=>o(x).tcpHost=e,type:`text`,class:`modal-input px-4 py-3 font-mono`,placeholder:`pymc-3e2834.local`},null,512),[[y,o(x).tcpHost]]),a[31]||=g(`p`,{class:`text-content-muted text-xs mt-2`},` mDNS hostname, LAN IP, or domain name of the openHop Wi-Fi modem. `,-1)]),g(`div`,Ze,[g(`div`,null,[a[32]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-1.5`},` Port `,-1),r(g(`input`,{"onUpdate:modelValue":a[5]||=e=>o(x).tcpPort=e,type:`number`,min:`1`,max:`65535`,class:`modal-input px-4 py-3`,placeholder:`5055`},null,512),[[y,o(x).tcpPort,void 0,{number:!0}]]),a[33]||=g(`p`,{class:`text-content-muted text-xs mt-2`},`Default is 5055.`,-1)]),g(`div`,null,[a[34]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-1.5`},[m(` Auth Token `),g(`span`,{class:`font-normal text-content-muted ml-1`},`(optional)`)],-1),r(g(`input`,{"onUpdate:modelValue":a[6]||=e=>o(x).tcpToken=e,type:`password`,class:`modal-input px-4 py-3`,placeholder:`Leave blank if none`},null,512),[[y,o(x).tcpToken]]),a[35]||=g(`p`,{class:`text-content-muted text-xs mt-2`},`Must match the token set in the modem firmware.`,-1)])])])])):d(``,!0)])):d(``,!0)]),_:1})])):(i(),_(`div`,Ee,` Choose a connection type first `))])):o(x).currentStep===5?(i(),_(`div`,Qe,[a[54]||=g(`p`,{class:`text-content-secondary dark:text-content-primary/opacity-heavy text-center mb-6`},` Choose a radio configuration preset for your region or create a custom configuration `,-1),o(x).isLoading?(i(),_(`div`,$e,` Loading radio presets... `)):o(x).radioPresets.length===0?(i(),_(`div`,et,` No radio presets available `)):(i(),_(`div`,tt,[g(`div`,nt,[(i(!0),_(h,null,t(o(x).radioPresets,e=>(i(),_(`button`,{key:e.title,onClick:t=>{o(x).selectedRadioPreset=e,o(x).useCustomRadio=!1,Z()},class:l([`p-4 rounded-[12px] border transition-all duration-300 text-left backdrop-blur-sm relative overflow-hidden`,!o(x).useCustomRadio&&o(x).selectedRadioPreset?.title===e.title?`bg-gradient-to-r from-primary/20 to-primary/10 border-primary/opacity-heavy shadow-lg shadow-primary/20`:`bg-background-mute dark:bg-white/opacity-subtle border-stroke-subtle dark:border-stroke/opacity-light hover:bg-stroke-subtle dark:hover:bg-white/opacity-light hover:border-stroke dark:hover:border-stroke/opacity-medium`])},[g(`div`,it,[g(`div`,at,[g(`span`,ot,[g(`span`,st,s(Ht(e.title)),1),g(`span`,null,s(e.title),1)]),!o(x).useCustomRadio&&o(x).selectedRadioPreset?.title===e.title?(i(),_(`div`,ct,[...a[37]||=[g(`svg`,{class:`w-5 h-5`,fill:`currentColor`,viewBox:`0 0 20 20`},[g(`path`,{"fill-rule":`evenodd`,d:`M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z`,"clip-rule":`evenodd`})],-1)]])):d(``,!0)]),g(`div`,lt,s(e.description),1),g(`div`,ut,[g(`div`,dt,[a[38]||=g(`div`,{class:`text-content-muted`},`Freq`,-1),g(`div`,ft,s(e.frequency),1)]),g(`div`,pt,[a[39]||=g(`div`,{class:`text-content-muted`},`BW`,-1),g(`div`,mt,s(e.bandwidth),1)]),g(`div`,ht,[a[40]||=g(`div`,{class:`text-content-muted`},`SF`,-1),g(`div`,gt,s(e.spreading_factor),1)]),g(`div`,_t,[a[41]||=g(`div`,{class:`text-content-muted`},`CR`,-1),g(`div`,vt,s(e.coding_rate),1)]),g(`div`,yt,[a[42]||=g(`div`,{class:`text-content-muted`},`TX Power`,-1),g(`div`,bt,s(o(x).selectedHardware?.config?.tx_power??(e.tx_power||`14`))+` dBm `,1)])])])],10,rt))),128))]),g(`div`,xt,[g(`button`,{onClick:a[7]||=e=>{o(x).useCustomRadio=!o(x).useCustomRadio,o(x).useCustomRadio&&(o(x).selectedRadioPreset=null)},class:l([`w-full p-4 rounded-[12px] border transition-all duration-300 text-left backdrop-blur-sm`,o(x).useCustomRadio?`bg-gradient-to-r from-primary/20 to-primary/10 border-primary/opacity-heavy shadow-lg shadow-primary/20`:`bg-background-mute dark:bg-white/opacity-subtle border-stroke-subtle dark:border-stroke/opacity-light hover:bg-stroke-subtle dark:hover:bg-white/opacity-light hover:border-stroke dark:hover:border-stroke/opacity-medium`])},[g(`div`,St,[a[44]||=g(`div`,{class:`font-medium text-content-primary flex items-center gap-2`},[g(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[g(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4`})]),m(` Custom Configuration `)],-1),o(x).useCustomRadio?(i(),_(`div`,Ct,[...a[43]||=[g(`svg`,{class:`w-5 h-5`,fill:`currentColor`,viewBox:`0 0 20 20`},[g(`path`,{"fill-rule":`evenodd`,d:`M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z`,"clip-rule":`evenodd`})],-1)]])):d(``,!0)]),a[45]||=g(`div`,{class:`text-xs text-content-secondary dark:text-content-muted`},` Manually configure frequency, bandwidth, spreading factor, and coding rate `,-1)],2),f(b,{name:`slide`},{default:n(()=>[o(x).useCustomRadio?(i(),_(`div`,wt,[g(`div`,null,[a[46]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-2`},`Frequency (MHz)`,-1),r(g(`input`,{"onUpdate:modelValue":a[8]||=e=>o(x).customRadio.frequency=e,type:`number`,step:`0.1`,class:`modal-input px-4 py-2.5`,placeholder:`915.0`},null,512),[[y,o(x).customRadio.frequency]])]),g(`div`,null,[a[47]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-2`},`Bandwidth (kHz)`,-1),r(g(`input`,{"onUpdate:modelValue":a[9]||=e=>o(x).customRadio.bandwidth=e,type:`number`,class:`modal-input px-4 py-2.5`,placeholder:`125`},null,512),[[y,o(x).customRadio.bandwidth]])]),g(`div`,null,[a[49]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-2`},`Spreading Factor`,-1),r(g(`select`,{"onUpdate:modelValue":a[10]||=e=>o(x).customRadio.spreading_factor=e,class:`modal-select px-4 py-2.5`},[...a[48]||=[g(`option`,{value:`7`},`7`,-1),g(`option`,{value:`8`},`8`,-1),g(`option`,{value:`9`},`9`,-1),g(`option`,{value:`10`},`10`,-1),g(`option`,{value:`11`},`11`,-1),g(`option`,{value:`12`},`12`,-1)]],512),[[v,o(x).customRadio.spreading_factor]])]),g(`div`,null,[a[51]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-2`},`Coding Rate`,-1),r(g(`select`,{"onUpdate:modelValue":a[11]||=e=>o(x).customRadio.coding_rate=e,class:`modal-select px-4 py-2.5`},[...a[50]||=[g(`option`,{value:`5`},`4/5`,-1),g(`option`,{value:`6`},`4/6`,-1),g(`option`,{value:`7`},`4/7`,-1),g(`option`,{value:`8`},`4/8`,-1)]],512),[[v,o(x).customRadio.coding_rate]])]),g(`div`,Tt,[a[52]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-2`},`TX Power (dBm)`,-1),r(g(`input`,{"onUpdate:modelValue":a[12]||=e=>o(x).customRadio.tx_power=e,type:`number`,min:`-9`,max:`22`,class:`modal-input px-4 py-2.5`,placeholder:`14`},null,512),[[y,o(x).customRadio.tx_power]]),a[53]||=g(`p`,{class:`text-content-muted text-xs mt-2`},`SX1262 range: -9 to +22 dBm`,-1)])])):d(``,!0)]),_:1})])]))])):o(x).currentStep===6?(i(),_(`div`,Et,[a[58]||=g(`p`,{class:`text-content-secondary dark:text-content-primary/opacity-heavy text-center mb-6`},` Set a secure admin password to protect your repeater `,-1),g(`div`,Dt,[g(`div`,null,[a[55]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-2`},`Admin Password`,-1),r(g(`input`,{"onUpdate:modelValue":a[13]||=e=>o(x).adminPassword=e,type:`password`,class:`modal-input px-4 py-3`,placeholder:`Enter password (min 6 characters)`,minlength:`6`},null,512),[[y,o(x).adminPassword]])]),g(`div`,null,[a[56]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-2`},`Confirm Password`,-1),r(g(`input`,{"onUpdate:modelValue":a[14]||=e=>o(x).confirmPassword=e,type:`password`,class:`modal-input px-4 py-3`,placeholder:`Confirm password`},null,512),[[y,o(x).confirmPassword]])]),o(x).adminPassword&&o(x).confirmPassword&&o(x).adminPassword!==o(x).confirmPassword?(i(),_(`div`,Ot,` Passwords do not match `)):d(``,!0),a[57]||=g(`div`,{class:`bg-accent-amber/opacity-light border border-accent-amber/opacity-medium rounded-lg p-3 text-sm text-accent-amber`},[g(`strong`,null,`Important:`),m(` Remember this password - you'll need it to access the dashboard. `)],-1)])])):d(``,!0)]),o(x).error?(i(),_(`div`,kt,s(o(x).error),1)):d(``,!0),g(`div`,At,[o(x).canGoBack?(i(),_(`button`,{key:0,onClick:qt,class:`px-6 py-3 rounded-[12px] bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light text-content-primary hover:bg-stroke-subtle dark:hover:bg-white/opacity-light hover:border-stroke dark:hover:border-stroke/opacity-medium transition-all duration-300 font-medium`},` Back `)):(i(),_(`div`,jt)),g(`button`,{ref_key:`nextActionButtonRef`,ref:G,onClick:Q,disabled:!o(x).canGoNext||o(x).isSubmitting,class:l([`px-8 py-3 rounded-[12px] font-semibold transition-all duration-300 flex items-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed`,o(x).canGoNext&&!o(x).isSubmitting?`bg-primary/opacity-medium hover:bg-primary/opacity-heavy text-primary border border-primary/opacity-heavy hover:border-primary/opacity-heavy`:`bg-background-mute dark:bg-stroke/opacity-subtle text-content-muted border border-stroke-subtle dark:border-stroke/opacity-light`])},[o(x).isSubmitting?(i(),c(le,{key:0,size:`sm`,color:`white`})):d(``,!0),o(x).isSubmitting?(i(),_(`span`,Nt,`Setting up...`)):o(x).isLastStep?(i(),_(`span`,Pt,`Complete Setup`)):(i(),_(`span`,Ft,`Next`)),!o(x).isSubmitting&&!o(x).isLastStep?(i(),_(`svg`,It,[...a[59]||=[g(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 5l7 7-7 7`},null,-1)]])):d(``,!0)],10,Mt)])])]),f(ce,{show:H.value,confirmed:U.value,"selected-tx-power":K.value,"action-label":`I Understand, Continue`,"onUpdate:show":a[15]||=e=>e?H.value=!0:Gt(),"onUpdate:confirmed":a[16]||=e=>U.value=e,onConfirm:Kt},null,8,[`show`,`confirmed`,`selected-tx-power`]),f(b,{name:`modal`},{default:n(()=>[S.value?(i(),_(`div`,{key:0,class:`modal-backdrop`,onClick:$},[g(`div`,{class:`setup-dialog bg-white dark:bg-surface-elevated backdrop-blur-xl max-w-md w-full p-8 rounded-[24px] border border-stroke-subtle dark:border-white/opacity-medium`,onClick:a[17]||=ie(()=>{},[`stop`])},[a[60]||=g(`div`,{class:`flex justify-center mb-6`},[g(`div`,{class:`w-16 h-16 rounded-full bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium flex items-center justify-center`},[g(`svg`,{class:`w-8 h-8 text-accent-red`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[g(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})])])],-1),g(`h3`,Lt,s(F.value),1),g(`p`,Rt,s(I.value),1),g(`button`,{onClick:$,class:`w-full px-6 py-3 rounded-lg font-medium transition-colors bg-accent-red/opacity-medium hover:bg-accent-red/opacity-medium border border-accent-red/opacity-heavy text-accent-red`},` Close `)])])):d(``,!0)]),_:1}),f(fe,{modelValue:L.value,"onUpdate:modelValue":a[18]||=e=>L.value=e,"start-immediately":!0,message:`Setup complete. The service is restarting. This may take up to a minute.`},null,8,[`modelValue`])]))}}),[[`__scopeId`,`data-v-5bdf00ba`]]);export{F as default}; \ No newline at end of file +import{C as e,D as t,N as n,P as r,T as i,U as a,X as o,_t as s,c,f as ee,gt as te,h as ne,ht as l,j as u,l as d,m as f,o as p,p as m,r as h,s as g,u as _,y as re}from"./runtime-core.esm-bundler-CINEgm0a.js";import{a as v,l as ie,o as y,r as ae,t as b}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as oe}from"./api-EpLa-SS4.js";import{t as x}from"./createLucideIcon-D-_sbJKW.js";import{n as se,t as ce}from"./TxPowerNoticeModal-qNJ1X_8Q.js";import{t as le}from"./Spinner-CMJUE3iy.js";import{d as S,i as ue,o as de,r as fe}from"./index-DF5glAZc.js";var pe=x(`usb`,[[`circle`,{cx:`10`,cy:`7`,r:`1`,key:`dypaad`}],[`circle`,{cx:`4`,cy:`20`,r:`1`,key:`22iqad`}],[`path`,{d:`M4.7 19.3 19 5`,key:`1enqfc`}],[`path`,{d:`m21 3-3 1 2 2Z`,key:`d3ov82`}],[`path`,{d:`M9.26 7.68 5 12l2 5`,key:`1esawj`}],[`path`,{d:`m10 14 5 2 3.5-3.5`,key:`v8oal5`}],[`path`,{d:`m18 12 1-1 1 1-1 1Z`,key:`1bh22v`}]]),me=x(`wifi`,[[`path`,{d:`M12 20h.01`,key:`zekei9`}],[`path`,{d:`M2 8.82a15 15 0 0 1 20 0`,key:`dnpr2z`}],[`path`,{d:`M5 12.859a10 10 0 0 1 14 0`,key:`1x1e6c`}],[`path`,{d:`M8.5 16.429a5 5 0 0 1 7 0`,key:`1bycff`}]]),he={class:`min-h-screen bg-background dark:bg-background overflow-hidden relative flex items-center justify-center p-4`},ge={class:`absolute top-4 right-4 z-20`},_e={class:`w-full max-w-4xl relative z-10`},ve={class:`mb-8`},ye={class:`flex justify-between mb-2`},C={class:`text-content-secondary dark:text-content-muted text-sm`},w={class:`text-content-secondary dark:text-content-muted text-sm`},T={class:`h-2 bg-stroke-subtle dark:bg-stroke/opacity-subtle rounded-full overflow-hidden`},E={class:`bg-white dark:bg-surface-elevated backdrop-blur-xl border border-stroke-subtle dark:border-white/opacity-light rounded-[20px] p-6 sm:p-8 md:p-12`},D={class:`flex justify-center mb-8`},O={class:`flex gap-2`},k={class:`mb-8`},A={class:`text-2xl sm:text-3xl font-bold text-content-primary mb-2 text-center`},j={key:0,class:`space-y-6 mt-8`},M={key:1,class:`space-y-6 mt-8`},N={class:`max-w-md mx-auto`},P={key:2,class:`space-y-6 mt-8`},be={class:`grid grid-cols-1 md:grid-cols-3 gap-4 max-w-5xl mx-auto`},xe=[`onClick`],Se={class:`font-semibold text-lg text-content-primary mb-2`},Ce={class:`text-sm text-content-secondary dark:text-content-muted`},we={key:3,class:`mt-8`},Te={key:0,class:`text-center text-content-secondary dark:text-content-muted`},Ee={key:1,class:`text-center text-content-secondary dark:text-content-muted`},De={key:2,class:`text-center text-content-secondary dark:text-content-muted`},Oe={key:3,class:`max-w-3xl mx-auto space-y-8`},ke={class:`flex items-center gap-3 mb-4`},Ae={key:0,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},je={key:1},Me={class:`grid grid-cols-1 md:grid-cols-2 gap-3 pl-10`},Ne=[`onClick`],Pe={class:`flex items-start justify-between gap-2`},Fe={class:`font-medium text-content-primary mb-1`},Ie={class:`text-sm text-content-secondary dark:text-content-muted`},Le={key:0,class:`text-primary flex-shrink-0 mt-0.5`},Re={key:0},ze={key:0,class:`pl-10`},Be={class:`bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light rounded-[12px] p-5 space-y-4`},Ve={class:`space-y-2`},He={class:`flex gap-2`},Ue=[`disabled`],We=[`value`],Ge=[`value`],Ke=[`disabled`],qe={class:`flex items-center gap-2 text-xs text-content-secondary dark:text-content-muted`},Je={key:1,class:`text-xs text-accent-red`},Ye={key:1,class:`pl-10`},Xe={class:`bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light rounded-[12px] p-5 space-y-4`},Ze={class:`grid grid-cols-2 gap-4`},Qe={key:4,class:`space-y-6 mt-8`},$e={key:0,class:`text-center text-content-secondary dark:text-content-muted`},et={key:1,class:`text-center text-content-secondary dark:text-content-muted`},tt={key:2,class:`max-w-5xl mx-auto`},nt={class:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 mb-4`},rt=[`onClick`],it={class:`relative z-10`},at={class:`font-medium text-content-primary mb-1 flex items-start justify-between gap-2`},ot={class:`flex items-center gap-2`},st={class:`text-2xl`},ct={key:0,class:`text-primary flex-shrink-0`},lt={class:`text-xs text-content-secondary dark:text-content-muted mb-3`},ut={class:`grid grid-cols-2 gap-2 text-xs`},dt={class:`bg-background-mute dark:bg-white/opacity-subtle rounded px-2 py-1`},ft={class:`text-content-primary/opacity-heavy font-medium`},pt={class:`bg-background-mute dark:bg-white/opacity-subtle rounded px-2 py-1`},mt={class:`text-content-primary/opacity-heavy font-medium`},ht={class:`bg-background-mute dark:bg-white/opacity-subtle rounded px-2 py-1`},gt={class:`text-content-primary/opacity-heavy font-medium`},_t={class:`bg-background-mute dark:bg-white/opacity-subtle rounded px-2 py-1`},vt={class:`text-content-primary/opacity-heavy font-medium`},yt={class:`bg-background-mute dark:bg-white/opacity-subtle rounded px-2 py-1 col-span-2`},bt={class:`text-content-primary/opacity-heavy font-medium`},xt={class:`border-t border-stroke-subtle dark:border-stroke/opacity-light pt-6`},St={class:`flex items-center justify-between mb-2`},Ct={key:0,class:`text-primary`},wt={key:0,class:`mt-4 grid grid-cols-2 gap-4`},Tt={class:`col-span-2 sm:col-span-1`},Et={key:5,class:`space-y-6 mt-8`},Dt={class:`max-w-md mx-auto space-y-4`},Ot={key:0,class:`text-accent-red text-sm`},kt={key:0,class:`mb-6 bg-accent-red/opacity-light border border-accent-red/opacity-medium rounded-lg p-4 text-accent-red`},At={class:`flex justify-between gap-4`},jt={key:1},Mt=[`disabled`],Nt={key:1},Pt={key:2},Ft={key:3},It={key:4,class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Lt={class:`text-2xl font-bold text-content-primary text-center mb-4`},Rt={class:`text-content-secondary dark:text-content-primary/opacity-heavy text-center mb-6`},F=S(ne({name:`SetupView`,__name:`Setup`,setup(ne){let x=se(),S=a(!1),F=a(``),I=a(``),zt=a(`error`),L=a(!1),R=a([]),z=a(!1),B=a(``),V=a(!1),H=a(!1),U=a(!1),W=a(!1),G=a(null),K=p(()=>{if(x.useCustomRadio){let e=Number(x.customRadio.tx_power);return Number.isFinite(e)?e:null}let e=Number(x.selectedRadioPreset?.tx_power??14);return Number.isFinite(e)?e:14});function Bt(){return x.selectedHardware?.key?.toLowerCase()??``}function Vt(){let e=Bt();return e===`kiss`||e===`pymc_usb`}async function q(){z.value=!0,B.value=``;try{let e=await oe.getSerialPorts();e.success&&Array.isArray(e.data)?R.value=e.data:(R.value=[],B.value=e.error||`Could not load USB serial devices`)}catch(e){let t=e;R.value=[],B.value=t.message||`Could not load USB serial devices`}finally{z.value=!1}}let Ht=e=>{let t=e.toLowerCase();return t.includes(`australia`)?`🇦🇺`:t.includes(`eu`)||t.includes(`uk`)?`🇪🇺`:t.includes(`czech`)?`🇨🇿`:t.includes(`new zealand`)?`🇳🇿`:t.includes(`portugal`)?`🇵🇹`:t.includes(`switzerland`)?`🇨🇭`:t.includes(`usa`)||t.includes(`canada`)?`🇺🇸`:t.includes(`vietnam`)?`🇻🇳`:`🌍`};e(async()=>{await Promise.all([x.fetchHardwareOptions(),x.fetchRadioPresets(),q()])}),u(()=>x.selectedHardware?.key,()=>{Vt()?q():V.value=!1}),u([()=>x.useCustomRadio,()=>x.selectedRadioPreset?.title,()=>x.customRadio.tx_power],()=>{W.value=!1,U.value=!1});let J=p(()=>x.currentStep/x.totalSteps*100),Ut=[{key:`gpio`,title:`HAT GPIO Based Device`,description:`Direct SPI/GPIO connected HATs and board-integrated radios.`},{key:`usb`,title:`USB Connection`,description:`USB-attached modems including CH341 and openHop USB modem.`},{key:`network`,title:`Network Wi-Fi Based`,description:`Remote modem reached over LAN/Wi-Fi using openHop TCP.`}];function Y(e){let t=e.key.toLowerCase();if(t===`kiss`)return`usb`;let n=String(e.config?.connection_type||``).toLowerCase();return n===`usb`||n===`network`||n===`gpio`?n:t.includes(`ch341`)||t===`pymc_usb`?`usb`:t===`pymc_tcp`?`network`:`gpio`}let X=p(()=>{let e=x.selectedHardwareConnection;return e?x.hardwareOptions.filter(t=>Y(t)===e):[]});function Wt(e){x.selectedHardwareConnection=e,x.selectedHardware&&!X.value.some(e=>e.key===x.selectedHardware?.key)&&(x.selectedHardware=null)}function Z(){re(()=>{G.value?.scrollIntoView({behavior:`smooth`,block:`center`})})}async function Q(){if(x.currentStep===5&&x.canGoNext&&!W.value&&K.value!==null){H.value=!0;return}if(x.isLastStep){let e=await x.completeSetup();e.success?L.value=!0:(zt.value=`error`,F.value=`Setup Failed`,I.value=e.error||`An unknown error occurred`,S.value=!0)}else x.nextStep()}function Gt(){H.value=!1,U.value=!1}async function Kt(){U.value&&(W.value=!0,H.value=!1,await Q())}function qt(){x.previousStep()}function $(){S.value=!1}let Jt=[`Welcome`,`Repeater Name`,`Connection Type`,`Hardware & Connection`,`Radio Configuration`,`Security Setup`];return(e,a)=>(i(),_(`div`,he,[g(`div`,ge,[f(ue)]),a[61]||=g(`div`,{class:`bg-gradient-light dark:bg-gradient-dark absolute rounded-full -rotate-[24.22deg] w-[705px] h-[512px] blur-[120px] opacity-80 animate-pulse-slow -top-[79px] left-[575px] mix-blend-multiply dark:mix-blend-screen pointer-events-none`},null,-1),a[62]||=g(`div`,{class:`bg-gradient-light dark:bg-gradient-dark absolute rounded-full -rotate-[24.22deg] w-[705px] h-[512px] blur-[120px] opacity-75 animate-pulse-slower -top-[94px] -left-[92px] mix-blend-multiply dark:mix-blend-screen pointer-events-none`},null,-1),a[63]||=g(`div`,{class:`bg-gradient-light dark:bg-gradient-dark absolute rounded-full -rotate-[24.22deg] w-[705px] h-[512px] blur-[120px] opacity-80 animate-pulse-slowest top-[373px] left-[246px] mix-blend-multiply dark:mix-blend-screen pointer-events-none`},null,-1),g(`div`,_e,[g(`div`,ve,[g(`div`,ye,[g(`span`,C,`Step `+s(o(x).currentStep)+` of `+s(o(x).totalSteps),1),g(`span`,w,s(Math.round(J.value))+`% Complete`,1)]),g(`div`,T,[g(`div`,{class:`h-full bg-gradient-to-r from-primary to-primary/80 transition-all duration-500`,style:te({width:`${J.value}%`})},null,4)])]),g(`div`,E,[g(`div`,D,[g(`div`,O,[(i(!0),_(h,null,t(o(x).totalSteps,e=>(i(),_(`div`,{key:e,class:l([`w-10 h-10 rounded-full flex items-center justify-center text-sm font-medium transition-all`,e===o(x).currentStep?`bg-primary/opacity-medium text-primary`:e

Welcome to your Repeater! Let's get you set up in just a few steps.

You'll configure:

  • Repeater name and identification
  • Hardware board selection
  • Radio frequency and settings
  • Admin password for secure access
`,1)]])):o(x).currentStep===2?(i(),_(`div`,M,[a[22]||=g(`p`,{class:`text-content-secondary dark:text-content-primary/opacity-heavy text-center mb-6`},` Choose a unique name for your repeater. This will be used for identification on the mesh network. `,-1),g(`div`,N,[a[20]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-2`},`Repeater Name`,-1),r(g(`input`,{"onUpdate:modelValue":a[0]||=e=>o(x).nodeName=e,type:`text`,class:`modal-input`,placeholder:`e.g., pyRpt0001`,maxlength:`32`},null,512),[[y,o(x).nodeName]]),a[21]||=g(`p`,{class:`text-content-secondary dark:text-content-muted text-xs mt-2`},` Use letters, numbers, hyphens, or underscores (3-32 characters) `,-1)])])):o(x).currentStep===3?(i(),_(`div`,P,[a[23]||=g(`p`,{class:`text-content-secondary dark:text-content-primary/opacity-heavy text-center mb-6`},` Choose how your radio hardware connects to this repeater. `,-1),g(`div`,be,[(i(),_(h,null,t(Ut,e=>g(`button`,{key:e.key,onClick:t=>Wt(e.key),class:l([`p-6 rounded-[16px] border transition-all duration-300 text-left backdrop-blur-sm min-h-[220px] flex flex-col`,o(x).selectedHardwareConnection===e.key?`bg-gradient-to-r from-primary/20 to-primary/10 border-primary/opacity-heavy shadow-lg shadow-primary/20`:`bg-background-mute dark:bg-white/opacity-subtle border-stroke-subtle dark:border-stroke/opacity-light hover:bg-stroke-subtle dark:hover:bg-white/opacity-light hover:border-stroke dark:hover:border-stroke/opacity-medium`])},[g(`div`,{class:l([`mb-5 w-16 h-16 rounded-2xl flex items-center justify-center border transition-all duration-300`,o(x).selectedHardwareConnection===e.key?`bg-primary/opacity-medium border-primary/opacity-heavy shadow-md shadow-primary/20`:`bg-white/60 dark:bg-white/opacity-subtle border-stroke-subtle dark:border-stroke/opacity-medium`])},[e.key===`gpio`?(i(),c(o(de),{key:0,class:`w-9 h-9 text-primary`,"stroke-width":1.8})):e.key===`usb`?(i(),c(o(pe),{key:1,class:`w-9 h-9 text-primary`,"stroke-width":1.8})):(i(),c(o(me),{key:2,class:`w-9 h-9 text-primary`,"stroke-width":1.8}))],2),g(`div`,Se,s(e.title),1),g(`div`,Ce,s(e.description),1)],10,xe)),64))])])):o(x).currentStep===4?(i(),_(`div`,we,[o(x).isLoading?(i(),_(`div`,Te,` Loading hardware options... `)):o(x).selectedHardwareConnection?X.value.length===0?(i(),_(`div`,De,` No hardware options available for this connection type `)):(i(),_(`div`,Oe,[g(`div`,null,[g(`div`,ke,[g(`div`,{class:l([`w-7 h-7 rounded-full flex items-center justify-center text-sm font-semibold flex-shrink-0 transition-all`,(o(x).selectedHardware,`bg-primary/opacity-medium text-primary`)])},[o(x).selectedHardware?(i(),_(`svg`,Ae,[...a[24]||=[g(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2.5`,d:`M5 13l4 4L19 7`},null,-1)]])):(i(),_(`span`,je,`1`))],2),a[25]||=g(`h3`,{class:`font-semibold text-content-primary`},`Select your hardware board`,-1)]),g(`div`,Me,[(i(!0),_(h,null,t(X.value,e=>(i(),_(`button`,{key:e.key,onClick:t=>{o(x).selectedHardware=e,Z()},class:l([`p-4 rounded-[12px] border transition-all duration-300 text-left backdrop-blur-sm`,o(x).selectedHardware?.key===e.key?`bg-gradient-to-r from-primary/20 to-primary/10 border-primary/opacity-heavy shadow-lg shadow-primary/20`:`bg-background-mute dark:bg-white/opacity-subtle border-stroke-subtle dark:border-stroke/opacity-light hover:bg-stroke-subtle dark:hover:bg-white/opacity-light hover:border-stroke dark:hover:border-stroke/opacity-medium`])},[g(`div`,Pe,[g(`div`,null,[g(`div`,Fe,s(e.name),1),g(`div`,Ie,s(e.description||e.key),1)]),o(x).selectedHardware?.key===e.key?(i(),_(`div`,Le,[...a[26]||=[g(`svg`,{class:`w-5 h-5`,fill:`currentColor`,viewBox:`0 0 20 20`},[g(`path`,{"fill-rule":`evenodd`,d:`M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z`,"clip-rule":`evenodd`})],-1)]])):d(``,!0)])],10,Ne))),128))])]),f(b,{name:`slide`},{default:n(()=>[o(x).selectedHardware&&(o(x).selectedHardware.key.toLowerCase()===`kiss`||o(x).selectedHardware.key.toLowerCase()===`pymc_usb`||o(x).selectedHardware.key.toLowerCase()===`pymc_tcp`)?(i(),_(`div`,Re,[a[36]||=g(`div`,{class:`flex items-center gap-3 mb-4`},[g(`div`,{class:`w-7 h-7 rounded-full bg-primary/opacity-medium text-primary flex items-center justify-center text-sm font-semibold flex-shrink-0`},` 2 `),g(`h3`,{class:`font-semibold text-content-primary`},` Configure the connection to your modem `)],-1),o(x).selectedHardware.key.toLowerCase()===`kiss`||o(x).selectedHardware.key.toLowerCase()===`pymc_usb`?(i(),_(`div`,ze,[g(`div`,Be,[g(`div`,null,[a[28]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-1.5`},` Serial Port `,-1),g(`div`,Ve,[g(`div`,He,[r(g(`select`,{"onUpdate:modelValue":a[1]||=e=>o(x).usbPort=e,class:`modal-select px-4 py-3 font-mono`,disabled:V.value},[o(x).usbPort&&!R.value.some(e=>e.device===o(x).usbPort)?(i(),_(`option`,{key:0,value:o(x).usbPort},s(o(x).usbPort)+` (current) `,9,We)):d(``,!0),(i(!0),_(h,null,t(R.value,e=>(i(),_(`option`,{key:e.device,value:e.device},s(e.description||e.device),9,Ge))),128))],8,Ue),[[v,o(x).usbPort]]),g(`button`,{type:`button`,class:`px-3 py-2 rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light text-sm text-content-primary bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light disabled:opacity-50`,disabled:z.value,onClick:q},s(z.value?`...`:`Refresh`),9,Ke)]),g(`label`,qe,[r(g(`input`,{"onUpdate:modelValue":a[2]||=e=>V.value=e,type:`checkbox`},null,512),[[ae,V.value]]),a[27]||=m(` Enter custom device path `,-1)]),V.value?r((i(),_(`input`,{key:0,"onUpdate:modelValue":a[3]||=e=>o(x).usbPort=e,type:`text`,class:`modal-input px-4 py-3 font-mono`,placeholder:`/dev/ttyACM0`},null,512)),[[y,o(x).usbPort]]):d(``,!0),B.value?(i(),_(`p`,Je,s(B.value),1)):d(``,!0)]),a[29]||=g(`p`,{class:`text-content-muted text-xs mt-2`},[m(` The USB-CDC device path for your modem. If you have the openHop udev rule installed it may appear as `),g(`span`,{class:`font-mono`},`/dev/lora-modem`),m(`. `)],-1)])])])):o(x).selectedHardware.key.toLowerCase()===`pymc_tcp`?(i(),_(`div`,Ye,[g(`div`,Xe,[g(`div`,null,[a[30]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-1.5`},[m(` Modem Hostname or IP Address `),g(`span`,{class:`text-accent-red`},`*`)],-1),r(g(`input`,{"onUpdate:modelValue":a[4]||=e=>o(x).tcpHost=e,type:`text`,class:`modal-input px-4 py-3 font-mono`,placeholder:`pymc-3e2834.local`},null,512),[[y,o(x).tcpHost]]),a[31]||=g(`p`,{class:`text-content-muted text-xs mt-2`},` mDNS hostname, LAN IP, or domain name of the openHop Wi-Fi modem. `,-1)]),g(`div`,Ze,[g(`div`,null,[a[32]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-1.5`},` Port `,-1),r(g(`input`,{"onUpdate:modelValue":a[5]||=e=>o(x).tcpPort=e,type:`number`,min:`1`,max:`65535`,class:`modal-input px-4 py-3`,placeholder:`5055`},null,512),[[y,o(x).tcpPort,void 0,{number:!0}]]),a[33]||=g(`p`,{class:`text-content-muted text-xs mt-2`},`Default is 5055.`,-1)]),g(`div`,null,[a[34]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-1.5`},[m(` Auth Token `),g(`span`,{class:`font-normal text-content-muted ml-1`},`(optional)`)],-1),r(g(`input`,{"onUpdate:modelValue":a[6]||=e=>o(x).tcpToken=e,type:`password`,class:`modal-input px-4 py-3`,placeholder:`Leave blank if none`},null,512),[[y,o(x).tcpToken]]),a[35]||=g(`p`,{class:`text-content-muted text-xs mt-2`},`Must match the token set in the modem firmware.`,-1)])])])])):d(``,!0)])):d(``,!0)]),_:1})])):(i(),_(`div`,Ee,` Choose a connection type first `))])):o(x).currentStep===5?(i(),_(`div`,Qe,[a[54]||=g(`p`,{class:`text-content-secondary dark:text-content-primary/opacity-heavy text-center mb-6`},` Choose a radio configuration preset for your region or create a custom configuration `,-1),o(x).isLoading?(i(),_(`div`,$e,` Loading radio presets... `)):o(x).radioPresets.length===0?(i(),_(`div`,et,` No radio presets available `)):(i(),_(`div`,tt,[g(`div`,nt,[(i(!0),_(h,null,t(o(x).radioPresets,e=>(i(),_(`button`,{key:e.title,onClick:t=>{o(x).selectedRadioPreset=e,o(x).useCustomRadio=!1,Z()},class:l([`p-4 rounded-[12px] border transition-all duration-300 text-left backdrop-blur-sm relative overflow-hidden`,!o(x).useCustomRadio&&o(x).selectedRadioPreset?.title===e.title?`bg-gradient-to-r from-primary/20 to-primary/10 border-primary/opacity-heavy shadow-lg shadow-primary/20`:`bg-background-mute dark:bg-white/opacity-subtle border-stroke-subtle dark:border-stroke/opacity-light hover:bg-stroke-subtle dark:hover:bg-white/opacity-light hover:border-stroke dark:hover:border-stroke/opacity-medium`])},[g(`div`,it,[g(`div`,at,[g(`span`,ot,[g(`span`,st,s(Ht(e.title)),1),g(`span`,null,s(e.title),1)]),!o(x).useCustomRadio&&o(x).selectedRadioPreset?.title===e.title?(i(),_(`div`,ct,[...a[37]||=[g(`svg`,{class:`w-5 h-5`,fill:`currentColor`,viewBox:`0 0 20 20`},[g(`path`,{"fill-rule":`evenodd`,d:`M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z`,"clip-rule":`evenodd`})],-1)]])):d(``,!0)]),g(`div`,lt,s(e.description),1),g(`div`,ut,[g(`div`,dt,[a[38]||=g(`div`,{class:`text-content-muted`},`Freq`,-1),g(`div`,ft,s(e.frequency),1)]),g(`div`,pt,[a[39]||=g(`div`,{class:`text-content-muted`},`BW`,-1),g(`div`,mt,s(e.bandwidth),1)]),g(`div`,ht,[a[40]||=g(`div`,{class:`text-content-muted`},`SF`,-1),g(`div`,gt,s(e.spreading_factor),1)]),g(`div`,_t,[a[41]||=g(`div`,{class:`text-content-muted`},`CR`,-1),g(`div`,vt,s(e.coding_rate),1)]),g(`div`,yt,[a[42]||=g(`div`,{class:`text-content-muted`},`TX Power`,-1),g(`div`,bt,s(o(x).selectedHardware?.config?.tx_power??(e.tx_power||`14`))+` dBm `,1)])])])],10,rt))),128))]),g(`div`,xt,[g(`button`,{onClick:a[7]||=e=>{o(x).useCustomRadio=!o(x).useCustomRadio,o(x).useCustomRadio&&(o(x).selectedRadioPreset=null)},class:l([`w-full p-4 rounded-[12px] border transition-all duration-300 text-left backdrop-blur-sm`,o(x).useCustomRadio?`bg-gradient-to-r from-primary/20 to-primary/10 border-primary/opacity-heavy shadow-lg shadow-primary/20`:`bg-background-mute dark:bg-white/opacity-subtle border-stroke-subtle dark:border-stroke/opacity-light hover:bg-stroke-subtle dark:hover:bg-white/opacity-light hover:border-stroke dark:hover:border-stroke/opacity-medium`])},[g(`div`,St,[a[44]||=g(`div`,{class:`font-medium text-content-primary flex items-center gap-2`},[g(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[g(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4`})]),m(` Custom Configuration `)],-1),o(x).useCustomRadio?(i(),_(`div`,Ct,[...a[43]||=[g(`svg`,{class:`w-5 h-5`,fill:`currentColor`,viewBox:`0 0 20 20`},[g(`path`,{"fill-rule":`evenodd`,d:`M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z`,"clip-rule":`evenodd`})],-1)]])):d(``,!0)]),a[45]||=g(`div`,{class:`text-xs text-content-secondary dark:text-content-muted`},` Manually configure frequency, bandwidth, spreading factor, and coding rate `,-1)],2),f(b,{name:`slide`},{default:n(()=>[o(x).useCustomRadio?(i(),_(`div`,wt,[g(`div`,null,[a[46]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-2`},`Frequency (MHz)`,-1),r(g(`input`,{"onUpdate:modelValue":a[8]||=e=>o(x).customRadio.frequency=e,type:`number`,step:`0.1`,class:`modal-input px-4 py-2.5`,placeholder:`915.0`},null,512),[[y,o(x).customRadio.frequency]])]),g(`div`,null,[a[47]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-2`},`Bandwidth (kHz)`,-1),r(g(`input`,{"onUpdate:modelValue":a[9]||=e=>o(x).customRadio.bandwidth=e,type:`number`,class:`modal-input px-4 py-2.5`,placeholder:`125`},null,512),[[y,o(x).customRadio.bandwidth]])]),g(`div`,null,[a[49]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-2`},`Spreading Factor`,-1),r(g(`select`,{"onUpdate:modelValue":a[10]||=e=>o(x).customRadio.spreading_factor=e,class:`modal-select px-4 py-2.5`},[...a[48]||=[g(`option`,{value:`7`},`7`,-1),g(`option`,{value:`8`},`8`,-1),g(`option`,{value:`9`},`9`,-1),g(`option`,{value:`10`},`10`,-1),g(`option`,{value:`11`},`11`,-1),g(`option`,{value:`12`},`12`,-1)]],512),[[v,o(x).customRadio.spreading_factor]])]),g(`div`,null,[a[51]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-2`},`Coding Rate`,-1),r(g(`select`,{"onUpdate:modelValue":a[11]||=e=>o(x).customRadio.coding_rate=e,class:`modal-select px-4 py-2.5`},[...a[50]||=[g(`option`,{value:`5`},`4/5`,-1),g(`option`,{value:`6`},`4/6`,-1),g(`option`,{value:`7`},`4/7`,-1),g(`option`,{value:`8`},`4/8`,-1)]],512),[[v,o(x).customRadio.coding_rate]])]),g(`div`,Tt,[a[52]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-2`},`TX Power (dBm)`,-1),r(g(`input`,{"onUpdate:modelValue":a[12]||=e=>o(x).customRadio.tx_power=e,type:`number`,min:`-9`,max:`22`,class:`modal-input px-4 py-2.5`,placeholder:`14`},null,512),[[y,o(x).customRadio.tx_power]]),a[53]||=g(`p`,{class:`text-content-muted text-xs mt-2`},`SX1262 range: -9 to +22 dBm`,-1)])])):d(``,!0)]),_:1})])]))])):o(x).currentStep===6?(i(),_(`div`,Et,[a[58]||=g(`p`,{class:`text-content-secondary dark:text-content-primary/opacity-heavy text-center mb-6`},` Set a secure admin password to protect your repeater `,-1),g(`div`,Dt,[g(`div`,null,[a[55]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-2`},`Admin Password`,-1),r(g(`input`,{"onUpdate:modelValue":a[13]||=e=>o(x).adminPassword=e,type:`password`,class:`modal-input px-4 py-3`,placeholder:`Enter password (min 6 characters)`,minlength:`6`},null,512),[[y,o(x).adminPassword]])]),g(`div`,null,[a[56]||=g(`label`,{class:`block text-content-primary/opacity-heavy text-sm font-medium mb-2`},`Confirm Password`,-1),r(g(`input`,{"onUpdate:modelValue":a[14]||=e=>o(x).confirmPassword=e,type:`password`,class:`modal-input px-4 py-3`,placeholder:`Confirm password`},null,512),[[y,o(x).confirmPassword]])]),o(x).adminPassword&&o(x).confirmPassword&&o(x).adminPassword!==o(x).confirmPassword?(i(),_(`div`,Ot,` Passwords do not match `)):d(``,!0),a[57]||=g(`div`,{class:`bg-accent-amber/opacity-light border border-accent-amber/opacity-medium rounded-lg p-3 text-sm text-accent-amber`},[g(`strong`,null,`Important:`),m(` Remember this password - you'll need it to access the dashboard. `)],-1)])])):d(``,!0)]),o(x).error?(i(),_(`div`,kt,s(o(x).error),1)):d(``,!0),g(`div`,At,[o(x).canGoBack?(i(),_(`button`,{key:0,onClick:qt,class:`px-6 py-3 rounded-[12px] bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light text-content-primary hover:bg-stroke-subtle dark:hover:bg-white/opacity-light hover:border-stroke dark:hover:border-stroke/opacity-medium transition-all duration-300 font-medium`},` Back `)):(i(),_(`div`,jt)),g(`button`,{ref_key:`nextActionButtonRef`,ref:G,onClick:Q,disabled:!o(x).canGoNext||o(x).isSubmitting,class:l([`px-8 py-3 rounded-[12px] font-semibold transition-all duration-300 flex items-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed`,o(x).canGoNext&&!o(x).isSubmitting?`bg-primary/opacity-medium hover:bg-primary/opacity-heavy text-primary border border-primary/opacity-heavy hover:border-primary/opacity-heavy`:`bg-background-mute dark:bg-stroke/opacity-subtle text-content-muted border border-stroke-subtle dark:border-stroke/opacity-light`])},[o(x).isSubmitting?(i(),c(le,{key:0,size:`sm`,color:`white`})):d(``,!0),o(x).isSubmitting?(i(),_(`span`,Nt,`Setting up...`)):o(x).isLastStep?(i(),_(`span`,Pt,`Complete Setup`)):(i(),_(`span`,Ft,`Next`)),!o(x).isSubmitting&&!o(x).isLastStep?(i(),_(`svg`,It,[...a[59]||=[g(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M9 5l7 7-7 7`},null,-1)]])):d(``,!0)],10,Mt)])])]),f(ce,{show:H.value,confirmed:U.value,"selected-tx-power":K.value,"action-label":`I Understand, Continue`,"onUpdate:show":a[15]||=e=>e?H.value=!0:Gt(),"onUpdate:confirmed":a[16]||=e=>U.value=e,onConfirm:Kt},null,8,[`show`,`confirmed`,`selected-tx-power`]),f(b,{name:`modal`},{default:n(()=>[S.value?(i(),_(`div`,{key:0,class:`modal-backdrop`,onClick:$},[g(`div`,{class:`setup-dialog bg-white dark:bg-surface-elevated backdrop-blur-xl max-w-md w-full p-8 rounded-[24px] border border-stroke-subtle dark:border-white/opacity-medium`,onClick:a[17]||=ie(()=>{},[`stop`])},[a[60]||=g(`div`,{class:`flex justify-center mb-6`},[g(`div`,{class:`w-16 h-16 rounded-full bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium flex items-center justify-center`},[g(`svg`,{class:`w-8 h-8 text-accent-red`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[g(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})])])],-1),g(`h3`,Lt,s(F.value),1),g(`p`,Rt,s(I.value),1),g(`button`,{onClick:$,class:`w-full px-6 py-3 rounded-lg font-medium transition-colors bg-accent-red/opacity-medium hover:bg-accent-red/opacity-medium border border-accent-red/opacity-heavy text-accent-red`},` Close `)])])):d(``,!0)]),_:1}),f(fe,{modelValue:L.value,"onUpdate:modelValue":a[18]||=e=>L.value=e,"start-immediately":!0,message:`Setup complete. The service is restarting. This may take up to a minute.`},null,8,[`modelValue`])]))}}),[[`__scopeId`,`data-v-5bdf00ba`]]);export{F as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/SignalBars-Ca14Gu_3.js b/repeater/web/html/assets/SignalBars-CwCyvrs-.js similarity index 93% rename from repeater/web/html/assets/SignalBars-Ca14Gu_3.js rename to repeater/web/html/assets/SignalBars-CwCyvrs-.js index 1ed4361..c365107 100644 --- a/repeater/web/html/assets/SignalBars-Ca14Gu_3.js +++ b/repeater/web/html/assets/SignalBars-CwCyvrs-.js @@ -1 +1 @@ -import{D as e,T as t,h as n,ht as r,o as i,r as a,s as o,u as s}from"./runtime-core.esm-bundler-CINEgm0a.js";import{t as c}from"./system-CGj1WgG8.js";var l={7:-7.5,8:-10,9:-12.5,10:-15,11:-17.5,12:-20},u=-116,d=8,f=4,p=5;function m(e,t){return e-t}function h(e){return l[e]??l[d]}function g(e,t){if(ee.noiseFloorDbm??u),n=i(()=>e.stats?.config?.radio?.spreading_factor??d),r=i(()=>h(n.value));return{getSignalQuality:e=>{if(!e||e>0||e<-120)return{bars:0,color:`text-content-muted`,bgColor:`bg-content-muted`,snr:-999,quality:`None`};let n=m(e,t.value);return g(Math.max(-30,Math.min(20,n)),r.value)},getSignalQualityFromSNR:e=>e===null||!Number.isFinite(e)?{bars:0,color:`text-content-muted`,bgColor:`bg-content-muted`,snr:-999,quality:`None`}:g(Math.max(-30,Math.min(20,e)),r.value),noiseFloor:t,spreadingFactor:n,minSNR:r}}var v={class:`flex items-end gap-0.5`},y=n({name:`SignalBars`,__name:`SignalBars`,props:{bars:{},color:{},size:{default:`sm`}},setup(n){let i=n,c={sm:[`h-1.5`,`h-2`,`h-2.5`,`h-3`,`h-3.5`],md:[`h-2`,`h-2.5`,`h-3`,`h-3.5`,`h-4`]},l={sm:`w-1`,md:`w-1.5`};return(n,u)=>(t(),s(`div`,v,[(t(),s(a,null,e(5,e=>o(`div`,{key:e,class:r([`transition-colors`,l[i.size],c[i.size][e-1],e<=i.bars?i.color:`text-content-muted`])},[...u[0]||=[o(`div`,{class:`w-full h-full bg-current rounded-sm`},null,-1)]],2)),64))]))}});export{_ as n,y as t}; \ No newline at end of file +import{D as e,T as t,h as n,ht as r,o as i,r as a,s as o,u as s}from"./runtime-core.esm-bundler-CINEgm0a.js";import{t as c}from"./system-CuO1gaHr.js";var l={7:-7.5,8:-10,9:-12.5,10:-15,11:-17.5,12:-20},u=-116,d=8,f=4,p=5;function m(e,t){return e-t}function h(e){return l[e]??l[d]}function g(e,t){if(ee.noiseFloorDbm??u),n=i(()=>e.stats?.config?.radio?.spreading_factor??d),r=i(()=>h(n.value));return{getSignalQuality:e=>{if(!e||e>0||e<-120)return{bars:0,color:`text-content-muted`,bgColor:`bg-content-muted`,snr:-999,quality:`None`};let n=m(e,t.value);return g(Math.max(-30,Math.min(20,n)),r.value)},getSignalQualityFromSNR:e=>e===null||!Number.isFinite(e)?{bars:0,color:`text-content-muted`,bgColor:`bg-content-muted`,snr:-999,quality:`None`}:g(Math.max(-30,Math.min(20,e)),r.value),noiseFloor:t,spreadingFactor:n,minSNR:r}}var v={class:`flex items-end gap-0.5`},y=n({name:`SignalBars`,__name:`SignalBars`,props:{bars:{},color:{},size:{default:`sm`}},setup(n){let i=n,c={sm:[`h-1.5`,`h-2`,`h-2.5`,`h-3`,`h-3.5`],md:[`h-2`,`h-2.5`,`h-3`,`h-3.5`,`h-4`]},l={sm:`w-1`,md:`w-1.5`};return(n,u)=>(t(),s(`div`,v,[(t(),s(a,null,e(5,e=>o(`div`,{key:e,class:r([`transition-colors`,l[i.size],c[i.size][e-1],e<=i.bars?i.color:`text-content-muted`])},[...u[0]||=[o(`div`,{class:`w-full h-full bg-current rounded-sm`},null,-1)]],2)),64))]))}});export{_ as n,y as t}; \ No newline at end of file diff --git a/repeater/web/html/assets/Sparkline-DrzfaDAP.js b/repeater/web/html/assets/Sparkline-CrqucW0n.js similarity index 97% rename from repeater/web/html/assets/Sparkline-DrzfaDAP.js rename to repeater/web/html/assets/Sparkline-CrqucW0n.js index 2323f36..57e3319 100644 --- a/repeater/web/html/assets/Sparkline-DrzfaDAP.js +++ b/repeater/web/html/assets/Sparkline-CrqucW0n.js @@ -1 +1 @@ -import{T as e,_t as t,c as n,gt as r,h as i,l as a,m as o,o as s,p as c,r as l,s as u,u as d}from"./runtime-core.esm-bundler-CINEgm0a.js";import{t as f}from"./Spinner-CMJUE3iy.js";import{d as p}from"./index-Cl4Dij8v.js";var m={class:`sparkline-card`},h={class:`card-header`},g={class:`card-title`},_={class:`card-subtitle`},v={key:0,class:`card-chart`},y={key:0,class:`chart-loader`},b={key:1,class:`chart-error`},x={key:2,class:`chart-text`},S={class:`percent-value`},C=[`id`,`viewBox`],w=[`d`,`fill`],T=[`d`,`stroke`],E=100,D=40,O=p(i({name:`SparklineChart`,__name:`Sparkline`,props:{title:{},value:{},color:{},data:{default:()=>[]},showChart:{type:Boolean,default:!0},variant:{default:`smooth`},loading:{type:Boolean,default:!1},error:{default:null},centerText:{default:``},subtitle:{default:``},minY:{default:void 0},maxY:{default:void 0}},emits:[`retry`],setup(i,{emit:p}){let O=i,k=p,A=e=>{if(e.length<3)return e;let t=Math.min(15,Math.max(3,Math.floor(e.length*.2))),n=[];for(let r=0;re+t,0)/s.length)}let r=Math.min(10,n.length),i=n.length/r,a=[];for(let e=0;e!O.data||O.data.length===0?[]:O.variant===`smooth`?A(O.data):O.data),M=e=>{if(e.length<2)return``;let t=O.maxY??Math.max(...e),n=O.minY??Math.min(...e),r=t-n||1,i=O.variant===`classic`?4:2,a=``;return e.forEach((t,o)=>{let s=o/(e.length-1)*E,c=(t-n)/r,l=i+(D-i*2)*(1-c);if(o===0)a+=`M ${s.toFixed(2)} ${l.toFixed(2)}`;else{let t=((o-1)/(e.length-1)*E+s)/2;a+=` Q ${t.toFixed(2)} ${l.toFixed(2)} ${s.toFixed(2)} ${l.toFixed(2)}`}}),a},N=s(()=>M(j.value)),P=s(()=>N.value?`${N.value} L ${E} ${D} L 0 ${D} Z`:``),F=s(()=>`sparkline-${O.title.replace(/\s+/g,`-`).toLowerCase()}`);return(s,p)=>(e(),d(`div`,m,[u(`div`,h,[u(`div`,null,[u(`p`,g,t(i.title),1),u(`p`,_,t(i.subtitle),1)]),u(`span`,{class:`card-value`,style:r({color:i.color})},[i.loading?(e(),n(f,{key:0,size:`sm`,color:`current`})):(e(),d(l,{key:1},[c(t(typeof i.value==`number`?i.value.toLocaleString():i.value),1)],64))],4)]),i.showChart?(e(),d(`div`,v,[i.loading&&i.variant===`classic`?(e(),d(`div`,y,[o(f,{size:`sm`})])):i.error?(e(),d(`div`,b,[u(`button`,{class:`chart-retry-btn`,onClick:p[0]||=e=>k(`retry`)},`↺ Retry`)])):i.centerText?(e(),d(`div`,x,[u(`span`,S,t(i.centerText),1)])):(e(),d(`svg`,{key:3,id:F.value,class:`chart-svg`,viewBox:`0 0 ${E} ${D}`,preserveAspectRatio:`none`},[i.variant===`classic`?(e(),d(l,{key:0},[j.value.length>1?(e(),d(`path`,{key:0,d:P.value,fill:i.color,"fill-opacity":`0.8`,class:`sparkline-path`},null,8,w)):a(``,!0)],64)):(e(),d(l,{key:1},[j.value.length>1?(e(),d(`path`,{key:0,d:N.value,stroke:i.color,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`,fill:`none`,class:`sparkline-path`},null,8,T)):a(``,!0)],64))],8,C))])):a(``,!0)]))}}),[[`__scopeId`,`data-v-eb0d809d`]]);export{O as t}; \ No newline at end of file +import{T as e,_t as t,c as n,gt as r,h as i,l as a,m as o,o as s,p as c,r as l,s as u,u as d}from"./runtime-core.esm-bundler-CINEgm0a.js";import{t as f}from"./Spinner-CMJUE3iy.js";import{d as p}from"./index-DF5glAZc.js";var m={class:`sparkline-card`},h={class:`card-header`},g={class:`card-title`},_={class:`card-subtitle`},v={key:0,class:`card-chart`},y={key:0,class:`chart-loader`},b={key:1,class:`chart-error`},x={key:2,class:`chart-text`},S={class:`percent-value`},C=[`id`,`viewBox`],w=[`d`,`fill`],T=[`d`,`stroke`],E=100,D=40,O=p(i({name:`SparklineChart`,__name:`Sparkline`,props:{title:{},value:{},color:{},data:{default:()=>[]},showChart:{type:Boolean,default:!0},variant:{default:`smooth`},loading:{type:Boolean,default:!1},error:{default:null},centerText:{default:``},subtitle:{default:``},minY:{default:void 0},maxY:{default:void 0}},emits:[`retry`],setup(i,{emit:p}){let O=i,k=p,A=e=>{if(e.length<3)return e;let t=Math.min(15,Math.max(3,Math.floor(e.length*.2))),n=[];for(let r=0;re+t,0)/s.length)}let r=Math.min(10,n.length),i=n.length/r,a=[];for(let e=0;e!O.data||O.data.length===0?[]:O.variant===`smooth`?A(O.data):O.data),M=e=>{if(e.length<2)return``;let t=O.maxY??Math.max(...e),n=O.minY??Math.min(...e),r=t-n||1,i=O.variant===`classic`?4:2,a=``;return e.forEach((t,o)=>{let s=o/(e.length-1)*E,c=(t-n)/r,l=i+(D-i*2)*(1-c);if(o===0)a+=`M ${s.toFixed(2)} ${l.toFixed(2)}`;else{let t=((o-1)/(e.length-1)*E+s)/2;a+=` Q ${t.toFixed(2)} ${l.toFixed(2)} ${s.toFixed(2)} ${l.toFixed(2)}`}}),a},N=s(()=>M(j.value)),P=s(()=>N.value?`${N.value} L ${E} ${D} L 0 ${D} Z`:``),F=s(()=>`sparkline-${O.title.replace(/\s+/g,`-`).toLowerCase()}`);return(s,p)=>(e(),d(`div`,m,[u(`div`,h,[u(`div`,null,[u(`p`,g,t(i.title),1),u(`p`,_,t(i.subtitle),1)]),u(`span`,{class:`card-value`,style:r({color:i.color})},[i.loading?(e(),n(f,{key:0,size:`sm`,color:`current`})):(e(),d(l,{key:1},[c(t(typeof i.value==`number`?i.value.toLocaleString():i.value),1)],64))],4)]),i.showChart?(e(),d(`div`,v,[i.loading&&i.variant===`classic`?(e(),d(`div`,y,[o(f,{size:`sm`})])):i.error?(e(),d(`div`,b,[u(`button`,{class:`chart-retry-btn`,onClick:p[0]||=e=>k(`retry`)},`↺ Retry`)])):i.centerText?(e(),d(`div`,x,[u(`span`,S,t(i.centerText),1)])):(e(),d(`svg`,{key:3,id:F.value,class:`chart-svg`,viewBox:`0 0 ${E} ${D}`,preserveAspectRatio:`none`},[i.variant===`classic`?(e(),d(l,{key:0},[j.value.length>1?(e(),d(`path`,{key:0,d:P.value,fill:i.color,"fill-opacity":`0.8`,class:`sparkline-path`},null,8,w)):a(``,!0)],64)):(e(),d(l,{key:1},[j.value.length>1?(e(),d(`path`,{key:0,d:N.value,stroke:i.color,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`,fill:`none`,class:`sparkline-path`},null,8,T)):a(``,!0)],64))],8,C))])):a(``,!0)]))}}),[[`__scopeId`,`data-v-eb0d809d`]]);export{O as t}; \ No newline at end of file diff --git a/repeater/web/html/assets/Statistics-BayfSP13.js b/repeater/web/html/assets/Statistics-DE7FhmLr.js similarity index 98% rename from repeater/web/html/assets/Statistics-BayfSP13.js rename to repeater/web/html/assets/Statistics-DE7FhmLr.js index d21f76b..07cf0d0 100644 --- a/repeater/web/html/assets/Statistics-BayfSP13.js +++ b/repeater/web/html/assets/Statistics-DE7FhmLr.js @@ -1 +1 @@ -import{C as e,D as t,K as n,N as r,P as i,T as a,U as o,V as s,_t as c,gt as l,h as u,l as d,m as f,o as p,r as m,s as h,u as g,x as ee,y as _,z as v}from"./runtime-core.esm-bundler-CINEgm0a.js";import{a as te}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as ne}from"./packets-DqaKkuHX.js";import{_ as re,a as ie,c as ae,d as oe,f as se,g as ce,i as le,l as ue,m as de,n as y,o as fe,p as pe,r as me,s as b,t as x,u as he,v as ge,y as _e}from"./ChartCard-DSqBTrdz.js";import"./chartjs-adapter-date-fns.esm-DfIbzYql.js";import{t as S}from"./Sparkline-DrzfaDAP.js";var ve={class:`p-3 sm:p-6 space-y-4 sm:space-y-6`},ye={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3`},be={class:`flex items-center gap-2 sm:gap-3`},xe=[`value`],Se={class:`grid grid-cols-1 sm:grid-cols-3 gap-4`},Ce={class:`glass-card rounded-[15px] p-3 sm:p-6`},we={class:`flex items-center gap-3 sm:gap-6 mb-3 sm:mb-4`},Te={class:`flex items-center gap-2`},Ee={class:`flex items-center gap-2`},De={class:`grid grid-cols-1 lg:grid-cols-2 gap-4 sm:gap-6 items-stretch`},Oe={class:`glass-card rounded-[15px] p-3 sm:p-6 flex flex-col`},ke={class:`glass-card rounded-[15px] p-3 sm:p-6 flex flex-col`},Ae={class:`w-28 sm:w-32 text-sm text-content-primary truncate`},je={class:`flex-1 h-12 bg-background-mute dark:bg-stroke/opacity-subtle rounded overflow-hidden`},Me={class:`w-20 text-sm text-content-secondary dark:text-content-muted text-right tabular-nums`},C=20,w=u({name:`StatisticsView`,__name:`Statistics`,setup(u){b.register(fe,oe,se,he,ue,le,ae,pe,ge,_e,re,me,ie,ce,de);let w=ne(),T=e=>e>48?{unit:`day`,displayFormats:{day:`EEE MMM d`}}:e>24?{unit:`hour`,displayFormats:{hour:`EEE HH:mm`}}:{unit:`hour`,displayFormats:{hour:`HH:mm`}},E=s({packetRate:`Connecting...`,noiseFloor:`Connecting...`,routePie:`Connecting...`}),D=(e,t)=>typeof window>`u`?t:window.getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t,O=()=>({gridColor:D(`--color-border-subtle`,`lightgray`),tickColor:D(`--color-text-secondary`,`gray`),legendColor:D(`--color-text-primary`,`white`),titleColor:D(`--color-text-primary`,`white`),tooltipBg:D(`--color-surface-elevated`,`black`),tooltipTitle:D(`--color-heading`,`white`),tooltipBody:D(`--color-text-primary`,`white`),tooltipBorder:D(`--color-border-subtle`,`gray`)}),k={tx:D(`--color-accent-red`,`tomato`),rx:D(`--color-secondary`,`violet`),noiseFloor:D(`--color-primary`,`deepskyblue`),noiseFloorFill:D(`--color-primary`,`deepskyblue`),noiseFloorGrid:D(`--color-border-hover`,`gray`),totalRx:D(`--color-accent-cyan`,`cyan`),totalTx:D(`--color-accent-green`,`limegreen`),crcErrors:D(`--color-accent-red`,`tomato`),packetTypes:[D(`--openhop-blue-light`,`lightskyblue`),D(`--color-accent-green`,`limegreen`),D(`--color-primary-bg`,`khaki`),D(`--openhop-purple-light`,`violet`),D(`--color-accent-red`,`tomato`),D(`--color-accent-cyan`,`cyan`),D(`--color-accent-green-bg`,`lightgreen`),D(`--color-accent-purple`,`orchid`),D(`--color-accent-green`,`limegreen`)],routes:[D(`--color-primary`,`deepskyblue`),D(`--color-accent-green`,`limegreen`),D(`--color-accent-cyan`,`cyan`),D(`--color-secondary`,`violet`),D(`--color-accent-red`,`tomato`)]},A=o(24),Ne=[{value:1,label:`1 Hour`},{value:6,label:`6 Hours`},{value:12,label:`12 Hours`},{value:24,label:`24 Hours`},{value:48,label:`2 Days`},{value:168,label:`1 Week`}],j=o(null),M=o(null),N=o(null),P=o([]),F=o([]),I=o(!0),L=o(null),R=o({packetRate:!0,noiseFloor:!1,routePie:!0,sparklineMetrics:!0,sparklineCrc:!0}),z=o(null),B=o(null),V=o(null),H=o(null),U=o(null),W=o(null),G=o(null),K=o(null),q=o({totalRx:0,totalTx:0}),J=(e,t)=>{if(e.length===0)return[];let n=Math.round(t*60*60*1e3/72),r=new Map;return e.forEach(([e,t])=>{let i=e;e>0x38d7ea4c68000?i=e/1e3:e>1e9&&e<0xe8d4a51000&&(i=e*1e3);let a=Math.floor(i/n)*n;r.has(a)||r.set(a,[]),r.get(a).push(t)}),Array.from(r.entries()).sort((e,t)=>e[0]-t[0]).map(([,e])=>e.reduce((e,t)=>e+t,0)/e.length)},Y=p(()=>{let e=[],t=[];if(j.value?.series){let n=j.value.series.find(e=>e.type===`rx_count`),r=j.value.series.find(e=>e.type===`tx_count`);n?.data&&(e=J(n.data.map(([e,t])=>[e,t>C?0:t]),A.value)),r?.data&&(t=J(r.data.map(([e,t])=>[e,t>C?0:t]),A.value))}return{totalPackets:e,transmittedPackets:t,droppedPackets:[],crcErrors:J(F.value.map(e=>[e.timestamp>0xe8d4a51000?e.timestamp:e.timestamp*1e3,e.count]),A.value)}}),X=async()=>{try{I.value=!0,L.value=null;let e=await y(`/packet_stats`,{hours:A.value});q.value={totalRx:e.data?.total_packets||0,totalTx:e.data?.transmitted_packets||0},I.value=!1}catch(e){L.value=e instanceof Error?e.message:`Failed to fetch data`,I.value=!1}Pe()},Pe=async()=>{R.value={packetRate:!0,noiseFloor:!0,routePie:!0,sparklineMetrics:!0,sparklineCrc:!0},w.metricsGraphData&&(j.value=w.metricsGraphData),w.crcErrorHistory.length>0&&(F.value=[...w.crcErrorHistory]),w.noiseFloorHistory.length>0&&(M.value={chart_data:w.noiseFloorHistory.map(e=>({timestamp:e.timestamp,noise_floor_dbm:e.noise_floor_dbm}))},$()),Z(),Q(),Fe(),Ie()},Z=async()=>{E.packetRate=`Connecting...`,z.value=null;try{let e=await y(`/metrics_graph_data`,{hours:A.value,resolution:`average`,metrics:`rx_count,tx_count`},{onPhaseChange:e=>{E.packetRate=e===`receiving`?`Receiving data...`:`Connecting...`}});e?.success&&(j.value=e.data)}catch(e){z.value=e instanceof Error?e.message:`Failed to load`,j.value=null}finally{R.value.packetRate=!1,R.value.sparklineMetrics=!1,z.value||(await _(),ze())}},Q=async()=>{E.routePie=`Connecting...`,B.value=null;try{let e=await y(`/route_stats`,{hours:A.value},{onPhaseChange:e=>{E.routePie=e===`receiving`?`Receiving data...`:`Connecting...`}});e?.success&&e.data&&(N.value=e.data)}catch(e){N.value=null,B.value=e instanceof Error?e.message:`Failed to load`}finally{R.value.routePie=!1}},Fe=async()=>{E.noiseFloor=`Connecting...`,V.value=null;try{let e=A.value*120,t=await y(`/noise_floor_history`,{hours:A.value,limit:e},{idleTimeoutMs:3e4,onPhaseChange:e=>{E.noiseFloor=e===`receiving`?`Receiving data...`:`Connecting...`}});if(t.success&&t.data){let e=t.data.history||[];if(Array.isArray(e)&&e.length>0){let t=e;if(e.length>1500){let n=Math.ceil(e.length/1500);t=e.filter((e,t)=>t%n===0)}M.value={chart_data:t.map(e=>({timestamp:e.timestamp||Date.now()/1e3,noise_floor_dbm:e.noise_floor_dbm||e.noise_floor||-120}))},$()}}}catch(e){M.value={chart_data:[]},V.value=e instanceof Error?e.message:`Failed to load`}finally{R.value.noiseFloor=!1,V.value||(await _(),Be())}},Ie=async()=>{H.value=null;try{let e=await y(`/crc_error_history`,{hours:A.value});e?.success&&e.data&&(F.value=e.data.history||[])}catch(e){F.value=[],H.value=e instanceof Error?e.message:`Failed to load`}finally{R.value.sparklineCrc=!1}},Le=()=>{R.value={packetRate:!0,noiseFloor:!0,routePie:!0,sparklineMetrics:!0,sparklineCrc:!0},Re(),z.value=null,B.value=null,V.value=null,X()},$=()=>{P.value=[],M.value?.chart_data&&M.value.chart_data.length>0&&(P.value=M.value.chart_data.map(e=>({timestamp:e.timestamp*1e3,snr:null,rssi:null,noiseFloor:e.noise_floor_dbm})))},Re=()=>{try{U.value&&=(U.value.destroy(),null),W.value&&=(W.value.destroy(),null)}catch(e){console.error(`Error destroying charts:`,e)}},ze=()=>{if(!G.value)return;let e=G.value.getContext(`2d`);if(!e)return;let t=[],n=[];if(j.value?.series){let e=j.value.series.find(e=>e.type===`rx_count`),r=j.value.series.find(e=>e.type===`tx_count`);e?.data&&(t=e.data.map(([e,t])=>{let n=e;return n=e>0x38d7ea4c68000?e/1e3:e>0xe8d4a51000?e:e>1e9?e*1e3:Date.now(),{x:n,y:t>C?0:t*3600}})),r?.data&&(n=r.data.map(([e,t])=>{let n=e;return n=e>0x38d7ea4c68000?e/1e3:e>0xe8d4a51000?e:e>1e9?e*1e3:Date.now(),{x:n,y:t>C?0:t*3600}}))}if(t.length===0&&n.length===0){z.value=`No data available for the selected time range`;return}z.value=null,U.value&&=(U.value.destroy(),null);let r=Math.round(A.value*60*60*1e3/72),i=e=>{if(e.length===0)return[];let t=new Map;return e.forEach(e=>{let n=Math.floor(e.x/r)*r;t.has(n)||t.set(n,[]),t.get(n).push(e.y)}),Array.from(t.entries()).map(([e,t])=>({x:e,y:t.reduce((e,t)=>e+t,0)/t.length})).sort((e,t)=>e.x-t.x)},a=(e,t=3)=>{if(e.lengthe+t.y,0)/o.length;n.push({x:e[r].x,y:s})}return n},o=a(i(t)),s=a(i(n)),c=[...o.map(e=>e.y),...s.map(e=>e.y)],l=Math.min(...c),u=Math.max(...c),d=u-l||u*.1||.001,f=Math.max(0,l-d*.05),p=u+d*.05;try{let t=JSON.parse(JSON.stringify(o));U.value=v(new b(e,{type:`line`,data:{datasets:[{label:`TX/hr`,data:JSON.parse(JSON.stringify(s)),borderColor:k.tx,backgroundColor:k.tx,borderWidth:2,fill:`origin`,tension:.4,pointRadius:0,pointHoverRadius:3,order:1},{label:`RX/hr`,data:t,borderColor:k.rx,backgroundColor:k.rx,borderWidth:2,fill:`origin`,tension:.4,pointRadius:0,pointHoverRadius:3,order:2}]},options:{responsive:!0,maintainAspectRatio:!1,animation:{duration:0},interaction:{mode:`index`,intersect:!1},plugins:{legend:{display:!1},title:{display:!1},tooltip:{enabled:!0,backgroundColor:O().tooltipBg,titleColor:O().tooltipTitle,bodyColor:O().tooltipBody,borderColor:O().tooltipBorder,borderWidth:1,padding:12,displayColors:!0,callbacks:{title:function(e){let t=e[0]?.parsed?.x;return t==null?``:new Date(t).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})},label:function(e){let t=e.dataset?.label||``,n=e.parsed?.y;return n==null?t:`${t}: ${n.toFixed(1)}`}}}},scales:{x:{type:`time`,time:T(A.value),min:Date.now()-A.value*3600*1e3,max:Date.now(),grid:{color:O().gridColor},ticks:{color:O().tickColor,maxTicksLimit:8}},y:{beginAtZero:!1,title:{display:!0,text:`Packets / Hour`,color:O().tickColor},grid:{color:O().gridColor},ticks:{color:O().tickColor,callback:function(e){return typeof e==`number`?e.toFixed(1):e}},min:f,max:p}}}}))}catch(e){console.error(`Error creating packet rate chart:`,e),z.value=`Failed to render chart`}},Be=()=>{if(!K.value)return;let e=K.value.getContext(`2d`);if(!e)return;let t=P.value.map(e=>({x:e.timestamp,y:e.noiseFloor})).filter(e=>e.y!==null&&e.y!==void 0),r=t.map(e=>e.y),i=r.length>0?Math.min(...r):-120,a=r.length>0?Math.max(...r):-110,o=a-i||1,s=i-o*.05,c=a+o*.05;if(W.value)try{let e=n(W.value),r=JSON.parse(JSON.stringify(t));e.data.datasets[0]&&(e.data.datasets[0].data=r),e.options?.scales?.x&&(e.options.scales.x.min=Date.now()-A.value*3600*1e3,e.options.scales.x.max=Date.now(),e.options.scales.x.time=T(A.value)),e.options?.scales?.y?.ticks&&(e.options.scales.y.ticks.color=O().tickColor),e.options?.plugins?.legend?.labels&&(e.options.plugins.legend.labels.color=O().legendColor),e.update();return}catch{W.value.destroy(),W.value=null}W.value=v(new b(e,{type:`scatter`,data:{datasets:[{label:`Noise Floor (dBm)`,data:JSON.parse(JSON.stringify(t)),borderWidth:0,backgroundColor:k.noiseFloorFill,pointRadius:3,pointHoverRadius:5,pointStyle:`circle`}]},options:{responsive:!0,maintainAspectRatio:!1,animation:{duration:0},interaction:{mode:`index`,intersect:!1},plugins:{legend:{display:!0,position:`top`,labels:{color:O().legendColor,usePointStyle:!0,padding:20}},tooltip:{enabled:!0,backgroundColor:O().tooltipBg,titleColor:O().tooltipTitle,bodyColor:O().tooltipBody,borderColor:O().tooltipBorder,borderWidth:1,padding:12,displayColors:!0,callbacks:{title:function(e){let t=e[0]?.parsed?.x;return t==null?``:new Date(t).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})},label:function(e){let t=e.dataset?.label||``,n=e.parsed?.y;return n==null?t:`${t}: ${n.toFixed(1)} dBm`}}}},scales:{x:{type:`time`,time:T(A.value),min:Date.now()-A.value*3600*1e3,max:Date.now(),grid:{color:O().gridColor},ticks:{color:O().tickColor,maxTicksLimit:8}},y:{type:`linear`,display:!0,title:{display:!0,text:`Noise Floor (dBm)`,color:O().titleColor},grid:{color:k.noiseFloorGrid},ticks:{color:O().tickColor,callback:function(e){return typeof e==`number`?e.toFixed(1):e}},min:s,max:c}}}}))};return e(async()=>{await _(),X(),window.addEventListener(`resize`,()=>{setTimeout(()=>{n(U.value)?.resize(),n(W.value)?.resize()},100)})}),ee(()=>{U.value?.destroy(),W.value?.destroy(),window.removeEventListener(`resize`,()=>{})}),(e,n)=>(a(),g(`div`,ve,[h(`div`,ye,[n[8]||=h(`h2`,{class:`text-xl sm:text-2xl font-bold text-content-primary`},` Statistics `,-1),h(`div`,be,[n[7]||=h(`label`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Time Range:`,-1),i(h(`select`,{"onUpdate:modelValue":n[0]||=e=>A.value=e,onChange:Le,class:`modal-select w-auto`},[(a(),g(m,null,t(Ne,e=>h(`option`,{key:e.value,value:e.value,class:`bg-surface text-content-primary`},c(e.label),9,xe)),64))],544),[[te,A.value]])])]),h(`div`,Se,[f(S,{title:`Total RX`,value:q.value.totalRx,color:k.totalRx,data:Y.value.totalPackets,loading:R.value.sparklineMetrics,error:z.value,variant:`classic`,onRetry:n[1]||=()=>{R.value.sparklineMetrics=!0,R.value.packetRate=!0,z.value=null,Z()}},null,8,[`value`,`color`,`data`,`loading`,`error`]),f(S,{title:`Total TX`,value:q.value.totalTx,color:k.totalTx,data:Y.value.transmittedPackets,loading:R.value.sparklineMetrics,error:z.value,variant:`classic`,onRetry:n[2]||=()=>{R.value.sparklineMetrics=!0,R.value.packetRate=!0,z.value=null,Z()}},null,8,[`value`,`color`,`data`,`loading`,`error`]),f(S,{title:`CRC Errors`,value:F.value.reduce((e,t)=>e+t.count,0),color:k.crcErrors,data:Y.value.crcErrors,loading:R.value.sparklineCrc,error:H.value,variant:`classic`,onRetry:n[3]||=()=>{R.value.sparklineCrc=!0,H.value=null,Ie()}},null,8,[`value`,`color`,`data`,`loading`,`error`])]),h(`div`,Ce,[n[12]||=h(`h3`,{class:`text-content-primary text-lg sm:text-xl font-semibold mb-3 sm:mb-4`},` Performance Metrics `,-1),h(`div`,null,[n[11]||=h(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm uppercase tracking-wide mb-2`},` Packet Rate (RX/TX PER HOUR) `,-1),h(`div`,we,[h(`div`,Te,[h(`div`,{class:`w-3 h-3 rounded-full`,style:l({backgroundColor:k.rx})},null,4),n[9]||=h(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`RX/hr`,-1)]),h(`div`,Ee,[h(`div`,{class:`w-3 h-3 rounded-full`,style:l({backgroundColor:k.tx})},null,4),n[10]||=h(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`TX/hr`,-1)])]),f(x,{class:`h-40 sm:h-48 rounded-lg p-2 sm:p-4`,"is-loading":R.value.packetRate,error:z.value,status:E.packetRate,onRetry:n[4]||=()=>{R.value.packetRate=!0,z.value=null,Z()}},{default:r(()=>[h(`canvas`,{ref_key:`packetRateCanvasRef`,ref:G,class:`w-full h-full relative z-10`},null,512)]),_:1},8,[`is-loading`,`error`,`status`])])]),h(`div`,De,[h(`div`,Oe,[n[13]||=h(`h3`,{class:`text-content-primary text-lg sm:text-xl font-semibold mb-3 sm:mb-4`},` Noise Floor Over Time `,-1),f(x,{class:`flex-1 min-h-[12rem] sm:min-h-[16rem] rounded-lg`,"is-loading":R.value.noiseFloor,error:V.value,status:E.noiseFloor,onRetry:n[5]||=()=>{R.value.noiseFloor=!0,V.value=null,Fe()}},{default:r(()=>[h(`canvas`,{ref_key:`signalMetricsCanvasRef`,ref:K,class:`absolute inset-0 w-full h-full`},null,512)]),_:1},8,[`is-loading`,`error`,`status`])]),h(`div`,ke,[n[14]||=h(`h3`,{class:`text-content-primary text-lg sm:text-xl font-semibold mb-3 sm:mb-4`},` Route Distribution `,-1),f(x,{class:`flex-1 flex flex-col justify-evenly min-h-[8rem]`,"is-loading":R.value.routePie,error:B.value,status:E.routePie,onRetry:n[6]||=()=>{R.value.routePie=!0,B.value=null,Q()}},{default:r(()=>[N.value?.route_totals?(a(!0),g(m,{key:0},t(N.value.route_totals,(e,t,n)=>(a(),g(`div`,{key:t,class:`flex items-center gap-3`},[h(`div`,Ae,c(t),1),h(`div`,je,[h(`div`,{class:`h-full rounded transition-all duration-300`,style:l({width:`${e/Math.max(...Object.values(N.value.route_totals))*100}%`,backgroundColor:k.routes[n%k.routes.length]})},null,4)]),h(`div`,Me,c(e.toLocaleString()),1)]))),128)):d(``,!0)]),_:1},8,[`is-loading`,`error`,`status`])])])]))}});export{w as default}; \ No newline at end of file +import{C as e,D as t,K as n,N as r,P as i,T as a,U as o,V as s,_t as c,gt as l,h as u,l as d,m as f,o as p,r as m,s as h,u as g,x as ee,y as _,z as v}from"./runtime-core.esm-bundler-CINEgm0a.js";import{a as te}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as ne}from"./packets-CItQO6OO.js";import{_ as re,a as ie,c as ae,d as oe,f as se,g as ce,i as le,l as ue,m as de,n as y,o as fe,p as pe,r as me,s as b,t as x,u as he,v as ge,y as _e}from"./ChartCard-D5XCldya.js";import"./chartjs-adapter-date-fns.esm-kFk3lIdz.js";import{t as S}from"./Sparkline-CrqucW0n.js";var ve={class:`p-3 sm:p-6 space-y-4 sm:space-y-6`},ye={class:`flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3`},be={class:`flex items-center gap-2 sm:gap-3`},xe=[`value`],Se={class:`grid grid-cols-1 sm:grid-cols-3 gap-4`},Ce={class:`glass-card rounded-[15px] p-3 sm:p-6`},we={class:`flex items-center gap-3 sm:gap-6 mb-3 sm:mb-4`},Te={class:`flex items-center gap-2`},Ee={class:`flex items-center gap-2`},De={class:`grid grid-cols-1 lg:grid-cols-2 gap-4 sm:gap-6 items-stretch`},Oe={class:`glass-card rounded-[15px] p-3 sm:p-6 flex flex-col`},ke={class:`glass-card rounded-[15px] p-3 sm:p-6 flex flex-col`},Ae={class:`w-28 sm:w-32 text-sm text-content-primary truncate`},je={class:`flex-1 h-12 bg-background-mute dark:bg-stroke/opacity-subtle rounded overflow-hidden`},Me={class:`w-20 text-sm text-content-secondary dark:text-content-muted text-right tabular-nums`},C=20,w=u({name:`StatisticsView`,__name:`Statistics`,setup(u){b.register(fe,oe,se,he,ue,le,ae,pe,ge,_e,re,me,ie,ce,de);let w=ne(),T=e=>e>48?{unit:`day`,displayFormats:{day:`EEE MMM d`}}:e>24?{unit:`hour`,displayFormats:{hour:`EEE HH:mm`}}:{unit:`hour`,displayFormats:{hour:`HH:mm`}},E=s({packetRate:`Connecting...`,noiseFloor:`Connecting...`,routePie:`Connecting...`}),D=(e,t)=>typeof window>`u`?t:window.getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t,O=()=>({gridColor:D(`--color-border-subtle`,`lightgray`),tickColor:D(`--color-text-secondary`,`gray`),legendColor:D(`--color-text-primary`,`white`),titleColor:D(`--color-text-primary`,`white`),tooltipBg:D(`--color-surface-elevated`,`black`),tooltipTitle:D(`--color-heading`,`white`),tooltipBody:D(`--color-text-primary`,`white`),tooltipBorder:D(`--color-border-subtle`,`gray`)}),k={tx:D(`--color-accent-red`,`tomato`),rx:D(`--color-secondary`,`violet`),noiseFloor:D(`--color-primary`,`deepskyblue`),noiseFloorFill:D(`--color-primary`,`deepskyblue`),noiseFloorGrid:D(`--color-border-hover`,`gray`),totalRx:D(`--color-accent-cyan`,`cyan`),totalTx:D(`--color-accent-green`,`limegreen`),crcErrors:D(`--color-accent-red`,`tomato`),packetTypes:[D(`--openhop-blue-light`,`lightskyblue`),D(`--color-accent-green`,`limegreen`),D(`--color-primary-bg`,`khaki`),D(`--openhop-purple-light`,`violet`),D(`--color-accent-red`,`tomato`),D(`--color-accent-cyan`,`cyan`),D(`--color-accent-green-bg`,`lightgreen`),D(`--color-accent-purple`,`orchid`),D(`--color-accent-green`,`limegreen`)],routes:[D(`--color-primary`,`deepskyblue`),D(`--color-accent-green`,`limegreen`),D(`--color-accent-cyan`,`cyan`),D(`--color-secondary`,`violet`),D(`--color-accent-red`,`tomato`)]},A=o(24),Ne=[{value:1,label:`1 Hour`},{value:6,label:`6 Hours`},{value:12,label:`12 Hours`},{value:24,label:`24 Hours`},{value:48,label:`2 Days`},{value:168,label:`1 Week`}],j=o(null),M=o(null),N=o(null),P=o([]),F=o([]),I=o(!0),L=o(null),R=o({packetRate:!0,noiseFloor:!1,routePie:!0,sparklineMetrics:!0,sparklineCrc:!0}),z=o(null),B=o(null),V=o(null),H=o(null),U=o(null),W=o(null),G=o(null),K=o(null),q=o({totalRx:0,totalTx:0}),J=(e,t)=>{if(e.length===0)return[];let n=Math.round(t*60*60*1e3/72),r=new Map;return e.forEach(([e,t])=>{let i=e;e>0x38d7ea4c68000?i=e/1e3:e>1e9&&e<0xe8d4a51000&&(i=e*1e3);let a=Math.floor(i/n)*n;r.has(a)||r.set(a,[]),r.get(a).push(t)}),Array.from(r.entries()).sort((e,t)=>e[0]-t[0]).map(([,e])=>e.reduce((e,t)=>e+t,0)/e.length)},Y=p(()=>{let e=[],t=[];if(j.value?.series){let n=j.value.series.find(e=>e.type===`rx_count`),r=j.value.series.find(e=>e.type===`tx_count`);n?.data&&(e=J(n.data.map(([e,t])=>[e,t>C?0:t]),A.value)),r?.data&&(t=J(r.data.map(([e,t])=>[e,t>C?0:t]),A.value))}return{totalPackets:e,transmittedPackets:t,droppedPackets:[],crcErrors:J(F.value.map(e=>[e.timestamp>0xe8d4a51000?e.timestamp:e.timestamp*1e3,e.count]),A.value)}}),X=async()=>{try{I.value=!0,L.value=null;let e=await y(`/packet_stats`,{hours:A.value});q.value={totalRx:e.data?.total_packets||0,totalTx:e.data?.transmitted_packets||0},I.value=!1}catch(e){L.value=e instanceof Error?e.message:`Failed to fetch data`,I.value=!1}Pe()},Pe=async()=>{R.value={packetRate:!0,noiseFloor:!0,routePie:!0,sparklineMetrics:!0,sparklineCrc:!0},w.metricsGraphData&&(j.value=w.metricsGraphData),w.crcErrorHistory.length>0&&(F.value=[...w.crcErrorHistory]),w.noiseFloorHistory.length>0&&(M.value={chart_data:w.noiseFloorHistory.map(e=>({timestamp:e.timestamp,noise_floor_dbm:e.noise_floor_dbm}))},$()),Z(),Q(),Fe(),Ie()},Z=async()=>{E.packetRate=`Connecting...`,z.value=null;try{let e=await y(`/metrics_graph_data`,{hours:A.value,resolution:`average`,metrics:`rx_count,tx_count`},{onPhaseChange:e=>{E.packetRate=e===`receiving`?`Receiving data...`:`Connecting...`}});e?.success&&(j.value=e.data)}catch(e){z.value=e instanceof Error?e.message:`Failed to load`,j.value=null}finally{R.value.packetRate=!1,R.value.sparklineMetrics=!1,z.value||(await _(),ze())}},Q=async()=>{E.routePie=`Connecting...`,B.value=null;try{let e=await y(`/route_stats`,{hours:A.value},{onPhaseChange:e=>{E.routePie=e===`receiving`?`Receiving data...`:`Connecting...`}});e?.success&&e.data&&(N.value=e.data)}catch(e){N.value=null,B.value=e instanceof Error?e.message:`Failed to load`}finally{R.value.routePie=!1}},Fe=async()=>{E.noiseFloor=`Connecting...`,V.value=null;try{let e=A.value*120,t=await y(`/noise_floor_history`,{hours:A.value,limit:e},{idleTimeoutMs:3e4,onPhaseChange:e=>{E.noiseFloor=e===`receiving`?`Receiving data...`:`Connecting...`}});if(t.success&&t.data){let e=t.data.history||[];if(Array.isArray(e)&&e.length>0){let t=e;if(e.length>1500){let n=Math.ceil(e.length/1500);t=e.filter((e,t)=>t%n===0)}M.value={chart_data:t.map(e=>({timestamp:e.timestamp||Date.now()/1e3,noise_floor_dbm:e.noise_floor_dbm||e.noise_floor||-120}))},$()}}}catch(e){M.value={chart_data:[]},V.value=e instanceof Error?e.message:`Failed to load`}finally{R.value.noiseFloor=!1,V.value||(await _(),Be())}},Ie=async()=>{H.value=null;try{let e=await y(`/crc_error_history`,{hours:A.value});e?.success&&e.data&&(F.value=e.data.history||[])}catch(e){F.value=[],H.value=e instanceof Error?e.message:`Failed to load`}finally{R.value.sparklineCrc=!1}},Le=()=>{R.value={packetRate:!0,noiseFloor:!0,routePie:!0,sparklineMetrics:!0,sparklineCrc:!0},Re(),z.value=null,B.value=null,V.value=null,X()},$=()=>{P.value=[],M.value?.chart_data&&M.value.chart_data.length>0&&(P.value=M.value.chart_data.map(e=>({timestamp:e.timestamp*1e3,snr:null,rssi:null,noiseFloor:e.noise_floor_dbm})))},Re=()=>{try{U.value&&=(U.value.destroy(),null),W.value&&=(W.value.destroy(),null)}catch(e){console.error(`Error destroying charts:`,e)}},ze=()=>{if(!G.value)return;let e=G.value.getContext(`2d`);if(!e)return;let t=[],n=[];if(j.value?.series){let e=j.value.series.find(e=>e.type===`rx_count`),r=j.value.series.find(e=>e.type===`tx_count`);e?.data&&(t=e.data.map(([e,t])=>{let n=e;return n=e>0x38d7ea4c68000?e/1e3:e>0xe8d4a51000?e:e>1e9?e*1e3:Date.now(),{x:n,y:t>C?0:t*3600}})),r?.data&&(n=r.data.map(([e,t])=>{let n=e;return n=e>0x38d7ea4c68000?e/1e3:e>0xe8d4a51000?e:e>1e9?e*1e3:Date.now(),{x:n,y:t>C?0:t*3600}}))}if(t.length===0&&n.length===0){z.value=`No data available for the selected time range`;return}z.value=null,U.value&&=(U.value.destroy(),null);let r=Math.round(A.value*60*60*1e3/72),i=e=>{if(e.length===0)return[];let t=new Map;return e.forEach(e=>{let n=Math.floor(e.x/r)*r;t.has(n)||t.set(n,[]),t.get(n).push(e.y)}),Array.from(t.entries()).map(([e,t])=>({x:e,y:t.reduce((e,t)=>e+t,0)/t.length})).sort((e,t)=>e.x-t.x)},a=(e,t=3)=>{if(e.lengthe+t.y,0)/o.length;n.push({x:e[r].x,y:s})}return n},o=a(i(t)),s=a(i(n)),c=[...o.map(e=>e.y),...s.map(e=>e.y)],l=Math.min(...c),u=Math.max(...c),d=u-l||u*.1||.001,f=Math.max(0,l-d*.05),p=u+d*.05;try{let t=JSON.parse(JSON.stringify(o));U.value=v(new b(e,{type:`line`,data:{datasets:[{label:`TX/hr`,data:JSON.parse(JSON.stringify(s)),borderColor:k.tx,backgroundColor:k.tx,borderWidth:2,fill:`origin`,tension:.4,pointRadius:0,pointHoverRadius:3,order:1},{label:`RX/hr`,data:t,borderColor:k.rx,backgroundColor:k.rx,borderWidth:2,fill:`origin`,tension:.4,pointRadius:0,pointHoverRadius:3,order:2}]},options:{responsive:!0,maintainAspectRatio:!1,animation:{duration:0},interaction:{mode:`index`,intersect:!1},plugins:{legend:{display:!1},title:{display:!1},tooltip:{enabled:!0,backgroundColor:O().tooltipBg,titleColor:O().tooltipTitle,bodyColor:O().tooltipBody,borderColor:O().tooltipBorder,borderWidth:1,padding:12,displayColors:!0,callbacks:{title:function(e){let t=e[0]?.parsed?.x;return t==null?``:new Date(t).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})},label:function(e){let t=e.dataset?.label||``,n=e.parsed?.y;return n==null?t:`${t}: ${n.toFixed(1)}`}}}},scales:{x:{type:`time`,time:T(A.value),min:Date.now()-A.value*3600*1e3,max:Date.now(),grid:{color:O().gridColor},ticks:{color:O().tickColor,maxTicksLimit:8}},y:{beginAtZero:!1,title:{display:!0,text:`Packets / Hour`,color:O().tickColor},grid:{color:O().gridColor},ticks:{color:O().tickColor,callback:function(e){return typeof e==`number`?e.toFixed(1):e}},min:f,max:p}}}}))}catch(e){console.error(`Error creating packet rate chart:`,e),z.value=`Failed to render chart`}},Be=()=>{if(!K.value)return;let e=K.value.getContext(`2d`);if(!e)return;let t=P.value.map(e=>({x:e.timestamp,y:e.noiseFloor})).filter(e=>e.y!==null&&e.y!==void 0),r=t.map(e=>e.y),i=r.length>0?Math.min(...r):-120,a=r.length>0?Math.max(...r):-110,o=a-i||1,s=i-o*.05,c=a+o*.05;if(W.value)try{let e=n(W.value),r=JSON.parse(JSON.stringify(t));e.data.datasets[0]&&(e.data.datasets[0].data=r),e.options?.scales?.x&&(e.options.scales.x.min=Date.now()-A.value*3600*1e3,e.options.scales.x.max=Date.now(),e.options.scales.x.time=T(A.value)),e.options?.scales?.y?.ticks&&(e.options.scales.y.ticks.color=O().tickColor),e.options?.plugins?.legend?.labels&&(e.options.plugins.legend.labels.color=O().legendColor),e.update();return}catch{W.value.destroy(),W.value=null}W.value=v(new b(e,{type:`scatter`,data:{datasets:[{label:`Noise Floor (dBm)`,data:JSON.parse(JSON.stringify(t)),borderWidth:0,backgroundColor:k.noiseFloorFill,pointRadius:3,pointHoverRadius:5,pointStyle:`circle`}]},options:{responsive:!0,maintainAspectRatio:!1,animation:{duration:0},interaction:{mode:`index`,intersect:!1},plugins:{legend:{display:!0,position:`top`,labels:{color:O().legendColor,usePointStyle:!0,padding:20}},tooltip:{enabled:!0,backgroundColor:O().tooltipBg,titleColor:O().tooltipTitle,bodyColor:O().tooltipBody,borderColor:O().tooltipBorder,borderWidth:1,padding:12,displayColors:!0,callbacks:{title:function(e){let t=e[0]?.parsed?.x;return t==null?``:new Date(t).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})},label:function(e){let t=e.dataset?.label||``,n=e.parsed?.y;return n==null?t:`${t}: ${n.toFixed(1)} dBm`}}}},scales:{x:{type:`time`,time:T(A.value),min:Date.now()-A.value*3600*1e3,max:Date.now(),grid:{color:O().gridColor},ticks:{color:O().tickColor,maxTicksLimit:8}},y:{type:`linear`,display:!0,title:{display:!0,text:`Noise Floor (dBm)`,color:O().titleColor},grid:{color:k.noiseFloorGrid},ticks:{color:O().tickColor,callback:function(e){return typeof e==`number`?e.toFixed(1):e}},min:s,max:c}}}}))};return e(async()=>{await _(),X(),window.addEventListener(`resize`,()=>{setTimeout(()=>{n(U.value)?.resize(),n(W.value)?.resize()},100)})}),ee(()=>{U.value?.destroy(),W.value?.destroy(),window.removeEventListener(`resize`,()=>{})}),(e,n)=>(a(),g(`div`,ve,[h(`div`,ye,[n[8]||=h(`h2`,{class:`text-xl sm:text-2xl font-bold text-content-primary`},` Statistics `,-1),h(`div`,be,[n[7]||=h(`label`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},`Time Range:`,-1),i(h(`select`,{"onUpdate:modelValue":n[0]||=e=>A.value=e,onChange:Le,class:`modal-select w-auto`},[(a(),g(m,null,t(Ne,e=>h(`option`,{key:e.value,value:e.value,class:`bg-surface text-content-primary`},c(e.label),9,xe)),64))],544),[[te,A.value]])])]),h(`div`,Se,[f(S,{title:`Total RX`,value:q.value.totalRx,color:k.totalRx,data:Y.value.totalPackets,loading:R.value.sparklineMetrics,error:z.value,variant:`classic`,onRetry:n[1]||=()=>{R.value.sparklineMetrics=!0,R.value.packetRate=!0,z.value=null,Z()}},null,8,[`value`,`color`,`data`,`loading`,`error`]),f(S,{title:`Total TX`,value:q.value.totalTx,color:k.totalTx,data:Y.value.transmittedPackets,loading:R.value.sparklineMetrics,error:z.value,variant:`classic`,onRetry:n[2]||=()=>{R.value.sparklineMetrics=!0,R.value.packetRate=!0,z.value=null,Z()}},null,8,[`value`,`color`,`data`,`loading`,`error`]),f(S,{title:`CRC Errors`,value:F.value.reduce((e,t)=>e+t.count,0),color:k.crcErrors,data:Y.value.crcErrors,loading:R.value.sparklineCrc,error:H.value,variant:`classic`,onRetry:n[3]||=()=>{R.value.sparklineCrc=!0,H.value=null,Ie()}},null,8,[`value`,`color`,`data`,`loading`,`error`])]),h(`div`,Ce,[n[12]||=h(`h3`,{class:`text-content-primary text-lg sm:text-xl font-semibold mb-3 sm:mb-4`},` Performance Metrics `,-1),h(`div`,null,[n[11]||=h(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm uppercase tracking-wide mb-2`},` Packet Rate (RX/TX PER HOUR) `,-1),h(`div`,we,[h(`div`,Te,[h(`div`,{class:`w-3 h-3 rounded-full`,style:l({backgroundColor:k.rx})},null,4),n[9]||=h(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`RX/hr`,-1)]),h(`div`,Ee,[h(`div`,{class:`w-3 h-3 rounded-full`,style:l({backgroundColor:k.tx})},null,4),n[10]||=h(`span`,{class:`text-content-secondary dark:text-content-muted text-sm`},`TX/hr`,-1)])]),f(x,{class:`h-40 sm:h-48 rounded-lg p-2 sm:p-4`,"is-loading":R.value.packetRate,error:z.value,status:E.packetRate,onRetry:n[4]||=()=>{R.value.packetRate=!0,z.value=null,Z()}},{default:r(()=>[h(`canvas`,{ref_key:`packetRateCanvasRef`,ref:G,class:`w-full h-full relative z-10`},null,512)]),_:1},8,[`is-loading`,`error`,`status`])])]),h(`div`,De,[h(`div`,Oe,[n[13]||=h(`h3`,{class:`text-content-primary text-lg sm:text-xl font-semibold mb-3 sm:mb-4`},` Noise Floor Over Time `,-1),f(x,{class:`flex-1 min-h-[12rem] sm:min-h-[16rem] rounded-lg`,"is-loading":R.value.noiseFloor,error:V.value,status:E.noiseFloor,onRetry:n[5]||=()=>{R.value.noiseFloor=!0,V.value=null,Fe()}},{default:r(()=>[h(`canvas`,{ref_key:`signalMetricsCanvasRef`,ref:K,class:`absolute inset-0 w-full h-full`},null,512)]),_:1},8,[`is-loading`,`error`,`status`])]),h(`div`,ke,[n[14]||=h(`h3`,{class:`text-content-primary text-lg sm:text-xl font-semibold mb-3 sm:mb-4`},` Route Distribution `,-1),f(x,{class:`flex-1 flex flex-col justify-evenly min-h-[8rem]`,"is-loading":R.value.routePie,error:B.value,status:E.routePie,onRetry:n[6]||=()=>{R.value.routePie=!0,B.value=null,Q()}},{default:r(()=>[N.value?.route_totals?(a(!0),g(m,{key:0},t(N.value.route_totals,(e,t,n)=>(a(),g(`div`,{key:t,class:`flex items-center gap-3`},[h(`div`,Ae,c(t),1),h(`div`,je,[h(`div`,{class:`h-full rounded transition-all duration-300`,style:l({width:`${e/Math.max(...Object.values(N.value.route_totals))*100}%`,backgroundColor:k.routes[n%k.routes.length]})},null,4)]),h(`div`,Me,c(e.toLocaleString()),1)]))),128)):d(``,!0)]),_:1},8,[`is-loading`,`error`,`status`])])])]))}});export{w as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/SystemStats-B9UYM5oW.js b/repeater/web/html/assets/SystemStats-CPdf4wwy.js similarity index 97% rename from repeater/web/html/assets/SystemStats-B9UYM5oW.js rename to repeater/web/html/assets/SystemStats-CPdf4wwy.js index c843c11..54fddea 100644 --- a/repeater/web/html/assets/SystemStats-B9UYM5oW.js +++ b/repeater/web/html/assets/SystemStats-CPdf4wwy.js @@ -1,2 +1,2 @@ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/plotly.min-BmxIBpZZ.js","assets/chunk-DECur_0Z.js"])))=>i.map(i=>d[i]); -import{r as e}from"./chunk-DECur_0Z.js";import{C as t,D as n,K as r,N as i,T as a,U as o,X as s,_t as c,h as ee,ht as l,j as te,l as u,m as d,o as f,r as p,s as m,u as h,x as ne,y as g,z as _}from"./runtime-core.esm-bundler-CINEgm0a.js";import{o as v}from"./api-CP9MgmUS.js";import{t as re}from"./useTheme-vbCn9P26.js";import{d as y,t as ie}from"./index-Cl4Dij8v.js";import{t as b}from"./formatters-DVmMQB0F.js";import{_ as ae,a as oe,c as se,d as ce,f as le,g as ue,i as de,l as fe,m as pe,n as x,o as me,r as he,s as S,t as C,u as ge,v as _e,y as ve}from"./ChartCard-DSqBTrdz.js";import"./chartjs-adapter-date-fns.esm-DfIbzYql.js";import{t as w}from"./Sparkline-DrzfaDAP.js";var ye={class:`p-6 space-y-6`},be={class:`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4`},xe={class:`grid grid-cols-1 lg:grid-cols-2 gap-6`},Se={class:`glass-card rounded-[15px] p-6`},Ce={key:0,class:`grid grid-cols-2 gap-4 text-sm`},we={class:`text-content-primary font-semibold`},Te={class:`text-content-primary font-semibold`},Ee={class:`text-content-primary font-semibold`},T={class:`text-content-primary font-semibold`},E={class:`glass-card rounded-[15px] p-6`},D={key:0,class:`grid grid-cols-2 gap-4 text-sm`},De={class:`text-content-primary font-semibold`},Oe={class:`text-content-primary font-semibold`},ke={class:`text-content-primary font-semibold`},Ae={class:`text-content-primary font-semibold`},je={class:`grid grid-cols-1 lg:grid-cols-2 gap-6`},Me={class:`glass-card rounded-[15px] p-6`},Ne={class:`relative h-48`},Pe={key:0,class:`grid grid-cols-3 gap-4 text-sm mt-4`},Fe={class:`text-center`},Ie={class:`text-content-primary font-semibold`},Le={class:`text-center`},Re={class:`font-semibold text-accent-red`},ze={class:`text-center`},Be={class:`font-semibold text-accent-green`},Ve={class:`glass-card rounded-[15px] p-6`},He={key:0,class:`space-y-4`},Ue={class:`grid grid-cols-2 gap-4 text-sm`},We={class:`text-content-primary font-semibold`},Ge={class:`text-content-primary font-semibold`},Ke={class:`text-content-primary font-semibold`},qe={class:`text-content-primary font-semibold`},O={key:0,class:`pt-4 border-t border-stroke-subtle dark:border-stroke/opacity-light`},Je={class:`grid grid-cols-2 gap-2 text-sm`},Ye={class:`text-content-secondary dark:text-content-muted`},Xe={class:`text-content-primary font-semibold ml-1`},Ze={class:`glass-card rounded-[15px] p-6`},Qe={key:0,class:`overflow-x-auto`},$e={class:`w-full text-sm`},et={class:`text-content-secondary dark:text-content-primary/opacity-heavy py-2 transition-all duration-300`},tt={class:`text-content-primary font-semibold py-2 transition-all duration-300`},nt={class:`text-center text-secondary py-2 transition-all duration-300`},rt={class:`text-center text-accent-green py-2 transition-all duration-300`},it={class:`text-right text-content-secondary dark:text-content-primary/opacity-heavy py-2 transition-all duration-300`},at={key:0,class:`mt-4 text-center text-content-secondary dark:text-content-muted text-sm transition-all duration-300`},ot={key:1,class:`text-center text-content-secondary dark:text-content-muted py-8`},k=y(ee({name:`SystemStatsView`,__name:`SystemStats`,setup(ee){S.register(me,ce,le,ge,fe,de,se,_e,ve,ae,he,oe,ue,pe);let{theme:y}=re(),k=(e,t)=>typeof window>`u`?t:window.getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t,A=()=>({labelColor:k(`--color-text-muted`,`gray`),textColor:k(`--color-text-secondary`,`gainsboro`)}),j={cpu:`var(--color-accent-cyan)`,memory:`var(--color-accent-green)`,disk:`var(--color-accent-red)`,free:`var(--color-accent-green)`,uptime:`var(--color-accent-purple)`},M=o(null),N=o(null),P=o([]),F=o(null),I=o({cpuChart:!0,memoryChart:!0,diskChart:!1,processChart:!0}),L=o(null),R=o(null),z=o(`Connecting...`),B=o(`Connecting...`),V=o(null),H=o(null),U=o(null),W=o(null),G=o(null),K=f(()=>M.value?{cpuUsage:M.value.cpu.usage_percent,memoryUsage:M.value.memory.usage_percent,diskUsage:M.value.disk.usage_percent,uptime:M.value.system.uptime}:{cpuUsage:0,memoryUsage:0,diskUsage:0,uptime:0}),q=f(()=>P.value.length===0?{cpu:[],memory:[],disk:[],network:[]}:{cpu:P.value.map(e=>e.cpu.usage_percent),memory:P.value.map(e=>e.memory.usage_percent),disk:P.value.map(e=>e.disk.usage_percent),network:P.value.map(e=>e.network.bytes_recv/1024/1024)}),J=f(()=>{let e=P.value.length;if(e<2)return``;let t=e*5;return t<120?`last ${t}s`:`last ${Math.round(t/60)}m`}),st=e=>{let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}d ${n}h ${r}m`:n>0?`${n}h ${r}m`:`${r}m`},Y=async()=>{z.value=`Connecting...`,B.value=`Connecting...`;try{let e=await x(`/hardware_stats`,void 0,{onPhaseChange:e=>{let t=e===`receiving`?`Receiving data...`:`Connecting...`;z.value=t,B.value=t}});if(e?.success&&e.data){let t=e.data;M.value=t,P.value.push(t),P.value.length>20&&P.value.shift(),L.value=null,R.value=null,await g(),Z()}else L.value=`No data in server response`,R.value=`No data in server response`}catch(e){let t=e instanceof Error?e.message:`Failed to load data`;L.value=t,R.value=t}finally{I.value.cpuChart=!1,I.value.memoryChart=!1}},ct=async()=>{try{let e=await x(`/hardware_processes`);e?.success&&e.data&&(F.value=N.value,N.value=e.data)}catch(e){console.error(`Failed to fetch process stats:`,e)}finally{I.value.processChart=!1}},X=(e,t)=>{if(!F.value)return!1;let n=F.value.processes.find(t=>t.pid===e.pid);return n?n[t]!==e[t]:!0},lt=()=>{Y(),ct()},Z=()=>{M.value&&(ut(),dt(),ft())},ut=()=>{if(!U.value||!M.value){I.value.cpuChart=!1;return}let e=U.value.getContext(`2d`);if(!e){I.value.cpuChart=!1;return}let t=M.value.cpu.usage_percent,n=100-t;if(V.value)try{V.value.data.datasets[0].data=[t,n],V.value.update(`none`);return}catch(e){console.warn(`Failed to update CPU chart, recreating...`,e),V.value.destroy(),V.value=null}let r=k(`--color-accent-cyan`,`deepskyblue`),i=A(),a=k(`--color-background-mute`,`lightgray`),o=k(`--color-border`,`gray`);try{V.value=_(new S(e,{type:`doughnut`,data:{labels:[`Used`,`Available`],datasets:[{data:[t,n],backgroundColor:[r,a],borderColor:[r,o],borderWidth:2}]},options:{responsive:!0,maintainAspectRatio:!1,cutout:`70%`,animation:{animateRotate:!1,animateScale:!1,duration:0},plugins:{legend:{display:!1},tooltip:{callbacks:{label:function(e){return`${e.label}: ${e.parsed.toFixed(1)}%`}}}}},plugins:[{id:`centerText`,beforeDraw:function(e){let t=e.ctx;t.save();let n=e.data.datasets[0].data[0],a=(e.chartArea.left+e.chartArea.right)/2,o=(e.chartArea.top+e.chartArea.bottom)/2;t.textAlign=`center`,t.textBaseline=`middle`,t.fillStyle=r,t.font=`bold 18px sans-serif`,t.fillText(`${n.toFixed(1)}%`,a,o-5),t.fillStyle=i.labelColor,t.font=`10px sans-serif`,t.fillText(`CPU`,a,o+12),t.restore()}}]})),L.value=null,I.value.cpuChart=!1}catch(e){console.error(`Error creating CPU chart:`,e),L.value=`Failed to create CPU chart`,I.value.cpuChart=!1}},dt=()=>{if(!W.value||!M.value){I.value.memoryChart=!1;return}let e=W.value.getContext(`2d`);if(!e){I.value.memoryChart=!1;return}let t=M.value.memory.usage_percent,n=100-t;if(H.value)try{H.value.data.datasets[0].data=[t,n],H.value.update(`none`);return}catch(e){console.warn(`Failed to update Memory chart, recreating...`,e),H.value.destroy(),H.value=null}let r=k(`--color-accent-green`,`limegreen`),i=A(),a=k(`--color-background-mute`,`lightgray`),o=k(`--color-border`,`gray`);try{H.value=_(new S(e,{type:`doughnut`,data:{labels:[`Used`,`Available`],datasets:[{data:[t,n],backgroundColor:[r,a],borderColor:[r,o],borderWidth:2}]},options:{responsive:!0,maintainAspectRatio:!1,cutout:`70%`,animation:{animateRotate:!1,animateScale:!1,duration:0},plugins:{legend:{display:!1},tooltip:{callbacks:{label:function(e){return`${e.label}: ${e.parsed.toFixed(1)}%`}}}}},plugins:[{id:`centerText`,beforeDraw:function(e){let t=e.ctx;t.save();let n=e.data.datasets[0].data[0],a=(e.chartArea.left+e.chartArea.right)/2,o=(e.chartArea.top+e.chartArea.bottom)/2;t.textAlign=`center`,t.textBaseline=`middle`,t.fillStyle=r,t.font=`bold 18px sans-serif`,t.fillText(`${n.toFixed(1)}%`,a,o-5),t.fillStyle=i.labelColor,t.font=`10px sans-serif`,t.fillText(`Memory`,a,o+12),t.restore()}}]})),R.value=null,I.value.memoryChart=!1}catch(e){console.error(`Error creating Memory chart:`,e),R.value=`Failed to create Memory chart`,I.value.memoryChart=!1}},ft=()=>{if(!G.value||!M.value)return;let t=A().textColor;try{v(()=>import(`./plotly.min-BmxIBpZZ.js`).then(t=>e(t.t(),1)).then(e=>{let n=e.default||e,r=M.value.disk,i=[{type:`pie`,labels:[`Used`,`Free`],values:[r.used,r.free],marker:{colors:[k(`--color-accent-red`,`tomato`),k(`--color-accent-green`,`limegreen`)]},hovertemplate:`%{label}
Size: %{value}
Percentage: %{percent}`,textinfo:`label+percent`,textposition:`auto`,hole:.4}],a={title:{text:``,font:{color:t}},paper_bgcolor:`transparent`,plot_bgcolor:`transparent`,font:{color:t,size:11},margin:{t:20,b:20,l:20,r:20},showlegend:!0,legend:{orientation:`h`,x:0,y:-.2,font:{color:t,size:10}}};n.newPlot(G.value,i,a,{responsive:!0,displayModeBar:!1,staticPlot:!1})}),__vite__mapDeps([0,1]))}catch(e){console.error(`Error creating disk chart:`,e)}},Q=()=>{try{if(V.value&&=(V.value.destroy(),null),H.value&&=(H.value.destroy(),null),G.value)try{v(()=>import(`./plotly.min-BmxIBpZZ.js`).then(t=>e(t.t(),1)).then(e=>{let t=e?.default||e;t?.purge&&t.purge(G.value)}),__vite__mapDeps([0,1])).catch(()=>{})}catch{}}catch(e){console.error(`Error destroying charts:`,e)}};te(y,()=>{Q(),g(()=>Z())});let $=()=>{setTimeout(()=>{r(V.value)?.resize(),r(H.value)?.resize();try{v(()=>import(`./plotly.min-BmxIBpZZ.js`).then(t=>e(t.t(),1)).then(e=>{let t=e?.default||e;t?.Plots&&t.Plots.resize(G.value)}),__vite__mapDeps([0,1])).catch(()=>{})}catch{}},100)};return ie(lt,{intervalMs:5e3,immediate:!0}),t(async()=>{await g(),window.addEventListener(`resize`,$)}),ne(()=>{window.removeEventListener(`resize`,$),Q()}),(e,t)=>(a(),h(`div`,ye,[t[22]||=m(`div`,{class:`flex justify-between items-center`},[m(`h2`,{class:`text-2xl font-bold text-content-primary`},` System Statistics `),m(`div`,{class:`text-content-secondary dark:text-content-muted text-sm`},` Updates every 5 seconds `)],-1),m(`div`,be,[d(w,{title:`CPU Usage`,value:`${K.value.cpuUsage.toFixed(1)}%`,color:j.cpu,data:q.value.cpu,"min-y":0,"max-y":100,subtitle:J.value},null,8,[`value`,`color`,`data`,`subtitle`]),d(w,{title:`Memory Usage`,value:`${K.value.memoryUsage.toFixed(1)}%`,color:j.memory,data:q.value.memory,"min-y":0,"max-y":100,subtitle:J.value},null,8,[`value`,`color`,`data`,`subtitle`]),d(w,{title:`Disk Usage`,value:`${K.value.diskUsage.toFixed(1)}%`,color:j.disk,data:q.value.disk,"min-y":0,"max-y":100,subtitle:J.value},null,8,[`value`,`color`,`data`,`subtitle`]),d(w,{title:`Uptime`,value:st(K.value.uptime),color:j.uptime,data:[],"show-chart":!1},null,8,[`value`,`color`])]),m(`div`,xe,[m(`div`,Se,[t[4]||=m(`h3`,{class:`text-content-primary text-xl font-semibold mb-4`},` CPU Performance `,-1),d(C,{class:`h-32 mb-4`,"is-loading":I.value.cpuChart,error:L.value,status:z.value,onRetry:Y},{default:i(()=>[m(`canvas`,{ref_key:`cpuCanvasRef`,ref:U,class:`w-full h-full`},null,512)]),_:1},8,[`is-loading`,`error`,`status`]),M.value?(a(),h(`div`,Ce,[m(`div`,null,[t[0]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`CPU Count`,-1),m(`div`,we,c(M.value.cpu.count)+` cores `,1)]),m(`div`,null,[t[1]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Frequency`,-1),m(`div`,Te,c(M.value.cpu.frequency.toFixed(0))+` MHz `,1)]),m(`div`,null,[t[2]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Load (1m)`,-1),m(`div`,Ee,c(M.value.cpu.load_avg[`1min`].toFixed(2)),1)]),m(`div`,null,[t[3]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Load (5m)`,-1),m(`div`,T,c(M.value.cpu.load_avg[`5min`].toFixed(2)),1)])])):u(``,!0)]),m(`div`,E,[t[9]||=m(`h3`,{class:`text-content-primary text-xl font-semibold mb-4`},` Memory Usage `,-1),d(C,{class:`h-32 mb-4`,"is-loading":I.value.memoryChart,error:R.value,status:B.value,onRetry:Y},{default:i(()=>[m(`canvas`,{ref_key:`memoryCanvasRef`,ref:W,class:`w-full h-full`},null,512)]),_:1},8,[`is-loading`,`error`,`status`]),M.value?(a(),h(`div`,D,[m(`div`,null,[t[5]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Total`,-1),m(`div`,De,c(s(b)(M.value.memory.total)),1)]),m(`div`,null,[t[6]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Used`,-1),m(`div`,Oe,c(s(b)(M.value.memory.used)),1)]),m(`div`,null,[t[7]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Available`,-1),m(`div`,ke,c(s(b)(M.value.memory.available)),1)]),m(`div`,null,[t[8]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Usage`,-1),m(`div`,Ae,c(M.value.memory.usage_percent.toFixed(1))+`% `,1)])])):u(``,!0)])]),m(`div`,je,[m(`div`,Me,[t[13]||=m(`h3`,{class:`text-content-primary text-xl font-semibold mb-4`},` Storage Usage `,-1),m(`div`,Ne,[m(`div`,{ref_key:`diskCanvasRef`,ref:G,class:`w-full h-full`},null,512)]),M.value?(a(),h(`div`,Pe,[m(`div`,Fe,[t[10]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Total`,-1),m(`div`,Ie,c(s(b)(M.value.disk.total)),1)]),m(`div`,Le,[t[11]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Used`,-1),m(`div`,Re,c(s(b)(M.value.disk.used)),1)]),m(`div`,ze,[t[12]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Free`,-1),m(`div`,Be,c(s(b)(M.value.disk.free)),1)])])):u(``,!0)]),m(`div`,Ve,[t[19]||=m(`h3`,{class:`text-content-primary text-xl font-semibold mb-4`},` Network Statistics `,-1),M.value?(a(),h(`div`,He,[m(`div`,Ue,[m(`div`,null,[t[14]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Bytes Sent`,-1),m(`div`,We,c(s(b)(M.value.network.bytes_sent)),1)]),m(`div`,null,[t[15]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Bytes Received`,-1),m(`div`,Ge,c(s(b)(M.value.network.bytes_recv)),1)]),m(`div`,null,[t[16]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Packets Sent`,-1),m(`div`,Ke,c(M.value.network.packets_sent.toLocaleString()),1)]),m(`div`,null,[t[17]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Packets Received`,-1),m(`div`,qe,c(M.value.network.packets_recv.toLocaleString()),1)])]),M.value.temperatures&&Object.keys(M.value.temperatures).length>0?(a(),h(`div`,O,[t[18]||=m(`div`,{class:`text-content-secondary dark:text-content-muted mb-2`},` System Temperatures `,-1),m(`div`,Je,[(a(!0),h(p,null,n(M.value.temperatures,(e,t)=>(a(),h(`div`,{key:t},[m(`span`,Ye,c(t)+`:`,1),m(`span`,Xe,c(e.toFixed(1))+`°C`,1)]))),128))])])):u(``,!0)])):u(``,!0)])]),m(`div`,Ze,[t[21]||=m(`h3`,{class:`text-content-primary text-xl font-semibold mb-4`},` Top Processes `,-1),N.value?.processes&&N.value.processes.length>0?(a(),h(`div`,Qe,[m(`table`,$e,[t[20]||=m(`thead`,null,[m(`tr`,{class:`border-b border-stroke-subtle dark:border-stroke/opacity-light`},[m(`th`,{class:`text-left text-content-secondary dark:text-content-muted py-2`},`PID`),m(`th`,{class:`text-left text-content-secondary dark:text-content-muted py-2`},`Name`),m(`th`,{class:`text-center text-content-secondary dark:text-content-muted py-2`},`CPU %`),m(`th`,{class:`text-center text-content-secondary dark:text-content-muted py-2`},` Memory % `),m(`th`,{class:`text-right text-content-secondary dark:text-content-muted py-2`},`Memory`)])],-1),m(`tbody`,null,[(a(!0),h(p,null,n(N.value.processes.slice(0,10),e=>(a(),h(`tr`,{key:e.pid,class:`border-b border-stroke-subtle dark:border-white/opacity-light process-row`},[m(`td`,et,c(e.pid),1),m(`td`,tt,c(e.name),1),m(`td`,nt,[m(`span`,{class:l([`cpu-value`,{"value-updated":X(e,`cpu_percent`)}])},c(e.cpu_percent.toFixed(1))+`% `,3)]),m(`td`,rt,[m(`span`,{class:l([`memory-value`,{"value-updated":X(e,`memory_percent`)}])},c(e.memory_percent.toFixed(1))+`% `,3)]),m(`td`,it,[m(`span`,{class:l({"value-updated":X(e,`memory_mb`)})},c(e.memory_mb.toFixed(1))+` MB `,3)])]))),128))])]),N.value.total_processes?(a(),h(`div`,at,` Showing top 10 of `+c(N.value.total_processes)+` total processes `,1)):u(``,!0)])):I.value.processChart?u(``,!0):(a(),h(`div`,ot,` No process data available `))])]))}}),[[`__scopeId`,`data-v-66d09830`]]);export{k as default}; \ No newline at end of file +import{r as e}from"./chunk-DECur_0Z.js";import{C as t,D as n,K as r,N as i,T as a,U as o,X as s,_t as c,h as ee,ht as l,j as te,l as u,m as d,o as f,r as p,s as m,u as h,x as ne,y as g,z as _}from"./runtime-core.esm-bundler-CINEgm0a.js";import{o as v}from"./api-EpLa-SS4.js";import{t as re}from"./useTheme-vbCn9P26.js";import{d as y,t as ie}from"./index-DF5glAZc.js";import{t as b}from"./formatters-DVmMQB0F.js";import{_ as ae,a as oe,c as se,d as ce,f as le,g as ue,i as de,l as fe,m as pe,n as x,o as me,r as he,s as S,t as C,u as ge,v as _e,y as ve}from"./ChartCard-D5XCldya.js";import"./chartjs-adapter-date-fns.esm-kFk3lIdz.js";import{t as w}from"./Sparkline-CrqucW0n.js";var ye={class:`p-6 space-y-6`},be={class:`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4`},xe={class:`grid grid-cols-1 lg:grid-cols-2 gap-6`},Se={class:`glass-card rounded-[15px] p-6`},Ce={key:0,class:`grid grid-cols-2 gap-4 text-sm`},we={class:`text-content-primary font-semibold`},Te={class:`text-content-primary font-semibold`},Ee={class:`text-content-primary font-semibold`},T={class:`text-content-primary font-semibold`},E={class:`glass-card rounded-[15px] p-6`},D={key:0,class:`grid grid-cols-2 gap-4 text-sm`},De={class:`text-content-primary font-semibold`},Oe={class:`text-content-primary font-semibold`},ke={class:`text-content-primary font-semibold`},Ae={class:`text-content-primary font-semibold`},je={class:`grid grid-cols-1 lg:grid-cols-2 gap-6`},Me={class:`glass-card rounded-[15px] p-6`},Ne={class:`relative h-48`},Pe={key:0,class:`grid grid-cols-3 gap-4 text-sm mt-4`},Fe={class:`text-center`},Ie={class:`text-content-primary font-semibold`},Le={class:`text-center`},Re={class:`font-semibold text-accent-red`},ze={class:`text-center`},Be={class:`font-semibold text-accent-green`},Ve={class:`glass-card rounded-[15px] p-6`},He={key:0,class:`space-y-4`},Ue={class:`grid grid-cols-2 gap-4 text-sm`},We={class:`text-content-primary font-semibold`},Ge={class:`text-content-primary font-semibold`},Ke={class:`text-content-primary font-semibold`},qe={class:`text-content-primary font-semibold`},O={key:0,class:`pt-4 border-t border-stroke-subtle dark:border-stroke/opacity-light`},Je={class:`grid grid-cols-2 gap-2 text-sm`},Ye={class:`text-content-secondary dark:text-content-muted`},Xe={class:`text-content-primary font-semibold ml-1`},Ze={class:`glass-card rounded-[15px] p-6`},Qe={key:0,class:`overflow-x-auto`},$e={class:`w-full text-sm`},et={class:`text-content-secondary dark:text-content-primary/opacity-heavy py-2 transition-all duration-300`},tt={class:`text-content-primary font-semibold py-2 transition-all duration-300`},nt={class:`text-center text-secondary py-2 transition-all duration-300`},rt={class:`text-center text-accent-green py-2 transition-all duration-300`},it={class:`text-right text-content-secondary dark:text-content-primary/opacity-heavy py-2 transition-all duration-300`},at={key:0,class:`mt-4 text-center text-content-secondary dark:text-content-muted text-sm transition-all duration-300`},ot={key:1,class:`text-center text-content-secondary dark:text-content-muted py-8`},k=y(ee({name:`SystemStatsView`,__name:`SystemStats`,setup(ee){S.register(me,ce,le,ge,fe,de,se,_e,ve,ae,he,oe,ue,pe);let{theme:y}=re(),k=(e,t)=>typeof window>`u`?t:window.getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t,A=()=>({labelColor:k(`--color-text-muted`,`gray`),textColor:k(`--color-text-secondary`,`gainsboro`)}),j={cpu:`var(--color-accent-cyan)`,memory:`var(--color-accent-green)`,disk:`var(--color-accent-red)`,free:`var(--color-accent-green)`,uptime:`var(--color-accent-purple)`},M=o(null),N=o(null),P=o([]),F=o(null),I=o({cpuChart:!0,memoryChart:!0,diskChart:!1,processChart:!0}),L=o(null),R=o(null),z=o(`Connecting...`),B=o(`Connecting...`),V=o(null),H=o(null),U=o(null),W=o(null),G=o(null),K=f(()=>M.value?{cpuUsage:M.value.cpu.usage_percent,memoryUsage:M.value.memory.usage_percent,diskUsage:M.value.disk.usage_percent,uptime:M.value.system.uptime}:{cpuUsage:0,memoryUsage:0,diskUsage:0,uptime:0}),q=f(()=>P.value.length===0?{cpu:[],memory:[],disk:[],network:[]}:{cpu:P.value.map(e=>e.cpu.usage_percent),memory:P.value.map(e=>e.memory.usage_percent),disk:P.value.map(e=>e.disk.usage_percent),network:P.value.map(e=>e.network.bytes_recv/1024/1024)}),J=f(()=>{let e=P.value.length;if(e<2)return``;let t=e*5;return t<120?`last ${t}s`:`last ${Math.round(t/60)}m`}),st=e=>{let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}d ${n}h ${r}m`:n>0?`${n}h ${r}m`:`${r}m`},Y=async()=>{z.value=`Connecting...`,B.value=`Connecting...`;try{let e=await x(`/hardware_stats`,void 0,{onPhaseChange:e=>{let t=e===`receiving`?`Receiving data...`:`Connecting...`;z.value=t,B.value=t}});if(e?.success&&e.data){let t=e.data;M.value=t,P.value.push(t),P.value.length>20&&P.value.shift(),L.value=null,R.value=null,await g(),Z()}else L.value=`No data in server response`,R.value=`No data in server response`}catch(e){let t=e instanceof Error?e.message:`Failed to load data`;L.value=t,R.value=t}finally{I.value.cpuChart=!1,I.value.memoryChart=!1}},ct=async()=>{try{let e=await x(`/hardware_processes`);e?.success&&e.data&&(F.value=N.value,N.value=e.data)}catch(e){console.error(`Failed to fetch process stats:`,e)}finally{I.value.processChart=!1}},X=(e,t)=>{if(!F.value)return!1;let n=F.value.processes.find(t=>t.pid===e.pid);return n?n[t]!==e[t]:!0},lt=()=>{Y(),ct()},Z=()=>{M.value&&(ut(),dt(),ft())},ut=()=>{if(!U.value||!M.value){I.value.cpuChart=!1;return}let e=U.value.getContext(`2d`);if(!e){I.value.cpuChart=!1;return}let t=M.value.cpu.usage_percent,n=100-t;if(V.value)try{V.value.data.datasets[0].data=[t,n],V.value.update(`none`);return}catch(e){console.warn(`Failed to update CPU chart, recreating...`,e),V.value.destroy(),V.value=null}let r=k(`--color-accent-cyan`,`deepskyblue`),i=A(),a=k(`--color-background-mute`,`lightgray`),o=k(`--color-border`,`gray`);try{V.value=_(new S(e,{type:`doughnut`,data:{labels:[`Used`,`Available`],datasets:[{data:[t,n],backgroundColor:[r,a],borderColor:[r,o],borderWidth:2}]},options:{responsive:!0,maintainAspectRatio:!1,cutout:`70%`,animation:{animateRotate:!1,animateScale:!1,duration:0},plugins:{legend:{display:!1},tooltip:{callbacks:{label:function(e){return`${e.label}: ${e.parsed.toFixed(1)}%`}}}}},plugins:[{id:`centerText`,beforeDraw:function(e){let t=e.ctx;t.save();let n=e.data.datasets[0].data[0],a=(e.chartArea.left+e.chartArea.right)/2,o=(e.chartArea.top+e.chartArea.bottom)/2;t.textAlign=`center`,t.textBaseline=`middle`,t.fillStyle=r,t.font=`bold 18px sans-serif`,t.fillText(`${n.toFixed(1)}%`,a,o-5),t.fillStyle=i.labelColor,t.font=`10px sans-serif`,t.fillText(`CPU`,a,o+12),t.restore()}}]})),L.value=null,I.value.cpuChart=!1}catch(e){console.error(`Error creating CPU chart:`,e),L.value=`Failed to create CPU chart`,I.value.cpuChart=!1}},dt=()=>{if(!W.value||!M.value){I.value.memoryChart=!1;return}let e=W.value.getContext(`2d`);if(!e){I.value.memoryChart=!1;return}let t=M.value.memory.usage_percent,n=100-t;if(H.value)try{H.value.data.datasets[0].data=[t,n],H.value.update(`none`);return}catch(e){console.warn(`Failed to update Memory chart, recreating...`,e),H.value.destroy(),H.value=null}let r=k(`--color-accent-green`,`limegreen`),i=A(),a=k(`--color-background-mute`,`lightgray`),o=k(`--color-border`,`gray`);try{H.value=_(new S(e,{type:`doughnut`,data:{labels:[`Used`,`Available`],datasets:[{data:[t,n],backgroundColor:[r,a],borderColor:[r,o],borderWidth:2}]},options:{responsive:!0,maintainAspectRatio:!1,cutout:`70%`,animation:{animateRotate:!1,animateScale:!1,duration:0},plugins:{legend:{display:!1},tooltip:{callbacks:{label:function(e){return`${e.label}: ${e.parsed.toFixed(1)}%`}}}}},plugins:[{id:`centerText`,beforeDraw:function(e){let t=e.ctx;t.save();let n=e.data.datasets[0].data[0],a=(e.chartArea.left+e.chartArea.right)/2,o=(e.chartArea.top+e.chartArea.bottom)/2;t.textAlign=`center`,t.textBaseline=`middle`,t.fillStyle=r,t.font=`bold 18px sans-serif`,t.fillText(`${n.toFixed(1)}%`,a,o-5),t.fillStyle=i.labelColor,t.font=`10px sans-serif`,t.fillText(`Memory`,a,o+12),t.restore()}}]})),R.value=null,I.value.memoryChart=!1}catch(e){console.error(`Error creating Memory chart:`,e),R.value=`Failed to create Memory chart`,I.value.memoryChart=!1}},ft=()=>{if(!G.value||!M.value)return;let t=A().textColor;try{v(()=>import(`./plotly.min-BmxIBpZZ.js`).then(t=>e(t.t(),1)).then(e=>{let n=e.default||e,r=M.value.disk,i=[{type:`pie`,labels:[`Used`,`Free`],values:[r.used,r.free],marker:{colors:[k(`--color-accent-red`,`tomato`),k(`--color-accent-green`,`limegreen`)]},hovertemplate:`%{label}
Size: %{value}
Percentage: %{percent}`,textinfo:`label+percent`,textposition:`auto`,hole:.4}],a={title:{text:``,font:{color:t}},paper_bgcolor:`transparent`,plot_bgcolor:`transparent`,font:{color:t,size:11},margin:{t:20,b:20,l:20,r:20},showlegend:!0,legend:{orientation:`h`,x:0,y:-.2,font:{color:t,size:10}}};n.newPlot(G.value,i,a,{responsive:!0,displayModeBar:!1,staticPlot:!1})}),__vite__mapDeps([0,1]))}catch(e){console.error(`Error creating disk chart:`,e)}},Q=()=>{try{if(V.value&&=(V.value.destroy(),null),H.value&&=(H.value.destroy(),null),G.value)try{v(()=>import(`./plotly.min-BmxIBpZZ.js`).then(t=>e(t.t(),1)).then(e=>{let t=e?.default||e;t?.purge&&t.purge(G.value)}),__vite__mapDeps([0,1])).catch(()=>{})}catch{}}catch(e){console.error(`Error destroying charts:`,e)}};te(y,()=>{Q(),g(()=>Z())});let $=()=>{setTimeout(()=>{r(V.value)?.resize(),r(H.value)?.resize();try{v(()=>import(`./plotly.min-BmxIBpZZ.js`).then(t=>e(t.t(),1)).then(e=>{let t=e?.default||e;t?.Plots&&t.Plots.resize(G.value)}),__vite__mapDeps([0,1])).catch(()=>{})}catch{}},100)};return ie(lt,{intervalMs:5e3,immediate:!0}),t(async()=>{await g(),window.addEventListener(`resize`,$)}),ne(()=>{window.removeEventListener(`resize`,$),Q()}),(e,t)=>(a(),h(`div`,ye,[t[22]||=m(`div`,{class:`flex justify-between items-center`},[m(`h2`,{class:`text-2xl font-bold text-content-primary`},` System Statistics `),m(`div`,{class:`text-content-secondary dark:text-content-muted text-sm`},` Updates every 5 seconds `)],-1),m(`div`,be,[d(w,{title:`CPU Usage`,value:`${K.value.cpuUsage.toFixed(1)}%`,color:j.cpu,data:q.value.cpu,"min-y":0,"max-y":100,subtitle:J.value},null,8,[`value`,`color`,`data`,`subtitle`]),d(w,{title:`Memory Usage`,value:`${K.value.memoryUsage.toFixed(1)}%`,color:j.memory,data:q.value.memory,"min-y":0,"max-y":100,subtitle:J.value},null,8,[`value`,`color`,`data`,`subtitle`]),d(w,{title:`Disk Usage`,value:`${K.value.diskUsage.toFixed(1)}%`,color:j.disk,data:q.value.disk,"min-y":0,"max-y":100,subtitle:J.value},null,8,[`value`,`color`,`data`,`subtitle`]),d(w,{title:`Uptime`,value:st(K.value.uptime),color:j.uptime,data:[],"show-chart":!1},null,8,[`value`,`color`])]),m(`div`,xe,[m(`div`,Se,[t[4]||=m(`h3`,{class:`text-content-primary text-xl font-semibold mb-4`},` CPU Performance `,-1),d(C,{class:`h-32 mb-4`,"is-loading":I.value.cpuChart,error:L.value,status:z.value,onRetry:Y},{default:i(()=>[m(`canvas`,{ref_key:`cpuCanvasRef`,ref:U,class:`w-full h-full`},null,512)]),_:1},8,[`is-loading`,`error`,`status`]),M.value?(a(),h(`div`,Ce,[m(`div`,null,[t[0]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`CPU Count`,-1),m(`div`,we,c(M.value.cpu.count)+` cores `,1)]),m(`div`,null,[t[1]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Frequency`,-1),m(`div`,Te,c(M.value.cpu.frequency.toFixed(0))+` MHz `,1)]),m(`div`,null,[t[2]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Load (1m)`,-1),m(`div`,Ee,c(M.value.cpu.load_avg[`1min`].toFixed(2)),1)]),m(`div`,null,[t[3]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Load (5m)`,-1),m(`div`,T,c(M.value.cpu.load_avg[`5min`].toFixed(2)),1)])])):u(``,!0)]),m(`div`,E,[t[9]||=m(`h3`,{class:`text-content-primary text-xl font-semibold mb-4`},` Memory Usage `,-1),d(C,{class:`h-32 mb-4`,"is-loading":I.value.memoryChart,error:R.value,status:B.value,onRetry:Y},{default:i(()=>[m(`canvas`,{ref_key:`memoryCanvasRef`,ref:W,class:`w-full h-full`},null,512)]),_:1},8,[`is-loading`,`error`,`status`]),M.value?(a(),h(`div`,D,[m(`div`,null,[t[5]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Total`,-1),m(`div`,De,c(s(b)(M.value.memory.total)),1)]),m(`div`,null,[t[6]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Used`,-1),m(`div`,Oe,c(s(b)(M.value.memory.used)),1)]),m(`div`,null,[t[7]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Available`,-1),m(`div`,ke,c(s(b)(M.value.memory.available)),1)]),m(`div`,null,[t[8]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Usage`,-1),m(`div`,Ae,c(M.value.memory.usage_percent.toFixed(1))+`% `,1)])])):u(``,!0)])]),m(`div`,je,[m(`div`,Me,[t[13]||=m(`h3`,{class:`text-content-primary text-xl font-semibold mb-4`},` Storage Usage `,-1),m(`div`,Ne,[m(`div`,{ref_key:`diskCanvasRef`,ref:G,class:`w-full h-full`},null,512)]),M.value?(a(),h(`div`,Pe,[m(`div`,Fe,[t[10]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Total`,-1),m(`div`,Ie,c(s(b)(M.value.disk.total)),1)]),m(`div`,Le,[t[11]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Used`,-1),m(`div`,Re,c(s(b)(M.value.disk.used)),1)]),m(`div`,ze,[t[12]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Free`,-1),m(`div`,Be,c(s(b)(M.value.disk.free)),1)])])):u(``,!0)]),m(`div`,Ve,[t[19]||=m(`h3`,{class:`text-content-primary text-xl font-semibold mb-4`},` Network Statistics `,-1),M.value?(a(),h(`div`,He,[m(`div`,Ue,[m(`div`,null,[t[14]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Bytes Sent`,-1),m(`div`,We,c(s(b)(M.value.network.bytes_sent)),1)]),m(`div`,null,[t[15]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Bytes Received`,-1),m(`div`,Ge,c(s(b)(M.value.network.bytes_recv)),1)]),m(`div`,null,[t[16]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Packets Sent`,-1),m(`div`,Ke,c(M.value.network.packets_sent.toLocaleString()),1)]),m(`div`,null,[t[17]||=m(`div`,{class:`text-content-secondary dark:text-content-muted`},`Packets Received`,-1),m(`div`,qe,c(M.value.network.packets_recv.toLocaleString()),1)])]),M.value.temperatures&&Object.keys(M.value.temperatures).length>0?(a(),h(`div`,O,[t[18]||=m(`div`,{class:`text-content-secondary dark:text-content-muted mb-2`},` System Temperatures `,-1),m(`div`,Je,[(a(!0),h(p,null,n(M.value.temperatures,(e,t)=>(a(),h(`div`,{key:t},[m(`span`,Ye,c(t)+`:`,1),m(`span`,Xe,c(e.toFixed(1))+`°C`,1)]))),128))])])):u(``,!0)])):u(``,!0)])]),m(`div`,Ze,[t[21]||=m(`h3`,{class:`text-content-primary text-xl font-semibold mb-4`},` Top Processes `,-1),N.value?.processes&&N.value.processes.length>0?(a(),h(`div`,Qe,[m(`table`,$e,[t[20]||=m(`thead`,null,[m(`tr`,{class:`border-b border-stroke-subtle dark:border-stroke/opacity-light`},[m(`th`,{class:`text-left text-content-secondary dark:text-content-muted py-2`},`PID`),m(`th`,{class:`text-left text-content-secondary dark:text-content-muted py-2`},`Name`),m(`th`,{class:`text-center text-content-secondary dark:text-content-muted py-2`},`CPU %`),m(`th`,{class:`text-center text-content-secondary dark:text-content-muted py-2`},` Memory % `),m(`th`,{class:`text-right text-content-secondary dark:text-content-muted py-2`},`Memory`)])],-1),m(`tbody`,null,[(a(!0),h(p,null,n(N.value.processes.slice(0,10),e=>(a(),h(`tr`,{key:e.pid,class:`border-b border-stroke-subtle dark:border-white/opacity-light process-row`},[m(`td`,et,c(e.pid),1),m(`td`,tt,c(e.name),1),m(`td`,nt,[m(`span`,{class:l([`cpu-value`,{"value-updated":X(e,`cpu_percent`)}])},c(e.cpu_percent.toFixed(1))+`% `,3)]),m(`td`,rt,[m(`span`,{class:l([`memory-value`,{"value-updated":X(e,`memory_percent`)}])},c(e.memory_percent.toFixed(1))+`% `,3)]),m(`td`,it,[m(`span`,{class:l({"value-updated":X(e,`memory_mb`)})},c(e.memory_mb.toFixed(1))+` MB `,3)])]))),128))])]),N.value.total_processes?(a(),h(`div`,at,` Showing top 10 of `+c(N.value.total_processes)+` total processes `,1)):u(``,!0)])):I.value.processChart?u(``,!0):(a(),h(`div`,ot,` No process data available `))])]))}}),[[`__scopeId`,`data-v-66d09830`]]);export{k as default}; \ No newline at end of file diff --git a/repeater/web/html/assets/Terminal-DHlSG9CP.js b/repeater/web/html/assets/Terminal-H1Bfe4_c.js similarity index 99% rename from repeater/web/html/assets/Terminal-DHlSG9CP.js rename to repeater/web/html/assets/Terminal-H1Bfe4_c.js index 10a6824..9a48707 100644 --- a/repeater/web/html/assets/Terminal-DHlSG9CP.js +++ b/repeater/web/html/assets/Terminal-H1Bfe4_c.js @@ -1,4 +1,4 @@ -import{C as e,P as t,T as n,U as r,_t as i,h as a,ht as o,j as s,l as c,s as l,u,w as d}from"./runtime-core.esm-bundler-CINEgm0a.js";import{c as f,l as p,o as m}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as h}from"./api-CP9MgmUS.js";import{t as g}from"./system-CGj1WgG8.js";import{t as _}from"./useTheme-vbCn9P26.js";import{r as v,t as y}from"./constants-C3rXUIAq.js";import{d as b}from"./index-Cl4Dij8v.js";var x=Object.defineProperty,ee=Object.getOwnPropertyDescriptor,te=(e,t)=>{for(var n in t)x(e,n,{get:t[n],enumerable:!0})},S=(e,t,n,r)=>{for(var i=r>1?void 0:r?ee(t,n):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(i=(r?o(t,n,i):o(i))||i);return r&&i&&x(t,n,i),i},C=(e,t)=>(n,r)=>t(n,r,e),w=`Terminal input`,T={get:()=>w,set:e=>w=e},E=`Too much output to announce, navigate to rows manually to read`,D={get:()=>E,set:e=>E=e};function ne(e){return e.replace(/\r?\n/g,`\r`)}function re(e,t){return t?`\x1B[200~`+e+`\x1B[201~`:e}function O(e,t){e.clipboardData&&e.clipboardData.setData(`text/plain`,t.selectionText),e.preventDefault()}function k(e,t,n,r){e.stopPropagation(),e.clipboardData&&A(e.clipboardData.getData(`text/plain`),t,n,r)}function A(e,t,n,r){e=ne(e),e=re(e,n.decPrivateModes.bracketedPasteMode&&r.rawOptions.ignoreBracketedPasteMode!==!0),n.triggerDataEvent(e,!0),t.value=``}function j(e,t,n){let r=n.getBoundingClientRect(),i=e.clientX-r.left-10,a=e.clientY-r.top-10;t.style.width=`20px`,t.style.height=`20px`,t.style.left=`${i}px`,t.style.top=`${a}px`,t.style.zIndex=`1000`,t.focus()}function ie(e,t,n,r,i){j(e,t,n),i&&r.rightClickSelect(e),t.value=r.selectionText,t.select()}function ae(e){return e>65535?(e-=65536,String.fromCharCode((e>>10)+55296)+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)}function oe(e,t=0,n=e.length){let r=``;for(let i=t;i65535?(t-=65536,r+=String.fromCharCode((t>>10)+55296)+String.fromCharCode(t%1024+56320)):r+=String.fromCharCode(t)}return r}var se=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){let n=e.length;if(!n)return 0;let r=0,i=0;if(this._interim){let n=e.charCodeAt(i++);56320<=n&&n<=57343?t[r++]=(this._interim-55296)*1024+n-56320+65536:(t[r++]=this._interim,t[r++]=n),this._interim=0}for(let a=i;a=n)return this._interim=i,r;let o=e.charCodeAt(a);56320<=o&&o<=57343?t[r++]=(i-55296)*1024+o-56320+65536:(t[r++]=i,t[r++]=o);continue}i!==65279&&(t[r++]=i)}return r}},ce=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){let n=e.length;if(!n)return 0;let r=0,i,a,o,s,c=0,l=0;if(this.interim[0]){let i=!1,a=this.interim[0];a&=(a&224)==192?31:(a&240)==224?15:7;let o=0,s;for(;(s=this.interim[++o]&63)&&o<4;)a<<=6,a|=s;let c=(this.interim[0]&224)==192?2:(this.interim[0]&240)==224?3:4,u=c-o;for(;l=n)return 0;if(s=e[l++],(s&192)!=128){l--,i=!0;break}else this.interim[o++]=s,a<<=6,a|=s&63}i||(c===2?a<128?l--:t[r++]=a:c===3?a<2048||a>=55296&&a<=57343||a===65279||(t[r++]=a):a<65536||a>1114111||(t[r++]=a)),this.interim.fill(0)}let u=n-4,d=l;for(;d=n)return this.interim[0]=i,r;if(a=e[d++],(a&192)!=128){d--;continue}if(c=(i&31)<<6|a&63,c<128){d--;continue}t[r++]=c}else if((i&240)==224){if(d>=n)return this.interim[0]=i,r;if(a=e[d++],(a&192)!=128){d--;continue}if(d>=n)return this.interim[0]=i,this.interim[1]=a,r;if(o=e[d++],(o&192)!=128){d--;continue}if(c=(i&15)<<12|(a&63)<<6|o&63,c<2048||c>=55296&&c<=57343||c===65279)continue;t[r++]=c}else if((i&248)==240){if(d>=n)return this.interim[0]=i,r;if(a=e[d++],(a&192)!=128){d--;continue}if(d>=n)return this.interim[0]=i,this.interim[1]=a,r;if(o=e[d++],(o&192)!=128){d--;continue}if(d>=n)return this.interim[0]=i,this.interim[1]=a,this.interim[2]=o,r;if(s=e[d++],(s&192)!=128){d--;continue}if(c=(i&7)<<18|(a&63)<<12|(o&63)<<6|s&63,c<65536||c>1114111)continue;t[r++]=c}}return r}},le=``,ue=` `,M=class e{constructor(){this.fg=0,this.bg=0,this.extended=new de}static toColorRGB(e){return[e>>>16&255,e>>>8&255,e&255]}static fromColorRGB(e){return(e[0]&255)<<16|(e[1]&255)<<8|e[2]&255}clone(){let t=new e;return t.fg=this.fg,t.bg=this.bg,t.extended=this.extended.clone(),t}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)==50331648}isBgRGB(){return(this.bg&50331648)==50331648}isFgPalette(){return(this.fg&50331648)==16777216||(this.fg&50331648)==33554432}isBgPalette(){return(this.bg&50331648)==16777216||(this.bg&50331648)==33554432}isFgDefault(){return(this.fg&50331648)==0}isBgDefault(){return(this.bg&50331648)==0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)==50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)==16777216||(this.extended.underlineColor&50331648)==33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)==0:this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},de=class e{constructor(e=0,t=0){this._ext=0,this._urlId=0,this._ext=e,this._urlId=t}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(e){this._ext&=-67108864,this._ext|=e&67108863}get urlId(){return this._urlId}set urlId(e){this._urlId=e}get underlineVariantOffset(){let e=(this._ext&3758096384)>>29;return e<0?e^4294967288:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}clone(){return new e(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0}},N=class e extends M{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new de,this.combinedData=``}static fromCharData(t){let n=new e;return n.setFromCharData(t),n}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?ae(this.content&2097151):``}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(e){this.fg=e[0],this.bg=0;let t=!1;if(e[1].length>2)t=!0;else if(e[1].length===2){let n=e[1].charCodeAt(0);if(55296<=n&&n<=56319){let r=e[1].charCodeAt(1);56320<=r&&r<=57343?this.content=(n-55296)*1024+r-56320+65536|e[2]<<22:t=!0}else t=!0}else this.content=e[1].charCodeAt(0)|e[2]<<22;t&&(this.combinedData=e[1],this.content=2097152|e[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}},fe=`di$target`,pe=`di$dependencies`,me=new Map;function he(e){return e[pe]||[]}function ge(e){if(me.has(e))return me.get(e);let t=function(e,n,r){if(arguments.length!==3)throw Error(`@IServiceName-decorator can only be used to decorate a parameter`);_e(t,e,r)};return t._id=e,me.set(e,t),t}function _e(e,t,n){t[fe]===t?t[pe].push({id:e,index:n}):(t[pe]=[{id:e,index:n}],t[fe]=t)}var ve=ge(`BufferService`),ye=ge(`CoreMouseService`),be=ge(`CoreService`),xe=ge(`CharsetService`),Se=ge(`InstantiationService`),Ce=ge(`LogService`),we=ge(`OptionsService`),Te=ge(`OscLinkService`),Ee=ge(`UnicodeService`),De=ge(`DecorationService`),Oe=class{constructor(e,t,n){this._bufferService=e,this._optionsService=t,this._oscLinkService=n}provideLinks(e,t){let n=this._bufferService.buffer.lines.get(e-1);if(!n){t(void 0);return}let r=[],i=this._optionsService.rawOptions.linkHandler,a=new N,o=n.getTrimmedLength(),s=-1,c=-1,l=!1;for(let t=0;ti?i.activate(e,t,a):ke(e,t),hover:(e,t)=>i?.hover?.(e,t,a),leave:(e,t)=>i?.leave?.(e,t,a)})}l=!1,a.hasExtendedAttrs()&&a.extended.urlId?(c=t,s=a.extended.urlId):(c=-1,s=-1)}}t(r)}};Oe=S([C(0,ve),C(1,we),C(2,Te)],Oe);function ke(e,t){if(confirm(`Do you want to navigate to ${t}? +import{C as e,P as t,T as n,U as r,_t as i,h as a,ht as o,j as s,l as c,s as l,u,w as d}from"./runtime-core.esm-bundler-CINEgm0a.js";import{c as f,l as p,o as m}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{t as h}from"./api-EpLa-SS4.js";import{t as g}from"./system-CuO1gaHr.js";import{t as _}from"./useTheme-vbCn9P26.js";import{r as v,t as y}from"./constants-C3rXUIAq.js";import{d as b}from"./index-DF5glAZc.js";var x=Object.defineProperty,ee=Object.getOwnPropertyDescriptor,te=(e,t)=>{for(var n in t)x(e,n,{get:t[n],enumerable:!0})},S=(e,t,n,r)=>{for(var i=r>1?void 0:r?ee(t,n):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(i=(r?o(t,n,i):o(i))||i);return r&&i&&x(t,n,i),i},C=(e,t)=>(n,r)=>t(n,r,e),w=`Terminal input`,T={get:()=>w,set:e=>w=e},E=`Too much output to announce, navigate to rows manually to read`,D={get:()=>E,set:e=>E=e};function ne(e){return e.replace(/\r?\n/g,`\r`)}function re(e,t){return t?`\x1B[200~`+e+`\x1B[201~`:e}function O(e,t){e.clipboardData&&e.clipboardData.setData(`text/plain`,t.selectionText),e.preventDefault()}function k(e,t,n,r){e.stopPropagation(),e.clipboardData&&A(e.clipboardData.getData(`text/plain`),t,n,r)}function A(e,t,n,r){e=ne(e),e=re(e,n.decPrivateModes.bracketedPasteMode&&r.rawOptions.ignoreBracketedPasteMode!==!0),n.triggerDataEvent(e,!0),t.value=``}function j(e,t,n){let r=n.getBoundingClientRect(),i=e.clientX-r.left-10,a=e.clientY-r.top-10;t.style.width=`20px`,t.style.height=`20px`,t.style.left=`${i}px`,t.style.top=`${a}px`,t.style.zIndex=`1000`,t.focus()}function ie(e,t,n,r,i){j(e,t,n),i&&r.rightClickSelect(e),t.value=r.selectionText,t.select()}function ae(e){return e>65535?(e-=65536,String.fromCharCode((e>>10)+55296)+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)}function oe(e,t=0,n=e.length){let r=``;for(let i=t;i65535?(t-=65536,r+=String.fromCharCode((t>>10)+55296)+String.fromCharCode(t%1024+56320)):r+=String.fromCharCode(t)}return r}var se=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){let n=e.length;if(!n)return 0;let r=0,i=0;if(this._interim){let n=e.charCodeAt(i++);56320<=n&&n<=57343?t[r++]=(this._interim-55296)*1024+n-56320+65536:(t[r++]=this._interim,t[r++]=n),this._interim=0}for(let a=i;a=n)return this._interim=i,r;let o=e.charCodeAt(a);56320<=o&&o<=57343?t[r++]=(i-55296)*1024+o-56320+65536:(t[r++]=i,t[r++]=o);continue}i!==65279&&(t[r++]=i)}return r}},ce=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){let n=e.length;if(!n)return 0;let r=0,i,a,o,s,c=0,l=0;if(this.interim[0]){let i=!1,a=this.interim[0];a&=(a&224)==192?31:(a&240)==224?15:7;let o=0,s;for(;(s=this.interim[++o]&63)&&o<4;)a<<=6,a|=s;let c=(this.interim[0]&224)==192?2:(this.interim[0]&240)==224?3:4,u=c-o;for(;l=n)return 0;if(s=e[l++],(s&192)!=128){l--,i=!0;break}else this.interim[o++]=s,a<<=6,a|=s&63}i||(c===2?a<128?l--:t[r++]=a:c===3?a<2048||a>=55296&&a<=57343||a===65279||(t[r++]=a):a<65536||a>1114111||(t[r++]=a)),this.interim.fill(0)}let u=n-4,d=l;for(;d=n)return this.interim[0]=i,r;if(a=e[d++],(a&192)!=128){d--;continue}if(c=(i&31)<<6|a&63,c<128){d--;continue}t[r++]=c}else if((i&240)==224){if(d>=n)return this.interim[0]=i,r;if(a=e[d++],(a&192)!=128){d--;continue}if(d>=n)return this.interim[0]=i,this.interim[1]=a,r;if(o=e[d++],(o&192)!=128){d--;continue}if(c=(i&15)<<12|(a&63)<<6|o&63,c<2048||c>=55296&&c<=57343||c===65279)continue;t[r++]=c}else if((i&248)==240){if(d>=n)return this.interim[0]=i,r;if(a=e[d++],(a&192)!=128){d--;continue}if(d>=n)return this.interim[0]=i,this.interim[1]=a,r;if(o=e[d++],(o&192)!=128){d--;continue}if(d>=n)return this.interim[0]=i,this.interim[1]=a,this.interim[2]=o,r;if(s=e[d++],(s&192)!=128){d--;continue}if(c=(i&7)<<18|(a&63)<<12|(o&63)<<6|s&63,c<65536||c>1114111)continue;t[r++]=c}}return r}},le=``,ue=` `,M=class e{constructor(){this.fg=0,this.bg=0,this.extended=new de}static toColorRGB(e){return[e>>>16&255,e>>>8&255,e&255]}static fromColorRGB(e){return(e[0]&255)<<16|(e[1]&255)<<8|e[2]&255}clone(){let t=new e;return t.fg=this.fg,t.bg=this.bg,t.extended=this.extended.clone(),t}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)==50331648}isBgRGB(){return(this.bg&50331648)==50331648}isFgPalette(){return(this.fg&50331648)==16777216||(this.fg&50331648)==33554432}isBgPalette(){return(this.bg&50331648)==16777216||(this.bg&50331648)==33554432}isFgDefault(){return(this.fg&50331648)==0}isBgDefault(){return(this.bg&50331648)==0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)==50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)==16777216||(this.extended.underlineColor&50331648)==33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)==0:this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},de=class e{constructor(e=0,t=0){this._ext=0,this._urlId=0,this._ext=e,this._urlId=t}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(e){this._ext&=-67108864,this._ext|=e&67108863}get urlId(){return this._urlId}set urlId(e){this._urlId=e}get underlineVariantOffset(){let e=(this._ext&3758096384)>>29;return e<0?e^4294967288:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}clone(){return new e(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0}},N=class e extends M{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new de,this.combinedData=``}static fromCharData(t){let n=new e;return n.setFromCharData(t),n}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?ae(this.content&2097151):``}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(e){this.fg=e[0],this.bg=0;let t=!1;if(e[1].length>2)t=!0;else if(e[1].length===2){let n=e[1].charCodeAt(0);if(55296<=n&&n<=56319){let r=e[1].charCodeAt(1);56320<=r&&r<=57343?this.content=(n-55296)*1024+r-56320+65536|e[2]<<22:t=!0}else t=!0}else this.content=e[1].charCodeAt(0)|e[2]<<22;t&&(this.combinedData=e[1],this.content=2097152|e[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}},fe=`di$target`,pe=`di$dependencies`,me=new Map;function he(e){return e[pe]||[]}function ge(e){if(me.has(e))return me.get(e);let t=function(e,n,r){if(arguments.length!==3)throw Error(`@IServiceName-decorator can only be used to decorate a parameter`);_e(t,e,r)};return t._id=e,me.set(e,t),t}function _e(e,t,n){t[fe]===t?t[pe].push({id:e,index:n}):(t[pe]=[{id:e,index:n}],t[fe]=t)}var ve=ge(`BufferService`),ye=ge(`CoreMouseService`),be=ge(`CoreService`),xe=ge(`CharsetService`),Se=ge(`InstantiationService`),Ce=ge(`LogService`),we=ge(`OptionsService`),Te=ge(`OscLinkService`),Ee=ge(`UnicodeService`),De=ge(`DecorationService`),Oe=class{constructor(e,t,n){this._bufferService=e,this._optionsService=t,this._oscLinkService=n}provideLinks(e,t){let n=this._bufferService.buffer.lines.get(e-1);if(!n){t(void 0);return}let r=[],i=this._optionsService.rawOptions.linkHandler,a=new N,o=n.getTrimmedLength(),s=-1,c=-1,l=!1;for(let t=0;ti?i.activate(e,t,a):ke(e,t),hover:(e,t)=>i?.hover?.(e,t,a),leave:(e,t)=>i?.leave?.(e,t,a)})}l=!1,a.hasExtendedAttrs()&&a.extended.urlId?(c=t,s=a.extended.urlId):(c=-1,s=-1)}}t(r)}};Oe=S([C(0,ve),C(1,we),C(2,Te)],Oe);function ke(e,t){if(confirm(`Do you want to navigate to ${t}? WARNING: This link could potentially be dangerous`)){let e=window.open();if(e){try{e.opener=null}catch{}e.location.href=t}else console.warn(`Opening link blocked as opener could not be cleared`)}}var Ae=ge(`CharSizeService`),je=ge(`CoreBrowserService`),Me=ge(`MouseService`),Ne=ge(`RenderService`),Pe=ge(`SelectionService`),Fe=ge(`CharacterJoinerService`),Ie=ge(`ThemeService`),Le=ge(`LinkProviderService`),Re=new class{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(e){setTimeout(()=>{throw e.stack?We.isErrorNoTelemetry(e)?new We(e.message+` diff --git a/repeater/web/html/assets/TxPowerNoticeModal-D8HswuZ5.js b/repeater/web/html/assets/TxPowerNoticeModal-qNJ1X_8Q.js similarity index 98% rename from repeater/web/html/assets/TxPowerNoticeModal-D8HswuZ5.js rename to repeater/web/html/assets/TxPowerNoticeModal-qNJ1X_8Q.js index 6804005..6db5fd9 100644 --- a/repeater/web/html/assets/TxPowerNoticeModal-D8HswuZ5.js +++ b/repeater/web/html/assets/TxPowerNoticeModal-qNJ1X_8Q.js @@ -1 +1 @@ -import{N as e,T as t,U as n,X as r,_t as i,c as a,h as o,i as s,l as c,m as l,o as u,s as d,u as f}from"./runtime-core.esm-bundler-CINEgm0a.js";import{l as p,t as m}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{v as h}from"./api-CP9MgmUS.js";import{t as g}from"./createLucideIcon-D-_sbJKW.js";var _=g(`triangle-alert`,[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),v=h(`setup`,()=>{let e=n(1),t=n(6),r=n(`pyRpt${Math.floor(Math.random()*1e4).toString().padStart(4,`0`)}`),i=n(null),a=n(null),o=n(null),s=n(``),c=n(``),l=n(`/dev/ttyACM0`),d=n(``),f=n(5055),p=n(``),m=n(!1),h=n({frequency:`915.0`,spreading_factor:`7`,bandwidth:`125`,coding_rate:`5`,tx_power:`14`}),g=n([]),_=n([]),v=n(!1),y=n(!1),b=n(null),x=u(()=>{switch(e.value){case 1:return!0;case 2:return r.value.trim().length>0;case 3:return a.value!==null;case 4:{if(!i.value)return!1;let e=i.value.key.toLowerCase();return e===`kiss`||e===`pymc_usb`?l.value.trim().length>0:e===`pymc_tcp`?d.value.trim().length>0:!0}case 5:return m.value?h.value.frequency&&h.value.spreading_factor&&h.value.bandwidth&&h.value.coding_rate&&h.value.tx_power:o.value!==null;case 6:return s.value.length>=6&&s.value===c.value;default:return!1}}),S=u(()=>e.value>1),C=u(()=>e.value===t.value);async function w(){v.value=!0,b.value=null;try{let e=await(await fetch(`/api/hardware_options`)).json();if(e.error)throw Error(e.error);g.value=e.hardware||[]}catch(e){b.value=e instanceof Error?e.message:`Failed to load hardware options`,console.error(`Error fetching hardware options:`,e)}finally{v.value=!1}}let T=e=>({title:String(e.title??``),description:String(e.description??``),frequency:String(e.frequency??``),spreading_factor:String(e.spreading_factor??``),bandwidth:String(e.bandwidth??``),coding_rate:String(e.coding_rate??``),tx_power:String(e.tx_power??`14`)});async function E(){v.value=!0,b.value=null;try{try{let e=new AbortController,t=setTimeout(()=>e.abort(),4e3);try{let t=await fetch(`https://api.meshcore.nz/api/v1/config`,{signal:e.signal});if(t.ok){let e=(await t.json())?.config?.suggested_radio_settings?.entries??[];if(e.length>0){_.value=e.map(e=>T(e));return}}}finally{clearTimeout(t)}}catch{}let e=await(await fetch(`/api/radio_presets`)).json();if(e.error)throw Error(e.error);_.value=(e.presets??[]).map(e=>T(e))}catch(e){b.value=e instanceof Error?e.message:`Failed to load radio presets`,console.error(`Error fetching radio presets:`,e)}finally{v.value=!1}}async function D(){if(!x.value)return{success:!1,error:`Please complete all required fields`};y.value=!0,b.value=null;try{let e=m.value?{title:`Custom Configuration`,description:`Custom radio settings`,frequency:h.value.frequency,spreading_factor:h.value.spreading_factor,bandwidth:h.value.bandwidth,coding_rate:h.value.coding_rate,tx_power:h.value.tx_power}:{...o.value},t=i.value?.config?.tx_power;t!=null&&t!==``&&(e.tx_power=String(t));let n=Number(e.tx_power??14);if(!Number.isFinite(n)||n<-9||n>22)throw Error(`TX power must be between -9 and +22 dBm`);let a=await(await fetch(`/api/setup_wizard`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({node_name:r.value.trim(),hardware_key:i.value?.key,radio_preset:e,admin_password:s.value,...i.value&&(()=>{let e=i.value.key.toLowerCase();return e===`kiss`?{kiss_port:l.value.trim()||`/dev/ttyUSB0`,kiss_baud_rate:115200}:e===`pymc_usb`?{pymc_usb_port:l.value.trim()||`/dev/ttyACM0`,pymc_usb_baudrate:921600}:e===`pymc_tcp`?{pymc_tcp_host:d.value.trim(),pymc_tcp_port:f.value,pymc_tcp_token:p.value.trim()}:{}})()})})).json();if(!a.success)throw Error(a.error||`Setup failed`);return{success:!0,data:a}}catch(e){let t=e instanceof Error?e.message:`Failed to complete setup`;return b.value=t,{success:!1,error:t}}finally{y.value=!1}}function O(){x.value&&e.value=1&&n<=t.value&&(e.value=n)}function j(){e.value=1,r.value=`pyRpt${Math.floor(Math.random()*1e4).toString().padStart(4,`0`)}`,i.value=null,a.value=null,o.value=null,m.value=!1,h.value={frequency:`915.0`,spreading_factor:`7`,bandwidth:`125`,coding_rate:`5`,tx_power:`14`},s.value=``,c.value=``,l.value=`/dev/ttyACM0`,d.value=``,f.value=5055,p.value=``,b.value=null}return{currentStep:e,totalSteps:t,nodeName:r,selectedHardware:i,selectedHardwareConnection:a,selectedRadioPreset:o,useCustomRadio:m,usbPort:l,tcpHost:d,tcpPort:f,tcpToken:p,customRadio:h,adminPassword:s,confirmPassword:c,hardwareOptions:g,radioPresets:_,isLoading:v,isSubmitting:y,error:b,canGoNext:x,canGoBack:S,isLastStep:C,fetchHardwareOptions:w,fetchRadioPresets:E,completeSetup:D,nextStep:O,previousStep:k,goToStep:A,reset:j}}),y={class:`w-full max-w-2xl rounded-3xl border border-accent-amber/opacity-medium bg-white dark:bg-surface-elevated shadow-[0_20px_80px_color-mix(in_srgb,var(--color-shadow-strong)_35%,transparent)] overflow-hidden`},b={class:`p-5 border-b border-accent-amber/opacity-medium bg-accent-amber/opacity-light`},x={class:`flex items-start gap-3`},S={class:`rounded-full bg-accent-amber/opacity-light text-accent-amber p-2`},C={key:0,class:`text-xs text-content-secondary dark:text-content-muted mt-1`},w={key:1,class:`text-xs text-content-secondary dark:text-content-muted mt-1`},T={class:`p-5 space-y-3 text-sm text-content-secondary dark:text-content-muted max-h-[60vh] overflow-y-auto`},E={class:`flex items-start gap-2 pt-1`},D=[`checked`],O={class:`modal-actions`},k=[`disabled`],A=o({__name:`TxPowerNoticeModal`,props:{show:{type:Boolean},confirmed:{type:Boolean},selectedTxPower:{default:null},actionLabel:{default:`I Understand, Continue`},busy:{type:Boolean,default:!1}},emits:[`update:show`,`update:confirmed`,`confirm`],setup(n,{emit:o}){let u=n,h=o;function g(){h(`update:show`,!1)}function v(){!u.confirmed||u.busy||h(`confirm`)}return(o,u)=>(t(),a(s,{to:`body`},[l(m,{name:`fade`},{default:e(()=>[n.show?(t(),f(`div`,{key:0,class:`modal-backdrop`,onClick:p(g,[`self`])},[d(`div`,y,[d(`div`,b,[d(`div`,x,[d(`div`,S,[l(r(_),{class:`w-5 h-5`})]),d(`div`,null,[u[1]||=d(`h4`,{class:`text-content-primary text-base font-semibold`},` TX Power & PA Configuration Notice `,-1),n.selectedTxPower===null?(t(),f(`p`,w,` Review this safety notice before applying TX power changes. `)):(t(),f(`p`,C,` Selected TX power: `+i(n.selectedTxPower)+` dBm `,1))])])]),d(`div`,T,[u[3]||=d(`p`,{class:`leading-relaxed`},` Always ensure your configured TX power complies with local country and regional radio regulations before transmitting. `,-1),u[4]||=d(`p`,{class:`leading-relaxed`},` Before changing TX power settings, research your specific LoRa board/module design carefully. Many SX1262-based boards include an external Power Amplifier (PA) and RF switching circuitry, which may require different configuration values, TX paths, or firmware settings than a standard SX1262 reference design. `,-1),u[5]||=d(`p`,{class:`leading-relaxed`},` Do not assume all boards support the same maximum power levels or PA configuration methods. `,-1),u[6]||=d(`div`,{class:`rounded-xl border border-stroke-subtle dark:border-white/opacity-light bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle p-3`},[d(`p`,{class:`text-content-primary font-medium mb-2`},`Recommended checks before applying changes:`),d(`ul`,{class:`list-disc pl-5 space-y-1`},[d(`li`,null,`Verify whether your board includes an external PA/LNA stage`),d(`li`,null,`Confirm the manufacturer’s recommended TX power limits`),d(`li`,null,`Check required RXen/TXen or RF switch pin configuration`),d(`li`,null,`Use board-specific library settings where available`),d(`li`,null,`Ensure thermal limits and duty cycle recommendations are respected`),d(`li`,null,`Never transmit without a correctly connected antenna or suitable load`)])],-1),u[7]||=d(`p`,{class:`leading-relaxed text-accent-amber font-medium`},` Incorrect PA configuration can damage hardware, lock the radio into a busy state, or cause illegal RF output levels. `,-1),d(`label`,E,[d(`input`,{checked:n.confirmed,type:`checkbox`,class:`mt-0.5`,onChange:u[0]||=e=>h(`update:confirmed`,e.target.checked)},null,40,D),u[2]||=d(`span`,{class:`text-content-primary`},`I have read and understood this warning.`,-1)])]),d(`div`,O,[d(`button`,{type:`button`,class:`modal-btn-cancel`,onClick:g},` Cancel `),d(`button`,{type:`button`,class:`modal-btn-primary`,disabled:!n.confirmed||n.busy,onClick:v},i(n.actionLabel),9,k)])])])):c(``,!0)]),_:1})]))}});export{v as n,A as t}; \ No newline at end of file +import{N as e,T as t,U as n,X as r,_t as i,c as a,h as o,i as s,l as c,m as l,o as u,s as d,u as f}from"./runtime-core.esm-bundler-CINEgm0a.js";import{l as p,t as m}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{v as h}from"./api-EpLa-SS4.js";import{t as g}from"./createLucideIcon-D-_sbJKW.js";var _=g(`triangle-alert`,[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),v=h(`setup`,()=>{let e=n(1),t=n(6),r=n(`pyRpt${Math.floor(Math.random()*1e4).toString().padStart(4,`0`)}`),i=n(null),a=n(null),o=n(null),s=n(``),c=n(``),l=n(`/dev/ttyACM0`),d=n(``),f=n(5055),p=n(``),m=n(!1),h=n({frequency:`915.0`,spreading_factor:`7`,bandwidth:`125`,coding_rate:`5`,tx_power:`14`}),g=n([]),_=n([]),v=n(!1),y=n(!1),b=n(null),x=u(()=>{switch(e.value){case 1:return!0;case 2:return r.value.trim().length>0;case 3:return a.value!==null;case 4:{if(!i.value)return!1;let e=i.value.key.toLowerCase();return e===`kiss`||e===`pymc_usb`?l.value.trim().length>0:e===`pymc_tcp`?d.value.trim().length>0:!0}case 5:return m.value?h.value.frequency&&h.value.spreading_factor&&h.value.bandwidth&&h.value.coding_rate&&h.value.tx_power:o.value!==null;case 6:return s.value.length>=6&&s.value===c.value;default:return!1}}),S=u(()=>e.value>1),C=u(()=>e.value===t.value);async function w(){v.value=!0,b.value=null;try{let e=await(await fetch(`/api/hardware_options`)).json();if(e.error)throw Error(e.error);g.value=e.hardware||[]}catch(e){b.value=e instanceof Error?e.message:`Failed to load hardware options`,console.error(`Error fetching hardware options:`,e)}finally{v.value=!1}}let T=e=>({title:String(e.title??``),description:String(e.description??``),frequency:String(e.frequency??``),spreading_factor:String(e.spreading_factor??``),bandwidth:String(e.bandwidth??``),coding_rate:String(e.coding_rate??``),tx_power:String(e.tx_power??`14`)});async function E(){v.value=!0,b.value=null;try{try{let e=new AbortController,t=setTimeout(()=>e.abort(),4e3);try{let t=await fetch(`https://api.meshcore.nz/api/v1/config`,{signal:e.signal});if(t.ok){let e=(await t.json())?.config?.suggested_radio_settings?.entries??[];if(e.length>0){_.value=e.map(e=>T(e));return}}}finally{clearTimeout(t)}}catch{}let e=await(await fetch(`/api/radio_presets`)).json();if(e.error)throw Error(e.error);_.value=(e.presets??[]).map(e=>T(e))}catch(e){b.value=e instanceof Error?e.message:`Failed to load radio presets`,console.error(`Error fetching radio presets:`,e)}finally{v.value=!1}}async function D(){if(!x.value)return{success:!1,error:`Please complete all required fields`};y.value=!0,b.value=null;try{let e=m.value?{title:`Custom Configuration`,description:`Custom radio settings`,frequency:h.value.frequency,spreading_factor:h.value.spreading_factor,bandwidth:h.value.bandwidth,coding_rate:h.value.coding_rate,tx_power:h.value.tx_power}:{...o.value},t=i.value?.config?.tx_power;t!=null&&t!==``&&(e.tx_power=String(t));let n=Number(e.tx_power??14);if(!Number.isFinite(n)||n<-9||n>22)throw Error(`TX power must be between -9 and +22 dBm`);let a=await(await fetch(`/api/setup_wizard`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({node_name:r.value.trim(),hardware_key:i.value?.key,radio_preset:e,admin_password:s.value,...i.value&&(()=>{let e=i.value.key.toLowerCase();return e===`kiss`?{kiss_port:l.value.trim()||`/dev/ttyUSB0`,kiss_baud_rate:115200}:e===`pymc_usb`?{pymc_usb_port:l.value.trim()||`/dev/ttyACM0`,pymc_usb_baudrate:921600}:e===`pymc_tcp`?{pymc_tcp_host:d.value.trim(),pymc_tcp_port:f.value,pymc_tcp_token:p.value.trim()}:{}})()})})).json();if(!a.success)throw Error(a.error||`Setup failed`);return{success:!0,data:a}}catch(e){let t=e instanceof Error?e.message:`Failed to complete setup`;return b.value=t,{success:!1,error:t}}finally{y.value=!1}}function O(){x.value&&e.value=1&&n<=t.value&&(e.value=n)}function j(){e.value=1,r.value=`pyRpt${Math.floor(Math.random()*1e4).toString().padStart(4,`0`)}`,i.value=null,a.value=null,o.value=null,m.value=!1,h.value={frequency:`915.0`,spreading_factor:`7`,bandwidth:`125`,coding_rate:`5`,tx_power:`14`},s.value=``,c.value=``,l.value=`/dev/ttyACM0`,d.value=``,f.value=5055,p.value=``,b.value=null}return{currentStep:e,totalSteps:t,nodeName:r,selectedHardware:i,selectedHardwareConnection:a,selectedRadioPreset:o,useCustomRadio:m,usbPort:l,tcpHost:d,tcpPort:f,tcpToken:p,customRadio:h,adminPassword:s,confirmPassword:c,hardwareOptions:g,radioPresets:_,isLoading:v,isSubmitting:y,error:b,canGoNext:x,canGoBack:S,isLastStep:C,fetchHardwareOptions:w,fetchRadioPresets:E,completeSetup:D,nextStep:O,previousStep:k,goToStep:A,reset:j}}),y={class:`w-full max-w-2xl rounded-3xl border border-accent-amber/opacity-medium bg-white dark:bg-surface-elevated shadow-[0_20px_80px_color-mix(in_srgb,var(--color-shadow-strong)_35%,transparent)] overflow-hidden`},b={class:`p-5 border-b border-accent-amber/opacity-medium bg-accent-amber/opacity-light`},x={class:`flex items-start gap-3`},S={class:`rounded-full bg-accent-amber/opacity-light text-accent-amber p-2`},C={key:0,class:`text-xs text-content-secondary dark:text-content-muted mt-1`},w={key:1,class:`text-xs text-content-secondary dark:text-content-muted mt-1`},T={class:`p-5 space-y-3 text-sm text-content-secondary dark:text-content-muted max-h-[60vh] overflow-y-auto`},E={class:`flex items-start gap-2 pt-1`},D=[`checked`],O={class:`modal-actions`},k=[`disabled`],A=o({__name:`TxPowerNoticeModal`,props:{show:{type:Boolean},confirmed:{type:Boolean},selectedTxPower:{default:null},actionLabel:{default:`I Understand, Continue`},busy:{type:Boolean,default:!1}},emits:[`update:show`,`update:confirmed`,`confirm`],setup(n,{emit:o}){let u=n,h=o;function g(){h(`update:show`,!1)}function v(){!u.confirmed||u.busy||h(`confirm`)}return(o,u)=>(t(),a(s,{to:`body`},[l(m,{name:`fade`},{default:e(()=>[n.show?(t(),f(`div`,{key:0,class:`modal-backdrop`,onClick:p(g,[`self`])},[d(`div`,y,[d(`div`,b,[d(`div`,x,[d(`div`,S,[l(r(_),{class:`w-5 h-5`})]),d(`div`,null,[u[1]||=d(`h4`,{class:`text-content-primary text-base font-semibold`},` TX Power & PA Configuration Notice `,-1),n.selectedTxPower===null?(t(),f(`p`,w,` Review this safety notice before applying TX power changes. `)):(t(),f(`p`,C,` Selected TX power: `+i(n.selectedTxPower)+` dBm `,1))])])]),d(`div`,T,[u[3]||=d(`p`,{class:`leading-relaxed`},` Always ensure your configured TX power complies with local country and regional radio regulations before transmitting. `,-1),u[4]||=d(`p`,{class:`leading-relaxed`},` Before changing TX power settings, research your specific LoRa board/module design carefully. Many SX1262-based boards include an external Power Amplifier (PA) and RF switching circuitry, which may require different configuration values, TX paths, or firmware settings than a standard SX1262 reference design. `,-1),u[5]||=d(`p`,{class:`leading-relaxed`},` Do not assume all boards support the same maximum power levels or PA configuration methods. `,-1),u[6]||=d(`div`,{class:`rounded-xl border border-stroke-subtle dark:border-white/opacity-light bg-background-mute/opacity-heavy dark:bg-white/opacity-subtle p-3`},[d(`p`,{class:`text-content-primary font-medium mb-2`},`Recommended checks before applying changes:`),d(`ul`,{class:`list-disc pl-5 space-y-1`},[d(`li`,null,`Verify whether your board includes an external PA/LNA stage`),d(`li`,null,`Confirm the manufacturer’s recommended TX power limits`),d(`li`,null,`Check required RXen/TXen or RF switch pin configuration`),d(`li`,null,`Use board-specific library settings where available`),d(`li`,null,`Ensure thermal limits and duty cycle recommendations are respected`),d(`li`,null,`Never transmit without a correctly connected antenna or suitable load`)])],-1),u[7]||=d(`p`,{class:`leading-relaxed text-accent-amber font-medium`},` Incorrect PA configuration can damage hardware, lock the radio into a busy state, or cause illegal RF output levels. `,-1),d(`label`,E,[d(`input`,{checked:n.confirmed,type:`checkbox`,class:`mt-0.5`,onChange:u[0]||=e=>h(`update:confirmed`,e.target.checked)},null,40,D),u[2]||=d(`span`,{class:`text-content-primary`},`I have read and understood this warning.`,-1)])]),d(`div`,O,[d(`button`,{type:`button`,class:`modal-btn-cancel`,onClick:g},` Cancel `),d(`button`,{type:`button`,class:`modal-btn-primary`,disabled:!n.confirmed||n.busy,onClick:v},i(n.actionLabel),9,k)])])])):c(``,!0)]),_:1})]))}});export{v as n,A as t}; \ No newline at end of file diff --git a/repeater/web/html/assets/api-CP9MgmUS.js b/repeater/web/html/assets/api-EpLa-SS4.js similarity index 97% rename from repeater/web/html/assets/api-CP9MgmUS.js rename to repeater/web/html/assets/api-EpLa-SS4.js index 86c7f33..92105da 100644 --- a/repeater/web/html/assets/api-CP9MgmUS.js +++ b/repeater/web/html/assets/api-EpLa-SS4.js @@ -1,7 +1,7 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Setup-DDZDo4fU.js","assets/index-Cl4Dij8v.js","assets/createLucideIcon-D-_sbJKW.js","assets/runtime-core.esm-bundler-CINEgm0a.js","assets/runtime-dom.esm-bundler-B3VeUO8l.js","assets/Spinner-CMJUE3iy.js","assets/useTheme-vbCn9P26.js","assets/dataService-CodM3OZh.js","assets/packets-DqaKkuHX.js","assets/system-CGj1WgG8.js","assets/websocket-CWIil-yT.js","assets/constants-C3rXUIAq.js","assets/index-BC2aJf7r.css","assets/TxPowerNoticeModal-D8HswuZ5.js","assets/Setup-BG2Rx8uq.css","assets/Login-BShabpmj.js","assets/Login-DL53-MUV.css","assets/Dashboard-BdHklAFz.js","assets/ChartCard-DSqBTrdz.js","assets/PacketDetailsModal-CeDGHosS.js","assets/SignalBars-Ca14Gu_3.js","assets/PacketDetailsModal-DOmYHvNq.css","assets/Dashboard-ndHj8IwP.css","assets/Neighbors-DjY7zrgE.js","assets/chunk-DECur_0Z.js","assets/leaflet-src-rW8DhqPH.js","assets/CopyLabel-7zw0wWsl.js","assets/formatters-DVmMQB0F.js","assets/Neighbors-CcSe2Aia.css","assets/leaflet-vh-t_kPv.css","assets/Statistics-BayfSP13.js","assets/chartjs-adapter-date-fns.esm-DfIbzYql.js","assets/Sparkline-DrzfaDAP.js","assets/Sparkline-C0HuREuA.css","assets/RfHealthCorrelation-ByArBbzJ.js","assets/RfHealthCorrelation-OJP3k9nw.css","assets/GPSDiagnostics-DkqSbCiV.js","assets/GPSDiagnostics-YHBWfHor.css","assets/SystemStats-B9UYM5oW.js","assets/SystemStats-CBr2j_Xi.css","assets/Sensors-CT9xtj3s.js","assets/Configuration-D-blm0qZ.js","assets/ConfirmDialog-Dl1jglkT.js","assets/LocationPicker-BfCGxfpG.js","assets/LocationPicker-DNqNv46A.css","assets/Configuration-CeqhG184.css","assets/CADCalibration-CVNgGJZz.js","assets/plotly.min-BmxIBpZZ.js","assets/CADCalibration-BKdcfNYY.css","assets/Sessions-ChyQpfIh.js","assets/RoomServers-BUo8HwN-.js","assets/MessageDialog-Dcp03-LQ.js","assets/Companions-BvYFdYvx.js","assets/Logs-CrHzoPRp.js","assets/Terminal-DHlSG9CP.js","assets/Terminal-sxj5QRG9.css","assets/Help-Dae1qP2Q.js","assets/websocket-Kj_Cut-p.js","assets/packets-BZHES11w.js","assets/system-BoPgpwO9.js","assets/dataService-k29cfBQr.js"])))=>i.map(i=>d[i]); +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Setup-CZMqH1nV.js","assets/index-DF5glAZc.js","assets/createLucideIcon-D-_sbJKW.js","assets/runtime-core.esm-bundler-CINEgm0a.js","assets/runtime-dom.esm-bundler-B3VeUO8l.js","assets/Spinner-CMJUE3iy.js","assets/useTheme-vbCn9P26.js","assets/dataService-C8lExiaM.js","assets/packets-CItQO6OO.js","assets/system-CuO1gaHr.js","assets/websocket-D8vz2gnn.js","assets/constants-C3rXUIAq.js","assets/index-CCly9bPx.css","assets/TxPowerNoticeModal-qNJ1X_8Q.js","assets/Setup-BG2Rx8uq.css","assets/Login-B6KB1F1E.js","assets/Login-DL53-MUV.css","assets/Dashboard-DhSJn9HX.js","assets/ChartCard-D5XCldya.js","assets/PacketDetailsModal-Cp96QhHp.js","assets/SignalBars-CwCyvrs-.js","assets/PacketDetailsModal-BIJCmKzB.css","assets/Dashboard-ndHj8IwP.css","assets/Neighbors-s6MU6vjM.js","assets/chunk-DECur_0Z.js","assets/leaflet-src-rW8DhqPH.js","assets/CopyLabel-7zw0wWsl.js","assets/formatters-DVmMQB0F.js","assets/Neighbors-CcSe2Aia.css","assets/leaflet-vh-t_kPv.css","assets/Statistics-DE7FhmLr.js","assets/chartjs-adapter-date-fns.esm-kFk3lIdz.js","assets/Sparkline-CrqucW0n.js","assets/Sparkline-C0HuREuA.css","assets/RfHealthCorrelation-Hq8s45i4.js","assets/RfHealthCorrelation-OJP3k9nw.css","assets/GPSDiagnostics-C9LIlcS7.js","assets/GPSDiagnostics-YHBWfHor.css","assets/SystemStats-CPdf4wwy.js","assets/SystemStats-CBr2j_Xi.css","assets/Sensors-CjVXAi_E.js","assets/Configuration-DRX-sbaI.js","assets/ConfirmDialog-Dl1jglkT.js","assets/LocationPicker-DEowGt6S.js","assets/LocationPicker-DNqNv46A.css","assets/Configuration-CeqhG184.css","assets/CADCalibration-sDbWdeGJ.js","assets/plotly.min-BmxIBpZZ.js","assets/CADCalibration-BKdcfNYY.css","assets/Sessions-BjPFjtvX.js","assets/RoomServers-t1qcIom6.js","assets/MessageDialog-Dcp03-LQ.js","assets/Companions-CdUuekpd.js","assets/Logs-CNUMuKWB.js","assets/Terminal-H1Bfe4_c.js","assets/Terminal-sxj5QRG9.css","assets/Help-Dae1qP2Q.js","assets/websocket-e8oZXVGT.js","assets/packets-CdVyfwIj.js","assets/system-CXXVlRna.js","assets/dataService-D3_w8go8.js"])))=>i.map(i=>d[i]); import{n as e}from"./chunk-DECur_0Z.js";import{B as t,E as n,F as r,G as i,I as a,J as o,K as s,L as c,R as l,S as u,U as d,V as f,W as p,X as m,_ as h,b as g,g as _,h as v,j as ee,o as y,q as b,v as x,w as S,y as C,z as te}from"./runtime-core.esm-bundler-CINEgm0a.js";var ne=typeof window<`u`,w,re=e=>w=e,T=Symbol();function ie(e){return e&&typeof e==`object`&&Object.prototype.toString.call(e)===`[object Object]`&&typeof e.toJSON!=`function`}var ae;(function(e){e.direct=`direct`,e.patchObject=`patch object`,e.patchFunction=`patch function`})(ae||={});var oe=typeof window==`object`&&window.window===window?window:typeof self==`object`&&self.self===self?self:typeof global==`object`&&global.global===global?global:typeof globalThis==`object`?globalThis:{HTMLElement:null};function se(e,{autoBom:t=!1}={}){return t&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob([``,e],{type:e.type}):e}function ce(e,t,n){let r=new XMLHttpRequest;r.open(`GET`,e),r.responseType=`blob`,r.onload=function(){fe(r.response,t,n)},r.onerror=function(){console.error(`could not download file`)},r.send()}function le(e){let t=new XMLHttpRequest;t.open(`HEAD`,e,!1);try{t.send()}catch{}return t.status>=200&&t.status<=299}function ue(e){try{e.dispatchEvent(new MouseEvent(`click`))}catch{let t=new MouseEvent(`click`,{bubbles:!0,cancelable:!0,view:window,detail:0,screenX:80,screenY:20,clientX:80,clientY:20,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null});e.dispatchEvent(t)}}var E=typeof navigator==`object`?navigator:{userAgent:``},de=/Macintosh/.test(E.userAgent)&&/AppleWebKit/.test(E.userAgent)&&!/Safari/.test(E.userAgent),fe=ne?typeof HTMLAnchorElement<`u`&&`download`in HTMLAnchorElement.prototype&&!de?pe:`msSaveOrOpenBlob`in E?me:he:()=>{};function pe(e,t=`download`,n){let r=document.createElement(`a`);r.download=t,r.rel=`noopener`,typeof e==`string`?(r.href=e,r.origin===location.origin?ue(r):le(r.href)?ce(e,t,n):(r.target=`_blank`,ue(r))):(r.href=URL.createObjectURL(e),setTimeout(function(){URL.revokeObjectURL(r.href)},4e4),setTimeout(function(){ue(r)},0))}function me(e,t=`download`,n){if(typeof e==`string`)if(le(e))ce(e,t,n);else{let t=document.createElement(`a`);t.href=e,t.target=`_blank`,setTimeout(function(){ue(t)})}else navigator.msSaveOrOpenBlob(se(e,n),t)}function he(e,t,n,r){if(r||=open(``,`_blank`),r&&(r.document.title=r.document.body.innerText=`downloading...`),typeof e==`string`)return ce(e,t,n);let i=e.type===`application/octet-stream`,a=/constructor/i.test(String(oe.HTMLElement))||`safari`in oe,o=/CriOS\/[\d]+/.test(navigator.userAgent);if((o||i&&a||de)&&typeof FileReader<`u`){let t=new FileReader;t.onloadend=function(){let e=t.result;if(typeof e!=`string`)throw r=null,Error(`Wrong reader.result type`);e=o?e:e.replace(/^data:[^;]*;/,`data:attachment/file;`),r?r.location.href=e:location.assign(e),r=null},t.readAsDataURL(e)}else{let t=URL.createObjectURL(e);r?r.location.assign(t):location.href=t,r=null,setTimeout(function(){URL.revokeObjectURL(t)},4e4)}}var{assign:ge}=Object;function _e(){let e=r(!0),t=e.run(()=>d({})),n=[],i=[],a=te({install(e){re(a),a._a=e,e.provide(T,a),e.config.globalProperties.$pinia=a,i.forEach(e=>n.push(e)),i=[]},use(e){return this._a?n.push(e):i.push(e),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return a}var D=()=>{};function O(e,n,r,i=D){e.add(n);let o=()=>{e.delete(n)&&i()};return!r&&a()&&t(o),o}function ve(e,...t){e.forEach(e=>{e(...t)})}var ye=e=>e(),be=Symbol(),xe=Symbol();function Se(e,t){e instanceof Map&&t instanceof Map?t.forEach((t,n)=>e.set(n,t)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(let n in t){if(!t.hasOwnProperty(n))continue;let r=t[n],i=e[n];ie(i)&&ie(r)&&e.hasOwnProperty(n)&&!l(r)&&!c(r)?e[n]=Se(i,r):e[n]=r}return e}var Ce=Symbol();function we(e){return!ie(e)||!Object.prototype.hasOwnProperty.call(e,Ce)}var{assign:k}=Object;function Te(e){return!!(l(e)&&e.effect)}function Ee(e,t,n,r){let{state:i,actions:a,getters:s}=t,c=n.state.value[e],l;function u(){return c||(n.state.value[e]=i?i():{}),k(o(n.state.value[e]),a,Object.keys(s||{}).reduce((t,r)=>(t[r]=te(y(()=>{re(n);let t=n._s.get(e);return s[r].call(t,t)})),t),{}))}return l=De(e,u,t,n,r,!0),l}function De(e,t,n={},i,a,o){let u,p=k({actions:{}},n),m={deep:!0},h,g,_=new Set,v=new Set,y=i.state.value[e];!o&&!y&&(i.state.value[e]={}),d({});let b;function x(t){let n;h=g=!1,typeof t==`function`?(t(i.state.value[e]),n={type:ae.patchFunction,storeId:e,events:void 0}):(Se(i.state.value[e],t),n={type:ae.patchObject,payload:t,storeId:e,events:void 0});let r=b=Symbol();C().then(()=>{b===r&&(h=!0)}),g=!0,ve(_,n,i.state.value[e])}let S=o?function(){let{state:e}=n,t=e?e():{};this.$patch(e=>{k(e,t)})}:D;function te(){u.stop(),_.clear(),v.clear(),i._s.delete(e)}let ne=(t,n=``)=>{if(be in t)return t[xe]=n,t;let r=function(){re(i);let n=Array.from(arguments),a=new Set,o=new Set;function s(e){a.add(e)}function c(e){o.add(e)}ve(v,{args:n,name:r[xe],store:w,after:s,onError:c});let l;try{l=t.apply(this&&this.$id===e?this:w,n)}catch(e){throw ve(o,e),e}return l instanceof Promise?l.then(e=>(ve(a,e),e)).catch(e=>(ve(o,e),Promise.reject(e))):(ve(a,l),l)};return r[be]=!0,r[xe]=n,r},w=f({_p:i,$id:e,$onAction:O.bind(null,v),$patch:x,$reset:S,$subscribe(t,n={}){let r=O(_,t,n.detached,()=>a()),a=u.run(()=>ee(()=>i.state.value[e],r=>{(n.flush===`sync`?g:h)&&t({storeId:e,type:ae.direct,events:void 0},r)},k({},m,n)));return r},$dispose:te});i._s.set(e,w);let T=(i._a&&i._a.runWithContext||ye)(()=>i._e.run(()=>(u=r()).run(()=>t({action:ne}))));for(let t in T){let n=T[t];l(n)&&!Te(n)||c(n)?o||(y&&we(n)&&(l(n)?n.value=y[t]:Se(n,y[t])),i.state.value[e][t]=n):typeof n==`function`&&(T[t]=ne(n,t),p.actions[t]=n)}return k(w,T),k(s(w),T),Object.defineProperty(w,`$state`,{get:()=>i.state.value[e],set:e=>{x(t=>{k(t,e)})}}),i._p.forEach(e=>{k(w,u.run(()=>e({store:w,app:i._a,pinia:i,options:p})))}),y&&o&&n.hydrate&&n.hydrate(w.$state,y),h=!0,g=!0,w}function Oe(e,t,n){let r,i=typeof t==`function`;r=i?n:t;function a(n,a){let o=h();return n||=o?x(T,null):null,n&&re(n),n=w,n._s.has(e)||(i?De(e,t,r,n):Ee(e,r,n)),n._s.get(e)}return a.$id=e,a}function ke(e){let t=s(e),n={};for(let r in t){let i=t[r];i.effect?n[r]=y({get:()=>e[r],set(t){e[r]=t}}):(l(i)||c(i))&&(n[r]=b(e,r))}return n}var Ae=typeof document<`u`;function je(e){return typeof e==`object`||`displayName`in e||`props`in e||`__vccOpts`in e}function Me(e){return e.__esModule||e[Symbol.toStringTag]===`Module`||e.default&&je(e.default)}var A=Object.assign;function Ne(e,t){let n={};for(let r in t){let i=t[r];n[r]=j(i)?i.map(e):e(i)}return n}var Pe=()=>{},j=Array.isArray;function Fe(e,t){let n={};for(let r in e)n[r]=r in t?t[r]:e[r];return n}var M=function(e){return e[e.MATCHER_NOT_FOUND=1]=`MATCHER_NOT_FOUND`,e[e.NAVIGATION_GUARD_REDIRECT=2]=`NAVIGATION_GUARD_REDIRECT`,e[e.NAVIGATION_ABORTED=4]=`NAVIGATION_ABORTED`,e[e.NAVIGATION_CANCELLED=8]=`NAVIGATION_CANCELLED`,e[e.NAVIGATION_DUPLICATED=16]=`NAVIGATION_DUPLICATED`,e}({}),Ie=Symbol(``);M.MATCHER_NOT_FOUND,M.NAVIGATION_GUARD_REDIRECT,M.NAVIGATION_ABORTED,M.NAVIGATION_CANCELLED,M.NAVIGATION_DUPLICATED;function Le(e,t){return A(Error(),{type:e,[Ie]:!0},t)}function N(e,t){return e instanceof Error&&Ie in e&&(t==null||!!(e.type&t))}var Re=Symbol(``),ze=Symbol(``),Be=Symbol(``),Ve=Symbol(``),He=Symbol(``);function Ue(){return x(Be)}function We(e){return x(Ve)}var Ge=/#/g,Ke=/&/g,qe=/\//g,Je=/=/g,Ye=/\?/g,Xe=/\+/g,Ze=/%5B/g,Qe=/%5D/g,$e=/%5E/g,et=/%60/g,tt=/%7B/g,nt=/%7C/g,rt=/%7D/g,it=/%20/g;function at(e){return e==null?``:encodeURI(``+e).replace(nt,`|`).replace(Ze,`[`).replace(Qe,`]`)}function ot(e){return at(e).replace(tt,`{`).replace(rt,`}`).replace($e,`^`)}function st(e){return at(e).replace(Xe,`%2B`).replace(it,`+`).replace(Ge,`%23`).replace(Ke,`%26`).replace(et,"`").replace(tt,`{`).replace(rt,`}`).replace($e,`^`)}function ct(e){return st(e).replace(Je,`%3D`)}function lt(e){return at(e).replace(Ge,`%23`).replace(Ye,`%3F`)}function ut(e){return lt(e).replace(qe,`%2F`)}function dt(e){if(e==null)return null;try{return decodeURIComponent(``+e)}catch{}return``+e}var ft=/\/$/,pt=e=>e.replace(ft,``);function mt(e,t,n=`/`){let r,i={},a=``,o=``,s=t.indexOf(`#`),c=t.indexOf(`?`);return c=s>=0&&c>s?-1:c,c>=0&&(r=t.slice(0,c),a=t.slice(c,s>0?s:t.length),i=e(a.slice(1))),s>=0&&(r||=t.slice(0,s),o=t.slice(s,t.length)),r=St(r??t,n),{fullPath:r+a+o,path:r,query:i,hash:dt(o)}}function ht(e,t){let n=t.query?e(t.query):``;return t.path+(n&&`?`)+n+(t.hash||``)}function gt(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||`/`}function _t(e,t,n){let r=t.matched.length-1,i=n.matched.length-1;return r>-1&&r===i&&vt(t.matched[r],n.matched[i])&&yt(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function vt(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function yt(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!bt(e[n],t[n]))return!1;return!0}function bt(e,t){return j(e)?xt(e,t):j(t)?xt(t,e):(e&&e.valueOf())===(t&&t.valueOf())}function xt(e,t){return j(t)?e.length===t.length&&e.every((e,n)=>e===t[n]):e.length===1&&e[0]===t}function St(e,t){if(e.startsWith(`/`))return e;if(!e)return t;let n=t.split(`/`),r=e.split(`/`),i=r[r.length-1];(i===`..`||i===`.`)&&r.push(``);let a=n.length-1,o,s;for(o=0;o1&&a--;else break;return n.slice(0,a).join(`/`)+`/`+r.slice(o).join(`/`)}var P={path:`/`,name:void 0,params:{},query:{},hash:``,fullPath:`/`,matched:[],meta:{},redirectedFrom:void 0},Ct=function(e){return e.pop=`pop`,e.push=`push`,e}({}),wt=function(e){return e.back=`back`,e.forward=`forward`,e.unknown=``,e}({});function Tt(e){if(!e)if(Ae){let t=document.querySelector(`base`);e=t&&t.getAttribute(`href`)||`/`,e=e.replace(/^\w+:\/\/[^\/]+/,``)}else e=`/`;return e[0]!==`/`&&e[0]!==`#`&&(e=`/`+e),pt(e)}var Et=/^[^#]+#/;function Dt(e,t){return e.replace(Et,`#`)+t}function Ot(e,t){let n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}var kt=()=>({left:window.scrollX,top:window.scrollY});function At(e){let t;if(`el`in e){let n=e.el,r=typeof n==`string`&&n.startsWith(`#`),i=typeof n==`string`?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!i)return;t=Ot(i,e)}else t=e;`scrollBehavior`in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left==null?window.scrollX:t.left,t.top==null?window.scrollY:t.top)}function jt(e,t){return(history.state?history.state.position-t:-1)+e}var Mt=new Map;function Nt(e,t){Mt.set(e,t)}function Pt(e){let t=Mt.get(e);return Mt.delete(e),t}function Ft(e){return typeof e==`string`||e&&typeof e==`object`}function It(e){return typeof e==`string`||typeof e==`symbol`}function Lt(e){let t={};if(e===``||e===`?`)return t;let n=(e[0]===`?`?e.slice(1):e).split(`&`);for(let e=0;ee&&st(e)):[r&&st(r)]).forEach(e=>{e!==void 0&&(t+=(t.length?`&`:``)+n,e!=null&&(t+=`=`+e))})}return t}function zt(e){let t={};for(let n in e){let r=e[n];r!==void 0&&(t[n]=j(r)?r.map(e=>e==null?null:``+e):r==null?r:``+r)}return t}function Bt(){let e=[];function t(t){return e.push(t),()=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function Vt(e,t,n){let r=e.value;if(!r)return;let i=r,a=()=>{i[t].delete(n)};S(a),u(a),g(()=>{let r=e.value;r&&(i=r),i[t].add(n)}),i[t].add(n)}function Ht(e){Vt(x(Re,{}),`leaveGuards`,e)}function Ut(e){Vt(x(Re,{}),`updateGuards`,e)}function F(e,t,n,r,i,a=e=>e()){let o=r&&(r.enterCallbacks[i]=r.enterCallbacks[i]||[]);return()=>new Promise((s,c)=>{let l=e=>{e===!1?c(Le(M.NAVIGATION_ABORTED,{from:n,to:t})):e instanceof Error?c(e):Ft(e)?c(Le(M.NAVIGATION_GUARD_REDIRECT,{from:t,to:e})):(o&&r.enterCallbacks[i]===o&&typeof e==`function`&&o.push(e),s())},u=a(()=>e.call(r&&r.instances[i],t,n,l)),d=Promise.resolve(u);e.length<3&&(d=d.then(l)),d.catch(e=>c(e))})}function Wt(e,t,n,r,i=e=>e()){let a=[];for(let o of e)for(let e in o.components){let s=o.components[e];if(!(t!==`beforeRouteEnter`&&!o.instances[e]))if(je(s)){let c=(s.__vccOpts||s)[t];c&&a.push(F(c,n,r,o,e,i))}else{let c=s();a.push(()=>c.then(a=>{if(!a)throw Error(`Couldn't resolve component "${e}" at "${o.path}"`);let s=Me(a)?a.default:a;o.mods[e]=a,o.components[e]=s;let c=(s.__vccOpts||s)[t];return c&&F(c,n,r,o,e,i)()}))}}return a}function Gt(e,t){let n=[],r=[],i=[],a=Math.max(t.matched.length,e.matched.length);for(let o=0;ovt(e,a))?r.push(a):n.push(a));let s=e.matched[o];s&&(t.matched.find(e=>vt(e,s))||i.push(s))}return[n,r,i]}var Kt=()=>location.protocol+`//`+location.host;function qt(e,t){let{pathname:n,search:r,hash:i}=t,a=e.indexOf(`#`);if(a>-1){let t=i.includes(e.slice(a))?e.slice(a).length:1,n=i.slice(t);return n[0]!==`/`&&(n=`/`+n),gt(n,``)}return gt(n,e)+r+i}function Jt(e,t,n,r){let i=[],a=[],o=null,s=({state:a})=>{let s=qt(e,location),c=n.value,l=t.value,u=0;if(a){if(n.value=s,t.value=a,o&&o===c){o=null;return}u=l?a.position-l.position:0}else r(s);i.forEach(e=>{e(n.value,c,{delta:u,type:Ct.pop,direction:u?u>0?wt.forward:wt.back:wt.unknown})})};function c(){o=n.value}function l(e){i.push(e);let t=()=>{let t=i.indexOf(e);t>-1&&i.splice(t,1)};return a.push(t),t}function u(){if(document.visibilityState===`hidden`){let{history:e}=window;if(!e.state)return;e.replaceState(A({},e.state,{scroll:kt()}),``)}}function d(){for(let e of a)e();a=[],window.removeEventListener(`popstate`,s),window.removeEventListener(`pagehide`,u),document.removeEventListener(`visibilitychange`,u)}return window.addEventListener(`popstate`,s),window.addEventListener(`pagehide`,u),document.addEventListener(`visibilitychange`,u),{pauseListeners:c,listen:l,destroy:d}}function Yt(e,t,n,r=!1,i=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:i?kt():null}}function Xt(e){let{history:t,location:n}=window,r={value:qt(e,n)},i={value:t.state};i.value||a(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function a(r,a,o){let s=e.indexOf(`#`),c=s>-1?(n.host&&document.querySelector(`base`)?e:e.slice(s))+r:Kt()+e+r;try{t[o?`replaceState`:`pushState`](a,``,c),i.value=a}catch(e){console.error(e),n[o?`replace`:`assign`](c)}}function o(e,n){a(e,A({},t.state,Yt(i.value.back,e,i.value.forward,!0),n,{position:i.value.position}),!0),r.value=e}function s(e,n){let o=A({},i.value,t.state,{forward:e,scroll:kt()});a(o.current,o,!0),a(e,A({},Yt(r.value,e,null),{position:o.position+1},n),!1),r.value=e}return{location:r,state:i,push:s,replace:o}}function Zt(e){e=Tt(e);let t=Xt(e),n=Jt(e,t.state,t.location,t.replace);function r(e,t=!0){t||n.pauseListeners(),history.go(e)}let i=A({location:``,base:e,go:r,createHref:Dt.bind(null,e)},t,n);return Object.defineProperty(i,`location`,{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(i,`state`,{enumerable:!0,get:()=>t.state.value}),i}var I=function(e){return e[e.Static=0]=`Static`,e[e.Param=1]=`Param`,e[e.Group=2]=`Group`,e}({}),L=function(e){return e[e.Static=0]=`Static`,e[e.Param=1]=`Param`,e[e.ParamRegExp=2]=`ParamRegExp`,e[e.ParamRegExpEnd=3]=`ParamRegExpEnd`,e[e.EscapeNext=4]=`EscapeNext`,e}(L||{}),Qt={type:I.Static,value:``},$t=/[a-zA-Z0-9_]/;function en(e){if(!e)return[[]];if(e===`/`)return[[Qt]];if(!e.startsWith(`/`))throw Error(`Invalid path "${e}"`);function t(e){throw Error(`ERR (${n})/"${l}": ${e}`)}let n=L.Static,r=n,i=[],a;function o(){a&&i.push(a),a=[]}let s=0,c,l=``,u=``;function d(){l&&=(n===L.Static?a.push({type:I.Static,value:l}):n===L.Param||n===L.ParamRegExp||n===L.ParamRegExpEnd?(a.length>1&&(c===`*`||c===`+`)&&t(`A repeatable param (${l}) must be alone in its segment. eg: '/:ids+.`),a.push({type:I.Param,value:l,regexp:u,repeatable:c===`*`||c===`+`,optional:c===`*`||c===`?`})):t(`Invalid state to consume buffer`),``)}function f(){l+=c}for(;st.length?t.length===1&&t[0]===R.Static+R.Segment?1:-1:0}function sn(e,t){let n=0,r=e.score,i=t.score;for(;n0&&t[t.length-1]<0}var ln={strict:!1,end:!0,sensitive:!1};function un(e,t,n){let r=A(an(en(e.path),n),{record:e,parent:t,children:[],alias:[]});return t&&!r.record.aliasOf==!t.record.aliasOf&&t.children.push(r),r}function dn(e,t){let n=[],r=new Map;t=Fe(ln,t);function i(e){return r.get(e)}function a(e,n,r){let i=!r,s=pn(e);s.aliasOf=r&&r.record;let l=Fe(t,e),u=[s];if(`alias`in e){let t=typeof e.alias==`string`?[e.alias]:e.alias;for(let e of t)u.push(pn(A({},s,{components:r?r.record.components:s.components,path:e,aliasOf:r?r.record:s})))}let d,f;for(let t of u){let{path:u}=t;if(n&&u[0]!==`/`){let e=n.record.path,r=e[e.length-1]===`/`?``:`/`;t.path=n.record.path+(u&&r+u)}if(d=un(t,n,l),r?r.alias.push(d):(f||=d,f!==d&&f.alias.push(d),i&&e.name&&!hn(d)&&o(e.name)),yn(d)&&c(d),s.children){let e=s.children;for(let t=0;t{o(f)}:Pe}function o(e){if(It(e)){let t=r.get(e);t&&(r.delete(e),n.splice(n.indexOf(t),1),t.children.forEach(o),t.alias.forEach(o))}else{let t=n.indexOf(e);t>-1&&(n.splice(t,1),e.record.name&&r.delete(e.record.name),e.children.forEach(o),e.alias.forEach(o))}}function s(){return n}function c(e){let t=_n(e,n);n.splice(t,0,e),e.record.name&&!hn(e)&&r.set(e.record.name,e)}function l(e,t){let i,a={},o,s;if(`name`in e&&e.name){if(i=r.get(e.name),!i)throw Le(M.MATCHER_NOT_FOUND,{location:e});s=i.record.name,a=A(fn(t.params,i.keys.filter(e=>!e.optional).concat(i.parent?i.parent.keys.filter(e=>e.optional):[]).map(e=>e.name)),e.params&&fn(e.params,i.keys.map(e=>e.name))),o=i.stringify(a)}else if(e.path!=null)o=e.path,i=n.find(e=>e.re.test(o)),i&&(a=i.parse(o),s=i.record.name);else{if(i=t.name?r.get(t.name):n.find(e=>e.re.test(t.path)),!i)throw Le(M.MATCHER_NOT_FOUND,{location:e,currentLocation:t});s=i.record.name,a=A({},t.params,e.params),o=i.stringify(a)}let c=[],l=i;for(;l;)c.unshift(l.record),l=l.parent;return{name:s,path:o,params:a,matched:c,meta:gn(c)}}e.forEach(e=>a(e));function u(){n.length=0,r.clear()}return{addRoute:a,resolve:l,removeRoute:o,clearRoutes:u,getRoutes:s,getRecordMatcher:i}}function fn(e,t){let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}function pn(e){let t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:mn(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:`components`in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,`mods`,{value:{}}),t}function mn(e){let t={},n=e.props||!1;if(`component`in e)t.default=n;else for(let r in e.components)t[r]=typeof n==`object`?n[r]:n;return t}function hn(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function gn(e){return e.reduce((e,t)=>A(e,t.meta),{})}function _n(e,t){let n=0,r=t.length;for(;n!==r;){let i=n+r>>1;sn(e,t[i])<0?r=i:n=i+1}let i=vn(e);return i&&(r=t.lastIndexOf(i,r-1)),r}function vn(e){let t=e;for(;t=t.parent;)if(yn(t)&&sn(e,t)===0)return t}function yn({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function bn(e){let t=x(Be),n=x(Ve),r=y(()=>{let n=m(e.to);return t.resolve(n)}),i=y(()=>{let{matched:e}=r.value,{length:t}=e,i=e[t-1],a=n.matched;if(!i||!a.length)return-1;let o=a.findIndex(vt.bind(null,i));if(o>-1)return o;let s=Tn(e[t-2]);return t>1&&Tn(i)===s&&a[a.length-1].path!==s?a.findIndex(vt.bind(null,e[t-2])):o}),a=y(()=>i.value>-1&&wn(n.params,r.value.params)),o=y(()=>i.value>-1&&i.value===n.matched.length-1&&yt(n.params,r.value.params));function s(n={}){if(Cn(n)){let n=t[m(e.replace)?`replace`:`push`](m(e.to)).catch(Pe);return e.viewTransition&&typeof document<`u`&&`startViewTransition`in document&&document.startViewTransition(()=>n),n}return Promise.resolve()}return{route:r,href:y(()=>r.value.href),isActive:a,isExactActive:o,navigate:s}}function xn(e){return e.length===1?e[0]:e}var Sn=v({name:`RouterLink`,compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:`page`},viewTransition:Boolean},useLink:bn,setup(e,{slots:t}){let n=f(bn(e)),{options:r}=x(Be),i=y(()=>({[En(e.activeClass,r.linkActiveClass,`router-link-active`)]:n.isActive,[En(e.exactActiveClass,r.linkExactActiveClass,`router-link-exact-active`)]:n.isExactActive}));return()=>{let r=t.default&&xn(t.default(n));return e.custom?r:_(`a`,{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:i.value},r)}}});function Cn(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){let t=e.currentTarget.getAttribute(`target`);if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function wn(e,t){for(let n in t){let r=t[n],i=e[n];if(typeof r==`string`){if(r!==i)return!1}else if(!j(i)||i.length!==r.length||r.some((e,t)=>e.valueOf()!==i[t].valueOf()))return!1}return!0}function Tn(e){return e?e.aliasOf?e.aliasOf.path:e.path:``}var En=(e,t,n)=>e??t??n,Dn=v({name:`RouterView`,inheritAttrs:!1,props:{name:{type:String,default:`default`},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:r}){let i=x(He),a=y(()=>e.route||i.value),o=x(ze,0),s=y(()=>{let e=m(o),{matched:t}=a.value,n;for(;(n=t[e])&&!n.components;)e++;return e}),c=y(()=>a.value.matched[s.value]);n(ze,y(()=>s.value+1)),n(Re,c),n(He,a);let l=d();return ee(()=>[l.value,c.value,e.name],([e,t,n],[r,i,a])=>{t&&(t.instances[n]=e,i&&i!==t&&e&&e===r&&(t.leaveGuards.size||(t.leaveGuards=i.leaveGuards),t.updateGuards.size||(t.updateGuards=i.updateGuards))),e&&t&&(!i||!vt(t,i)||!r)&&(t.enterCallbacks[n]||[]).forEach(t=>t(e))},{flush:`post`}),()=>{let n=a.value,i=e.name,o=c.value,s=o&&o.components[i];if(!s)return On(r.default,{Component:s,route:n});let u=o.props[i],d=_(s,A({},u?u===!0?n.params:typeof u==`function`?u(n):u:null,t,{onVnodeUnmounted:e=>{e.component.isUnmounted&&(o.instances[i]=null)},ref:l}));return On(r.default,{Component:d,route:n})||d}}});function On(e,t){if(!e)return null;let n=e(t);return n.length===1?n[0]:n}var kn=Dn;function An(e){let t=dn(e.routes,e),n=e.parseQuery||Lt,r=e.stringifyQuery||Rt,a=e.history,o=Bt(),s=Bt(),c=Bt(),l=i(P),u=P;Ae&&e.scrollBehavior&&`scrollRestoration`in history&&(history.scrollRestoration=`manual`);let d=Ne.bind(null,e=>``+e),f=Ne.bind(null,ut),h=Ne.bind(null,dt);function g(e,n){let r,i;return It(e)?(r=t.getRecordMatcher(e),i=n):i=e,t.addRoute(i,r)}function _(e){let n=t.getRecordMatcher(e);n&&t.removeRoute(n)}function v(){return t.getRoutes().map(e=>e.record)}function ee(e){return!!t.getRecordMatcher(e)}function y(e,i){if(i=A({},i||l.value),typeof e==`string`){let r=mt(n,e,i.path),o=t.resolve({path:r.path},i),s=a.createHref(r.fullPath);return A(r,o,{params:h(o.params),hash:dt(r.hash),redirectedFrom:void 0,href:s})}let o;if(e.path!=null)o=A({},e,{path:mt(n,e.path,i.path).path});else{let t=A({},e.params);for(let e in t)t[e]??delete t[e];o=A({},e,{params:f(t)}),i.params=f(i.params)}let s=t.resolve(o,i),c=e.hash||``;s.params=d(h(s.params));let u=ht(r,A({},e,{hash:ot(c),path:s.path})),p=a.createHref(u);return A({fullPath:u,hash:c,query:r===Rt?zt(e.query):e.query||{}},s,{redirectedFrom:void 0,href:p})}function b(e){return typeof e==`string`?mt(n,e,l.value.path):A({},e)}function x(e,t){if(u!==e)return Le(M.NAVIGATION_CANCELLED,{from:t,to:e})}function S(e){return w(e)}function te(e){return S(A(b(e),{replace:!0}))}function ne(e,t){let n=e.matched[e.matched.length-1];if(n&&n.redirect){let{redirect:r}=n,i=typeof r==`function`?r(e,t):r;return typeof i==`string`&&(i=i.includes(`?`)||i.includes(`#`)?i=b(i):{path:i},i.params={}),A({query:e.query,hash:e.hash,params:i.path==null?e.params:{}},i)}}function w(e,t){let n=u=y(e),i=l.value,a=e.state,o=e.force,s=e.replace===!0,c=ne(n,i);if(c)return w(A(b(c),{state:typeof c==`object`?A({},a,c.state):a,force:o,replace:s}),t||n);let d=n;d.redirectedFrom=t;let f;return!o&&_t(r,i,n)&&(f=Le(M.NAVIGATION_DUPLICATED,{to:d,from:i}),me(i,i,!0,!1)),(f?Promise.resolve(f):ie(d,i)).catch(e=>N(e)?N(e,M.NAVIGATION_GUARD_REDIRECT)?e:pe(e):de(e,d,i)).then(e=>{if(e){if(N(e,M.NAVIGATION_GUARD_REDIRECT))return w(A({replace:s},b(e.to),{state:typeof e.to==`object`?A({},a,e.to.state):a,force:o}),t||d)}else e=oe(d,i,!0,s,a);return ae(d,i,e),e})}function re(e,t){let n=x(e,t);return n?Promise.reject(n):Promise.resolve()}function T(e){let t=_e.values().next().value;return t&&typeof t.runWithContext==`function`?t.runWithContext(e):e()}function ie(e,t){let n,[r,i,a]=Gt(e,t);n=Wt(r.reverse(),`beforeRouteLeave`,e,t);for(let i of r)i.leaveGuards.forEach(r=>{n.push(F(r,e,t))});let c=re.bind(null,e,t);return n.push(c),O(n).then(()=>{n=[];for(let r of o.list())n.push(F(r,e,t));return n.push(c),O(n)}).then(()=>{n=Wt(i,`beforeRouteUpdate`,e,t);for(let r of i)r.updateGuards.forEach(r=>{n.push(F(r,e,t))});return n.push(c),O(n)}).then(()=>{n=[];for(let r of a)if(r.beforeEnter)if(j(r.beforeEnter))for(let i of r.beforeEnter)n.push(F(i,e,t));else n.push(F(r.beforeEnter,e,t));return n.push(c),O(n)}).then(()=>(e.matched.forEach(e=>e.enterCallbacks={}),n=Wt(a,`beforeRouteEnter`,e,t,T),n.push(c),O(n))).then(()=>{n=[];for(let r of s.list())n.push(F(r,e,t));return n.push(c),O(n)}).catch(e=>N(e,M.NAVIGATION_CANCELLED)?e:Promise.reject(e))}function ae(e,t,n){c.list().forEach(r=>T(()=>r(e,t,n)))}function oe(e,t,n,r,i){let o=x(e,t);if(o)return o;let s=t===P,c=Ae?history.state:{};n&&(r||s?a.replace(e.fullPath,A({scroll:s&&c&&c.scroll},i)):a.push(e.fullPath,i)),l.value=e,me(e,t,n,s),pe()}let se;function ce(){se||=a.listen((e,t,n)=>{if(!D.listening)return;let r=y(e),i=ne(r,D.currentRoute.value);if(i){w(A(i,{replace:!0,force:!0}),r).catch(Pe);return}u=r;let o=l.value;Ae&&Nt(jt(o.fullPath,n.delta),kt()),ie(r,o).catch(e=>N(e,M.NAVIGATION_ABORTED|M.NAVIGATION_CANCELLED)?e:N(e,M.NAVIGATION_GUARD_REDIRECT)?(w(A(b(e.to),{force:!0}),r).then(e=>{N(e,M.NAVIGATION_ABORTED|M.NAVIGATION_DUPLICATED)&&!n.delta&&n.type===Ct.pop&&a.go(-1,!1)}).catch(Pe),Promise.reject()):(n.delta&&a.go(-n.delta,!1),de(e,r,o))).then(e=>{e||=oe(r,o,!1),e&&(n.delta&&!N(e,M.NAVIGATION_CANCELLED)?a.go(-n.delta,!1):n.type===Ct.pop&&N(e,M.NAVIGATION_ABORTED|M.NAVIGATION_DUPLICATED)&&a.go(-1,!1)),ae(r,o,e)}).catch(Pe)})}let le=Bt(),ue=Bt(),E;function de(e,t,n){pe(e);let r=ue.list();return r.length?r.forEach(r=>r(e,t,n)):console.error(e),Promise.reject(e)}function fe(){return E&&l.value!==P?Promise.resolve():new Promise((e,t)=>{le.add([e,t])})}function pe(e){return E||(E=!e,ce(),le.list().forEach(([t,n])=>e?n(e):t()),le.reset()),e}function me(t,n,r,i){let{scrollBehavior:a}=e;if(!Ae||!a)return Promise.resolve();let o=!r&&Pt(jt(t.fullPath,0))||(i||!r)&&history.state&&history.state.scroll||null;return C().then(()=>a(t,n,o)).then(e=>e&&At(e)).catch(e=>de(e,t,n))}let he=e=>a.go(e),ge,_e=new Set,D={currentRoute:l,listening:!0,addRoute:g,removeRoute:_,clearRoutes:t.clearRoutes,hasRoute:ee,getRoutes:v,resolve:y,options:e,push:S,replace:te,go:he,back:()=>he(-1),forward:()=>he(1),beforeEach:o.add,beforeResolve:s.add,afterEach:c.add,onError:ue.add,isReady:fe,install(e){e.component(`RouterLink`,Sn),e.component(`RouterView`,kn),e.config.globalProperties.$router=D,Object.defineProperty(e.config.globalProperties,`$route`,{enumerable:!0,get:()=>m(l)}),Ae&&!ge&&l.value===P&&(ge=!0,S(a.location).catch(e=>{}));let t={};for(let e in P)Object.defineProperty(t,e,{get:()=>l.value[e],enumerable:!0});e.provide(Be,D),e.provide(Ve,p(t)),e.provide(He,l);let n=e.unmount;_e.add(e),e.unmount=function(){_e.delete(e),_e.size<1&&(u=P,se&&se(),se=null,l.value=P,ge=!1,E=!1),n()}}};function O(e){return e.reduce((e,t)=>e.then(()=>T(t)),Promise.resolve())}return D}function jn(e,t){return function(){return e.apply(t,arguments)}}var{toString:Mn}=Object.prototype,{getPrototypeOf:Nn}=Object,{iterator:Pn,toStringTag:Fn}=Symbol,In=(e=>t=>{let n=Mn.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),z=e=>(e=e.toLowerCase(),t=>In(t)===e),Ln=e=>t=>typeof t===e,{isArray:Rn}=Array,zn=Ln(`undefined`);function Bn(e){return e!==null&&!zn(e)&&e.constructor!==null&&!zn(e.constructor)&&B(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}var Vn=z(`ArrayBuffer`);function Hn(e){let t;return t=typeof ArrayBuffer<`u`&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&Vn(e.buffer),t}var Un=Ln(`string`),B=Ln(`function`),Wn=Ln(`number`),Gn=e=>typeof e==`object`&&!!e,Kn=e=>e===!0||e===!1,qn=e=>{if(In(e)!==`object`)return!1;let t=Nn(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Fn in e)&&!(Pn in e)},Jn=e=>{if(!Gn(e)||Bn(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},Yn=z(`Date`),Xn=z(`File`),Zn=e=>!!(e&&e.uri!==void 0),Qn=e=>e&&e.getParts!==void 0,$n=z(`Blob`),er=z(`FileList`),tr=e=>Gn(e)&&B(e.pipe);function nr(){return typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof window<`u`?window:typeof global<`u`?global:{}}var rr=nr(),ir=rr.FormData===void 0?void 0:rr.FormData,ar=e=>{let t;return e&&(ir&&e instanceof ir||B(e.append)&&((t=In(e))===`formdata`||t===`object`&&B(e.toString)&&e.toString()===`[object FormData]`))},or=z(`URLSearchParams`),[sr,cr,lr,ur]=[`ReadableStream`,`Request`,`Response`,`Headers`].map(z),dr=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,``);function fr(e,t,{allOwnKeys:n=!1}={}){if(e==null)return;let r,i;if(typeof e!=`object`&&(e=[e]),Rn(e))for(r=0,i=e.length;r0;)if(i=n[r],t===i.toLowerCase())return i;return null}var V=typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof window<`u`?window:global,mr=e=>!zn(e)&&e!==V;function hr(){let{caseless:e,skipUndefined:t}=mr(this)&&this||{},n={},r=(r,i)=>{if(i===`__proto__`||i===`constructor`||i===`prototype`)return;let a=e&&pr(n,i)||i;qn(n[a])&&qn(r)?n[a]=hr(n[a],r):qn(r)?n[a]=hr({},r):Rn(r)?n[a]=r.slice():(!t||!zn(r))&&(n[a]=r)};for(let e=0,t=arguments.length;e(fr(t,(t,r)=>{n&&B(t)?Object.defineProperty(e,r,{value:jn(t,n),writable:!0,enumerable:!0,configurable:!0}):Object.defineProperty(e,r,{value:t,writable:!0,enumerable:!0,configurable:!0})},{allOwnKeys:r}),e),_r=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),vr=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),Object.defineProperty(e.prototype,`constructor`,{value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,`super`,{value:t.prototype}),n&&Object.assign(e.prototype,n)},yr=(e,t,n,r)=>{let i,a,o,s={};if(t||={},e==null)return t;do{for(i=Object.getOwnPropertyNames(e),a=i.length;a-- >0;)o=i[a],(!r||r(o,e,t))&&!s[o]&&(t[o]=e[o],s[o]=!0);e=n!==!1&&Nn(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},br=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;let r=e.indexOf(t,n);return r!==-1&&r===n},xr=e=>{if(!e)return null;if(Rn(e))return e;let t=e.length;if(!Wn(t))return null;let n=Array(t);for(;t-- >0;)n[t]=e[t];return n},Sr=(e=>t=>e&&t instanceof e)(typeof Uint8Array<`u`&&Nn(Uint8Array)),Cr=(e,t)=>{let n=(e&&e[Pn]).call(e),r;for(;(r=n.next())&&!r.done;){let n=r.value;t.call(e,n[0],n[1])}},wr=(e,t)=>{let n,r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},Tr=z(`HTMLFormElement`),Er=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(e,t,n){return t.toUpperCase()+n}),Dr=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),Or=z(`RegExp`),kr=(e,t)=>{let n=Object.getOwnPropertyDescriptors(e),r={};fr(n,(n,i)=>{let a;(a=t(n,i,e))!==!1&&(r[i]=a||n)}),Object.defineProperties(e,r)},Ar=e=>{kr(e,(t,n)=>{if(B(e)&&[`arguments`,`caller`,`callee`].indexOf(n)!==-1)return!1;let r=e[n];if(B(r)){if(t.enumerable=!1,`writable`in t){t.writable=!1;return}t.set||=()=>{throw Error(`Can not rewrite read-only method '`+n+`'`)}}})},jr=(e,t)=>{let n={},r=e=>{e.forEach(e=>{n[e]=!0})};return Rn(e)?r(e):r(String(e).split(t)),n},Mr=()=>{},Nr=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function Pr(e){return!!(e&&B(e.append)&&e[Fn]===`FormData`&&e[Pn])}var Fr=e=>{let t=Array(10),n=(e,r)=>{if(Gn(e)){if(t.indexOf(e)>=0)return;if(Bn(e))return e;if(!(`toJSON`in e)){t[r]=e;let i=Rn(e)?[]:{};return fr(e,(e,t)=>{let a=n(e,r+1);!zn(a)&&(i[t]=a)}),t[r]=void 0,i}}return e};return n(e,0)},Ir=z(`AsyncFunction`),Lr=e=>e&&(Gn(e)||B(e))&&B(e.then)&&B(e.catch),Rr=((e,t)=>e?setImmediate:t?((e,t)=>(V.addEventListener(`message`,({source:n,data:r})=>{n===V&&r===e&&t.length&&t.shift()()},!1),n=>{t.push(n),V.postMessage(e,`*`)}))(`axios@${Math.random()}`,[]):e=>setTimeout(e))(typeof setImmediate==`function`,B(V.postMessage)),H={isArray:Rn,isArrayBuffer:Vn,isBuffer:Bn,isFormData:ar,isArrayBufferView:Hn,isString:Un,isNumber:Wn,isBoolean:Kn,isObject:Gn,isPlainObject:qn,isEmptyObject:Jn,isReadableStream:sr,isRequest:cr,isResponse:lr,isHeaders:ur,isUndefined:zn,isDate:Yn,isFile:Xn,isReactNativeBlob:Zn,isReactNative:Qn,isBlob:$n,isRegExp:Or,isFunction:B,isStream:tr,isURLSearchParams:or,isTypedArray:Sr,isFileList:er,forEach:fr,merge:hr,extend:gr,trim:dr,stripBOM:_r,inherits:vr,toFlatObject:yr,kindOf:In,kindOfTest:z,endsWith:br,toArray:xr,forEachEntry:Cr,matchAll:wr,isHTMLForm:Tr,hasOwnProperty:Dr,hasOwnProp:Dr,reduceDescriptors:kr,freezeMethods:Ar,toObjectSet:jr,toCamelCase:Er,noop:Mr,toFiniteNumber:Nr,findKey:pr,global:V,isContextDefined:mr,isSpecCompliantForm:Pr,toJSONObject:Fr,isAsyncFn:Ir,isThenable:Lr,setImmediate:Rr,asap:typeof queueMicrotask<`u`?queueMicrotask.bind(V):typeof process<`u`&&process.nextTick||Rr,isIterable:e=>e!=null&&B(e[Pn])},U=class e extends Error{static from(t,n,r,i,a,o){let s=new e(t.message,n||t.code,r,i,a);return s.cause=t,s.name=t.name,t.status!=null&&s.status==null&&(s.status=t.status),o&&Object.assign(s,o),s}constructor(e,t,n,r,i){super(e),Object.defineProperty(this,`message`,{value:e,enumerable:!0,writable:!0,configurable:!0}),this.name=`AxiosError`,this.isAxiosError=!0,t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),i&&(this.response=i,this.status=i.status)}toJSON(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:H.toJSONObject(this.config),code:this.code,status:this.status}}};U.ERR_BAD_OPTION_VALUE=`ERR_BAD_OPTION_VALUE`,U.ERR_BAD_OPTION=`ERR_BAD_OPTION`,U.ECONNABORTED=`ECONNABORTED`,U.ETIMEDOUT=`ETIMEDOUT`,U.ERR_NETWORK=`ERR_NETWORK`,U.ERR_FR_TOO_MANY_REDIRECTS=`ERR_FR_TOO_MANY_REDIRECTS`,U.ERR_DEPRECATED=`ERR_DEPRECATED`,U.ERR_BAD_RESPONSE=`ERR_BAD_RESPONSE`,U.ERR_BAD_REQUEST=`ERR_BAD_REQUEST`,U.ERR_CANCELED=`ERR_CANCELED`,U.ERR_NOT_SUPPORT=`ERR_NOT_SUPPORT`,U.ERR_INVALID_URL=`ERR_INVALID_URL`;function zr(e){return H.isPlainObject(e)||H.isArray(e)}function Br(e){return H.endsWith(e,`[]`)?e.slice(0,-2):e}function Vr(e,t,n){return e?e.concat(t).map(function(e,t){return e=Br(e),!n&&t?`[`+e+`]`:e}).join(n?`.`:``):t}function Hr(e){return H.isArray(e)&&!e.some(zr)}var Ur=H.toFlatObject(H,{},null,function(e){return/^is[A-Z]/.test(e)});function Wr(e,t,n){if(!H.isObject(e))throw TypeError(`target must be an object`);t||=new FormData,n=H.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(e,t){return!H.isUndefined(t[e])});let r=n.metaTokens,i=n.visitor||l,a=n.dots,o=n.indexes,s=(n.Blob||typeof Blob<`u`&&Blob)&&H.isSpecCompliantForm(t);if(!H.isFunction(i))throw TypeError(`visitor must be a function`);function c(e){if(e===null)return``;if(H.isDate(e))return e.toISOString();if(H.isBoolean(e))return e.toString();if(!s&&H.isBlob(e))throw new U(`Blob is not supported. Use a Buffer instead.`);return H.isArrayBuffer(e)||H.isTypedArray(e)?s&&typeof Blob==`function`?new Blob([e]):Buffer.from(e):e}function l(e,n,i){let s=e;if(H.isReactNative(t)&&H.isReactNativeBlob(e))return t.append(Vr(i,n,a),c(e)),!1;if(e&&!i&&typeof e==`object`){if(H.endsWith(n,`{}`))n=r?n:n.slice(0,-2),e=JSON.stringify(e);else if(H.isArray(e)&&Hr(e)||(H.isFileList(e)||H.endsWith(n,`[]`))&&(s=H.toArray(e)))return n=Br(n),s.forEach(function(e,r){!(H.isUndefined(e)||e===null)&&t.append(o===!0?Vr([n],r,a):o===null?n:n+`[]`,c(e))}),!1}return zr(e)?!0:(t.append(Vr(i,n,a),c(e)),!1)}let u=[],d=Object.assign(Ur,{defaultVisitor:l,convertValue:c,isVisitable:zr});function f(e,n){if(!H.isUndefined(e)){if(u.indexOf(e)!==-1)throw Error(`Circular reference detected in `+n.join(`.`));u.push(e),H.forEach(e,function(e,r){(!(H.isUndefined(e)||e===null)&&i.call(t,e,H.isString(r)?r.trim():r,n,d))===!0&&f(e,n?n.concat(r):[r])}),u.pop()}}if(!H.isObject(e))throw TypeError(`data must be an object`);return f(e),t}function Gr(e){let t={"!":`%21`,"'":`%27`,"(":`%28`,")":`%29`,"~":`%7E`,"%20":`+`,"%00":`\0`};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(e){return t[e]})}function Kr(e,t){this._pairs=[],e&&Wr(e,this,t)}var qr=Kr.prototype;qr.append=function(e,t){this._pairs.push([e,t])},qr.toString=function(e){let t=e?function(t){return e.call(this,t,Gr)}:Gr;return this._pairs.map(function(e){return t(e[0])+`=`+t(e[1])},``).join(`&`)};function Jr(e){return encodeURIComponent(e).replace(/%3A/gi,`:`).replace(/%24/g,`$`).replace(/%2C/gi,`,`).replace(/%20/g,`+`)}function Yr(e,t,n){if(!t)return e;let r=n&&n.encode||Jr,i=H.isFunction(n)?{serialize:n}:n,a=i&&i.serialize,o;if(o=a?a(t,i):H.isURLSearchParams(t)?t.toString():new Kr(t,i).toString(r),o){let t=e.indexOf(`#`);t!==-1&&(e=e.slice(0,t)),e+=(e.indexOf(`?`)===-1?`?`:`&`)+o}return e}var Xr=class{constructor(){this.handlers=[]}use(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:n?n.synchronous:!1,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&=[]}forEach(e){H.forEach(this.handlers,function(t){t!==null&&e(t)})}},Zr={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0},Qr={isBrowser:!0,classes:{URLSearchParams:typeof URLSearchParams<`u`?URLSearchParams:Kr,FormData:typeof FormData<`u`?FormData:null,Blob:typeof Blob<`u`?Blob:null},protocols:[`http`,`https`,`file`,`blob`,`url`,`data`]},$r=e({hasBrowserEnv:()=>ei,hasStandardBrowserEnv:()=>ni,hasStandardBrowserWebWorkerEnv:()=>ri,navigator:()=>ti,origin:()=>ii}),ei=typeof window<`u`&&typeof document<`u`,ti=typeof navigator==`object`&&navigator||void 0,ni=ei&&(!ti||[`ReactNative`,`NativeScript`,`NS`].indexOf(ti.product)<0),ri=typeof WorkerGlobalScope<`u`&&self instanceof WorkerGlobalScope&&typeof self.importScripts==`function`,ii=ei&&window.location.href||`http://localhost`,W={...$r,...Qr};function ai(e,t){return Wr(e,new W.classes.URLSearchParams,{visitor:function(e,t,n,r){return W.isNode&&H.isBuffer(e)?(this.append(t,e.toString(`base64`)),!1):r.defaultVisitor.apply(this,arguments)},...t})}function oi(e){return H.matchAll(/\w+|\[(\w*)]/g,e).map(e=>e[0]===`[]`?``:e[1]||e[0])}function si(e){let t={},n=Object.keys(e),r,i=n.length,a;for(r=0;r=e.length;return a=!a&&H.isArray(r)?r.length:a,s?(H.hasOwnProp(r,a)?r[a]=[r[a],n]:r[a]=n,!o):((!r[a]||!H.isObject(r[a]))&&(r[a]=[]),t(e,n,r[a],i)&&H.isArray(r[a])&&(r[a]=si(r[a])),!o)}if(H.isFormData(e)&&H.isFunction(e.entries)){let n={};return H.forEachEntry(e,(e,r)=>{t(oi(e),r,n,0)}),n}return null}function li(e,t,n){if(H.isString(e))try{return(t||JSON.parse)(e),H.trim(e)}catch(e){if(e.name!==`SyntaxError`)throw e}return(n||JSON.stringify)(e)}var ui={transitional:Zr,adapter:[`xhr`,`http`,`fetch`],transformRequest:[function(e,t){let n=t.getContentType()||``,r=n.indexOf(`application/json`)>-1,i=H.isObject(e);if(i&&H.isHTMLForm(e)&&(e=new FormData(e)),H.isFormData(e))return r?JSON.stringify(ci(e)):e;if(H.isArrayBuffer(e)||H.isBuffer(e)||H.isStream(e)||H.isFile(e)||H.isBlob(e)||H.isReadableStream(e))return e;if(H.isArrayBufferView(e))return e.buffer;if(H.isURLSearchParams(e))return t.setContentType(`application/x-www-form-urlencoded;charset=utf-8`,!1),e.toString();let a;if(i){if(n.indexOf(`application/x-www-form-urlencoded`)>-1)return ai(e,this.formSerializer).toString();if((a=H.isFileList(e))||n.indexOf(`multipart/form-data`)>-1){let t=this.env&&this.env.FormData;return Wr(a?{"files[]":e}:e,t&&new t,this.formSerializer)}}return i||r?(t.setContentType(`application/json`,!1),li(e)):e}],transformResponse:[function(e){let t=this.transitional||ui.transitional,n=t&&t.forcedJSONParsing,r=this.responseType===`json`;if(H.isResponse(e)||H.isReadableStream(e))return e;if(e&&H.isString(e)&&(n&&!this.responseType||r)){let n=!(t&&t.silentJSONParsing)&&r;try{return JSON.parse(e,this.parseReviver)}catch(e){if(n)throw e.name===`SyntaxError`?U.from(e,U.ERR_BAD_RESPONSE,this,null,this.response):e}}return e}],timeout:0,xsrfCookieName:`XSRF-TOKEN`,xsrfHeaderName:`X-XSRF-TOKEN`,maxContentLength:-1,maxBodyLength:-1,env:{FormData:W.classes.FormData,Blob:W.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:`application/json, text/plain, */*`,"Content-Type":void 0}}};H.forEach([`delete`,`get`,`head`,`post`,`put`,`patch`],e=>{ui.headers[e]={}});var di=H.toObjectSet([`age`,`authorization`,`content-length`,`content-type`,`etag`,`expires`,`from`,`host`,`if-modified-since`,`if-unmodified-since`,`last-modified`,`location`,`max-forwards`,`proxy-authorization`,`referer`,`retry-after`,`user-agent`]),fi=e=>{let t={},n,r,i;return e&&e.split(` `).forEach(function(e){i=e.indexOf(`:`),n=e.substring(0,i).trim().toLowerCase(),r=e.substring(i+1).trim(),!(!n||t[n]&&di[n])&&(n===`set-cookie`?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+`, `+r:r)}),t},pi=Symbol(`internals`);function mi(e){return e&&String(e).trim().toLowerCase()}function hi(e){return e===!1||e==null?e:H.isArray(e)?e.map(hi):String(e).replace(/[\r\n]+$/,``)}function gi(e){let t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g,r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}var _i=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function vi(e,t,n,r,i){if(H.isFunction(r))return r.call(this,t,n);if(i&&(t=n),H.isString(t)){if(H.isString(r))return t.indexOf(r)!==-1;if(H.isRegExp(r))return r.test(t)}}function yi(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(e,t,n)=>t.toUpperCase()+n)}function bi(e,t){let n=H.toCamelCase(` `+t);[`get`,`set`,`has`].forEach(r=>{Object.defineProperty(e,r+n,{value:function(e,n,i){return this[r].call(this,t,e,n,i)},configurable:!0})})}var G=class{constructor(e){e&&this.set(e)}set(e,t,n){let r=this;function i(e,t,n){let i=mi(t);if(!i)throw Error(`header name must be a non-empty string`);let a=H.findKey(r,i);(!a||r[a]===void 0||n===!0||n===void 0&&r[a]!==!1)&&(r[a||t]=hi(e))}let a=(e,t)=>H.forEach(e,(e,n)=>i(e,n,t));if(H.isPlainObject(e)||e instanceof this.constructor)a(e,t);else if(H.isString(e)&&(e=e.trim())&&!_i(e))a(fi(e),t);else if(H.isObject(e)&&H.isIterable(e)){let n={},r,i;for(let t of e){if(!H.isArray(t))throw TypeError(`Object iterator must return a key-value pair`);n[i=t[0]]=(r=n[i])?H.isArray(r)?[...r,t[1]]:[r,t[1]]:t[1]}a(n,t)}else e!=null&&i(t,e,n);return this}get(e,t){if(e=mi(e),e){let n=H.findKey(this,e);if(n){let e=this[n];if(!t)return e;if(t===!0)return gi(e);if(H.isFunction(t))return t.call(this,e,n);if(H.isRegExp(t))return t.exec(e);throw TypeError(`parser must be boolean|regexp|function`)}}}has(e,t){if(e=mi(e),e){let n=H.findKey(this,e);return!!(n&&this[n]!==void 0&&(!t||vi(this,this[n],n,t)))}return!1}delete(e,t){let n=this,r=!1;function i(e){if(e=mi(e),e){let i=H.findKey(n,e);i&&(!t||vi(n,n[i],i,t))&&(delete n[i],r=!0)}}return H.isArray(e)?e.forEach(i):i(e),r}clear(e){let t=Object.keys(this),n=t.length,r=!1;for(;n--;){let i=t[n];(!e||vi(this,this[i],i,e,!0))&&(delete this[i],r=!0)}return r}normalize(e){let t=this,n={};return H.forEach(this,(r,i)=>{let a=H.findKey(n,i);if(a){t[a]=hi(r),delete t[i];return}let o=e?yi(i):String(i).trim();o!==i&&delete t[i],t[o]=hi(r),n[o]=!0}),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){let t=Object.create(null);return H.forEach(this,(n,r)=>{n!=null&&n!==!1&&(t[r]=e&&H.isArray(n)?n.join(`, `):n)}),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([e,t])=>e+`: `+t).join(` `)}getSetCookie(){return this.get(`set-cookie`)||[]}get[Symbol.toStringTag](){return`AxiosHeaders`}static from(e){return e instanceof this?e:new this(e)}static concat(e,...t){let n=new this(e);return t.forEach(e=>n.set(e)),n}static accessor(e){let t=(this[pi]=this[pi]={accessors:{}}).accessors,n=this.prototype;function r(e){let r=mi(e);t[r]||(bi(n,e),t[r]=!0)}return H.isArray(e)?e.forEach(r):r(e),this}};G.accessor([`Content-Type`,`Content-Length`,`Accept`,`Accept-Encoding`,`User-Agent`,`Authorization`]),H.reduceDescriptors(G.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(e){this[n]=e}}}),H.freezeMethods(G);function xi(e,t){let n=this||ui,r=t||n,i=G.from(r.headers),a=r.data;return H.forEach(e,function(e){a=e.call(n,a,i.normalize(),t?t.status:void 0)}),i.normalize(),a}function Si(e){return!!(e&&e.__CANCEL__)}var Ci=class extends U{constructor(e,t,n){super(e??`canceled`,U.ERR_CANCELED,t,n),this.name=`CanceledError`,this.__CANCEL__=!0}};function wi(e,t,n){let r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new U(`Request failed with status code `+n.status,[U.ERR_BAD_REQUEST,U.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function Ti(e){let t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||``}function Ei(e,t){e||=10;let n=Array(e),r=Array(e),i=0,a=0,o;return t=t===void 0?1e3:t,function(s){let c=Date.now(),l=r[a];o||=c,n[i]=s,r[i]=c;let u=a,d=0;for(;u!==i;)d+=n[u++],u%=e;if(i=(i+1)%e,i===a&&(a=(a+1)%e),c-o{n=r,i=null,a&&=(clearTimeout(a),null),e(...t)};return[(...e)=>{let t=Date.now(),s=t-n;s>=r?o(e,t):(i=e,a||=setTimeout(()=>{a=null,o(i)},r-s))},()=>i&&o(i)]}var Oi=(e,t,n=3)=>{let r=0,i=Ei(50,250);return Di(n=>{let a=n.loaded,o=n.lengthComputable?n.total:void 0,s=a-r,c=i(s),l=a<=o;r=a,e({loaded:a,total:o,progress:o?a/o:void 0,bytes:s,rate:c||void 0,estimated:c&&o&&l?(o-a)/c:void 0,event:n,lengthComputable:o!=null,[t?`download`:`upload`]:!0})},n)},ki=(e,t)=>{let n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},Ai=e=>(...t)=>H.asap(()=>e(...t)),ji=W.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,W.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(W.origin),W.navigator&&/(msie|trident)/i.test(W.navigator.userAgent)):()=>!0,Mi=W.hasStandardBrowserEnv?{write(e,t,n,r,i,a,o){if(typeof document>`u`)return;let s=[`${e}=${encodeURIComponent(t)}`];H.isNumber(n)&&s.push(`expires=${new Date(n).toUTCString()}`),H.isString(r)&&s.push(`path=${r}`),H.isString(i)&&s.push(`domain=${i}`),a===!0&&s.push(`secure`),H.isString(o)&&s.push(`SameSite=${o}`),document.cookie=s.join(`; `)},read(e){if(typeof document>`u`)return null;let t=document.cookie.match(RegExp(`(?:^|; )`+e+`=([^;]*)`));return t?decodeURIComponent(t[1]):null},remove(e){this.write(e,``,Date.now()-864e5,`/`)}}:{write(){},read(){return null},remove(){}};function Ni(e){return typeof e==`string`?/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e):!1}function Pi(e,t){return t?e.replace(/\/?\/$/,``)+`/`+t.replace(/^\/+/,``):e}function Fi(e,t,n){let r=!Ni(t);return e&&(r||n==0)?Pi(e,t):t}var Ii=e=>e instanceof G?{...e}:e;function K(e,t){t||={};let n={};function r(e,t,n,r){return H.isPlainObject(e)&&H.isPlainObject(t)?H.merge.call({caseless:r},e,t):H.isPlainObject(t)?H.merge({},t):H.isArray(t)?t.slice():t}function i(e,t,n,i){if(!H.isUndefined(t))return r(e,t,n,i);if(!H.isUndefined(e))return r(void 0,e,n,i)}function a(e,t){if(!H.isUndefined(t))return r(void 0,t)}function o(e,t){if(!H.isUndefined(t))return r(void 0,t);if(!H.isUndefined(e))return r(void 0,e)}function s(n,i,a){if(a in t)return r(n,i);if(a in e)return r(void 0,n)}let c={url:a,method:a,data:a,baseURL:o,transformRequest:o,transformResponse:o,paramsSerializer:o,timeout:o,timeoutMessage:o,withCredentials:o,withXSRFToken:o,adapter:o,responseType:o,xsrfCookieName:o,xsrfHeaderName:o,onUploadProgress:o,onDownloadProgress:o,decompress:o,maxContentLength:o,maxBodyLength:o,beforeRedirect:o,transport:o,httpAgent:o,httpsAgent:o,cancelToken:o,socketPath:o,responseEncoding:o,validateStatus:s,headers:(e,t,n)=>i(Ii(e),Ii(t),n,!0)};return H.forEach(Object.keys({...e,...t}),function(r){if(r===`__proto__`||r===`constructor`||r===`prototype`)return;let a=H.hasOwnProp(c,r)?c[r]:i,o=a(e[r],t[r],r);H.isUndefined(o)&&a!==s||(n[r]=o)}),n}var Li=e=>{let t=K({},e),{data:n,withXSRFToken:r,xsrfHeaderName:i,xsrfCookieName:a,headers:o,auth:s}=t;if(t.headers=o=G.from(o),t.url=Yr(Fi(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),s&&o.set(`Authorization`,`Basic `+btoa((s.username||``)+`:`+(s.password?unescape(encodeURIComponent(s.password)):``))),H.isFormData(n)){if(W.hasStandardBrowserEnv||W.hasStandardBrowserWebWorkerEnv)o.setContentType(void 0);else if(H.isFunction(n.getHeaders)){let e=n.getHeaders(),t=[`content-type`,`content-length`];Object.entries(e).forEach(([e,n])=>{t.includes(e.toLowerCase())&&o.set(e,n)})}}if(W.hasStandardBrowserEnv&&(r&&H.isFunction(r)&&(r=r(t)),r||r!==!1&&ji(t.url))){let e=i&&a&&Mi.read(a);e&&o.set(i,e)}return t},Ri=typeof XMLHttpRequest<`u`&&function(e){return new Promise(function(t,n){let r=Li(e),i=r.data,a=G.from(r.headers).normalize(),{responseType:o,onUploadProgress:s,onDownloadProgress:c}=r,l,u,d,f,p;function m(){f&&f(),p&&p(),r.cancelToken&&r.cancelToken.unsubscribe(l),r.signal&&r.signal.removeEventListener(`abort`,l)}let h=new XMLHttpRequest;h.open(r.method.toUpperCase(),r.url,!0),h.timeout=r.timeout;function g(){if(!h)return;let r=G.from(`getAllResponseHeaders`in h&&h.getAllResponseHeaders());wi(function(e){t(e),m()},function(e){n(e),m()},{data:!o||o===`text`||o===`json`?h.responseText:h.response,status:h.status,statusText:h.statusText,headers:r,config:e,request:h}),h=null}`onloadend`in h?h.onloadend=g:h.onreadystatechange=function(){!h||h.readyState!==4||h.status===0&&!(h.responseURL&&h.responseURL.indexOf(`file:`)===0)||setTimeout(g)},h.onabort=function(){h&&=(n(new U(`Request aborted`,U.ECONNABORTED,e,h)),null)},h.onerror=function(t){let r=new U(t&&t.message?t.message:`Network Error`,U.ERR_NETWORK,e,h);r.event=t||null,n(r),h=null},h.ontimeout=function(){let t=r.timeout?`timeout of `+r.timeout+`ms exceeded`:`timeout exceeded`,i=r.transitional||Zr;r.timeoutErrorMessage&&(t=r.timeoutErrorMessage),n(new U(t,i.clarifyTimeoutError?U.ETIMEDOUT:U.ECONNABORTED,e,h)),h=null},i===void 0&&a.setContentType(null),`setRequestHeader`in h&&H.forEach(a.toJSON(),function(e,t){h.setRequestHeader(t,e)}),H.isUndefined(r.withCredentials)||(h.withCredentials=!!r.withCredentials),o&&o!==`json`&&(h.responseType=r.responseType),c&&([d,p]=Oi(c,!0),h.addEventListener(`progress`,d)),s&&h.upload&&([u,f]=Oi(s),h.upload.addEventListener(`progress`,u),h.upload.addEventListener(`loadend`,f)),(r.cancelToken||r.signal)&&(l=t=>{h&&=(n(!t||t.type?new Ci(null,e,h):t),h.abort(),null)},r.cancelToken&&r.cancelToken.subscribe(l),r.signal&&(r.signal.aborted?l():r.signal.addEventListener(`abort`,l)));let _=Ti(r.url);if(_&&W.protocols.indexOf(_)===-1){n(new U(`Unsupported protocol `+_+`:`,U.ERR_BAD_REQUEST,e));return}h.send(i||null)})},zi=(e,t)=>{let{length:n}=e=e?e.filter(Boolean):[];if(t||n){let n=new AbortController,r,i=function(e){if(!r){r=!0,o();let t=e instanceof Error?e:this.reason;n.abort(t instanceof U?t:new Ci(t instanceof Error?t.message:t))}},a=t&&setTimeout(()=>{a=null,i(new U(`timeout of ${t}ms exceeded`,U.ETIMEDOUT))},t),o=()=>{e&&=(a&&clearTimeout(a),a=null,e.forEach(e=>{e.unsubscribe?e.unsubscribe(i):e.removeEventListener(`abort`,i)}),null)};e.forEach(e=>e.addEventListener(`abort`,i));let{signal:s}=n;return s.unsubscribe=()=>H.asap(o),s}},Bi=function*(e,t){let n=e.byteLength;if(!t||n{let i=Vi(e,t),a=0,o,s=e=>{o||(o=!0,r&&r(e))};return new ReadableStream({async pull(e){try{let{done:t,value:r}=await i.next();if(t){s(),e.close();return}let o=r.byteLength;n&&n(a+=o),e.enqueue(new Uint8Array(r))}catch(e){throw s(e),e}},cancel(e){return s(e),i.return()}},{highWaterMark:2})},Wi=64*1024,{isFunction:Gi}=H,Ki=(({Request:e,Response:t})=>({Request:e,Response:t}))(H.global),{ReadableStream:qi,TextEncoder:Ji}=H.global,Yi=(e,...t)=>{try{return!!e(...t)}catch{return!1}},Xi=e=>{e=H.merge.call({skipUndefined:!0},Ki,e);let{fetch:t,Request:n,Response:r}=e,i=t?Gi(t):typeof fetch==`function`,a=Gi(n),o=Gi(r);if(!i)return!1;let s=i&&Gi(qi),c=i&&(typeof Ji==`function`?(e=>t=>e.encode(t))(new Ji):async e=>new Uint8Array(await new n(e).arrayBuffer())),l=a&&s&&Yi(()=>{let e=!1,t=new qi,r=new n(W.origin,{body:t,method:`POST`,get duplex(){return e=!0,`half`}}).headers.has(`Content-Type`);return t.cancel(),e&&!r}),u=o&&s&&Yi(()=>H.isReadableStream(new r(``).body)),d={stream:u&&(e=>e.body)};i&&[`text`,`arrayBuffer`,`blob`,`formData`,`stream`].forEach(e=>{!d[e]&&(d[e]=(t,n)=>{let r=t&&t[e];if(r)return r.call(t);throw new U(`Response type '${e}' is not supported`,U.ERR_NOT_SUPPORT,n)})});let f=async e=>{if(e==null)return 0;if(H.isBlob(e))return e.size;if(H.isSpecCompliantForm(e))return(await new n(W.origin,{method:`POST`,body:e}).arrayBuffer()).byteLength;if(H.isArrayBufferView(e)||H.isArrayBuffer(e))return e.byteLength;if(H.isURLSearchParams(e)&&(e+=``),H.isString(e))return(await c(e)).byteLength},p=async(e,t)=>H.toFiniteNumber(e.getContentLength())??f(t);return async e=>{let{url:i,method:o,data:s,signal:c,cancelToken:f,timeout:m,onDownloadProgress:h,onUploadProgress:g,responseType:_,headers:v,withCredentials:ee=`same-origin`,fetchOptions:y}=Li(e),b=t||fetch;_=_?(_+``).toLowerCase():`text`;let x=zi([c,f&&f.toAbortSignal()],m),S=null,C=x&&x.unsubscribe&&(()=>{x.unsubscribe()}),te;try{if(g&&l&&o!==`get`&&o!==`head`&&(te=await p(v,s))!==0){let e=new n(i,{method:`POST`,body:s,duplex:`half`}),t;if(H.isFormData(s)&&(t=e.headers.get(`content-type`))&&v.setContentType(t),e.body){let[t,n]=ki(te,Oi(Ai(g)));s=Ui(e.body,Wi,t,n)}}H.isString(ee)||(ee=ee?`include`:`omit`);let t=a&&`credentials`in n.prototype,c={...y,signal:x,method:o.toUpperCase(),headers:v.normalize().toJSON(),body:s,duplex:`half`,credentials:t?ee:void 0};S=a&&new n(i,c);let f=await(a?b(S,y):b(i,c)),m=u&&(_===`stream`||_===`response`);if(u&&(h||m&&C)){let e={};[`status`,`statusText`,`headers`].forEach(t=>{e[t]=f[t]});let t=H.toFiniteNumber(f.headers.get(`content-length`)),[n,i]=h&&ki(t,Oi(Ai(h),!0))||[];f=new r(Ui(f.body,Wi,n,()=>{i&&i(),C&&C()}),e)}_||=`text`;let ne=await d[H.findKey(d,_)||`text`](f,e);return!m&&C&&C(),await new Promise((t,n)=>{wi(t,n,{data:ne,headers:G.from(f.headers),status:f.status,statusText:f.statusText,config:e,request:S})})}catch(t){throw C&&C(),t&&t.name===`TypeError`&&/Load failed|fetch/i.test(t.message)?Object.assign(new U(`Network Error`,U.ERR_NETWORK,e,S,t&&t.response),{cause:t.cause||t}):U.from(t,t&&t.code,e,S,t&&t.response)}}},Zi=new Map,Qi=e=>{let t=e&&e.env||{},{fetch:n,Request:r,Response:i}=t,a=[r,i,n],o=a.length,s,c,l=Zi;for(;o--;)s=a[o],c=l.get(s),c===void 0&&l.set(s,c=o?new Map:Xi(t)),l=c;return c};Qi();var $i={http:null,xhr:Ri,fetch:{get:Qi}};H.forEach($i,(e,t)=>{if(e){try{Object.defineProperty(e,`name`,{value:t})}catch{}Object.defineProperty(e,`adapterName`,{value:t})}});var ea=e=>`- ${e}`,ta=e=>H.isFunction(e)||e===null||e===!1;function na(e,t){e=H.isArray(e)?e:[e];let{length:n}=e,r,i,a={};for(let o=0;o`adapter ${e} `+(t===!1?`is not supported by the environment`:`is not available in the build`));throw new U(`There is no suitable adapter to dispatch the request `+(n?e.length>1?`since : `+e.map(ea).join(` `):` `+ea(e[0]):`as no adapter specified`),`ERR_NOT_SUPPORT`)}return i}var ra={getAdapter:na,adapters:$i};function ia(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ci(null,e)}function aa(e){return ia(e),e.headers=G.from(e.headers),e.data=xi.call(e,e.transformRequest),[`post`,`put`,`patch`].indexOf(e.method)!==-1&&e.headers.setContentType(`application/x-www-form-urlencoded`,!1),ra.getAdapter(e.adapter||ui.adapter,e)(e).then(function(t){return ia(e),t.data=xi.call(e,e.transformResponse,t),t.headers=G.from(t.headers),t},function(t){return Si(t)||(ia(e),t&&t.response&&(t.response.data=xi.call(e,e.transformResponse,t.response),t.response.headers=G.from(t.response.headers))),Promise.reject(t)})}var oa=`1.14.0`,sa={};[`object`,`boolean`,`number`,`function`,`string`,`symbol`].forEach((e,t)=>{sa[e]=function(n){return typeof n===e||`a`+(t<1?`n `:` `)+e}});var ca={};sa.transitional=function(e,t,n){function r(e,t){return`[Axios v`+oa+`] Transitional option '`+e+`'`+t+(n?`. `+n:``)}return(n,i,a)=>{if(e===!1)throw new U(r(i,` has been removed`+(t?` in `+t:``)),U.ERR_DEPRECATED);return t&&!ca[i]&&(ca[i]=!0,console.warn(r(i,` has been deprecated since v`+t+` and will be removed in the near future`))),e?e(n,i,a):!0}},sa.spelling=function(e){return(t,n)=>(console.warn(`${n} is likely a misspelling of ${e}`),!0)};function la(e,t,n){if(typeof e!=`object`)throw new U(`options must be an object`,U.ERR_BAD_OPTION_VALUE);let r=Object.keys(e),i=r.length;for(;i-- >0;){let a=r[i],o=t[a];if(o){let t=e[a],n=t===void 0||o(t,a,e);if(n!==!0)throw new U(`option `+a+` must be `+n,U.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new U(`Unknown option `+a,U.ERR_BAD_OPTION)}}var ua={assertOptions:la,validators:sa},q=ua.validators,da=class{constructor(e){this.defaults=e||{},this.interceptors={request:new Xr,response:new Xr}}async request(e,t){try{return await this._request(e,t)}catch(e){if(e instanceof Error){let t={};Error.captureStackTrace?Error.captureStackTrace(t):t=Error();let n=t.stack?t.stack.replace(/^.+\n/,``):``;try{e.stack?n&&!String(e.stack).endsWith(n.replace(/^.+\n.+\n/,``))&&(e.stack+=` -`+n):e.stack=n}catch{}}throw e}}_request(e,t){typeof e==`string`?(t||={},t.url=e):t=e||{},t=K(this.defaults,t);let{transitional:n,paramsSerializer:r,headers:i}=t;n!==void 0&&ua.assertOptions(n,{silentJSONParsing:q.transitional(q.boolean),forcedJSONParsing:q.transitional(q.boolean),clarifyTimeoutError:q.transitional(q.boolean),legacyInterceptorReqResOrdering:q.transitional(q.boolean)},!1),r!=null&&(H.isFunction(r)?t.paramsSerializer={serialize:r}:ua.assertOptions(r,{encode:q.function,serialize:q.function},!0)),t.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls===void 0?t.allowAbsoluteUrls=!0:t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls),ua.assertOptions(t,{baseUrl:q.spelling(`baseURL`),withXsrfToken:q.spelling(`withXSRFToken`)},!0),t.method=(t.method||this.defaults.method||`get`).toLowerCase();let a=i&&H.merge(i.common,i[t.method]);i&&H.forEach([`delete`,`get`,`head`,`post`,`put`,`patch`,`common`],e=>{delete i[e]}),t.headers=G.concat(a,i);let o=[],s=!0;this.interceptors.request.forEach(function(e){if(typeof e.runWhen==`function`&&e.runWhen(t)===!1)return;s&&=e.synchronous;let n=t.transitional||Zr;n&&n.legacyInterceptorReqResOrdering?o.unshift(e.fulfilled,e.rejected):o.push(e.fulfilled,e.rejected)});let c=[];this.interceptors.response.forEach(function(e){c.push(e.fulfilled,e.rejected)});let l,u=0,d;if(!s){let e=[aa.bind(this),void 0];for(e.unshift(...o),e.push(...c),d=e.length,l=Promise.resolve(t);u{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null}),this.promise.then=e=>{let t,r=new Promise(e=>{n.subscribe(e),t=e}).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e(function(e,r,i){n.reason||(n.reason=new Ci(e,r,i),t(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;let t=this._listeners.indexOf(e);t!==-1&&this._listeners.splice(t,1)}toAbortSignal(){let e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let t;return{token:new e(function(e){t=e}),cancel:t}}};function pa(e){return function(t){return e.apply(null,t)}}function ma(e){return H.isObject(e)&&e.isAxiosError===!0}var ha={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(ha).forEach(([e,t])=>{ha[t]=e});function ga(e){let t=new da(e),n=jn(da.prototype.request,t);return H.extend(n,da.prototype,t,{allOwnKeys:!0}),H.extend(n,t,null,{allOwnKeys:!0}),n.create=function(t){return ga(K(e,t))},n}var J=ga(ui);J.Axios=da,J.CanceledError=Ci,J.CancelToken=fa,J.isCancel=Si,J.VERSION=oa,J.toFormData=Wr,J.AxiosError=U,J.Cancel=J.CanceledError,J.all=function(e){return Promise.all(e)},J.spread=pa,J.isAxiosError=ma,J.mergeConfig=K,J.AxiosHeaders=G,J.formToJSON=e=>ci(H.isHTMLForm(e)?new FormData(e):e),J.getAdapter=ra.getAdapter,J.HttpStatusCode=ha,J.default=J;var _a=`pymc_jwt_token`,va=`pymc_client_id`;function ya(){let e=localStorage.getItem(va);return e||(e=`${Date.now()}-${Math.random().toString(36).substring(2,15)}`,localStorage.setItem(va,e)),e}function Y(){return localStorage.getItem(_a)}function ba(e){localStorage.setItem(_a,e)}function xa(){localStorage.removeItem(_a)}function Sa(){return Y()!==null}function Ca(e){try{let t=e.split(`.`)[1].replace(/-/g,`+`).replace(/_/g,`/`),n=decodeURIComponent(atob(t).split(``).map(e=>`%`+(`00`+e.charCodeAt(0).toString(16)).slice(-2)).join(``));return JSON.parse(n)}catch{return null}}function wa(){let e=Y();if(!e)return!0;let t=Ca(e);return!t||!t.exp?!0:Date.now()>=t.exp*1e3-3e4}function Ta(){let e=Y();if(!e)return!1;let t=Ca(e);if(!t||!t.exp)return!1;let n=t.exp*1e3-Date.now();return n>0&&n<3e5}function Ea(){let e=Y();if(!e)return null;let t=Ca(e);return!t||!t.sub?null:t.sub}var Da=`modulepreload`,Oa=function(e){return`/`+e},ka={},X=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=Oa(t,n),t in ka)return;ka[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:Da,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},Aa=An({history:Zt(`/`),routes:[{path:`/setup`,name:`setup`,component:()=>X(()=>import(`./Setup-DDZDo4fU.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14])),meta:{requiresAuth:!1,requiresSetup:!1}},{path:`/login`,name:`login`,component:()=>X(()=>import(`./Login-BShabpmj.js`),__vite__mapDeps([15,1,2,3,4,5,6,7,8,9,10,11,12,16])),meta:{requiresAuth:!1}},{path:`/`,name:`dashboard`,component:()=>X(()=>import(`./Dashboard-BdHklAFz.js`),__vite__mapDeps([17,1,2,3,4,5,6,7,8,9,10,11,12,18,19,20,21,22])),meta:{requiresAuth:!0}},{path:`/neighbors`,name:`neighbors`,component:()=>X(()=>import(`./Neighbors-DjY7zrgE.js`),__vite__mapDeps([23,1,2,3,4,5,6,7,8,9,10,11,12,24,25,26,20,27,28,29])),meta:{requiresAuth:!0}},{path:`/statistics`,name:`statistics`,component:()=>X(()=>import(`./Statistics-BayfSP13.js`),__vite__mapDeps([30,18,3,5,4,31,32,1,2,6,7,8,9,10,11,12,33])),meta:{requiresAuth:!0}},{path:`/rf-health-correlation`,name:`rf-health-correlation`,component:()=>X(()=>import(`./RfHealthCorrelation-ByArBbzJ.js`),__vite__mapDeps([34,1,2,3,4,5,6,7,8,9,10,11,12,18,31,19,20,21,35])),meta:{requiresAuth:!0}},{path:`/gps`,name:`gps-diagnostics`,component:()=>X(()=>import(`./GPSDiagnostics-DkqSbCiV.js`),__vite__mapDeps([36,1,2,3,4,5,6,7,8,9,10,11,12,37])),meta:{requiresAuth:!0}},{path:`/system-stats`,name:`system-stats`,component:()=>X(()=>import(`./SystemStats-B9UYM5oW.js`),__vite__mapDeps([38,1,2,3,4,5,6,7,8,9,10,11,12,24,18,31,32,33,27,39])),meta:{requiresAuth:!0}},{path:`/sensors`,name:`sensors`,component:()=>X(()=>import(`./Sensors-CT9xtj3s.js`),__vite__mapDeps([40,1,2,3,4,5,6,7,8,9,10,11,12])),meta:{requiresAuth:!0}},{path:`/configuration`,name:`configuration`,component:()=>X(()=>import(`./Configuration-D-blm0qZ.js`),__vite__mapDeps([41,1,2,3,4,5,6,7,8,9,10,11,12,13,42,43,24,44,29,26,27,45])),meta:{requiresAuth:!0}},{path:`/cad-calibration`,name:`cad-calibration`,component:()=>X(()=>import(`./CADCalibration-CVNgGJZz.js`),__vite__mapDeps([46,1,2,3,4,5,6,7,8,9,10,11,12,24,47,48])),meta:{requiresAuth:!0}},{path:`/sessions`,name:`sessions`,component:()=>X(()=>import(`./Sessions-ChyQpfIh.js`),__vite__mapDeps([49,3,4,5])),meta:{requiresAuth:!0}},{path:`/room-servers`,name:`room-servers`,component:()=>X(()=>import(`./RoomServers-BUo8HwN-.js`),__vite__mapDeps([50,1,2,3,4,5,6,7,8,9,10,11,12,42,43,24,44,29,51])),meta:{requiresAuth:!0}},{path:`/companions`,name:`companions`,component:()=>X(()=>import(`./Companions-BvYFdYvx.js`),__vite__mapDeps([52,1,2,3,4,5,6,7,8,9,10,11,12,42,51])),meta:{requiresAuth:!0}},{path:`/logs`,name:`logs`,component:()=>X(()=>import(`./Logs-CrHzoPRp.js`),__vite__mapDeps([53,3,4,5])),meta:{requiresAuth:!0}},{path:`/terminal`,name:`terminal`,component:()=>X(()=>import(`./Terminal-DHlSG9CP.js`),__vite__mapDeps([54,1,2,3,4,5,6,7,8,9,10,11,12,55])),meta:{requiresAuth:!0}},{path:`/help`,name:`help`,component:()=>X(()=>import(`./Help-Dae1qP2Q.js`),__vite__mapDeps([56,3])),meta:{requiresAuth:!0}}]}),ja=!1;async function Ma(){if(ja)return!1;try{let e=await fetch(`/api/needs_setup`,{headers:{Accept:`application/json`}});if(!e.ok)return console.error(`Setup check failed:`,e.status),!1;let t=(await e.json()).needs_setup===!0;return t||(ja=!0),t}catch(e){return console.error(`Error checking setup status:`,e),!1}}Aa.beforeEach(async e=>{if(await Ma())return e.path===`/setup`?void 0:`/setup`;if(e.path===`/setup`)return`/login`;let t=e.meta.requiresAuth!==!1,n=Sa();if(t&&!n)return`/login`;if(e.path===`/login`&&n)return`/`});var Na=Oe(`appRuntime`,()=>{let e=d(typeof navigator>`u`?!0:navigator.onLine),t=d(typeof document>`u`?!0:document.visibilityState===`visible`),n=d(!1),r=d(null),i=d(!1),a=y(()=>e.value&&t.value&&n.value&&!i.value);function o(){n.value=!!Y()&&!wa(),n.value||(r.value=r.value??`expired`)}function s(){n.value=!0,r.value=null,i.value=!1}function c(t){e.value=t}function l(e){t.value=e}async function u(e){if(i.value)return;i.value=!0,r.value=e,n.value=!1;let{useWebSocketStore:t}=await X(async()=>{let{useWebSocketStore:e}=await import(`./websocket-Kj_Cut-p.js`);return{useWebSocketStore:e}},__vite__mapDeps([57,10,3,7,8,9])),{usePacketStore:a}=await X(async()=>{let{usePacketStore:e}=await import(`./packets-BZHES11w.js`);return{usePacketStore:e}},__vite__mapDeps([58,8,3])),{useSystemStore:o}=await X(async()=>{let{useSystemStore:e}=await import(`./system-BoPgpwO9.js`);return{useSystemStore:e}},__vite__mapDeps([59,9,3,8])),{useDataService:s}=await X(async()=>{let{useDataService:e}=await import(`./dataService-k29cfBQr.js`);return{useDataService:e}},__vite__mapDeps([60,7,3,8,9])),c=t(),l=a(),u=o(),d=s();c.disconnect({preventReconnect:!0,silent:e!==`logout`}),l.reset(),u.reset(),d.reset(),xa(),Aa.currentRoute.value.path!==`/login`&&await Aa.push(`/login`),i.value=!1}async function f(e){await u(e)}return{isOnline:e,isDocumentVisible:t,isAuthenticated:n,authFailureReason:r,canMaintainConnections:a,syncAuthState:o,markAuthenticated:s,setOnline:c,setDocumentVisible:l,stopSession:u,handleAuthFailure:f}}),Z=function(e){return e.Json=`application/json`,e.JsonApi=`application/vnd.api+json`,e.FormData=`multipart/form-data`,e.UrlEncoded=`application/x-www-form-urlencoded`,e.Text=`text/plain`,e}({}),Pa=class{baseUrl=`/api`;securityData=null;securityWorker;abortControllers=new Map;customFetch=(...e)=>fetch(...e);baseApiParams={credentials:`same-origin`,headers:{},redirect:`follow`,referrerPolicy:`no-referrer`};constructor(e={}){Object.assign(this,e)}setSecurityData=e=>{this.securityData=e};encodeQueryParam(e,t){return`${encodeURIComponent(e)}=${encodeURIComponent(typeof t==`number`?t:`${t}`)}`}addQueryParam(e,t){return this.encodeQueryParam(t,e[t])}addArrayQueryParam(e,t){return e[t].map(e=>this.encodeQueryParam(t,e)).join(`&`)}toQueryString(e){let t=e||{};return Object.keys(t).filter(e=>t[e]!==void 0).map(e=>Array.isArray(t[e])?this.addArrayQueryParam(t,e):this.addQueryParam(t,e)).join(`&`)}addQueryParams(e){let t=this.toQueryString(e);return t?`?${t}`:``}contentFormatters={[Z.Json]:e=>e!==null&&(typeof e==`object`||typeof e==`string`)?JSON.stringify(e):e,[Z.JsonApi]:e=>e!==null&&(typeof e==`object`||typeof e==`string`)?JSON.stringify(e):e,[Z.Text]:e=>e!==null&&typeof e!=`string`?JSON.stringify(e):e,[Z.FormData]:e=>e instanceof FormData?e:Object.keys(e||{}).reduce((t,n)=>{let r=e[n];return t.append(n,r instanceof Blob?r:typeof r==`object`&&r?JSON.stringify(r):`${r}`),t},new FormData),[Z.UrlEncoded]:e=>this.toQueryString(e)};mergeRequestParams(e,t){return{...this.baseApiParams,...e,...t||{},headers:{...this.baseApiParams.headers||{},...e.headers||{},...t&&t.headers||{}}}}createAbortSignal=e=>{if(this.abortControllers.has(e)){let t=this.abortControllers.get(e);return t?t.signal:void 0}let t=new AbortController;return this.abortControllers.set(e,t),t.signal};abortRequest=e=>{let t=this.abortControllers.get(e);t&&(t.abort(),this.abortControllers.delete(e))};request=async({body:e,secure:t,path:n,type:r,query:i,format:a,baseUrl:o,cancelToken:s,...c})=>{let l=(typeof t==`boolean`?t:this.baseApiParams.secure)&&this.securityWorker&&await this.securityWorker(this.securityData)||{},u=this.mergeRequestParams(c,l),d=i&&this.toQueryString(i),f=this.contentFormatters[r||Z.Json],p=a||u.format;return this.customFetch(`${o||this.baseUrl||``}${n}${d?`?${d}`:``}`,{...u,headers:{...u.headers||{},...r&&r!==Z.FormData?{"Content-Type":r}:{}},signal:(s?this.createAbortSignal(s):u.signal)||null,body:e==null?null:f(e)}).then(async e=>{let t=e;t.data=null,t.error=null;let n=p?e.clone():e,r=p?await n[p]().then(e=>(t.ok?t.data=e:t.error=e,t)).catch(e=>(t.error=e,t)):t;if(s&&this.abortControllers.delete(s),!e.ok)throw r;return r})}},Q=new class extends Pa{auth={loginCreate:(e,t={})=>this.request({path:`/auth/login`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),refreshCreate:(e,t={})=>this.request({path:`/auth/refresh`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t}),verifyList:(e={})=>this.request({path:`/auth/verify`,method:`GET`,secure:!0,format:`json`,...e}),changePasswordCreate:(e,t={})=>this.request({path:`/auth/change_password`,method:`POST`,body:e,secure:!0,type:Z.Json,...t}),tokensList:(e={})=>this.request({path:`/auth/tokens`,method:`GET`,secure:!0,format:`json`,...e}),tokensCreate:(e,t={})=>this.request({path:`/auth/tokens`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t}),tokensDelete:(e,t={})=>this.request({path:`/auth/tokens/${e}`,method:`DELETE`,secure:!0,...t})};stats={statsList:(e={})=>this.request({path:`/stats`,method:`GET`,format:`json`,...e})};gps={getGps:(e={})=>this.request({path:`/gps`,method:`GET`,secure:!0,format:`json`,...e})};gpsStream={gpsStreamList:(e={})=>this.request({path:`/gps_stream`,method:`GET`,...e})};sendAdvert={sendAdvertCreate:(e={})=>this.request({path:`/send_advert`,method:`POST`,format:`json`,...e})};logs={logsList:(e={})=>this.request({path:`/logs`,method:`GET`,format:`json`,...e})};logsStream={logsStreamList:(e,t={})=>this.request({path:`/logs_stream`,method:`GET`,query:e,...t})};hardwareStats={hardwareStatsList:(e={})=>this.request({path:`/hardware_stats`,method:`GET`,format:`json`,...e})};hardwareProcesses={hardwareProcessesList:(e={})=>this.request({path:`/hardware_processes`,method:`GET`,format:`json`,...e})};restartService={restartServiceCreate:(e={})=>this.request({path:`/restart_service`,method:`POST`,secure:!0,format:`json`,...e})};validateConfig={validateConfigList:(e={})=>this.request({path:`/validate_config`,method:`GET`,secure:!0,format:`json`,...e})};openapi={openapiList:(e={})=>this.request({path:`/openapi`,method:`GET`,format:`json`,...e})};setMode={setModeCreate:(e,t={})=>this.request({path:`/set_mode`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};packetStats={packetStatsList:(e,t={})=>this.request({path:`/packet_stats`,method:`GET`,query:e,format:`json`,...t})};setDutyCycle={setDutyCycleCreate:(e,t={})=>this.request({path:`/set_duty_cycle`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};updateDutyCycleConfig={updateDutyCycleConfigCreate:(e,t={})=>this.request({path:`/update_duty_cycle_config`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};updateRadioConfig={updateRadioConfigCreate:(e,t={})=>this.request({path:`/update_radio_config`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};recentPackets={recentPacketsList:(e,t={})=>this.request({path:`/recent_packets`,method:`GET`,query:e,format:`json`,...t})};packetByHash={packetByHashList:(e,t={})=>this.request({path:`/packet_by_hash`,method:`GET`,query:e,...t})};packetTypeStats={packetTypeStatsList:(e,t={})=>this.request({path:`/packet_type_stats`,method:`GET`,query:e,format:`json`,...t})};routeStats={routeStatsList:(e,t={})=>this.request({path:`/route_stats`,method:`GET`,query:e,format:`json`,...t})};filteredPackets={filteredPacketsList:(e,t={})=>this.request({path:`/filtered_packets`,method:`GET`,query:e,format:`json`,...t})};rrdData={rrdDataList:(e={})=>this.request({path:`/rrd_data`,method:`GET`,format:`json`,...e})};packetTypeGraphData={packetTypeGraphDataList:(e,t={})=>this.request({path:`/packet_type_graph_data`,method:`GET`,query:e,format:`json`,...t})};metricsGraphData={metricsGraphDataList:(e,t={})=>this.request({path:`/metrics_graph_data`,method:`GET`,query:e,format:`json`,...t})};noiseFloorHistory={noiseFloorHistoryList:(e,t={})=>this.request({path:`/noise_floor_history`,method:`GET`,query:e,format:`json`,...t})};noiseFloorStats={noiseFloorStatsList:(e,t={})=>this.request({path:`/noise_floor_stats`,method:`GET`,query:e,format:`json`,...t})};noiseFloorChartData={noiseFloorChartDataList:(e,t={})=>this.request({path:`/noise_floor_chart_data`,method:`GET`,query:e,format:`json`,...t})};cadCalibrationStart={cadCalibrationStartCreate:(e,t={})=>this.request({path:`/cad_calibration_start`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};cadCalibrationStop={cadCalibrationStopCreate:(e={})=>this.request({path:`/cad_calibration_stop`,method:`POST`,format:`json`,...e})};saveCadSettings={saveCadSettingsCreate:(e,t={})=>this.request({path:`/save_cad_settings`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};cadCalibrationStream={cadCalibrationStreamList:(e={})=>this.request({path:`/cad_calibration_stream`,method:`GET`,...e})};advertsByContactType={advertsByContactTypeList:(e,t={})=>this.request({path:`/adverts_by_contact_type`,method:`GET`,query:e,format:`json`,...t})};advert={advertDelete:(e,t={})=>this.request({path:`/advert`,method:`DELETE`,query:e,format:`json`,...t})};transportKeys={transportKeysList:(e={})=>this.request({path:`/transport_keys`,method:`GET`,secure:!0,format:`json`,...e}),transportKeysCreate:(e,t={})=>this.request({path:`/transport_keys`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};transportKey={transportKeyList:(e,t={})=>this.request({path:`/transport_key`,method:`GET`,query:e,secure:!0,format:`json`,...t}),transportKeyUpdate:(e,t,n={})=>this.request({path:`/transport_key`,method:`PUT`,query:e,body:t,secure:!0,type:Z.Json,format:`json`,...n}),transportKeyDelete:(e,t={})=>this.request({path:`/transport_key`,method:`DELETE`,query:e,secure:!0,format:`json`,...t})};unscopedFloodPolicy={unscopedFloodPolicyCreate:(e,t={})=>this.request({path:`/unscoped_flood_policy`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};pingNeighbor={pingNeighborCreate:(e,t={})=>this.request({path:`/ping_neighbor`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};policy={policyList:(e={})=>this.request({path:`/policy`,method:`GET`,secure:!0,format:`json`,...e}),policyCreate:(e,t={})=>this.request({path:`/policy`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};policyValidate={policyValidateCreate:(e,t={})=>this.request({path:`/policy_validate`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};policyGroups={policyGroupsList:(e,t={})=>this.request({path:`/policy_groups`,method:`GET`,query:e,secure:!0,format:`json`,...t}),policyGroupsCreate:(e,t={})=>this.request({path:`/policy_groups`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t}),policyGroupsDelete:(e,t={})=>this.request({path:`/policy_groups`,method:`DELETE`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};policyGroupEntries={policyGroupEntriesList:(e,t={})=>this.request({path:`/policy_group_entries`,method:`GET`,query:e,secure:!0,format:`json`,...t}),policyGroupEntriesCreate:(e,t={})=>this.request({path:`/policy_group_entries`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t}),policyGroupEntriesDelete:(e,t={})=>this.request({path:`/policy_group_entries`,method:`DELETE`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};createIdentity={createIdentityCreate:(e,t={})=>this.request({path:`/create_identity`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};identities={identitiesList:(e={})=>this.request({path:`/identities`,method:`GET`,format:`json`,...e})};identity={identityList:(e,t={})=>this.request({path:`/identity`,method:`GET`,query:e,format:`json`,...t})};updateIdentity={updateIdentityUpdate:(e,t={})=>this.request({path:`/update_identity`,method:`PUT`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};deleteIdentity={deleteIdentityDelete:(e,t={})=>this.request({path:`/delete_identity`,method:`DELETE`,query:e,secure:!0,format:`json`,...t})};sendRoomServerAdvert={sendRoomServerAdvertCreate:(e,t={})=>this.request({path:`/send_room_server_advert`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};aclInfo={aclInfoList:(e={})=>this.request({path:`/acl_info`,method:`GET`,format:`json`,...e})};aclClients={aclClientsList:(e,t={})=>this.request({path:`/acl_clients`,method:`GET`,query:e,format:`json`,...t})};aclRemoveClient={aclRemoveClientCreate:(e,t={})=>this.request({path:`/acl_remove_client`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};aclStats={aclStatsList:(e={})=>this.request({path:`/acl_stats`,method:`GET`,format:`json`,...e})};roomMessages={roomMessagesList:(e,t={})=>this.request({path:`/room_messages`,method:`GET`,query:e,format:`json`,...t})};roomPostMessage={roomPostMessageCreate:(e,t={})=>this.request({path:`/room_post_message`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};roomStats={roomStatsList:(e,t={})=>this.request({path:`/room_stats`,method:`GET`,query:e,format:`json`,...t})};roomClients={roomClientsList:(e,t={})=>this.request({path:`/room_clients`,method:`GET`,query:e,format:`json`,...t})};roomMessage={roomMessageDelete:(e,t={})=>this.request({path:`/room_message`,method:`DELETE`,query:e,...t})};roomMessagesClear={roomMessagesClearDelete:(e,t={})=>this.request({path:`/room_messages_clear`,method:`DELETE`,query:e,format:`json`,...t})};needsSetup={needsSetupList:(e={})=>this.request({path:`/needs_setup`,method:`GET`,format:`json`,...e})};siteInfo={siteInfoList:(e={})=>this.request({path:`/site_info`,method:`GET`,format:`json`,...e})};hardwareOptions={hardwareOptionsList:(e={})=>this.request({path:`/hardware_options`,method:`GET`,format:`json`,...e})};radioPresets={radioPresetsList:(e={})=>this.request({path:`/radio_presets`,method:`GET`,format:`json`,...e})};serialPorts={serialPortsList:(e={})=>this.request({path:`/serial_ports`,method:`GET`,format:`json`,...e})};setupWizard={setupWizardCreate:(e,t={})=>this.request({path:`/setup_wizard`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};checkPymcConsole={checkPymcConsoleList:(e={})=>this.request({path:`/check_pymc_console`,method:`GET`,format:`json`,...e})};mqttStatus={mqttStatusList:(e={})=>this.request({path:`/mqtt_status`,method:`GET`,format:`json`,...e})};brokerPresets={brokerPresetsList:(e={})=>this.request({path:`/broker_presets`,method:`GET`,format:`json`,...e})};updateWebConfig={updateWebConfigCreate:(e,t={})=>this.request({path:`/update_web_config`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};updateMqttConfig={updateMqttConfigCreate:(e,t={})=>this.request({path:`/update_mqtt_config`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};updateAdvertRateLimitConfig={updateAdvertRateLimitConfigCreate:(e,t={})=>this.request({path:`/update_advert_rate_limit_config`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};bulkPackets={bulkPacketsList:(e,t={})=>this.request({path:`/bulk_packets`,method:`GET`,query:e,format:`json`,...t})};airtimeData={airtimeDataList:(e,t={})=>this.request({path:`/airtime_data`,method:`GET`,query:e,format:`json`,...t})};airtimeChartData={airtimeChartDataList:(e,t={})=>this.request({path:`/airtime_chart_data`,method:`GET`,query:e,format:`json`,...t})};advertsCountByContactType={advertsCountByContactTypeList:(e,t={})=>this.request({path:`/adverts_count_by_contact_type`,method:`GET`,query:e,format:`json`,...t})};advertRateLimitStats={advertRateLimitStatsList:(e={})=>this.request({path:`/advert_rate_limit_stats`,method:`GET`,format:`json`,...e})};crcErrorCount={crcErrorCountList:(e,t={})=>this.request({path:`/crc_error_count`,method:`GET`,query:e,format:`json`,...t})};crcErrorHistory={crcErrorHistoryList:(e,t={})=>this.request({path:`/crc_error_history`,method:`GET`,query:e,format:`json`,...t})};memoryDebug={memoryDebugList:(e={})=>this.request({path:`/memory_debug`,method:`GET`,format:`json`,...e}),memoryDebugCreate:(e,t={})=>this.request({path:`/memory_debug`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};configExport={configExportList:(e,t={})=>this.request({path:`/config_export`,method:`GET`,query:e,format:`json`,...t})};configImport={configImportCreate:(e,t={})=>this.request({path:`/config_import`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};identityExport={identityExportList:(e={})=>this.request({path:`/identity_export`,method:`GET`,format:`json`,...e})};generateVanityKey={generateVanityKeyCreate:(e,t={})=>this.request({path:`/generate_vanity_key`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};dbStats={dbStatsList:(e={})=>this.request({path:`/db_stats`,method:`GET`,format:`json`,...e})};dbPurge={dbPurgeCreate:(e,t={})=>this.request({path:`/db_purge`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};dbVacuum={dbVacuumCreate:(e={})=>this.request({path:`/db_vacuum`,method:`POST`,format:`json`,...e})};docs={docsList:(e={})=>this.request({path:`/docs`,method:`GET`,...e})};api={authTokensList:(e={})=>this.request({path:`/api/auth/tokens`,method:`GET`,format:`json`,...e}),authTokensCreate:(e,t={})=>this.request({path:`/api/auth/tokens`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),authTokensDelete:(e,t={})=>this.request({path:`/api/auth/tokens/${e}`,method:`DELETE`,format:`json`,...t})};companion={companionList:(e={})=>this.request({path:`/companion`,method:`GET`,format:`json`,...e}),selfInfoList:(e={})=>this.request({path:`/companion/self_info`,method:`GET`,format:`json`,...e}),contactsList:(e={})=>this.request({path:`/companion/contacts`,method:`GET`,format:`json`,...e}),contactList:(e,t={})=>this.request({path:`/companion/contact`,method:`GET`,query:e,format:`json`,...t}),importRepeaterContactsCreate:(e,t={})=>this.request({path:`/companion/import_repeater_contacts`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),channelsList:(e={})=>this.request({path:`/companion/channels`,method:`GET`,format:`json`,...e}),statsList:(e={})=>this.request({path:`/companion/stats`,method:`GET`,format:`json`,...e}),sendTextCreate:(e,t={})=>this.request({path:`/companion/send_text`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),sendChannelMessageCreate:(e,t={})=>this.request({path:`/companion/send_channel_message`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),loginCreate:(e,t={})=>this.request({path:`/companion/login`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),requestStatusCreate:(e={})=>this.request({path:`/companion/request_status`,method:`POST`,format:`json`,...e}),requestTelemetryCreate:(e={})=>this.request({path:`/companion/request_telemetry`,method:`POST`,format:`json`,...e}),sendCommandCreate:(e,t={})=>this.request({path:`/companion/send_command`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),resetPathCreate:(e={})=>this.request({path:`/companion/reset_path`,method:`POST`,format:`json`,...e}),setAdvertNameCreate:(e,t={})=>this.request({path:`/companion/set_advert_name`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),setAdvertLocationCreate:(e,t={})=>this.request({path:`/companion/set_advert_location`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),eventsList:(e={})=>this.request({path:`/companion/events`,method:`GET`,...e})};update={statusList:(e={})=>this.request({path:`/update/status`,method:`GET`,format:`json`,...e}),checkList:(e={})=>this.request({path:`/update/check`,method:`GET`,format:`json`,...e}),checkCreate:(e,t={})=>this.request({path:`/update/check`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),installCreate:(e,t={})=>this.request({path:`/update/install`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),progressList:(e={})=>this.request({path:`/update/progress`,method:`GET`,...e}),channelsList:(e={})=>this.request({path:`/update/channels`,method:`GET`,format:`json`,...e}),setChannelCreate:(e,t={})=>this.request({path:`/update/set_channel`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),changelogList:(e={})=>this.request({path:`/update/changelog`,method:`GET`,format:`json`,...e})};cli={postCli:(e,t={})=>this.request({path:`/cli`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})}}({baseUrl:`/api`}),Fa=e=>{if(e)return Object.fromEntries(new Headers(e).entries())},Ia=`/api`,La=!1,Ra=null;async function za(){return La&&Ra?Ra:(La=!0,Ra=(async()=>{try{let e=Y();if(!e)throw Error(`No token to refresh`);let t=ya(),n=await J.post(`/auth/refresh`,{client_id:t},{headers:{Authorization:`Bearer ${e}`,"Content-Type":`application/json`}});if(n.data.success&&n.data.token){let e=n.data.token;return ba(e),e}else throw Error(`Token refresh failed`)}catch(e){throw console.error(`Token refresh error:`,e),await Na().handleAuthFailure(`expired`),e}finally{La=!1,Ra=null}})(),Ra)}var $=J.create({baseURL:Ia,timeout:1e4,headers:{"Content-Type":`application/json`}}),Ba=J.create({baseURL:``,timeout:1e4,headers:{"Content-Type":`application/json`}});Ba.interceptors.request.use(async e=>{if(e.url?.includes(`/auth/login`)||e.url?.includes(`/auth/refresh`))return e;let t=Y();if(t){if(Ta())try{let t=await za();return e.headers.Authorization=`Bearer ${t}`,e}catch(e){return Promise.reject(e)}if(wa())return Na().handleAuthFailure(`expired`),Promise.reject(Error(`Token expired`));e.headers.Authorization=`Bearer ${t}`}return e},e=>(console.error(`Auth API Request Error:`,e),Promise.reject(e))),Ba.interceptors.response.use(e=>e,e=>{if(e.response?.status===401||e.response?.status===403){let t=(e.config?.headers?.Authorization)?.replace(`Bearer `,``),n=Y();(!t||t===n)&&Na().handleAuthFailure(e.response?.status===403?`forbidden`:`unauthorized`)}return console.error(`Auth API Response Error:`,e.response?.data||e.message),Promise.reject(e)}),$.interceptors.request.use(async e=>{if(e.url?.includes(`/auth/login`))return e;let t=Y();if(t){if(Ta())try{let t=await za();return e.headers.Authorization=`Bearer ${t}`,e}catch(e){return Promise.reject(e)}if(wa())return Na().handleAuthFailure(`expired`),Promise.reject(Error(`Token expired`));e.headers.Authorization=`Bearer ${t}`}return e},e=>(console.error(`API Request Error:`,e),Promise.reject(e))),$.interceptors.response.use(e=>e,e=>{if(e.response?.status===401||e.response?.status===403){let t=(e.config?.headers?.Authorization)?.replace(`Bearer `,``),n=Y();(!t||t===n)&&Na().handleAuthFailure(e.response?.status===403?`forbidden`:`unauthorized`)}return console.error(`API Response Error:`,e.response?.data||e.message),Promise.reject(e)});var Va=class{static async resolveRequestToken(){let e=Y();if(e){if(Ta())return za();if(wa())throw Na().handleAuthFailure(`expired`),Error(`Token expired`);return e}}static async getGeneratedRequestParams(){let e=await this.resolveRequestToken();return e?{headers:{Authorization:`Bearer ${e}`}}:{}}static async get(e,t,n){try{return(await $.get(e,{params:t,...n})).data}catch(e){throw this.handleError(e)}}static async post(e,t,n){try{return(await $.post(e,t,n)).data}catch(e){throw this.handleError(e)}}static async put(e,t,n){try{return(await $.put(e,t,n)).data}catch(e){throw this.handleError(e)}}static async delete(e,t){try{return(await $.delete(e,t)).data}catch(e){throw this.handleError(e)}}static async getTransportKeys(){try{let e=await this.getGeneratedRequestParams();return(await Q.transportKeys.transportKeysList(e)).data}catch(e){throw this.handleError(e)}}static async sendAdvert(){try{let e=await this.getGeneratedRequestParams();return(await Q.sendAdvert.sendAdvertCreate(e)).data}catch(e){throw this.handleError(e)}}static async getGpsDiagnostics(){try{let e=await this.getGeneratedRequestParams();return(await Q.gps.getGps(e)).data}catch(e){throw this.handleError(e)}}static async getSerialPorts(){try{let e=await this.getGeneratedRequestParams();return(await Q.serialPorts.serialPortsList(e)).data}catch(e){throw this.handleError(e)}}static async createTransportKey(e,t,n,r,i){let a={name:e,flood_policy:t,parent_id:r,last_used:i};n!==void 0&&(a.transport_key=n);try{let e=await this.getGeneratedRequestParams();return(await Q.transportKeys.transportKeysCreate(a,e)).data}catch(e){throw this.handleError(e)}}static async getTransportKey(e){try{let t=await this.getGeneratedRequestParams();return(await Q.transportKey.transportKeyList({key_id:String(e)},t)).data}catch(e){throw this.handleError(e)}}static async updateTransportKey(e,t,n,r,i,a){try{let o=await this.getGeneratedRequestParams();return(await Q.transportKey.transportKeyUpdate({key_id:String(e)},{name:t,flood_policy:n,transport_key:r,parent_id:i,last_used:a},o)).data}catch(e){throw this.handleError(e)}}static async deleteTransportKey(e){try{let t=await this.getGeneratedRequestParams();return(await Q.transportKey.transportKeyDelete({key_id:String(e)},t)).data}catch(e){throw this.handleError(e)}}static async updateUnscopedFloodPolicy(e){try{let t=await this.getGeneratedRequestParams();return(await Q.unscopedFloodPolicy.unscopedFloodPolicyCreate({unscoped_flood_allow:e},t)).data}catch(e){throw this.handleError(e)}}static async getPolicyDocument(){try{let e=await this.getGeneratedRequestParams();return(await Q.policy.policyList(e)).data}catch(e){throw this.handleError(e)}}static async updatePolicyDocument(e){try{let t=await this.getGeneratedRequestParams();return(await Q.policy.policyCreate(e,t)).data}catch(e){throw this.handleError(e)}}static async validatePolicyDocument(e){try{let t=await this.getGeneratedRequestParams();return(await Q.policyValidate.policyValidateCreate(e,t)).data}catch(e){throw this.handleError(e)}}static async getPolicyGroups(e){try{let t=await this.getGeneratedRequestParams();return(await Q.policyGroups.policyGroupsList(e?{kind:e}:void 0,t)).data}catch(e){throw this.handleError(e)}}static async createPolicyGroup(e){try{let t=await this.getGeneratedRequestParams();return(await Q.policyGroups.policyGroupsCreate(e,t)).data}catch(e){throw this.handleError(e)}}static async deletePolicyGroup(e){try{let t=await this.getGeneratedRequestParams();return(await $.delete(`/policy_groups`,{headers:Fa(t.headers),data:e,params:e})).data}catch(e){throw this.handleError(e)}}static async getPolicyGroupEntries(e){try{let t=await this.getGeneratedRequestParams();return(await Q.policyGroupEntries.policyGroupEntriesList(e,t)).data}catch(e){throw this.handleError(e)}}static async createPolicyGroupEntry(e){try{let t=await this.getGeneratedRequestParams();return(await Q.policyGroupEntries.policyGroupEntriesCreate(e,t)).data}catch(e){throw this.handleError(e)}}static async deletePolicyGroupEntry(e){try{let t=await this.getGeneratedRequestParams();return(await $.delete(`/policy_group_entries`,{headers:Fa(t.headers),data:e,params:e})).data}catch(e){throw this.handleError(e)}}static async getLogs(){try{let e=await this.getGeneratedRequestParams();return(await Q.logs.logsList(e)).data}catch(e){throw this.handleError(e)}}static async deleteAdvert(e){try{let t=await this.getGeneratedRequestParams();return(await Q.advert.advertDelete({advert_id:e},t)).data}catch(e){throw this.handleError(e)}}static async pingNeighbor(e,t=10){try{let n=await this.getGeneratedRequestParams();return(await Q.pingNeighbor.pingNeighborCreate({target_id:e,timeout:t},n)).data}catch(e){throw this.handleError(e)}}static async getIdentities(){try{let e=await this.getGeneratedRequestParams();return(await Q.identities.identitiesList(e)).data}catch(e){throw this.handleError(e)}}static async getIdentity(e){try{let t=await this.getGeneratedRequestParams();return(await Q.identity.identityList({name:e},t)).data}catch(e){throw this.handleError(e)}}static async createIdentity(e){try{let t=await this.getGeneratedRequestParams();if(e.type!==`companion`&&e.type!==`room_server`)throw Error(`Unsupported identity type: ${e.type}`);return(await Q.createIdentity.createIdentityCreate({name:e.name,identity_key:e.identity_key,type:e.type,settings:e.settings},t)).data}catch(e){throw this.handleError(e)}}static async updateIdentity(e){try{let t=await this.getGeneratedRequestParams(),n={type:e.type,name:e.name,new_name:e.new_name,identity_key:e.identity_key,settings:e.settings};return(await Q.updateIdentity.updateIdentityUpdate(n,t)).data}catch(e){throw this.handleError(e)}}static async deleteIdentity(e,t=`room_server`){try{let n=await this.getGeneratedRequestParams();return(await Q.deleteIdentity.deleteIdentityDelete({name:e,type:t},n)).data}catch(e){throw this.handleError(e)}}static async sendRoomServerAdvert(e){try{let t=await this.getGeneratedRequestParams();return(await Q.sendRoomServerAdvert.sendRoomServerAdvertCreate({name:e},t)).data}catch(e){throw this.handleError(e)}}static async importRepeaterContacts(e){try{let t=await this.getGeneratedRequestParams();return(await Q.companion.importRepeaterContactsCreate(e,t)).data}catch(e){throw this.handleError(e)}}static async getACLInfo(){try{let e=await this.getGeneratedRequestParams();return(await Q.aclInfo.aclInfoList(e)).data}catch(e){throw this.handleError(e)}}static async getACLClients(e){try{let t=await this.getGeneratedRequestParams();return(await Q.aclClients.aclClientsList(e,t)).data}catch(e){throw this.handleError(e)}}static async removeACLClient(e){try{let t=await this.getGeneratedRequestParams();return(await Q.aclRemoveClient.aclRemoveClientCreate({client_pubkey:e.public_key,identity_hash:e.identity_hash??``},t)).data}catch(e){throw this.handleError(e)}}static async getACLStats(){try{let e=await this.getGeneratedRequestParams();return(await Q.aclStats.aclStatsList(e)).data}catch(e){throw this.handleError(e)}}static async getRoomMessages(e){try{let t=await this.getGeneratedRequestParams();return(await Q.roomMessages.roomMessagesList(e,t)).data}catch(e){throw this.handleError(e)}}static async postRoomMessage(e){try{let t=await this.getGeneratedRequestParams();return(await Q.roomPostMessage.roomPostMessageCreate(e,t)).data}catch(e){throw this.handleError(e)}}static async deleteRoomMessage(e){try{let t=await this.getGeneratedRequestParams();return await Q.roomMessage.roomMessageDelete({room_name:e.room_name,message_id:e.message_id},t),{success:!0}}catch(e){throw this.handleError(e)}}static async clearRoomMessages(e){try{let t=await this.getGeneratedRequestParams();return(await Q.roomMessagesClear.roomMessagesClearDelete({room_name:e},t)).data}catch(e){throw this.handleError(e)}}static async getRoomStats(e){try{let t=await this.getGeneratedRequestParams();return(await Q.roomStats.roomStatsList(e?{room_name:e}:void 0,t)).data}catch(e){throw this.handleError(e)}}static async getRoomClients(e){try{let t=await this.getGeneratedRequestParams();return(await Q.roomClients.roomClientsList({room_name:e},t)).data}catch(e){throw this.handleError(e)}}static async exportConfig(e=!1){try{let t=await this.getGeneratedRequestParams();return(await Q.configExport.configExportList(e?{include_secrets:!0}:void 0,t)).data}catch(e){throw this.handleError(e)}}static async importConfig(e){try{let t=await this.getGeneratedRequestParams();return(await Q.configImport.configImportCreate({config:e},t)).data}catch(e){throw this.handleError(e)}}static async exportIdentityKey(){try{let e=await this.getGeneratedRequestParams();return(await Q.identityExport.identityExportList(e)).data}catch(e){throw this.handleError(e)}}static async generateVanityKey(e,t=!1){try{let n=await this.getGeneratedRequestParams();return(await Q.generateVanityKey.generateVanityKeyCreate({prefix:e,apply:t},n)).data}catch(e){throw this.handleError(e)}}static async getDbStats(){try{let e=await this.getGeneratedRequestParams();return(await Q.dbStats.dbStatsList(e)).data}catch(e){throw this.handleError(e)}}static async purgeTable(e){try{let t=await this.getGeneratedRequestParams();return(await Q.dbPurge.dbPurgeCreate({tables:e},t)).data}catch(e){throw this.handleError(e)}}static async vacuumDb(){try{let e=await this.getGeneratedRequestParams();return(await Q.dbVacuum.dbVacuumCreate(e)).data}catch(e){throw this.handleError(e)}}static handleError(e){if(J.isAxiosError(e)){if(e.response){let t=e.response.data?.error||e.response.data?.message||`HTTP ${e.response.status}`;return Error(t)}else if(e.request)return Error(`Network error - no response received`)}return Error(e instanceof Error?e.message:`Unknown error occurred`)}};export{_e as _,Aa as a,ya as c,wa as d,ba as f,Ue as g,We as h,Na as i,Y as l,Ut as m,$ as n,X as o,Ht as p,Ba as r,xa as s,Va as t,Ea as u,Oe as v,ke as y}; \ No newline at end of file +`+n):e.stack=n}catch{}}throw e}}_request(e,t){typeof e==`string`?(t||={},t.url=e):t=e||{},t=K(this.defaults,t);let{transitional:n,paramsSerializer:r,headers:i}=t;n!==void 0&&ua.assertOptions(n,{silentJSONParsing:q.transitional(q.boolean),forcedJSONParsing:q.transitional(q.boolean),clarifyTimeoutError:q.transitional(q.boolean),legacyInterceptorReqResOrdering:q.transitional(q.boolean)},!1),r!=null&&(H.isFunction(r)?t.paramsSerializer={serialize:r}:ua.assertOptions(r,{encode:q.function,serialize:q.function},!0)),t.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls===void 0?t.allowAbsoluteUrls=!0:t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls),ua.assertOptions(t,{baseUrl:q.spelling(`baseURL`),withXsrfToken:q.spelling(`withXSRFToken`)},!0),t.method=(t.method||this.defaults.method||`get`).toLowerCase();let a=i&&H.merge(i.common,i[t.method]);i&&H.forEach([`delete`,`get`,`head`,`post`,`put`,`patch`,`common`],e=>{delete i[e]}),t.headers=G.concat(a,i);let o=[],s=!0;this.interceptors.request.forEach(function(e){if(typeof e.runWhen==`function`&&e.runWhen(t)===!1)return;s&&=e.synchronous;let n=t.transitional||Zr;n&&n.legacyInterceptorReqResOrdering?o.unshift(e.fulfilled,e.rejected):o.push(e.fulfilled,e.rejected)});let c=[];this.interceptors.response.forEach(function(e){c.push(e.fulfilled,e.rejected)});let l,u=0,d;if(!s){let e=[aa.bind(this),void 0];for(e.unshift(...o),e.push(...c),d=e.length,l=Promise.resolve(t);u{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null}),this.promise.then=e=>{let t,r=new Promise(e=>{n.subscribe(e),t=e}).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e(function(e,r,i){n.reason||(n.reason=new Ci(e,r,i),t(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;let t=this._listeners.indexOf(e);t!==-1&&this._listeners.splice(t,1)}toAbortSignal(){let e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let t;return{token:new e(function(e){t=e}),cancel:t}}};function pa(e){return function(t){return e.apply(null,t)}}function ma(e){return H.isObject(e)&&e.isAxiosError===!0}var ha={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(ha).forEach(([e,t])=>{ha[t]=e});function ga(e){let t=new da(e),n=jn(da.prototype.request,t);return H.extend(n,da.prototype,t,{allOwnKeys:!0}),H.extend(n,t,null,{allOwnKeys:!0}),n.create=function(t){return ga(K(e,t))},n}var J=ga(ui);J.Axios=da,J.CanceledError=Ci,J.CancelToken=fa,J.isCancel=Si,J.VERSION=oa,J.toFormData=Wr,J.AxiosError=U,J.Cancel=J.CanceledError,J.all=function(e){return Promise.all(e)},J.spread=pa,J.isAxiosError=ma,J.mergeConfig=K,J.AxiosHeaders=G,J.formToJSON=e=>ci(H.isHTMLForm(e)?new FormData(e):e),J.getAdapter=ra.getAdapter,J.HttpStatusCode=ha,J.default=J;var _a=`pymc_jwt_token`,va=`pymc_client_id`;function ya(){let e=localStorage.getItem(va);return e||(e=`${Date.now()}-${Math.random().toString(36).substring(2,15)}`,localStorage.setItem(va,e)),e}function Y(){return localStorage.getItem(_a)}function ba(e){localStorage.setItem(_a,e)}function xa(){localStorage.removeItem(_a)}function Sa(){return Y()!==null}function Ca(e){try{let t=e.split(`.`)[1].replace(/-/g,`+`).replace(/_/g,`/`),n=decodeURIComponent(atob(t).split(``).map(e=>`%`+(`00`+e.charCodeAt(0).toString(16)).slice(-2)).join(``));return JSON.parse(n)}catch{return null}}function wa(){let e=Y();if(!e)return!0;let t=Ca(e);return!t||!t.exp?!0:Date.now()>=t.exp*1e3-3e4}function Ta(){let e=Y();if(!e)return!1;let t=Ca(e);if(!t||!t.exp)return!1;let n=t.exp*1e3-Date.now();return n>0&&n<3e5}function Ea(){let e=Y();if(!e)return null;let t=Ca(e);return!t||!t.sub?null:t.sub}var Da=`modulepreload`,Oa=function(e){return`/`+e},ka={},X=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=Oa(t,n),t in ka)return;ka[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:Da,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},Aa=An({history:Zt(`/`),routes:[{path:`/setup`,name:`setup`,component:()=>X(()=>import(`./Setup-CZMqH1nV.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14])),meta:{requiresAuth:!1,requiresSetup:!1}},{path:`/login`,name:`login`,component:()=>X(()=>import(`./Login-B6KB1F1E.js`),__vite__mapDeps([15,1,2,3,4,5,6,7,8,9,10,11,12,16])),meta:{requiresAuth:!1}},{path:`/`,name:`dashboard`,component:()=>X(()=>import(`./Dashboard-DhSJn9HX.js`),__vite__mapDeps([17,1,2,3,4,5,6,7,8,9,10,11,12,18,19,20,21,22])),meta:{requiresAuth:!0}},{path:`/neighbors`,name:`neighbors`,component:()=>X(()=>import(`./Neighbors-s6MU6vjM.js`),__vite__mapDeps([23,1,2,3,4,5,6,7,8,9,10,11,12,24,25,26,20,27,28,29])),meta:{requiresAuth:!0}},{path:`/statistics`,name:`statistics`,component:()=>X(()=>import(`./Statistics-DE7FhmLr.js`),__vite__mapDeps([30,18,3,5,4,31,32,1,2,6,7,8,9,10,11,12,33])),meta:{requiresAuth:!0}},{path:`/rf-health-correlation`,name:`rf-health-correlation`,component:()=>X(()=>import(`./RfHealthCorrelation-Hq8s45i4.js`),__vite__mapDeps([34,1,2,3,4,5,6,7,8,9,10,11,12,18,31,19,20,21,35])),meta:{requiresAuth:!0}},{path:`/gps`,name:`gps-diagnostics`,component:()=>X(()=>import(`./GPSDiagnostics-C9LIlcS7.js`),__vite__mapDeps([36,1,2,3,4,5,6,7,8,9,10,11,12,37])),meta:{requiresAuth:!0}},{path:`/system-stats`,name:`system-stats`,component:()=>X(()=>import(`./SystemStats-CPdf4wwy.js`),__vite__mapDeps([38,1,2,3,4,5,6,7,8,9,10,11,12,24,18,31,32,33,27,39])),meta:{requiresAuth:!0}},{path:`/sensors`,name:`sensors`,component:()=>X(()=>import(`./Sensors-CjVXAi_E.js`),__vite__mapDeps([40,1,2,3,4,5,6,7,8,9,10,11,12])),meta:{requiresAuth:!0}},{path:`/configuration`,name:`configuration`,component:()=>X(()=>import(`./Configuration-DRX-sbaI.js`),__vite__mapDeps([41,1,2,3,4,5,6,7,8,9,10,11,12,13,42,43,24,44,29,26,27,45])),meta:{requiresAuth:!0}},{path:`/cad-calibration`,name:`cad-calibration`,component:()=>X(()=>import(`./CADCalibration-sDbWdeGJ.js`),__vite__mapDeps([46,1,2,3,4,5,6,7,8,9,10,11,12,24,47,48])),meta:{requiresAuth:!0}},{path:`/sessions`,name:`sessions`,component:()=>X(()=>import(`./Sessions-BjPFjtvX.js`),__vite__mapDeps([49,3,4,5])),meta:{requiresAuth:!0}},{path:`/room-servers`,name:`room-servers`,component:()=>X(()=>import(`./RoomServers-t1qcIom6.js`),__vite__mapDeps([50,1,2,3,4,5,6,7,8,9,10,11,12,42,43,24,44,29,51])),meta:{requiresAuth:!0}},{path:`/companions`,name:`companions`,component:()=>X(()=>import(`./Companions-CdUuekpd.js`),__vite__mapDeps([52,1,2,3,4,5,6,7,8,9,10,11,12,42,51])),meta:{requiresAuth:!0}},{path:`/logs`,name:`logs`,component:()=>X(()=>import(`./Logs-CNUMuKWB.js`),__vite__mapDeps([53,3,4,5])),meta:{requiresAuth:!0}},{path:`/terminal`,name:`terminal`,component:()=>X(()=>import(`./Terminal-H1Bfe4_c.js`),__vite__mapDeps([54,1,2,3,4,5,6,7,8,9,10,11,12,55])),meta:{requiresAuth:!0}},{path:`/help`,name:`help`,component:()=>X(()=>import(`./Help-Dae1qP2Q.js`),__vite__mapDeps([56,3])),meta:{requiresAuth:!0}}]}),ja=!1;async function Ma(){if(ja)return!1;try{let e=await fetch(`/api/needs_setup`,{headers:{Accept:`application/json`}});if(!e.ok)return console.error(`Setup check failed:`,e.status),!1;let t=(await e.json()).needs_setup===!0;return t||(ja=!0),t}catch(e){return console.error(`Error checking setup status:`,e),!1}}Aa.beforeEach(async e=>{if(await Ma())return e.path===`/setup`?void 0:`/setup`;if(e.path===`/setup`)return`/login`;let t=e.meta.requiresAuth!==!1,n=Sa();if(t&&!n)return`/login`;if(e.path===`/login`&&n)return`/`});var Na=Oe(`appRuntime`,()=>{let e=d(typeof navigator>`u`?!0:navigator.onLine),t=d(typeof document>`u`?!0:document.visibilityState===`visible`),n=d(!1),r=d(null),i=d(!1),a=y(()=>e.value&&t.value&&n.value&&!i.value);function o(){n.value=!!Y()&&!wa(),n.value||(r.value=r.value??`expired`)}function s(){n.value=!0,r.value=null,i.value=!1}function c(t){e.value=t}function l(e){t.value=e}async function u(e){if(i.value)return;i.value=!0,r.value=e,n.value=!1;let{useWebSocketStore:t}=await X(async()=>{let{useWebSocketStore:e}=await import(`./websocket-e8oZXVGT.js`);return{useWebSocketStore:e}},__vite__mapDeps([57,10,3,7,8,9])),{usePacketStore:a}=await X(async()=>{let{usePacketStore:e}=await import(`./packets-CdVyfwIj.js`);return{usePacketStore:e}},__vite__mapDeps([58,8,3])),{useSystemStore:o}=await X(async()=>{let{useSystemStore:e}=await import(`./system-CXXVlRna.js`);return{useSystemStore:e}},__vite__mapDeps([59,9,3,8])),{useDataService:s}=await X(async()=>{let{useDataService:e}=await import(`./dataService-D3_w8go8.js`);return{useDataService:e}},__vite__mapDeps([60,7,3,8,9])),c=t(),l=a(),u=o(),d=s();c.disconnect({preventReconnect:!0,silent:e!==`logout`}),l.reset(),u.reset(),d.reset(),xa(),Aa.currentRoute.value.path!==`/login`&&await Aa.push(`/login`),i.value=!1}async function f(e){await u(e)}return{isOnline:e,isDocumentVisible:t,isAuthenticated:n,authFailureReason:r,canMaintainConnections:a,syncAuthState:o,markAuthenticated:s,setOnline:c,setDocumentVisible:l,stopSession:u,handleAuthFailure:f}}),Z=function(e){return e.Json=`application/json`,e.JsonApi=`application/vnd.api+json`,e.FormData=`multipart/form-data`,e.UrlEncoded=`application/x-www-form-urlencoded`,e.Text=`text/plain`,e}({}),Pa=class{baseUrl=`/api`;securityData=null;securityWorker;abortControllers=new Map;customFetch=(...e)=>fetch(...e);baseApiParams={credentials:`same-origin`,headers:{},redirect:`follow`,referrerPolicy:`no-referrer`};constructor(e={}){Object.assign(this,e)}setSecurityData=e=>{this.securityData=e};encodeQueryParam(e,t){return`${encodeURIComponent(e)}=${encodeURIComponent(typeof t==`number`?t:`${t}`)}`}addQueryParam(e,t){return this.encodeQueryParam(t,e[t])}addArrayQueryParam(e,t){return e[t].map(e=>this.encodeQueryParam(t,e)).join(`&`)}toQueryString(e){let t=e||{};return Object.keys(t).filter(e=>t[e]!==void 0).map(e=>Array.isArray(t[e])?this.addArrayQueryParam(t,e):this.addQueryParam(t,e)).join(`&`)}addQueryParams(e){let t=this.toQueryString(e);return t?`?${t}`:``}contentFormatters={[Z.Json]:e=>e!==null&&(typeof e==`object`||typeof e==`string`)?JSON.stringify(e):e,[Z.JsonApi]:e=>e!==null&&(typeof e==`object`||typeof e==`string`)?JSON.stringify(e):e,[Z.Text]:e=>e!==null&&typeof e!=`string`?JSON.stringify(e):e,[Z.FormData]:e=>e instanceof FormData?e:Object.keys(e||{}).reduce((t,n)=>{let r=e[n];return t.append(n,r instanceof Blob?r:typeof r==`object`&&r?JSON.stringify(r):`${r}`),t},new FormData),[Z.UrlEncoded]:e=>this.toQueryString(e)};mergeRequestParams(e,t){return{...this.baseApiParams,...e,...t||{},headers:{...this.baseApiParams.headers||{},...e.headers||{},...t&&t.headers||{}}}}createAbortSignal=e=>{if(this.abortControllers.has(e)){let t=this.abortControllers.get(e);return t?t.signal:void 0}let t=new AbortController;return this.abortControllers.set(e,t),t.signal};abortRequest=e=>{let t=this.abortControllers.get(e);t&&(t.abort(),this.abortControllers.delete(e))};request=async({body:e,secure:t,path:n,type:r,query:i,format:a,baseUrl:o,cancelToken:s,...c})=>{let l=(typeof t==`boolean`?t:this.baseApiParams.secure)&&this.securityWorker&&await this.securityWorker(this.securityData)||{},u=this.mergeRequestParams(c,l),d=i&&this.toQueryString(i),f=this.contentFormatters[r||Z.Json],p=a||u.format;return this.customFetch(`${o||this.baseUrl||``}${n}${d?`?${d}`:``}`,{...u,headers:{...u.headers||{},...r&&r!==Z.FormData?{"Content-Type":r}:{}},signal:(s?this.createAbortSignal(s):u.signal)||null,body:e==null?null:f(e)}).then(async e=>{let t=e;t.data=null,t.error=null;let n=p?e.clone():e,r=p?await n[p]().then(e=>(t.ok?t.data=e:t.error=e,t)).catch(e=>(t.error=e,t)):t;if(s&&this.abortControllers.delete(s),!e.ok)throw r;return r})}},Q=new class extends Pa{auth={loginCreate:(e,t={})=>this.request({path:`/auth/login`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),refreshCreate:(e,t={})=>this.request({path:`/auth/refresh`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t}),verifyList:(e={})=>this.request({path:`/auth/verify`,method:`GET`,secure:!0,format:`json`,...e}),changePasswordCreate:(e,t={})=>this.request({path:`/auth/change_password`,method:`POST`,body:e,secure:!0,type:Z.Json,...t}),tokensList:(e={})=>this.request({path:`/auth/tokens`,method:`GET`,secure:!0,format:`json`,...e}),tokensCreate:(e,t={})=>this.request({path:`/auth/tokens`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t}),tokensDelete:(e,t={})=>this.request({path:`/auth/tokens/${e}`,method:`DELETE`,secure:!0,...t})};stats={statsList:(e={})=>this.request({path:`/stats`,method:`GET`,format:`json`,...e})};gps={getGps:(e={})=>this.request({path:`/gps`,method:`GET`,secure:!0,format:`json`,...e})};gpsStream={gpsStreamList:(e={})=>this.request({path:`/gps_stream`,method:`GET`,...e})};sendAdvert={sendAdvertCreate:(e={})=>this.request({path:`/send_advert`,method:`POST`,format:`json`,...e})};logs={logsList:(e={})=>this.request({path:`/logs`,method:`GET`,format:`json`,...e})};logsStream={logsStreamList:(e,t={})=>this.request({path:`/logs_stream`,method:`GET`,query:e,...t})};hardwareStats={hardwareStatsList:(e={})=>this.request({path:`/hardware_stats`,method:`GET`,format:`json`,...e})};hardwareProcesses={hardwareProcessesList:(e={})=>this.request({path:`/hardware_processes`,method:`GET`,format:`json`,...e})};restartService={restartServiceCreate:(e={})=>this.request({path:`/restart_service`,method:`POST`,secure:!0,format:`json`,...e})};validateConfig={validateConfigList:(e={})=>this.request({path:`/validate_config`,method:`GET`,secure:!0,format:`json`,...e})};openapi={openapiList:(e={})=>this.request({path:`/openapi`,method:`GET`,format:`json`,...e})};setMode={setModeCreate:(e,t={})=>this.request({path:`/set_mode`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};packetStats={packetStatsList:(e,t={})=>this.request({path:`/packet_stats`,method:`GET`,query:e,format:`json`,...t})};setDutyCycle={setDutyCycleCreate:(e,t={})=>this.request({path:`/set_duty_cycle`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};updateDutyCycleConfig={updateDutyCycleConfigCreate:(e,t={})=>this.request({path:`/update_duty_cycle_config`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};updateRadioConfig={updateRadioConfigCreate:(e,t={})=>this.request({path:`/update_radio_config`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};recentPackets={recentPacketsList:(e,t={})=>this.request({path:`/recent_packets`,method:`GET`,query:e,format:`json`,...t})};packetByHash={packetByHashList:(e,t={})=>this.request({path:`/packet_by_hash`,method:`GET`,query:e,...t})};packetTypeStats={packetTypeStatsList:(e,t={})=>this.request({path:`/packet_type_stats`,method:`GET`,query:e,format:`json`,...t})};routeStats={routeStatsList:(e,t={})=>this.request({path:`/route_stats`,method:`GET`,query:e,format:`json`,...t})};filteredPackets={filteredPacketsList:(e,t={})=>this.request({path:`/filtered_packets`,method:`GET`,query:e,format:`json`,...t})};rrdData={rrdDataList:(e={})=>this.request({path:`/rrd_data`,method:`GET`,format:`json`,...e})};packetTypeGraphData={packetTypeGraphDataList:(e,t={})=>this.request({path:`/packet_type_graph_data`,method:`GET`,query:e,format:`json`,...t})};metricsGraphData={metricsGraphDataList:(e,t={})=>this.request({path:`/metrics_graph_data`,method:`GET`,query:e,format:`json`,...t})};noiseFloorHistory={noiseFloorHistoryList:(e,t={})=>this.request({path:`/noise_floor_history`,method:`GET`,query:e,format:`json`,...t})};noiseFloorStats={noiseFloorStatsList:(e,t={})=>this.request({path:`/noise_floor_stats`,method:`GET`,query:e,format:`json`,...t})};noiseFloorChartData={noiseFloorChartDataList:(e,t={})=>this.request({path:`/noise_floor_chart_data`,method:`GET`,query:e,format:`json`,...t})};cadCalibrationStart={cadCalibrationStartCreate:(e,t={})=>this.request({path:`/cad_calibration_start`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};cadCalibrationStop={cadCalibrationStopCreate:(e={})=>this.request({path:`/cad_calibration_stop`,method:`POST`,format:`json`,...e})};saveCadSettings={saveCadSettingsCreate:(e,t={})=>this.request({path:`/save_cad_settings`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};cadCalibrationStream={cadCalibrationStreamList:(e={})=>this.request({path:`/cad_calibration_stream`,method:`GET`,...e})};advertsByContactType={advertsByContactTypeList:(e,t={})=>this.request({path:`/adverts_by_contact_type`,method:`GET`,query:e,format:`json`,...t})};advert={advertDelete:(e,t={})=>this.request({path:`/advert`,method:`DELETE`,query:e,format:`json`,...t})};transportKeys={transportKeysList:(e={})=>this.request({path:`/transport_keys`,method:`GET`,secure:!0,format:`json`,...e}),transportKeysCreate:(e,t={})=>this.request({path:`/transport_keys`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};transportKey={transportKeyList:(e,t={})=>this.request({path:`/transport_key`,method:`GET`,query:e,secure:!0,format:`json`,...t}),transportKeyUpdate:(e,t,n={})=>this.request({path:`/transport_key`,method:`PUT`,query:e,body:t,secure:!0,type:Z.Json,format:`json`,...n}),transportKeyDelete:(e,t={})=>this.request({path:`/transport_key`,method:`DELETE`,query:e,secure:!0,format:`json`,...t})};unscopedFloodPolicy={unscopedFloodPolicyCreate:(e,t={})=>this.request({path:`/unscoped_flood_policy`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};pingNeighbor={pingNeighborCreate:(e,t={})=>this.request({path:`/ping_neighbor`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};policy={policyList:(e={})=>this.request({path:`/policy`,method:`GET`,secure:!0,format:`json`,...e}),policyCreate:(e,t={})=>this.request({path:`/policy`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};policyValidate={policyValidateCreate:(e,t={})=>this.request({path:`/policy_validate`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};policyGroups={policyGroupsList:(e,t={})=>this.request({path:`/policy_groups`,method:`GET`,query:e,secure:!0,format:`json`,...t}),policyGroupsCreate:(e,t={})=>this.request({path:`/policy_groups`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t}),policyGroupsDelete:(e,t={})=>this.request({path:`/policy_groups`,method:`DELETE`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};policyGroupEntries={policyGroupEntriesList:(e,t={})=>this.request({path:`/policy_group_entries`,method:`GET`,query:e,secure:!0,format:`json`,...t}),policyGroupEntriesCreate:(e,t={})=>this.request({path:`/policy_group_entries`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t}),policyGroupEntriesDelete:(e,t={})=>this.request({path:`/policy_group_entries`,method:`DELETE`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};createIdentity={createIdentityCreate:(e,t={})=>this.request({path:`/create_identity`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};identities={identitiesList:(e={})=>this.request({path:`/identities`,method:`GET`,format:`json`,...e})};identity={identityList:(e,t={})=>this.request({path:`/identity`,method:`GET`,query:e,format:`json`,...t})};updateIdentity={updateIdentityUpdate:(e,t={})=>this.request({path:`/update_identity`,method:`PUT`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};deleteIdentity={deleteIdentityDelete:(e,t={})=>this.request({path:`/delete_identity`,method:`DELETE`,query:e,secure:!0,format:`json`,...t})};sendRoomServerAdvert={sendRoomServerAdvertCreate:(e,t={})=>this.request({path:`/send_room_server_advert`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};aclInfo={aclInfoList:(e={})=>this.request({path:`/acl_info`,method:`GET`,format:`json`,...e})};aclClients={aclClientsList:(e,t={})=>this.request({path:`/acl_clients`,method:`GET`,query:e,format:`json`,...t})};aclRemoveClient={aclRemoveClientCreate:(e,t={})=>this.request({path:`/acl_remove_client`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};aclStats={aclStatsList:(e={})=>this.request({path:`/acl_stats`,method:`GET`,format:`json`,...e})};roomMessages={roomMessagesList:(e,t={})=>this.request({path:`/room_messages`,method:`GET`,query:e,format:`json`,...t})};roomPostMessage={roomPostMessageCreate:(e,t={})=>this.request({path:`/room_post_message`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};roomStats={roomStatsList:(e,t={})=>this.request({path:`/room_stats`,method:`GET`,query:e,format:`json`,...t})};roomClients={roomClientsList:(e,t={})=>this.request({path:`/room_clients`,method:`GET`,query:e,format:`json`,...t})};roomMessage={roomMessageDelete:(e,t={})=>this.request({path:`/room_message`,method:`DELETE`,query:e,...t})};roomMessagesClear={roomMessagesClearDelete:(e,t={})=>this.request({path:`/room_messages_clear`,method:`DELETE`,query:e,format:`json`,...t})};needsSetup={needsSetupList:(e={})=>this.request({path:`/needs_setup`,method:`GET`,format:`json`,...e})};siteInfo={siteInfoList:(e={})=>this.request({path:`/site_info`,method:`GET`,format:`json`,...e})};hardwareOptions={hardwareOptionsList:(e={})=>this.request({path:`/hardware_options`,method:`GET`,format:`json`,...e})};radioPresets={radioPresetsList:(e={})=>this.request({path:`/radio_presets`,method:`GET`,format:`json`,...e})};serialPorts={serialPortsList:(e={})=>this.request({path:`/serial_ports`,method:`GET`,format:`json`,...e})};setupWizard={setupWizardCreate:(e,t={})=>this.request({path:`/setup_wizard`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};checkPymcConsole={checkPymcConsoleList:(e={})=>this.request({path:`/check_pymc_console`,method:`GET`,format:`json`,...e})};mqttStatus={mqttStatusList:(e={})=>this.request({path:`/mqtt_status`,method:`GET`,format:`json`,...e})};brokerPresets={brokerPresetsList:(e={})=>this.request({path:`/broker_presets`,method:`GET`,format:`json`,...e})};updateWebConfig={updateWebConfigCreate:(e,t={})=>this.request({path:`/update_web_config`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};updateMqttConfig={updateMqttConfigCreate:(e,t={})=>this.request({path:`/update_mqtt_config`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};updateAdvertRateLimitConfig={updateAdvertRateLimitConfigCreate:(e,t={})=>this.request({path:`/update_advert_rate_limit_config`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})};bulkPackets={bulkPacketsList:(e,t={})=>this.request({path:`/bulk_packets`,method:`GET`,query:e,format:`json`,...t})};airtimeData={airtimeDataList:(e,t={})=>this.request({path:`/airtime_data`,method:`GET`,query:e,format:`json`,...t})};airtimeChartData={airtimeChartDataList:(e,t={})=>this.request({path:`/airtime_chart_data`,method:`GET`,query:e,format:`json`,...t})};advertsCountByContactType={advertsCountByContactTypeList:(e,t={})=>this.request({path:`/adverts_count_by_contact_type`,method:`GET`,query:e,format:`json`,...t})};advertRateLimitStats={advertRateLimitStatsList:(e={})=>this.request({path:`/advert_rate_limit_stats`,method:`GET`,format:`json`,...e})};crcErrorCount={crcErrorCountList:(e,t={})=>this.request({path:`/crc_error_count`,method:`GET`,query:e,format:`json`,...t})};crcErrorHistory={crcErrorHistoryList:(e,t={})=>this.request({path:`/crc_error_history`,method:`GET`,query:e,format:`json`,...t})};memoryDebug={memoryDebugList:(e={})=>this.request({path:`/memory_debug`,method:`GET`,format:`json`,...e}),memoryDebugCreate:(e,t={})=>this.request({path:`/memory_debug`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};configExport={configExportList:(e,t={})=>this.request({path:`/config_export`,method:`GET`,query:e,format:`json`,...t})};configImport={configImportCreate:(e,t={})=>this.request({path:`/config_import`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};identityExport={identityExportList:(e={})=>this.request({path:`/identity_export`,method:`GET`,format:`json`,...e})};generateVanityKey={generateVanityKeyCreate:(e,t={})=>this.request({path:`/generate_vanity_key`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};dbStats={dbStatsList:(e={})=>this.request({path:`/db_stats`,method:`GET`,format:`json`,...e})};dbPurge={dbPurgeCreate:(e,t={})=>this.request({path:`/db_purge`,method:`POST`,body:e,type:Z.Json,format:`json`,...t})};dbVacuum={dbVacuumCreate:(e={})=>this.request({path:`/db_vacuum`,method:`POST`,format:`json`,...e})};docs={docsList:(e={})=>this.request({path:`/docs`,method:`GET`,...e})};api={authTokensList:(e={})=>this.request({path:`/api/auth/tokens`,method:`GET`,format:`json`,...e}),authTokensCreate:(e,t={})=>this.request({path:`/api/auth/tokens`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),authTokensDelete:(e,t={})=>this.request({path:`/api/auth/tokens/${e}`,method:`DELETE`,format:`json`,...t})};companion={companionList:(e={})=>this.request({path:`/companion`,method:`GET`,format:`json`,...e}),selfInfoList:(e={})=>this.request({path:`/companion/self_info`,method:`GET`,format:`json`,...e}),contactsList:(e={})=>this.request({path:`/companion/contacts`,method:`GET`,format:`json`,...e}),contactList:(e,t={})=>this.request({path:`/companion/contact`,method:`GET`,query:e,format:`json`,...t}),importRepeaterContactsCreate:(e,t={})=>this.request({path:`/companion/import_repeater_contacts`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),channelsList:(e={})=>this.request({path:`/companion/channels`,method:`GET`,format:`json`,...e}),statsList:(e={})=>this.request({path:`/companion/stats`,method:`GET`,format:`json`,...e}),sendTextCreate:(e,t={})=>this.request({path:`/companion/send_text`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),sendChannelMessageCreate:(e,t={})=>this.request({path:`/companion/send_channel_message`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),loginCreate:(e,t={})=>this.request({path:`/companion/login`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),requestStatusCreate:(e={})=>this.request({path:`/companion/request_status`,method:`POST`,format:`json`,...e}),requestTelemetryCreate:(e={})=>this.request({path:`/companion/request_telemetry`,method:`POST`,format:`json`,...e}),sendCommandCreate:(e,t={})=>this.request({path:`/companion/send_command`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),resetPathCreate:(e={})=>this.request({path:`/companion/reset_path`,method:`POST`,format:`json`,...e}),setAdvertNameCreate:(e,t={})=>this.request({path:`/companion/set_advert_name`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),setAdvertLocationCreate:(e,t={})=>this.request({path:`/companion/set_advert_location`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),eventsList:(e={})=>this.request({path:`/companion/events`,method:`GET`,...e})};update={statusList:(e={})=>this.request({path:`/update/status`,method:`GET`,format:`json`,...e}),checkList:(e={})=>this.request({path:`/update/check`,method:`GET`,format:`json`,...e}),checkCreate:(e,t={})=>this.request({path:`/update/check`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),installCreate:(e,t={})=>this.request({path:`/update/install`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),progressList:(e={})=>this.request({path:`/update/progress`,method:`GET`,...e}),channelsList:(e={})=>this.request({path:`/update/channels`,method:`GET`,format:`json`,...e}),setChannelCreate:(e,t={})=>this.request({path:`/update/set_channel`,method:`POST`,body:e,type:Z.Json,format:`json`,...t}),changelogList:(e={})=>this.request({path:`/update/changelog`,method:`GET`,format:`json`,...e})};cli={postCli:(e,t={})=>this.request({path:`/cli`,method:`POST`,body:e,secure:!0,type:Z.Json,format:`json`,...t})}}({baseUrl:`/api`}),Fa=e=>{if(e)return Object.fromEntries(new Headers(e).entries())},Ia=`/api`,La=!1,Ra=null;async function za(){return La&&Ra?Ra:(La=!0,Ra=(async()=>{try{let e=Y();if(!e)throw Error(`No token to refresh`);let t=ya(),n=await J.post(`/auth/refresh`,{client_id:t},{headers:{Authorization:`Bearer ${e}`,"Content-Type":`application/json`}});if(n.data.success&&n.data.token){let e=n.data.token;return ba(e),e}else throw Error(`Token refresh failed`)}catch(e){throw console.error(`Token refresh error:`,e),await Na().handleAuthFailure(`expired`),e}finally{La=!1,Ra=null}})(),Ra)}var $=J.create({baseURL:Ia,timeout:1e4,headers:{"Content-Type":`application/json`}}),Ba=J.create({baseURL:``,timeout:1e4,headers:{"Content-Type":`application/json`}});Ba.interceptors.request.use(async e=>{if(e.url?.includes(`/auth/login`)||e.url?.includes(`/auth/refresh`))return e;let t=Y();if(t){if(Ta())try{let t=await za();return e.headers.Authorization=`Bearer ${t}`,e}catch(e){return Promise.reject(e)}if(wa())return Na().handleAuthFailure(`expired`),Promise.reject(Error(`Token expired`));e.headers.Authorization=`Bearer ${t}`}return e},e=>(console.error(`Auth API Request Error:`,e),Promise.reject(e))),Ba.interceptors.response.use(e=>e,e=>{if(e.response?.status===401||e.response?.status===403){let t=(e.config?.headers?.Authorization)?.replace(`Bearer `,``),n=Y();(!t||t===n)&&Na().handleAuthFailure(e.response?.status===403?`forbidden`:`unauthorized`)}return console.error(`Auth API Response Error:`,e.response?.data||e.message),Promise.reject(e)}),$.interceptors.request.use(async e=>{if(e.url?.includes(`/auth/login`))return e;let t=Y();if(t){if(Ta())try{let t=await za();return e.headers.Authorization=`Bearer ${t}`,e}catch(e){return Promise.reject(e)}if(wa())return Na().handleAuthFailure(`expired`),Promise.reject(Error(`Token expired`));e.headers.Authorization=`Bearer ${t}`}return e},e=>(console.error(`API Request Error:`,e),Promise.reject(e))),$.interceptors.response.use(e=>e,e=>{if(e.response?.status===401||e.response?.status===403){let t=(e.config?.headers?.Authorization)?.replace(`Bearer `,``),n=Y();(!t||t===n)&&Na().handleAuthFailure(e.response?.status===403?`forbidden`:`unauthorized`)}return console.error(`API Response Error:`,e.response?.data||e.message),Promise.reject(e)});var Va=class{static async resolveRequestToken(){let e=Y();if(e){if(Ta())return za();if(wa())throw Na().handleAuthFailure(`expired`),Error(`Token expired`);return e}}static async getGeneratedRequestParams(){let e=await this.resolveRequestToken();return e?{headers:{Authorization:`Bearer ${e}`}}:{}}static async get(e,t,n){try{return(await $.get(e,{params:t,...n})).data}catch(e){throw this.handleError(e)}}static async post(e,t,n){try{return(await $.post(e,t,n)).data}catch(e){throw this.handleError(e)}}static async put(e,t,n){try{return(await $.put(e,t,n)).data}catch(e){throw this.handleError(e)}}static async delete(e,t){try{return(await $.delete(e,t)).data}catch(e){throw this.handleError(e)}}static async getTransportKeys(){try{let e=await this.getGeneratedRequestParams();return(await Q.transportKeys.transportKeysList(e)).data}catch(e){throw this.handleError(e)}}static async sendAdvert(){try{let e=await this.getGeneratedRequestParams();return(await Q.sendAdvert.sendAdvertCreate(e)).data}catch(e){throw this.handleError(e)}}static async getGpsDiagnostics(){try{let e=await this.getGeneratedRequestParams();return(await Q.gps.getGps(e)).data}catch(e){throw this.handleError(e)}}static async getSerialPorts(){try{let e=await this.getGeneratedRequestParams();return(await Q.serialPorts.serialPortsList(e)).data}catch(e){throw this.handleError(e)}}static async createTransportKey(e,t,n,r,i){let a={name:e,flood_policy:t,parent_id:r,last_used:i};n!==void 0&&(a.transport_key=n);try{let e=await this.getGeneratedRequestParams();return(await Q.transportKeys.transportKeysCreate(a,e)).data}catch(e){throw this.handleError(e)}}static async getTransportKey(e){try{let t=await this.getGeneratedRequestParams();return(await Q.transportKey.transportKeyList({key_id:String(e)},t)).data}catch(e){throw this.handleError(e)}}static async updateTransportKey(e,t,n,r,i,a){try{let o=await this.getGeneratedRequestParams();return(await Q.transportKey.transportKeyUpdate({key_id:String(e)},{name:t,flood_policy:n,transport_key:r,parent_id:i,last_used:a},o)).data}catch(e){throw this.handleError(e)}}static async deleteTransportKey(e){try{let t=await this.getGeneratedRequestParams();return(await Q.transportKey.transportKeyDelete({key_id:String(e)},t)).data}catch(e){throw this.handleError(e)}}static async updateUnscopedFloodPolicy(e){try{let t=await this.getGeneratedRequestParams();return(await Q.unscopedFloodPolicy.unscopedFloodPolicyCreate({unscoped_flood_allow:e},t)).data}catch(e){throw this.handleError(e)}}static async getPolicyDocument(){try{let e=await this.getGeneratedRequestParams();return(await Q.policy.policyList(e)).data}catch(e){throw this.handleError(e)}}static async updatePolicyDocument(e){try{let t=await this.getGeneratedRequestParams();return(await Q.policy.policyCreate(e,t)).data}catch(e){throw this.handleError(e)}}static async validatePolicyDocument(e){try{let t=await this.getGeneratedRequestParams();return(await Q.policyValidate.policyValidateCreate(e,t)).data}catch(e){throw this.handleError(e)}}static async getPolicyGroups(e){try{let t=await this.getGeneratedRequestParams();return(await Q.policyGroups.policyGroupsList(e?{kind:e}:void 0,t)).data}catch(e){throw this.handleError(e)}}static async createPolicyGroup(e){try{let t=await this.getGeneratedRequestParams();return(await Q.policyGroups.policyGroupsCreate(e,t)).data}catch(e){throw this.handleError(e)}}static async deletePolicyGroup(e){try{let t=await this.getGeneratedRequestParams();return(await $.delete(`/policy_groups`,{headers:Fa(t.headers),data:e,params:e})).data}catch(e){throw this.handleError(e)}}static async getPolicyGroupEntries(e){try{let t=await this.getGeneratedRequestParams();return(await Q.policyGroupEntries.policyGroupEntriesList(e,t)).data}catch(e){throw this.handleError(e)}}static async createPolicyGroupEntry(e){try{let t=await this.getGeneratedRequestParams();return(await Q.policyGroupEntries.policyGroupEntriesCreate(e,t)).data}catch(e){throw this.handleError(e)}}static async deletePolicyGroupEntry(e){try{let t=await this.getGeneratedRequestParams();return(await $.delete(`/policy_group_entries`,{headers:Fa(t.headers),data:e,params:e})).data}catch(e){throw this.handleError(e)}}static async getLogs(){try{let e=await this.getGeneratedRequestParams();return(await Q.logs.logsList(e)).data}catch(e){throw this.handleError(e)}}static async deleteAdvert(e){try{let t=await this.getGeneratedRequestParams();return(await Q.advert.advertDelete({advert_id:e},t)).data}catch(e){throw this.handleError(e)}}static async pingNeighbor(e,t=10){try{let n=await this.getGeneratedRequestParams();return(await Q.pingNeighbor.pingNeighborCreate({target_id:e,timeout:t},n)).data}catch(e){throw this.handleError(e)}}static async getIdentities(){try{let e=await this.getGeneratedRequestParams();return(await Q.identities.identitiesList(e)).data}catch(e){throw this.handleError(e)}}static async getIdentity(e){try{let t=await this.getGeneratedRequestParams();return(await Q.identity.identityList({name:e},t)).data}catch(e){throw this.handleError(e)}}static async createIdentity(e){try{let t=await this.getGeneratedRequestParams();if(e.type!==`companion`&&e.type!==`room_server`)throw Error(`Unsupported identity type: ${e.type}`);return(await Q.createIdentity.createIdentityCreate({name:e.name,identity_key:e.identity_key,type:e.type,settings:e.settings},t)).data}catch(e){throw this.handleError(e)}}static async updateIdentity(e){try{let t=await this.getGeneratedRequestParams(),n={type:e.type,name:e.name,new_name:e.new_name,identity_key:e.identity_key,settings:e.settings};return(await Q.updateIdentity.updateIdentityUpdate(n,t)).data}catch(e){throw this.handleError(e)}}static async deleteIdentity(e,t=`room_server`){try{let n=await this.getGeneratedRequestParams();return(await Q.deleteIdentity.deleteIdentityDelete({name:e,type:t},n)).data}catch(e){throw this.handleError(e)}}static async sendRoomServerAdvert(e){try{let t=await this.getGeneratedRequestParams();return(await Q.sendRoomServerAdvert.sendRoomServerAdvertCreate({name:e},t)).data}catch(e){throw this.handleError(e)}}static async importRepeaterContacts(e){try{let t=await this.getGeneratedRequestParams();return(await Q.companion.importRepeaterContactsCreate(e,t)).data}catch(e){throw this.handleError(e)}}static async getACLInfo(){try{let e=await this.getGeneratedRequestParams();return(await Q.aclInfo.aclInfoList(e)).data}catch(e){throw this.handleError(e)}}static async getACLClients(e){try{let t=await this.getGeneratedRequestParams();return(await Q.aclClients.aclClientsList(e,t)).data}catch(e){throw this.handleError(e)}}static async removeACLClient(e){try{let t=await this.getGeneratedRequestParams();return(await Q.aclRemoveClient.aclRemoveClientCreate({client_pubkey:e.public_key,identity_hash:e.identity_hash??``},t)).data}catch(e){throw this.handleError(e)}}static async getACLStats(){try{let e=await this.getGeneratedRequestParams();return(await Q.aclStats.aclStatsList(e)).data}catch(e){throw this.handleError(e)}}static async getRoomMessages(e){try{let t=await this.getGeneratedRequestParams();return(await Q.roomMessages.roomMessagesList(e,t)).data}catch(e){throw this.handleError(e)}}static async postRoomMessage(e){try{let t=await this.getGeneratedRequestParams();return(await Q.roomPostMessage.roomPostMessageCreate(e,t)).data}catch(e){throw this.handleError(e)}}static async deleteRoomMessage(e){try{let t=await this.getGeneratedRequestParams();return await Q.roomMessage.roomMessageDelete({room_name:e.room_name,message_id:e.message_id},t),{success:!0}}catch(e){throw this.handleError(e)}}static async clearRoomMessages(e){try{let t=await this.getGeneratedRequestParams();return(await Q.roomMessagesClear.roomMessagesClearDelete({room_name:e},t)).data}catch(e){throw this.handleError(e)}}static async getRoomStats(e){try{let t=await this.getGeneratedRequestParams();return(await Q.roomStats.roomStatsList(e?{room_name:e}:void 0,t)).data}catch(e){throw this.handleError(e)}}static async getRoomClients(e){try{let t=await this.getGeneratedRequestParams();return(await Q.roomClients.roomClientsList({room_name:e},t)).data}catch(e){throw this.handleError(e)}}static async exportConfig(e=!1){try{let t=await this.getGeneratedRequestParams();return(await Q.configExport.configExportList(e?{include_secrets:!0}:void 0,t)).data}catch(e){throw this.handleError(e)}}static async importConfig(e){try{let t=await this.getGeneratedRequestParams();return(await Q.configImport.configImportCreate({config:e},t)).data}catch(e){throw this.handleError(e)}}static async exportIdentityKey(){try{let e=await this.getGeneratedRequestParams();return(await Q.identityExport.identityExportList(e)).data}catch(e){throw this.handleError(e)}}static async generateVanityKey(e,t=!1){try{let n=await this.getGeneratedRequestParams();return(await Q.generateVanityKey.generateVanityKeyCreate({prefix:e,apply:t},n)).data}catch(e){throw this.handleError(e)}}static async getDbStats(){try{let e=await this.getGeneratedRequestParams();return(await Q.dbStats.dbStatsList(e)).data}catch(e){throw this.handleError(e)}}static async purgeTable(e){try{let t=await this.getGeneratedRequestParams();return(await Q.dbPurge.dbPurgeCreate({tables:e},t)).data}catch(e){throw this.handleError(e)}}static async vacuumDb(){try{let e=await this.getGeneratedRequestParams();return(await Q.dbVacuum.dbVacuumCreate(e)).data}catch(e){throw this.handleError(e)}}static handleError(e){if(J.isAxiosError(e)){if(e.response){let t=e.response.data?.error||e.response.data?.message||`HTTP ${e.response.status}`;return Error(t)}else if(e.request)return Error(`Network error - no response received`)}return Error(e instanceof Error?e.message:`Unknown error occurred`)}};export{_e as _,Aa as a,ya as c,wa as d,ba as f,Ue as g,We as h,Na as i,Y as l,Ut as m,$ as n,X as o,Ht as p,Ba as r,xa as s,Va as t,Ea as u,Oe as v,ke as y}; \ No newline at end of file diff --git a/repeater/web/html/assets/chartjs-adapter-date-fns.esm-DfIbzYql.js b/repeater/web/html/assets/chartjs-adapter-date-fns.esm-kFk3lIdz.js similarity index 99% rename from repeater/web/html/assets/chartjs-adapter-date-fns.esm-DfIbzYql.js rename to repeater/web/html/assets/chartjs-adapter-date-fns.esm-kFk3lIdz.js index eed7362..04c0d23 100644 --- a/repeater/web/html/assets/chartjs-adapter-date-fns.esm-DfIbzYql.js +++ b/repeater/web/html/assets/chartjs-adapter-date-fns.esm-kFk3lIdz.js @@ -1 +1 @@ -import{h as e}from"./ChartCard-DSqBTrdz.js";var t=365.2425,n=6048e5,r=864e5,i=6e4,a=36e5,o=1e3,s=3600*24;s*7,s*t/12*3;var c=Symbol.for(`constructDateFrom`);function l(e,t){return typeof e==`function`?e(t):e&&typeof e==`object`&&c in e?e[c](t):e instanceof Date?new e.constructor(t):new Date(t)}function u(e,t){return l(t||e,e)}function d(e,t,n){let r=u(e,n?.in);return isNaN(t)?l(n?.in||e,NaN):(t&&r.setDate(r.getDate()+t),r)}function f(e,t,n){let r=u(e,n?.in);if(isNaN(t))return l(n?.in||e,NaN);if(!t)return r;let i=r.getDate(),a=l(n?.in||e,r.getTime());return a.setMonth(r.getMonth()+t+1,0),i>=a.getDate()?a:(r.setFullYear(a.getFullYear(),a.getMonth(),i),r)}function p(e,t,n){return l(n?.in||e,+u(e)+t)}function m(e,t,n){return p(e,t*a,n)}var h={};function g(){return h}function _(e,t){let n=g(),r=t?.weekStartsOn??t?.locale?.options?.weekStartsOn??n.weekStartsOn??n.locale?.options?.weekStartsOn??0,i=u(e,t?.in),a=i.getDay(),o=(a=a.getTime()?r+1:n.getTime()>=s.getTime()?r:r-1}function y(e){let t=u(e),n=new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()));return n.setUTCFullYear(t.getFullYear()),e-+n}function b(e,...t){let n=l.bind(null,e||t.find(e=>typeof e==`object`));return t.map(n)}function x(e,t){let n=u(e,t?.in);return n.setHours(0,0,0,0),n}function te(e,t,n){let[i,a]=b(n?.in,e,t),o=x(i),s=x(a),c=+o-y(o),l=+s-y(s);return Math.round((c-l)/r)}function ne(e,t){let n=ee(e,t),r=l(t?.in||e,0);return r.setFullYear(n,0,4),r.setHours(0,0,0,0),v(r)}function re(e,t,n){let r=u(e,n?.in);return r.setTime(r.getTime()+t*i),r}function ie(e,t,n){return f(e,t*3,n)}function ae(e,t,n){return p(e,t*1e3,n)}function oe(e,t,n){return d(e,t*7,n)}function se(e,t,n){return f(e,t*12,n)}function S(e,t){let n=u(e)-+u(t);return n<0?-1:n>0?1:n}function ce(e){return e instanceof Date||typeof e==`object`&&Object.prototype.toString.call(e)===`[object Date]`}function C(e){return!(!ce(e)&&typeof e!=`number`||isNaN(+u(e)))}function le(e,t,n){let[r,i]=b(n?.in,e,t),a=r.getFullYear()-i.getFullYear(),o=r.getMonth()-i.getMonth();return a*12+o}function ue(e,t,n){let[r,i]=b(n?.in,e,t);return r.getFullYear()-i.getFullYear()}function de(e,t,n){let[r,i]=b(n?.in,e,t),a=fe(r,i),o=Math.abs(te(r,i));r.setDate(r.getDate()-a*o);let s=a*(o-Number(fe(r,i)===-a));return s===0?0:s}function fe(e,t){let n=e.getFullYear()-t.getFullYear()||e.getMonth()-t.getMonth()||e.getDate()-t.getDate()||e.getHours()-t.getHours()||e.getMinutes()-t.getMinutes()||e.getSeconds()-t.getSeconds()||e.getMilliseconds()-t.getMilliseconds();return n<0?-1:n>0?1:n}function w(e){return t=>{let n=(e?Math[e]:Math.trunc)(t);return n===0?0:n}}function pe(e,t,n){let[r,i]=b(n?.in,e,t),o=(r-+i)/a;return w(n?.roundingMethod)(o)}function T(e,t){return u(e)-+u(t)}function me(e,t,n){let r=T(e,t)/i;return w(n?.roundingMethod)(r)}function he(e,t){let n=u(e,t?.in);return n.setHours(23,59,59,999),n}function ge(e,t){let n=u(e,t?.in),r=n.getMonth();return n.setFullYear(n.getFullYear(),r+1,0),n.setHours(23,59,59,999),n}function _e(e,t){let n=u(e,t?.in);return+he(n,t)==+ge(n,t)}function ve(e,t,n){let[r,i,a]=b(n?.in,e,e,t),o=S(i,a),s=Math.abs(le(i,a));if(s<1)return 0;i.getMonth()===1&&i.getDate()>27&&i.setDate(30),i.setMonth(i.getMonth()-o*s);let c=S(i,a)===-o;_e(r)&&s===1&&S(r,a)===1&&(c=!1);let l=o*(s-+c);return l===0?0:l}function ye(e,t,n){let r=ve(e,t,n)/3;return w(n?.roundingMethod)(r)}function be(e,t,n){let r=T(e,t)/1e3;return w(n?.roundingMethod)(r)}function xe(e,t,n){let r=de(e,t,n)/7;return w(n?.roundingMethod)(r)}function Se(e,t,n){let[r,i]=b(n?.in,e,t),a=S(r,i),o=Math.abs(ue(r,i));r.setFullYear(1584),i.setFullYear(1584);let s=a*(o-+(S(r,i)===-a));return s===0?0:s}function Ce(e,t){let n=u(e,t?.in),r=n.getMonth(),i=r-r%3;return n.setMonth(i,1),n.setHours(0,0,0,0),n}function we(e,t){let n=u(e,t?.in);return n.setDate(1),n.setHours(0,0,0,0),n}function Te(e,t){let n=u(e,t?.in),r=n.getFullYear();return n.setFullYear(r+1,0,0),n.setHours(23,59,59,999),n}function Ee(e,t){let n=u(e,t?.in);return n.setFullYear(n.getFullYear(),0,1),n.setHours(0,0,0,0),n}function De(e,t){let n=u(e,t?.in);return n.setMinutes(59,59,999),n}function Oe(e,t){let n=g(),r=t?.weekStartsOn??t?.locale?.options?.weekStartsOn??n.weekStartsOn??n.locale?.options?.weekStartsOn??0,i=u(e,t?.in),a=i.getDay(),o=(a{let r,i=Me[e];return r=typeof i==`string`?i:t===1?i.one:i.other.replace(`{{count}}`,t.toString()),n?.addSuffix?n.comparison&&n.comparison>0?`in `+r:r+` ago`:r};function E(e){return(t={})=>{let n=t.width?String(t.width):e.defaultWidth;return e.formats[n]||e.formats[e.defaultWidth]}}var Pe={date:E({formats:{full:`EEEE, MMMM do, y`,long:`MMMM do, y`,medium:`MMM d, y`,short:`MM/dd/yyyy`},defaultWidth:`full`}),time:E({formats:{full:`h:mm:ss a zzzz`,long:`h:mm:ss a z`,medium:`h:mm:ss a`,short:`h:mm a`},defaultWidth:`full`}),dateTime:E({formats:{full:`{{date}} 'at' {{time}}`,long:`{{date}} 'at' {{time}}`,medium:`{{date}}, {{time}}`,short:`{{date}}, {{time}}`},defaultWidth:`full`})},Fe={lastWeek:`'last' eeee 'at' p`,yesterday:`'yesterday at' p`,today:`'today at' p`,tomorrow:`'tomorrow at' p`,nextWeek:`eeee 'at' p`,other:`P`},Ie=(e,t,n,r)=>Fe[e];function D(e){return(t,n)=>{let r=n?.context?String(n.context):`standalone`,i;if(r===`formatting`&&e.formattingValues){let t=e.defaultFormattingWidth||e.defaultWidth,r=n?.width?String(n.width):t;i=e.formattingValues[r]||e.formattingValues[t]}else{let t=e.defaultWidth,r=n?.width?String(n.width):e.defaultWidth;i=e.values[r]||e.values[t]}let a=e.argumentCallback?e.argumentCallback(t):t;return i[a]}}var Le={ordinalNumber:(e,t)=>{let n=Number(e),r=n%100;if(r>20||r<10)switch(r%10){case 1:return n+`st`;case 2:return n+`nd`;case 3:return n+`rd`}return n+`th`},era:D({values:{narrow:[`B`,`A`],abbreviated:[`BC`,`AD`],wide:[`Before Christ`,`Anno Domini`]},defaultWidth:`wide`}),quarter:D({values:{narrow:[`1`,`2`,`3`,`4`],abbreviated:[`Q1`,`Q2`,`Q3`,`Q4`],wide:[`1st quarter`,`2nd quarter`,`3rd quarter`,`4th quarter`]},defaultWidth:`wide`,argumentCallback:e=>e-1}),month:D({values:{narrow:[`J`,`F`,`M`,`A`,`M`,`J`,`J`,`A`,`S`,`O`,`N`,`D`],abbreviated:[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],wide:[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`]},defaultWidth:`wide`}),day:D({values:{narrow:[`S`,`M`,`T`,`W`,`T`,`F`,`S`],short:[`Su`,`Mo`,`Tu`,`We`,`Th`,`Fr`,`Sa`],abbreviated:[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],wide:[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`]},defaultWidth:`wide`}),dayPeriod:D({values:{narrow:{am:`a`,pm:`p`,midnight:`mi`,noon:`n`,morning:`morning`,afternoon:`afternoon`,evening:`evening`,night:`night`},abbreviated:{am:`AM`,pm:`PM`,midnight:`midnight`,noon:`noon`,morning:`morning`,afternoon:`afternoon`,evening:`evening`,night:`night`},wide:{am:`a.m.`,pm:`p.m.`,midnight:`midnight`,noon:`noon`,morning:`morning`,afternoon:`afternoon`,evening:`evening`,night:`night`}},defaultWidth:`wide`,formattingValues:{narrow:{am:`a`,pm:`p`,midnight:`mi`,noon:`n`,morning:`in the morning`,afternoon:`in the afternoon`,evening:`in the evening`,night:`at night`},abbreviated:{am:`AM`,pm:`PM`,midnight:`midnight`,noon:`noon`,morning:`in the morning`,afternoon:`in the afternoon`,evening:`in the evening`,night:`at night`},wide:{am:`a.m.`,pm:`p.m.`,midnight:`midnight`,noon:`noon`,morning:`in the morning`,afternoon:`in the afternoon`,evening:`in the evening`,night:`at night`}},defaultFormattingWidth:`wide`})};function O(e){return(t,n={})=>{let r=n.width,i=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],a=t.match(i);if(!a)return null;let o=a[0],s=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth],c=Array.isArray(s)?ze(s,e=>e.test(o)):Re(s,e=>e.test(o)),l;l=e.valueCallback?e.valueCallback(c):c,l=n.valueCallback?n.valueCallback(l):l;let u=t.slice(o.length);return{value:l,rest:u}}}function Re(e,t){for(let n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&t(e[n]))return n}function ze(e,t){for(let n=0;n{let r=t.match(e.matchPattern);if(!r)return null;let i=r[0],a=t.match(e.parsePattern);if(!a)return null;let o=e.valueCallback?e.valueCallback(a[0]):a[0];o=n.valueCallback?n.valueCallback(o):o;let s=t.slice(i.length);return{value:o,rest:s}}}var Ve={code:`en-US`,formatDistance:Ne,formatLong:Pe,formatRelative:Ie,localize:Le,match:{ordinalNumber:Be({matchPattern:/^(\d+)(th|st|nd|rd)?/i,parsePattern:/\d+/i,valueCallback:e=>parseInt(e,10)}),era:O({matchPatterns:{narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/^b/i,/^(a|c)/i]},defaultParseWidth:`any`}),quarter:O({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/1/i,/2/i,/3/i,/4/i]},defaultParseWidth:`any`,valueCallback:e=>e+1}),month:O({matchPatterns:{narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},defaultMatchWidth:`wide`,parsePatterns:{narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},defaultParseWidth:`any`}),day:O({matchPatterns:{narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},defaultMatchWidth:`wide`,parsePatterns:{narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},defaultParseWidth:`any`}),dayPeriod:O({matchPatterns:{narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},defaultMatchWidth:`any`,parsePatterns:{any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},defaultParseWidth:`any`})},options:{weekStartsOn:0,firstWeekContainsDate:1}};function He(e,t){let n=u(e,t?.in);return te(n,Ee(n))+1}function Ue(e,t){let r=u(e,t?.in),i=v(r)-+ne(r);return Math.round(i/n)+1}function k(e,t){let n=u(e,t?.in),r=n.getFullYear(),i=g(),a=t?.firstWeekContainsDate??t?.locale?.options?.firstWeekContainsDate??i.firstWeekContainsDate??i.locale?.options?.firstWeekContainsDate??1,o=l(t?.in||e,0);o.setFullYear(r+1,0,a),o.setHours(0,0,0,0);let s=_(o,t),c=l(t?.in||e,0);c.setFullYear(r,0,a),c.setHours(0,0,0,0);let d=_(c,t);return+n>=+s?r+1:+n>=+d?r:r-1}function We(e,t){let n=g(),r=t?.firstWeekContainsDate??t?.locale?.options?.firstWeekContainsDate??n.firstWeekContainsDate??n.locale?.options?.firstWeekContainsDate??1,i=k(e,t),a=l(t?.in||e,0);return a.setFullYear(i,0,r),a.setHours(0,0,0,0),_(a,t)}function A(e,t){let r=u(e,t?.in),i=_(r,t)-+We(r,t);return Math.round(i/n)+1}function j(e,t){return(e<0?`-`:``)+Math.abs(e).toString().padStart(t,`0`)}var M={y(e,t){let n=e.getFullYear(),r=n>0?n:1-n;return j(t===`yy`?r%100:r,t.length)},M(e,t){let n=e.getMonth();return t===`M`?String(n+1):j(n+1,2)},d(e,t){return j(e.getDate(),t.length)},a(e,t){let n=e.getHours()/12>=1?`pm`:`am`;switch(t){case`a`:case`aa`:return n.toUpperCase();case`aaa`:return n;case`aaaaa`:return n[0];default:return n===`am`?`a.m.`:`p.m.`}},h(e,t){return j(e.getHours()%12||12,t.length)},H(e,t){return j(e.getHours(),t.length)},m(e,t){return j(e.getMinutes(),t.length)},s(e,t){return j(e.getSeconds(),t.length)},S(e,t){let n=t.length,r=e.getMilliseconds();return j(Math.trunc(r*10**(n-3)),t.length)}},N={am:`am`,pm:`pm`,midnight:`midnight`,noon:`noon`,morning:`morning`,afternoon:`afternoon`,evening:`evening`,night:`night`},Ge={G:function(e,t,n){let r=e.getFullYear()>0?1:0;switch(t){case`G`:case`GG`:case`GGG`:return n.era(r,{width:`abbreviated`});case`GGGGG`:return n.era(r,{width:`narrow`});default:return n.era(r,{width:`wide`})}},y:function(e,t,n){if(t===`yo`){let t=e.getFullYear(),r=t>0?t:1-t;return n.ordinalNumber(r,{unit:`year`})}return M.y(e,t)},Y:function(e,t,n,r){let i=k(e,r),a=i>0?i:1-i;return t===`YY`?j(a%100,2):t===`Yo`?n.ordinalNumber(a,{unit:`year`}):j(a,t.length)},R:function(e,t){return j(ee(e),t.length)},u:function(e,t){return j(e.getFullYear(),t.length)},Q:function(e,t,n){let r=Math.ceil((e.getMonth()+1)/3);switch(t){case`Q`:return String(r);case`QQ`:return j(r,2);case`Qo`:return n.ordinalNumber(r,{unit:`quarter`});case`QQQ`:return n.quarter(r,{width:`abbreviated`,context:`formatting`});case`QQQQQ`:return n.quarter(r,{width:`narrow`,context:`formatting`});default:return n.quarter(r,{width:`wide`,context:`formatting`})}},q:function(e,t,n){let r=Math.ceil((e.getMonth()+1)/3);switch(t){case`q`:return String(r);case`qq`:return j(r,2);case`qo`:return n.ordinalNumber(r,{unit:`quarter`});case`qqq`:return n.quarter(r,{width:`abbreviated`,context:`standalone`});case`qqqqq`:return n.quarter(r,{width:`narrow`,context:`standalone`});default:return n.quarter(r,{width:`wide`,context:`standalone`})}},M:function(e,t,n){let r=e.getMonth();switch(t){case`M`:case`MM`:return M.M(e,t);case`Mo`:return n.ordinalNumber(r+1,{unit:`month`});case`MMM`:return n.month(r,{width:`abbreviated`,context:`formatting`});case`MMMMM`:return n.month(r,{width:`narrow`,context:`formatting`});default:return n.month(r,{width:`wide`,context:`formatting`})}},L:function(e,t,n){let r=e.getMonth();switch(t){case`L`:return String(r+1);case`LL`:return j(r+1,2);case`Lo`:return n.ordinalNumber(r+1,{unit:`month`});case`LLL`:return n.month(r,{width:`abbreviated`,context:`standalone`});case`LLLLL`:return n.month(r,{width:`narrow`,context:`standalone`});default:return n.month(r,{width:`wide`,context:`standalone`})}},w:function(e,t,n,r){let i=A(e,r);return t===`wo`?n.ordinalNumber(i,{unit:`week`}):j(i,t.length)},I:function(e,t,n){let r=Ue(e);return t===`Io`?n.ordinalNumber(r,{unit:`week`}):j(r,t.length)},d:function(e,t,n){return t===`do`?n.ordinalNumber(e.getDate(),{unit:`date`}):M.d(e,t)},D:function(e,t,n){let r=He(e);return t===`Do`?n.ordinalNumber(r,{unit:`dayOfYear`}):j(r,t.length)},E:function(e,t,n){let r=e.getDay();switch(t){case`E`:case`EE`:case`EEE`:return n.day(r,{width:`abbreviated`,context:`formatting`});case`EEEEE`:return n.day(r,{width:`narrow`,context:`formatting`});case`EEEEEE`:return n.day(r,{width:`short`,context:`formatting`});default:return n.day(r,{width:`wide`,context:`formatting`})}},e:function(e,t,n,r){let i=e.getDay(),a=(i-r.weekStartsOn+8)%7||7;switch(t){case`e`:return String(a);case`ee`:return j(a,2);case`eo`:return n.ordinalNumber(a,{unit:`day`});case`eee`:return n.day(i,{width:`abbreviated`,context:`formatting`});case`eeeee`:return n.day(i,{width:`narrow`,context:`formatting`});case`eeeeee`:return n.day(i,{width:`short`,context:`formatting`});default:return n.day(i,{width:`wide`,context:`formatting`})}},c:function(e,t,n,r){let i=e.getDay(),a=(i-r.weekStartsOn+8)%7||7;switch(t){case`c`:return String(a);case`cc`:return j(a,t.length);case`co`:return n.ordinalNumber(a,{unit:`day`});case`ccc`:return n.day(i,{width:`abbreviated`,context:`standalone`});case`ccccc`:return n.day(i,{width:`narrow`,context:`standalone`});case`cccccc`:return n.day(i,{width:`short`,context:`standalone`});default:return n.day(i,{width:`wide`,context:`standalone`})}},i:function(e,t,n){let r=e.getDay(),i=r===0?7:r;switch(t){case`i`:return String(i);case`ii`:return j(i,t.length);case`io`:return n.ordinalNumber(i,{unit:`day`});case`iii`:return n.day(r,{width:`abbreviated`,context:`formatting`});case`iiiii`:return n.day(r,{width:`narrow`,context:`formatting`});case`iiiiii`:return n.day(r,{width:`short`,context:`formatting`});default:return n.day(r,{width:`wide`,context:`formatting`})}},a:function(e,t,n){let r=e.getHours()/12>=1?`pm`:`am`;switch(t){case`a`:case`aa`:return n.dayPeriod(r,{width:`abbreviated`,context:`formatting`});case`aaa`:return n.dayPeriod(r,{width:`abbreviated`,context:`formatting`}).toLowerCase();case`aaaaa`:return n.dayPeriod(r,{width:`narrow`,context:`formatting`});default:return n.dayPeriod(r,{width:`wide`,context:`formatting`})}},b:function(e,t,n){let r=e.getHours(),i;switch(i=r===12?N.noon:r===0?N.midnight:r/12>=1?`pm`:`am`,t){case`b`:case`bb`:return n.dayPeriod(i,{width:`abbreviated`,context:`formatting`});case`bbb`:return n.dayPeriod(i,{width:`abbreviated`,context:`formatting`}).toLowerCase();case`bbbbb`:return n.dayPeriod(i,{width:`narrow`,context:`formatting`});default:return n.dayPeriod(i,{width:`wide`,context:`formatting`})}},B:function(e,t,n){let r=e.getHours(),i;switch(i=r>=17?N.evening:r>=12?N.afternoon:r>=4?N.morning:N.night,t){case`B`:case`BB`:case`BBB`:return n.dayPeriod(i,{width:`abbreviated`,context:`formatting`});case`BBBBB`:return n.dayPeriod(i,{width:`narrow`,context:`formatting`});default:return n.dayPeriod(i,{width:`wide`,context:`formatting`})}},h:function(e,t,n){if(t===`ho`){let t=e.getHours()%12;return t===0&&(t=12),n.ordinalNumber(t,{unit:`hour`})}return M.h(e,t)},H:function(e,t,n){return t===`Ho`?n.ordinalNumber(e.getHours(),{unit:`hour`}):M.H(e,t)},K:function(e,t,n){let r=e.getHours()%12;return t===`Ko`?n.ordinalNumber(r,{unit:`hour`}):j(r,t.length)},k:function(e,t,n){let r=e.getHours();return r===0&&(r=24),t===`ko`?n.ordinalNumber(r,{unit:`hour`}):j(r,t.length)},m:function(e,t,n){return t===`mo`?n.ordinalNumber(e.getMinutes(),{unit:`minute`}):M.m(e,t)},s:function(e,t,n){return t===`so`?n.ordinalNumber(e.getSeconds(),{unit:`second`}):M.s(e,t)},S:function(e,t){return M.S(e,t)},X:function(e,t,n){let r=e.getTimezoneOffset();if(r===0)return`Z`;switch(t){case`X`:return qe(r);case`XXXX`:case`XX`:return P(r);default:return P(r,`:`)}},x:function(e,t,n){let r=e.getTimezoneOffset();switch(t){case`x`:return qe(r);case`xxxx`:case`xx`:return P(r);default:return P(r,`:`)}},O:function(e,t,n){let r=e.getTimezoneOffset();switch(t){case`O`:case`OO`:case`OOO`:return`GMT`+Ke(r,`:`);default:return`GMT`+P(r,`:`)}},z:function(e,t,n){let r=e.getTimezoneOffset();switch(t){case`z`:case`zz`:case`zzz`:return`GMT`+Ke(r,`:`);default:return`GMT`+P(r,`:`)}},t:function(e,t,n){return j(Math.trunc(e/1e3),t.length)},T:function(e,t,n){return j(+e,t.length)}};function Ke(e,t=``){let n=e>0?`-`:`+`,r=Math.abs(e),i=Math.trunc(r/60),a=r%60;return a===0?n+String(i):n+String(i)+t+j(a,2)}function qe(e,t){return e%60==0?(e>0?`-`:`+`)+j(Math.abs(e)/60,2):P(e,t)}function P(e,t=``){let n=e>0?`-`:`+`,r=Math.abs(e),i=j(Math.trunc(r/60),2),a=j(r%60,2);return n+i+t+a}var F=(e,t)=>{switch(e){case`P`:return t.date({width:`short`});case`PP`:return t.date({width:`medium`});case`PPP`:return t.date({width:`long`});default:return t.date({width:`full`})}},I=(e,t)=>{switch(e){case`p`:return t.time({width:`short`});case`pp`:return t.time({width:`medium`});case`ppp`:return t.time({width:`long`});default:return t.time({width:`full`})}},L={p:I,P:(e,t)=>{let n=e.match(/(P+)(p+)?/)||[],r=n[1],i=n[2];if(!i)return F(e,t);let a;switch(r){case`P`:a=t.dateTime({width:`short`});break;case`PP`:a=t.dateTime({width:`medium`});break;case`PPP`:a=t.dateTime({width:`long`});break;default:a=t.dateTime({width:`full`});break}return a.replace(`{{date}}`,F(r,t)).replace(`{{time}}`,I(i,t))}},Je=/^D+$/,Ye=/^Y+$/,Xe=[`D`,`DD`,`YY`,`YYYY`];function R(e){return Je.test(e)}function z(e){return Ye.test(e)}function B(e,t,n){let r=Ze(e,t,n);if(console.warn(r),Xe.includes(e))throw RangeError(r)}function Ze(e,t,n){let r=e[0]===`Y`?`years`:`days of the month`;return`Use \`${e.toLowerCase()}\` instead of \`${e}\` (in \`${t}\`) for formatting ${r} to the input \`${n}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`}var Qe=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,$e=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,et=/^'([^]*?)'?$/,tt=/''/g,nt=/[a-zA-Z]/;function rt(e,t,n){let r=g(),i=n?.locale??r.locale??Ve,a=n?.firstWeekContainsDate??n?.locale?.options?.firstWeekContainsDate??r.firstWeekContainsDate??r.locale?.options?.firstWeekContainsDate??1,o=n?.weekStartsOn??n?.locale?.options?.weekStartsOn??r.weekStartsOn??r.locale?.options?.weekStartsOn??0,s=u(e,n?.in);if(!C(s))throw RangeError(`Invalid time value`);let c=t.match($e).map(e=>{let t=e[0];if(t===`p`||t===`P`){let n=L[t];return n(e,i.formatLong)}return e}).join(``).match(Qe).map(e=>{if(e===`''`)return{isToken:!1,value:`'`};let t=e[0];if(t===`'`)return{isToken:!1,value:it(e)};if(Ge[t])return{isToken:!0,value:e};if(t.match(nt))throw RangeError("Format string contains an unescaped latin alphabet character `"+t+"`");return{isToken:!1,value:e}});i.localize.preprocessor&&(c=i.localize.preprocessor(s,c));let l={firstWeekContainsDate:a,weekStartsOn:o,locale:i};return c.map(r=>{if(!r.isToken)return r.value;let a=r.value;(!n?.useAdditionalWeekYearTokens&&z(a)||!n?.useAdditionalDayOfYearTokens&&R(a))&&B(a,t,String(e));let o=Ge[a[0]];return o(s,a,i.localize,l)}).join(``)}function it(e){let t=e.match(et);return t?t[1].replace(tt,`'`):e}function at(){return Object.assign({},g())}function ot(e,t){let n=u(e,t?.in).getDay();return n===0?7:n}function st(e,t){let n=ct(t)?new t(0):l(t,0);return n.setFullYear(e.getFullYear(),e.getMonth(),e.getDate()),n.setHours(e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()),n}function ct(e){return typeof e==`function`&&e.prototype?.constructor===e}var lt=10,V=class{subPriority=0;validate(e,t){return!0}},ut=class extends V{constructor(e,t,n,r,i){super(),this.value=e,this.validateValue=t,this.setValue=n,this.priority=r,i&&(this.subPriority=i)}validate(e,t){return this.validateValue(e,this.value,t)}set(e,t,n){return this.setValue(e,t,this.value,n)}},dt=class extends V{priority=lt;subPriority=-1;constructor(e,t){super(),this.context=e||(e=>l(t,e))}set(e,t){return t.timestampIsSet?e:l(e,st(e,this.context))}},H=class{run(e,t,n,r){let i=this.parse(e,t,n,r);return i?{setter:new ut(i.value,this.validate,this.set,this.priority,this.subPriority),rest:i.rest}:null}validate(e,t,n){return!0}},ft=class extends H{priority=140;parse(e,t,n){switch(t){case`G`:case`GG`:case`GGG`:return n.era(e,{width:`abbreviated`})||n.era(e,{width:`narrow`});case`GGGGG`:return n.era(e,{width:`narrow`});default:return n.era(e,{width:`wide`})||n.era(e,{width:`abbreviated`})||n.era(e,{width:`narrow`})}}set(e,t,n){return t.era=n,e.setFullYear(n,0,1),e.setHours(0,0,0,0),e}incompatibleTokens=[`R`,`u`,`t`,`T`]},U={month:/^(1[0-2]|0?\d)/,date:/^(3[0-1]|[0-2]?\d)/,dayOfYear:/^(36[0-6]|3[0-5]\d|[0-2]?\d?\d)/,week:/^(5[0-3]|[0-4]?\d)/,hour23h:/^(2[0-3]|[0-1]?\d)/,hour24h:/^(2[0-4]|[0-1]?\d)/,hour11h:/^(1[0-1]|0?\d)/,hour12h:/^(1[0-2]|0?\d)/,minute:/^[0-5]?\d/,second:/^[0-5]?\d/,singleDigit:/^\d/,twoDigits:/^\d{1,2}/,threeDigits:/^\d{1,3}/,fourDigits:/^\d{1,4}/,anyDigitsSigned:/^-?\d+/,singleDigitSigned:/^-?\d/,twoDigitsSigned:/^-?\d{1,2}/,threeDigitsSigned:/^-?\d{1,3}/,fourDigitsSigned:/^-?\d{1,4}/},W={basicOptionalMinutes:/^([+-])(\d{2})(\d{2})?|Z/,basic:/^([+-])(\d{2})(\d{2})|Z/,basicOptionalSeconds:/^([+-])(\d{2})(\d{2})((\d{2}))?|Z/,extended:/^([+-])(\d{2}):(\d{2})|Z/,extendedOptionalSeconds:/^([+-])(\d{2}):(\d{2})(:(\d{2}))?|Z/};function G(e,t){return e&&{value:t(e.value),rest:e.rest}}function K(e,t){let n=t.match(e);return n?{value:parseInt(n[0],10),rest:t.slice(n[0].length)}:null}function q(e,t){let n=t.match(e);if(!n)return null;if(n[0]===`Z`)return{value:0,rest:t.slice(1)};let r=n[1]===`+`?1:-1,s=n[2]?parseInt(n[2],10):0,c=n[3]?parseInt(n[3],10):0,l=n[5]?parseInt(n[5],10):0;return{value:r*(s*a+c*i+l*o),rest:t.slice(n[0].length)}}function pt(e){return K(U.anyDigitsSigned,e)}function J(e,t){switch(e){case 1:return K(U.singleDigit,t);case 2:return K(U.twoDigits,t);case 3:return K(U.threeDigits,t);case 4:return K(U.fourDigits,t);default:return K(RegExp(`^\\d{1,`+e+`}`),t)}}function mt(e,t){switch(e){case 1:return K(U.singleDigitSigned,t);case 2:return K(U.twoDigitsSigned,t);case 3:return K(U.threeDigitsSigned,t);case 4:return K(U.fourDigitsSigned,t);default:return K(RegExp(`^-?\\d{1,`+e+`}`),t)}}function Y(e){switch(e){case`morning`:return 4;case`evening`:return 17;case`pm`:case`noon`:case`afternoon`:return 12;default:return 0}}function ht(e,t){let n=t>0,r=n?t:1-t,i;if(r<=50)i=e||100;else{let t=r+50,n=Math.trunc(t/100)*100,a=e>=t%100;i=e+n-(a?100:0)}return n?i:1-i}function gt(e){return e%400==0||e%4==0&&e%100!=0}var _t=class extends H{priority=130;incompatibleTokens=[`Y`,`R`,`u`,`w`,`I`,`i`,`e`,`c`,`t`,`T`];parse(e,t,n){let r=e=>({year:e,isTwoDigitYear:t===`yy`});switch(t){case`y`:return G(J(4,e),r);case`yo`:return G(n.ordinalNumber(e,{unit:`year`}),r);default:return G(J(t.length,e),r)}}validate(e,t){return t.isTwoDigitYear||t.year>0}set(e,t,n){let r=e.getFullYear();if(n.isTwoDigitYear){let t=ht(n.year,r);return e.setFullYear(t,0,1),e.setHours(0,0,0,0),e}let i=!(`era`in t)||t.era===1?n.year:1-n.year;return e.setFullYear(i,0,1),e.setHours(0,0,0,0),e}},vt=class extends H{priority=130;parse(e,t,n){let r=e=>({year:e,isTwoDigitYear:t===`YY`});switch(t){case`Y`:return G(J(4,e),r);case`Yo`:return G(n.ordinalNumber(e,{unit:`year`}),r);default:return G(J(t.length,e),r)}}validate(e,t){return t.isTwoDigitYear||t.year>0}set(e,t,n,r){let i=k(e,r);if(n.isTwoDigitYear){let t=ht(n.year,i);return e.setFullYear(t,0,r.firstWeekContainsDate),e.setHours(0,0,0,0),_(e,r)}let a=!(`era`in t)||t.era===1?n.year:1-n.year;return e.setFullYear(a,0,r.firstWeekContainsDate),e.setHours(0,0,0,0),_(e,r)}incompatibleTokens=[`y`,`R`,`u`,`Q`,`q`,`M`,`L`,`I`,`d`,`D`,`i`,`t`,`T`]},yt=class extends H{priority=130;parse(e,t){return mt(t===`R`?4:t.length,e)}set(e,t,n){let r=l(e,0);return r.setFullYear(n,0,4),r.setHours(0,0,0,0),v(r)}incompatibleTokens=[`G`,`y`,`Y`,`u`,`Q`,`q`,`M`,`L`,`w`,`d`,`D`,`e`,`c`,`t`,`T`]},bt=class extends H{priority=130;parse(e,t){return mt(t===`u`?4:t.length,e)}set(e,t,n){return e.setFullYear(n,0,1),e.setHours(0,0,0,0),e}incompatibleTokens=[`G`,`y`,`Y`,`R`,`w`,`I`,`i`,`e`,`c`,`t`,`T`]},xt=class extends H{priority=120;parse(e,t,n){switch(t){case`Q`:case`QQ`:return J(t.length,e);case`Qo`:return n.ordinalNumber(e,{unit:`quarter`});case`QQQ`:return n.quarter(e,{width:`abbreviated`,context:`formatting`})||n.quarter(e,{width:`narrow`,context:`formatting`});case`QQQQQ`:return n.quarter(e,{width:`narrow`,context:`formatting`});default:return n.quarter(e,{width:`wide`,context:`formatting`})||n.quarter(e,{width:`abbreviated`,context:`formatting`})||n.quarter(e,{width:`narrow`,context:`formatting`})}}validate(e,t){return t>=1&&t<=4}set(e,t,n){return e.setMonth((n-1)*3,1),e.setHours(0,0,0,0),e}incompatibleTokens=[`Y`,`R`,`q`,`M`,`L`,`w`,`I`,`d`,`D`,`i`,`e`,`c`,`t`,`T`]},St=class extends H{priority=120;parse(e,t,n){switch(t){case`q`:case`qq`:return J(t.length,e);case`qo`:return n.ordinalNumber(e,{unit:`quarter`});case`qqq`:return n.quarter(e,{width:`abbreviated`,context:`standalone`})||n.quarter(e,{width:`narrow`,context:`standalone`});case`qqqqq`:return n.quarter(e,{width:`narrow`,context:`standalone`});default:return n.quarter(e,{width:`wide`,context:`standalone`})||n.quarter(e,{width:`abbreviated`,context:`standalone`})||n.quarter(e,{width:`narrow`,context:`standalone`})}}validate(e,t){return t>=1&&t<=4}set(e,t,n){return e.setMonth((n-1)*3,1),e.setHours(0,0,0,0),e}incompatibleTokens=[`Y`,`R`,`Q`,`M`,`L`,`w`,`I`,`d`,`D`,`i`,`e`,`c`,`t`,`T`]},Ct=class extends H{incompatibleTokens=[`Y`,`R`,`q`,`Q`,`L`,`w`,`I`,`D`,`i`,`e`,`c`,`t`,`T`];priority=110;parse(e,t,n){let r=e=>e-1;switch(t){case`M`:return G(K(U.month,e),r);case`MM`:return G(J(2,e),r);case`Mo`:return G(n.ordinalNumber(e,{unit:`month`}),r);case`MMM`:return n.month(e,{width:`abbreviated`,context:`formatting`})||n.month(e,{width:`narrow`,context:`formatting`});case`MMMMM`:return n.month(e,{width:`narrow`,context:`formatting`});default:return n.month(e,{width:`wide`,context:`formatting`})||n.month(e,{width:`abbreviated`,context:`formatting`})||n.month(e,{width:`narrow`,context:`formatting`})}}validate(e,t){return t>=0&&t<=11}set(e,t,n){return e.setMonth(n,1),e.setHours(0,0,0,0),e}},wt=class extends H{priority=110;parse(e,t,n){let r=e=>e-1;switch(t){case`L`:return G(K(U.month,e),r);case`LL`:return G(J(2,e),r);case`Lo`:return G(n.ordinalNumber(e,{unit:`month`}),r);case`LLL`:return n.month(e,{width:`abbreviated`,context:`standalone`})||n.month(e,{width:`narrow`,context:`standalone`});case`LLLLL`:return n.month(e,{width:`narrow`,context:`standalone`});default:return n.month(e,{width:`wide`,context:`standalone`})||n.month(e,{width:`abbreviated`,context:`standalone`})||n.month(e,{width:`narrow`,context:`standalone`})}}validate(e,t){return t>=0&&t<=11}set(e,t,n){return e.setMonth(n,1),e.setHours(0,0,0,0),e}incompatibleTokens=[`Y`,`R`,`q`,`Q`,`M`,`w`,`I`,`D`,`i`,`e`,`c`,`t`,`T`]};function Tt(e,t,n){let r=u(e,n?.in),i=A(r,n)-t;return r.setDate(r.getDate()-i*7),u(r,n?.in)}var Et=class extends H{priority=100;parse(e,t,n){switch(t){case`w`:return K(U.week,e);case`wo`:return n.ordinalNumber(e,{unit:`week`});default:return J(t.length,e)}}validate(e,t){return t>=1&&t<=53}set(e,t,n,r){return _(Tt(e,n,r),r)}incompatibleTokens=[`y`,`R`,`u`,`q`,`Q`,`M`,`L`,`I`,`d`,`D`,`i`,`t`,`T`]};function Dt(e,t,n){let r=u(e,n?.in),i=Ue(r,n)-t;return r.setDate(r.getDate()-i*7),r}var Ot=class extends H{priority=100;parse(e,t,n){switch(t){case`I`:return K(U.week,e);case`Io`:return n.ordinalNumber(e,{unit:`week`});default:return J(t.length,e)}}validate(e,t){return t>=1&&t<=53}set(e,t,n){return v(Dt(e,n))}incompatibleTokens=[`y`,`Y`,`u`,`q`,`Q`,`M`,`L`,`w`,`d`,`D`,`e`,`c`,`t`,`T`]},kt=[31,28,31,30,31,30,31,31,30,31,30,31],At=[31,29,31,30,31,30,31,31,30,31,30,31],jt=class extends H{priority=90;subPriority=1;parse(e,t,n){switch(t){case`d`:return K(U.date,e);case`do`:return n.ordinalNumber(e,{unit:`date`});default:return J(t.length,e)}}validate(e,t){let n=gt(e.getFullYear()),r=e.getMonth();return n?t>=1&&t<=At[r]:t>=1&&t<=kt[r]}set(e,t,n){return e.setDate(n),e.setHours(0,0,0,0),e}incompatibleTokens=[`Y`,`R`,`q`,`Q`,`w`,`I`,`D`,`i`,`e`,`c`,`t`,`T`]},Mt=class extends H{priority=90;subpriority=1;parse(e,t,n){switch(t){case`D`:case`DD`:return K(U.dayOfYear,e);case`Do`:return n.ordinalNumber(e,{unit:`date`});default:return J(t.length,e)}}validate(e,t){return gt(e.getFullYear())?t>=1&&t<=366:t>=1&&t<=365}set(e,t,n){return e.setMonth(0,n),e.setHours(0,0,0,0),e}incompatibleTokens=[`Y`,`R`,`q`,`Q`,`M`,`L`,`w`,`I`,`d`,`E`,`i`,`e`,`c`,`t`,`T`]};function X(e,t,n){let r=g(),i=n?.weekStartsOn??n?.locale?.options?.weekStartsOn??r.weekStartsOn??r.locale?.options?.weekStartsOn??0,a=u(e,n?.in),o=a.getDay(),s=(t%7+7)%7,c=7-i;return d(a,t<0||t>6?t-(o+c)%7:(s+c)%7-(o+c)%7,n)}var Nt=class extends H{priority=90;parse(e,t,n){switch(t){case`E`:case`EE`:case`EEE`:return n.day(e,{width:`abbreviated`,context:`formatting`})||n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`});case`EEEEE`:return n.day(e,{width:`narrow`,context:`formatting`});case`EEEEEE`:return n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`});default:return n.day(e,{width:`wide`,context:`formatting`})||n.day(e,{width:`abbreviated`,context:`formatting`})||n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`})}}validate(e,t){return t>=0&&t<=6}set(e,t,n,r){return e=X(e,n,r),e.setHours(0,0,0,0),e}incompatibleTokens=[`D`,`i`,`e`,`c`,`t`,`T`]},Pt=class extends H{priority=90;parse(e,t,n,r){let i=e=>{let t=Math.floor((e-1)/7)*7;return(e+r.weekStartsOn+6)%7+t};switch(t){case`e`:case`ee`:return G(J(t.length,e),i);case`eo`:return G(n.ordinalNumber(e,{unit:`day`}),i);case`eee`:return n.day(e,{width:`abbreviated`,context:`formatting`})||n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`});case`eeeee`:return n.day(e,{width:`narrow`,context:`formatting`});case`eeeeee`:return n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`});default:return n.day(e,{width:`wide`,context:`formatting`})||n.day(e,{width:`abbreviated`,context:`formatting`})||n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`})}}validate(e,t){return t>=0&&t<=6}set(e,t,n,r){return e=X(e,n,r),e.setHours(0,0,0,0),e}incompatibleTokens=[`y`,`R`,`u`,`q`,`Q`,`M`,`L`,`I`,`d`,`D`,`E`,`i`,`c`,`t`,`T`]},Ft=class extends H{priority=90;parse(e,t,n,r){let i=e=>{let t=Math.floor((e-1)/7)*7;return(e+r.weekStartsOn+6)%7+t};switch(t){case`c`:case`cc`:return G(J(t.length,e),i);case`co`:return G(n.ordinalNumber(e,{unit:`day`}),i);case`ccc`:return n.day(e,{width:`abbreviated`,context:`standalone`})||n.day(e,{width:`short`,context:`standalone`})||n.day(e,{width:`narrow`,context:`standalone`});case`ccccc`:return n.day(e,{width:`narrow`,context:`standalone`});case`cccccc`:return n.day(e,{width:`short`,context:`standalone`})||n.day(e,{width:`narrow`,context:`standalone`});default:return n.day(e,{width:`wide`,context:`standalone`})||n.day(e,{width:`abbreviated`,context:`standalone`})||n.day(e,{width:`short`,context:`standalone`})||n.day(e,{width:`narrow`,context:`standalone`})}}validate(e,t){return t>=0&&t<=6}set(e,t,n,r){return e=X(e,n,r),e.setHours(0,0,0,0),e}incompatibleTokens=[`y`,`R`,`u`,`q`,`Q`,`M`,`L`,`I`,`d`,`D`,`E`,`i`,`e`,`t`,`T`]};function It(e,t,n){let r=u(e,n?.in);return d(r,t-ot(r,n),n)}var Lt=class extends H{priority=90;parse(e,t,n){let r=e=>e===0?7:e;switch(t){case`i`:case`ii`:return J(t.length,e);case`io`:return n.ordinalNumber(e,{unit:`day`});case`iii`:return G(n.day(e,{width:`abbreviated`,context:`formatting`})||n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`}),r);case`iiiii`:return G(n.day(e,{width:`narrow`,context:`formatting`}),r);case`iiiiii`:return G(n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`}),r);default:return G(n.day(e,{width:`wide`,context:`formatting`})||n.day(e,{width:`abbreviated`,context:`formatting`})||n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`}),r)}}validate(e,t){return t>=1&&t<=7}set(e,t,n){return e=It(e,n),e.setHours(0,0,0,0),e}incompatibleTokens=[`y`,`Y`,`u`,`q`,`Q`,`M`,`L`,`w`,`d`,`D`,`E`,`e`,`c`,`t`,`T`]},Rt=class extends H{priority=80;parse(e,t,n){switch(t){case`a`:case`aa`:case`aaa`:return n.dayPeriod(e,{width:`abbreviated`,context:`formatting`})||n.dayPeriod(e,{width:`narrow`,context:`formatting`});case`aaaaa`:return n.dayPeriod(e,{width:`narrow`,context:`formatting`});default:return n.dayPeriod(e,{width:`wide`,context:`formatting`})||n.dayPeriod(e,{width:`abbreviated`,context:`formatting`})||n.dayPeriod(e,{width:`narrow`,context:`formatting`})}}set(e,t,n){return e.setHours(Y(n),0,0,0),e}incompatibleTokens=[`b`,`B`,`H`,`k`,`t`,`T`]},zt=class extends H{priority=80;parse(e,t,n){switch(t){case`b`:case`bb`:case`bbb`:return n.dayPeriod(e,{width:`abbreviated`,context:`formatting`})||n.dayPeriod(e,{width:`narrow`,context:`formatting`});case`bbbbb`:return n.dayPeriod(e,{width:`narrow`,context:`formatting`});default:return n.dayPeriod(e,{width:`wide`,context:`formatting`})||n.dayPeriod(e,{width:`abbreviated`,context:`formatting`})||n.dayPeriod(e,{width:`narrow`,context:`formatting`})}}set(e,t,n){return e.setHours(Y(n),0,0,0),e}incompatibleTokens=[`a`,`B`,`H`,`k`,`t`,`T`]},Bt=class extends H{priority=80;parse(e,t,n){switch(t){case`B`:case`BB`:case`BBB`:return n.dayPeriod(e,{width:`abbreviated`,context:`formatting`})||n.dayPeriod(e,{width:`narrow`,context:`formatting`});case`BBBBB`:return n.dayPeriod(e,{width:`narrow`,context:`formatting`});default:return n.dayPeriod(e,{width:`wide`,context:`formatting`})||n.dayPeriod(e,{width:`abbreviated`,context:`formatting`})||n.dayPeriod(e,{width:`narrow`,context:`formatting`})}}set(e,t,n){return e.setHours(Y(n),0,0,0),e}incompatibleTokens=[`a`,`b`,`t`,`T`]},Vt=class extends H{priority=70;parse(e,t,n){switch(t){case`h`:return K(U.hour12h,e);case`ho`:return n.ordinalNumber(e,{unit:`hour`});default:return J(t.length,e)}}validate(e,t){return t>=1&&t<=12}set(e,t,n){let r=e.getHours()>=12;return r&&n<12?e.setHours(n+12,0,0,0):!r&&n===12?e.setHours(0,0,0,0):e.setHours(n,0,0,0),e}incompatibleTokens=[`H`,`K`,`k`,`t`,`T`]},Ht=class extends H{priority=70;parse(e,t,n){switch(t){case`H`:return K(U.hour23h,e);case`Ho`:return n.ordinalNumber(e,{unit:`hour`});default:return J(t.length,e)}}validate(e,t){return t>=0&&t<=23}set(e,t,n){return e.setHours(n,0,0,0),e}incompatibleTokens=[`a`,`b`,`h`,`K`,`k`,`t`,`T`]},Ut=class extends H{priority=70;parse(e,t,n){switch(t){case`K`:return K(U.hour11h,e);case`Ko`:return n.ordinalNumber(e,{unit:`hour`});default:return J(t.length,e)}}validate(e,t){return t>=0&&t<=11}set(e,t,n){return e.getHours()>=12&&n<12?e.setHours(n+12,0,0,0):e.setHours(n,0,0,0),e}incompatibleTokens=[`h`,`H`,`k`,`t`,`T`]},Wt=class extends H{priority=70;parse(e,t,n){switch(t){case`k`:return K(U.hour24h,e);case`ko`:return n.ordinalNumber(e,{unit:`hour`});default:return J(t.length,e)}}validate(e,t){return t>=1&&t<=24}set(e,t,n){let r=n<=24?n%24:n;return e.setHours(r,0,0,0),e}incompatibleTokens=[`a`,`b`,`h`,`H`,`K`,`t`,`T`]},Gt=class extends H{priority=60;parse(e,t,n){switch(t){case`m`:return K(U.minute,e);case`mo`:return n.ordinalNumber(e,{unit:`minute`});default:return J(t.length,e)}}validate(e,t){return t>=0&&t<=59}set(e,t,n){return e.setMinutes(n,0,0),e}incompatibleTokens=[`t`,`T`]},Kt=class extends H{priority=50;parse(e,t,n){switch(t){case`s`:return K(U.second,e);case`so`:return n.ordinalNumber(e,{unit:`second`});default:return J(t.length,e)}}validate(e,t){return t>=0&&t<=59}set(e,t,n){return e.setSeconds(n,0),e}incompatibleTokens=[`t`,`T`]},qt=class extends H{priority=30;parse(e,t){return G(J(t.length,e),e=>Math.trunc(e*10**(-t.length+3)))}set(e,t,n){return e.setMilliseconds(n),e}incompatibleTokens=[`t`,`T`]},Jt=class extends H{priority=10;parse(e,t){switch(t){case`X`:return q(W.basicOptionalMinutes,e);case`XX`:return q(W.basic,e);case`XXXX`:return q(W.basicOptionalSeconds,e);case`XXXXX`:return q(W.extendedOptionalSeconds,e);default:return q(W.extended,e)}}set(e,t,n){return t.timestampIsSet?e:l(e,e.getTime()-y(e)-n)}incompatibleTokens=[`t`,`T`,`x`]},Yt=class extends H{priority=10;parse(e,t){switch(t){case`x`:return q(W.basicOptionalMinutes,e);case`xx`:return q(W.basic,e);case`xxxx`:return q(W.basicOptionalSeconds,e);case`xxxxx`:return q(W.extendedOptionalSeconds,e);default:return q(W.extended,e)}}set(e,t,n){return t.timestampIsSet?e:l(e,e.getTime()-y(e)-n)}incompatibleTokens=[`t`,`T`,`X`]},Xt=class extends H{priority=40;parse(e){return pt(e)}set(e,t,n){return[l(e,n*1e3),{timestampIsSet:!0}]}incompatibleTokens=`*`},Zt=class extends H{priority=20;parse(e){return pt(e)}set(e,t,n){return[l(e,n),{timestampIsSet:!0}]}incompatibleTokens=`*`},Qt={G:new ft,y:new _t,Y:new vt,R:new yt,u:new bt,Q:new xt,q:new St,M:new Ct,L:new wt,w:new Et,I:new Ot,d:new jt,D:new Mt,E:new Nt,e:new Pt,c:new Ft,i:new Lt,a:new Rt,b:new zt,B:new Bt,h:new Vt,H:new Ht,K:new Ut,k:new Wt,m:new Gt,s:new Kt,S:new qt,X:new Jt,x:new Yt,t:new Xt,T:new Zt},$t=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,en=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,tn=/^'([^]*?)'?$/,nn=/''/g,rn=/\S/,an=/[a-zA-Z]/;function on(e,t,n,r){let i=()=>l(r?.in||n,NaN),a=at(),o=r?.locale??a.locale??Ve,s=r?.firstWeekContainsDate??r?.locale?.options?.firstWeekContainsDate??a.firstWeekContainsDate??a.locale?.options?.firstWeekContainsDate??1,c=r?.weekStartsOn??r?.locale?.options?.weekStartsOn??a.weekStartsOn??a.locale?.options?.weekStartsOn??0;if(!t)return e?i():u(n,r?.in);let d={firstWeekContainsDate:s,weekStartsOn:c,locale:o},f=[new dt(r?.in,n)],p=t.match(en).map(e=>{let t=e[0];if(t in L){let n=L[t];return n(e,o.formatLong)}return e}).join(``).match($t),m=[];for(let n of p){!r?.useAdditionalWeekYearTokens&&z(n)&&B(n,t,e),!r?.useAdditionalDayOfYearTokens&&R(n)&&B(n,t,e);let a=n[0],s=Qt[a];if(s){let{incompatibleTokens:t}=s;if(Array.isArray(t)){let e=m.find(e=>t.includes(e.token)||e.token===a);if(e)throw RangeError(`The format string mustn't contain \`${e.fullToken}\` and \`${n}\` at the same time`)}else if(s.incompatibleTokens===`*`&&m.length>0)throw RangeError(`The format string mustn't contain \`${n}\` and any other token at the same time`);m.push({token:a,fullToken:n});let r=s.run(e,n,o.match,d);if(!r)return i();f.push(r.setter),e=r.rest}else{if(a.match(an))throw RangeError("Format string contains an unescaped latin alphabet character `"+a+"`");if(n===`''`?n=`'`:a===`'`&&(n=sn(n)),e.indexOf(n)===0)e=e.slice(n.length);else return i()}}if(e.length>0&&rn.test(e))return i();let h=f.map(e=>e.priority).sort((e,t)=>t-e).filter((e,t,n)=>n.indexOf(e)===t).map(e=>f.filter(t=>t.priority===e).sort((e,t)=>t.subPriority-e.subPriority)).map(e=>e[0]),g=u(n,r?.in);if(isNaN(+g))return i();let _={};for(let e of h){if(!e.validate(g,d))return i();let t=e.set(g,_,d);Array.isArray(t)?(g=t[0],Object.assign(_,t[1])):g=t}return g}function sn(e){return e.match(tn)[1].replace(nn,`'`)}function cn(e,t){let n=u(e,t?.in);return n.setMinutes(0,0,0),n}function ln(e,t){let n=u(e,t?.in);return n.setSeconds(0,0),n}function un(e,t){let n=u(e,t?.in);return n.setMilliseconds(0),n}function dn(e,t){let n=()=>l(t?.in,NaN),r=t?.additionalDigits??2,i=hn(e),a;if(i.date){let e=gn(i.date,r);a=_n(e.restDateString,e.year)}if(!a||isNaN(+a))return n();let o=+a,s=0,c;if(i.time&&(s=vn(i.time),isNaN(s)))return n();if(i.timezone){if(c=yn(i.timezone),isNaN(c))return n()}else{let e=new Date(o+s),n=u(0,t?.in);return n.setFullYear(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()),n.setHours(e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()),n}return u(o+s+c,t?.in)}var Z={dateTimeDelimiter:/[T ]/,timeZoneDelimiter:/[Z ]/i,timezone:/([Z+-].*)$/},fn=/^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/,pn=/^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/,mn=/^([+-])(\d{2})(?::?(\d{2}))?$/;function hn(e){let t={},n=e.split(Z.dateTimeDelimiter),r;if(n.length>2)return t;if(/:/.test(n[0])?r=n[0]:(t.date=n[0],r=n[1],Z.timeZoneDelimiter.test(t.date)&&(t.date=e.split(Z.timeZoneDelimiter)[0],r=e.substr(t.date.length,e.length))),r){let e=Z.timezone.exec(r);e?(t.time=r.replace(e[1],``),t.timezone=e[1]):t.time=r}return t}function gn(e,t){let n=RegExp(`^(?:(\\d{4}|[+-]\\d{`+(4+t)+`})|(\\d{2}|[+-]\\d{`+(2+t)+`})$)`),r=e.match(n);if(!r)return{year:NaN,restDateString:``};let i=r[1]?parseInt(r[1]):null,a=r[2]?parseInt(r[2]):null;return{year:a===null?i:a*100,restDateString:e.slice((r[1]||r[2]).length)}}function _n(e,t){if(t===null)return new Date(NaN);let n=e.match(fn);if(!n)return new Date(NaN);let r=!!n[4],i=Q(n[1]),a=Q(n[2])-1,o=Q(n[3]),s=Q(n[4]),c=Q(n[5])-1;if(r)return Tn(t,s,c)?bn(t,s,c):new Date(NaN);{let e=new Date(0);return!Cn(t,a,o)||!wn(t,i)?new Date(NaN):(e.setUTCFullYear(t,a,Math.max(i,o)),e)}}function Q(e){return e?parseInt(e):1}function vn(e){let t=e.match(pn);if(!t)return NaN;let n=$(t[1]),r=$(t[2]),o=$(t[3]);return En(n,r,o)?n*a+r*i+o*1e3:NaN}function $(e){return e&&parseFloat(e.replace(`,`,`.`))||0}function yn(e){if(e===`Z`)return 0;let t=e.match(mn);if(!t)return 0;let n=t[1]===`+`?-1:1,r=parseInt(t[2]),o=t[3]&&parseInt(t[3])||0;return Dn(r,o)?n*(r*a+o*i):NaN}function bn(e,t,n){let r=new Date(0);r.setUTCFullYear(e,0,4);let i=r.getUTCDay()||7,a=(t-1)*7+n+1-i;return r.setUTCDate(r.getUTCDate()+a),r}var xn=[31,null,31,30,31,30,31,31,30,31,30,31];function Sn(e){return e%400==0||e%4==0&&e%100!=0}function Cn(e,t,n){return t>=0&&t<=11&&n>=1&&n<=(xn[t]||(Sn(e)?29:28))}function wn(e,t){return t>=1&&t<=(Sn(e)?366:365)}function Tn(e,t,n){return t>=1&&t<=53&&n>=0&&n<=6}function En(e,t,n){return e===24?t===0&&n===0:n>=0&&n<60&&t>=0&&t<60&&e>=0&&e<25}function Dn(e,t){return t>=0&&t<=59}var On={datetime:`MMM d, yyyy, h:mm:ss aaaa`,millisecond:`h:mm:ss.SSS aaaa`,second:`h:mm:ss aaaa`,minute:`h:mm aaaa`,hour:`ha`,day:`MMM d`,week:`PP`,month:`MMM yyyy`,quarter:`qqq - yyyy`,year:`yyyy`};e._date.override({_id:`date-fns`,formats:function(){return On},parse:function(e,t){if(e==null)return null;let n=typeof e;return n===`number`||e instanceof Date?e=u(e):n===`string`&&(e=typeof t==`string`?on(e,t,new Date,this.options):dn(e,this.options)),C(e)?e.getTime():null},format:function(e,t){return rt(e,t,this.options)},add:function(e,t,n){switch(n){case`millisecond`:return p(e,t);case`second`:return ae(e,t);case`minute`:return re(e,t);case`hour`:return m(e,t);case`day`:return d(e,t);case`week`:return oe(e,t);case`month`:return f(e,t);case`quarter`:return ie(e,t);case`year`:return se(e,t);default:return e}},diff:function(e,t,n){switch(n){case`millisecond`:return T(e,t);case`second`:return be(e,t);case`minute`:return me(e,t);case`hour`:return pe(e,t);case`day`:return de(e,t);case`week`:return xe(e,t);case`month`:return ve(e,t);case`quarter`:return ye(e,t);case`year`:return Se(e,t);default:return 0}},startOf:function(e,t,n){switch(t){case`second`:return un(e);case`minute`:return ln(e);case`hour`:return cn(e);case`day`:return x(e);case`week`:return _(e);case`isoWeek`:return _(e,{weekStartsOn:+n});case`month`:return we(e);case`quarter`:return Ce(e);case`year`:return Ee(e);default:return e}},endOf:function(e,t){switch(t){case`second`:return je(e);case`minute`:return ke(e);case`hour`:return De(e);case`day`:return he(e);case`week`:return Oe(e);case`month`:return ge(e);case`quarter`:return Ae(e);case`year`:return Te(e);default:return e}}}); \ No newline at end of file +import{h as e}from"./ChartCard-D5XCldya.js";var t=365.2425,n=6048e5,r=864e5,i=6e4,a=36e5,o=1e3,s=3600*24;s*7,s*t/12*3;var c=Symbol.for(`constructDateFrom`);function l(e,t){return typeof e==`function`?e(t):e&&typeof e==`object`&&c in e?e[c](t):e instanceof Date?new e.constructor(t):new Date(t)}function u(e,t){return l(t||e,e)}function d(e,t,n){let r=u(e,n?.in);return isNaN(t)?l(n?.in||e,NaN):(t&&r.setDate(r.getDate()+t),r)}function f(e,t,n){let r=u(e,n?.in);if(isNaN(t))return l(n?.in||e,NaN);if(!t)return r;let i=r.getDate(),a=l(n?.in||e,r.getTime());return a.setMonth(r.getMonth()+t+1,0),i>=a.getDate()?a:(r.setFullYear(a.getFullYear(),a.getMonth(),i),r)}function p(e,t,n){return l(n?.in||e,+u(e)+t)}function m(e,t,n){return p(e,t*a,n)}var h={};function g(){return h}function _(e,t){let n=g(),r=t?.weekStartsOn??t?.locale?.options?.weekStartsOn??n.weekStartsOn??n.locale?.options?.weekStartsOn??0,i=u(e,t?.in),a=i.getDay(),o=(a=a.getTime()?r+1:n.getTime()>=s.getTime()?r:r-1}function y(e){let t=u(e),n=new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()));return n.setUTCFullYear(t.getFullYear()),e-+n}function b(e,...t){let n=l.bind(null,e||t.find(e=>typeof e==`object`));return t.map(n)}function x(e,t){let n=u(e,t?.in);return n.setHours(0,0,0,0),n}function te(e,t,n){let[i,a]=b(n?.in,e,t),o=x(i),s=x(a),c=+o-y(o),l=+s-y(s);return Math.round((c-l)/r)}function ne(e,t){let n=ee(e,t),r=l(t?.in||e,0);return r.setFullYear(n,0,4),r.setHours(0,0,0,0),v(r)}function re(e,t,n){let r=u(e,n?.in);return r.setTime(r.getTime()+t*i),r}function ie(e,t,n){return f(e,t*3,n)}function ae(e,t,n){return p(e,t*1e3,n)}function oe(e,t,n){return d(e,t*7,n)}function se(e,t,n){return f(e,t*12,n)}function S(e,t){let n=u(e)-+u(t);return n<0?-1:n>0?1:n}function ce(e){return e instanceof Date||typeof e==`object`&&Object.prototype.toString.call(e)===`[object Date]`}function C(e){return!(!ce(e)&&typeof e!=`number`||isNaN(+u(e)))}function le(e,t,n){let[r,i]=b(n?.in,e,t),a=r.getFullYear()-i.getFullYear(),o=r.getMonth()-i.getMonth();return a*12+o}function ue(e,t,n){let[r,i]=b(n?.in,e,t);return r.getFullYear()-i.getFullYear()}function de(e,t,n){let[r,i]=b(n?.in,e,t),a=fe(r,i),o=Math.abs(te(r,i));r.setDate(r.getDate()-a*o);let s=a*(o-Number(fe(r,i)===-a));return s===0?0:s}function fe(e,t){let n=e.getFullYear()-t.getFullYear()||e.getMonth()-t.getMonth()||e.getDate()-t.getDate()||e.getHours()-t.getHours()||e.getMinutes()-t.getMinutes()||e.getSeconds()-t.getSeconds()||e.getMilliseconds()-t.getMilliseconds();return n<0?-1:n>0?1:n}function w(e){return t=>{let n=(e?Math[e]:Math.trunc)(t);return n===0?0:n}}function pe(e,t,n){let[r,i]=b(n?.in,e,t),o=(r-+i)/a;return w(n?.roundingMethod)(o)}function T(e,t){return u(e)-+u(t)}function me(e,t,n){let r=T(e,t)/i;return w(n?.roundingMethod)(r)}function he(e,t){let n=u(e,t?.in);return n.setHours(23,59,59,999),n}function ge(e,t){let n=u(e,t?.in),r=n.getMonth();return n.setFullYear(n.getFullYear(),r+1,0),n.setHours(23,59,59,999),n}function _e(e,t){let n=u(e,t?.in);return+he(n,t)==+ge(n,t)}function ve(e,t,n){let[r,i,a]=b(n?.in,e,e,t),o=S(i,a),s=Math.abs(le(i,a));if(s<1)return 0;i.getMonth()===1&&i.getDate()>27&&i.setDate(30),i.setMonth(i.getMonth()-o*s);let c=S(i,a)===-o;_e(r)&&s===1&&S(r,a)===1&&(c=!1);let l=o*(s-+c);return l===0?0:l}function ye(e,t,n){let r=ve(e,t,n)/3;return w(n?.roundingMethod)(r)}function be(e,t,n){let r=T(e,t)/1e3;return w(n?.roundingMethod)(r)}function xe(e,t,n){let r=de(e,t,n)/7;return w(n?.roundingMethod)(r)}function Se(e,t,n){let[r,i]=b(n?.in,e,t),a=S(r,i),o=Math.abs(ue(r,i));r.setFullYear(1584),i.setFullYear(1584);let s=a*(o-+(S(r,i)===-a));return s===0?0:s}function Ce(e,t){let n=u(e,t?.in),r=n.getMonth(),i=r-r%3;return n.setMonth(i,1),n.setHours(0,0,0,0),n}function we(e,t){let n=u(e,t?.in);return n.setDate(1),n.setHours(0,0,0,0),n}function Te(e,t){let n=u(e,t?.in),r=n.getFullYear();return n.setFullYear(r+1,0,0),n.setHours(23,59,59,999),n}function Ee(e,t){let n=u(e,t?.in);return n.setFullYear(n.getFullYear(),0,1),n.setHours(0,0,0,0),n}function De(e,t){let n=u(e,t?.in);return n.setMinutes(59,59,999),n}function Oe(e,t){let n=g(),r=t?.weekStartsOn??t?.locale?.options?.weekStartsOn??n.weekStartsOn??n.locale?.options?.weekStartsOn??0,i=u(e,t?.in),a=i.getDay(),o=(a{let r,i=Me[e];return r=typeof i==`string`?i:t===1?i.one:i.other.replace(`{{count}}`,t.toString()),n?.addSuffix?n.comparison&&n.comparison>0?`in `+r:r+` ago`:r};function E(e){return(t={})=>{let n=t.width?String(t.width):e.defaultWidth;return e.formats[n]||e.formats[e.defaultWidth]}}var Pe={date:E({formats:{full:`EEEE, MMMM do, y`,long:`MMMM do, y`,medium:`MMM d, y`,short:`MM/dd/yyyy`},defaultWidth:`full`}),time:E({formats:{full:`h:mm:ss a zzzz`,long:`h:mm:ss a z`,medium:`h:mm:ss a`,short:`h:mm a`},defaultWidth:`full`}),dateTime:E({formats:{full:`{{date}} 'at' {{time}}`,long:`{{date}} 'at' {{time}}`,medium:`{{date}}, {{time}}`,short:`{{date}}, {{time}}`},defaultWidth:`full`})},Fe={lastWeek:`'last' eeee 'at' p`,yesterday:`'yesterday at' p`,today:`'today at' p`,tomorrow:`'tomorrow at' p`,nextWeek:`eeee 'at' p`,other:`P`},Ie=(e,t,n,r)=>Fe[e];function D(e){return(t,n)=>{let r=n?.context?String(n.context):`standalone`,i;if(r===`formatting`&&e.formattingValues){let t=e.defaultFormattingWidth||e.defaultWidth,r=n?.width?String(n.width):t;i=e.formattingValues[r]||e.formattingValues[t]}else{let t=e.defaultWidth,r=n?.width?String(n.width):e.defaultWidth;i=e.values[r]||e.values[t]}let a=e.argumentCallback?e.argumentCallback(t):t;return i[a]}}var Le={ordinalNumber:(e,t)=>{let n=Number(e),r=n%100;if(r>20||r<10)switch(r%10){case 1:return n+`st`;case 2:return n+`nd`;case 3:return n+`rd`}return n+`th`},era:D({values:{narrow:[`B`,`A`],abbreviated:[`BC`,`AD`],wide:[`Before Christ`,`Anno Domini`]},defaultWidth:`wide`}),quarter:D({values:{narrow:[`1`,`2`,`3`,`4`],abbreviated:[`Q1`,`Q2`,`Q3`,`Q4`],wide:[`1st quarter`,`2nd quarter`,`3rd quarter`,`4th quarter`]},defaultWidth:`wide`,argumentCallback:e=>e-1}),month:D({values:{narrow:[`J`,`F`,`M`,`A`,`M`,`J`,`J`,`A`,`S`,`O`,`N`,`D`],abbreviated:[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],wide:[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`]},defaultWidth:`wide`}),day:D({values:{narrow:[`S`,`M`,`T`,`W`,`T`,`F`,`S`],short:[`Su`,`Mo`,`Tu`,`We`,`Th`,`Fr`,`Sa`],abbreviated:[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],wide:[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`]},defaultWidth:`wide`}),dayPeriod:D({values:{narrow:{am:`a`,pm:`p`,midnight:`mi`,noon:`n`,morning:`morning`,afternoon:`afternoon`,evening:`evening`,night:`night`},abbreviated:{am:`AM`,pm:`PM`,midnight:`midnight`,noon:`noon`,morning:`morning`,afternoon:`afternoon`,evening:`evening`,night:`night`},wide:{am:`a.m.`,pm:`p.m.`,midnight:`midnight`,noon:`noon`,morning:`morning`,afternoon:`afternoon`,evening:`evening`,night:`night`}},defaultWidth:`wide`,formattingValues:{narrow:{am:`a`,pm:`p`,midnight:`mi`,noon:`n`,morning:`in the morning`,afternoon:`in the afternoon`,evening:`in the evening`,night:`at night`},abbreviated:{am:`AM`,pm:`PM`,midnight:`midnight`,noon:`noon`,morning:`in the morning`,afternoon:`in the afternoon`,evening:`in the evening`,night:`at night`},wide:{am:`a.m.`,pm:`p.m.`,midnight:`midnight`,noon:`noon`,morning:`in the morning`,afternoon:`in the afternoon`,evening:`in the evening`,night:`at night`}},defaultFormattingWidth:`wide`})};function O(e){return(t,n={})=>{let r=n.width,i=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],a=t.match(i);if(!a)return null;let o=a[0],s=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth],c=Array.isArray(s)?ze(s,e=>e.test(o)):Re(s,e=>e.test(o)),l;l=e.valueCallback?e.valueCallback(c):c,l=n.valueCallback?n.valueCallback(l):l;let u=t.slice(o.length);return{value:l,rest:u}}}function Re(e,t){for(let n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&t(e[n]))return n}function ze(e,t){for(let n=0;n{let r=t.match(e.matchPattern);if(!r)return null;let i=r[0],a=t.match(e.parsePattern);if(!a)return null;let o=e.valueCallback?e.valueCallback(a[0]):a[0];o=n.valueCallback?n.valueCallback(o):o;let s=t.slice(i.length);return{value:o,rest:s}}}var Ve={code:`en-US`,formatDistance:Ne,formatLong:Pe,formatRelative:Ie,localize:Le,match:{ordinalNumber:Be({matchPattern:/^(\d+)(th|st|nd|rd)?/i,parsePattern:/\d+/i,valueCallback:e=>parseInt(e,10)}),era:O({matchPatterns:{narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/^b/i,/^(a|c)/i]},defaultParseWidth:`any`}),quarter:O({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},defaultMatchWidth:`wide`,parsePatterns:{any:[/1/i,/2/i,/3/i,/4/i]},defaultParseWidth:`any`,valueCallback:e=>e+1}),month:O({matchPatterns:{narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},defaultMatchWidth:`wide`,parsePatterns:{narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},defaultParseWidth:`any`}),day:O({matchPatterns:{narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},defaultMatchWidth:`wide`,parsePatterns:{narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},defaultParseWidth:`any`}),dayPeriod:O({matchPatterns:{narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},defaultMatchWidth:`any`,parsePatterns:{any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},defaultParseWidth:`any`})},options:{weekStartsOn:0,firstWeekContainsDate:1}};function He(e,t){let n=u(e,t?.in);return te(n,Ee(n))+1}function Ue(e,t){let r=u(e,t?.in),i=v(r)-+ne(r);return Math.round(i/n)+1}function k(e,t){let n=u(e,t?.in),r=n.getFullYear(),i=g(),a=t?.firstWeekContainsDate??t?.locale?.options?.firstWeekContainsDate??i.firstWeekContainsDate??i.locale?.options?.firstWeekContainsDate??1,o=l(t?.in||e,0);o.setFullYear(r+1,0,a),o.setHours(0,0,0,0);let s=_(o,t),c=l(t?.in||e,0);c.setFullYear(r,0,a),c.setHours(0,0,0,0);let d=_(c,t);return+n>=+s?r+1:+n>=+d?r:r-1}function We(e,t){let n=g(),r=t?.firstWeekContainsDate??t?.locale?.options?.firstWeekContainsDate??n.firstWeekContainsDate??n.locale?.options?.firstWeekContainsDate??1,i=k(e,t),a=l(t?.in||e,0);return a.setFullYear(i,0,r),a.setHours(0,0,0,0),_(a,t)}function A(e,t){let r=u(e,t?.in),i=_(r,t)-+We(r,t);return Math.round(i/n)+1}function j(e,t){return(e<0?`-`:``)+Math.abs(e).toString().padStart(t,`0`)}var M={y(e,t){let n=e.getFullYear(),r=n>0?n:1-n;return j(t===`yy`?r%100:r,t.length)},M(e,t){let n=e.getMonth();return t===`M`?String(n+1):j(n+1,2)},d(e,t){return j(e.getDate(),t.length)},a(e,t){let n=e.getHours()/12>=1?`pm`:`am`;switch(t){case`a`:case`aa`:return n.toUpperCase();case`aaa`:return n;case`aaaaa`:return n[0];default:return n===`am`?`a.m.`:`p.m.`}},h(e,t){return j(e.getHours()%12||12,t.length)},H(e,t){return j(e.getHours(),t.length)},m(e,t){return j(e.getMinutes(),t.length)},s(e,t){return j(e.getSeconds(),t.length)},S(e,t){let n=t.length,r=e.getMilliseconds();return j(Math.trunc(r*10**(n-3)),t.length)}},N={am:`am`,pm:`pm`,midnight:`midnight`,noon:`noon`,morning:`morning`,afternoon:`afternoon`,evening:`evening`,night:`night`},Ge={G:function(e,t,n){let r=e.getFullYear()>0?1:0;switch(t){case`G`:case`GG`:case`GGG`:return n.era(r,{width:`abbreviated`});case`GGGGG`:return n.era(r,{width:`narrow`});default:return n.era(r,{width:`wide`})}},y:function(e,t,n){if(t===`yo`){let t=e.getFullYear(),r=t>0?t:1-t;return n.ordinalNumber(r,{unit:`year`})}return M.y(e,t)},Y:function(e,t,n,r){let i=k(e,r),a=i>0?i:1-i;return t===`YY`?j(a%100,2):t===`Yo`?n.ordinalNumber(a,{unit:`year`}):j(a,t.length)},R:function(e,t){return j(ee(e),t.length)},u:function(e,t){return j(e.getFullYear(),t.length)},Q:function(e,t,n){let r=Math.ceil((e.getMonth()+1)/3);switch(t){case`Q`:return String(r);case`QQ`:return j(r,2);case`Qo`:return n.ordinalNumber(r,{unit:`quarter`});case`QQQ`:return n.quarter(r,{width:`abbreviated`,context:`formatting`});case`QQQQQ`:return n.quarter(r,{width:`narrow`,context:`formatting`});default:return n.quarter(r,{width:`wide`,context:`formatting`})}},q:function(e,t,n){let r=Math.ceil((e.getMonth()+1)/3);switch(t){case`q`:return String(r);case`qq`:return j(r,2);case`qo`:return n.ordinalNumber(r,{unit:`quarter`});case`qqq`:return n.quarter(r,{width:`abbreviated`,context:`standalone`});case`qqqqq`:return n.quarter(r,{width:`narrow`,context:`standalone`});default:return n.quarter(r,{width:`wide`,context:`standalone`})}},M:function(e,t,n){let r=e.getMonth();switch(t){case`M`:case`MM`:return M.M(e,t);case`Mo`:return n.ordinalNumber(r+1,{unit:`month`});case`MMM`:return n.month(r,{width:`abbreviated`,context:`formatting`});case`MMMMM`:return n.month(r,{width:`narrow`,context:`formatting`});default:return n.month(r,{width:`wide`,context:`formatting`})}},L:function(e,t,n){let r=e.getMonth();switch(t){case`L`:return String(r+1);case`LL`:return j(r+1,2);case`Lo`:return n.ordinalNumber(r+1,{unit:`month`});case`LLL`:return n.month(r,{width:`abbreviated`,context:`standalone`});case`LLLLL`:return n.month(r,{width:`narrow`,context:`standalone`});default:return n.month(r,{width:`wide`,context:`standalone`})}},w:function(e,t,n,r){let i=A(e,r);return t===`wo`?n.ordinalNumber(i,{unit:`week`}):j(i,t.length)},I:function(e,t,n){let r=Ue(e);return t===`Io`?n.ordinalNumber(r,{unit:`week`}):j(r,t.length)},d:function(e,t,n){return t===`do`?n.ordinalNumber(e.getDate(),{unit:`date`}):M.d(e,t)},D:function(e,t,n){let r=He(e);return t===`Do`?n.ordinalNumber(r,{unit:`dayOfYear`}):j(r,t.length)},E:function(e,t,n){let r=e.getDay();switch(t){case`E`:case`EE`:case`EEE`:return n.day(r,{width:`abbreviated`,context:`formatting`});case`EEEEE`:return n.day(r,{width:`narrow`,context:`formatting`});case`EEEEEE`:return n.day(r,{width:`short`,context:`formatting`});default:return n.day(r,{width:`wide`,context:`formatting`})}},e:function(e,t,n,r){let i=e.getDay(),a=(i-r.weekStartsOn+8)%7||7;switch(t){case`e`:return String(a);case`ee`:return j(a,2);case`eo`:return n.ordinalNumber(a,{unit:`day`});case`eee`:return n.day(i,{width:`abbreviated`,context:`formatting`});case`eeeee`:return n.day(i,{width:`narrow`,context:`formatting`});case`eeeeee`:return n.day(i,{width:`short`,context:`formatting`});default:return n.day(i,{width:`wide`,context:`formatting`})}},c:function(e,t,n,r){let i=e.getDay(),a=(i-r.weekStartsOn+8)%7||7;switch(t){case`c`:return String(a);case`cc`:return j(a,t.length);case`co`:return n.ordinalNumber(a,{unit:`day`});case`ccc`:return n.day(i,{width:`abbreviated`,context:`standalone`});case`ccccc`:return n.day(i,{width:`narrow`,context:`standalone`});case`cccccc`:return n.day(i,{width:`short`,context:`standalone`});default:return n.day(i,{width:`wide`,context:`standalone`})}},i:function(e,t,n){let r=e.getDay(),i=r===0?7:r;switch(t){case`i`:return String(i);case`ii`:return j(i,t.length);case`io`:return n.ordinalNumber(i,{unit:`day`});case`iii`:return n.day(r,{width:`abbreviated`,context:`formatting`});case`iiiii`:return n.day(r,{width:`narrow`,context:`formatting`});case`iiiiii`:return n.day(r,{width:`short`,context:`formatting`});default:return n.day(r,{width:`wide`,context:`formatting`})}},a:function(e,t,n){let r=e.getHours()/12>=1?`pm`:`am`;switch(t){case`a`:case`aa`:return n.dayPeriod(r,{width:`abbreviated`,context:`formatting`});case`aaa`:return n.dayPeriod(r,{width:`abbreviated`,context:`formatting`}).toLowerCase();case`aaaaa`:return n.dayPeriod(r,{width:`narrow`,context:`formatting`});default:return n.dayPeriod(r,{width:`wide`,context:`formatting`})}},b:function(e,t,n){let r=e.getHours(),i;switch(i=r===12?N.noon:r===0?N.midnight:r/12>=1?`pm`:`am`,t){case`b`:case`bb`:return n.dayPeriod(i,{width:`abbreviated`,context:`formatting`});case`bbb`:return n.dayPeriod(i,{width:`abbreviated`,context:`formatting`}).toLowerCase();case`bbbbb`:return n.dayPeriod(i,{width:`narrow`,context:`formatting`});default:return n.dayPeriod(i,{width:`wide`,context:`formatting`})}},B:function(e,t,n){let r=e.getHours(),i;switch(i=r>=17?N.evening:r>=12?N.afternoon:r>=4?N.morning:N.night,t){case`B`:case`BB`:case`BBB`:return n.dayPeriod(i,{width:`abbreviated`,context:`formatting`});case`BBBBB`:return n.dayPeriod(i,{width:`narrow`,context:`formatting`});default:return n.dayPeriod(i,{width:`wide`,context:`formatting`})}},h:function(e,t,n){if(t===`ho`){let t=e.getHours()%12;return t===0&&(t=12),n.ordinalNumber(t,{unit:`hour`})}return M.h(e,t)},H:function(e,t,n){return t===`Ho`?n.ordinalNumber(e.getHours(),{unit:`hour`}):M.H(e,t)},K:function(e,t,n){let r=e.getHours()%12;return t===`Ko`?n.ordinalNumber(r,{unit:`hour`}):j(r,t.length)},k:function(e,t,n){let r=e.getHours();return r===0&&(r=24),t===`ko`?n.ordinalNumber(r,{unit:`hour`}):j(r,t.length)},m:function(e,t,n){return t===`mo`?n.ordinalNumber(e.getMinutes(),{unit:`minute`}):M.m(e,t)},s:function(e,t,n){return t===`so`?n.ordinalNumber(e.getSeconds(),{unit:`second`}):M.s(e,t)},S:function(e,t){return M.S(e,t)},X:function(e,t,n){let r=e.getTimezoneOffset();if(r===0)return`Z`;switch(t){case`X`:return qe(r);case`XXXX`:case`XX`:return P(r);default:return P(r,`:`)}},x:function(e,t,n){let r=e.getTimezoneOffset();switch(t){case`x`:return qe(r);case`xxxx`:case`xx`:return P(r);default:return P(r,`:`)}},O:function(e,t,n){let r=e.getTimezoneOffset();switch(t){case`O`:case`OO`:case`OOO`:return`GMT`+Ke(r,`:`);default:return`GMT`+P(r,`:`)}},z:function(e,t,n){let r=e.getTimezoneOffset();switch(t){case`z`:case`zz`:case`zzz`:return`GMT`+Ke(r,`:`);default:return`GMT`+P(r,`:`)}},t:function(e,t,n){return j(Math.trunc(e/1e3),t.length)},T:function(e,t,n){return j(+e,t.length)}};function Ke(e,t=``){let n=e>0?`-`:`+`,r=Math.abs(e),i=Math.trunc(r/60),a=r%60;return a===0?n+String(i):n+String(i)+t+j(a,2)}function qe(e,t){return e%60==0?(e>0?`-`:`+`)+j(Math.abs(e)/60,2):P(e,t)}function P(e,t=``){let n=e>0?`-`:`+`,r=Math.abs(e),i=j(Math.trunc(r/60),2),a=j(r%60,2);return n+i+t+a}var F=(e,t)=>{switch(e){case`P`:return t.date({width:`short`});case`PP`:return t.date({width:`medium`});case`PPP`:return t.date({width:`long`});default:return t.date({width:`full`})}},I=(e,t)=>{switch(e){case`p`:return t.time({width:`short`});case`pp`:return t.time({width:`medium`});case`ppp`:return t.time({width:`long`});default:return t.time({width:`full`})}},L={p:I,P:(e,t)=>{let n=e.match(/(P+)(p+)?/)||[],r=n[1],i=n[2];if(!i)return F(e,t);let a;switch(r){case`P`:a=t.dateTime({width:`short`});break;case`PP`:a=t.dateTime({width:`medium`});break;case`PPP`:a=t.dateTime({width:`long`});break;default:a=t.dateTime({width:`full`});break}return a.replace(`{{date}}`,F(r,t)).replace(`{{time}}`,I(i,t))}},Je=/^D+$/,Ye=/^Y+$/,Xe=[`D`,`DD`,`YY`,`YYYY`];function R(e){return Je.test(e)}function z(e){return Ye.test(e)}function B(e,t,n){let r=Ze(e,t,n);if(console.warn(r),Xe.includes(e))throw RangeError(r)}function Ze(e,t,n){let r=e[0]===`Y`?`years`:`days of the month`;return`Use \`${e.toLowerCase()}\` instead of \`${e}\` (in \`${t}\`) for formatting ${r} to the input \`${n}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`}var Qe=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,$e=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,et=/^'([^]*?)'?$/,tt=/''/g,nt=/[a-zA-Z]/;function rt(e,t,n){let r=g(),i=n?.locale??r.locale??Ve,a=n?.firstWeekContainsDate??n?.locale?.options?.firstWeekContainsDate??r.firstWeekContainsDate??r.locale?.options?.firstWeekContainsDate??1,o=n?.weekStartsOn??n?.locale?.options?.weekStartsOn??r.weekStartsOn??r.locale?.options?.weekStartsOn??0,s=u(e,n?.in);if(!C(s))throw RangeError(`Invalid time value`);let c=t.match($e).map(e=>{let t=e[0];if(t===`p`||t===`P`){let n=L[t];return n(e,i.formatLong)}return e}).join(``).match(Qe).map(e=>{if(e===`''`)return{isToken:!1,value:`'`};let t=e[0];if(t===`'`)return{isToken:!1,value:it(e)};if(Ge[t])return{isToken:!0,value:e};if(t.match(nt))throw RangeError("Format string contains an unescaped latin alphabet character `"+t+"`");return{isToken:!1,value:e}});i.localize.preprocessor&&(c=i.localize.preprocessor(s,c));let l={firstWeekContainsDate:a,weekStartsOn:o,locale:i};return c.map(r=>{if(!r.isToken)return r.value;let a=r.value;(!n?.useAdditionalWeekYearTokens&&z(a)||!n?.useAdditionalDayOfYearTokens&&R(a))&&B(a,t,String(e));let o=Ge[a[0]];return o(s,a,i.localize,l)}).join(``)}function it(e){let t=e.match(et);return t?t[1].replace(tt,`'`):e}function at(){return Object.assign({},g())}function ot(e,t){let n=u(e,t?.in).getDay();return n===0?7:n}function st(e,t){let n=ct(t)?new t(0):l(t,0);return n.setFullYear(e.getFullYear(),e.getMonth(),e.getDate()),n.setHours(e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()),n}function ct(e){return typeof e==`function`&&e.prototype?.constructor===e}var lt=10,V=class{subPriority=0;validate(e,t){return!0}},ut=class extends V{constructor(e,t,n,r,i){super(),this.value=e,this.validateValue=t,this.setValue=n,this.priority=r,i&&(this.subPriority=i)}validate(e,t){return this.validateValue(e,this.value,t)}set(e,t,n){return this.setValue(e,t,this.value,n)}},dt=class extends V{priority=lt;subPriority=-1;constructor(e,t){super(),this.context=e||(e=>l(t,e))}set(e,t){return t.timestampIsSet?e:l(e,st(e,this.context))}},H=class{run(e,t,n,r){let i=this.parse(e,t,n,r);return i?{setter:new ut(i.value,this.validate,this.set,this.priority,this.subPriority),rest:i.rest}:null}validate(e,t,n){return!0}},ft=class extends H{priority=140;parse(e,t,n){switch(t){case`G`:case`GG`:case`GGG`:return n.era(e,{width:`abbreviated`})||n.era(e,{width:`narrow`});case`GGGGG`:return n.era(e,{width:`narrow`});default:return n.era(e,{width:`wide`})||n.era(e,{width:`abbreviated`})||n.era(e,{width:`narrow`})}}set(e,t,n){return t.era=n,e.setFullYear(n,0,1),e.setHours(0,0,0,0),e}incompatibleTokens=[`R`,`u`,`t`,`T`]},U={month:/^(1[0-2]|0?\d)/,date:/^(3[0-1]|[0-2]?\d)/,dayOfYear:/^(36[0-6]|3[0-5]\d|[0-2]?\d?\d)/,week:/^(5[0-3]|[0-4]?\d)/,hour23h:/^(2[0-3]|[0-1]?\d)/,hour24h:/^(2[0-4]|[0-1]?\d)/,hour11h:/^(1[0-1]|0?\d)/,hour12h:/^(1[0-2]|0?\d)/,minute:/^[0-5]?\d/,second:/^[0-5]?\d/,singleDigit:/^\d/,twoDigits:/^\d{1,2}/,threeDigits:/^\d{1,3}/,fourDigits:/^\d{1,4}/,anyDigitsSigned:/^-?\d+/,singleDigitSigned:/^-?\d/,twoDigitsSigned:/^-?\d{1,2}/,threeDigitsSigned:/^-?\d{1,3}/,fourDigitsSigned:/^-?\d{1,4}/},W={basicOptionalMinutes:/^([+-])(\d{2})(\d{2})?|Z/,basic:/^([+-])(\d{2})(\d{2})|Z/,basicOptionalSeconds:/^([+-])(\d{2})(\d{2})((\d{2}))?|Z/,extended:/^([+-])(\d{2}):(\d{2})|Z/,extendedOptionalSeconds:/^([+-])(\d{2}):(\d{2})(:(\d{2}))?|Z/};function G(e,t){return e&&{value:t(e.value),rest:e.rest}}function K(e,t){let n=t.match(e);return n?{value:parseInt(n[0],10),rest:t.slice(n[0].length)}:null}function q(e,t){let n=t.match(e);if(!n)return null;if(n[0]===`Z`)return{value:0,rest:t.slice(1)};let r=n[1]===`+`?1:-1,s=n[2]?parseInt(n[2],10):0,c=n[3]?parseInt(n[3],10):0,l=n[5]?parseInt(n[5],10):0;return{value:r*(s*a+c*i+l*o),rest:t.slice(n[0].length)}}function pt(e){return K(U.anyDigitsSigned,e)}function J(e,t){switch(e){case 1:return K(U.singleDigit,t);case 2:return K(U.twoDigits,t);case 3:return K(U.threeDigits,t);case 4:return K(U.fourDigits,t);default:return K(RegExp(`^\\d{1,`+e+`}`),t)}}function mt(e,t){switch(e){case 1:return K(U.singleDigitSigned,t);case 2:return K(U.twoDigitsSigned,t);case 3:return K(U.threeDigitsSigned,t);case 4:return K(U.fourDigitsSigned,t);default:return K(RegExp(`^-?\\d{1,`+e+`}`),t)}}function Y(e){switch(e){case`morning`:return 4;case`evening`:return 17;case`pm`:case`noon`:case`afternoon`:return 12;default:return 0}}function ht(e,t){let n=t>0,r=n?t:1-t,i;if(r<=50)i=e||100;else{let t=r+50,n=Math.trunc(t/100)*100,a=e>=t%100;i=e+n-(a?100:0)}return n?i:1-i}function gt(e){return e%400==0||e%4==0&&e%100!=0}var _t=class extends H{priority=130;incompatibleTokens=[`Y`,`R`,`u`,`w`,`I`,`i`,`e`,`c`,`t`,`T`];parse(e,t,n){let r=e=>({year:e,isTwoDigitYear:t===`yy`});switch(t){case`y`:return G(J(4,e),r);case`yo`:return G(n.ordinalNumber(e,{unit:`year`}),r);default:return G(J(t.length,e),r)}}validate(e,t){return t.isTwoDigitYear||t.year>0}set(e,t,n){let r=e.getFullYear();if(n.isTwoDigitYear){let t=ht(n.year,r);return e.setFullYear(t,0,1),e.setHours(0,0,0,0),e}let i=!(`era`in t)||t.era===1?n.year:1-n.year;return e.setFullYear(i,0,1),e.setHours(0,0,0,0),e}},vt=class extends H{priority=130;parse(e,t,n){let r=e=>({year:e,isTwoDigitYear:t===`YY`});switch(t){case`Y`:return G(J(4,e),r);case`Yo`:return G(n.ordinalNumber(e,{unit:`year`}),r);default:return G(J(t.length,e),r)}}validate(e,t){return t.isTwoDigitYear||t.year>0}set(e,t,n,r){let i=k(e,r);if(n.isTwoDigitYear){let t=ht(n.year,i);return e.setFullYear(t,0,r.firstWeekContainsDate),e.setHours(0,0,0,0),_(e,r)}let a=!(`era`in t)||t.era===1?n.year:1-n.year;return e.setFullYear(a,0,r.firstWeekContainsDate),e.setHours(0,0,0,0),_(e,r)}incompatibleTokens=[`y`,`R`,`u`,`Q`,`q`,`M`,`L`,`I`,`d`,`D`,`i`,`t`,`T`]},yt=class extends H{priority=130;parse(e,t){return mt(t===`R`?4:t.length,e)}set(e,t,n){let r=l(e,0);return r.setFullYear(n,0,4),r.setHours(0,0,0,0),v(r)}incompatibleTokens=[`G`,`y`,`Y`,`u`,`Q`,`q`,`M`,`L`,`w`,`d`,`D`,`e`,`c`,`t`,`T`]},bt=class extends H{priority=130;parse(e,t){return mt(t===`u`?4:t.length,e)}set(e,t,n){return e.setFullYear(n,0,1),e.setHours(0,0,0,0),e}incompatibleTokens=[`G`,`y`,`Y`,`R`,`w`,`I`,`i`,`e`,`c`,`t`,`T`]},xt=class extends H{priority=120;parse(e,t,n){switch(t){case`Q`:case`QQ`:return J(t.length,e);case`Qo`:return n.ordinalNumber(e,{unit:`quarter`});case`QQQ`:return n.quarter(e,{width:`abbreviated`,context:`formatting`})||n.quarter(e,{width:`narrow`,context:`formatting`});case`QQQQQ`:return n.quarter(e,{width:`narrow`,context:`formatting`});default:return n.quarter(e,{width:`wide`,context:`formatting`})||n.quarter(e,{width:`abbreviated`,context:`formatting`})||n.quarter(e,{width:`narrow`,context:`formatting`})}}validate(e,t){return t>=1&&t<=4}set(e,t,n){return e.setMonth((n-1)*3,1),e.setHours(0,0,0,0),e}incompatibleTokens=[`Y`,`R`,`q`,`M`,`L`,`w`,`I`,`d`,`D`,`i`,`e`,`c`,`t`,`T`]},St=class extends H{priority=120;parse(e,t,n){switch(t){case`q`:case`qq`:return J(t.length,e);case`qo`:return n.ordinalNumber(e,{unit:`quarter`});case`qqq`:return n.quarter(e,{width:`abbreviated`,context:`standalone`})||n.quarter(e,{width:`narrow`,context:`standalone`});case`qqqqq`:return n.quarter(e,{width:`narrow`,context:`standalone`});default:return n.quarter(e,{width:`wide`,context:`standalone`})||n.quarter(e,{width:`abbreviated`,context:`standalone`})||n.quarter(e,{width:`narrow`,context:`standalone`})}}validate(e,t){return t>=1&&t<=4}set(e,t,n){return e.setMonth((n-1)*3,1),e.setHours(0,0,0,0),e}incompatibleTokens=[`Y`,`R`,`Q`,`M`,`L`,`w`,`I`,`d`,`D`,`i`,`e`,`c`,`t`,`T`]},Ct=class extends H{incompatibleTokens=[`Y`,`R`,`q`,`Q`,`L`,`w`,`I`,`D`,`i`,`e`,`c`,`t`,`T`];priority=110;parse(e,t,n){let r=e=>e-1;switch(t){case`M`:return G(K(U.month,e),r);case`MM`:return G(J(2,e),r);case`Mo`:return G(n.ordinalNumber(e,{unit:`month`}),r);case`MMM`:return n.month(e,{width:`abbreviated`,context:`formatting`})||n.month(e,{width:`narrow`,context:`formatting`});case`MMMMM`:return n.month(e,{width:`narrow`,context:`formatting`});default:return n.month(e,{width:`wide`,context:`formatting`})||n.month(e,{width:`abbreviated`,context:`formatting`})||n.month(e,{width:`narrow`,context:`formatting`})}}validate(e,t){return t>=0&&t<=11}set(e,t,n){return e.setMonth(n,1),e.setHours(0,0,0,0),e}},wt=class extends H{priority=110;parse(e,t,n){let r=e=>e-1;switch(t){case`L`:return G(K(U.month,e),r);case`LL`:return G(J(2,e),r);case`Lo`:return G(n.ordinalNumber(e,{unit:`month`}),r);case`LLL`:return n.month(e,{width:`abbreviated`,context:`standalone`})||n.month(e,{width:`narrow`,context:`standalone`});case`LLLLL`:return n.month(e,{width:`narrow`,context:`standalone`});default:return n.month(e,{width:`wide`,context:`standalone`})||n.month(e,{width:`abbreviated`,context:`standalone`})||n.month(e,{width:`narrow`,context:`standalone`})}}validate(e,t){return t>=0&&t<=11}set(e,t,n){return e.setMonth(n,1),e.setHours(0,0,0,0),e}incompatibleTokens=[`Y`,`R`,`q`,`Q`,`M`,`w`,`I`,`D`,`i`,`e`,`c`,`t`,`T`]};function Tt(e,t,n){let r=u(e,n?.in),i=A(r,n)-t;return r.setDate(r.getDate()-i*7),u(r,n?.in)}var Et=class extends H{priority=100;parse(e,t,n){switch(t){case`w`:return K(U.week,e);case`wo`:return n.ordinalNumber(e,{unit:`week`});default:return J(t.length,e)}}validate(e,t){return t>=1&&t<=53}set(e,t,n,r){return _(Tt(e,n,r),r)}incompatibleTokens=[`y`,`R`,`u`,`q`,`Q`,`M`,`L`,`I`,`d`,`D`,`i`,`t`,`T`]};function Dt(e,t,n){let r=u(e,n?.in),i=Ue(r,n)-t;return r.setDate(r.getDate()-i*7),r}var Ot=class extends H{priority=100;parse(e,t,n){switch(t){case`I`:return K(U.week,e);case`Io`:return n.ordinalNumber(e,{unit:`week`});default:return J(t.length,e)}}validate(e,t){return t>=1&&t<=53}set(e,t,n){return v(Dt(e,n))}incompatibleTokens=[`y`,`Y`,`u`,`q`,`Q`,`M`,`L`,`w`,`d`,`D`,`e`,`c`,`t`,`T`]},kt=[31,28,31,30,31,30,31,31,30,31,30,31],At=[31,29,31,30,31,30,31,31,30,31,30,31],jt=class extends H{priority=90;subPriority=1;parse(e,t,n){switch(t){case`d`:return K(U.date,e);case`do`:return n.ordinalNumber(e,{unit:`date`});default:return J(t.length,e)}}validate(e,t){let n=gt(e.getFullYear()),r=e.getMonth();return n?t>=1&&t<=At[r]:t>=1&&t<=kt[r]}set(e,t,n){return e.setDate(n),e.setHours(0,0,0,0),e}incompatibleTokens=[`Y`,`R`,`q`,`Q`,`w`,`I`,`D`,`i`,`e`,`c`,`t`,`T`]},Mt=class extends H{priority=90;subpriority=1;parse(e,t,n){switch(t){case`D`:case`DD`:return K(U.dayOfYear,e);case`Do`:return n.ordinalNumber(e,{unit:`date`});default:return J(t.length,e)}}validate(e,t){return gt(e.getFullYear())?t>=1&&t<=366:t>=1&&t<=365}set(e,t,n){return e.setMonth(0,n),e.setHours(0,0,0,0),e}incompatibleTokens=[`Y`,`R`,`q`,`Q`,`M`,`L`,`w`,`I`,`d`,`E`,`i`,`e`,`c`,`t`,`T`]};function X(e,t,n){let r=g(),i=n?.weekStartsOn??n?.locale?.options?.weekStartsOn??r.weekStartsOn??r.locale?.options?.weekStartsOn??0,a=u(e,n?.in),o=a.getDay(),s=(t%7+7)%7,c=7-i;return d(a,t<0||t>6?t-(o+c)%7:(s+c)%7-(o+c)%7,n)}var Nt=class extends H{priority=90;parse(e,t,n){switch(t){case`E`:case`EE`:case`EEE`:return n.day(e,{width:`abbreviated`,context:`formatting`})||n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`});case`EEEEE`:return n.day(e,{width:`narrow`,context:`formatting`});case`EEEEEE`:return n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`});default:return n.day(e,{width:`wide`,context:`formatting`})||n.day(e,{width:`abbreviated`,context:`formatting`})||n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`})}}validate(e,t){return t>=0&&t<=6}set(e,t,n,r){return e=X(e,n,r),e.setHours(0,0,0,0),e}incompatibleTokens=[`D`,`i`,`e`,`c`,`t`,`T`]},Pt=class extends H{priority=90;parse(e,t,n,r){let i=e=>{let t=Math.floor((e-1)/7)*7;return(e+r.weekStartsOn+6)%7+t};switch(t){case`e`:case`ee`:return G(J(t.length,e),i);case`eo`:return G(n.ordinalNumber(e,{unit:`day`}),i);case`eee`:return n.day(e,{width:`abbreviated`,context:`formatting`})||n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`});case`eeeee`:return n.day(e,{width:`narrow`,context:`formatting`});case`eeeeee`:return n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`});default:return n.day(e,{width:`wide`,context:`formatting`})||n.day(e,{width:`abbreviated`,context:`formatting`})||n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`})}}validate(e,t){return t>=0&&t<=6}set(e,t,n,r){return e=X(e,n,r),e.setHours(0,0,0,0),e}incompatibleTokens=[`y`,`R`,`u`,`q`,`Q`,`M`,`L`,`I`,`d`,`D`,`E`,`i`,`c`,`t`,`T`]},Ft=class extends H{priority=90;parse(e,t,n,r){let i=e=>{let t=Math.floor((e-1)/7)*7;return(e+r.weekStartsOn+6)%7+t};switch(t){case`c`:case`cc`:return G(J(t.length,e),i);case`co`:return G(n.ordinalNumber(e,{unit:`day`}),i);case`ccc`:return n.day(e,{width:`abbreviated`,context:`standalone`})||n.day(e,{width:`short`,context:`standalone`})||n.day(e,{width:`narrow`,context:`standalone`});case`ccccc`:return n.day(e,{width:`narrow`,context:`standalone`});case`cccccc`:return n.day(e,{width:`short`,context:`standalone`})||n.day(e,{width:`narrow`,context:`standalone`});default:return n.day(e,{width:`wide`,context:`standalone`})||n.day(e,{width:`abbreviated`,context:`standalone`})||n.day(e,{width:`short`,context:`standalone`})||n.day(e,{width:`narrow`,context:`standalone`})}}validate(e,t){return t>=0&&t<=6}set(e,t,n,r){return e=X(e,n,r),e.setHours(0,0,0,0),e}incompatibleTokens=[`y`,`R`,`u`,`q`,`Q`,`M`,`L`,`I`,`d`,`D`,`E`,`i`,`e`,`t`,`T`]};function It(e,t,n){let r=u(e,n?.in);return d(r,t-ot(r,n),n)}var Lt=class extends H{priority=90;parse(e,t,n){let r=e=>e===0?7:e;switch(t){case`i`:case`ii`:return J(t.length,e);case`io`:return n.ordinalNumber(e,{unit:`day`});case`iii`:return G(n.day(e,{width:`abbreviated`,context:`formatting`})||n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`}),r);case`iiiii`:return G(n.day(e,{width:`narrow`,context:`formatting`}),r);case`iiiiii`:return G(n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`}),r);default:return G(n.day(e,{width:`wide`,context:`formatting`})||n.day(e,{width:`abbreviated`,context:`formatting`})||n.day(e,{width:`short`,context:`formatting`})||n.day(e,{width:`narrow`,context:`formatting`}),r)}}validate(e,t){return t>=1&&t<=7}set(e,t,n){return e=It(e,n),e.setHours(0,0,0,0),e}incompatibleTokens=[`y`,`Y`,`u`,`q`,`Q`,`M`,`L`,`w`,`d`,`D`,`E`,`e`,`c`,`t`,`T`]},Rt=class extends H{priority=80;parse(e,t,n){switch(t){case`a`:case`aa`:case`aaa`:return n.dayPeriod(e,{width:`abbreviated`,context:`formatting`})||n.dayPeriod(e,{width:`narrow`,context:`formatting`});case`aaaaa`:return n.dayPeriod(e,{width:`narrow`,context:`formatting`});default:return n.dayPeriod(e,{width:`wide`,context:`formatting`})||n.dayPeriod(e,{width:`abbreviated`,context:`formatting`})||n.dayPeriod(e,{width:`narrow`,context:`formatting`})}}set(e,t,n){return e.setHours(Y(n),0,0,0),e}incompatibleTokens=[`b`,`B`,`H`,`k`,`t`,`T`]},zt=class extends H{priority=80;parse(e,t,n){switch(t){case`b`:case`bb`:case`bbb`:return n.dayPeriod(e,{width:`abbreviated`,context:`formatting`})||n.dayPeriod(e,{width:`narrow`,context:`formatting`});case`bbbbb`:return n.dayPeriod(e,{width:`narrow`,context:`formatting`});default:return n.dayPeriod(e,{width:`wide`,context:`formatting`})||n.dayPeriod(e,{width:`abbreviated`,context:`formatting`})||n.dayPeriod(e,{width:`narrow`,context:`formatting`})}}set(e,t,n){return e.setHours(Y(n),0,0,0),e}incompatibleTokens=[`a`,`B`,`H`,`k`,`t`,`T`]},Bt=class extends H{priority=80;parse(e,t,n){switch(t){case`B`:case`BB`:case`BBB`:return n.dayPeriod(e,{width:`abbreviated`,context:`formatting`})||n.dayPeriod(e,{width:`narrow`,context:`formatting`});case`BBBBB`:return n.dayPeriod(e,{width:`narrow`,context:`formatting`});default:return n.dayPeriod(e,{width:`wide`,context:`formatting`})||n.dayPeriod(e,{width:`abbreviated`,context:`formatting`})||n.dayPeriod(e,{width:`narrow`,context:`formatting`})}}set(e,t,n){return e.setHours(Y(n),0,0,0),e}incompatibleTokens=[`a`,`b`,`t`,`T`]},Vt=class extends H{priority=70;parse(e,t,n){switch(t){case`h`:return K(U.hour12h,e);case`ho`:return n.ordinalNumber(e,{unit:`hour`});default:return J(t.length,e)}}validate(e,t){return t>=1&&t<=12}set(e,t,n){let r=e.getHours()>=12;return r&&n<12?e.setHours(n+12,0,0,0):!r&&n===12?e.setHours(0,0,0,0):e.setHours(n,0,0,0),e}incompatibleTokens=[`H`,`K`,`k`,`t`,`T`]},Ht=class extends H{priority=70;parse(e,t,n){switch(t){case`H`:return K(U.hour23h,e);case`Ho`:return n.ordinalNumber(e,{unit:`hour`});default:return J(t.length,e)}}validate(e,t){return t>=0&&t<=23}set(e,t,n){return e.setHours(n,0,0,0),e}incompatibleTokens=[`a`,`b`,`h`,`K`,`k`,`t`,`T`]},Ut=class extends H{priority=70;parse(e,t,n){switch(t){case`K`:return K(U.hour11h,e);case`Ko`:return n.ordinalNumber(e,{unit:`hour`});default:return J(t.length,e)}}validate(e,t){return t>=0&&t<=11}set(e,t,n){return e.getHours()>=12&&n<12?e.setHours(n+12,0,0,0):e.setHours(n,0,0,0),e}incompatibleTokens=[`h`,`H`,`k`,`t`,`T`]},Wt=class extends H{priority=70;parse(e,t,n){switch(t){case`k`:return K(U.hour24h,e);case`ko`:return n.ordinalNumber(e,{unit:`hour`});default:return J(t.length,e)}}validate(e,t){return t>=1&&t<=24}set(e,t,n){let r=n<=24?n%24:n;return e.setHours(r,0,0,0),e}incompatibleTokens=[`a`,`b`,`h`,`H`,`K`,`t`,`T`]},Gt=class extends H{priority=60;parse(e,t,n){switch(t){case`m`:return K(U.minute,e);case`mo`:return n.ordinalNumber(e,{unit:`minute`});default:return J(t.length,e)}}validate(e,t){return t>=0&&t<=59}set(e,t,n){return e.setMinutes(n,0,0),e}incompatibleTokens=[`t`,`T`]},Kt=class extends H{priority=50;parse(e,t,n){switch(t){case`s`:return K(U.second,e);case`so`:return n.ordinalNumber(e,{unit:`second`});default:return J(t.length,e)}}validate(e,t){return t>=0&&t<=59}set(e,t,n){return e.setSeconds(n,0),e}incompatibleTokens=[`t`,`T`]},qt=class extends H{priority=30;parse(e,t){return G(J(t.length,e),e=>Math.trunc(e*10**(-t.length+3)))}set(e,t,n){return e.setMilliseconds(n),e}incompatibleTokens=[`t`,`T`]},Jt=class extends H{priority=10;parse(e,t){switch(t){case`X`:return q(W.basicOptionalMinutes,e);case`XX`:return q(W.basic,e);case`XXXX`:return q(W.basicOptionalSeconds,e);case`XXXXX`:return q(W.extendedOptionalSeconds,e);default:return q(W.extended,e)}}set(e,t,n){return t.timestampIsSet?e:l(e,e.getTime()-y(e)-n)}incompatibleTokens=[`t`,`T`,`x`]},Yt=class extends H{priority=10;parse(e,t){switch(t){case`x`:return q(W.basicOptionalMinutes,e);case`xx`:return q(W.basic,e);case`xxxx`:return q(W.basicOptionalSeconds,e);case`xxxxx`:return q(W.extendedOptionalSeconds,e);default:return q(W.extended,e)}}set(e,t,n){return t.timestampIsSet?e:l(e,e.getTime()-y(e)-n)}incompatibleTokens=[`t`,`T`,`X`]},Xt=class extends H{priority=40;parse(e){return pt(e)}set(e,t,n){return[l(e,n*1e3),{timestampIsSet:!0}]}incompatibleTokens=`*`},Zt=class extends H{priority=20;parse(e){return pt(e)}set(e,t,n){return[l(e,n),{timestampIsSet:!0}]}incompatibleTokens=`*`},Qt={G:new ft,y:new _t,Y:new vt,R:new yt,u:new bt,Q:new xt,q:new St,M:new Ct,L:new wt,w:new Et,I:new Ot,d:new jt,D:new Mt,E:new Nt,e:new Pt,c:new Ft,i:new Lt,a:new Rt,b:new zt,B:new Bt,h:new Vt,H:new Ht,K:new Ut,k:new Wt,m:new Gt,s:new Kt,S:new qt,X:new Jt,x:new Yt,t:new Xt,T:new Zt},$t=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,en=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,tn=/^'([^]*?)'?$/,nn=/''/g,rn=/\S/,an=/[a-zA-Z]/;function on(e,t,n,r){let i=()=>l(r?.in||n,NaN),a=at(),o=r?.locale??a.locale??Ve,s=r?.firstWeekContainsDate??r?.locale?.options?.firstWeekContainsDate??a.firstWeekContainsDate??a.locale?.options?.firstWeekContainsDate??1,c=r?.weekStartsOn??r?.locale?.options?.weekStartsOn??a.weekStartsOn??a.locale?.options?.weekStartsOn??0;if(!t)return e?i():u(n,r?.in);let d={firstWeekContainsDate:s,weekStartsOn:c,locale:o},f=[new dt(r?.in,n)],p=t.match(en).map(e=>{let t=e[0];if(t in L){let n=L[t];return n(e,o.formatLong)}return e}).join(``).match($t),m=[];for(let n of p){!r?.useAdditionalWeekYearTokens&&z(n)&&B(n,t,e),!r?.useAdditionalDayOfYearTokens&&R(n)&&B(n,t,e);let a=n[0],s=Qt[a];if(s){let{incompatibleTokens:t}=s;if(Array.isArray(t)){let e=m.find(e=>t.includes(e.token)||e.token===a);if(e)throw RangeError(`The format string mustn't contain \`${e.fullToken}\` and \`${n}\` at the same time`)}else if(s.incompatibleTokens===`*`&&m.length>0)throw RangeError(`The format string mustn't contain \`${n}\` and any other token at the same time`);m.push({token:a,fullToken:n});let r=s.run(e,n,o.match,d);if(!r)return i();f.push(r.setter),e=r.rest}else{if(a.match(an))throw RangeError("Format string contains an unescaped latin alphabet character `"+a+"`");if(n===`''`?n=`'`:a===`'`&&(n=sn(n)),e.indexOf(n)===0)e=e.slice(n.length);else return i()}}if(e.length>0&&rn.test(e))return i();let h=f.map(e=>e.priority).sort((e,t)=>t-e).filter((e,t,n)=>n.indexOf(e)===t).map(e=>f.filter(t=>t.priority===e).sort((e,t)=>t.subPriority-e.subPriority)).map(e=>e[0]),g=u(n,r?.in);if(isNaN(+g))return i();let _={};for(let e of h){if(!e.validate(g,d))return i();let t=e.set(g,_,d);Array.isArray(t)?(g=t[0],Object.assign(_,t[1])):g=t}return g}function sn(e){return e.match(tn)[1].replace(nn,`'`)}function cn(e,t){let n=u(e,t?.in);return n.setMinutes(0,0,0),n}function ln(e,t){let n=u(e,t?.in);return n.setSeconds(0,0),n}function un(e,t){let n=u(e,t?.in);return n.setMilliseconds(0),n}function dn(e,t){let n=()=>l(t?.in,NaN),r=t?.additionalDigits??2,i=hn(e),a;if(i.date){let e=gn(i.date,r);a=_n(e.restDateString,e.year)}if(!a||isNaN(+a))return n();let o=+a,s=0,c;if(i.time&&(s=vn(i.time),isNaN(s)))return n();if(i.timezone){if(c=yn(i.timezone),isNaN(c))return n()}else{let e=new Date(o+s),n=u(0,t?.in);return n.setFullYear(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()),n.setHours(e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()),n}return u(o+s+c,t?.in)}var Z={dateTimeDelimiter:/[T ]/,timeZoneDelimiter:/[Z ]/i,timezone:/([Z+-].*)$/},fn=/^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/,pn=/^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/,mn=/^([+-])(\d{2})(?::?(\d{2}))?$/;function hn(e){let t={},n=e.split(Z.dateTimeDelimiter),r;if(n.length>2)return t;if(/:/.test(n[0])?r=n[0]:(t.date=n[0],r=n[1],Z.timeZoneDelimiter.test(t.date)&&(t.date=e.split(Z.timeZoneDelimiter)[0],r=e.substr(t.date.length,e.length))),r){let e=Z.timezone.exec(r);e?(t.time=r.replace(e[1],``),t.timezone=e[1]):t.time=r}return t}function gn(e,t){let n=RegExp(`^(?:(\\d{4}|[+-]\\d{`+(4+t)+`})|(\\d{2}|[+-]\\d{`+(2+t)+`})$)`),r=e.match(n);if(!r)return{year:NaN,restDateString:``};let i=r[1]?parseInt(r[1]):null,a=r[2]?parseInt(r[2]):null;return{year:a===null?i:a*100,restDateString:e.slice((r[1]||r[2]).length)}}function _n(e,t){if(t===null)return new Date(NaN);let n=e.match(fn);if(!n)return new Date(NaN);let r=!!n[4],i=Q(n[1]),a=Q(n[2])-1,o=Q(n[3]),s=Q(n[4]),c=Q(n[5])-1;if(r)return Tn(t,s,c)?bn(t,s,c):new Date(NaN);{let e=new Date(0);return!Cn(t,a,o)||!wn(t,i)?new Date(NaN):(e.setUTCFullYear(t,a,Math.max(i,o)),e)}}function Q(e){return e?parseInt(e):1}function vn(e){let t=e.match(pn);if(!t)return NaN;let n=$(t[1]),r=$(t[2]),o=$(t[3]);return En(n,r,o)?n*a+r*i+o*1e3:NaN}function $(e){return e&&parseFloat(e.replace(`,`,`.`))||0}function yn(e){if(e===`Z`)return 0;let t=e.match(mn);if(!t)return 0;let n=t[1]===`+`?-1:1,r=parseInt(t[2]),o=t[3]&&parseInt(t[3])||0;return Dn(r,o)?n*(r*a+o*i):NaN}function bn(e,t,n){let r=new Date(0);r.setUTCFullYear(e,0,4);let i=r.getUTCDay()||7,a=(t-1)*7+n+1-i;return r.setUTCDate(r.getUTCDate()+a),r}var xn=[31,null,31,30,31,30,31,31,30,31,30,31];function Sn(e){return e%400==0||e%4==0&&e%100!=0}function Cn(e,t,n){return t>=0&&t<=11&&n>=1&&n<=(xn[t]||(Sn(e)?29:28))}function wn(e,t){return t>=1&&t<=(Sn(e)?366:365)}function Tn(e,t,n){return t>=1&&t<=53&&n>=0&&n<=6}function En(e,t,n){return e===24?t===0&&n===0:n>=0&&n<60&&t>=0&&t<60&&e>=0&&e<25}function Dn(e,t){return t>=0&&t<=59}var On={datetime:`MMM d, yyyy, h:mm:ss aaaa`,millisecond:`h:mm:ss.SSS aaaa`,second:`h:mm:ss aaaa`,minute:`h:mm aaaa`,hour:`ha`,day:`MMM d`,week:`PP`,month:`MMM yyyy`,quarter:`qqq - yyyy`,year:`yyyy`};e._date.override({_id:`date-fns`,formats:function(){return On},parse:function(e,t){if(e==null)return null;let n=typeof e;return n===`number`||e instanceof Date?e=u(e):n===`string`&&(e=typeof t==`string`?on(e,t,new Date,this.options):dn(e,this.options)),C(e)?e.getTime():null},format:function(e,t){return rt(e,t,this.options)},add:function(e,t,n){switch(n){case`millisecond`:return p(e,t);case`second`:return ae(e,t);case`minute`:return re(e,t);case`hour`:return m(e,t);case`day`:return d(e,t);case`week`:return oe(e,t);case`month`:return f(e,t);case`quarter`:return ie(e,t);case`year`:return se(e,t);default:return e}},diff:function(e,t,n){switch(n){case`millisecond`:return T(e,t);case`second`:return be(e,t);case`minute`:return me(e,t);case`hour`:return pe(e,t);case`day`:return de(e,t);case`week`:return xe(e,t);case`month`:return ve(e,t);case`quarter`:return ye(e,t);case`year`:return Se(e,t);default:return 0}},startOf:function(e,t,n){switch(t){case`second`:return un(e);case`minute`:return ln(e);case`hour`:return cn(e);case`day`:return x(e);case`week`:return _(e);case`isoWeek`:return _(e,{weekStartsOn:+n});case`month`:return we(e);case`quarter`:return Ce(e);case`year`:return Ee(e);default:return e}},endOf:function(e,t){switch(t){case`second`:return je(e);case`minute`:return ke(e);case`hour`:return De(e);case`day`:return he(e);case`week`:return Oe(e);case`month`:return ge(e);case`quarter`:return Ae(e);case`year`:return Te(e);default:return e}}}); \ No newline at end of file diff --git a/repeater/web/html/assets/dataService-CodM3OZh.js b/repeater/web/html/assets/dataService-C8lExiaM.js similarity index 96% rename from repeater/web/html/assets/dataService-CodM3OZh.js rename to repeater/web/html/assets/dataService-C8lExiaM.js index d3e98e3..d8fb920 100644 --- a/repeater/web/html/assets/dataService-CodM3OZh.js +++ b/repeater/web/html/assets/dataService-C8lExiaM.js @@ -1 +1 @@ -import{U as e,V as t,o as n}from"./runtime-core.esm-bundler-CINEgm0a.js";import{t as r,v as i}from"./api-CP9MgmUS.js";import{t as a}from"./packets-DqaKkuHX.js";import{t as o}from"./system-CGj1WgG8.js";var s={0:`Unknown`,1:`Chat Node`,2:`Repeater`,3:`Room Server`,4:`Hybrid Node`},c=i(`neighbors`,()=>{let t=e({}),i=e(!1),a=e(null),o=e(48),c=n(()=>Object.values(t.value).flat()),l=n(()=>c.value.length);function u(e=10*6e4){return a.value===null?!0:Date.now()-a.value>e}async function d(e=o.value){i.value=!0,o.value=e;let n=Object.entries(s),c=await Promise.allSettled(n.map(async([t,n])=>{try{let i=[],a=0,o=0;for(;o<200;){let t=await r.get(`/adverts_by_contact_type?contact_type=${encodeURIComponent(n)}&hours=${e}&limit=500&offset=${a}`),s=t.success&&Array.isArray(t.data)?t.data:[];if(s.length===0||(i.push(...s),s.length<500))break;a+=500,o+=1}return{typeKey:t,adverts:i}}catch{return{typeKey:t,adverts:[]}}})),l={};for(let e of c)e.status===`fulfilled`&&e.value.adverts.length>0&&(l[e.value.typeKey]=e.value.adverts);t.value=l,a.value=Date.now(),i.value=!1}function f(){t.value={},i.value=!1,a.value=null,o.value=48}return{advertsByType:t,isLoading:i,lastFetched:a,currentHours:o,allAdverts:c,totalCount:l,isStale:u,fetchAll:d,reset:f}}),l={stats:3e4,packetStats:6e4,noiseFloor:15e3,recentPackets:3e4,sparklines:3e5,advertTier:6e4,neighbors:10*6e4,radioConfig:2**53-1},u=i(`dataService`,()=>{let n=o(),i=a(),s=c(),u=e({currentTier:`unknown`,advertsAllowed:0,advertsDropped:0,activePenalties:0}),d=e(!1),f=e(null),p=t({stats:`pending`,packetStats:`pending`,noiseFloor:`pending`,recentPackets:`pending`,sparklines:`pending`,advertTier:`pending`,neighbors:`pending`,radioConfig:`pending`}),m=new Map,h=new Map,g=[],_=!1,v=null;async function y(e,t=2){for(let n=0;nsetTimeout(e,500*2**n))}throw Error(`unreachable`)}async function b(){try{let e=(await r.get(`/advert_rate_limit_stats`))?.data;u.value={currentTier:typeof e?.adaptive?.current_tier==`string`?e.adaptive.current_tier:`unknown`,advertsAllowed:e?.stats?.adverts_allowed||0,advertsDropped:e?.stats?.adverts_dropped||0,activePenalties:Object.keys(e?.active_penalties||{}).length},m.set(`advertTier`,Date.now())}catch{}}async function x(e){if(e===`neighbors`){if(!s.isStale())return}else{let t=m.get(e);if(t!==void 0&&Date.now()-t{m.set(`stats`,Date.now()),m.set(`radioConfig`,Date.now())});break;case`radioConfig`:r=x(`stats`).then(()=>{m.set(`radioConfig`,Date.now())});break;case`packetStats`:r=i.fetchPacketStats({hours:24}).then(()=>{m.set(`packetStats`,Date.now())});break;case`noiseFloor`:r=i.fetchNoiseFloorHistory({hours:1,limit:500}).then(()=>{m.set(`noiseFloor`,Date.now())});break;case`recentPackets`:r=i.fetchRecentPackets({limit:100}).then(()=>{m.set(`recentPackets`,Date.now())});break;case`sparklines`:r=i.initializeSparklineHistory().then(()=>{m.set(`sparklines`,Date.now())});break;case`advertTier`:r=b();break;case`neighbors`:r=s.fetchAll(s.currentHours).then(()=>{});break}return h.set(e,r),r.finally(()=>h.delete(e)),r}async function S(e,t){p[e]=`loading`;try{await t(),p[e]=`done`}catch{p[e]=`error`}}async function C(e,t){let n=[...e],r=0;return new Promise(e=>{function i(){if(n.length===0&&r===0){e();return}for(;r0;)r++,n.shift()().finally(()=>{r--,i()})}i()})}async function w(){if(!_){_=!0,d.value=!0,p.stats=`loading`,f.value=`requesting`;try{await y(()=>n.fetchStats({onFirstByte:()=>{f.value=`reading`}})),m.set(`stats`,Date.now()),m.set(`radioConfig`,Date.now()),p.stats=`done`}catch{p.stats=`error`,console.error(`[DataService] Failed to fetch stats after retries`)}finally{f.value=null}await C([()=>S(`packetStats`,()=>i.fetchPacketStats({hours:24}).then(()=>{m.set(`packetStats`,Date.now())})),()=>S(`noiseFloor`,()=>i.fetchNoiseFloorHistory({hours:1,limit:500}).then(()=>{m.set(`noiseFloor`,Date.now())})),()=>S(`recentPackets`,()=>i.fetchRecentPackets({limit:100}).then(()=>{m.set(`recentPackets`,Date.now())})),()=>S(`sparklines`,()=>i.initializeSparklineHistory().then(()=>{m.set(`sparklines`,Date.now())})),()=>S(`advertTier`,()=>b()),()=>S(`neighbors`,()=>s.fetchAll(s.currentHours).then(()=>{}))],3),d.value=!1,T()}}function T(){A(),g.push(window.setInterval(()=>void x(`advertTier`),3e4)),g.push(window.setInterval(()=>void x(`packetStats`),6e4)),g.push(window.setInterval(()=>void x(`noiseFloor`),15e3)),g.push(window.setInterval(()=>void x(`sparklines`),3e5)),g.push(window.setInterval(()=>{let e=n.lastUpdated?.getTime()??0;Date.now()-e>25e3&&x(`stats`)},3e4))}function E(){v=Math.floor(Date.now()/1e3)}async function D(e){try{let t=await r.get(`/filtered_packets`,{start_timestamp:e,limit:1e3});t.success&&t.data&&(i.mergeRecentPackets(t.data),m.set(`recentPackets`,Date.now()))}catch{}}async function O(){await new Promise(e=>setTimeout(e,3e3));let e=Math.floor(Date.now()/1e3)-600,t=v===null?e:Math.max(v,e);v=null,await Promise.allSettled([x(`stats`),x(`packetStats`),D(t)])}function k(e){m.delete(e)}function A(){for(let e of g)clearInterval(e);g=[]}function j(){A(),_=!1,m.clear(),h.clear(),d.value=!1,Object.keys(p).forEach(e=>{p[e]=`pending`}),u.value={currentTier:`unknown`,advertsAllowed:0,advertsDropped:0,activePenalties:0}}return{advertTier:u,isBootstrapping:d,statsSubStatus:f,loadProgress:p,bootstrap:w,ensure:x,invalidate:k,noteDisconnect:E,onReconnect:O,stopPolling:A,reset:j}});export{s as n,c as r,u as t}; \ No newline at end of file +import{U as e,V as t,o as n}from"./runtime-core.esm-bundler-CINEgm0a.js";import{t as r,v as i}from"./api-EpLa-SS4.js";import{t as a}from"./packets-CItQO6OO.js";import{t as o}from"./system-CuO1gaHr.js";var s={0:`Unknown`,1:`Chat Node`,2:`Repeater`,3:`Room Server`,4:`Hybrid Node`},c=i(`neighbors`,()=>{let t=e({}),i=e(!1),a=e(null),o=e(48),c=n(()=>Object.values(t.value).flat()),l=n(()=>c.value.length);function u(e=10*6e4){return a.value===null?!0:Date.now()-a.value>e}async function d(e=o.value){i.value=!0,o.value=e;let n=Object.entries(s),c=await Promise.allSettled(n.map(async([t,n])=>{try{let i=[],a=0,o=0;for(;o<200;){let t=await r.get(`/adverts_by_contact_type?contact_type=${encodeURIComponent(n)}&hours=${e}&limit=500&offset=${a}`),s=t.success&&Array.isArray(t.data)?t.data:[];if(s.length===0||(i.push(...s),s.length<500))break;a+=500,o+=1}return{typeKey:t,adverts:i}}catch{return{typeKey:t,adverts:[]}}})),l={};for(let e of c)e.status===`fulfilled`&&e.value.adverts.length>0&&(l[e.value.typeKey]=e.value.adverts);t.value=l,a.value=Date.now(),i.value=!1}function f(){t.value={},i.value=!1,a.value=null,o.value=48}return{advertsByType:t,isLoading:i,lastFetched:a,currentHours:o,allAdverts:c,totalCount:l,isStale:u,fetchAll:d,reset:f}}),l={stats:3e4,packetStats:6e4,noiseFloor:15e3,recentPackets:3e4,sparklines:3e5,advertTier:6e4,neighbors:10*6e4,radioConfig:2**53-1},u=i(`dataService`,()=>{let n=o(),i=a(),s=c(),u=e({currentTier:`unknown`,advertsAllowed:0,advertsDropped:0,activePenalties:0}),d=e(!1),f=e(null),p=t({stats:`pending`,packetStats:`pending`,noiseFloor:`pending`,recentPackets:`pending`,sparklines:`pending`,advertTier:`pending`,neighbors:`pending`,radioConfig:`pending`}),m=new Map,h=new Map,g=[],_=!1,v=null;async function y(e,t=2){for(let n=0;nsetTimeout(e,500*2**n))}throw Error(`unreachable`)}async function b(){try{let e=(await r.get(`/advert_rate_limit_stats`))?.data;u.value={currentTier:typeof e?.adaptive?.current_tier==`string`?e.adaptive.current_tier:`unknown`,advertsAllowed:e?.stats?.adverts_allowed||0,advertsDropped:e?.stats?.adverts_dropped||0,activePenalties:Object.keys(e?.active_penalties||{}).length},m.set(`advertTier`,Date.now())}catch{}}async function x(e){if(e===`neighbors`){if(!s.isStale())return}else{let t=m.get(e);if(t!==void 0&&Date.now()-t{m.set(`stats`,Date.now()),m.set(`radioConfig`,Date.now())});break;case`radioConfig`:r=x(`stats`).then(()=>{m.set(`radioConfig`,Date.now())});break;case`packetStats`:r=i.fetchPacketStats({hours:24}).then(()=>{m.set(`packetStats`,Date.now())});break;case`noiseFloor`:r=i.fetchNoiseFloorHistory({hours:1,limit:500}).then(()=>{m.set(`noiseFloor`,Date.now())});break;case`recentPackets`:r=i.fetchRecentPackets({limit:100}).then(()=>{m.set(`recentPackets`,Date.now())});break;case`sparklines`:r=i.initializeSparklineHistory().then(()=>{m.set(`sparklines`,Date.now())});break;case`advertTier`:r=b();break;case`neighbors`:r=s.fetchAll(s.currentHours).then(()=>{});break}return h.set(e,r),r.finally(()=>h.delete(e)),r}async function S(e,t){p[e]=`loading`;try{await t(),p[e]=`done`}catch{p[e]=`error`}}async function C(e,t){let n=[...e],r=0;return new Promise(e=>{function i(){if(n.length===0&&r===0){e();return}for(;r0;)r++,n.shift()().finally(()=>{r--,i()})}i()})}async function w(){if(!_){_=!0,d.value=!0,p.stats=`loading`,f.value=`requesting`;try{await y(()=>n.fetchStats({onFirstByte:()=>{f.value=`reading`}})),m.set(`stats`,Date.now()),m.set(`radioConfig`,Date.now()),p.stats=`done`}catch{p.stats=`error`,console.error(`[DataService] Failed to fetch stats after retries`)}finally{f.value=null}await C([()=>S(`packetStats`,()=>i.fetchPacketStats({hours:24}).then(()=>{m.set(`packetStats`,Date.now())})),()=>S(`noiseFloor`,()=>i.fetchNoiseFloorHistory({hours:1,limit:500}).then(()=>{m.set(`noiseFloor`,Date.now())})),()=>S(`recentPackets`,()=>i.fetchRecentPackets({limit:100}).then(()=>{m.set(`recentPackets`,Date.now())})),()=>S(`sparklines`,()=>i.initializeSparklineHistory().then(()=>{m.set(`sparklines`,Date.now())})),()=>S(`advertTier`,()=>b()),()=>S(`neighbors`,()=>s.fetchAll(s.currentHours).then(()=>{}))],3),d.value=!1,T()}}function T(){A(),g.push(window.setInterval(()=>void x(`advertTier`),3e4)),g.push(window.setInterval(()=>void x(`packetStats`),6e4)),g.push(window.setInterval(()=>void x(`noiseFloor`),15e3)),g.push(window.setInterval(()=>void x(`sparklines`),3e5)),g.push(window.setInterval(()=>{let e=n.lastUpdated?.getTime()??0;Date.now()-e>25e3&&x(`stats`)},3e4))}function E(){v=Math.floor(Date.now()/1e3)}async function D(e){try{let t=await r.get(`/filtered_packets`,{start_timestamp:e,limit:1e3});t.success&&t.data&&(i.mergeRecentPackets(t.data),m.set(`recentPackets`,Date.now()))}catch{}}async function O(){await new Promise(e=>setTimeout(e,3e3));let e=Math.floor(Date.now()/1e3)-600,t=v===null?e:Math.max(v,e);v=null,await Promise.allSettled([x(`stats`),x(`packetStats`),D(t)])}function k(e){m.delete(e)}function A(){for(let e of g)clearInterval(e);g=[]}function j(){A(),_=!1,m.clear(),h.clear(),d.value=!1,Object.keys(p).forEach(e=>{p[e]=`pending`}),u.value={currentTier:`unknown`,advertsAllowed:0,advertsDropped:0,activePenalties:0}}return{advertTier:u,isBootstrapping:d,statsSubStatus:f,loadProgress:p,bootstrap:w,ensure:x,invalidate:k,noteDisconnect:E,onReconnect:O,stopPolling:A,reset:j}});export{s as n,c as r,u as t}; \ No newline at end of file diff --git a/repeater/web/html/assets/dataService-D3_w8go8.js b/repeater/web/html/assets/dataService-D3_w8go8.js new file mode 100644 index 0000000..5d32137 --- /dev/null +++ b/repeater/web/html/assets/dataService-D3_w8go8.js @@ -0,0 +1 @@ +import{t as e}from"./dataService-C8lExiaM.js";export{e as useDataService}; \ No newline at end of file diff --git a/repeater/web/html/assets/dataService-k29cfBQr.js b/repeater/web/html/assets/dataService-k29cfBQr.js deleted file mode 100644 index ff5552b..0000000 --- a/repeater/web/html/assets/dataService-k29cfBQr.js +++ /dev/null @@ -1 +0,0 @@ -import{t as e}from"./dataService-CodM3OZh.js";export{e as useDataService}; \ No newline at end of file diff --git a/repeater/web/html/assets/index-BC2aJf7r.css b/repeater/web/html/assets/index-BC2aJf7r.css deleted file mode 100644 index e199683..0000000 --- a/repeater/web/html/assets/index-BC2aJf7r.css +++ /dev/null @@ -1 +0,0 @@ -@import "https://fonts.googleapis.com/css2?family=Michroma:wght@400;700&family=Inter:wght@300;400;500;600;700;800&display=swap";@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-100:oklch(93.6% .032 17.717);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-800:oklch(47.3% .137 46.201);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-slate-500:oklch(55.4% .046 257.417);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-500:oklch(55.1% .027 264.364);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--blur-md:12px;--blur-lg:16px;--blur-xl:24px;--blur-3xl:64px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:Inter,-apple-system,Roboto,Helvetica,sans-serif;line-height:1.5}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.glass-card{--tw-backdrop-blur:blur(50px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);background:var(--color-surface);border-radius:10px}@supports (color:color-mix(in lab, red, red)){.glass-card{background:color-mix(in srgb, var(--color-surface) 75%, transparent)}}.glass-card{border:1px solid var(--color-border-subtle);box-shadow:0 4px 12px var(--color-background)}@supports (color:color-mix(in lab, red, red)){.glass-card{box-shadow:0 4px 12px color-mix(in srgb, var(--color-background) 25%, transparent)}}.dark .glass-card{background:var(--color-surface-elevated);border:1px solid var(--color-border-subtle);box-shadow:0 4px 12px var(--color-background)}@supports (color:color-mix(in lab, red, red)){.dark .glass-card{box-shadow:0 4px 12px color-mix(in srgb, var(--color-background) 45%, transparent)}}.glass-card-green{--tw-backdrop-blur:blur(50px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);background:var(--color-glass-green-bg);border:1px solid var(--color-glass-green-border);box-shadow:var(--color-glass-green-shadow);border-radius:10px}.glass-card-orange{--tw-backdrop-blur:blur(50px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);background:var(--color-glass-orange-bg);border:1px solid var(--color-glass-orange-border);box-shadow:var(--color-glass-orange-shadow);border-radius:10px}.bg-mode-segment-forward{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-mode-segment-forward{background-color:color-mix(in srgb, var(--color-primary) 35%, transparent)}}.bg-mode-segment-no-tx{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.bg-mode-segment-no-tx{background-color:color-mix(in srgb, var(--color-accent-red) 35%, transparent)}}.cfg-page-heading{padding-bottom:calc(var(--spacing) * 2)}.cfg-section{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);padding:calc(var(--spacing) * 8);background-color:#0000}.cfg-section:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.cfg-section:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.cfg-section:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.cfg-section:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.cfg-card{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:#0000}.cfg-card:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.cfg-card:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.cfg-card:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.cfg-card:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.cfg-btn-primary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.cfg-btn-primary{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.cfg-btn-primary{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.cfg-btn-primary{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.cfg-btn-primary{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-text-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.cfg-btn-primary:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.cfg-btn-primary:hover{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}}.cfg-btn-primary:disabled{cursor:not-allowed;opacity:.5}.cfg-btn-primary:is(.dark *){color:var(--color-text-primary)}.cfg-btn-secondary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-text-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.cfg-btn-secondary:hover{background-color:var(--color-border-subtle)}}.cfg-btn-secondary:disabled{cursor:not-allowed;opacity:.5}.cfg-btn-secondary:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.cfg-btn-secondary:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}.cfg-btn-secondary:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.cfg-btn-secondary:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.cfg-btn-secondary:is(.dark *){color:var(--color-text-primary)}@media (hover:hover){.cfg-btn-secondary:is(.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.cfg-btn-secondary:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}}.logo-image{filter:brightness(.7)contrast(1.3)saturate(1.2);transition:filter .3s}.dark .logo-image{filter:brightness(1.1)contrast(1.05)saturate()}.topbar-icon-btn{background-color:var(--color-background-mute);width:35px;height:35px;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-radius:.25rem;justify-content:center;align-items:center;display:flex}@media (hover:hover){.topbar-icon-btn:hover{background-color:var(--color-border-subtle)}}.topbar-icon-btn:is(.dark *){background-color:var(--color-surface-elevated)}@media (hover:hover){.topbar-icon-btn:is(.dark *):hover{background-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.topbar-icon-btn:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}}.btn-primary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.btn-primary{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.btn-primary{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.btn-primary{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.btn-primary{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn-primary:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.btn-primary:hover{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}}.btn-primary:disabled{cursor:not-allowed;opacity:.5}.btn-danger{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.btn-danger{border-color:color-mix(in oklab, var(--color-accent-red) 50%, transparent)}}.btn-danger{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.btn-danger{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.btn-danger{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-accent-red);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn-danger:hover{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.btn-danger:hover{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}}.btn-danger:disabled{cursor:not-allowed;opacity:.5}.btn-success{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.btn-success{border-color:color-mix(in oklab, var(--color-accent-green) 50%, transparent)}}.btn-success{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.btn-success{background-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}.btn-success{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-accent-green);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn-success:hover{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.btn-success:hover{background-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}}.btn-success:disabled{cursor:not-allowed;opacity:.5}.btn-secondary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-text-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn-secondary:hover{background-color:var(--color-border-subtle)}}.btn-secondary:disabled{cursor:not-allowed;opacity:.5}.btn-secondary:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.btn-secondary:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}.btn-secondary:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.btn-secondary:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.btn-secondary:is(.dark *){color:var(--color-text-primary)}@media (hover:hover){.btn-secondary:is(.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.btn-secondary:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}}.btn-primary-xs{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-primary);border-radius:.25rem}@supports (color:color-mix(in lab, red, red)){.btn-primary-xs{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.btn-primary-xs{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.btn-primary-xs{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.btn-primary-xs{padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn-primary-xs:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.btn-primary-xs:hover{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}}.btn-primary-xs:disabled{cursor:not-allowed;opacity:.5}.btn-danger-xs{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-red);border-radius:.25rem}@supports (color:color-mix(in lab, red, red)){.btn-danger-xs{border-color:color-mix(in oklab, var(--color-accent-red) 50%, transparent)}}.btn-danger-xs{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.btn-danger-xs{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.btn-danger-xs{padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-accent-red);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn-danger-xs:hover{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.btn-danger-xs:hover{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}}.btn-danger-xs:disabled{cursor:not-allowed;opacity:.5}.btn-success-xs{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-green);border-radius:.25rem}@supports (color:color-mix(in lab, red, red)){.btn-success-xs{border-color:color-mix(in oklab, var(--color-accent-green) 50%, transparent)}}.btn-success-xs{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.btn-success-xs{background-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}.btn-success-xs{padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-accent-green);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn-success-xs:hover{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.btn-success-xs:hover{background-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}}.btn-success-xs:disabled{cursor:not-allowed;opacity:.5}.btn-secondary-xs{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 1.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-text-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn-secondary-xs:hover{background-color:var(--color-border-subtle)}}.btn-secondary-xs:disabled{cursor:not-allowed;opacity:.5}.btn-secondary-xs:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.btn-secondary-xs:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}.btn-secondary-xs:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.btn-secondary-xs:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}@media (hover:hover){.btn-secondary-xs:is(.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.btn-secondary-xs:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}}.cfg-input{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);width:100%;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-text-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.cfg-input:focus{border-color:var(--color-primary);--tw-outline-style:none;outline-style:none}.cfg-input:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.cfg-input:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.cfg-input:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.cfg-input:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.cfg-input:is(.dark *){color:var(--color-text-primary)}.cfg-select{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);width:100%;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-text-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.cfg-select:focus{border-color:var(--color-primary);--tw-outline-style:none;outline-style:none}.cfg-select:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.cfg-select:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.cfg-select:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.cfg-select:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.cfg-select:is(.dark *){color:var(--color-text-primary)}.dark .cfg-select,.dark .modal-select{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}.dark .cfg-select option,.dark .modal-select option{background-color:var(--color-surface-elevated);color:var(--color-text-primary)}.modal-backdrop{inset:calc(var(--spacing) * 0);z-index:300;background-color:#00000080;justify-content:center;align-items:center;display:flex;position:fixed}@supports (color:color-mix(in lab, red, red)){.modal-backdrop{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.modal-backdrop{padding:calc(var(--spacing) * 4);--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.modal-backdrop-heavy{inset:calc(var(--spacing) * 0);z-index:300;background-color:#00000080;justify-content:center;align-items:center;display:flex;position:fixed}@supports (color:color-mix(in lab, red, red)){.modal-backdrop-heavy{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.modal-backdrop-heavy{padding:calc(var(--spacing) * 4);--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.modal-card{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-white);width:100%;padding:calc(var(--spacing) * 6);--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);border-radius:20px}.modal-card:is(.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.modal-card:is(.dark *){border-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.modal-card:is(.dark *){background-color:var(--color-surface-elevated)}.modal-card-glass{border-style:var(--tw-border-style);border-width:1px;border-color:#ffffff40;border-radius:20px;width:100%}@supports (color:color-mix(in lab, red, red)){.modal-card-glass{border-color:color-mix(in oklab, var(--color-white) 25%, transparent)}}.modal-card-glass{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);background:var(--color-glass-bg);box-shadow:var(--color-glass-shadow)}.modal-form{gap:calc(var(--spacing) * 4);flex-direction:column;display:flex}.modal-field-label{margin-top:calc(var(--spacing) * 2);margin-bottom:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-text-secondary);display:block}.modal-field-label:is(.dark *){color:var(--color-text-muted)}.modal-field-label-row{margin-top:calc(var(--spacing) * 2);margin-bottom:calc(var(--spacing) * 1);align-items:baseline;gap:calc(var(--spacing) * 3);display:flex}.modal-input{border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);width:100%;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-text-primary)}.modal-input::placeholder{color:var(--color-text-muted)}.modal-input{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.modal-input:focus{border-color:var(--color-primary);--tw-outline-style:none;outline-style:none}.modal-input:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.modal-input:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.modal-input:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.modal-input:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.modal-input:is(.dark *){color:var(--color-text-primary)}.modal-input:is(.dark *)::placeholder{color:var(--color-text-muted)}@supports (color:color-mix(in lab, red, red)){.modal-input:is(.dark *)::placeholder{color:color-mix(in oklab, var(--color-text-muted) 50%, transparent)}}.modal-select{border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);width:100%;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-text-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.modal-select:focus{border-color:var(--color-primary);--tw-outline-style:none;outline-style:none}.modal-select:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.modal-select:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.modal-select:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.modal-select:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.modal-select:is(.dark *){color:var(--color-text-primary)}.label-swap-enter-active,.label-swap-leave-active{transition:opacity .15s}.label-swap-enter-from,.label-swap-leave-to{opacity:0}.code-block{background-color:var(--color-background-mute);padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-family:var(--font-mono);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-text-primary);border-radius:.25rem;display:block;overflow-x:auto}.code-block:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.code-block:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.code-block:is(.dark *){color:var(--color-text-primary)}.modal-input-readonly{cursor:default;border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);width:100%;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-family:var(--font-mono);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-text-primary)}.modal-input-readonly:focus{border-color:var(--color-border-subtle);--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-outline-style:none;outline-style:none}.modal-input-readonly:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.modal-input-readonly:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.modal-input-readonly:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.modal-input-readonly:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.modal-input-readonly:is(.dark *){color:var(--color-text-primary)}.modal-input-readonly:is(.dark *):focus{border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.modal-input-readonly:is(.dark *):focus{border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.modal-actions{gap:calc(var(--spacing) * 3);padding-top:calc(var(--spacing) * 2);display:flex}.modal-btn-cancel{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);color:var(--color-text-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));flex:1}@media (hover:hover){.modal-btn-cancel:hover{background-color:var(--color-border-subtle)}}.modal-btn-cancel:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.modal-btn-cancel:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}.modal-btn-cancel:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.modal-btn-cancel:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.modal-btn-cancel:is(.dark *){color:var(--color-text-primary)}@media (hover:hover){.modal-btn-cancel:is(.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.modal-btn-cancel:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}}.modal-btn-primary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-primary);flex:1}@supports (color:color-mix(in lab, red, red)){.modal-btn-primary{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.modal-btn-primary{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.modal-btn-primary{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.modal-btn-primary{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.modal-btn-primary:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.modal-btn-primary:hover{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}}.modal-btn-danger{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-red);flex:1}@supports (color:color-mix(in lab, red, red)){.modal-btn-danger{border-color:color-mix(in oklab, var(--color-accent-red) 50%, transparent)}}.modal-btn-danger{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.modal-btn-danger{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.modal-btn-danger{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-accent-red);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.modal-btn-danger:hover{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.modal-btn-danger:hover{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}}.cfg-btn-danger{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.cfg-btn-danger{border-color:color-mix(in oklab, var(--color-accent-red) 50%, transparent)}}.cfg-btn-danger{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.cfg-btn-danger{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.cfg-btn-danger{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-accent-red);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.cfg-btn-danger:hover{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.cfg-btn-danger:hover{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}}.cfg-btn-danger:disabled{cursor:not-allowed;opacity:.5}.alert-info{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.alert-info{border-color:color-mix(in oklab, var(--color-accent-cyan) 25%, transparent)}}.alert-info{background-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.alert-info{background-color:color-mix(in oklab, var(--color-accent-cyan) 10%, transparent)}}.alert-info{padding:calc(var(--spacing) * 3);color:var(--color-accent-cyan)}.alert-success{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.alert-success{border-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}.alert-success{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.alert-success{background-color:color-mix(in oklab, var(--color-accent-green) 10%, transparent)}}.alert-success{padding:calc(var(--spacing) * 3);color:var(--color-accent-green)}.alert-warning{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.alert-warning{border-color:color-mix(in oklab, var(--color-accent-amber) 25%, transparent)}}.alert-warning{background-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.alert-warning{background-color:color-mix(in oklab, var(--color-accent-amber) 10%, transparent)}}.alert-warning{padding:calc(var(--spacing) * 3);color:var(--color-accent-amber)}.alert-error{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.alert-error{border-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.alert-error{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.alert-error{background-color:color-mix(in oklab, var(--color-accent-red) 10%, transparent)}}.alert-error{padding:calc(var(--spacing) * 3);color:var(--color-accent-red)}.status-badge{align-items:center;gap:calc(var(--spacing) * 1.5);padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);border-radius:3.40282e38px;display:inline-flex}.status-badge-green{align-items:center;gap:calc(var(--spacing) * 1.5);background-color:var(--color-accent-green);border-radius:3.40282e38px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.status-badge-green{background-color:color-mix(in oklab, var(--color-accent-green) 10%, transparent)}}.status-badge-green{padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-accent-green)}.status-badge-amber{align-items:center;gap:calc(var(--spacing) * 1.5);background-color:var(--color-accent-amber);border-radius:3.40282e38px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.status-badge-amber{background-color:color-mix(in oklab, var(--color-accent-amber) 10%, transparent)}}.status-badge-amber{padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-accent-amber)}.status-badge-red{align-items:center;gap:calc(var(--spacing) * 1.5);background-color:var(--color-accent-red);border-radius:3.40282e38px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.status-badge-red{background-color:color-mix(in oklab, var(--color-accent-red) 10%, transparent)}}.status-badge-red{padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-accent-red)}.status-badge-muted{align-items:center;gap:calc(var(--spacing) * 1.5);background-color:var(--color-background-mute);padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-text-muted);border-radius:3.40282e38px;display:inline-flex}.status-dot-green{background-color:var(--color-accent-green)}.status-dot-amber{background-color:var(--color-accent-amber)}.status-dot-red{background-color:var(--color-accent-red)}.status-dot-cyan{background-color:var(--color-accent-cyan)}.status-dot-secondary{background-color:var(--color-secondary)}.status-dot-muted{background-color:var(--color-border)}.text-on-dark{color:#ffffffde}.text-on-dark-secondary{color:#fff9}.text-on-dark-muted{color:#fff6}.text-on-dark-subtle{color:#ffffff4d}}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.-top-1{top:calc(var(--spacing) * -1)}.-top-\[79px\]{top:-79px}.-top-\[94px\]{top:-94px}.top-0{top:calc(var(--spacing) * 0)}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-3{top:calc(var(--spacing) * 3)}.top-4{top:calc(var(--spacing) * 4)}.top-\[373px\]{top:373px}.top-full{top:100%}.-right-1{right:calc(var(--spacing) * -1)}.-right-6{right:calc(var(--spacing) * -6)}.right-0{right:calc(var(--spacing) * 0)}.right-1{right:calc(var(--spacing) * 1)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-4{right:calc(var(--spacing) * 4)}.right-5{right:calc(var(--spacing) * 5)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-4{bottom:calc(var(--spacing) * 4)}.bottom-5{bottom:calc(var(--spacing) * 5)}.-left-\[92px\]{left:-92px}.left-0{left:calc(var(--spacing) * 0)}.left-0\.5{left:calc(var(--spacing) * .5)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-3{left:calc(var(--spacing) * 3)}.left-\[246px\]{left:246px}.left-\[575px\]{left:575px}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-200{z-index:200}.z-\[100\]{z-index:100}.z-\[150\]{z-index:150}.z-\[200\]{z-index:200}.z-\[249\]{z-index:249}.z-\[250\]{z-index:250}.z-\[300\]{z-index:300}.z-\[350\]{z-index:350}.z-\[350\]\!{z-index:350!important}.z-\[400\]{z-index:400}.z-\[400\]\!{z-index:400!important}.z-\[450\]{z-index:450}.z-\[500\]{z-index:500}.z-\[500\]\!{z-index:500!important}.z-\[9999\]{z-index:9999}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-4{grid-column:span 4/span 4}.col-span-11{grid-column:span 11/span 11}.col-start-1{grid-column-start:1}.row-start-1{grid-row-start:1}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing) * 1)}.my-8{margin-block:calc(var(--spacing) * 8)}.mt-0{margin-top:calc(var(--spacing) * 0)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mr-6{margin-right:calc(var(--spacing) * 6)}.mb-0{margin-bottom:calc(var(--spacing) * 0)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-7{margin-bottom:calc(var(--spacing) * 7)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-0{margin-left:calc(var(--spacing) * 0)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-6{margin-left:calc(var(--spacing) * 6)}.ml-7{margin-left:calc(var(--spacing) * 7)}.ml-8{margin-left:calc(var(--spacing) * 8)}.ml-12{margin-left:calc(var(--spacing) * 12)}.ml-16{margin-left:calc(var(--spacing) * 16)}.ml-20{margin-left:calc(var(--spacing) * 20)}.ml-24{margin-left:calc(var(--spacing) * 24)}.ml-28{margin-left:calc(var(--spacing) * 28)}.ml-32{margin-left:calc(var(--spacing) * 32)}.ml-\[15px\]{margin-left:15px}.ml-\[23px\]{margin-left:23px}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.table{display:table}.h-0{height:calc(var(--spacing) * 0)}.h-1{height:calc(var(--spacing) * 1)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-40{height:calc(var(--spacing) * 40)}.h-48{height:calc(var(--spacing) * 48)}.h-52{height:calc(var(--spacing) * 52)}.h-96{height:calc(var(--spacing) * 96)}.h-\[17rem\]{height:17rem}.h-\[18px\]{height:18px}.h-\[35px\]{height:35px}.h-\[52px\]{height:52px}.h-\[85vh\]{height:85vh}.h-\[100dvh\]{height:100dvh}.h-\[130px\]{height:130px}.h-\[154px\]{height:154px}.h-\[178px\]{height:178px}.h-\[512px\]{height:512px}.h-full{height:100%}.h-screen{height:100vh}.max-h-0{max-height:calc(var(--spacing) * 0)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-44{max-height:calc(var(--spacing) * 44)}.max-h-52{max-height:calc(var(--spacing) * 52)}.max-h-56{max-height:calc(var(--spacing) * 56)}.max-h-\[26rem\]{max-height:26rem}.max-h-\[60vh\]{max-height:60vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[75vh\]{max-height:75vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[95vh\]{max-height:95vh}.max-h-\[360px\]{max-height:360px}.max-h-\[440px\]{max-height:440px}.max-h-\[calc\(100vh-4rem\)\]{max-height:calc(100vh - 4rem)}.max-h-screen{max-height:100vh}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-\[8rem\]{min-height:8rem}.min-h-\[12rem\]{min-height:12rem}.min-h-\[72px\]{min-height:72px}.min-h-\[118px\]{min-height:118px}.min-h-\[220px\]{min-height:220px}.min-h-\[400px\]{min-height:400px}.min-h-screen{min-height:100vh}.w-1{width:calc(var(--spacing) * 1)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-\[35px\]{width:35px}.w-\[58px\]{width:58px}.w-\[285px\]{width:285px}.w-\[705px\]{width:705px}.w-auto{width:auto}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-32{max-width:calc(var(--spacing) * 32)}.max-w-\[12rem\]{max-width:12rem}.max-w-\[80px\]{max-width:80px}.max-w-\[140px\]{max-width:140px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-48{min-width:calc(var(--spacing) * 48)}.min-w-\[18px\]{min-width:18px}.min-w-\[100px\]{min-width:100px}.min-w-\[110px\]{min-width:110px}.min-w-\[120px\]{min-width:120px}.min-w-\[140px\]{min-width:140px}.min-w-\[160px\]{min-width:160px}.min-w-\[170px\]{min-width:170px}.min-w-\[230px\]{min-width:230px}.min-w-\[280px\]{min-width:280px}.min-w-\[540px\]{min-width:540px}.min-w-\[760px\]{min-width:760px}.min-w-\[840px\]{min-width:840px}.min-w-\[980px\]{min-width:980px}.min-w-full{min-width:100%}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-4{--tw-translate-x:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-5{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-3{--tw-translate-y:calc(var(--spacing) * 3);translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-105{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.-rotate-\[24\.22deg\]{rotate:-24.22deg}.rotate-0{rotate:0deg}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-\[56px_1fr_1fr_96px\]{grid-template-columns:56px 1fr 1fr 96px}.grid-cols-\[150px_minmax\(0\,1fr\)\]{grid-template-columns:150px minmax(0,1fr)}.grid-cols-\[minmax\(110px\,0\.75fr\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(110px,.75fr) minmax(0,1fr)}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-evenly{justify-content:space-evenly}.gap-0{gap:calc(var(--spacing) * 0)}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-12>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 12) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 12) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-5{column-gap:calc(var(--spacing) * 5)}.gap-x-8{column-gap:calc(var(--spacing) * 8)}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 3) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-0{row-gap:calc(var(--spacing) * 0)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-amber-100\/70>:not(:last-child)){border-color:#fef3c6b3}@supports (color:color-mix(in lab, red, red)){:where(.divide-amber-100\/70>:not(:last-child)){border-color:color-mix(in oklab, var(--color-amber-100) 70%, transparent)}}:where(.divide-red-100\/70>:not(:last-child)){border-color:#ffe2e2b3}@supports (color:color-mix(in lab, red, red)){:where(.divide-red-100\/70>:not(:last-child)){border-color:color-mix(in oklab, var(--color-red-100) 70%, transparent)}}:where(.divide-stroke-subtle>:not(:last-child)){border-color:var(--color-border-subtle)}.self-stretch{align-self:stretch}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-\[5px\]{border-radius:5px}.rounded-\[8px\]{border-radius:8px}.rounded-\[10px\]{border-radius:10px}.rounded-\[12px\]{border-radius:12px}.rounded-\[15px\]{border-radius:15px}.rounded-\[16px\]{border-radius:16px}.rounded-\[18px\]{border-radius:18px}.rounded-\[20px\]{border-radius:20px}.rounded-\[24px\]{border-radius:24px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-l-md{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-b-\[15px\]{border-bottom-right-radius:15px;border-bottom-left-radius:15px}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-3{border-style:var(--tw-border-style);border-width:3px}.border-4{border-style:var(--tw-border-style);border-width:4px}.\!border-t-2{border-top-style:var(--tw-border-style)!important;border-top-width:2px!important}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.\!border-primary{border-color:var(--color-primary)!important}.border-accent-amber,.border-accent-amber\/opacity-heavy{border-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.border-accent-amber\/opacity-heavy{border-color:color-mix(in oklab, var(--color-accent-amber) 50%, transparent)}}.border-accent-amber\/opacity-medium{border-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.border-accent-amber\/opacity-medium{border-color:color-mix(in oklab, var(--color-accent-amber) 25%, transparent)}}.border-accent-cyan,.border-accent-cyan\/opacity-heavy{border-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.border-accent-cyan\/opacity-heavy{border-color:color-mix(in oklab, var(--color-accent-cyan) 50%, transparent)}}.border-accent-cyan\/opacity-medium{border-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.border-accent-cyan\/opacity-medium{border-color:color-mix(in oklab, var(--color-accent-cyan) 25%, transparent)}}.border-accent-green,.border-accent-green\/opacity-heavy{border-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.border-accent-green\/opacity-heavy{border-color:color-mix(in oklab, var(--color-accent-green) 50%, transparent)}}.border-accent-green\/opacity-medium{border-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.border-accent-green\/opacity-medium{border-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}.border-accent-orange\/opacity-medium{border-color:var(--color-accent-orange)}@supports (color:color-mix(in lab, red, red)){.border-accent-orange\/opacity-medium{border-color:color-mix(in oklab, var(--color-accent-orange) 25%, transparent)}}.border-accent-purple\/opacity-heavy{border-color:var(--color-accent-purple)}@supports (color:color-mix(in lab, red, red)){.border-accent-purple\/opacity-heavy{border-color:color-mix(in oklab, var(--color-accent-purple) 50%, transparent)}}.border-accent-red,.border-accent-red\/opacity-heavy{border-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.border-accent-red\/opacity-heavy{border-color:color-mix(in oklab, var(--color-accent-red) 50%, transparent)}}.border-accent-red\/opacity-medium{border-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.border-accent-red\/opacity-medium{border-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.border-background-mute{border-color:var(--color-background-mute)}.border-blue-200{border-color:var(--color-blue-200)}.border-current{border-color:currentColor}.border-primary,.border-primary\/opacity-heavy{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/opacity-heavy{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.border-primary\/opacity-medium{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/opacity-medium{border-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.border-secondary,.border-secondary\/opacity-heavy{border-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.border-secondary\/opacity-heavy{border-color:color-mix(in oklab, var(--color-secondary) 50%, transparent)}}.border-secondary\/opacity-medium{border-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.border-secondary\/opacity-medium{border-color:color-mix(in oklab, var(--color-secondary) 25%, transparent)}}.border-slate-500\/20{border-color:#62748e33}@supports (color:color-mix(in lab, red, red)){.border-slate-500\/20{border-color:color-mix(in oklab, var(--color-slate-500) 20%, transparent)}}.border-slate-500\/40{border-color:#62748e66}@supports (color:color-mix(in lab, red, red)){.border-slate-500\/40{border-color:color-mix(in oklab, var(--color-slate-500) 40%, transparent)}}.border-stroke{border-color:var(--color-border)}.border-stroke-subtle,.border-stroke-subtle\/50{border-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.border-stroke-subtle\/50{border-color:color-mix(in oklab, var(--color-border-subtle) 50%, transparent)}}.border-stroke-subtle\/60{border-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.border-stroke-subtle\/60{border-color:color-mix(in oklab, var(--color-border-subtle) 60%, transparent)}}.border-stroke-subtle\/70{border-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.border-stroke-subtle\/70{border-color:color-mix(in oklab, var(--color-border-subtle) 70%, transparent)}}.border-stroke\/20{border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.border-stroke\/20{border-color:color-mix(in oklab, var(--color-border) 20%, transparent)}}.border-stroke\/opacity-medium{border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.border-stroke\/opacity-medium{border-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}.border-transparent{border-color:#0000}.border-white{border-color:var(--color-white)}.border-white\/opacity-light{border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.border-white\/opacity-light{border-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.border-white\/opacity-medium{border-color:#ffffff40}@supports (color:color-mix(in lab, red, red)){.border-white\/opacity-medium{border-color:color-mix(in oklab, var(--color-white) 25%, transparent)}}.border-t-transparent{border-top-color:#0000}.border-l-accent-amber{border-left-color:var(--color-accent-amber)}.border-l-accent-cyan{border-left-color:var(--color-accent-cyan)}.border-l-accent-green{border-left-color:var(--color-accent-green)}.border-l-accent-purple{border-left-color:var(--color-accent-purple)}.border-l-accent-red{border-left-color:var(--color-accent-red)}.border-l-amber-500{border-left-color:var(--color-amber-500)}.border-l-gray-500{border-left-color:var(--color-gray-500)}.border-l-green-600{border-left-color:var(--color-green-600)}.border-l-primary{border-left-color:var(--color-primary)}.bg-accent-amber,.bg-accent-amber\/opacity-heavy{background-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.bg-accent-amber\/opacity-heavy{background-color:color-mix(in oklab, var(--color-accent-amber) 50%, transparent)}}.bg-accent-amber\/opacity-light{background-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.bg-accent-amber\/opacity-light{background-color:color-mix(in oklab, var(--color-accent-amber) 10%, transparent)}}.bg-accent-amber\/opacity-medium{background-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.bg-accent-amber\/opacity-medium{background-color:color-mix(in oklab, var(--color-accent-amber) 25%, transparent)}}.bg-accent-cyan,.bg-accent-cyan\/opacity-light{background-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.bg-accent-cyan\/opacity-light{background-color:color-mix(in oklab, var(--color-accent-cyan) 10%, transparent)}}.bg-accent-cyan\/opacity-medium{background-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.bg-accent-cyan\/opacity-medium{background-color:color-mix(in oklab, var(--color-accent-cyan) 25%, transparent)}}.bg-accent-green{background-color:var(--color-accent-green)}.bg-accent-green-light{background-color:var(--color-accent-green-light)}.bg-accent-green\/opacity-heavy{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.bg-accent-green\/opacity-heavy{background-color:color-mix(in oklab, var(--color-accent-green) 50%, transparent)}}.bg-accent-green\/opacity-light{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.bg-accent-green\/opacity-light{background-color:color-mix(in oklab, var(--color-accent-green) 10%, transparent)}}.bg-accent-green\/opacity-medium{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.bg-accent-green\/opacity-medium{background-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}.bg-accent-orange,.bg-accent-orange\/opacity-light{background-color:var(--color-accent-orange)}@supports (color:color-mix(in lab, red, red)){.bg-accent-orange\/opacity-light{background-color:color-mix(in oklab, var(--color-accent-orange) 10%, transparent)}}.bg-accent-orange\/opacity-medium{background-color:var(--color-accent-orange)}@supports (color:color-mix(in lab, red, red)){.bg-accent-orange\/opacity-medium{background-color:color-mix(in oklab, var(--color-accent-orange) 25%, transparent)}}.bg-accent-purple,.bg-accent-purple\/opacity-medium{background-color:var(--color-accent-purple)}@supports (color:color-mix(in lab, red, red)){.bg-accent-purple\/opacity-medium{background-color:color-mix(in oklab, var(--color-accent-purple) 25%, transparent)}}.bg-accent-red,.bg-accent-red\/10{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.bg-accent-red\/10{background-color:color-mix(in oklab, var(--color-accent-red) 10%, transparent)}}.bg-accent-red\/opacity-light{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.bg-accent-red\/opacity-light{background-color:color-mix(in oklab, var(--color-accent-red) 10%, transparent)}}.bg-accent-red\/opacity-medium{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.bg-accent-red\/opacity-medium{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.bg-background{background-color:var(--color-background)}.bg-background-mute,.bg-background-mute\/opacity-heavy{background-color:var(--color-background-mute)}@supports (color:color-mix(in lab, red, red)){.bg-background-mute\/opacity-heavy{background-color:color-mix(in oklab, var(--color-background-mute) 50%, transparent)}}.bg-background-mute\/opacity-light{background-color:var(--color-background-mute)}@supports (color:color-mix(in lab, red, red)){.bg-background-mute\/opacity-light{background-color:color-mix(in oklab, var(--color-background-mute) 10%, transparent)}}.bg-background-mute\/opacity-medium{background-color:var(--color-background-mute)}@supports (color:color-mix(in lab, red, red)){.bg-background-mute\/opacity-medium{background-color:color-mix(in oklab, var(--color-background-mute) 25%, transparent)}}.bg-background-soft{background-color:var(--color-background-soft)}.bg-badge-cyan-bg{background-color:var(--color-badge-cyan-bg)}.bg-badge-neutral-bg{background-color:var(--color-badge-neutral-bg)}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab, red, red)){.bg-black\/80{background-color:color-mix(in oklab, var(--color-black) 80%, transparent)}}.bg-black\/opacity-heavy{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/opacity-heavy{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-black\/opacity-light{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.bg-black\/opacity-light{background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.bg-black\/opacity-medium{background-color:#00000040}@supports (color:color-mix(in lab, red, red)){.bg-black\/opacity-medium{background-color:color-mix(in oklab, var(--color-black) 25%, transparent)}}.bg-content-muted,.bg-content-muted\/opacity-heavy{background-color:var(--color-text-muted)}@supports (color:color-mix(in lab, red, red)){.bg-content-muted\/opacity-heavy{background-color:color-mix(in oklab, var(--color-text-muted) 50%, transparent)}}.bg-content-primary{background-color:var(--color-text-primary)}.bg-current,.bg-current\/10{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.bg-current\/10{background-color:color-mix(in oklab, currentcolor 10%, transparent)}}.bg-green-400{background-color:var(--color-green-400)}.bg-primary,.bg-primary\/15{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/15{background-color:color-mix(in oklab, var(--color-primary) 15%, transparent)}}.bg-primary\/opacity-heavy{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/opacity-heavy{background-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.bg-primary\/opacity-light{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/opacity-light{background-color:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.bg-primary\/opacity-medium{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/opacity-medium{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.bg-red-700{background-color:var(--color-red-700)}.bg-secondary,.bg-secondary\/opacity-light{background-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.bg-secondary\/opacity-light{background-color:color-mix(in oklab, var(--color-secondary) 10%, transparent)}}.bg-secondary\/opacity-medium{background-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.bg-secondary\/opacity-medium{background-color:color-mix(in oklab, var(--color-secondary) 25%, transparent)}}.bg-stroke-subtle,.bg-stroke-subtle\/40{background-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.bg-stroke-subtle\/40{background-color:color-mix(in oklab, var(--color-border-subtle) 40%, transparent)}}.bg-stroke-subtle\/50{background-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.bg-stroke-subtle\/50{background-color:color-mix(in oklab, var(--color-border-subtle) 50%, transparent)}}.bg-surface{background-color:var(--color-surface)}.bg-surface-elevated{background-color:var(--color-surface-elevated)}.bg-surface\/opacity-heavy{background-color:var(--color-surface)}@supports (color:color-mix(in lab, red, red)){.bg-surface\/opacity-heavy{background-color:color-mix(in oklab, var(--color-surface) 50%, transparent)}}.bg-white{background-color:var(--color-white)}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab, red, red)){.bg-white\/60{background-color:color-mix(in oklab, var(--color-white) 60%, transparent)}}.bg-white\/opacity-heavy{background-color:#ffffff80}@supports (color:color-mix(in lab, red, red)){.bg-white\/opacity-heavy{background-color:color-mix(in oklab, var(--color-white) 50%, transparent)}}.bg-white\/opacity-light{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.bg-white\/opacity-light{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-tl{--tw-gradient-position:to top left in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-accent-amber\/20{--tw-gradient-from:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.from-accent-amber\/20{--tw-gradient-from:color-mix(in oklab, var(--color-accent-amber) 20%, transparent)}}.from-accent-amber\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-accent-green\/10{--tw-gradient-from:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.from-accent-green\/10{--tw-gradient-from:color-mix(in oklab, var(--color-accent-green) 10%, transparent)}}.from-accent-green\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-blue-200\/30{--tw-gradient-from:#bedbff4d}@supports (color:color-mix(in lab, red, red)){.from-blue-200\/30{--tw-gradient-from:color-mix(in oklab, var(--color-blue-200) 30%, transparent)}}.from-blue-200\/30{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-blue-400\/15{--tw-gradient-from:#54a2ff26}@supports (color:color-mix(in lab, red, red)){.from-blue-400\/15{--tw-gradient-from:color-mix(in oklab, var(--color-blue-400) 15%, transparent)}}.from-blue-400\/15{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-cyan-500\/20{--tw-gradient-from:#00b7d733}@supports (color:color-mix(in lab, red, red)){.from-cyan-500\/20{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-500) 20%, transparent)}}.from-cyan-500\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-cyan-500\/50{--tw-gradient-from:#00b7d780}@supports (color:color-mix(in lab, red, red)){.from-cyan-500\/50{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-500) 50%, transparent)}}.from-cyan-500\/50{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-gray-100{--tw-gradient-from:var(--color-gray-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-200\/25{--tw-gradient-from:#c7d2ff40}@supports (color:color-mix(in lab, red, red)){.from-indigo-200\/25{--tw-gradient-from:color-mix(in oklab, var(--color-indigo-200) 25%, transparent)}}.from-indigo-200\/25{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-400\/15{--tw-gradient-from:#7d87ff26}@supports (color:color-mix(in lab, red, red)){.from-indigo-400\/15{--tw-gradient-from:color-mix(in oklab, var(--color-indigo-400) 15%, transparent)}}.from-indigo-400\/15{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-orange-500\/50{--tw-gradient-from:#fe6e0080}@supports (color:color-mix(in lab, red, red)){.from-orange-500\/50{--tw-gradient-from:color-mix(in oklab, var(--color-orange-500) 50%, transparent)}}.from-orange-500\/50{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-primary{--tw-gradient-from:var(--color-primary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-primary\/3{--tw-gradient-from:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.from-primary\/3{--tw-gradient-from:color-mix(in oklab, var(--color-primary) 3%, transparent)}}.from-primary\/3{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-primary\/20{--tw-gradient-from:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.from-primary\/20{--tw-gradient-from:color-mix(in oklab, var(--color-primary) 20%, transparent)}}.from-primary\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-primary\/30{--tw-gradient-from:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.from-primary\/30{--tw-gradient-from:color-mix(in oklab, var(--color-primary) 30%, transparent)}}.from-primary\/30{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-primary\/opacity-subtle{--tw-gradient-from:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.from-primary\/opacity-subtle{--tw-gradient-from:color-mix(in oklab, var(--color-primary) 5%, transparent)}}.from-primary\/opacity-subtle{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-200\/25{--tw-gradient-from:#e9d5ff40}@supports (color:color-mix(in lab, red, red)){.from-purple-200\/25{--tw-gradient-from:color-mix(in oklab, var(--color-purple-200) 25%, transparent)}}.from-purple-200\/25{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-400\/15{--tw-gradient-from:#c07eff26}@supports (color:color-mix(in lab, red, red)){.from-purple-400\/15{--tw-gradient-from:color-mix(in oklab, var(--color-purple-400) 15%, transparent)}}.from-purple-400\/15{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-red-500\/50{--tw-gradient-from:#fb2c3680}@supports (color:color-mix(in lab, red, red)){.from-red-500\/50{--tw-gradient-from:color-mix(in oklab, var(--color-red-500) 50%, transparent)}}.from-red-500\/50{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-secondary\/20{--tw-gradient-from:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.from-secondary\/20{--tw-gradient-from:color-mix(in oklab, var(--color-secondary) 20%, transparent)}}.from-secondary\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-secondary\/opacity-subtle{--tw-gradient-from:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.from-secondary\/opacity-subtle{--tw-gradient-from:color-mix(in oklab, var(--color-secondary) 5%, transparent)}}.from-secondary\/opacity-subtle{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-yellow-500\/50{--tw-gradient-from:#edb20080}@supports (color:color-mix(in lab, red, red)){.from-yellow-500\/50{--tw-gradient-from:color-mix(in oklab, var(--color-yellow-500) 50%, transparent)}}.from-yellow-500\/50{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-primary\/20{--tw-gradient-via:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.via-primary\/20{--tw-gradient-via:color-mix(in oklab, var(--color-primary) 20%, transparent)}}.via-primary\/20{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-secondary\/10{--tw-gradient-via:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.via-secondary\/10{--tw-gradient-via:color-mix(in oklab, var(--color-secondary) 10%, transparent)}}.via-secondary\/10{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-transparent{--tw-gradient-via:transparent;--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-white\/opacity-subtle{--tw-gradient-via:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.via-white\/opacity-subtle{--tw-gradient-via:color-mix(in oklab, var(--color-white) 5%, transparent)}}.via-white\/opacity-subtle{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-accent-cyan\/20{--tw-gradient-to:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.to-accent-cyan\/20{--tw-gradient-to:color-mix(in oklab, var(--color-accent-cyan) 20%, transparent)}}.to-accent-cyan\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-accent-green{--tw-gradient-to:var(--color-accent-green);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-accent-purple\/20{--tw-gradient-to:var(--color-accent-purple)}@supports (color:color-mix(in lab, red, red)){.to-accent-purple\/20{--tw-gradient-to:color-mix(in oklab, var(--color-accent-purple) 20%, transparent)}}.to-accent-purple\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-accent-red\/20{--tw-gradient-to:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.to-accent-red\/20{--tw-gradient-to:color-mix(in oklab, var(--color-accent-red) 20%, transparent)}}.to-accent-red\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-100\/15{--tw-gradient-to:#dbeafe26}@supports (color:color-mix(in lab, red, red)){.to-blue-100\/15{--tw-gradient-to:color-mix(in oklab, var(--color-blue-100) 15%, transparent)}}.to-blue-100\/15{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-100\/20{--tw-gradient-to:#dbeafe33}@supports (color:color-mix(in lab, red, red)){.to-blue-100\/20{--tw-gradient-to:color-mix(in oklab, var(--color-blue-100) 20%, transparent)}}.to-blue-100\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-300\/opacity-subtle{--tw-gradient-to:#90c5ff0d}@supports (color:color-mix(in lab, red, red)){.to-blue-300\/opacity-subtle{--tw-gradient-to:color-mix(in oklab, var(--color-blue-300) 5%, transparent)}}.to-blue-300\/opacity-subtle{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-400\/20{--tw-gradient-to:#00d2ef33}@supports (color:color-mix(in lab, red, red)){.to-cyan-400\/20{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-400) 20%, transparent)}}.to-cyan-400\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-600\/50{--tw-gradient-to:#0092b580}@supports (color:color-mix(in lab, red, red)){.to-cyan-600\/50{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-600) 50%, transparent)}}.to-cyan-600\/50{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-gray-200{--tw-gradient-to:var(--color-gray-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-indigo-300\/opacity-subtle{--tw-gradient-to:#a4b3ff0d}@supports (color:color-mix(in lab, red, red)){.to-indigo-300\/opacity-subtle{--tw-gradient-to:color-mix(in oklab, var(--color-indigo-300) 5%, transparent)}}.to-indigo-300\/opacity-subtle{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-600\/50{--tw-gradient-to:#f0510080}@supports (color:color-mix(in lab, red, red)){.to-orange-600\/50{--tw-gradient-to:color-mix(in oklab, var(--color-orange-600) 50%, transparent)}}.to-orange-600\/50{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-primary\/10{--tw-gradient-to:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.to-primary\/10{--tw-gradient-to:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.to-primary\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-primary\/20{--tw-gradient-to:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.to-primary\/20{--tw-gradient-to:color-mix(in oklab, var(--color-primary) 20%, transparent)}}.to-primary\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-primary\/80{--tw-gradient-to:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.to-primary\/80{--tw-gradient-to:color-mix(in oklab, var(--color-primary) 80%, transparent)}}.to-primary\/80{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-100\/15{--tw-gradient-to:#f3e8ff26}@supports (color:color-mix(in lab, red, red)){.to-purple-100\/15{--tw-gradient-to:color-mix(in oklab, var(--color-purple-100) 15%, transparent)}}.to-purple-100\/15{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-300\/opacity-subtle{--tw-gradient-to:#d9b3ff0d}@supports (color:color-mix(in lab, red, red)){.to-purple-300\/opacity-subtle{--tw-gradient-to:color-mix(in oklab, var(--color-purple-300) 5%, transparent)}}.to-purple-300\/opacity-subtle{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-red-600\/50{--tw-gradient-to:#e4001480}@supports (color:color-mix(in lab, red, red)){.to-red-600\/50{--tw-gradient-to:color-mix(in oklab, var(--color-red-600) 50%, transparent)}}.to-red-600\/50{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-secondary\/30{--tw-gradient-to:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.to-secondary\/30{--tw-gradient-to:color-mix(in oklab, var(--color-secondary) 30%, transparent)}}.to-secondary\/30{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-yellow-600\/50{--tw-gradient-to:#cd890080}@supports (color:color-mix(in lab, red, red)){.to-yellow-600\/50{--tw-gradient-to:color-mix(in oklab, var(--color-yellow-600) 50%, transparent)}}.to-yellow-600\/50{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.\!p-2{padding:calc(var(--spacing) * 2)!important}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-10{padding:calc(var(--spacing) * 10)}.p-\[15px\]{padding:15px}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-px{padding-top:1px}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-0{padding-bottom:calc(var(--spacing) * 0)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-\[calc\(var\(--app-safe-area-bottom\)\+1rem\)\]{padding-bottom:calc(var(--app-safe-area-bottom) + 1rem)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-9{padding-left:calc(var(--spacing) * 9)}.pl-10{padding-left:calc(var(--spacing) * 10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-heading{font-family:Michroma,sans-serif}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:Inter,-apple-system,Roboto,Helvetica,sans-serif}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent-amber{color:var(--color-accent-amber)}.text-accent-cyan,.text-accent-cyan\/opacity-heavy{color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.text-accent-cyan\/opacity-heavy{color:color-mix(in oklab, var(--color-accent-cyan) 50%, transparent)}}.text-accent-green{color:var(--color-accent-green)}.text-accent-green-light{color:var(--color-accent-green-light)}.text-accent-green\/opacity-heavy{color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.text-accent-green\/opacity-heavy{color:color-mix(in oklab, var(--color-accent-green) 50%, transparent)}}.text-accent-orange{color:var(--color-accent-orange)}.text-accent-purple{color:var(--color-accent-purple)}.text-accent-red,.text-accent-red\/opacity-heavy{color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.text-accent-red\/opacity-heavy{color:color-mix(in oklab, var(--color-accent-red) 50%, transparent)}}.text-background{color:var(--color-background)}.text-badge-cyan-text{color:var(--color-badge-cyan-text)}.text-badge-neutral-text{color:var(--color-badge-neutral-text)}.text-content-heading{color:var(--color-heading)}.text-content-muted,.text-content-muted\/60{color:var(--color-text-muted)}@supports (color:color-mix(in lab, red, red)){.text-content-muted\/60{color:color-mix(in oklab, var(--color-text-muted) 60%, transparent)}}.text-content-muted\/opacity-heavy{color:var(--color-text-muted)}@supports (color:color-mix(in lab, red, red)){.text-content-muted\/opacity-heavy{color:color-mix(in oklab, var(--color-text-muted) 50%, transparent)}}.text-content-primary,.text-content-primary\/opacity-heavy{color:var(--color-text-primary)}@supports (color:color-mix(in lab, red, red)){.text-content-primary\/opacity-heavy{color:color-mix(in oklab, var(--color-text-primary) 50%, transparent)}}.text-content-secondary{color:var(--color-text-secondary)}.text-green-500{color:var(--color-green-500)}.text-indigo-500{color:var(--color-indigo-500)}.text-primary,.text-primary\/opacity-heavy{color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.text-primary\/opacity-heavy{color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.text-secondary,.text-secondary\/opacity-heavy{color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.text-secondary\/opacity-heavy{color:color-mix(in oklab, var(--color-secondary) 50%, transparent)}}.text-transparent{color:#0000}.text-white{color:var(--color-white)}.text-white\/40{color:#fff6}@supports (color:color-mix(in lab, red, red)){.text-white\/40{color:color-mix(in oklab, var(--color-white) 40%, transparent)}}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab, red, red)){.text-white\/50{color:color-mix(in oklab, var(--color-white) 50%, transparent)}}.text-white\/60{color:#fff9}@supports (color:color-mix(in lab, red, red)){.text-white\/60{color:color-mix(in oklab, var(--color-white) 60%, transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab, red, red)){.text-white\/80{color:color-mix(in oklab, var(--color-white) 80%, transparent)}}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.decoration-primary\/60{-webkit-text-decoration-color:var(--color-primary);-webkit-text-decoration-color:var(--color-primary);-webkit-text-decoration-color:var(--color-primary);text-decoration-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.decoration-primary\/60{-webkit-text-decoration-color:color-mix(in oklab, var(--color-primary) 60%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--color-primary) 60%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--color-primary) 60%, transparent);text-decoration-color:color-mix(in oklab, var(--color-primary) 60%, transparent)}}.decoration-stroke-hover{-webkit-text-decoration-color:var(--color-border-hover);-webkit-text-decoration-color:var(--color-border-hover);-webkit-text-decoration-color:var(--color-border-hover);text-decoration-color:var(--color-border-hover)}.underline-offset-2{text-underline-offset:2px}.placeholder-content-muted::placeholder{color:var(--color-text-muted)}.accent-primary{accent-color:var(--color-primary)}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-100{opacity:1}.mix-blend-multiply{mix-blend-mode:multiply}.mix-blend-normal{mix-blend-mode:normal}.mix-blend-screen{mix-blend-mode:screen}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_20px_80px_color-mix\(in_srgb\,var\(--color-shadow-strong\)_35\%\,transparent\)\]{--tw-shadow:0 20px 80px var(--tw-shadow-color,var(--color-shadow-strong))}@supports (color:color-mix(in lab, red, red)){.shadow-\[0_20px_80px_color-mix\(in_srgb\,var\(--color-shadow-strong\)_35\%\,transparent\)\]{--tw-shadow:0 20px 80px var(--tw-shadow-color,color-mix(in srgb,var(--color-shadow-strong) 35%,transparent))}}.shadow-\[0_20px_80px_color-mix\(in_srgb\,var\(--color-shadow-strong\)_35\%\,transparent\)\]{box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-accent-green\/50{--tw-shadow-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.shadow-accent-green\/50{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-accent-green) 50%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/10{--tw-shadow-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.shadow-primary\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-primary) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/20{--tw-shadow-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.shadow-primary\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-primary) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/30{--tw-shadow-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.shadow-primary\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-primary) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-cyan-400\/50{--tw-ring-color:#00d2ef80}@supports (color:color-mix(in lab, red, red)){.ring-cyan-400\/50{--tw-ring-color:color-mix(in oklab, var(--color-cyan-400) 50%, transparent)}}.blur-3xl{--tw-blur:blur(var(--blur-3xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.blur-\[120px\]{--tw-blur:blur(120px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.blur-xl{--tw-blur:blur(var(--blur-xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.brightness-0{--tw-brightness:brightness(0%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-\[0_0_6px_color-mix\(in_srgb\,var\(--color-accent-cyan\)_80\%\,transparent\)\]{--tw-drop-shadow-size:drop-shadow(0 0 6px var(--tw-drop-shadow-color,var(--color-accent-cyan)))}@supports (color:color-mix(in lab, red, red)){.drop-shadow-\[0_0_6px_color-mix\(in_srgb\,var\(--color-accent-cyan\)_80\%\,transparent\)\]{--tw-drop-shadow-size:drop-shadow(0 0 6px var(--tw-drop-shadow-color,color-mix(in srgb,var(--color-accent-cyan) 80%,transparent)))}}.drop-shadow-\[0_0_6px_color-mix\(in_srgb\,var\(--color-accent-cyan\)_80\%\,transparent\)\]{--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-lg{--tw-backdrop-blur:blur(var(--blur-lg));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}.\[webkit-overflow-scrolling\:touch\]{webkit-overflow-scrolling:touch}@media (hover:hover){.group-hover\:translate-x-1:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:translate-y-1:is(:where(.group):hover *){--tw-translate-y:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:scale-110:is(:where(.group):hover *){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:rotate-12:is(:where(.group):hover *){rotate:12deg}.group-hover\:border-stroke:is(:where(.group):hover *){border-color:var(--color-border)}.group-hover\:text-content-primary:is(:where(.group):hover *){color:var(--color-text-primary)}.group-hover\:text-indigo-500:is(:where(.group):hover *){color:var(--color-indigo-500)}.group-hover\:text-primary:is(:where(.group):hover *){color:var(--color-primary)}.group-hover\:text-secondary:is(:where(.group):hover *){color:var(--color-secondary)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\/delete\:rotate-12:is(:where(.group\/delete):hover *){rotate:12deg}}.peer-checked\:scale-100:is(:where(.peer):checked~*){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.peer-checked\:border-primary:is(:where(.peer):checked~*){border-color:var(--color-primary)}.peer-checked\:bg-primary\/opacity-medium:is(:where(.peer):checked~*){background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.peer-checked\:bg-primary\/opacity-medium:is(:where(.peer):checked~*){background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.placeholder\:text-content-muted::placeholder{color:var(--color-text-muted)}.last\:border-r-0:last-child{border-right-style:var(--tw-border-style);border-right-width:0}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.odd\:bg-background-mute\/opacity-medium:nth-child(odd){background-color:var(--color-background-mute)}@supports (color:color-mix(in lab, red, red)){.odd\:bg-background-mute\/opacity-medium:nth-child(odd){background-color:color-mix(in oklab, var(--color-background-mute) 25%, transparent)}}@media (hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-\[1\.02\]:hover{scale:1.02}.hover\:border-accent-amber\/opacity-medium:hover{border-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.hover\:border-accent-amber\/opacity-medium:hover{border-color:color-mix(in oklab, var(--color-accent-amber) 25%, transparent)}}.hover\:border-accent-cyan\/opacity-heavy:hover{border-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.hover\:border-accent-cyan\/opacity-heavy:hover{border-color:color-mix(in oklab, var(--color-accent-cyan) 50%, transparent)}}.hover\:border-indigo-500\/50:hover{border-color:#625fff80}@supports (color:color-mix(in lab, red, red)){.hover\:border-indigo-500\/50:hover{border-color:color-mix(in oklab, var(--color-indigo-500) 50%, transparent)}}.hover\:border-primary:hover,.hover\:border-primary\/opacity-heavy:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/opacity-heavy:hover{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.hover\:border-primary\/opacity-medium:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/opacity-medium:hover{border-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.hover\:border-secondary\/opacity-heavy:hover{border-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:border-secondary\/opacity-heavy:hover{border-color:color-mix(in oklab, var(--color-secondary) 50%, transparent)}}.hover\:border-stroke:hover{border-color:var(--color-border)}.hover\:border-stroke-subtle:hover{border-color:var(--color-border-subtle)}.hover\:bg-accent-amber\/opacity-light:hover{background-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-amber\/opacity-light:hover{background-color:color-mix(in oklab, var(--color-accent-amber) 10%, transparent)}}.hover\:bg-accent-amber\/opacity-medium:hover{background-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-amber\/opacity-medium:hover{background-color:color-mix(in oklab, var(--color-accent-amber) 25%, transparent)}}.hover\:bg-accent-cyan\/opacity-medium:hover{background-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-cyan\/opacity-medium:hover{background-color:color-mix(in oklab, var(--color-accent-cyan) 25%, transparent)}}.hover\:bg-accent-green\/opacity-light:hover{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-green\/opacity-light:hover{background-color:color-mix(in oklab, var(--color-accent-green) 10%, transparent)}}.hover\:bg-accent-green\/opacity-medium:hover{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-green\/opacity-medium:hover{background-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}.hover\:bg-accent-purple\/opacity-medium:hover{background-color:var(--color-accent-purple)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-purple\/opacity-medium:hover{background-color:color-mix(in oklab, var(--color-accent-purple) 25%, transparent)}}.hover\:bg-accent-red\/opacity-light:hover{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-red\/opacity-light:hover{background-color:color-mix(in oklab, var(--color-accent-red) 10%, transparent)}}.hover\:bg-accent-red\/opacity-medium:hover{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-red\/opacity-medium:hover{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.hover\:bg-background-mute:hover,.hover\:bg-background-mute\/opacity-heavy:hover{background-color:var(--color-background-mute)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-background-mute\/opacity-heavy:hover{background-color:color-mix(in oklab, var(--color-background-mute) 50%, transparent)}}.hover\:bg-background-soft:hover{background-color:var(--color-background-soft)}.hover\:bg-black\/80:hover{background-color:#000c}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/80:hover{background-color:color-mix(in oklab, var(--color-black) 80%, transparent)}}.hover\:bg-black\/opacity-light:hover{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/opacity-light:hover{background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.hover\:bg-indigo-50:hover{background-color:var(--color-indigo-50)}.hover\:bg-primary\/opacity-heavy:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/opacity-heavy:hover{background-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.hover\:bg-primary\/opacity-light:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/opacity-light:hover{background-color:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.hover\:bg-primary\/opacity-medium:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/opacity-medium:hover{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.hover\:bg-secondary\/opacity-heavy:hover{background-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/opacity-heavy:hover{background-color:color-mix(in oklab, var(--color-secondary) 50%, transparent)}}.hover\:bg-secondary\/opacity-light:hover{background-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/opacity-light:hover{background-color:color-mix(in oklab, var(--color-secondary) 10%, transparent)}}.hover\:bg-stroke-subtle:hover,.hover\:bg-stroke-subtle\/40:hover{background-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-stroke-subtle\/40:hover{background-color:color-mix(in oklab, var(--color-border-subtle) 40%, transparent)}}.hover\:bg-stroke-subtle\/50:hover{background-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-stroke-subtle\/50:hover{background-color:color-mix(in oklab, var(--color-border-subtle) 50%, transparent)}}.hover\:bg-stroke-subtle\/60:hover{background-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-stroke-subtle\/60:hover{background-color:color-mix(in oklab, var(--color-border-subtle) 60%, transparent)}}.hover\:bg-stroke\/opacity-light:hover{background-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-stroke\/opacity-light:hover{background-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-white\/opacity-light:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/opacity-light:hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.hover\:from-cyan-500\/30:hover{--tw-gradient-from:#00b7d74d}@supports (color:color-mix(in lab, red, red)){.hover\:from-cyan-500\/30:hover{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-500) 30%, transparent)}}.hover\:from-cyan-500\/30:hover{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.hover\:from-gray-200:hover{--tw-gradient-from:var(--color-gray-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.hover\:from-primary\/40:hover{--tw-gradient-from:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:from-primary\/40:hover{--tw-gradient-from:color-mix(in oklab, var(--color-primary) 40%, transparent)}}.hover\:from-primary\/40:hover{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.hover\:to-cyan-400\/30:hover{--tw-gradient-to:#00d2ef4d}@supports (color:color-mix(in lab, red, red)){.hover\:to-cyan-400\/30:hover{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-400) 30%, transparent)}}.hover\:to-cyan-400\/30:hover{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.hover\:to-gray-300:hover{--tw-gradient-to:var(--color-gray-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.hover\:to-secondary\/40:hover{--tw-gradient-to:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:to-secondary\/40:hover{--tw-gradient-to:color-mix(in oklab, var(--color-secondary) 40%, transparent)}}.hover\:to-secondary\/40:hover{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.hover\:text-accent-green:hover{color:var(--color-accent-green)}.hover\:text-accent-red:hover{color:var(--color-accent-red)}.hover\:text-content-heading:hover{color:var(--color-heading)}.hover\:text-content-primary:hover{color:var(--color-text-primary)}.hover\:text-content-secondary:hover{color:var(--color-text-secondary)}.hover\:text-primary:hover,.hover\:text-primary\/opacity-heavy:hover{color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:text-primary\/opacity-heavy:hover{color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.hover\:text-white:hover{color:var(--color-white)}.hover\:no-underline:hover{text-decoration-line:none}.hover\:decoration-primary\/60:hover{-webkit-text-decoration-color:var(--color-primary);-webkit-text-decoration-color:var(--color-primary);-webkit-text-decoration-color:var(--color-primary);text-decoration-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:decoration-primary\/60:hover{-webkit-text-decoration-color:color-mix(in oklab, var(--color-primary) 60%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--color-primary) 60%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--color-primary) 60%, transparent);text-decoration-color:color-mix(in oklab, var(--color-primary) 60%, transparent)}}.hover\:opacity-90:hover{opacity:.9}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\:shadow-accent-green\/opacity-medium:hover{--tw-shadow-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-accent-green\/opacity-medium:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-accent-green) 25%, transparent) var(--tw-shadow-alpha), transparent)}}.hover\:shadow-primary\/opacity-medium:hover{--tw-shadow-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-primary\/opacity-medium:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-primary) 25%, transparent) var(--tw-shadow-alpha), transparent)}}.hover\:shadow-secondary\/10:hover{--tw-shadow-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-secondary\/10:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-secondary) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.hover\:shadow-secondary\/opacity-medium:hover{--tw-shadow-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-secondary\/opacity-medium:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-secondary) 25%, transparent) var(--tw-shadow-alpha), transparent)}}}.focus\:border-primary:focus,.focus\:border-primary\/opacity-heavy:focus{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.focus\:border-primary\/opacity-heavy:focus{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-accent-cyan:focus{--tw-ring-color:var(--color-accent-cyan)}.focus\:ring-primary:focus,.focus\:ring-primary\/opacity-heavy:focus{--tw-ring-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.focus\:ring-primary\/opacity-heavy:focus{--tw-ring-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.focus\:ring-primary\/opacity-medium:focus{--tw-ring-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.focus\:ring-primary\/opacity-medium:focus{--tw-ring-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.focus\:ring-offset-background:focus{--tw-ring-offset-color:var(--color-background)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:scale-\[0\.98\]:active{scale:.98}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-stroke-subtle\/20:disabled{border-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.disabled\:border-stroke-subtle\/20:disabled{border-color:color-mix(in oklab, var(--color-border-subtle) 20%, transparent)}}.disabled\:bg-background-mute\/opacity-light:disabled{background-color:var(--color-background-mute)}@supports (color:color-mix(in lab, red, red)){.disabled\:bg-background-mute\/opacity-light:disabled{background-color:color-mix(in oklab, var(--color-background-mute) 10%, transparent)}}.disabled\:text-content-muted:disabled{color:var(--color-text-muted)}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}@media (width>=40rem){.sm\:col-span-1{grid-column:span 1/span 1}.sm\:mt-2{margin-top:calc(var(--spacing) * 2)}.sm\:mt-5{margin-top:calc(var(--spacing) * 5)}.sm\:mt-6{margin-top:calc(var(--spacing) * 6)}.sm\:mt-8{margin-top:calc(var(--spacing) * 8)}.sm\:mb-2{margin-bottom:calc(var(--spacing) * 2)}.sm\:mb-4{margin-bottom:calc(var(--spacing) * 4)}.sm\:ml-4{margin-left:calc(var(--spacing) * 4)}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-block{display:inline-block}.sm\:table-cell{display:table-cell}.sm\:h-3{height:calc(var(--spacing) * 3)}.sm\:h-4{height:calc(var(--spacing) * 4)}.sm\:h-5{height:calc(var(--spacing) * 5)}.sm\:h-6{height:calc(var(--spacing) * 6)}.sm\:h-10{height:calc(var(--spacing) * 10)}.sm\:h-48{height:calc(var(--spacing) * 48)}.sm\:h-\[22rem\]{height:22rem}.sm\:h-\[210px\]{height:210px}.sm\:max-h-\[90vh\]{max-height:90vh}.sm\:min-h-\[16rem\]{min-height:16rem}.sm\:w-3{width:calc(var(--spacing) * 3)}.sm\:w-4{width:calc(var(--spacing) * 4)}.sm\:w-5{width:calc(var(--spacing) * 5)}.sm\:w-6{width:calc(var(--spacing) * 6)}.sm\:w-10{width:calc(var(--spacing) * 10)}.sm\:w-24{width:calc(var(--spacing) * 24)}.sm\:w-32{width:calc(var(--spacing) * 32)}.sm\:w-40{width:calc(var(--spacing) * 40)}.sm\:w-48{width:calc(var(--spacing) * 48)}.sm\:w-64{width:calc(var(--spacing) * 64)}.sm\:w-72{width:calc(var(--spacing) * 72)}.sm\:w-80{width:calc(var(--spacing) * 80)}.sm\:w-96{width:calc(var(--spacing) * 96)}.sm\:w-auto{width:auto}.sm\:min-w-\[180px\]{min-width:180px}.sm\:flex-none{flex:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:flex-nowrap{flex-wrap:nowrap}.sm\:items-center{align-items:center}.sm\:items-start{align-items:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:gap-2{gap:calc(var(--spacing) * 2)}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.sm\:gap-3{gap:calc(var(--spacing) * 3)}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:gap-6{gap:calc(var(--spacing) * 6)}:where(.sm\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.sm\:space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.sm\:rounded-\[20px\]{border-radius:20px}.sm\:rounded-\[24px\]{border-radius:24px}.sm\:border{border-style:var(--tw-border-style);border-width:1px}.sm\:border-stroke-subtle{border-color:var(--color-border-subtle)}.sm\:\!p-4{padding:calc(var(--spacing) * 4)!important}.sm\:p-1{padding:calc(var(--spacing) * 1)}.sm\:p-3\.5{padding:calc(var(--spacing) * 3.5)}.sm\:p-4{padding:calc(var(--spacing) * 4)}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:p-10{padding:calc(var(--spacing) * 10)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.sm\:py-4{padding-block:calc(var(--spacing) * 4)}.sm\:pt-0{padding-top:calc(var(--spacing) * 0)}.sm\:pt-4{padding-top:calc(var(--spacing) * 4)}.sm\:pb-4{padding-bottom:calc(var(--spacing) * 4)}.sm\:text-right{text-align:right}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.sm\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}@media (width>=48rem){.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-4{grid-column:span 4/span 4}.md\:block{display:block}.md\:grid{display:grid}.md\:hidden{display:none}.md\:max-w-sm{max-width:var(--container-sm)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-start{align-items:flex-start}.md\:justify-between{justify-content:space-between}.md\:gap-3{gap:calc(var(--spacing) * 3)}:where(.md\:space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.md\:p-4{padding:calc(var(--spacing) * 4)}.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:px-4{padding-inline:calc(var(--spacing) * 4)}.md\:text-right{text-align:right}.md\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (width>=64rem){.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:mt-3{margin-top:calc(var(--spacing) * 3)}.lg\:mt-4{margin-top:calc(var(--spacing) * 4)}.lg\:mb-4{margin-bottom:calc(var(--spacing) * 4)}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:h-48{height:calc(var(--spacing) * 48)}.lg\:h-56{height:calc(var(--spacing) * 56)}.lg\:w-7{width:calc(var(--spacing) * 7)}.lg\:max-w-sm{max-width:var(--container-sm)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:gap-3{gap:calc(var(--spacing) * 3)}.lg\:gap-4{gap:calc(var(--spacing) * 4)}.lg\:gap-6{gap:calc(var(--spacing) * 6)}.lg\:p-6{padding:calc(var(--spacing) * 6)}.lg\:p-8{padding:calc(var(--spacing) * 8)}.lg\:p-\[15px\]{padding:15px}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\:pb-\[15px\]{padding-bottom:15px}.lg\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.lg\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.lg\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.lg\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.lg\:text-\[35px\]{font-size:35px}}@media (width>=80rem){.xl\:col-span-4{grid-column:span 4/span 4}.xl\:col-span-8{grid-column:span 8/span 8}.xl\:max-w-\[260px\]{max-width:260px}.xl\:min-w-\[260px\]{min-width:260px}.xl\:flex-none{flex:none}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xl\:grid-cols-\[minmax\(0\,1\.15fr\)_minmax\(340px\,0\.85fr\)\]{grid-template-columns:minmax(0,1.15fr) minmax(340px,.85fr)}.xl\:flex-row{flex-direction:row}.xl\:items-start{align-items:flex-start}.xl\:justify-end{justify-content:flex-end}}.dark\:hidden:is(.dark *){display:none}:where(.dark\:divide-amber-800\/40:is(.dark *)>:not(:last-child)){border-color:#953d0066}@supports (color:color-mix(in lab, red, red)){:where(.dark\:divide-amber-800\/40:is(.dark *)>:not(:last-child)){border-color:color-mix(in oklab, var(--color-amber-800) 40%, transparent)}}:where(.dark\:divide-red-800\/40:is(.dark *)>:not(:last-child)){border-color:#9f071266}@supports (color:color-mix(in lab, red, red)){:where(.dark\:divide-red-800\/40:is(.dark *)>:not(:last-child)){border-color:color-mix(in oklab, var(--color-red-800) 40%, transparent)}}:where(.dark\:divide-stroke\/10:is(.dark *)>:not(:last-child)){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){:where(.dark\:divide-stroke\/10:is(.dark *)>:not(:last-child)){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}:where(.dark\:divide-white\/10:is(.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.dark\:divide-white\/10:is(.dark *)>:not(:last-child)){border-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}:where(.dark\:divide-white\/opacity-subtle:is(.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.dark\:divide-white\/opacity-subtle:is(.dark *)>:not(:last-child)){border-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.dark\:border-accent-amber\/opacity-heavy:is(.dark *){border-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.dark\:border-accent-amber\/opacity-heavy:is(.dark *){border-color:color-mix(in oklab, var(--color-accent-amber) 50%, transparent)}}.dark\:border-accent-amber\/opacity-medium:is(.dark *){border-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.dark\:border-accent-amber\/opacity-medium:is(.dark *){border-color:color-mix(in oklab, var(--color-accent-amber) 25%, transparent)}}.dark\:border-accent-green\/opacity-heavy:is(.dark *){border-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.dark\:border-accent-green\/opacity-heavy:is(.dark *){border-color:color-mix(in oklab, var(--color-accent-green) 50%, transparent)}}.dark\:border-accent-green\/opacity-medium:is(.dark *){border-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.dark\:border-accent-green\/opacity-medium:is(.dark *){border-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}.dark\:border-accent-red\/opacity-heavy:is(.dark *){border-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.dark\:border-accent-red\/opacity-heavy:is(.dark *){border-color:color-mix(in oklab, var(--color-accent-red) 50%, transparent)}}.dark\:border-accent-red\/opacity-medium:is(.dark *){border-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.dark\:border-accent-red\/opacity-medium:is(.dark *){border-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.dark\:border-dark-border\/50:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:border-dark-border\/50:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.dark\:border-primary\/opacity-medium:is(.dark *){border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:border-primary\/opacity-medium:is(.dark *){border-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.dark\:border-stroke:is(.dark *),.dark\:border-stroke\/opacity-heavy:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:border-stroke\/opacity-heavy:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.dark\:border-stroke\/opacity-light:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:border-stroke\/opacity-light:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.dark\:border-stroke\/opacity-medium:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:border-stroke\/opacity-medium:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}.dark\:border-white\/opacity-light:is(.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:border-white\/opacity-light:is(.dark *){border-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:border-white\/opacity-medium:is(.dark *){border-color:#ffffff40}@supports (color:color-mix(in lab, red, red)){.dark\:border-white\/opacity-medium:is(.dark *){border-color:color-mix(in oklab, var(--color-white) 25%, transparent)}}.dark\:border-l-accent-green:is(.dark *){border-left-color:var(--color-accent-green)}.dark\:bg-\[var\(--color-surface\)\]:is(.dark *){background-color:var(--color-surface)}.dark\:bg-accent-amber\/opacity-light:is(.dark *){background-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-accent-amber\/opacity-light:is(.dark *){background-color:color-mix(in oklab, var(--color-accent-amber) 10%, transparent)}}.dark\:bg-accent-amber\/opacity-medium:is(.dark *){background-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-accent-amber\/opacity-medium:is(.dark *){background-color:color-mix(in oklab, var(--color-accent-amber) 25%, transparent)}}.dark\:bg-accent-green\/opacity-light:is(.dark *){background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-accent-green\/opacity-light:is(.dark *){background-color:color-mix(in oklab, var(--color-accent-green) 10%, transparent)}}.dark\:bg-accent-green\/opacity-medium:is(.dark *){background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-accent-green\/opacity-medium:is(.dark *){background-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}.dark\:bg-accent-red\/opacity-light:is(.dark *){background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-accent-red\/opacity-light:is(.dark *){background-color:color-mix(in oklab, var(--color-accent-red) 10%, transparent)}}.dark\:bg-accent-red\/opacity-medium:is(.dark *){background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-accent-red\/opacity-medium:is(.dark *){background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.dark\:bg-background:is(.dark *){background-color:var(--color-background)}.dark\:bg-background-mute:is(.dark *),.dark\:bg-background-mute\/opacity-heavy:is(.dark *){background-color:var(--color-background-mute)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-background-mute\/opacity-heavy:is(.dark *){background-color:color-mix(in oklab, var(--color-background-mute) 50%, transparent)}}.dark\:bg-background\/10:is(.dark *){background-color:var(--color-background)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-background\/10:is(.dark *){background-color:color-mix(in oklab, var(--color-background) 10%, transparent)}}.dark\:bg-background\/20:is(.dark *){background-color:var(--color-background)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-background\/20:is(.dark *){background-color:color-mix(in oklab, var(--color-background) 20%, transparent)}}.dark\:bg-background\/30:is(.dark *){background-color:var(--color-background)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-background\/30:is(.dark *){background-color:color-mix(in oklab, var(--color-background) 30%, transparent)}}.dark\:bg-background\/40:is(.dark *){background-color:var(--color-background)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-background\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-background) 40%, transparent)}}.dark\:bg-black\/10:is(.dark *){background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-black\/10:is(.dark *){background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.dark\:bg-black\/30:is(.dark *){background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-black\/30:is(.dark *){background-color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.dark\:bg-black\/opacity-heavy:is(.dark *){background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.dark\:bg-black\/opacity-heavy:is(.dark *){background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.dark\:bg-black\/opacity-medium:is(.dark *){background-color:#00000040}@supports (color:color-mix(in lab, red, red)){.dark\:bg-black\/opacity-medium:is(.dark *){background-color:color-mix(in oklab, var(--color-black) 25%, transparent)}}.dark\:bg-primary\/opacity-light:is(.dark *){background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-primary\/opacity-light:is(.dark *){background-color:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.dark\:bg-primary\/opacity-medium:is(.dark *){background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-primary\/opacity-medium:is(.dark *){background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.dark\:bg-stroke\/opacity-subtle:is(.dark *){background-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-stroke\/opacity-subtle:is(.dark *){background-color:color-mix(in oklab, var(--color-border) 5%, transparent)}}.dark\:bg-surface:is(.dark *){background-color:var(--color-surface)}.dark\:bg-surface-elevated:is(.dark *),.dark\:bg-surface-elevated\/30:is(.dark *){background-color:var(--color-surface-elevated)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-surface-elevated\/30:is(.dark *){background-color:color-mix(in oklab, var(--color-surface-elevated) 30%, transparent)}}.dark\:bg-surface-elevated\/80:is(.dark *){background-color:var(--color-surface-elevated)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-surface-elevated\/80:is(.dark *){background-color:color-mix(in oklab, var(--color-surface-elevated) 80%, transparent)}}.dark\:bg-surface\/opacity-heavy:is(.dark *){background-color:var(--color-surface)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-surface\/opacity-heavy:is(.dark *){background-color:color-mix(in oklab, var(--color-surface) 50%, transparent)}}.dark\:bg-transparent:is(.dark *){background-color:#0000}.dark\:bg-white\/5:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/5:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.dark\:bg-white\/\[0\.03\]:is(.dark *){background-color:#ffffff08}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/\[0\.03\]:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 3%, transparent)}}.dark\:bg-white\/opacity-light:is(.dark *){background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/opacity-light:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:bg-white\/opacity-subtle:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/opacity-subtle:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.dark\:from-primary\/opacity-subtle:is(.dark *){--tw-gradient-from:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:from-primary\/opacity-subtle:is(.dark *){--tw-gradient-from:color-mix(in oklab, var(--color-primary) 5%, transparent)}}.dark\:from-primary\/opacity-subtle:is(.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.dark\:from-white\/opacity-subtle:is(.dark *){--tw-gradient-from:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.dark\:from-white\/opacity-subtle:is(.dark *){--tw-gradient-from:color-mix(in oklab, var(--color-white) 5%, transparent)}}.dark\:from-white\/opacity-subtle:is(.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.dark\:to-white\/10:is(.dark *){--tw-gradient-to:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:to-white\/10:is(.dark *){--tw-gradient-to:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:to-white\/10:is(.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.dark\:text-accent-green:is(.dark *){color:var(--color-accent-green)}.dark\:text-accent-red:is(.dark *),.dark\:text-accent-red\/opacity-heavy:is(.dark *){color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.dark\:text-accent-red\/opacity-heavy:is(.dark *){color:color-mix(in oklab, var(--color-accent-red) 50%, transparent)}}.dark\:text-content:is(.dark *){color:var(--color-text)}.dark\:text-content-muted:is(.dark *),.dark\:text-content-muted\/opacity-heavy:is(.dark *){color:var(--color-text-muted)}@supports (color:color-mix(in lab, red, red)){.dark\:text-content-muted\/opacity-heavy:is(.dark *){color:color-mix(in oklab, var(--color-text-muted) 50%, transparent)}}.dark\:text-content-primary:is(.dark *),.dark\:text-content-primary\/opacity-heavy:is(.dark *){color:var(--color-text-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:text-content-primary\/opacity-heavy:is(.dark *){color:color-mix(in oklab, var(--color-text-primary) 50%, transparent)}}.dark\:text-primary:is(.dark *),.dark\:text-primary\/opacity-heavy:is(.dark *){color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:text-primary\/opacity-heavy:is(.dark *){color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.dark\:text-white:is(.dark *){color:var(--color-white)}.dark\:text-white\/60:is(.dark *){color:#fff9}@supports (color:color-mix(in lab, red, red)){.dark\:text-white\/60:is(.dark *){color:color-mix(in oklab, var(--color-white) 60%, transparent)}}.dark\:placeholder-content-muted:is(.dark *)::placeholder{color:var(--color-text-muted)}.dark\:mix-blend-screen:is(.dark *){mix-blend-mode:screen}.dark\:shadow-none:is(.dark *){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.dark\:ring-primary\/opacity-heavy:is(.dark *){--tw-ring-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:ring-primary\/opacity-heavy:is(.dark *){--tw-ring-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.dark\:brightness-100:is(.dark *){--tw-brightness:brightness(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.dark\:drop-shadow-\[0_0_6px_color-mix\(in_srgb\,var\(--color-primary\)_80\%\,transparent\)\]:is(.dark *){--tw-drop-shadow-size:drop-shadow(0 0 6px var(--tw-drop-shadow-color,var(--color-primary)))}@supports (color:color-mix(in lab, red, red)){.dark\:drop-shadow-\[0_0_6px_color-mix\(in_srgb\,var\(--color-primary\)_80\%\,transparent\)\]:is(.dark *){--tw-drop-shadow-size:drop-shadow(0 0 6px var(--tw-drop-shadow-color,color-mix(in srgb,var(--color-primary) 80%,transparent)))}}.dark\:drop-shadow-\[0_0_6px_color-mix\(in_srgb\,var\(--color-primary\)_80\%\,transparent\)\]:is(.dark *){--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.dark\:invert-0:is(.dark *){--tw-invert:invert(0%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}@media (hover:hover){.dark\:group-hover\:border-stroke\/opacity-heavy:is(.dark *):is(:where(.group):hover *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:group-hover\:border-stroke\/opacity-heavy:is(.dark *):is(:where(.group):hover *){border-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}}.dark\:odd\:bg-white\/\[0\.02\]:is(.dark *):nth-child(odd){background-color:#ffffff05}@supports (color:color-mix(in lab, red, red)){.dark\:odd\:bg-white\/\[0\.02\]:is(.dark *):nth-child(odd){background-color:color-mix(in oklab, var(--color-white) 2%, transparent)}}@media (hover:hover){.dark\:hover\:border-accent-amber\/opacity-medium:is(.dark *):hover{border-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-accent-amber\/opacity-medium:is(.dark *):hover{border-color:color-mix(in oklab, var(--color-accent-amber) 25%, transparent)}}.dark\:hover\:border-accent-cyan\/opacity-heavy:is(.dark *):hover{border-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-accent-cyan\/opacity-heavy:is(.dark *):hover{border-color:color-mix(in oklab, var(--color-accent-cyan) 50%, transparent)}}.dark\:hover\:border-indigo-500\/50:is(.dark *):hover{border-color:#625fff80}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-indigo-500\/50:is(.dark *):hover{border-color:color-mix(in oklab, var(--color-indigo-500) 50%, transparent)}}.dark\:hover\:border-primary:is(.dark *):hover,.dark\:hover\:border-primary\/opacity-heavy:is(.dark *):hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-primary\/opacity-heavy:is(.dark *):hover{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.dark\:hover\:border-primary\/opacity-medium:is(.dark *):hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-primary\/opacity-medium:is(.dark *):hover{border-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.dark\:hover\:border-secondary\/opacity-heavy:is(.dark *):hover{border-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-secondary\/opacity-heavy:is(.dark *):hover{border-color:color-mix(in oklab, var(--color-secondary) 50%, transparent)}}.dark\:hover\:border-stroke:is(.dark *):hover,.dark\:hover\:border-stroke\/opacity-medium:is(.dark *):hover{border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-stroke\/opacity-medium:is(.dark *):hover{border-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}.dark\:hover\:border-white\/15:is(.dark *):hover{border-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-white\/15:is(.dark *):hover{border-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.dark\:hover\:bg-accent-red\/opacity-medium:is(.dark *):hover{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-accent-red\/opacity-medium:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.dark\:hover\:bg-background\/20:is(.dark *):hover{background-color:var(--color-background)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-background\/20:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-background) 20%, transparent)}}.dark\:hover\:bg-background\/30:is(.dark *):hover{background-color:var(--color-background)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-background\/30:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-background) 30%, transparent)}}.dark\:hover\:bg-indigo-500\/20:is(.dark *):hover{background-color:#625fff33}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-indigo-500\/20:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-indigo-500) 20%, transparent)}}.dark\:hover\:bg-primary\/opacity-medium:is(.dark *):hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-primary\/opacity-medium:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.dark\:hover\:bg-stroke\/opacity-medium:is(.dark *):hover{background-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-stroke\/opacity-medium:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}.dark\:hover\:bg-stroke\/opacity-subtle:is(.dark *):hover{background-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-stroke\/opacity-subtle:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-border) 5%, transparent)}}.dark\:hover\:bg-surface\/opacity-heavy:is(.dark *):hover{background-color:var(--color-surface)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-surface\/opacity-heavy:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-surface) 50%, transparent)}}.dark\:hover\:bg-white\/\[0\.04\]:is(.dark *):hover{background-color:#ffffff0a}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-white\/\[0\.04\]:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-white) 4%, transparent)}}.dark\:hover\:bg-white\/opacity-light:is(.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-white\/opacity-light:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:hover\:bg-white\/opacity-medium:is(.dark *):hover{background-color:#ffffff40}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-white\/opacity-medium:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-white) 25%, transparent)}}.dark\:hover\:from-white\/10:is(.dark *):hover{--tw-gradient-from:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:from-white\/10:is(.dark *):hover{--tw-gradient-from:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:hover\:from-white\/10:is(.dark *):hover{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.dark\:hover\:to-white\/15:is(.dark *):hover{--tw-gradient-to:#ffffff26}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:to-white\/15:is(.dark *):hover{--tw-gradient-to:color-mix(in oklab, var(--color-white) 15%, transparent)}}.dark\:hover\:to-white\/15:is(.dark *):hover{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.dark\:hover\:text-accent-red:is(.dark *):hover{color:var(--color-accent-red)}.dark\:hover\:text-content-muted:is(.dark *):hover{color:var(--color-text-muted)}.dark\:hover\:text-content-primary:is(.dark *):hover,.dark\:hover\:text-content-primary\/opacity-heavy:is(.dark *):hover{color:var(--color-text-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:text-content-primary\/opacity-heavy:is(.dark *):hover{color:color-mix(in oklab, var(--color-text-primary) 50%, transparent)}}.dark\:hover\:text-content-secondary:is(.dark *):hover{color:var(--color-text-secondary)}.dark\:hover\:text-white:is(.dark *):hover{color:var(--color-white)}}@media (width>=40rem){.dark\:sm\:border-stroke\/opacity-medium:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:sm\:border-stroke\/opacity-medium:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}}@media (width>=64rem){.lg\:dark\:block:is(.dark *){display:block}}:root{--openhop-blue:#3b82f6;--openhop-blue-light:#60a5fa;--openhop-purple:#8b5cf6;--openhop-purple-light:#a855f7;--openhop-gradient:linear-gradient(135deg, var(--openhop-blue) 0%, var(--openhop-purple) 100%);--color-surface:#fff;--color-surface-elevated:#f8fbff;--color-background:#f6f8ff;--color-background-soft:#eef3ff;--color-background-mute:#e4eafb;--color-heading:#020617;--color-text-primary:#0f172a;--color-text-secondary:#334155;--color-text-muted:#64748b;--color-text:var(--color-text-secondary);--color-border:#cbd5e1;--color-border-subtle:#e2e8f0;--color-border-hover:#94a3b8;--color-primary:var(--openhop-blue);--color-secondary:var(--openhop-purple);--color-accent-cyan:#38bdf8;--color-accent-green:#22c55e;--color-accent-green-light:#86efac;--color-accent-orange:#c2410c;--color-accent-amber:#f59e0b;--color-accent-purple:var(--openhop-purple);--color-accent-red:#ef4444;--color-primary-bg:#dbeafe;--color-secondary-bg:#ede9fe;--color-accent-cyan-bg:#e0f2fe;--color-accent-green-bg:#dcfce7;--color-accent-purple-bg:#ede9fe;--color-accent-red-bg:#fee2e2;--color-badge-cyan-bg:#dbeafe;--color-badge-cyan-text:#2563eb;--color-badge-neutral-bg:#f1f5f9;--color-badge-neutral-text:#334155;--color-glass-bg:#ffffffb8;--color-glass-border:#3b82f614;--color-glass-shadow:0 8px 32px #3b82f60f, 0 2px 8px #00000008;--color-glass-green-bg:linear-gradient(135deg, #22c55e1f, #22c55e0a);--color-glass-green-border:#22c55e2e;--color-glass-orange-bg:linear-gradient(135deg, #fb923c1f, #fb923c0a);--color-glass-orange-border:#fb923c2e;--section-gap:160px;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--nav-hover-label-shadow:0 0 8px #3b82f640;--nav-hover-icon-shadow:drop-shadow(0 0 4px #3b82f659)}.dark{--openhop-blue:#60a5fa;--openhop-purple:#a855f7;--openhop-gradient:linear-gradient(135deg, var(--openhop-blue) 0%, var(--openhop-purple) 100%);--color-background:#05070d;--color-background-soft:#05070d;--color-background-mute:#0d121f;--color-surface:#05070d;--color-surface-elevated:#0d121f;--color-heading:#fff;--color-text-primary:#f8fafc;--color-text-secondary:#cbd5e1;--color-text-muted:#94a3b8;--color-text:var(--color-text-secondary);--color-border:#374151;--color-border-subtle:#1f2937;--color-border-hover:#4b5563;--color-primary:var(--openhop-blue);--color-secondary:var(--openhop-purple);--color-accent-cyan:#38bdf8;--color-accent-green:#4ade80;--color-accent-green-light:#bbf7d0;--color-accent-orange:#ea580c;--color-accent-amber:#fbbf24;--color-accent-purple:#c084fc;--color-accent-red:#f87171;--color-primary-bg:#1e3a8a;--color-secondary-bg:#581c87;--color-accent-cyan-bg:#164e63;--color-accent-green-bg:#14532d;--color-accent-purple-bg:#581c87;--color-accent-red-bg:#7f1d1d;--color-badge-cyan-bg:#3b82f626;--color-badge-cyan-text:#93c5fd;--color-badge-neutral-bg:#1f2937;--color-badge-neutral-text:#cbd5e1;--color-glass-bg:#111827b8;--color-glass-border:#60a5fa14;--color-glass-shadow:0 12px 40px #00000059;--color-glass-green-bg:linear-gradient(135deg, #22c55e26, #22c55e0d);--color-glass-green-border:#22c55e26;--color-glass-orange-bg:linear-gradient(135deg, #fb923c26, #fb923c0d);--color-glass-orange-border:#fb923c26;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--nav-hover-label-shadow:0 0 4px var(--color-surface), 0 0 10px var(--openhop-blue), 0 0 20px var(--openhop-purple);--nav-hover-icon-shadow:drop-shadow(0 0 5px var(--openhop-blue))}html,body,#app,.dark html,.dark body,.dark #app{background-color:var(--color-background);color:var(--color-text)}body{text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;min-height:100vh;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-size:15px;line-height:1.6;transition:color .5s,background-color .5s}h1,h2,h3,h4,h5,h6{font-family:Michroma,sans-serif;font-weight:700}:root{--app-safe-area-top:0px;--app-safe-area-right:0px;--app-safe-area-bottom:0px;--app-safe-area-left:0px}html{-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}html,body,#app{width:100%;max-width:100%;min-height:100dvh}html,body{overflow-x:hidden}html.is-mobile-app{--app-safe-area-top:env(safe-area-inset-top,0px);--app-safe-area-right:env(safe-area-inset-right,0px);--app-safe-area-bottom:env(safe-area-inset-bottom,0px);--app-safe-area-left:env(safe-area-inset-left,0px)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}.glass-card[data-v-7aba76c4]{background:color-mix(in srgb, var(--color-surface-elevated) 70%, transparent);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);border:1px solid var(--color-glass-border)}@keyframes ping-7aba76c4{75%,to{opacity:0;transform:scale(2)}}@keyframes ping-fast-7aba76c4{0%{opacity:1;transform:scale(1)}75%,to{opacity:0;transform:scale(4)}}.animate-ping[data-v-7aba76c4]{animation:cubic-bezier(0,0,.2,1) infinite ping-7aba76c4}.animate-ping-fast[data-v-7aba76c4]{animation:.8s cubic-bezier(0,0,.2,1) 3 ping-fast-7aba76c4}.nav-expand-enter-active[data-v-c3bfa5d2],.nav-expand-leave-active[data-v-c3bfa5d2]{transform-origin:top;transition:opacity .15s,transform .15s}.nav-expand-enter-from[data-v-c3bfa5d2],.nav-expand-leave-to[data-v-c3bfa5d2]{opacity:0;transform:scaleY(.95)translateY(-4px)}.nav-children>div[data-v-c3bfa5d2]{position:relative}.nav-children>div[data-v-c3bfa5d2]:before{content:"";background:var(--color-border-subtle);width:1px;position:absolute;top:0;bottom:0;left:0}.nav-root-children>div[data-v-c3bfa5d2]:first-child:before{top:-10px}.nav-nested-children>div[data-v-c3bfa5d2]:first-child:before{top:-8px}.nav-children>div[data-v-c3bfa5d2]:last-child:before{bottom:calc(100% - 16px)}.nav-children>.nav-item-active[data-v-c3bfa5d2]:after,.nav-children>.nav-has-active[data-v-c3bfa5d2]:after{content:"";background:var(--color-primary);width:1px;position:absolute;top:0;bottom:calc(100% - 16px);left:0}.nav-children>.nav-precedes-active[data-v-c3bfa5d2]:after{content:"";background:var(--color-primary);width:1px;position:absolute;top:0;bottom:0;left:0}.nav-nested-children>div:first-child.nav-item-active[data-v-c3bfa5d2]:after,.nav-nested-children>div:first-child.nav-has-active[data-v-c3bfa5d2]:after,.nav-nested-children>div:first-child.nav-precedes-active[data-v-c3bfa5d2]:after{top:-8px}.nav-root-children>div:first-child.nav-item-active[data-v-c3bfa5d2]:after,.nav-root-children>div:first-child.nav-has-active[data-v-c3bfa5d2]:after,.nav-root-children>div:first-child.nav-precedes-active[data-v-c3bfa5d2]:after{top:-10px}button:hover .nav-label[data-v-c3bfa5d2]{text-shadow:var(--nav-hover-label-shadow)}button:hover svg[data-v-c3bfa5d2]{filter:var(--nav-hover-icon-shadow)}.nav-tick[data-v-c3bfa5d2]{pointer-events:none;background:var(--color-border-subtle);width:4px;height:1px;position:absolute;top:16px;left:0}.nav-item-active>.nav-tick[data-v-c3bfa5d2],.nav-has-active>.nav-tick[data-v-c3bfa5d2]{background:var(--color-primary)}.backdrop-enter-active[data-v-cf2b6b93],.backdrop-leave-active[data-v-cf2b6b93]{transition:opacity .3s}.backdrop-enter-from[data-v-cf2b6b93],.backdrop-leave-to[data-v-cf2b6b93]{opacity:0}.user-menu-item:hover span[data-v-79281e9e]{text-shadow:var(--nav-hover-label-shadow)}.user-menu-item:hover svg[data-v-79281e9e]{filter:var(--nav-hover-icon-shadow)}body{background-color:var(--color-background);color:var(--color-text);margin:0;padding:0;transition:background-color .3s,color .3s}.dark body{background-color:var(--color-background);color:var(--color-text)}.dark html{scrollbar-width:thin;scrollbar-color:var(--color-border-hover) var(--color-background-mute)}.dark html::-webkit-scrollbar{width:8px}.dark html::-webkit-scrollbar-track{background:var(--color-background-mute)}.dark html::-webkit-scrollbar-thumb{background-color:var(--color-border-hover);border-radius:4px}.dark html::-webkit-scrollbar-thumb:hover{background-color:var(--color-text-muted)}html{scrollbar-width:thin;scrollbar-color:var(--color-border) var(--color-background-soft)}html::-webkit-scrollbar{width:8px}html::-webkit-scrollbar-track{background:var(--color-background-soft)}html::-webkit-scrollbar-thumb{background-color:var(--color-border);border-radius:4px}html::-webkit-scrollbar-thumb:hover{background-color:var(--color-border-hover)}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.scrollbar-hide::-webkit-scrollbar{display:none} diff --git a/repeater/web/html/assets/index-CCly9bPx.css b/repeater/web/html/assets/index-CCly9bPx.css new file mode 100644 index 0000000..f07538b --- /dev/null +++ b/repeater/web/html/assets/index-CCly9bPx.css @@ -0,0 +1 @@ +@import "https://fonts.googleapis.com/css2?family=Michroma:wght@400;700&family=Inter:wght@300;400;500;600;700;800&display=swap";@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-100:oklch(93.6% .032 17.717);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-800:oklch(47.3% .137 46.201);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-slate-500:oklch(55.4% .046 257.417);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-500:oklch(55.1% .027 264.364);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--blur-md:12px;--blur-lg:16px;--blur-xl:24px;--blur-3xl:64px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:Inter,-apple-system,Roboto,Helvetica,sans-serif;line-height:1.5}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.glass-card{--tw-backdrop-blur:blur(50px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);background:var(--color-surface);border-radius:10px}@supports (color:color-mix(in lab, red, red)){.glass-card{background:color-mix(in srgb, var(--color-surface) 75%, transparent)}}.glass-card{border:1px solid var(--color-border-subtle);box-shadow:0 4px 12px var(--color-background)}@supports (color:color-mix(in lab, red, red)){.glass-card{box-shadow:0 4px 12px color-mix(in srgb, var(--color-background) 25%, transparent)}}.dark .glass-card{background:var(--color-surface-elevated);border:1px solid var(--color-border-subtle);box-shadow:0 4px 12px var(--color-background)}@supports (color:color-mix(in lab, red, red)){.dark .glass-card{box-shadow:0 4px 12px color-mix(in srgb, var(--color-background) 45%, transparent)}}.glass-card-green{--tw-backdrop-blur:blur(50px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);background:var(--color-glass-green-bg);border:1px solid var(--color-glass-green-border);box-shadow:var(--color-glass-green-shadow);border-radius:10px}.glass-card-orange{--tw-backdrop-blur:blur(50px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);background:var(--color-glass-orange-bg);border:1px solid var(--color-glass-orange-border);box-shadow:var(--color-glass-orange-shadow);border-radius:10px}.bg-mode-segment-forward{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-mode-segment-forward{background-color:color-mix(in srgb, var(--color-primary) 35%, transparent)}}.bg-mode-segment-no-tx{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.bg-mode-segment-no-tx{background-color:color-mix(in srgb, var(--color-accent-red) 35%, transparent)}}.cfg-page-heading{padding-bottom:calc(var(--spacing) * 2)}.cfg-section{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);padding:calc(var(--spacing) * 8);background-color:#0000}.cfg-section:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.cfg-section:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.cfg-section:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.cfg-section:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.cfg-card{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:#0000}.cfg-card:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.cfg-card:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.cfg-card:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.cfg-card:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.cfg-btn-primary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.cfg-btn-primary{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.cfg-btn-primary{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.cfg-btn-primary{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.cfg-btn-primary{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-text-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.cfg-btn-primary:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.cfg-btn-primary:hover{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}}.cfg-btn-primary:disabled{cursor:not-allowed;opacity:.5}.cfg-btn-primary:is(.dark *){color:var(--color-text-primary)}.cfg-btn-secondary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-text-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.cfg-btn-secondary:hover{background-color:var(--color-border-subtle)}}.cfg-btn-secondary:disabled{cursor:not-allowed;opacity:.5}.cfg-btn-secondary:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.cfg-btn-secondary:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}.cfg-btn-secondary:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.cfg-btn-secondary:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.cfg-btn-secondary:is(.dark *){color:var(--color-text-primary)}@media (hover:hover){.cfg-btn-secondary:is(.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.cfg-btn-secondary:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}}.logo-image{filter:brightness(.7)contrast(1.3)saturate(1.2);transition:filter .3s}.dark .logo-image{filter:brightness(1.1)contrast(1.05)saturate()}.topbar-icon-btn{background-color:var(--color-background-mute);width:35px;height:35px;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-radius:.25rem;justify-content:center;align-items:center;display:flex}@media (hover:hover){.topbar-icon-btn:hover{background-color:var(--color-border-subtle)}}.topbar-icon-btn:is(.dark *){background-color:var(--color-surface-elevated)}@media (hover:hover){.topbar-icon-btn:is(.dark *):hover{background-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.topbar-icon-btn:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}}.btn-primary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.btn-primary{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.btn-primary{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.btn-primary{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.btn-primary{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn-primary:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.btn-primary:hover{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}}.btn-primary:disabled{cursor:not-allowed;opacity:.5}.btn-danger{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.btn-danger{border-color:color-mix(in oklab, var(--color-accent-red) 50%, transparent)}}.btn-danger{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.btn-danger{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.btn-danger{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-accent-red);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn-danger:hover{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.btn-danger:hover{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}}.btn-danger:disabled{cursor:not-allowed;opacity:.5}.btn-success{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.btn-success{border-color:color-mix(in oklab, var(--color-accent-green) 50%, transparent)}}.btn-success{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.btn-success{background-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}.btn-success{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-accent-green);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn-success:hover{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.btn-success:hover{background-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}}.btn-success:disabled{cursor:not-allowed;opacity:.5}.btn-secondary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-text-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn-secondary:hover{background-color:var(--color-border-subtle)}}.btn-secondary:disabled{cursor:not-allowed;opacity:.5}.btn-secondary:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.btn-secondary:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}.btn-secondary:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.btn-secondary:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.btn-secondary:is(.dark *){color:var(--color-text-primary)}@media (hover:hover){.btn-secondary:is(.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.btn-secondary:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}}.btn-primary-xs{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-primary);border-radius:.25rem}@supports (color:color-mix(in lab, red, red)){.btn-primary-xs{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.btn-primary-xs{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.btn-primary-xs{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.btn-primary-xs{padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn-primary-xs:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.btn-primary-xs:hover{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}}.btn-primary-xs:disabled{cursor:not-allowed;opacity:.5}.btn-danger-xs{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-red);border-radius:.25rem}@supports (color:color-mix(in lab, red, red)){.btn-danger-xs{border-color:color-mix(in oklab, var(--color-accent-red) 50%, transparent)}}.btn-danger-xs{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.btn-danger-xs{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.btn-danger-xs{padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-accent-red);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn-danger-xs:hover{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.btn-danger-xs:hover{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}}.btn-danger-xs:disabled{cursor:not-allowed;opacity:.5}.btn-success-xs{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-green);border-radius:.25rem}@supports (color:color-mix(in lab, red, red)){.btn-success-xs{border-color:color-mix(in oklab, var(--color-accent-green) 50%, transparent)}}.btn-success-xs{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.btn-success-xs{background-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}.btn-success-xs{padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-accent-green);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn-success-xs:hover{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.btn-success-xs:hover{background-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}}.btn-success-xs:disabled{cursor:not-allowed;opacity:.5}.btn-secondary-xs{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 1.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-text-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn-secondary-xs:hover{background-color:var(--color-border-subtle)}}.btn-secondary-xs:disabled{cursor:not-allowed;opacity:.5}.btn-secondary-xs:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.btn-secondary-xs:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}.btn-secondary-xs:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.btn-secondary-xs:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}@media (hover:hover){.btn-secondary-xs:is(.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.btn-secondary-xs:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}}.cfg-input{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);width:100%;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-text-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.cfg-input:focus{border-color:var(--color-primary);--tw-outline-style:none;outline-style:none}.cfg-input:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.cfg-input:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.cfg-input:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.cfg-input:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.cfg-input:is(.dark *){color:var(--color-text-primary)}.cfg-select{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);width:100%;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-text-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.cfg-select:focus{border-color:var(--color-primary);--tw-outline-style:none;outline-style:none}.cfg-select:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.cfg-select:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.cfg-select:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.cfg-select:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.cfg-select:is(.dark *){color:var(--color-text-primary)}.dark .cfg-select,.dark .modal-select{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}.dark .cfg-select option,.dark .modal-select option{background-color:var(--color-surface-elevated);color:var(--color-text-primary)}.modal-backdrop{inset:calc(var(--spacing) * 0);z-index:300;background-color:#00000080;justify-content:center;align-items:center;display:flex;position:fixed}@supports (color:color-mix(in lab, red, red)){.modal-backdrop{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.modal-backdrop{padding:calc(var(--spacing) * 4);--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.modal-backdrop-heavy{inset:calc(var(--spacing) * 0);z-index:300;background-color:#00000080;justify-content:center;align-items:center;display:flex;position:fixed}@supports (color:color-mix(in lab, red, red)){.modal-backdrop-heavy{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.modal-backdrop-heavy{padding:calc(var(--spacing) * 4);--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.modal-card{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-white);width:100%;padding:calc(var(--spacing) * 6);--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);border-radius:20px}.modal-card:is(.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.modal-card:is(.dark *){border-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.modal-card:is(.dark *){background-color:var(--color-surface-elevated)}.modal-card-glass{border-style:var(--tw-border-style);border-width:1px;border-color:#ffffff40;border-radius:20px;width:100%}@supports (color:color-mix(in lab, red, red)){.modal-card-glass{border-color:color-mix(in oklab, var(--color-white) 25%, transparent)}}.modal-card-glass{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);background:var(--color-glass-bg);box-shadow:var(--color-glass-shadow)}.modal-form{gap:calc(var(--spacing) * 4);flex-direction:column;display:flex}.modal-field-label{margin-top:calc(var(--spacing) * 2);margin-bottom:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-text-secondary);display:block}.modal-field-label:is(.dark *){color:var(--color-text-muted)}.modal-field-label-row{margin-top:calc(var(--spacing) * 2);margin-bottom:calc(var(--spacing) * 1);align-items:baseline;gap:calc(var(--spacing) * 3);display:flex}.modal-input{border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);width:100%;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-text-primary)}.modal-input::placeholder{color:var(--color-text-muted)}.modal-input{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.modal-input:focus{border-color:var(--color-primary);--tw-outline-style:none;outline-style:none}.modal-input:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.modal-input:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.modal-input:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.modal-input:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.modal-input:is(.dark *){color:var(--color-text-primary)}.modal-input:is(.dark *)::placeholder{color:var(--color-text-muted)}@supports (color:color-mix(in lab, red, red)){.modal-input:is(.dark *)::placeholder{color:color-mix(in oklab, var(--color-text-muted) 50%, transparent)}}.modal-select{border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);width:100%;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-text-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.modal-select:focus{border-color:var(--color-primary);--tw-outline-style:none;outline-style:none}.modal-select:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.modal-select:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.modal-select:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.modal-select:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.modal-select:is(.dark *){color:var(--color-text-primary)}.label-swap-enter-active,.label-swap-leave-active{transition:opacity .15s}.label-swap-enter-from,.label-swap-leave-to{opacity:0}.code-block{background-color:var(--color-background-mute);padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-family:var(--font-mono);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-text-primary);border-radius:.25rem;display:block;overflow-x:auto}.code-block:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.code-block:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.code-block:is(.dark *){color:var(--color-text-primary)}.modal-input-readonly{cursor:default;border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);width:100%;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-family:var(--font-mono);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-text-primary)}.modal-input-readonly:focus{border-color:var(--color-border-subtle);--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);--tw-outline-style:none;outline-style:none}.modal-input-readonly:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.modal-input-readonly:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.modal-input-readonly:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.modal-input-readonly:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.modal-input-readonly:is(.dark *){color:var(--color-text-primary)}.modal-input-readonly:is(.dark *):focus{border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.modal-input-readonly:is(.dark *):focus{border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.modal-actions{gap:calc(var(--spacing) * 3);padding-top:calc(var(--spacing) * 2);display:flex}.modal-btn-cancel{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-subtle);background-color:var(--color-background-mute);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);color:var(--color-text-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));flex:1}@media (hover:hover){.modal-btn-cancel:hover{background-color:var(--color-border-subtle)}}.modal-btn-cancel:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.modal-btn-cancel:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}.modal-btn-cancel:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.modal-btn-cancel:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.modal-btn-cancel:is(.dark *){color:var(--color-text-primary)}@media (hover:hover){.modal-btn-cancel:is(.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.modal-btn-cancel:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}}.modal-btn-primary{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-primary);flex:1}@supports (color:color-mix(in lab, red, red)){.modal-btn-primary{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.modal-btn-primary{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.modal-btn-primary{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.modal-btn-primary{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-primary);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.modal-btn-primary:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.modal-btn-primary:hover{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}}.modal-btn-danger{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-red);flex:1}@supports (color:color-mix(in lab, red, red)){.modal-btn-danger{border-color:color-mix(in oklab, var(--color-accent-red) 50%, transparent)}}.modal-btn-danger{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.modal-btn-danger{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.modal-btn-danger{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-accent-red);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.modal-btn-danger:hover{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.modal-btn-danger:hover{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}}.cfg-btn-danger{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.cfg-btn-danger{border-color:color-mix(in oklab, var(--color-accent-red) 50%, transparent)}}.cfg-btn-danger{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.cfg-btn-danger{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.cfg-btn-danger{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-accent-red);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.cfg-btn-danger:hover{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.cfg-btn-danger:hover{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}}.cfg-btn-danger:disabled{cursor:not-allowed;opacity:.5}.alert-info{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.alert-info{border-color:color-mix(in oklab, var(--color-accent-cyan) 25%, transparent)}}.alert-info{background-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.alert-info{background-color:color-mix(in oklab, var(--color-accent-cyan) 10%, transparent)}}.alert-info{padding:calc(var(--spacing) * 3);color:var(--color-accent-cyan)}.alert-success{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.alert-success{border-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}.alert-success{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.alert-success{background-color:color-mix(in oklab, var(--color-accent-green) 10%, transparent)}}.alert-success{padding:calc(var(--spacing) * 3);color:var(--color-accent-green)}.alert-warning{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.alert-warning{border-color:color-mix(in oklab, var(--color-accent-amber) 25%, transparent)}}.alert-warning{background-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.alert-warning{background-color:color-mix(in oklab, var(--color-accent-amber) 10%, transparent)}}.alert-warning{padding:calc(var(--spacing) * 3);color:var(--color-accent-amber)}.alert-error{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.alert-error{border-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.alert-error{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.alert-error{background-color:color-mix(in oklab, var(--color-accent-red) 10%, transparent)}}.alert-error{padding:calc(var(--spacing) * 3);color:var(--color-accent-red)}.status-badge{align-items:center;gap:calc(var(--spacing) * 1.5);padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);border-radius:3.40282e38px;display:inline-flex}.status-badge-green{align-items:center;gap:calc(var(--spacing) * 1.5);background-color:var(--color-accent-green);border-radius:3.40282e38px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.status-badge-green{background-color:color-mix(in oklab, var(--color-accent-green) 10%, transparent)}}.status-badge-green{padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-accent-green)}.status-badge-amber{align-items:center;gap:calc(var(--spacing) * 1.5);background-color:var(--color-accent-amber);border-radius:3.40282e38px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.status-badge-amber{background-color:color-mix(in oklab, var(--color-accent-amber) 10%, transparent)}}.status-badge-amber{padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-accent-amber)}.status-badge-red{align-items:center;gap:calc(var(--spacing) * 1.5);background-color:var(--color-accent-red);border-radius:3.40282e38px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.status-badge-red{background-color:color-mix(in oklab, var(--color-accent-red) 10%, transparent)}}.status-badge-red{padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-accent-red)}.status-badge-muted{align-items:center;gap:calc(var(--spacing) * 1.5);background-color:var(--color-background-mute);padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-text-muted);border-radius:3.40282e38px;display:inline-flex}.status-dot-green{background-color:var(--color-accent-green)}.status-dot-amber{background-color:var(--color-accent-amber)}.status-dot-red{background-color:var(--color-accent-red)}.status-dot-cyan{background-color:var(--color-accent-cyan)}.status-dot-secondary{background-color:var(--color-secondary)}.status-dot-muted{background-color:var(--color-border)}.text-on-dark{color:#ffffffde}.text-on-dark-secondary{color:#fff9}.text-on-dark-muted{color:#fff6}.text-on-dark-subtle{color:#ffffff4d}}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.-top-1{top:calc(var(--spacing) * -1)}.-top-\[79px\]{top:-79px}.-top-\[94px\]{top:-94px}.top-0{top:calc(var(--spacing) * 0)}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-3{top:calc(var(--spacing) * 3)}.top-4{top:calc(var(--spacing) * 4)}.top-\[-6px\]{top:-6px}.top-\[373px\]{top:373px}.top-\[calc\(50\%\+18px\)\]{top:calc(50% + 18px)}.top-full{top:100%}.-right-1{right:calc(var(--spacing) * -1)}.-right-6{right:calc(var(--spacing) * -6)}.right-0{right:calc(var(--spacing) * 0)}.right-1{right:calc(var(--spacing) * 1)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-4{right:calc(var(--spacing) * 4)}.right-5{right:calc(var(--spacing) * 5)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-4{bottom:calc(var(--spacing) * 4)}.bottom-5{bottom:calc(var(--spacing) * 5)}.bottom-\[-6px\]{bottom:-6px}.bottom-\[calc\(50\%\+18px\)\]{bottom:calc(50% + 18px)}.-left-\[92px\]{left:-92px}.left-0{left:calc(var(--spacing) * 0)}.left-0\.5{left:calc(var(--spacing) * .5)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-3{left:calc(var(--spacing) * 3)}.left-\[246px\]{left:246px}.left-\[575px\]{left:575px}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-200{z-index:200}.z-\[100\]{z-index:100}.z-\[150\]{z-index:150}.z-\[200\]{z-index:200}.z-\[249\]{z-index:249}.z-\[250\]{z-index:250}.z-\[300\]{z-index:300}.z-\[350\]{z-index:350}.z-\[350\]\!{z-index:350!important}.z-\[400\]{z-index:400}.z-\[400\]\!{z-index:400!important}.z-\[450\]{z-index:450}.z-\[500\]{z-index:500}.z-\[500\]\!{z-index:500!important}.z-\[9999\]{z-index:9999}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-4{grid-column:span 4/span 4}.col-span-11{grid-column:span 11/span 11}.col-start-1{grid-column-start:1}.row-start-1{grid-row-start:1}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing) * 1)}.my-8{margin-block:calc(var(--spacing) * 8)}.mt-0{margin-top:calc(var(--spacing) * 0)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mr-6{margin-right:calc(var(--spacing) * 6)}.mb-0{margin-bottom:calc(var(--spacing) * 0)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-7{margin-bottom:calc(var(--spacing) * 7)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-0{margin-left:calc(var(--spacing) * 0)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-6{margin-left:calc(var(--spacing) * 6)}.ml-7{margin-left:calc(var(--spacing) * 7)}.ml-8{margin-left:calc(var(--spacing) * 8)}.ml-12{margin-left:calc(var(--spacing) * 12)}.ml-16{margin-left:calc(var(--spacing) * 16)}.ml-20{margin-left:calc(var(--spacing) * 20)}.ml-24{margin-left:calc(var(--spacing) * 24)}.ml-28{margin-left:calc(var(--spacing) * 28)}.ml-32{margin-left:calc(var(--spacing) * 32)}.ml-\[15px\]{margin-left:15px}.ml-\[23px\]{margin-left:23px}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.table{display:table}.h-0{height:calc(var(--spacing) * 0)}.h-1{height:calc(var(--spacing) * 1)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-40{height:calc(var(--spacing) * 40)}.h-48{height:calc(var(--spacing) * 48)}.h-52{height:calc(var(--spacing) * 52)}.h-96{height:calc(var(--spacing) * 96)}.h-\[17rem\]{height:17rem}.h-\[18px\]{height:18px}.h-\[35px\]{height:35px}.h-\[52px\]{height:52px}.h-\[85vh\]{height:85vh}.h-\[100dvh\]{height:100dvh}.h-\[130px\]{height:130px}.h-\[154px\]{height:154px}.h-\[178px\]{height:178px}.h-\[512px\]{height:512px}.h-full{height:100%}.h-screen{height:100vh}.max-h-0{max-height:calc(var(--spacing) * 0)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-44{max-height:calc(var(--spacing) * 44)}.max-h-52{max-height:calc(var(--spacing) * 52)}.max-h-56{max-height:calc(var(--spacing) * 56)}.max-h-\[26rem\]{max-height:26rem}.max-h-\[60vh\]{max-height:60vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[75vh\]{max-height:75vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[95vh\]{max-height:95vh}.max-h-\[360px\]{max-height:360px}.max-h-\[440px\]{max-height:440px}.max-h-\[calc\(100vh-4rem\)\]{max-height:calc(100vh - 4rem)}.max-h-screen{max-height:100vh}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-\[8rem\]{min-height:8rem}.min-h-\[12rem\]{min-height:12rem}.min-h-\[72px\]{min-height:72px}.min-h-\[118px\]{min-height:118px}.min-h-\[220px\]{min-height:220px}.min-h-\[400px\]{min-height:400px}.min-h-screen{min-height:100vh}.w-1{width:calc(var(--spacing) * 1)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-\[35px\]{width:35px}.w-\[58px\]{width:58px}.w-\[285px\]{width:285px}.w-\[705px\]{width:705px}.w-auto{width:auto}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-32{max-width:calc(var(--spacing) * 32)}.max-w-\[12rem\]{max-width:12rem}.max-w-\[80px\]{max-width:80px}.max-w-\[140px\]{max-width:140px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-48{min-width:calc(var(--spacing) * 48)}.min-w-\[18px\]{min-width:18px}.min-w-\[64px\]{min-width:64px}.min-w-\[100px\]{min-width:100px}.min-w-\[110px\]{min-width:110px}.min-w-\[120px\]{min-width:120px}.min-w-\[140px\]{min-width:140px}.min-w-\[160px\]{min-width:160px}.min-w-\[170px\]{min-width:170px}.min-w-\[230px\]{min-width:230px}.min-w-\[280px\]{min-width:280px}.min-w-\[540px\]{min-width:540px}.min-w-\[760px\]{min-width:760px}.min-w-\[840px\]{min-width:840px}.min-w-\[980px\]{min-width:980px}.min-w-full{min-width:100%}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-4{--tw-translate-x:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-5{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-3{--tw-translate-y:calc(var(--spacing) * 3);translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-105{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.-rotate-\[24\.22deg\]{rotate:-24.22deg}.rotate-0{rotate:0deg}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-\[42px_1fr\]{grid-template-columns:42px 1fr}.grid-cols-\[150px_minmax\(0\,1fr\)\]{grid-template-columns:150px minmax(0,1fr)}.grid-cols-\[minmax\(110px\,0\.75fr\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(110px,.75fr) minmax(0,1fr)}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-evenly{justify-content:space-evenly}.gap-0{gap:calc(var(--spacing) * 0)}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-12>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 12) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 12) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-5{column-gap:calc(var(--spacing) * 5)}.gap-x-8{column-gap:calc(var(--spacing) * 8)}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 3) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-0{row-gap:calc(var(--spacing) * 0)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-amber-100\/70>:not(:last-child)){border-color:#fef3c6b3}@supports (color:color-mix(in lab, red, red)){:where(.divide-amber-100\/70>:not(:last-child)){border-color:color-mix(in oklab, var(--color-amber-100) 70%, transparent)}}:where(.divide-red-100\/70>:not(:last-child)){border-color:#ffe2e2b3}@supports (color:color-mix(in lab, red, red)){:where(.divide-red-100\/70>:not(:last-child)){border-color:color-mix(in oklab, var(--color-red-100) 70%, transparent)}}:where(.divide-stroke-subtle>:not(:last-child)){border-color:var(--color-border-subtle)}.self-stretch{align-self:stretch}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-\[5px\]{border-radius:5px}.rounded-\[8px\]{border-radius:8px}.rounded-\[10px\]{border-radius:10px}.rounded-\[12px\]{border-radius:12px}.rounded-\[15px\]{border-radius:15px}.rounded-\[16px\]{border-radius:16px}.rounded-\[18px\]{border-radius:18px}.rounded-\[20px\]{border-radius:20px}.rounded-\[24px\]{border-radius:24px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-l-md{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-b-\[15px\]{border-bottom-right-radius:15px;border-bottom-left-radius:15px}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-3{border-style:var(--tw-border-style);border-width:3px}.border-4{border-style:var(--tw-border-style);border-width:4px}.\!border-t-2{border-top-style:var(--tw-border-style)!important;border-top-width:2px!important}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.\!border-primary{border-color:var(--color-primary)!important}.border-accent-amber,.border-accent-amber\/opacity-heavy{border-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.border-accent-amber\/opacity-heavy{border-color:color-mix(in oklab, var(--color-accent-amber) 50%, transparent)}}.border-accent-amber\/opacity-medium{border-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.border-accent-amber\/opacity-medium{border-color:color-mix(in oklab, var(--color-accent-amber) 25%, transparent)}}.border-accent-cyan,.border-accent-cyan\/opacity-heavy{border-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.border-accent-cyan\/opacity-heavy{border-color:color-mix(in oklab, var(--color-accent-cyan) 50%, transparent)}}.border-accent-cyan\/opacity-medium{border-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.border-accent-cyan\/opacity-medium{border-color:color-mix(in oklab, var(--color-accent-cyan) 25%, transparent)}}.border-accent-green,.border-accent-green\/opacity-heavy{border-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.border-accent-green\/opacity-heavy{border-color:color-mix(in oklab, var(--color-accent-green) 50%, transparent)}}.border-accent-green\/opacity-medium{border-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.border-accent-green\/opacity-medium{border-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}.border-accent-orange\/opacity-medium{border-color:var(--color-accent-orange)}@supports (color:color-mix(in lab, red, red)){.border-accent-orange\/opacity-medium{border-color:color-mix(in oklab, var(--color-accent-orange) 25%, transparent)}}.border-accent-purple\/opacity-heavy{border-color:var(--color-accent-purple)}@supports (color:color-mix(in lab, red, red)){.border-accent-purple\/opacity-heavy{border-color:color-mix(in oklab, var(--color-accent-purple) 50%, transparent)}}.border-accent-red,.border-accent-red\/opacity-heavy{border-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.border-accent-red\/opacity-heavy{border-color:color-mix(in oklab, var(--color-accent-red) 50%, transparent)}}.border-accent-red\/opacity-medium{border-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.border-accent-red\/opacity-medium{border-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.border-background-mute{border-color:var(--color-background-mute)}.border-blue-200{border-color:var(--color-blue-200)}.border-current{border-color:currentColor}.border-primary,.border-primary\/opacity-heavy{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/opacity-heavy{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.border-primary\/opacity-medium{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/opacity-medium{border-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.border-secondary,.border-secondary\/opacity-heavy{border-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.border-secondary\/opacity-heavy{border-color:color-mix(in oklab, var(--color-secondary) 50%, transparent)}}.border-secondary\/opacity-medium{border-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.border-secondary\/opacity-medium{border-color:color-mix(in oklab, var(--color-secondary) 25%, transparent)}}.border-slate-500\/20{border-color:#62748e33}@supports (color:color-mix(in lab, red, red)){.border-slate-500\/20{border-color:color-mix(in oklab, var(--color-slate-500) 20%, transparent)}}.border-slate-500\/40{border-color:#62748e66}@supports (color:color-mix(in lab, red, red)){.border-slate-500\/40{border-color:color-mix(in oklab, var(--color-slate-500) 40%, transparent)}}.border-stroke{border-color:var(--color-border)}.border-stroke-subtle,.border-stroke-subtle\/50{border-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.border-stroke-subtle\/50{border-color:color-mix(in oklab, var(--color-border-subtle) 50%, transparent)}}.border-stroke-subtle\/60{border-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.border-stroke-subtle\/60{border-color:color-mix(in oklab, var(--color-border-subtle) 60%, transparent)}}.border-stroke-subtle\/70{border-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.border-stroke-subtle\/70{border-color:color-mix(in oklab, var(--color-border-subtle) 70%, transparent)}}.border-stroke\/20{border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.border-stroke\/20{border-color:color-mix(in oklab, var(--color-border) 20%, transparent)}}.border-stroke\/opacity-medium{border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.border-stroke\/opacity-medium{border-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}.border-transparent{border-color:#0000}.border-white{border-color:var(--color-white)}.border-white\/opacity-light{border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.border-white\/opacity-light{border-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.border-white\/opacity-medium{border-color:#ffffff40}@supports (color:color-mix(in lab, red, red)){.border-white\/opacity-medium{border-color:color-mix(in oklab, var(--color-white) 25%, transparent)}}.border-t-transparent{border-top-color:#0000}.border-l-accent-amber{border-left-color:var(--color-accent-amber)}.border-l-accent-cyan{border-left-color:var(--color-accent-cyan)}.border-l-accent-green{border-left-color:var(--color-accent-green)}.border-l-accent-purple{border-left-color:var(--color-accent-purple)}.border-l-accent-red{border-left-color:var(--color-accent-red)}.border-l-amber-500{border-left-color:var(--color-amber-500)}.border-l-gray-500{border-left-color:var(--color-gray-500)}.border-l-green-600{border-left-color:var(--color-green-600)}.border-l-primary{border-left-color:var(--color-primary)}.bg-accent-amber,.bg-accent-amber\/opacity-heavy{background-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.bg-accent-amber\/opacity-heavy{background-color:color-mix(in oklab, var(--color-accent-amber) 50%, transparent)}}.bg-accent-amber\/opacity-light{background-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.bg-accent-amber\/opacity-light{background-color:color-mix(in oklab, var(--color-accent-amber) 10%, transparent)}}.bg-accent-amber\/opacity-medium{background-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.bg-accent-amber\/opacity-medium{background-color:color-mix(in oklab, var(--color-accent-amber) 25%, transparent)}}.bg-accent-cyan,.bg-accent-cyan\/opacity-heavy{background-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.bg-accent-cyan\/opacity-heavy{background-color:color-mix(in oklab, var(--color-accent-cyan) 50%, transparent)}}.bg-accent-cyan\/opacity-light{background-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.bg-accent-cyan\/opacity-light{background-color:color-mix(in oklab, var(--color-accent-cyan) 10%, transparent)}}.bg-accent-cyan\/opacity-medium{background-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.bg-accent-cyan\/opacity-medium{background-color:color-mix(in oklab, var(--color-accent-cyan) 25%, transparent)}}.bg-accent-green{background-color:var(--color-accent-green)}.bg-accent-green-light{background-color:var(--color-accent-green-light)}.bg-accent-green\/opacity-heavy{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.bg-accent-green\/opacity-heavy{background-color:color-mix(in oklab, var(--color-accent-green) 50%, transparent)}}.bg-accent-green\/opacity-light{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.bg-accent-green\/opacity-light{background-color:color-mix(in oklab, var(--color-accent-green) 10%, transparent)}}.bg-accent-green\/opacity-medium{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.bg-accent-green\/opacity-medium{background-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}.bg-accent-orange,.bg-accent-orange\/opacity-light{background-color:var(--color-accent-orange)}@supports (color:color-mix(in lab, red, red)){.bg-accent-orange\/opacity-light{background-color:color-mix(in oklab, var(--color-accent-orange) 10%, transparent)}}.bg-accent-orange\/opacity-medium{background-color:var(--color-accent-orange)}@supports (color:color-mix(in lab, red, red)){.bg-accent-orange\/opacity-medium{background-color:color-mix(in oklab, var(--color-accent-orange) 25%, transparent)}}.bg-accent-purple,.bg-accent-purple\/opacity-medium{background-color:var(--color-accent-purple)}@supports (color:color-mix(in lab, red, red)){.bg-accent-purple\/opacity-medium{background-color:color-mix(in oklab, var(--color-accent-purple) 25%, transparent)}}.bg-accent-red,.bg-accent-red\/10{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.bg-accent-red\/10{background-color:color-mix(in oklab, var(--color-accent-red) 10%, transparent)}}.bg-accent-red\/opacity-heavy{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.bg-accent-red\/opacity-heavy{background-color:color-mix(in oklab, var(--color-accent-red) 50%, transparent)}}.bg-accent-red\/opacity-light{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.bg-accent-red\/opacity-light{background-color:color-mix(in oklab, var(--color-accent-red) 10%, transparent)}}.bg-accent-red\/opacity-medium{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.bg-accent-red\/opacity-medium{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.bg-background{background-color:var(--color-background)}.bg-background-mute,.bg-background-mute\/opacity-heavy{background-color:var(--color-background-mute)}@supports (color:color-mix(in lab, red, red)){.bg-background-mute\/opacity-heavy{background-color:color-mix(in oklab, var(--color-background-mute) 50%, transparent)}}.bg-background-mute\/opacity-light{background-color:var(--color-background-mute)}@supports (color:color-mix(in lab, red, red)){.bg-background-mute\/opacity-light{background-color:color-mix(in oklab, var(--color-background-mute) 10%, transparent)}}.bg-background-mute\/opacity-medium{background-color:var(--color-background-mute)}@supports (color:color-mix(in lab, red, red)){.bg-background-mute\/opacity-medium{background-color:color-mix(in oklab, var(--color-background-mute) 25%, transparent)}}.bg-background-soft{background-color:var(--color-background-soft)}.bg-badge-cyan-bg{background-color:var(--color-badge-cyan-bg)}.bg-badge-neutral-bg{background-color:var(--color-badge-neutral-bg)}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab, red, red)){.bg-black\/80{background-color:color-mix(in oklab, var(--color-black) 80%, transparent)}}.bg-black\/opacity-heavy{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/opacity-heavy{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-black\/opacity-light{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.bg-black\/opacity-light{background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.bg-black\/opacity-medium{background-color:#00000040}@supports (color:color-mix(in lab, red, red)){.bg-black\/opacity-medium{background-color:color-mix(in oklab, var(--color-black) 25%, transparent)}}.bg-content-muted,.bg-content-muted\/opacity-heavy{background-color:var(--color-text-muted)}@supports (color:color-mix(in lab, red, red)){.bg-content-muted\/opacity-heavy{background-color:color-mix(in oklab, var(--color-text-muted) 50%, transparent)}}.bg-content-primary{background-color:var(--color-text-primary)}.bg-current,.bg-current\/10{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.bg-current\/10{background-color:color-mix(in oklab, currentcolor 10%, transparent)}}.bg-green-400{background-color:var(--color-green-400)}.bg-primary,.bg-primary\/15{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/15{background-color:color-mix(in oklab, var(--color-primary) 15%, transparent)}}.bg-primary\/opacity-heavy{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/opacity-heavy{background-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.bg-primary\/opacity-light{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/opacity-light{background-color:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.bg-primary\/opacity-medium{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/opacity-medium{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.bg-red-700{background-color:var(--color-red-700)}.bg-secondary,.bg-secondary\/opacity-light{background-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.bg-secondary\/opacity-light{background-color:color-mix(in oklab, var(--color-secondary) 10%, transparent)}}.bg-secondary\/opacity-medium{background-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.bg-secondary\/opacity-medium{background-color:color-mix(in oklab, var(--color-secondary) 25%, transparent)}}.bg-stroke-subtle,.bg-stroke-subtle\/40{background-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.bg-stroke-subtle\/40{background-color:color-mix(in oklab, var(--color-border-subtle) 40%, transparent)}}.bg-stroke-subtle\/50{background-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.bg-stroke-subtle\/50{background-color:color-mix(in oklab, var(--color-border-subtle) 50%, transparent)}}.bg-surface{background-color:var(--color-surface)}.bg-surface-elevated{background-color:var(--color-surface-elevated)}.bg-surface\/opacity-heavy{background-color:var(--color-surface)}@supports (color:color-mix(in lab, red, red)){.bg-surface\/opacity-heavy{background-color:color-mix(in oklab, var(--color-surface) 50%, transparent)}}.bg-white{background-color:var(--color-white)}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab, red, red)){.bg-white\/60{background-color:color-mix(in oklab, var(--color-white) 60%, transparent)}}.bg-white\/opacity-heavy{background-color:#ffffff80}@supports (color:color-mix(in lab, red, red)){.bg-white\/opacity-heavy{background-color:color-mix(in oklab, var(--color-white) 50%, transparent)}}.bg-white\/opacity-light{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.bg-white\/opacity-light{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-tl{--tw-gradient-position:to top left in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-accent-amber\/20{--tw-gradient-from:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.from-accent-amber\/20{--tw-gradient-from:color-mix(in oklab, var(--color-accent-amber) 20%, transparent)}}.from-accent-amber\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-accent-green\/10{--tw-gradient-from:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.from-accent-green\/10{--tw-gradient-from:color-mix(in oklab, var(--color-accent-green) 10%, transparent)}}.from-accent-green\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-blue-200\/30{--tw-gradient-from:#bedbff4d}@supports (color:color-mix(in lab, red, red)){.from-blue-200\/30{--tw-gradient-from:color-mix(in oklab, var(--color-blue-200) 30%, transparent)}}.from-blue-200\/30{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-blue-400\/15{--tw-gradient-from:#54a2ff26}@supports (color:color-mix(in lab, red, red)){.from-blue-400\/15{--tw-gradient-from:color-mix(in oklab, var(--color-blue-400) 15%, transparent)}}.from-blue-400\/15{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-cyan-500\/20{--tw-gradient-from:#00b7d733}@supports (color:color-mix(in lab, red, red)){.from-cyan-500\/20{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-500) 20%, transparent)}}.from-cyan-500\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-cyan-500\/50{--tw-gradient-from:#00b7d780}@supports (color:color-mix(in lab, red, red)){.from-cyan-500\/50{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-500) 50%, transparent)}}.from-cyan-500\/50{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-gray-100{--tw-gradient-from:var(--color-gray-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-200\/25{--tw-gradient-from:#c7d2ff40}@supports (color:color-mix(in lab, red, red)){.from-indigo-200\/25{--tw-gradient-from:color-mix(in oklab, var(--color-indigo-200) 25%, transparent)}}.from-indigo-200\/25{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-400\/15{--tw-gradient-from:#7d87ff26}@supports (color:color-mix(in lab, red, red)){.from-indigo-400\/15{--tw-gradient-from:color-mix(in oklab, var(--color-indigo-400) 15%, transparent)}}.from-indigo-400\/15{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-orange-500\/50{--tw-gradient-from:#fe6e0080}@supports (color:color-mix(in lab, red, red)){.from-orange-500\/50{--tw-gradient-from:color-mix(in oklab, var(--color-orange-500) 50%, transparent)}}.from-orange-500\/50{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-primary{--tw-gradient-from:var(--color-primary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-primary\/3{--tw-gradient-from:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.from-primary\/3{--tw-gradient-from:color-mix(in oklab, var(--color-primary) 3%, transparent)}}.from-primary\/3{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-primary\/20{--tw-gradient-from:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.from-primary\/20{--tw-gradient-from:color-mix(in oklab, var(--color-primary) 20%, transparent)}}.from-primary\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-primary\/30{--tw-gradient-from:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.from-primary\/30{--tw-gradient-from:color-mix(in oklab, var(--color-primary) 30%, transparent)}}.from-primary\/30{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-primary\/opacity-subtle{--tw-gradient-from:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.from-primary\/opacity-subtle{--tw-gradient-from:color-mix(in oklab, var(--color-primary) 5%, transparent)}}.from-primary\/opacity-subtle{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-200\/25{--tw-gradient-from:#e9d5ff40}@supports (color:color-mix(in lab, red, red)){.from-purple-200\/25{--tw-gradient-from:color-mix(in oklab, var(--color-purple-200) 25%, transparent)}}.from-purple-200\/25{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-purple-400\/15{--tw-gradient-from:#c07eff26}@supports (color:color-mix(in lab, red, red)){.from-purple-400\/15{--tw-gradient-from:color-mix(in oklab, var(--color-purple-400) 15%, transparent)}}.from-purple-400\/15{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-red-500\/50{--tw-gradient-from:#fb2c3680}@supports (color:color-mix(in lab, red, red)){.from-red-500\/50{--tw-gradient-from:color-mix(in oklab, var(--color-red-500) 50%, transparent)}}.from-red-500\/50{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-secondary\/20{--tw-gradient-from:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.from-secondary\/20{--tw-gradient-from:color-mix(in oklab, var(--color-secondary) 20%, transparent)}}.from-secondary\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-secondary\/opacity-subtle{--tw-gradient-from:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.from-secondary\/opacity-subtle{--tw-gradient-from:color-mix(in oklab, var(--color-secondary) 5%, transparent)}}.from-secondary\/opacity-subtle{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-yellow-500\/50{--tw-gradient-from:#edb20080}@supports (color:color-mix(in lab, red, red)){.from-yellow-500\/50{--tw-gradient-from:color-mix(in oklab, var(--color-yellow-500) 50%, transparent)}}.from-yellow-500\/50{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-primary\/20{--tw-gradient-via:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.via-primary\/20{--tw-gradient-via:color-mix(in oklab, var(--color-primary) 20%, transparent)}}.via-primary\/20{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-secondary\/10{--tw-gradient-via:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.via-secondary\/10{--tw-gradient-via:color-mix(in oklab, var(--color-secondary) 10%, transparent)}}.via-secondary\/10{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-transparent{--tw-gradient-via:transparent;--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-white\/opacity-subtle{--tw-gradient-via:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.via-white\/opacity-subtle{--tw-gradient-via:color-mix(in oklab, var(--color-white) 5%, transparent)}}.via-white\/opacity-subtle{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-accent-cyan\/20{--tw-gradient-to:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.to-accent-cyan\/20{--tw-gradient-to:color-mix(in oklab, var(--color-accent-cyan) 20%, transparent)}}.to-accent-cyan\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-accent-green{--tw-gradient-to:var(--color-accent-green);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-accent-purple\/20{--tw-gradient-to:var(--color-accent-purple)}@supports (color:color-mix(in lab, red, red)){.to-accent-purple\/20{--tw-gradient-to:color-mix(in oklab, var(--color-accent-purple) 20%, transparent)}}.to-accent-purple\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-accent-red\/20{--tw-gradient-to:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.to-accent-red\/20{--tw-gradient-to:color-mix(in oklab, var(--color-accent-red) 20%, transparent)}}.to-accent-red\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-100\/15{--tw-gradient-to:#dbeafe26}@supports (color:color-mix(in lab, red, red)){.to-blue-100\/15{--tw-gradient-to:color-mix(in oklab, var(--color-blue-100) 15%, transparent)}}.to-blue-100\/15{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-100\/20{--tw-gradient-to:#dbeafe33}@supports (color:color-mix(in lab, red, red)){.to-blue-100\/20{--tw-gradient-to:color-mix(in oklab, var(--color-blue-100) 20%, transparent)}}.to-blue-100\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-300\/opacity-subtle{--tw-gradient-to:#90c5ff0d}@supports (color:color-mix(in lab, red, red)){.to-blue-300\/opacity-subtle{--tw-gradient-to:color-mix(in oklab, var(--color-blue-300) 5%, transparent)}}.to-blue-300\/opacity-subtle{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-400\/20{--tw-gradient-to:#00d2ef33}@supports (color:color-mix(in lab, red, red)){.to-cyan-400\/20{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-400) 20%, transparent)}}.to-cyan-400\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-600\/50{--tw-gradient-to:#0092b580}@supports (color:color-mix(in lab, red, red)){.to-cyan-600\/50{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-600) 50%, transparent)}}.to-cyan-600\/50{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-gray-200{--tw-gradient-to:var(--color-gray-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-indigo-300\/opacity-subtle{--tw-gradient-to:#a4b3ff0d}@supports (color:color-mix(in lab, red, red)){.to-indigo-300\/opacity-subtle{--tw-gradient-to:color-mix(in oklab, var(--color-indigo-300) 5%, transparent)}}.to-indigo-300\/opacity-subtle{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-600\/50{--tw-gradient-to:#f0510080}@supports (color:color-mix(in lab, red, red)){.to-orange-600\/50{--tw-gradient-to:color-mix(in oklab, var(--color-orange-600) 50%, transparent)}}.to-orange-600\/50{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-primary\/10{--tw-gradient-to:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.to-primary\/10{--tw-gradient-to:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.to-primary\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-primary\/20{--tw-gradient-to:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.to-primary\/20{--tw-gradient-to:color-mix(in oklab, var(--color-primary) 20%, transparent)}}.to-primary\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-primary\/80{--tw-gradient-to:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.to-primary\/80{--tw-gradient-to:color-mix(in oklab, var(--color-primary) 80%, transparent)}}.to-primary\/80{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-100\/15{--tw-gradient-to:#f3e8ff26}@supports (color:color-mix(in lab, red, red)){.to-purple-100\/15{--tw-gradient-to:color-mix(in oklab, var(--color-purple-100) 15%, transparent)}}.to-purple-100\/15{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-purple-300\/opacity-subtle{--tw-gradient-to:#d9b3ff0d}@supports (color:color-mix(in lab, red, red)){.to-purple-300\/opacity-subtle{--tw-gradient-to:color-mix(in oklab, var(--color-purple-300) 5%, transparent)}}.to-purple-300\/opacity-subtle{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-red-600\/50{--tw-gradient-to:#e4001480}@supports (color:color-mix(in lab, red, red)){.to-red-600\/50{--tw-gradient-to:color-mix(in oklab, var(--color-red-600) 50%, transparent)}}.to-red-600\/50{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-secondary\/30{--tw-gradient-to:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.to-secondary\/30{--tw-gradient-to:color-mix(in oklab, var(--color-secondary) 30%, transparent)}}.to-secondary\/30{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-yellow-600\/50{--tw-gradient-to:#cd890080}@supports (color:color-mix(in lab, red, red)){.to-yellow-600\/50{--tw-gradient-to:color-mix(in oklab, var(--color-yellow-600) 50%, transparent)}}.to-yellow-600\/50{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.\!p-2{padding:calc(var(--spacing) * 2)!important}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-10{padding:calc(var(--spacing) * 10)}.p-\[15px\]{padding:15px}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-px{padding-top:1px}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-0{padding-bottom:calc(var(--spacing) * 0)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-\[calc\(var\(--app-safe-area-bottom\)\+1rem\)\]{padding-bottom:calc(var(--app-safe-area-bottom) + 1rem)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-9{padding-left:calc(var(--spacing) * 9)}.pl-10{padding-left:calc(var(--spacing) * 10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-heading{font-family:Michroma,sans-serif}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:Inter,-apple-system,Roboto,Helvetica,sans-serif}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent-amber{color:var(--color-accent-amber)}.text-accent-cyan,.text-accent-cyan\/opacity-heavy{color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.text-accent-cyan\/opacity-heavy{color:color-mix(in oklab, var(--color-accent-cyan) 50%, transparent)}}.text-accent-green{color:var(--color-accent-green)}.text-accent-green-light{color:var(--color-accent-green-light)}.text-accent-green\/opacity-heavy{color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.text-accent-green\/opacity-heavy{color:color-mix(in oklab, var(--color-accent-green) 50%, transparent)}}.text-accent-orange{color:var(--color-accent-orange)}.text-accent-purple{color:var(--color-accent-purple)}.text-accent-red,.text-accent-red\/opacity-heavy{color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.text-accent-red\/opacity-heavy{color:color-mix(in oklab, var(--color-accent-red) 50%, transparent)}}.text-background{color:var(--color-background)}.text-badge-cyan-text{color:var(--color-badge-cyan-text)}.text-badge-neutral-text{color:var(--color-badge-neutral-text)}.text-content-heading{color:var(--color-heading)}.text-content-muted,.text-content-muted\/60{color:var(--color-text-muted)}@supports (color:color-mix(in lab, red, red)){.text-content-muted\/60{color:color-mix(in oklab, var(--color-text-muted) 60%, transparent)}}.text-content-muted\/opacity-heavy{color:var(--color-text-muted)}@supports (color:color-mix(in lab, red, red)){.text-content-muted\/opacity-heavy{color:color-mix(in oklab, var(--color-text-muted) 50%, transparent)}}.text-content-primary,.text-content-primary\/opacity-heavy{color:var(--color-text-primary)}@supports (color:color-mix(in lab, red, red)){.text-content-primary\/opacity-heavy{color:color-mix(in oklab, var(--color-text-primary) 50%, transparent)}}.text-content-secondary{color:var(--color-text-secondary)}.text-green-500{color:var(--color-green-500)}.text-indigo-500{color:var(--color-indigo-500)}.text-primary,.text-primary\/opacity-heavy{color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.text-primary\/opacity-heavy{color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.text-secondary,.text-secondary\/opacity-heavy{color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.text-secondary\/opacity-heavy{color:color-mix(in oklab, var(--color-secondary) 50%, transparent)}}.text-transparent{color:#0000}.text-white{color:var(--color-white)}.text-white\/40{color:#fff6}@supports (color:color-mix(in lab, red, red)){.text-white\/40{color:color-mix(in oklab, var(--color-white) 40%, transparent)}}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab, red, red)){.text-white\/50{color:color-mix(in oklab, var(--color-white) 50%, transparent)}}.text-white\/60{color:#fff9}@supports (color:color-mix(in lab, red, red)){.text-white\/60{color:color-mix(in oklab, var(--color-white) 60%, transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab, red, red)){.text-white\/80{color:color-mix(in oklab, var(--color-white) 80%, transparent)}}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.decoration-primary\/60{-webkit-text-decoration-color:var(--color-primary);-webkit-text-decoration-color:var(--color-primary);-webkit-text-decoration-color:var(--color-primary);text-decoration-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.decoration-primary\/60{-webkit-text-decoration-color:color-mix(in oklab, var(--color-primary) 60%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--color-primary) 60%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--color-primary) 60%, transparent);text-decoration-color:color-mix(in oklab, var(--color-primary) 60%, transparent)}}.decoration-stroke-hover{-webkit-text-decoration-color:var(--color-border-hover);-webkit-text-decoration-color:var(--color-border-hover);-webkit-text-decoration-color:var(--color-border-hover);text-decoration-color:var(--color-border-hover)}.underline-offset-2{text-underline-offset:2px}.placeholder-content-muted::placeholder{color:var(--color-text-muted)}.accent-primary{accent-color:var(--color-primary)}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-100{opacity:1}.mix-blend-multiply{mix-blend-mode:multiply}.mix-blend-normal{mix-blend-mode:normal}.mix-blend-screen{mix-blend-mode:screen}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_20px_80px_color-mix\(in_srgb\,var\(--color-shadow-strong\)_35\%\,transparent\)\]{--tw-shadow:0 20px 80px var(--tw-shadow-color,var(--color-shadow-strong))}@supports (color:color-mix(in lab, red, red)){.shadow-\[0_20px_80px_color-mix\(in_srgb\,var\(--color-shadow-strong\)_35\%\,transparent\)\]{--tw-shadow:0 20px 80px var(--tw-shadow-color,color-mix(in srgb,var(--color-shadow-strong) 35%,transparent))}}.shadow-\[0_20px_80px_color-mix\(in_srgb\,var\(--color-shadow-strong\)_35\%\,transparent\)\]{box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-accent-green\/50{--tw-shadow-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.shadow-accent-green\/50{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-accent-green) 50%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/10{--tw-shadow-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.shadow-primary\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-primary) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/20{--tw-shadow-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.shadow-primary\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-primary) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/30{--tw-shadow-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.shadow-primary\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-primary) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-cyan-400\/50{--tw-ring-color:#00d2ef80}@supports (color:color-mix(in lab, red, red)){.ring-cyan-400\/50{--tw-ring-color:color-mix(in oklab, var(--color-cyan-400) 50%, transparent)}}.blur-3xl{--tw-blur:blur(var(--blur-3xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.blur-\[120px\]{--tw-blur:blur(120px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.blur-xl{--tw-blur:blur(var(--blur-xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.brightness-0{--tw-brightness:brightness(0%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-\[0_0_6px_color-mix\(in_srgb\,var\(--color-accent-cyan\)_80\%\,transparent\)\]{--tw-drop-shadow-size:drop-shadow(0 0 6px var(--tw-drop-shadow-color,var(--color-accent-cyan)))}@supports (color:color-mix(in lab, red, red)){.drop-shadow-\[0_0_6px_color-mix\(in_srgb\,var\(--color-accent-cyan\)_80\%\,transparent\)\]{--tw-drop-shadow-size:drop-shadow(0 0 6px var(--tw-drop-shadow-color,color-mix(in srgb,var(--color-accent-cyan) 80%,transparent)))}}.drop-shadow-\[0_0_6px_color-mix\(in_srgb\,var\(--color-accent-cyan\)_80\%\,transparent\)\]{--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-lg{--tw-backdrop-blur:blur(var(--blur-lg));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}.\[webkit-overflow-scrolling\:touch\]{webkit-overflow-scrolling:touch}@media (hover:hover){.group-hover\:translate-x-1:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:translate-y-1:is(:where(.group):hover *){--tw-translate-y:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:scale-110:is(:where(.group):hover *){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:rotate-12:is(:where(.group):hover *){rotate:12deg}.group-hover\:border-stroke:is(:where(.group):hover *){border-color:var(--color-border)}.group-hover\:text-content-primary:is(:where(.group):hover *){color:var(--color-text-primary)}.group-hover\:text-indigo-500:is(:where(.group):hover *){color:var(--color-indigo-500)}.group-hover\:text-primary:is(:where(.group):hover *){color:var(--color-primary)}.group-hover\:text-secondary:is(:where(.group):hover *){color:var(--color-secondary)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\/delete\:rotate-12:is(:where(.group\/delete):hover *){rotate:12deg}}.peer-checked\:scale-100:is(:where(.peer):checked~*){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.peer-checked\:border-primary:is(:where(.peer):checked~*){border-color:var(--color-primary)}.peer-checked\:bg-primary\/opacity-medium:is(:where(.peer):checked~*){background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.peer-checked\:bg-primary\/opacity-medium:is(:where(.peer):checked~*){background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.placeholder\:text-content-muted::placeholder{color:var(--color-text-muted)}.last\:border-r-0:last-child{border-right-style:var(--tw-border-style);border-right-width:0}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.odd\:bg-background-mute\/opacity-medium:nth-child(odd){background-color:var(--color-background-mute)}@supports (color:color-mix(in lab, red, red)){.odd\:bg-background-mute\/opacity-medium:nth-child(odd){background-color:color-mix(in oklab, var(--color-background-mute) 25%, transparent)}}@media (hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-\[1\.02\]:hover{scale:1.02}.hover\:border-accent-amber\/opacity-medium:hover{border-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.hover\:border-accent-amber\/opacity-medium:hover{border-color:color-mix(in oklab, var(--color-accent-amber) 25%, transparent)}}.hover\:border-accent-cyan\/opacity-heavy:hover{border-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.hover\:border-accent-cyan\/opacity-heavy:hover{border-color:color-mix(in oklab, var(--color-accent-cyan) 50%, transparent)}}.hover\:border-indigo-500\/50:hover{border-color:#625fff80}@supports (color:color-mix(in lab, red, red)){.hover\:border-indigo-500\/50:hover{border-color:color-mix(in oklab, var(--color-indigo-500) 50%, transparent)}}.hover\:border-primary:hover,.hover\:border-primary\/opacity-heavy:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/opacity-heavy:hover{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.hover\:border-primary\/opacity-medium:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/opacity-medium:hover{border-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.hover\:border-secondary\/opacity-heavy:hover{border-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:border-secondary\/opacity-heavy:hover{border-color:color-mix(in oklab, var(--color-secondary) 50%, transparent)}}.hover\:border-stroke:hover{border-color:var(--color-border)}.hover\:border-stroke-subtle:hover{border-color:var(--color-border-subtle)}.hover\:bg-accent-amber\/opacity-light:hover{background-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-amber\/opacity-light:hover{background-color:color-mix(in oklab, var(--color-accent-amber) 10%, transparent)}}.hover\:bg-accent-amber\/opacity-medium:hover{background-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-amber\/opacity-medium:hover{background-color:color-mix(in oklab, var(--color-accent-amber) 25%, transparent)}}.hover\:bg-accent-cyan\/opacity-medium:hover{background-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-cyan\/opacity-medium:hover{background-color:color-mix(in oklab, var(--color-accent-cyan) 25%, transparent)}}.hover\:bg-accent-green\/opacity-light:hover{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-green\/opacity-light:hover{background-color:color-mix(in oklab, var(--color-accent-green) 10%, transparent)}}.hover\:bg-accent-green\/opacity-medium:hover{background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-green\/opacity-medium:hover{background-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}.hover\:bg-accent-purple\/opacity-medium:hover{background-color:var(--color-accent-purple)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-purple\/opacity-medium:hover{background-color:color-mix(in oklab, var(--color-accent-purple) 25%, transparent)}}.hover\:bg-accent-red\/opacity-light:hover{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-red\/opacity-light:hover{background-color:color-mix(in oklab, var(--color-accent-red) 10%, transparent)}}.hover\:bg-accent-red\/opacity-medium:hover{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-red\/opacity-medium:hover{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.hover\:bg-background-mute:hover,.hover\:bg-background-mute\/opacity-heavy:hover{background-color:var(--color-background-mute)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-background-mute\/opacity-heavy:hover{background-color:color-mix(in oklab, var(--color-background-mute) 50%, transparent)}}.hover\:bg-background-soft:hover{background-color:var(--color-background-soft)}.hover\:bg-black\/80:hover{background-color:#000c}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/80:hover{background-color:color-mix(in oklab, var(--color-black) 80%, transparent)}}.hover\:bg-black\/opacity-light:hover{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/opacity-light:hover{background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.hover\:bg-indigo-50:hover{background-color:var(--color-indigo-50)}.hover\:bg-primary\/opacity-heavy:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/opacity-heavy:hover{background-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.hover\:bg-primary\/opacity-light:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/opacity-light:hover{background-color:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.hover\:bg-primary\/opacity-medium:hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/opacity-medium:hover{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.hover\:bg-secondary\/opacity-heavy:hover{background-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/opacity-heavy:hover{background-color:color-mix(in oklab, var(--color-secondary) 50%, transparent)}}.hover\:bg-secondary\/opacity-light:hover{background-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/opacity-light:hover{background-color:color-mix(in oklab, var(--color-secondary) 10%, transparent)}}.hover\:bg-stroke-subtle:hover,.hover\:bg-stroke-subtle\/40:hover{background-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-stroke-subtle\/40:hover{background-color:color-mix(in oklab, var(--color-border-subtle) 40%, transparent)}}.hover\:bg-stroke-subtle\/50:hover{background-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-stroke-subtle\/50:hover{background-color:color-mix(in oklab, var(--color-border-subtle) 50%, transparent)}}.hover\:bg-stroke-subtle\/60:hover{background-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-stroke-subtle\/60:hover{background-color:color-mix(in oklab, var(--color-border-subtle) 60%, transparent)}}.hover\:bg-stroke\/opacity-light:hover{background-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-stroke\/opacity-light:hover{background-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-white\/opacity-light:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/opacity-light:hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.hover\:from-cyan-500\/30:hover{--tw-gradient-from:#00b7d74d}@supports (color:color-mix(in lab, red, red)){.hover\:from-cyan-500\/30:hover{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-500) 30%, transparent)}}.hover\:from-cyan-500\/30:hover{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.hover\:from-gray-200:hover{--tw-gradient-from:var(--color-gray-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.hover\:from-primary\/40:hover{--tw-gradient-from:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:from-primary\/40:hover{--tw-gradient-from:color-mix(in oklab, var(--color-primary) 40%, transparent)}}.hover\:from-primary\/40:hover{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.hover\:to-cyan-400\/30:hover{--tw-gradient-to:#00d2ef4d}@supports (color:color-mix(in lab, red, red)){.hover\:to-cyan-400\/30:hover{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-400) 30%, transparent)}}.hover\:to-cyan-400\/30:hover{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.hover\:to-gray-300:hover{--tw-gradient-to:var(--color-gray-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.hover\:to-secondary\/40:hover{--tw-gradient-to:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:to-secondary\/40:hover{--tw-gradient-to:color-mix(in oklab, var(--color-secondary) 40%, transparent)}}.hover\:to-secondary\/40:hover{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.hover\:text-accent-green:hover{color:var(--color-accent-green)}.hover\:text-accent-red:hover{color:var(--color-accent-red)}.hover\:text-content-heading:hover{color:var(--color-heading)}.hover\:text-content-primary:hover{color:var(--color-text-primary)}.hover\:text-content-secondary:hover{color:var(--color-text-secondary)}.hover\:text-primary:hover,.hover\:text-primary\/opacity-heavy:hover{color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:text-primary\/opacity-heavy:hover{color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.hover\:text-white:hover{color:var(--color-white)}.hover\:no-underline:hover{text-decoration-line:none}.hover\:decoration-primary\/60:hover{-webkit-text-decoration-color:var(--color-primary);-webkit-text-decoration-color:var(--color-primary);-webkit-text-decoration-color:var(--color-primary);text-decoration-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:decoration-primary\/60:hover{-webkit-text-decoration-color:color-mix(in oklab, var(--color-primary) 60%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--color-primary) 60%, transparent);-webkit-text-decoration-color:color-mix(in oklab, var(--color-primary) 60%, transparent);text-decoration-color:color-mix(in oklab, var(--color-primary) 60%, transparent)}}.hover\:opacity-90:hover{opacity:.9}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\:shadow-accent-green\/opacity-medium:hover{--tw-shadow-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-accent-green\/opacity-medium:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-accent-green) 25%, transparent) var(--tw-shadow-alpha), transparent)}}.hover\:shadow-primary\/opacity-medium:hover{--tw-shadow-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-primary\/opacity-medium:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-primary) 25%, transparent) var(--tw-shadow-alpha), transparent)}}.hover\:shadow-secondary\/10:hover{--tw-shadow-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-secondary\/10:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-secondary) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.hover\:shadow-secondary\/opacity-medium:hover{--tw-shadow-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-secondary\/opacity-medium:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-secondary) 25%, transparent) var(--tw-shadow-alpha), transparent)}}}.focus\:border-primary:focus,.focus\:border-primary\/opacity-heavy:focus{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.focus\:border-primary\/opacity-heavy:focus{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-accent-cyan:focus{--tw-ring-color:var(--color-accent-cyan)}.focus\:ring-primary:focus,.focus\:ring-primary\/opacity-heavy:focus{--tw-ring-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.focus\:ring-primary\/opacity-heavy:focus{--tw-ring-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.focus\:ring-primary\/opacity-medium:focus{--tw-ring-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.focus\:ring-primary\/opacity-medium:focus{--tw-ring-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.focus\:ring-offset-background:focus{--tw-ring-offset-color:var(--color-background)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:scale-\[0\.98\]:active{scale:.98}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-stroke-subtle\/20:disabled{border-color:var(--color-border-subtle)}@supports (color:color-mix(in lab, red, red)){.disabled\:border-stroke-subtle\/20:disabled{border-color:color-mix(in oklab, var(--color-border-subtle) 20%, transparent)}}.disabled\:bg-background-mute\/opacity-light:disabled{background-color:var(--color-background-mute)}@supports (color:color-mix(in lab, red, red)){.disabled\:bg-background-mute\/opacity-light:disabled{background-color:color-mix(in oklab, var(--color-background-mute) 10%, transparent)}}.disabled\:text-content-muted:disabled{color:var(--color-text-muted)}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}@media (width>=40rem){.sm\:top-\[calc\(50\%\+20px\)\]{top:calc(50% + 20px)}.sm\:bottom-\[calc\(50\%\+20px\)\]{bottom:calc(50% + 20px)}.sm\:col-span-1{grid-column:span 1/span 1}.sm\:mt-2{margin-top:calc(var(--spacing) * 2)}.sm\:mt-5{margin-top:calc(var(--spacing) * 5)}.sm\:mt-6{margin-top:calc(var(--spacing) * 6)}.sm\:mt-8{margin-top:calc(var(--spacing) * 8)}.sm\:mb-2{margin-bottom:calc(var(--spacing) * 2)}.sm\:mb-4{margin-bottom:calc(var(--spacing) * 4)}.sm\:ml-4{margin-left:calc(var(--spacing) * 4)}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-block{display:inline-block}.sm\:table-cell{display:table-cell}.sm\:h-3{height:calc(var(--spacing) * 3)}.sm\:h-4{height:calc(var(--spacing) * 4)}.sm\:h-5{height:calc(var(--spacing) * 5)}.sm\:h-6{height:calc(var(--spacing) * 6)}.sm\:h-10{height:calc(var(--spacing) * 10)}.sm\:h-48{height:calc(var(--spacing) * 48)}.sm\:h-\[22rem\]{height:22rem}.sm\:h-\[210px\]{height:210px}.sm\:max-h-\[90vh\]{max-height:90vh}.sm\:min-h-\[16rem\]{min-height:16rem}.sm\:w-3{width:calc(var(--spacing) * 3)}.sm\:w-4{width:calc(var(--spacing) * 4)}.sm\:w-5{width:calc(var(--spacing) * 5)}.sm\:w-6{width:calc(var(--spacing) * 6)}.sm\:w-10{width:calc(var(--spacing) * 10)}.sm\:w-24{width:calc(var(--spacing) * 24)}.sm\:w-32{width:calc(var(--spacing) * 32)}.sm\:w-40{width:calc(var(--spacing) * 40)}.sm\:w-48{width:calc(var(--spacing) * 48)}.sm\:w-64{width:calc(var(--spacing) * 64)}.sm\:w-72{width:calc(var(--spacing) * 72)}.sm\:w-80{width:calc(var(--spacing) * 80)}.sm\:w-96{width:calc(var(--spacing) * 96)}.sm\:w-auto{width:auto}.sm\:min-w-\[84px\]{min-width:84px}.sm\:min-w-\[180px\]{min-width:180px}.sm\:flex-none{flex:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[52px_1fr\]{grid-template-columns:52px 1fr}.sm\:flex-row{flex-direction:row}.sm\:flex-nowrap{flex-wrap:nowrap}.sm\:items-center{align-items:center}.sm\:items-start{align-items:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:gap-2{gap:calc(var(--spacing) * 2)}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.sm\:gap-3{gap:calc(var(--spacing) * 3)}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:gap-6{gap:calc(var(--spacing) * 6)}:where(.sm\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.sm\:space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.sm\:rounded-\[20px\]{border-radius:20px}.sm\:rounded-\[24px\]{border-radius:24px}.sm\:border{border-style:var(--tw-border-style);border-width:1px}.sm\:border-stroke-subtle{border-color:var(--color-border-subtle)}.sm\:\!p-4{padding:calc(var(--spacing) * 4)!important}.sm\:p-1{padding:calc(var(--spacing) * 1)}.sm\:p-3\.5{padding:calc(var(--spacing) * 3.5)}.sm\:p-4{padding:calc(var(--spacing) * 4)}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:p-10{padding:calc(var(--spacing) * 10)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:py-2{padding-block:calc(var(--spacing) * 2)}.sm\:py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.sm\:py-4{padding-block:calc(var(--spacing) * 4)}.sm\:pt-0{padding-top:calc(var(--spacing) * 0)}.sm\:pt-4{padding-top:calc(var(--spacing) * 4)}.sm\:pb-4{padding-bottom:calc(var(--spacing) * 4)}.sm\:text-right{text-align:right}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.sm\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.sm\:text-\[11px\]{font-size:11px}}@media (width>=48rem){.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-4{grid-column:span 4/span 4}.md\:block{display:block}.md\:grid{display:grid}.md\:hidden{display:none}.md\:max-w-sm{max-width:var(--container-sm)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-start{align-items:flex-start}.md\:justify-between{justify-content:space-between}.md\:gap-3{gap:calc(var(--spacing) * 3)}:where(.md\:space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.md\:p-4{padding:calc(var(--spacing) * 4)}.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:px-4{padding-inline:calc(var(--spacing) * 4)}.md\:text-right{text-align:right}.md\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (width>=64rem){.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:mt-3{margin-top:calc(var(--spacing) * 3)}.lg\:mt-4{margin-top:calc(var(--spacing) * 4)}.lg\:mb-4{margin-bottom:calc(var(--spacing) * 4)}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:h-48{height:calc(var(--spacing) * 48)}.lg\:h-56{height:calc(var(--spacing) * 56)}.lg\:w-7{width:calc(var(--spacing) * 7)}.lg\:max-w-sm{max-width:var(--container-sm)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:gap-3{gap:calc(var(--spacing) * 3)}.lg\:gap-4{gap:calc(var(--spacing) * 4)}.lg\:gap-6{gap:calc(var(--spacing) * 6)}.lg\:p-6{padding:calc(var(--spacing) * 6)}.lg\:p-8{padding:calc(var(--spacing) * 8)}.lg\:p-\[15px\]{padding:15px}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}.lg\:pb-\[15px\]{padding-bottom:15px}.lg\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.lg\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.lg\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.lg\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.lg\:text-\[35px\]{font-size:35px}}@media (width>=80rem){.xl\:col-span-4{grid-column:span 4/span 4}.xl\:col-span-8{grid-column:span 8/span 8}.xl\:max-w-\[260px\]{max-width:260px}.xl\:min-w-\[260px\]{min-width:260px}.xl\:flex-none{flex:none}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xl\:grid-cols-\[minmax\(0\,1\.15fr\)_minmax\(340px\,0\.85fr\)\]{grid-template-columns:minmax(0,1.15fr) minmax(340px,.85fr)}.xl\:flex-row{flex-direction:row}.xl\:items-start{align-items:flex-start}.xl\:justify-end{justify-content:flex-end}}.dark\:hidden:is(.dark *){display:none}:where(.dark\:divide-amber-800\/40:is(.dark *)>:not(:last-child)){border-color:#953d0066}@supports (color:color-mix(in lab, red, red)){:where(.dark\:divide-amber-800\/40:is(.dark *)>:not(:last-child)){border-color:color-mix(in oklab, var(--color-amber-800) 40%, transparent)}}:where(.dark\:divide-red-800\/40:is(.dark *)>:not(:last-child)){border-color:#9f071266}@supports (color:color-mix(in lab, red, red)){:where(.dark\:divide-red-800\/40:is(.dark *)>:not(:last-child)){border-color:color-mix(in oklab, var(--color-red-800) 40%, transparent)}}:where(.dark\:divide-stroke\/10:is(.dark *)>:not(:last-child)){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){:where(.dark\:divide-stroke\/10:is(.dark *)>:not(:last-child)){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}:where(.dark\:divide-white\/10:is(.dark *)>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){:where(.dark\:divide-white\/10:is(.dark *)>:not(:last-child)){border-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}:where(.dark\:divide-white\/opacity-subtle:is(.dark *)>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){:where(.dark\:divide-white\/opacity-subtle:is(.dark *)>:not(:last-child)){border-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.dark\:border-accent-amber\/opacity-heavy:is(.dark *){border-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.dark\:border-accent-amber\/opacity-heavy:is(.dark *){border-color:color-mix(in oklab, var(--color-accent-amber) 50%, transparent)}}.dark\:border-accent-amber\/opacity-medium:is(.dark *){border-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.dark\:border-accent-amber\/opacity-medium:is(.dark *){border-color:color-mix(in oklab, var(--color-accent-amber) 25%, transparent)}}.dark\:border-accent-green\/opacity-heavy:is(.dark *){border-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.dark\:border-accent-green\/opacity-heavy:is(.dark *){border-color:color-mix(in oklab, var(--color-accent-green) 50%, transparent)}}.dark\:border-accent-green\/opacity-medium:is(.dark *){border-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.dark\:border-accent-green\/opacity-medium:is(.dark *){border-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}.dark\:border-accent-red\/opacity-heavy:is(.dark *){border-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.dark\:border-accent-red\/opacity-heavy:is(.dark *){border-color:color-mix(in oklab, var(--color-accent-red) 50%, transparent)}}.dark\:border-accent-red\/opacity-medium:is(.dark *){border-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.dark\:border-accent-red\/opacity-medium:is(.dark *){border-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.dark\:border-dark-border\/50:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:border-dark-border\/50:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.dark\:border-primary\/opacity-medium:is(.dark *){border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:border-primary\/opacity-medium:is(.dark *){border-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.dark\:border-stroke:is(.dark *),.dark\:border-stroke\/opacity-heavy:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:border-stroke\/opacity-heavy:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.dark\:border-stroke\/opacity-light:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:border-stroke\/opacity-light:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 10%, transparent)}}.dark\:border-stroke\/opacity-medium:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:border-stroke\/opacity-medium:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}.dark\:border-white\/opacity-light:is(.dark *){border-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:border-white\/opacity-light:is(.dark *){border-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:border-white\/opacity-medium:is(.dark *){border-color:#ffffff40}@supports (color:color-mix(in lab, red, red)){.dark\:border-white\/opacity-medium:is(.dark *){border-color:color-mix(in oklab, var(--color-white) 25%, transparent)}}.dark\:border-l-accent-green:is(.dark *){border-left-color:var(--color-accent-green)}.dark\:bg-\[var\(--color-surface\)\]:is(.dark *){background-color:var(--color-surface)}.dark\:bg-accent-amber\/opacity-light:is(.dark *){background-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-accent-amber\/opacity-light:is(.dark *){background-color:color-mix(in oklab, var(--color-accent-amber) 10%, transparent)}}.dark\:bg-accent-amber\/opacity-medium:is(.dark *){background-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-accent-amber\/opacity-medium:is(.dark *){background-color:color-mix(in oklab, var(--color-accent-amber) 25%, transparent)}}.dark\:bg-accent-green\/opacity-light:is(.dark *){background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-accent-green\/opacity-light:is(.dark *){background-color:color-mix(in oklab, var(--color-accent-green) 10%, transparent)}}.dark\:bg-accent-green\/opacity-medium:is(.dark *){background-color:var(--color-accent-green)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-accent-green\/opacity-medium:is(.dark *){background-color:color-mix(in oklab, var(--color-accent-green) 25%, transparent)}}.dark\:bg-accent-red\/opacity-light:is(.dark *){background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-accent-red\/opacity-light:is(.dark *){background-color:color-mix(in oklab, var(--color-accent-red) 10%, transparent)}}.dark\:bg-accent-red\/opacity-medium:is(.dark *){background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-accent-red\/opacity-medium:is(.dark *){background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.dark\:bg-background:is(.dark *){background-color:var(--color-background)}.dark\:bg-background-mute:is(.dark *),.dark\:bg-background-mute\/opacity-heavy:is(.dark *){background-color:var(--color-background-mute)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-background-mute\/opacity-heavy:is(.dark *){background-color:color-mix(in oklab, var(--color-background-mute) 50%, transparent)}}.dark\:bg-background\/10:is(.dark *){background-color:var(--color-background)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-background\/10:is(.dark *){background-color:color-mix(in oklab, var(--color-background) 10%, transparent)}}.dark\:bg-background\/20:is(.dark *){background-color:var(--color-background)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-background\/20:is(.dark *){background-color:color-mix(in oklab, var(--color-background) 20%, transparent)}}.dark\:bg-background\/30:is(.dark *){background-color:var(--color-background)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-background\/30:is(.dark *){background-color:color-mix(in oklab, var(--color-background) 30%, transparent)}}.dark\:bg-background\/40:is(.dark *){background-color:var(--color-background)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-background\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-background) 40%, transparent)}}.dark\:bg-black\/10:is(.dark *){background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-black\/10:is(.dark *){background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.dark\:bg-black\/30:is(.dark *){background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-black\/30:is(.dark *){background-color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.dark\:bg-black\/opacity-heavy:is(.dark *){background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.dark\:bg-black\/opacity-heavy:is(.dark *){background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.dark\:bg-black\/opacity-medium:is(.dark *){background-color:#00000040}@supports (color:color-mix(in lab, red, red)){.dark\:bg-black\/opacity-medium:is(.dark *){background-color:color-mix(in oklab, var(--color-black) 25%, transparent)}}.dark\:bg-primary\/opacity-light:is(.dark *){background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-primary\/opacity-light:is(.dark *){background-color:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.dark\:bg-primary\/opacity-medium:is(.dark *){background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-primary\/opacity-medium:is(.dark *){background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.dark\:bg-stroke\/opacity-subtle:is(.dark *){background-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-stroke\/opacity-subtle:is(.dark *){background-color:color-mix(in oklab, var(--color-border) 5%, transparent)}}.dark\:bg-surface:is(.dark *){background-color:var(--color-surface)}.dark\:bg-surface-elevated:is(.dark *),.dark\:bg-surface-elevated\/30:is(.dark *){background-color:var(--color-surface-elevated)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-surface-elevated\/30:is(.dark *){background-color:color-mix(in oklab, var(--color-surface-elevated) 30%, transparent)}}.dark\:bg-surface-elevated\/80:is(.dark *){background-color:var(--color-surface-elevated)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-surface-elevated\/80:is(.dark *){background-color:color-mix(in oklab, var(--color-surface-elevated) 80%, transparent)}}.dark\:bg-surface\/opacity-heavy:is(.dark *){background-color:var(--color-surface)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-surface\/opacity-heavy:is(.dark *){background-color:color-mix(in oklab, var(--color-surface) 50%, transparent)}}.dark\:bg-transparent:is(.dark *){background-color:#0000}.dark\:bg-white\/5:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/5:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.dark\:bg-white\/\[0\.03\]:is(.dark *){background-color:#ffffff08}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/\[0\.03\]:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 3%, transparent)}}.dark\:bg-white\/opacity-light:is(.dark *){background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/opacity-light:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:bg-white\/opacity-subtle:is(.dark *){background-color:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/opacity-subtle:is(.dark *){background-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.dark\:from-primary\/opacity-subtle:is(.dark *){--tw-gradient-from:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:from-primary\/opacity-subtle:is(.dark *){--tw-gradient-from:color-mix(in oklab, var(--color-primary) 5%, transparent)}}.dark\:from-primary\/opacity-subtle:is(.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.dark\:from-white\/opacity-subtle:is(.dark *){--tw-gradient-from:#ffffff0d}@supports (color:color-mix(in lab, red, red)){.dark\:from-white\/opacity-subtle:is(.dark *){--tw-gradient-from:color-mix(in oklab, var(--color-white) 5%, transparent)}}.dark\:from-white\/opacity-subtle:is(.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.dark\:to-white\/10:is(.dark *){--tw-gradient-to:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:to-white\/10:is(.dark *){--tw-gradient-to:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:to-white\/10:is(.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.dark\:text-accent-green:is(.dark *){color:var(--color-accent-green)}.dark\:text-accent-red:is(.dark *),.dark\:text-accent-red\/opacity-heavy:is(.dark *){color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.dark\:text-accent-red\/opacity-heavy:is(.dark *){color:color-mix(in oklab, var(--color-accent-red) 50%, transparent)}}.dark\:text-content:is(.dark *){color:var(--color-text)}.dark\:text-content-muted:is(.dark *),.dark\:text-content-muted\/opacity-heavy:is(.dark *){color:var(--color-text-muted)}@supports (color:color-mix(in lab, red, red)){.dark\:text-content-muted\/opacity-heavy:is(.dark *){color:color-mix(in oklab, var(--color-text-muted) 50%, transparent)}}.dark\:text-content-primary:is(.dark *),.dark\:text-content-primary\/opacity-heavy:is(.dark *){color:var(--color-text-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:text-content-primary\/opacity-heavy:is(.dark *){color:color-mix(in oklab, var(--color-text-primary) 50%, transparent)}}.dark\:text-primary:is(.dark *),.dark\:text-primary\/opacity-heavy:is(.dark *){color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:text-primary\/opacity-heavy:is(.dark *){color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.dark\:text-white:is(.dark *){color:var(--color-white)}.dark\:text-white\/60:is(.dark *){color:#fff9}@supports (color:color-mix(in lab, red, red)){.dark\:text-white\/60:is(.dark *){color:color-mix(in oklab, var(--color-white) 60%, transparent)}}.dark\:placeholder-content-muted:is(.dark *)::placeholder{color:var(--color-text-muted)}.dark\:mix-blend-screen:is(.dark *){mix-blend-mode:screen}.dark\:shadow-none:is(.dark *){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.dark\:ring-primary\/opacity-heavy:is(.dark *){--tw-ring-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:ring-primary\/opacity-heavy:is(.dark *){--tw-ring-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.dark\:brightness-100:is(.dark *){--tw-brightness:brightness(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.dark\:drop-shadow-\[0_0_6px_color-mix\(in_srgb\,var\(--color-primary\)_80\%\,transparent\)\]:is(.dark *){--tw-drop-shadow-size:drop-shadow(0 0 6px var(--tw-drop-shadow-color,var(--color-primary)))}@supports (color:color-mix(in lab, red, red)){.dark\:drop-shadow-\[0_0_6px_color-mix\(in_srgb\,var\(--color-primary\)_80\%\,transparent\)\]:is(.dark *){--tw-drop-shadow-size:drop-shadow(0 0 6px var(--tw-drop-shadow-color,color-mix(in srgb,var(--color-primary) 80%,transparent)))}}.dark\:drop-shadow-\[0_0_6px_color-mix\(in_srgb\,var\(--color-primary\)_80\%\,transparent\)\]:is(.dark *){--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.dark\:invert-0:is(.dark *){--tw-invert:invert(0%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}@media (hover:hover){.dark\:group-hover\:border-stroke\/opacity-heavy:is(.dark *):is(:where(.group):hover *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:group-hover\:border-stroke\/opacity-heavy:is(.dark *):is(:where(.group):hover *){border-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}}.dark\:odd\:bg-white\/\[0\.02\]:is(.dark *):nth-child(odd){background-color:#ffffff05}@supports (color:color-mix(in lab, red, red)){.dark\:odd\:bg-white\/\[0\.02\]:is(.dark *):nth-child(odd){background-color:color-mix(in oklab, var(--color-white) 2%, transparent)}}@media (hover:hover){.dark\:hover\:border-accent-amber\/opacity-medium:is(.dark *):hover{border-color:var(--color-accent-amber)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-accent-amber\/opacity-medium:is(.dark *):hover{border-color:color-mix(in oklab, var(--color-accent-amber) 25%, transparent)}}.dark\:hover\:border-accent-cyan\/opacity-heavy:is(.dark *):hover{border-color:var(--color-accent-cyan)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-accent-cyan\/opacity-heavy:is(.dark *):hover{border-color:color-mix(in oklab, var(--color-accent-cyan) 50%, transparent)}}.dark\:hover\:border-indigo-500\/50:is(.dark *):hover{border-color:#625fff80}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-indigo-500\/50:is(.dark *):hover{border-color:color-mix(in oklab, var(--color-indigo-500) 50%, transparent)}}.dark\:hover\:border-primary:is(.dark *):hover,.dark\:hover\:border-primary\/opacity-heavy:is(.dark *):hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-primary\/opacity-heavy:is(.dark *):hover{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.dark\:hover\:border-primary\/opacity-medium:is(.dark *):hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-primary\/opacity-medium:is(.dark *):hover{border-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.dark\:hover\:border-secondary\/opacity-heavy:is(.dark *):hover{border-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-secondary\/opacity-heavy:is(.dark *):hover{border-color:color-mix(in oklab, var(--color-secondary) 50%, transparent)}}.dark\:hover\:border-stroke:is(.dark *):hover,.dark\:hover\:border-stroke\/opacity-medium:is(.dark *):hover{border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-stroke\/opacity-medium:is(.dark *):hover{border-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}.dark\:hover\:border-white\/15:is(.dark *):hover{border-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-white\/15:is(.dark *):hover{border-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.dark\:hover\:bg-accent-red\/opacity-medium:is(.dark *):hover{background-color:var(--color-accent-red)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-accent-red\/opacity-medium:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-accent-red) 25%, transparent)}}.dark\:hover\:bg-background\/20:is(.dark *):hover{background-color:var(--color-background)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-background\/20:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-background) 20%, transparent)}}.dark\:hover\:bg-background\/30:is(.dark *):hover{background-color:var(--color-background)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-background\/30:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-background) 30%, transparent)}}.dark\:hover\:bg-indigo-500\/20:is(.dark *):hover{background-color:#625fff33}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-indigo-500\/20:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-indigo-500) 20%, transparent)}}.dark\:hover\:bg-primary\/opacity-medium:is(.dark *):hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-primary\/opacity-medium:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.dark\:hover\:bg-stroke\/opacity-medium:is(.dark *):hover{background-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-stroke\/opacity-medium:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}.dark\:hover\:bg-stroke\/opacity-subtle:is(.dark *):hover{background-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-stroke\/opacity-subtle:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-border) 5%, transparent)}}.dark\:hover\:bg-surface\/opacity-heavy:is(.dark *):hover{background-color:var(--color-surface)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-surface\/opacity-heavy:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-surface) 50%, transparent)}}.dark\:hover\:bg-white\/\[0\.04\]:is(.dark *):hover{background-color:#ffffff0a}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-white\/\[0\.04\]:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-white) 4%, transparent)}}.dark\:hover\:bg-white\/opacity-light:is(.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-white\/opacity-light:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:hover\:bg-white\/opacity-medium:is(.dark *):hover{background-color:#ffffff40}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-white\/opacity-medium:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-white) 25%, transparent)}}.dark\:hover\:from-white\/10:is(.dark *):hover{--tw-gradient-from:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:from-white\/10:is(.dark *):hover{--tw-gradient-from:color-mix(in oklab, var(--color-white) 10%, transparent)}}.dark\:hover\:from-white\/10:is(.dark *):hover{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.dark\:hover\:to-white\/15:is(.dark *):hover{--tw-gradient-to:#ffffff26}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:to-white\/15:is(.dark *):hover{--tw-gradient-to:color-mix(in oklab, var(--color-white) 15%, transparent)}}.dark\:hover\:to-white\/15:is(.dark *):hover{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.dark\:hover\:text-accent-red:is(.dark *):hover{color:var(--color-accent-red)}.dark\:hover\:text-content-muted:is(.dark *):hover{color:var(--color-text-muted)}.dark\:hover\:text-content-primary:is(.dark *):hover,.dark\:hover\:text-content-primary\/opacity-heavy:is(.dark *):hover{color:var(--color-text-primary)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:text-content-primary\/opacity-heavy:is(.dark *):hover{color:color-mix(in oklab, var(--color-text-primary) 50%, transparent)}}.dark\:hover\:text-content-secondary:is(.dark *):hover{color:var(--color-text-secondary)}.dark\:hover\:text-white:is(.dark *):hover{color:var(--color-white)}}@media (width>=40rem){.dark\:sm\:border-stroke\/opacity-medium:is(.dark *){border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.dark\:sm\:border-stroke\/opacity-medium:is(.dark *){border-color:color-mix(in oklab, var(--color-border) 25%, transparent)}}}@media (width>=64rem){.lg\:dark\:block:is(.dark *){display:block}}:root{--openhop-blue:#3b82f6;--openhop-blue-light:#60a5fa;--openhop-purple:#8b5cf6;--openhop-purple-light:#a855f7;--openhop-gradient:linear-gradient(135deg, var(--openhop-blue) 0%, var(--openhop-purple) 100%);--color-surface:#fff;--color-surface-elevated:#f8fbff;--color-background:#f6f8ff;--color-background-soft:#eef3ff;--color-background-mute:#e4eafb;--color-heading:#020617;--color-text-primary:#0f172a;--color-text-secondary:#334155;--color-text-muted:#64748b;--color-text:var(--color-text-secondary);--color-border:#cbd5e1;--color-border-subtle:#e2e8f0;--color-border-hover:#94a3b8;--color-primary:var(--openhop-blue);--color-secondary:var(--openhop-purple);--color-accent-cyan:#38bdf8;--color-accent-green:#22c55e;--color-accent-green-light:#86efac;--color-accent-orange:#c2410c;--color-accent-amber:#f59e0b;--color-accent-purple:var(--openhop-purple);--color-accent-red:#ef4444;--color-primary-bg:#dbeafe;--color-secondary-bg:#ede9fe;--color-accent-cyan-bg:#e0f2fe;--color-accent-green-bg:#dcfce7;--color-accent-purple-bg:#ede9fe;--color-accent-red-bg:#fee2e2;--color-badge-cyan-bg:#dbeafe;--color-badge-cyan-text:#2563eb;--color-badge-neutral-bg:#f1f5f9;--color-badge-neutral-text:#334155;--color-glass-bg:#ffffffb8;--color-glass-border:#3b82f614;--color-glass-shadow:0 8px 32px #3b82f60f, 0 2px 8px #00000008;--color-glass-green-bg:linear-gradient(135deg, #22c55e1f, #22c55e0a);--color-glass-green-border:#22c55e2e;--color-glass-orange-bg:linear-gradient(135deg, #fb923c1f, #fb923c0a);--color-glass-orange-border:#fb923c2e;--section-gap:160px;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--nav-hover-label-shadow:0 0 8px #3b82f640;--nav-hover-icon-shadow:drop-shadow(0 0 4px #3b82f659)}.dark{--openhop-blue:#60a5fa;--openhop-purple:#a855f7;--openhop-gradient:linear-gradient(135deg, var(--openhop-blue) 0%, var(--openhop-purple) 100%);--color-background:#05070d;--color-background-soft:#05070d;--color-background-mute:#0d121f;--color-surface:#05070d;--color-surface-elevated:#0d121f;--color-heading:#fff;--color-text-primary:#f8fafc;--color-text-secondary:#cbd5e1;--color-text-muted:#94a3b8;--color-text:var(--color-text-secondary);--color-border:#374151;--color-border-subtle:#1f2937;--color-border-hover:#4b5563;--color-primary:var(--openhop-blue);--color-secondary:var(--openhop-purple);--color-accent-cyan:#38bdf8;--color-accent-green:#4ade80;--color-accent-green-light:#bbf7d0;--color-accent-orange:#ea580c;--color-accent-amber:#fbbf24;--color-accent-purple:#c084fc;--color-accent-red:#f87171;--color-primary-bg:#1e3a8a;--color-secondary-bg:#581c87;--color-accent-cyan-bg:#164e63;--color-accent-green-bg:#14532d;--color-accent-purple-bg:#581c87;--color-accent-red-bg:#7f1d1d;--color-badge-cyan-bg:#3b82f626;--color-badge-cyan-text:#93c5fd;--color-badge-neutral-bg:#1f2937;--color-badge-neutral-text:#cbd5e1;--color-glass-bg:#111827b8;--color-glass-border:#60a5fa14;--color-glass-shadow:0 12px 40px #00000059;--color-glass-green-bg:linear-gradient(135deg, #22c55e26, #22c55e0d);--color-glass-green-border:#22c55e26;--color-glass-orange-bg:linear-gradient(135deg, #fb923c26, #fb923c0d);--color-glass-orange-border:#fb923c26;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--nav-hover-label-shadow:0 0 4px var(--color-surface), 0 0 10px var(--openhop-blue), 0 0 20px var(--openhop-purple);--nav-hover-icon-shadow:drop-shadow(0 0 5px var(--openhop-blue))}html,body,#app,.dark html,.dark body,.dark #app{background-color:var(--color-background);color:var(--color-text)}body{text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;min-height:100vh;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-size:15px;line-height:1.6;transition:color .5s,background-color .5s}h1,h2,h3,h4,h5,h6{font-family:Michroma,sans-serif;font-weight:700}:root{--app-safe-area-top:0px;--app-safe-area-right:0px;--app-safe-area-bottom:0px;--app-safe-area-left:0px}html{-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}html,body,#app{width:100%;max-width:100%;min-height:100dvh}html,body{overflow-x:hidden}html.is-mobile-app{--app-safe-area-top:env(safe-area-inset-top,0px);--app-safe-area-right:env(safe-area-inset-right,0px);--app-safe-area-bottom:env(safe-area-inset-bottom,0px);--app-safe-area-left:env(safe-area-inset-left,0px)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}.glass-card[data-v-7aba76c4]{background:color-mix(in srgb, var(--color-surface-elevated) 70%, transparent);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);border:1px solid var(--color-glass-border)}@keyframes ping-7aba76c4{75%,to{opacity:0;transform:scale(2)}}@keyframes ping-fast-7aba76c4{0%{opacity:1;transform:scale(1)}75%,to{opacity:0;transform:scale(4)}}.animate-ping[data-v-7aba76c4]{animation:cubic-bezier(0,0,.2,1) infinite ping-7aba76c4}.animate-ping-fast[data-v-7aba76c4]{animation:.8s cubic-bezier(0,0,.2,1) 3 ping-fast-7aba76c4}.nav-expand-enter-active[data-v-c3bfa5d2],.nav-expand-leave-active[data-v-c3bfa5d2]{transform-origin:top;transition:opacity .15s,transform .15s}.nav-expand-enter-from[data-v-c3bfa5d2],.nav-expand-leave-to[data-v-c3bfa5d2]{opacity:0;transform:scaleY(.95)translateY(-4px)}.nav-children>div[data-v-c3bfa5d2]{position:relative}.nav-children>div[data-v-c3bfa5d2]:before{content:"";background:var(--color-border-subtle);width:1px;position:absolute;top:0;bottom:0;left:0}.nav-root-children>div[data-v-c3bfa5d2]:first-child:before{top:-10px}.nav-nested-children>div[data-v-c3bfa5d2]:first-child:before{top:-8px}.nav-children>div[data-v-c3bfa5d2]:last-child:before{bottom:calc(100% - 16px)}.nav-children>.nav-item-active[data-v-c3bfa5d2]:after,.nav-children>.nav-has-active[data-v-c3bfa5d2]:after{content:"";background:var(--color-primary);width:1px;position:absolute;top:0;bottom:calc(100% - 16px);left:0}.nav-children>.nav-precedes-active[data-v-c3bfa5d2]:after{content:"";background:var(--color-primary);width:1px;position:absolute;top:0;bottom:0;left:0}.nav-nested-children>div:first-child.nav-item-active[data-v-c3bfa5d2]:after,.nav-nested-children>div:first-child.nav-has-active[data-v-c3bfa5d2]:after,.nav-nested-children>div:first-child.nav-precedes-active[data-v-c3bfa5d2]:after{top:-8px}.nav-root-children>div:first-child.nav-item-active[data-v-c3bfa5d2]:after,.nav-root-children>div:first-child.nav-has-active[data-v-c3bfa5d2]:after,.nav-root-children>div:first-child.nav-precedes-active[data-v-c3bfa5d2]:after{top:-10px}button:hover .nav-label[data-v-c3bfa5d2]{text-shadow:var(--nav-hover-label-shadow)}button:hover svg[data-v-c3bfa5d2]{filter:var(--nav-hover-icon-shadow)}.nav-tick[data-v-c3bfa5d2]{pointer-events:none;background:var(--color-border-subtle);width:4px;height:1px;position:absolute;top:16px;left:0}.nav-item-active>.nav-tick[data-v-c3bfa5d2],.nav-has-active>.nav-tick[data-v-c3bfa5d2]{background:var(--color-primary)}.backdrop-enter-active[data-v-cf2b6b93],.backdrop-leave-active[data-v-cf2b6b93]{transition:opacity .3s}.backdrop-enter-from[data-v-cf2b6b93],.backdrop-leave-to[data-v-cf2b6b93]{opacity:0}.user-menu-item:hover span[data-v-79281e9e]{text-shadow:var(--nav-hover-label-shadow)}.user-menu-item:hover svg[data-v-79281e9e]{filter:var(--nav-hover-icon-shadow)}body{background-color:var(--color-background);color:var(--color-text);margin:0;padding:0;transition:background-color .3s,color .3s}.dark body{background-color:var(--color-background);color:var(--color-text)}.dark html{scrollbar-width:thin;scrollbar-color:var(--color-border-hover) var(--color-background-mute)}.dark html::-webkit-scrollbar{width:8px}.dark html::-webkit-scrollbar-track{background:var(--color-background-mute)}.dark html::-webkit-scrollbar-thumb{background-color:var(--color-border-hover);border-radius:4px}.dark html::-webkit-scrollbar-thumb:hover{background-color:var(--color-text-muted)}html{scrollbar-width:thin;scrollbar-color:var(--color-border) var(--color-background-soft)}html::-webkit-scrollbar{width:8px}html::-webkit-scrollbar-track{background:var(--color-background-soft)}html::-webkit-scrollbar-thumb{background-color:var(--color-border);border-radius:4px}html::-webkit-scrollbar-thumb:hover{background-color:var(--color-border-hover)}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.scrollbar-hide::-webkit-scrollbar{display:none} diff --git a/repeater/web/html/assets/index-Cl4Dij8v.js b/repeater/web/html/assets/index-DF5glAZc.js similarity index 99% rename from repeater/web/html/assets/index-Cl4Dij8v.js rename to repeater/web/html/assets/index-DF5glAZc.js index 0952aa2..620c80a 100644 --- a/repeater/web/html/assets/index-Cl4Dij8v.js +++ b/repeater/web/html/assets/index-DF5glAZc.js @@ -1 +1 @@ -import{A as e,C as t,D as n,E as r,H as i,N as a,P as o,T as s,U as c,X as l,Y as u,_t as d,c as f,f as p,gt as m,h,ht as g,i as _,j as v,k as y,l as b,m as x,o as S,p as C,r as w,s as T,u as E,v as D,w as O,x as k,y as A}from"./runtime-core.esm-bundler-CINEgm0a.js";import{a as j,l as M,n as N,o as P,t as F}from"./runtime-dom.esm-bundler-B3VeUO8l.js";import{_ as I,a as L,g as ee,h as R,i as z,l as B,r as V,s as H,t as U,u as te,y as W}from"./api-CP9MgmUS.js";import{t as ne}from"./packets-DqaKkuHX.js";import{t as re}from"./system-CGj1WgG8.js";import{n as G,r as K,t as q}from"./dataService-CodM3OZh.js";import{t as J}from"./createLucideIcon-D-_sbJKW.js";import{t as ie}from"./useTheme-vbCn9P26.js";import{t as Y}from"./Spinner-CMJUE3iy.js";import{n as ae,r as oe,t as se}from"./constants-C3rXUIAq.js";import{t as ce}from"./websocket-CWIil-yT.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var le=`/assets/meshcore-DQNtEl5I.svg`,ue=Symbol(`navActionHandlers`),X=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},de={},fe={width:`23`,height:`25`,viewBox:`0 0 23 25`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`};function pe(e,t){return s(),E(`svg`,fe,[...t[0]||=[T(`path`,{d:`M2.84279 2.25795C2.90709 1.12053 3.17879 0.625914 3.95795 0.228723C4.79631 -0.198778 6.11858 0.000168182 7.67449 0.788054C8.34465 1.12757 8.41289 1.13448 9.58736 0.983905C11.1485 0.783681 13.1582 0.784388 14.5991 0.985738C15.6887 1.13801 15.7603 1.1304 16.4321 0.790174C18.6406 -0.328212 20.3842 -0.255036 21.0156 0.982491C21.3308 1.6002 21.3893 3.20304 21.1449 4.52503C21.0094 5.25793 21.0238 5.34943 21.3502 5.83037C23.6466 9.21443 21.9919 14.6998 18.0569 16.7469C17.7558 16.9036 17.502 17.0005 17.2952 17.0795C16.6602 17.3219 16.4674 17.3956 16.7008 18.5117C16.8132 19.0486 16.9486 20.3833 17.0018 21.478C17.098 23.4567 17.0966 23.4705 16.7495 23.8742C16.2772 24.4233 15.5963 24.4326 15.135 23.8962C14.8341 23.5464 14.8047 23.3812 14.8047 22.0315C14.8047 20.037 14.5861 18.7113 14.0695 17.5753C13.4553 16.2235 13.9106 15.7194 15.3154 15.4173C17.268 14.9973 18.793 13.7923 19.643 11.9978C20.4511 10.2921 20.5729 7.93485 19.1119 6.50124C18.6964 6.00746 18.6674 5.56022 18.9641 4.21159C19.075 3.70754 19.168 3.05725 19.1707 2.76637C19.1749 2.30701 19.1331 2.23764 18.8509 2.23764C18.6724 2.23764 17.9902 2.49736 17.3352 2.81474L16.2897 3.32145C16.1947 3.36751 16.0883 3.38522 15.9834 3.37318C13.3251 3.06805 10.7991 3.06334 8.12774 3.37438C8.02244 3.38663 7.91563 3.36892 7.82025 3.32263L6.77535 2.81559C6.12027 2.49764 5.43813 2.23764 5.25963 2.23764C4.84693 2.23764 4.84072 2.54233 5.2169 4.35258C5.44669 5.45816 5.60133 5.70451 4.93703 6.58851C3.94131 7.91359 3.69258 9.55902 4.22654 11.2878C4.89952 13.4664 6.54749 14.9382 8.86436 15.4292C10.261 15.7253 10.6261 16.1115 10.0928 17.713C9.67293 18.9734 9.40748 19.2982 8.79738 19.2982C7.97649 19.2982 7.46228 18.5871 7.74527 17.843C7.86991 17.5151 7.83283 17.4801 7.06383 17.1996C4.71637 16.3437 2.9209 14.4254 2.10002 11.8959C1.46553 9.94098 1.74471 7.39642 2.76257 5.85843C3.10914 5.33477 3.1145 5.29036 2.95277 4.28787C2.86126 3.72037 2.81177 2.80699 2.84279 2.25795Z`,fill:`currentColor`},null,-1),T(`path`,{d:`M2.02306 16.5589C1.68479 16.0516 0.999227 15.9144 0.491814 16.2527C-0.0155884 16.591 -0.152708 17.2765 0.185564 17.7839C0.435301 18.1586 0.734065 18.4663 0.987777 18.72C1.03455 18.7668 1.08 18.8119 1.12438 18.856C1.3369 19.0671 1.52455 19.2535 1.71302 19.4748C2.12986 19.964 2.54572 20.623 2.78206 21.8047C2.88733 22.3311 3.26569 22.6147 3.47533 22.7386C3.70269 22.8728 3.9511 22.952 4.15552 23.0036C4.57369 23.109 5.08133 23.1638 5.56309 23.1957C6.09196 23.2308 6.665 23.2422 7.17743 23.2453C7.1778 23.8547 7.67202 24.3487 8.28162 24.3487C8.89146 24.3487 9.38582 23.8543 9.38582 23.2445V22.1403C9.38582 21.5305 8.89146 21.0361 8.28162 21.0361C8.17753 21.0361 8.06491 21.0364 7.94562 21.0369C7.29761 21.0389 6.45295 21.0414 5.70905 20.9922C5.35033 20.9684 5.05544 20.9347 4.8392 20.8936C4.50619 19.5863 3.96821 18.7165 3.39415 18.0426C3.14038 17.7448 2.87761 17.4842 2.66387 17.2722C2.62385 17.2326 2.58556 17.1946 2.54935 17.1584C2.30273 16.9118 2.1414 16.7365 2.02306 16.5589Z`,fill:`currentColor`},null,-1)]])}var me=X(de,[[`render`,pe]]),he={},ge={viewBox:`0 0 24 24`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`};function _e(e,t){return s(),E(`svg`,ge,[...t[0]||=[T(`path`,{d:`M20.317 4.369a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.078.037c-.211.375-.444.864-.608 1.249a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.249.077.077 0 0 0-.078-.037 19.736 19.736 0 0 0-4.885 1.515.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.056 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.027 14.16 14.16 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.927 1.793 8.18 1.793 12.061 0a.074.074 0 0 1 .078.009c.12.098.246.196.373.293a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.04.107c.36.698.769 1.361 1.225 1.994a.076.076 0 0 0 .084.028 19.876 19.876 0 0 0 6.002-3.03.077.077 0 0 0 .031-.055c.5-5.177-.838-9.674-3.548-13.66a.061.061 0 0 0-.031-.028ZM8.02 15.331c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.211 0 2.166 1.095 2.157 2.419 0 1.334-.955 2.419-2.157 2.419Zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.211 0 2.166 1.095 2.157 2.419 0 1.334-.946 2.419-2.157 2.419Z`},null,-1)]])}var ve=X(he,[[`render`,_e]]),ye={},be={width:`17`,height:`24`,viewBox:`0 0 17 24`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`};function xe(e,t){return s(),E(`svg`,be,[...t[0]||=[p(``,12)]])}var Se=X(ye,[[`render`,xe]]),Ce={},we={width:`800px`,height:`800px`,viewBox:`0 -1.5 20 20`,version:`1.1`,xmlns:`http://www.w3.org/2000/svg`,"xmlns:xlink":`http://www.w3.org/1999/xlink`,class:`w-full h-full`};function Te(e,t){return s(),E(`svg`,we,[...t[0]||=[T(`g`,{id:`Page-1`,stroke:`none`,"stroke-width":`1`,fill:`none`,"fill-rule":`evenodd`},[T(`g`,{transform:`translate(-420.000000, -3641.000000)`,fill:`currentColor`},[T(`g`,{id:`icons`,transform:`translate(56.000000, 160.000000)`},[T(`path`,{d:`M378.195439,3483.828 L376.781439,3485.242 C378.195439,3486.656 378.294439,3489.588 376.880439,3491.002 L378.294439,3492.417 C380.415439,3490.295 380.316439,3485.949 378.195439,3483.828 M381.023439,3481 L379.609439,3482.414 C382.438439,3485.242 382.537439,3491.002 379.708439,3493.831 L381.122439,3495.245 C385.365439,3491.002 384.559439,3484.535 381.023439,3481 M375.432439,3486.737 C375.409439,3486.711 375.392439,3486.682 375.367439,3486.656 L375.363439,3486.66 C374.582439,3485.879 373.243439,3485.952 372.536439,3486.659 C371.829439,3487.366 371.831439,3488.778 372.538439,3489.485 C372.547439,3489.494 372.558439,3489.499 372.567439,3489.508 C372.590439,3489.534 372.607439,3489.563 372.632439,3489.588 L372.636439,3489.585 C373.201439,3490.15 373.000439,3488.284 373.000439,3498 L375.000439,3498 C375.000439,3488.058 374.753439,3490.296 375.463439,3489.586 C376.170439,3488.879 376.168439,3487.467 375.461439,3486.76 C375.452439,3486.751 375.441439,3486.746 375.432439,3486.737 M371.119439,3485.242 L369.705439,3483.828 C367.584439,3485.949 367.683439,3490.295 369.804439,3492.417 L371.218439,3491.002 C369.804439,3489.588 369.705439,3486.656 371.119439,3485.242 M368.390439,3493.831 L366.976439,3495.245 C363.440439,3491.709 362.634439,3485.242 366.877439,3481 L368.291439,3482.414 C365.462439,3485.242 365.561439,3491.002 368.390439,3493.831`,id:`radio_tower-[#1019]`})])])],-1)]])}var Ee=X(Ce,[[`render`,Te]]),De={class:`text-center`},Oe={class:`relative flex items-center justify-center mb-8`},Z={class:`relative w-32 h-32`},Q={class:`absolute left-1/2 top-1/2 transform -translate-x-1/2 -translate-y-1/2`},ke={key:0,class:`absolute inset-0 flex items-center justify-center`},Ae={key:1,class:`absolute inset-0 flex items-center justify-center`},je={key:2,class:`absolute inset-0`},Me={class:`mb-6`},Ne={key:0,class:`text-content-primary text-lg`},Pe={key:1,class:`text-accent-green text-lg font-medium`},Fe={key:2,class:`text-secondary text-lg`},Ie={key:3,class:`text-accent-red text-lg`},Le={key:4,class:`text-content-secondary dark:text-content-muted`},Re={key:5,class:`mt-3`},ze={key:0,class:`text-secondary text-sm`},Be={key:1,class:`text-accent-red text-sm`},Ve={key:0,class:`flex gap-3`},He={key:1,class:`text-content-muted text-sm`},Ue=X(h({name:`AdvertModal`,__name:`AdvertModal`,props:{isOpen:{type:Boolean},isLoading:{type:Boolean},isSuccess:{type:Boolean},error:{default:null}},emits:[`close`,`send`],setup(e,{emit:t}){let n=e,r=t,i=c(!1),a=c(!1),o=c(!1);v(()=>n.isOpen,e=>{e?(i.value=!0,setTimeout(()=>{a.value=!0},50)):(a.value=!1,o.value=!1,setTimeout(()=>{i.value=!1},300))},{immediate:!0}),v(()=>n.isLoading,e=>{e||setTimeout(()=>{o.value=!1},1e3)});let l=()=>{n.isLoading||r(`close`)},u=()=>{n.isLoading||(o.value=!0,r(`send`))},p=e=>e?.includes(`Network error - no response received`)||e?.includes(`timeout`);return(t,n)=>(s(),f(_,{to:`body`},[i.value?(s(),E(`div`,{key:0,class:`modal-backdrop`,onClick:M(l,[`self`])},[T(`div`,{class:g([`relative bg-white dark:bg-surface-elevated backdrop-blur-xl rounded-[20px] p-8 max-w-md w-full transform transition-all duration-300 border border-stroke-subtle dark:border-white/opacity-light`,a.value?`scale-100 opacity-100`:`scale-95 opacity-0`])},[e.isLoading?b(``,!0):(s(),E(`button`,{key:0,onClick:l,class:`absolute top-4 right-4 text-content-secondary dark:text-content-muted hover:text-content-primary dark:hover:text-content-primary transition-colors p-2`},[...n[0]||=[T(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[T(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])),T(`div`,De,[n[6]||=T(`h2`,{class:`text-content-primary text-xl font-semibold mb-6`},` Send Advertisement `,-1),T(`div`,Oe,[T(`div`,Z,[T(`div`,Q,[x(Ee,{class:g([`w-16 h-16 transition-all duration-500`,[e.isLoading?`animate-pulse`:``,e.isSuccess?`text-accent-green`:e.error&&!p(e.error)?`text-accent-red`:`text-primary`]]),style:m({filter:e.isLoading?`drop-shadow(0 0 8px currentColor)`:e.isSuccess?`drop-shadow(0 0 8px var(--color-accent-green))`:e.error&&!p(e.error)?`drop-shadow(0 0 8px var(--color-accent-red))`:`drop-shadow(0 0 4px var(--color-primary))`})},null,8,[`class`,`style`])]),e.isLoading||e.isSuccess?(s(),E(`div`,ke,[T(`div`,{class:g([`absolute w-16 h-16 rounded-full border-2 animate-ping`,[e.isSuccess?`border-accent-green/opacity-heavy`:`border-primary/opacity-heavy`]]),style:{"animation-duration":`1.5s`}},null,2),T(`div`,{class:g([`absolute w-24 h-24 rounded-full border-2 animate-ping`,[e.isSuccess?`border-accent-green/opacity-heavy`:`border-primary/opacity-heavy`]]),style:{"animation-duration":`2s`,"animation-delay":`0.3s`}},null,2),T(`div`,{class:g([`absolute w-32 h-32 rounded-full border-2 animate-ping`,[e.isSuccess?`border-accent-green/opacity-medium`:`border-primary/opacity-medium`]]),style:{"animation-duration":`2.5s`,"animation-delay":`0.6s`}},null,2)])):b(``,!0),o.value?(s(),E(`div`,Ae,[...n[1]||=[T(`div`,{class:`absolute w-8 h-8 rounded-full border-4 border-secondary animate-ping-fast`},null,-1),T(`div`,{class:`absolute w-16 h-16 rounded-full border-3 border-secondary/opacity-heavy animate-ping-fast`,style:{"animation-delay":`0.1s`}},null,-1),T(`div`,{class:`absolute w-24 h-24 rounded-full border-2 border-secondary/opacity-heavy animate-ping-fast`,style:{"animation-delay":`0.2s`}},null,-1),T(`div`,{class:`absolute w-32 h-32 rounded-full border-2 border-secondary/opacity-medium animate-ping-fast`,style:{"animation-delay":`0.3s`}},null,-1)]])):b(``,!0),e.isLoading||e.isSuccess?(s(),E(`div`,je,[T(`div`,{class:g([`absolute top-2 right-2 w-4 h-4 rounded-full transition-all duration-500 animate-pulse`,[e.isSuccess?`bg-accent-green shadow-lg shadow-accent-green/50`:`bg-primary/opacity-heavy shadow-lg shadow-primary/30`]]),style:{"animation-delay":`0.5s`}},[...n[2]||=[T(`div`,{class:`w-2 h-2 bg-white rounded-full mx-auto mt-1`},null,-1)]],2),T(`div`,{class:g([`absolute bottom-2 left-2 w-4 h-4 rounded-full transition-all duration-500 animate-pulse`,[e.isSuccess?`bg-accent-green shadow-lg shadow-accent-green/50`:`bg-primary/opacity-heavy shadow-lg shadow-primary/30`]]),style:{"animation-delay":`1s`}},[...n[3]||=[T(`div`,{class:`w-2 h-2 bg-white rounded-full mx-auto mt-1`},null,-1)]],2),T(`div`,{class:g([`absolute top-1/2 right-1 w-4 h-4 rounded-full transition-all duration-500 animate-pulse`,[e.isSuccess?`bg-accent-green shadow-lg shadow-accent-green/50`:`bg-primary/opacity-heavy shadow-lg shadow-primary/30`]]),style:{"animation-delay":`1.5s`,transform:`translateY(-50%)`}},[...n[4]||=[T(`div`,{class:`w-2 h-2 bg-white rounded-full mx-auto mt-1`},null,-1)]],2),T(`div`,{class:g([`absolute top-3 left-3 w-4 h-4 rounded-full transition-all duration-500 animate-pulse`,[e.isSuccess?`bg-accent-green shadow-lg shadow-accent-green/50`:`bg-primary/opacity-heavy shadow-lg shadow-primary/30`]]),style:{"animation-delay":`2s`}},[...n[5]||=[T(`div`,{class:`w-2 h-2 bg-white rounded-full mx-auto mt-1`},null,-1)]],2)])):b(``,!0)])]),T(`div`,Me,[e.isLoading?(s(),E(`p`,Ne,` Broadcasting advertisement... `)):e.isSuccess?(s(),E(`p`,Pe,` Advertisement sent successfully! `)):e.error&&p(e.error)?(s(),E(`p`,Fe,` Advertisement likely sent `)):e.error?(s(),E(`p`,Ie,`Failed to send advertisement`)):(s(),E(`p`,Le,` This will broadcast your node's presence to nearby nodes. `)),e.error?(s(),E(`div`,Re,[p(e.error)?(s(),E(`p`,ze,` Network timeout occurred, but the advertisement may have been successfully transmitted to nearby nodes. `)):(s(),E(`p`,Be,d(e.error),1))])):b(``,!0)]),!e.isLoading&&!e.isSuccess?(s(),E(`div`,Ve,[T(`button`,{onClick:l,class:`flex-1 bg-background-mute dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-light hover:border-primary dark:hover:border-primary rounded-[10px] px-6 py-3 text-content-primary hover:bg-stroke-subtle dark:hover:bg-white/opacity-light transition-all duration-200`},` Cancel `),T(`button`,{onClick:u,class:g([`flex-1 rounded-[10px] px-6 py-3 font-medium transition-all duration-200 shadow-lg`,[e.error&&p(e.error)?`bg-secondary hover:bg-secondary/opacity-heavy text-background hover:shadow-secondary/opacity-medium`:`bg-primary hover:bg-primary/opacity-heavy text-background hover:shadow-primary/opacity-medium`]])},d(e.error&&p(e.error)?`Try Again`:`Send Advertisement`),3)])):b(``,!0),e.isSuccess?(s(),E(`div`,He,`Closing automatically...`)):b(``,!0)])],2)])):b(``,!0)]))}}),[[`__scopeId`,`data-v-7aba76c4`]]),We=`pymc_pref_`;function Ge(e,t){try{let n=localStorage.getItem(We+e);return n===null?t:JSON.parse(n)}catch(n){return console.warn(`Failed to get preference ${e}:`,n),t}}function Ke(e,t){try{localStorage.setItem(We+e,JSON.stringify(t))}catch(t){console.warn(`Failed to set preference ${e}:`,t)}}function qe(e){try{localStorage.removeItem(We+e)}catch(t){console.warn(`Failed to remove preference ${e}:`,t)}}var Je=`sidebar-pin-enabled`,Ye=`sidebar-fold-state`,$=c(Ge(Je,!1)),Xe=c($.value?Ge(Ye,{}):{});function Ze(){$.value=!$.value,Ke(Je,$.value),$.value||(Xe.value={},qe(Ye))}function Qe(e,t){$.value&&(Xe.value={...Xe.value,[e]:t},Ke(Ye,Xe.value))}function $e(e){if(!$.value)return null;let t=Xe.value[e];return t===void 0?null:t}function et(){return{isPinned:i($),togglePin:Ze,recordFold:Qe,getRestoredFold:$e}}var tt=J(`activity`,[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`,key:`169zse`}]]),nt=J(`antenna`,[[`path`,{d:`M2 12 7 2`,key:`117k30`}],[`path`,{d:`m7 12 5-10`,key:`1tvx22`}],[`path`,{d:`m12 12 5-10`,key:`ev1o1a`}],[`path`,{d:`m17 12 5-10`,key:`1e4ti3`}],[`path`,{d:`M4.5 7h15`,key:`vlsxkz`}],[`path`,{d:`M12 16v6`,key:`c8a4gj`}]]),rt=J(`bot`,[[`path`,{d:`M12 8V4H8`,key:`hb8ula`}],[`rect`,{width:`16`,height:`12`,x:`4`,y:`8`,rx:`2`,key:`enze0r`}],[`path`,{d:`M2 14h2`,key:`vft8re`}],[`path`,{d:`M20 14h2`,key:`4cs60a`}],[`path`,{d:`M15 13v2`,key:`1xurst`}],[`path`,{d:`M9 13v2`,key:`rq6x2g`}]]),it=J(`building-2`,[[`path`,{d:`M10 12h4`,key:`a56b0p`}],[`path`,{d:`M10 8h4`,key:`1sr2af`}],[`path`,{d:`M14 21v-3a2 2 0 0 0-4 0v3`,key:`1rgiei`}],[`path`,{d:`M6 10H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-2`,key:`secmi2`}],[`path`,{d:`M6 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16`,key:`16ra0t`}]]),at=J(`cable`,[[`path`,{d:`M17 19a1 1 0 0 1-1-1v-2a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2a1 1 0 0 1-1 1z`,key:`trhst0`}],[`path`,{d:`M17 21v-2`,key:`ds4u3f`}],[`path`,{d:`M19 14V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V10`,key:`1mo9zo`}],[`path`,{d:`M21 21v-2`,key:`eo0ou`}],[`path`,{d:`M3 5V3`,key:`1k5hjh`}],[`path`,{d:`M4 10a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2a2 2 0 0 1-2 2z`,key:`1dd30t`}],[`path`,{d:`M7 5V3`,key:`1t1388`}]]),ot=J(`chart-no-axes-column`,[[`path`,{d:`M5 21v-6`,key:`1hz6c0`}],[`path`,{d:`M12 21V3`,key:`1lcnhd`}],[`path`,{d:`M19 21V9`,key:`unv183`}]]),st=J(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),ct=J(`circle-question-mark`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3`,key:`1u773s`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),lt=J(`cpu`,[[`path`,{d:`M12 20v2`,key:`1lh1kg`}],[`path`,{d:`M12 2v2`,key:`tus03m`}],[`path`,{d:`M17 20v2`,key:`1rnc9c`}],[`path`,{d:`M17 2v2`,key:`11trls`}],[`path`,{d:`M2 12h2`,key:`1t8f8n`}],[`path`,{d:`M2 17h2`,key:`7oei6x`}],[`path`,{d:`M2 7h2`,key:`asdhe0`}],[`path`,{d:`M20 12h2`,key:`1q8mjw`}],[`path`,{d:`M20 17h2`,key:`1fpfkl`}],[`path`,{d:`M20 7h2`,key:`1o8tra`}],[`path`,{d:`M7 20v2`,key:`4gnj0m`}],[`path`,{d:`M7 2v2`,key:`1i4yhu`}],[`rect`,{x:`4`,y:`4`,width:`16`,height:`16`,rx:`2`,key:`1vbyd7`}],[`rect`,{x:`8`,y:`8`,width:`8`,height:`8`,rx:`1`,key:`z9xiuo`}]]),ut=J(`database-backup`,[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`,key:`msslwz`}],[`path`,{d:`M3 12a9 3 0 0 0 5 2.69`,key:`1ui2ym`}],[`path`,{d:`M21 9.3V5`,key:`6k6cib`}],[`path`,{d:`M3 5v14a9 3 0 0 0 6.47 2.88`,key:`i62tjy`}],[`path`,{d:`M12 12v4h4`,key:`1bxaet`}],[`path`,{d:`M13 20a5 5 0 0 0 9-3 4.5 4.5 0 0 0-4.5-4.5c-1.33 0-2.54.54-3.41 1.41L12 16`,key:`1f4ei9`}]]),dt=J(`database`,[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`,key:`msslwz`}],[`path`,{d:`M3 5V19A9 3 0 0 0 21 19V5`,key:`1wlel7`}],[`path`,{d:`M3 12A9 3 0 0 0 21 12`,key:`mv7ke4`}]]),ft=J(`eye`,[[`path`,{d:`M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0`,key:`1nclc0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),pt=J(`gauge`,[[`path`,{d:`m12 14 4-4`,key:`9kzdfg`}],[`path`,{d:`M3.34 19a10 10 0 1 1 17.32 0`,key:`19p75a`}]]),mt=J(`globe`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20`,key:`13o1zl`}],[`path`,{d:`M2 12h20`,key:`9i4pu4`}]]),ht=J(`key-round`,[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`,key:`1s6t7t`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`w0ekpg`}]]),gt=J(`layout-dashboard`,[[`rect`,{width:`7`,height:`9`,x:`3`,y:`3`,rx:`1`,key:`10lvy0`}],[`rect`,{width:`7`,height:`5`,x:`14`,y:`3`,rx:`1`,key:`16une8`}],[`rect`,{width:`7`,height:`9`,x:`14`,y:`12`,rx:`1`,key:`1hutg5`}],[`rect`,{width:`7`,height:`5`,x:`3`,y:`16`,rx:`1`,key:`ldoo1y`}]]),_t=J(`map-pin`,[[`path`,{d:`M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0`,key:`1r0f0z`}],[`circle`,{cx:`12`,cy:`10`,r:`3`,key:`ilqhr7`}]]),vt=J(`megaphone`,[[`path`,{d:`M11 6a13 13 0 0 0 8.4-2.8A1 1 0 0 1 21 4v12a1 1 0 0 1-1.6.8A13 13 0 0 0 11 14H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2z`,key:`q8bfy3`}],[`path`,{d:`M6 14a12 12 0 0 0 2.4 7.2 2 2 0 0 0 3.2-2.4A8 8 0 0 1 10 14`,key:`1853fq`}],[`path`,{d:`M8 6v8`,key:`15ugcq`}]]),yt=J(`memory-stick`,[[`path`,{d:`M12 12v-2`,key:`fwoke6`}],[`path`,{d:`M12 18v-2`,key:`qj6yno`}],[`path`,{d:`M16 12v-2`,key:`heuere`}],[`path`,{d:`M16 18v-2`,key:`s1ct0w`}],[`path`,{d:`M2 11h1.5`,key:`15p63e`}],[`path`,{d:`M20 18v-2`,key:`12ehxp`}],[`path`,{d:`M20.5 11H22`,key:`khsy7a`}],[`path`,{d:`M4 18v-2`,key:`1c3oqr`}],[`path`,{d:`M8 12v-2`,key:`1mwtfd`}],[`path`,{d:`M8 18v-2`,key:`qcmpov`}],[`rect`,{x:`2`,y:`6`,width:`20`,height:`10`,rx:`2`,key:`1qcswk`}]]),bt=J(`percent`,[[`line`,{x1:`19`,x2:`5`,y1:`5`,y2:`19`,key:`1x9vlm`}],[`circle`,{cx:`6.5`,cy:`6.5`,r:`2.5`,key:`4mh3h7`}],[`circle`,{cx:`17.5`,cy:`17.5`,r:`2.5`,key:`1mdrzq`}]]),xt=J(`pin`,[[`path`,{d:`M12 17v5`,key:`bb1du9`}],[`path`,{d:`M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z`,key:`1nkz8b`}]]),St=J(`radio`,[[`path`,{d:`M16.247 7.761a6 6 0 0 1 0 8.478`,key:`1fwjs5`}],[`path`,{d:`M19.075 4.933a10 10 0 0 1 0 14.134`,key:`ehdyv1`}],[`path`,{d:`M4.925 19.067a10 10 0 0 1 0-14.134`,key:`1q22gi`}],[`path`,{d:`M7.753 16.239a6 6 0 0 1 0-8.478`,key:`r2q7qm`}],[`circle`,{cx:`12`,cy:`12`,r:`2`,key:`1c9p78`}]]),Ct=J(`repeat-2`,[[`path`,{d:`m2 9 3-3 3 3`,key:`1ltn5i`}],[`path`,{d:`M13 18H7a2 2 0 0 1-2-2V6`,key:`1r6tfw`}],[`path`,{d:`m22 15-3 3-3-3`,key:`4rnwn2`}],[`path`,{d:`M11 6h6a2 2 0 0 1 2 2v10`,key:`2f72bc`}]]),wt=J(`scale`,[[`path`,{d:`M12 3v18`,key:`108xh3`}],[`path`,{d:`m19 8 3 8a5 5 0 0 1-6 0zV7`,key:`zcdpyk`}],[`path`,{d:`M3 7h1a17 17 0 0 0 8-2 17 17 0 0 0 8 2h1`,key:`1yorad`}],[`path`,{d:`m5 8 3 8a5 5 0 0 1-6 0zV7`,key:`eua70x`}],[`path`,{d:`M7 21h10`,key:`1b0cd5`}]]),Tt=J(`scroll-text`,[[`path`,{d:`M15 12h-5`,key:`r7krc0`}],[`path`,{d:`M15 8h-5`,key:`1khuty`}],[`path`,{d:`M19 17V5a2 2 0 0 0-2-2H4`,key:`zz82l3`}],[`path`,{d:`M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3`,key:`1ph1d7`}]]),Et=J(`server`,[[`rect`,{width:`20`,height:`8`,x:`2`,y:`2`,rx:`2`,ry:`2`,key:`ngkwjq`}],[`rect`,{width:`20`,height:`8`,x:`2`,y:`14`,rx:`2`,ry:`2`,key:`iecqi9`}],[`line`,{x1:`6`,x2:`6.01`,y1:`6`,y2:`6`,key:`16zg32`}],[`line`,{x1:`6`,x2:`6.01`,y1:`18`,y2:`18`,key:`nzw8ys`}]]),Dt=J(`settings`,[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`,key:`1i5ecw`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),Ot=J(`shield-check`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]),kt=J(`terminal`,[[`path`,{d:`M12 19h8`,key:`baeox8`}],[`path`,{d:`m4 17 6-6-6-6`,key:`1yngyt`}]]),At=J(`timer`,[[`line`,{x1:`10`,x2:`14`,y1:`2`,y2:`2`,key:`14vaq8`}],[`line`,{x1:`12`,x2:`15`,y1:`14`,y2:`11`,key:`17fdiu`}],[`circle`,{cx:`12`,cy:`14`,r:`8`,key:`1e1u0o`}]]),jt=J(`users-round`,[[`path`,{d:`M18 21a8 8 0 0 0-16 0`,key:`3ypg7q`}],[`circle`,{cx:`10`,cy:`8`,r:`5`,key:`o932ke`}],[`path`,{d:`M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3`,key:`10s06x`}]]),Mt=J(`wrench`,[[`path`,{d:`M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z`,key:`1ngwbx`}]]),Nt=J(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]),Pt={key:0,class:`nav-tick`,"aria-hidden":`true`},Ft={class:`nav-label flex-1 text-left`},It=X(h({name:`NavItem`,__name:`NavItem`,props:{item:{},depth:{},precedesActive:{type:Boolean},searchActive:{type:Boolean}},setup(t){let r=t,i=R(),o=ee(),u=S(()=>r.depth??0),p=D(ue,{});function m(e,t,n){let r=e.activeOn??(e.route?[e.route]:[]);return r.length===0||!r.some(e=>t===e||t.startsWith(e+`/`))?!1:e.params&&!e.children?Object.entries(e.params).every(([e,t])=>n[e]===t):!0}function h(e,t,n){return e.some(e=>e.children?h(e.children,t,n):m(e,t,n))}let _=S(()=>r.item.children?!1:m(r.item,i.path,i.query)),C=S(()=>!!r.item.children&&h(r.item.children,i.path,i.query)),O=S(()=>r.item.children?r.item.children.findIndex(e=>e.children?h(e.children,i.path,i.query):m(e,i.path,i.query)):-1),k=S(()=>!!r.item.children?.length),{getRestoredFold:A,recordFold:j}=et(),M=k.value?A(r.item.id):null,N=c(M===null?!1:M),P=S(()=>r.searchActive&&k.value||N.value);v(C,e=>{e&&(N.value=!0)},{immediate:!0}),v(N,e=>{k.value&&j(r.item.id,e)});function I(){N.value=!N.value}function L(){if(!r.item.route)return;let e=r.item.params?{...r.item.params}:void 0;o.push({path:r.item.route,query:e})}function z(){k.value?I():r.item.action?p[r.item.action]?.():L()}let B=S(()=>u.value>0),V=S(()=>{let e=`w-full rounded-[10px] py-1.5 flex items-center gap-1.5 text-sm font-medium transition-all duration-200`,t=B.value?`pl-2 pr-2`:`pl-4 pr-2`;return _.value?`${e} ${t} text-primary font-semibold border border-transparent`:`${e} ${t} text-content-primary hover:text-primary border border-transparent`}),H=S(()=>_.value?`w-3.5 h-3.5 flex-shrink-0 text-primary`:`w-3.5 h-3.5 flex-shrink-0 text-content-muted`);return(i,o)=>{let c=y(`NavItem`,!0);return s(),E(`div`,{class:g({"nav-item-active":_.value,"nav-has-active":C.value,"nav-precedes-active":r.precedesActive})},[B.value?(s(),E(`span`,Pt)):b(``,!0),T(`button`,{class:g(V.value),onClick:z},[t.item.icon?(s(),f(e(t.item.icon),{key:0,class:g(H.value)},null,8,[`class`])):b(``,!0),T(`span`,Ft,d(t.item.label),1),k.value?(s(),f(l(st),{key:1,class:g([`w-3 h-3 flex-shrink-0 transition-transform duration-200 text-content-muted`,P.value?`rotate-180`:``])},null,8,[`class`])):b(``,!0)],2),x(F,{name:`nav-expand`},{default:a(()=>[k.value&&P.value?(s(),E(`div`,{key:0,class:g([`nav-children mt-0 space-y-0`,u.value===0?`nav-root-children ml-[23px]`:`nav-nested-children ml-[15px]`])},[(s(!0),E(w,null,n(t.item.children,(e,n)=>(s(),f(c,{key:e.id,item:e,depth:u.value+1,"precedes-active":O.value>=0&&n{let e=n.data;if(e.length<2)return[];let t=e.map(e=>e.value),r=Math.min(...t),i=Math.max(...t)-r||1,a=n.height;return e.map((t,n)=>({x:Ht+n/(e.length-1)*(Vt-Ht*2),y:a-Ht-(t.value-r)/i*(a-Ht*2),value:t.value,timestamp:t.timestamp}))}),i=S(()=>r.value.map(e=>`${e.x.toFixed(1)},${e.y.toFixed(1)}`).join(` `)),a=S(()=>r.value.length>=2),o=c(null),l=c(null),u=c(0),p=c(0),h=S(()=>l.value===null?null:r.value[l.value]??null),g=S(()=>h.value?new Date(h.value.timestamp*1e3).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,hour12:!1}):``),v=c(!1),y=S(()=>({position:`fixed`,top:`${p.value+12}px`,left:v.value?`${u.value-110}px`:`${u.value+12}px`,zIndex:9999})),x=S(()=>h.value?(h.value.x-Ht)/(Vt-Ht*2)*100:0);function w(e){if(!o.value||r.value.length<2)return;let t=o.value.getBoundingClientRect(),n=Ht+Math.max(0,Math.min(1,(e.clientX-t.left)/t.width))*(Vt-Ht*2),i=0,a=1/0;r.value.forEach((e,t)=>{let r=Math.abs(e.x-n);rwindow.innerWidth-120}function D(){l.value=null}return t({hoveredPoint:h}),(t,n)=>a.value?(s(),E(`div`,{key:0,ref_key:`wrapperRef`,ref:o,class:`relative cursor-crosshair`,onMousemove:w,onMouseleave:D},[(s(),E(`svg`,{viewBox:`0 0 ${Vt} ${e.height}`,class:`w-full text-secondary`,style:m({height:`${e.height}px`}),fill:`none`,xmlns:`http://www.w3.org/2000/svg`},[T(`polyline`,{points:i.value,stroke:`currentColor`,"stroke-width":`1.5`,"stroke-linejoin":`round`,"stroke-linecap":`round`,fill:`none`,opacity:`0.7`},null,8,Rt),h.value?(s(),E(`circle`,{key:0,cx:h.value.x,cy:h.value.y,r:`2.5`,fill:`currentColor`,opacity:`0.9`},null,8,zt)):b(``,!0)],12,Lt)),h.value?(s(),E(`div`,{key:0,class:`absolute top-0 bottom-0 w-px bg-secondary opacity-40 pointer-events-none`,style:m({left:`${x.value}%`})},null,4)):b(``,!0),(s(),f(_,{to:`body`},[h.value?(s(),E(`div`,{key:0,class:`pointer-events-none px-2.5 py-2 rounded text-sm leading-snug bg-surface-elevated dark:bg-surface-elevated border border-stroke-subtle dark:border-white/opacity-medium text-content-primary whitespace-nowrap shadow-lg`,style:m(y.value)},[C(d(g.value)+`: `,1),T(`span`,Bt,d(h.value.value)+d(e.unit?` ${e.unit}`:``),1)],4)):b(``,!0)]))],544)):b(``,!0)}}),Wt={key:0,class:`mt-2 pt-2 border-t border-stroke-subtle dark:border-white/opacity-light`},Gt={class:`flex items-center justify-between text-[10px] text-content-muted uppercase tracking-wide mb-1`},Kt={class:`text-content-primary normal-case tracking-normal font-medium`},qt=h({name:`NoiseFloorSparkline`,__name:`NoiseFloorSparkline`,setup(e){let t=ne(),n=re();v(()=>n.noiseFloorDbm,e=>{e!==null&&t.appendNoiseFloorReading(e)});let r=S(()=>n.noiseFloorDbm||t.currentNoiseFloor),i=S(()=>{if(!t.noiseFloorHistory?.length)return[];let e=Date.now()/1e3-3600;return t.noiseFloorHistory.filter(t=>t.noise_floor_dbm!==0&&t.timestamp>=e).map(e=>({value:e.noise_floor_dbm,timestamp:e.timestamp}))});return(e,t)=>r.value===null?b(``,!0):(s(),E(`div`,Wt,[T(`div`,Gt,[t[0]||=T(`span`,null,`Noise Floor`,-1),T(`span`,Kt,d(r.value)+` dBm `,1)]),x(Ut,{data:i.value,unit:`dBm`},null,8,[`data`])]))}}),Jt=[{id:`dashboard`,label:`Dashboard`,icon:gt,route:`/`},{id:`send-advert`,label:`Send Advert`,icon:vt,action:`sendAdvert`},{id:`monitoring`,label:`Monitoring`,icon:tt,children:[{id:`neighbors`,label:`Neighbors`,icon:jt,route:`/neighbors`},{id:`sessions`,label:`Sessions`,icon:at,route:`/sessions`},{id:`gps`,label:`GPS`,icon:_t,route:`/gps`,enabledWhen:`gps`},{id:`sensors`,label:`Sensors`,icon:pt,route:`/sensors`,enabledWhen:`sensors`}]},{id:`analytics`,label:`Analytics`,icon:ot,children:[{id:`statistics`,label:`Statistics`,icon:ot,route:`/statistics`},{id:`rf-health-correlation`,label:`RF Health Correlation`,icon:ot,route:`/rf-health-correlation`},{id:`logs`,label:`Logs`,icon:Tt,route:`/logs`}]},{id:`system`,label:`System`,icon:Et,children:[{id:`configuration`,label:`Configuration`,icon:Dt,activeOn:[`/configuration`,`/cad-calibration`],children:[{id:`config-radio`,label:`Radio`,icon:nt,activeOn:[`/configuration`],children:[{id:`config-radio-settings`,label:`Radio Settings`,icon:St,route:`/configuration`,params:{tab:`radio`},activeOn:[`/configuration`]},{id:`config-radio-hardware`,label:`Radio Hardware`,icon:nt,route:`/configuration`,params:{tab:`radio-hardware`},activeOn:[`/configuration`]},{id:`config-repeater`,label:`Repeater`,icon:Ct,route:`/configuration`,params:{tab:`repeater`},activeOn:[`/configuration`]},{id:`config-duty`,label:`Duty Cycle`,icon:bt,route:`/configuration`,params:{tab:`duty`},activeOn:[`/configuration`]},{id:`config-delays`,label:`TX Delays`,icon:At,route:`/configuration`,params:{tab:`delays`},activeOn:[`/configuration`]}]},{id:`config-access`,label:`Access`,icon:Ot,activeOn:[`/configuration`],children:[{id:`config-advert`,label:`Advert Limits`,icon:vt,route:`/configuration`,params:{tab:`advert`},activeOn:[`/configuration`]},{id:`config-transport`,label:`Regions/Keys`,icon:mt,route:`/configuration`,params:{tab:`transport`},activeOn:[`/configuration`]},{id:`config-api-tokens`,label:`API Tokens`,icon:ht,route:`/configuration`,params:{tab:`api-tokens`},activeOn:[`/configuration`]},{id:`config-web`,label:`Web Options`,icon:mt,route:`/configuration`,params:{tab:`web`},activeOn:[`/configuration`]},{id:`config-observer`,label:`Observer`,icon:ft,route:`/configuration`,params:{tab:`observer`},activeOn:[`/configuration`]},{id:`config-policy-engine`,label:`Policies`,icon:wt,route:`/configuration`,params:{tab:`policy-engine`},activeOn:[`/configuration`]}]},{id:`config-maintenance`,label:`Maintenance`,icon:Mt,activeOn:[`/configuration`],children:[{id:`config-backup`,label:`Backup`,icon:ut,route:`/configuration`,params:{tab:`backup`},activeOn:[`/configuration`]},{id:`config-database`,label:`Database`,icon:dt,route:`/configuration`,params:{tab:`database`},activeOn:[`/configuration`]},{id:`config-memory`,label:`Memory`,icon:yt,route:`/configuration`,params:{tab:`memory`},activeOn:[`/configuration`]}]}]},{id:`system-stats`,label:`System Stats`,icon:lt,route:`/system-stats`},{id:`terminal`,label:`Terminal`,icon:kt,route:`/terminal`}]},{id:`room`,label:`Rooms, Companions`,icon:jt,children:[{id:`room-servers`,label:`Room Servers`,icon:it,route:`/room-servers`},{id:`companions`,label:`Companions`,icon:rt,route:`/companions`}]},{id:`help`,label:`Help`,icon:ct,route:`/help`}],Yt=`/assets/openhop_transparent_trim-CtPcFr1r.png`,Xt=[`src`],Zt={class:`text-content-secondary dark:text-content-muted text-sm`},Qt=[`title`],$t={class:`text-content-secondary dark:text-content-muted text-sm mt-1`},en={class:`mt-3 rounded-[10px] border border-stroke-subtle dark:border-white/opacity-light bg-white dark:bg-white/opacity-subtle overflow-hidden`},tn={class:`p-2`},nn={class:`flex items-center justify-between`},rn={class:`flex items-center gap-3 mt-1.5 text-[10px] text-content-muted`},an={class:`text-primary`},on={class:`text-accent-red`},sn={key:0,class:`text-accent-amber`},cn={key:0,class:`mt-2 pt-2 border-t border-stroke-subtle dark:border-white/opacity-light`},ln={class:`flex items-center justify-between text-[10px] text-content-muted mb-1`},un={class:`text-content-primary`},dn={class:`w-full h-1 bg-white/opacity-light rounded-full overflow-hidden`},fn={class:`flex border-t border-stroke-subtle dark:border-white/opacity-light`},pn=[`title`,`disabled`,`onClick`],mn={class:`mb-8 space-y-2`},hn={class:`flex items-center gap-1 mb-2`},gn={class:`relative flex-1`},_n=[`title`],vn={key:0,class:`text-xs text-content-muted px-1`},yn={class:`mb-4`},bn={key:0,class:`mb-2 glass-card px-3 py-2 rounded-lg border border-accent-cyan/opacity-medium bg-accent-cyan/opacity-light`},xn={class:`flex items-center gap-2`},Sn={key:0,class:`mt-2 glass-card px-3 py-2 rounded-lg border border-stroke-subtle dark:border-stroke/opacity-medium space-y-2 text-xs animate-fade-in`},Cn={class:`space-y-1`},wn={class:`flex items-center justify-between`},Tn={class:`text-content-primary font-mono`},En={key:0,class:`pl-2 space-y-0.5 text-[10px] text-content-secondary dark:text-content-muted`},Dn={key:0,class:`flex items-center gap-1`},On={class:`bg-white/opacity-light dark:bg-black/opacity-medium px-1 py-0.5 rounded`},kn={class:`space-y-1`},An={class:`flex items-center justify-between`},jn={class:`text-content-primary font-mono`},Mn={key:0,class:`pl-2 space-y-0.5 text-[10px] text-content-secondary dark:text-content-muted`},Nn={key:0,class:`flex items-center gap-1`},Pn={class:`bg-white/opacity-light dark:bg-black/opacity-medium px-1 py-0.5 rounded`},Fn={class:`flex items-center gap-2 text-content-secondary dark:text-content-muted text-xs mb-3`},In={class:`flex items-center justify-center gap-3`},Ln={href:`https://discord.gg/6dYjGpPSK`,target:`_blank`,rel:`noopener noreferrer`,class:`inline-flex items-center justify-center w-9 h-9 rounded-xl bg-content-primary dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-medium hover:bg-indigo-50 dark:hover:bg-indigo-500/20 hover:border-indigo-500/50 dark:hover:border-indigo-500/50 transition-all duration-300 hover:scale-110 group backdrop-blur-sm`,title:`Discord`},Rn={href:`https://github.com/openhop-dev/openhope-repeater`,target:`_blank`,rel:`noopener noreferrer`,class:`inline-flex items-center justify-center w-9 h-9 rounded-xl bg-content-primary dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-medium hover:bg-primary/opacity-medium dark:hover:bg-primary/opacity-medium hover:border-primary/opacity-heavy dark:hover:border-primary/opacity-heavy transition-all duration-300 hover:scale-110 group backdrop-blur-sm`,title:`GitHub`},zn={href:`https://buymeacoffee.com/rightup`,target:`_blank`,rel:`noopener noreferrer`,class:`inline-flex items-center justify-center w-9 h-9 rounded-xl bg-content-primary dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-medium hover:bg-secondary/opacity-light hover:border-secondary/opacity-heavy dark:hover:border-secondary/opacity-heavy transition-all duration-300 hover:scale-110 group backdrop-blur-sm`,title:`Buy Me a Coffee`},Bn=X(h({name:`SidebarNav`,__name:`Sidebar`,props:{mobileOpen:{type:Boolean}},emits:[`close`],setup(e,{emit:i}){let u=i,p=R(),h=ee(),y=re(),D=q(),k=ne(),{theme:j}=ie(),M=S(()=>Yt),{isPinned:N,togglePin:I}=et(),L=S(()=>N.value?`w-3 h-3`:`w-3 h-3 rotate-45`),z=S(()=>N.value?`w-6 h-6 rounded-md flex items-center justify-center transition-all duration-200 text-primary opacity-100`:`w-6 h-6 rounded-md flex items-center justify-center transition-all duration-200 text-content-muted hover:text-content-primary`),B=c(!1),V=null,U=e=>{B.value=e.matches};t(()=>{V=window.matchMedia(`(max-width: 1023px)`),B.value=V.matches,V.addEventListener(`change`,U)}),O(()=>{V?.removeEventListener(`change`,U)}),v(()=>p.fullPath,()=>{B.value&&u(`close`)});let te=()=>{H(),h.push(`/login`),u(`close`)},W=c(!1),G=c(!1),K=c(!1),J=c(!1),Y=c(null);r(ue,{sendAdvert:()=>{K.value=!0}});let ae=async()=>{W.value=!0,Y.value=null;try{await y.sendAdvert(),J.value=!0,setTimeout(()=>oe(),2e3)}catch(e){Y.value=e instanceof Error?e.message:`Unknown error occurred`,console.error(`Failed to send advert:`,e)}finally{W.value=!1}},oe=()=>{K.value=!1,J.value=!1,Y.value=null,W.value=!1},se=async e=>{if(!(G.value||y.currentMode===e)){G.value=!0;try{await y.setMode(e)}catch(e){console.error(`Failed to set mode:`,e)}finally{G.value=!1}}},ce=S(()=>{let e=y.stats;return{gps:e?.gps?.enabled===!0||e?.config?.gps?.enabled===!0,sensors:e?.sensors?.enabled===!0||e?.config?.sensors?.enabled===!0}});function le(e){return e.filter(e=>!e.enabledWhen||ce.value[e.enabledWhen]===!0).map(e=>e.children?{...e,children:le(e.children)}:e)}let X=c(``),de=c(null);function fe(){X.value=``,A(()=>de.value?.focus())}function pe(e,t){let n=t.trim().toLowerCase();return n?e.reduce((e,t)=>{let r=t.label.toLowerCase().includes(n)||t.id.toLowerCase().includes(n)||(t.route?.toLowerCase().includes(n)??!1);if(!t.children?.length)return r&&e.push(t),e;let i=pe(t.children,n);return r?(e.push(t),e):(i.length>0&&e.push({...t,children:i}),e)},[]):e}let he=S(()=>le(Jt)),ge=S(()=>pe(he.value,X.value)),_e=S(()=>D.advertTier.currentTier),ye=S(()=>D.advertTier.advertsAllowed),be=S(()=>D.advertTier.advertsDropped),xe=S(()=>D.advertTier.activePenalties),Ce=S(()=>{switch(_e.value){case`quiet`:return`bg-primary/opacity-medium text-primary border-primary/opacity-heavy`;case`normal`:return`bg-primary/opacity-medium text-primary border-primary/opacity-heavy`;case`busy`:return`bg-accent-amber/opacity-medium text-accent-amber border-accent-amber/opacity-heavy`;case`congested`:return`bg-accent-red/opacity-medium text-accent-red border-accent-red/opacity-heavy`;default:return`bg-surface-elevated text-content-muted border-stroke-subtle`}}),we=[{id:`forward`,label:`Repeater`,title:`Repeats packets and Room Server and Companion identities can TX.`},{id:`monitor`,label:`Monitor`,title:`Does not repeat packets, can Advert, Room Server and Companion identities can TX.`},{id:`no_tx`,label:`No TX`,title:`No packets transmitted.`}],Te=S(()=>{let e=y.dutyCyclePercentage;return{width:e===0?`2px`:`${Math.max(e,2)}%`,backgroundColor:e>90?`var(--color-accent-red)`:e>70?`var(--color-secondary)`:`var(--color-primary)`}}),Ee=c(!1),De=S(()=>y.version.includes(`dev`)||y.coreVersion.includes(`dev`)),Oe=e=>{let t=e.match(/^([\d.]+)(\.dev(\d+))?((\+g)([a-f0-9]+))?$/);return t?{base:t[1],isDev:!!t[2],devNumber:t[3]||null,commit:t[6]||null}:{base:e,isDev:!1,devNumber:null,commit:null}},Z=S(()=>Oe(y.version)),Q=S(()=>Oe(y.coreVersion)),ke=S(()=>{let e=[y.lastUpdated,k.lastUpdated].filter(Boolean);return e.length===0?`Never`:e.reduce((e,t)=>e>t?e:t).toLocaleTimeString()});return(t,r)=>(s(),E(w,null,[(s(),f(_,{to:`body`},[x(F,{name:`backdrop`},{default:a(()=>[B.value&&e.mobileOpen?(s(),E(`div`,{key:0,class:`fixed inset-0 z-[249] bg-black/opacity-heavy backdrop-blur-sm`,onClick:r[0]||=e=>u(`close`)})):b(``,!0)]),_:1})])),T(`aside`,{class:g([B.value?[`fixed left-0 top-0 bottom-0 w-72 p-4 z-[250] transition-transform duration-300`,e.mobileOpen?`translate-x-0`:`-translate-x-full`]:`w-[285px] flex-shrink-0 p-[15px] h-full`])},[T(`div`,{class:g([`h-full p-6 overflow-y-auto overscroll-contain scrollbar-hide`,B.value?`bg-surface dark:bg-black/opacity-medium backdrop-blur-xl border border-stroke dark:border-white/opacity-light rounded-2xl shadow-2xl`:`glass-card`])},[T(`div`,{class:g([`mb-4`,B.value?`flex items-start justify-between`:``])},[T(`div`,null,[T(`div`,{class:g([`flex`,B.value?`mb-0`:`mb-0 justify-center`])},[T(`img`,{src:M.value,alt:`openHop`,class:g([`logo-image`,B.value?`h-[130px]`:`h-[154px]`])},null,10,Xt)],2),r[7]||=T(`h2`,{class:`text-content-primary text-center text-lg sm:text-xl font-heading font-bold mb-3`},` Repeater `,-1),T(`p`,Zt,[C(d(l(y).nodeName)+` `,1),T(`span`,{class:g([`inline-block w-2 h-2 rounded-full ml-2`,l(y).statusBadge.text===`Active`?`bg-primary`:l(y).statusBadge.text===`Monitor Mode`?`bg-secondary`:`bg-accent-red`]),title:l(y).statusBadge.title},null,10,Qt)]),T(`p`,$t,` <`+d(l(y).pubKey)+`> `,1),T(`div`,en,[T(`div`,tn,[T(`div`,nn,[r[5]||=T(`span`,{class:`text-content-muted text-[10px] uppercase tracking-wide`},`Adaptive`,-1),T(`div`,{class:g([`inline-flex items-center px-2 py-0.5 rounded-full border text-[10px] font-semibold`,Ce.value])},d(_e.value.toUpperCase()),3)]),T(`div`,rn,[T(`span`,an,`OK: `+d(ye.value),1),T(`span`,on,`Drop: `+d(be.value),1),xe.value>0?(s(),E(`span`,sn,`Pen: `+d(xe.value),1)):b(``,!0)]),l(y).dutyCycleEnabled?(s(),E(`div`,cn,[T(`div`,ln,[r[6]||=T(`span`,null,`Duty Cycle`,-1),T(`span`,un,d(l(y).dutyCycleUtilization.toFixed(1))+`% / `+d(l(y).dutyCycleMax.toFixed(1))+`% `,1)]),T(`div`,dn,[T(`div`,{class:`h-full rounded-full transition-all duration-300`,style:m(Te.value)},null,4)])])):b(``,!0),x(qt)]),T(`div`,fn,[(s(),E(w,null,n(we,e=>T(`button`,{key:e.id,type:`button`,title:e.title,disabled:G.value,onClick:t=>se(e.id),class:g([`flex-1 py-2 text-xs font-medium transition-all duration-200 border-r border-stroke-subtle dark:border-white/opacity-light last:border-r-0`,G.value?`opacity-60 cursor-not-allowed`:`cursor-pointer`,l(y).currentMode===e.id?e.id===`forward`?`bg-mode-segment-forward text-primary`:e.id===`monitor`?`bg-accent-amber/opacity-medium text-accent-amber`:`bg-mode-segment-no-tx text-accent-red`:`text-content-primary hover:bg-white/opacity-light dark:hover:bg-white/opacity-light`])},d(G.value&&l(y).currentMode!==e.id?`…`:e.label),11,pn)),64))])])]),B.value?(s(),E(`button`,{key:0,onClick:r[1]||=e=>u(`close`),class:`ml-3 flex-shrink-0 text-content-primary dark:text-content-muted hover:text-content-heading dark:hover:text-white transition-colors`},`✕`)):b(``,!0)],2),T(`div`,mn,[T(`div`,hn,[T(`div`,gn,[o(T(`input`,{ref_key:`navSearchInput`,ref:de,"onUpdate:modelValue":r[2]||=e=>X.value=e,type:`text`,placeholder:`Search menu...`,class:`w-full h-8 rounded-[10px] border border-stroke-subtle dark:border-stroke/opacity-medium bg-surface dark:bg-white/opacity-subtle px-3 pr-8 text-xs text-content-primary placeholder:text-content-muted focus:outline-none focus:ring-1 focus:ring-primary/opacity-heavy`},null,512),[[P,X.value]]),X.value?(s(),E(`button`,{key:0,type:`button`,class:`absolute right-1 top-1/2 -translate-y-1/2 w-6 h-6 inline-flex items-center justify-center text-content-muted hover:text-content-primary transition-colors`,title:`Clear search`,onClick:fe},[x(l(Nt),{class:`w-3.5 h-3.5`})])):b(``,!0)]),T(`button`,{onClick:r[3]||=(...e)=>l(I)&&l(I)(...e),title:l(N)?`Unpin menu layout`:`Pin menu layout`,class:g(z.value)},[x(l(xt),{class:g(L.value)},null,8,[`class`])],10,_n)]),X.value.trim().length>0&&ge.value.length===0?(s(),E(`p`,vn,` No menu items match "`+d(X.value)+`" `,1)):b(``,!0),(s(!0),E(w,null,n(ge.value,e=>(s(),f(It,{key:e.id,item:e,depth:0,"search-active":X.value.trim().length>0},null,8,[`item`,`search-active`]))),128))]),B.value?(s(),E(`button`,{key:0,onClick:te,class:`w-full glass-card-orange hover:bg-accent-red/opacity-light rounded-[10px] py-3 px-4 flex items-center justify-center gap-2 text-sm font-medium text-content-primary transition-all mb-6`},[...r[8]||=[T(`svg`,{class:`w-4 h-4`,viewBox:`0 0 20 20`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.5`,xmlns:`http://www.w3.org/2000/svg`},[T(`path`,{d:`M13 3H15C16.1046 3 17 3.89543 17 5V15C17 16.1046 16.1046 17 15 17H13M8 7L4 10.5M4 10.5L8 14M4 10.5H13`,"stroke-linecap":`round`,"stroke-linejoin":`round`})],-1),C(` Logout `,-1)]])):b(``,!0),T(`div`,yn,[De.value?(s(),E(`div`,bn,[...r[9]||=[T(`div`,{class:`flex items-center justify-center gap-2`},[T(`svg`,{class:`w-4 h-4 text-accent-cyan flex-shrink-0`,viewBox:`0 0 20 20`,fill:`currentColor`},[T(`path`,{"fill-rule":`evenodd`,d:`M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z`,"clip-rule":`evenodd`})]),T(`span`,{class:`text-accent-cyan text-xs font-semibold`},`Development Build`)],-1)]])):b(``,!0),T(`div`,{onClick:r[4]||=e=>Ee.value=!Ee.value,class:`cursor-pointer transition-all duration-200 hover:scale-[1.02]`},[T(`div`,xn,[T(`span`,{class:g([`glass-card px-2 py-1 text-xs font-medium rounded border transition-colors`,Z.value.isDev?`text-accent-amber border-accent-amber/opacity-medium`:`text-content-secondary dark:text-content-muted border-stroke-subtle dark:border-stroke`])},` R:v`+d(Z.value.base)+d(Z.value.isDev?`-dev`+Z.value.devNumber:``),3),T(`span`,{class:g([`glass-card px-2 py-1 text-xs font-medium rounded border transition-colors`,Q.value.isDev?`text-accent-amber border-accent-amber/opacity-medium`:`text-content-secondary dark:text-content-muted border-stroke-subtle dark:border-stroke`])},` Core:v`+d(Q.value.base)+d(Q.value.isDev?`-dev`+Q.value.devNumber:``),3),(s(),E(`svg`,{class:g([`w-3 h-3 text-content-muted transition-transform duration-200`,Ee.value?`rotate-180`:``]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...r[10]||=[T(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M19 9l-7 7-7-7`},null,-1)]],2))]),Ee.value?(s(),E(`div`,Sn,[T(`div`,Cn,[T(`div`,wn,[r[11]||=T(`span`,{class:`text-content-muted font-medium`},`Repeater:`,-1),T(`span`,Tn,`v`+d(Z.value.base),1)]),Z.value.isDev?(s(),E(`div`,En,[T(`div`,null,`Dev Build: `+d(Z.value.devNumber),1),Z.value.commit?(s(),E(`div`,Dn,[r[12]||=T(`span`,null,`Commit:`,-1),T(`code`,On,d(Z.value.commit),1)])):b(``,!0)])):b(``,!0)]),r[15]||=T(`div`,{class:`border-t border-stroke-subtle dark:border-stroke/opacity-medium`},null,-1),T(`div`,kn,[T(`div`,An,[r[13]||=T(`span`,{class:`text-content-muted font-medium`},`Core:`,-1),T(`span`,jn,`v`+d(Q.value.base),1)]),Q.value.isDev?(s(),E(`div`,Mn,[T(`div`,null,`Dev Build: `+d(Q.value.devNumber),1),Q.value.commit?(s(),E(`div`,Nn,[r[14]||=T(`span`,null,`Commit:`,-1),T(`code`,Pn,d(Q.value.commit),1)])):b(``,!0)])):b(``,!0)])])):b(``,!0)])]),r[18]||=T(`div`,{class:`border-t border-stroke-subtle dark:border-stroke mb-4`},null,-1),T(`div`,Fn,[r[16]||=T(`svg`,{class:`w-3 h-3`,viewBox:`0 0 13 13`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`},[T(`path`,{d:`M6.5 13C5.59722 13 4.75174 12.8286 3.96355 12.4858C3.17537 12.143 2.48926 11.6795 1.90522 11.0955C1.32119 10.5115 0.85776 9.82535 0.514945 9.03717C0.172131 8.24898 0.000482491 7.40326 1.0101e-06 6.5C-0.000480471 5.59674 0.171168 4.75126 0.514945 3.96356C0.858723 3.17585 1.32191 2.48974 1.9045 1.90522C2.48709 1.3207 3.1732 0.857278 3.96283 0.514944C4.75246 0.172611 5.59818 0.000962963 6.5 0C7.48703 0 8.42303 0.210648 9.30799 0.631944C10.193 1.05324 10.9421 1.64907 11.5555 2.41944V1.44444C11.5555 1.23981 11.6249 1.06841 11.7635 0.930222C11.9022 0.792037 12.0736 0.722704 12.2778 0.722222C12.4819 0.721741 12.6536 0.791074 12.7927 0.930222C12.9319 1.06937 13.001 1.24078 13 1.44444V4.33333C13 4.53796 12.9307 4.70961 12.792 4.84828C12.6533 4.98694 12.4819 5.05604 12.2778 5.05556H9.38888C9.18425 5.05556 9.01285 4.98622 8.87466 4.84756C8.73647 4.70889 8.66714 4.53748 8.66666 4.33333C8.66618 4.12919 8.73551 3.95778 8.87466 3.81911C9.01381 3.68044 9.18521 3.61111 9.38888 3.61111H10.6528C10.1593 2.93704 9.55138 2.40741 8.82916 2.02222C8.10694 1.63704 7.33055 1.44444 6.5 1.44444C5.09166 1.44444 3.89711 1.93507 2.91633 2.91633C1.93555 3.89759 1.44493 5.09215 1.44444 6.5C1.44396 7.90785 1.93459 9.10265 2.91633 10.0844C3.89807 11.0661 5.09263 11.5565 6.5 11.5556C7.64351 11.5556 8.66666 11.2125 9.56944 10.5264C10.4722 9.84028 11.068 8.95555 11.3569 7.87222C11.4171 7.67963 11.5255 7.53519 11.6819 7.43889C11.8384 7.34259 12.013 7.30648 12.2055 7.33055C12.4102 7.35463 12.5727 7.44178 12.693 7.592C12.8134 7.74222 12.8495 7.90785 12.8014 8.08889C12.4523 9.5213 11.694 10.698 10.5264 11.6191C9.35879 12.5402 8.01666 13.0005 6.5 13ZM7.22222 6.21111L9.02777 8.01667C9.16018 8.14907 9.22638 8.31759 9.22638 8.52222C9.22638 8.72685 9.16018 8.89537 9.02777 9.02778C8.89536 9.16018 8.72685 9.22639 8.52222 9.22639C8.31759 9.22639 8.14907 9.16018 8.01666 9.02778L5.99444 7.00556C5.92222 6.93333 5.86805 6.8522 5.83194 6.76217C5.79583 6.67213 5.77777 6.57872 5.77777 6.48194V3.61111C5.77777 3.40648 5.84711 3.23507 5.98577 3.09689C6.12444 2.9587 6.29585 2.88937 6.5 2.88889C6.70414 2.88841 6.87579 2.95774 7.01494 3.09689C7.15409 3.23604 7.22318 3.40744 7.22222 3.61111V6.21111Z`,fill:`currentColor`})],-1),C(` Last Updated: `+d(ke.value),1)]),r[19]||=T(`div`,{class:`flex flex-col items-center justify-center mb-4`},[T(`p`,{class:`text-content-muted text-[10px] mb-1 tracking-wide uppercase opacity-70`},`Powered by`),T(`a`,{href:`https://meshcore.io`,target:`_blank`,rel:`noopener noreferrer`,title:`MeshCore`},[T(`img`,{src:`/assets/meshcore-DQNtEl5I.svg`,alt:`MeshCore`,class:`h-4 opacity-70 dark:invert-0 invert`})])],-1),T(`div`,In,[T(`a`,Ln,[x(ve,{class:`w-5 h-5 text-white group-hover:text-indigo-500 transition-colors`})]),r[17]||=T(`a`,{href:`https://openhop.dev`,target:`_blank`,rel:`noopener noreferrer`,class:`inline-flex items-center justify-center w-9 h-9 rounded-xl bg-content-primary dark:bg-white/opacity-subtle border border-stroke-subtle dark:border-stroke/opacity-medium hover:bg-primary/opacity-medium dark:hover:bg-primary/opacity-medium hover:border-primary/opacity-heavy dark:hover:border-primary/opacity-heavy transition-all duration-300 hover:scale-110 group backdrop-blur-sm`,title:`openHop Website`},[T(`svg`,{class:`w-5 h-5 text-white group-hover:text-primary transition-colors`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[T(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`1.75`,d:`M12 21a9.004 9.004 0 008.716-6M12 21a9.004 9.004 0 01-8.716-6M12 21c1.656 0 3-4.03 3-9s-1.344-9-3-9m0 18c-1.656 0-3-4.03-3-9s1.344-9 3-9m0 0a9.004 9.004 0 018.716 6M12 3a9.004 9.004 0 00-8.716 6M3.284 9h17.432M3.284 15h17.432`})])],-1),T(`a`,Rn,[x(me,{class:`w-5 h-5 text-white group-hover:text-primary transition-colors`})]),T(`a`,zn,[x(Se,{class:`w-5 h-5 text-white group-hover:text-secondary transition-colors`})])])],2)],2),x(Ue,{isOpen:K.value,isLoading:W.value,isSuccess:J.value,error:Y.value,onClose:oe,onSend:ae},null,8,[`isOpen`,`isLoading`,`isSuccess`,`error`])],64))}}),[[`__scopeId`,`data-v-cf2b6b93`]]);function Vn(){let e=c(null),n=c(null),r=c(null),i=c(!1),a=c({top:`0px`,right:`0px`}),o=()=>document.querySelector(`main`);function s(){if(!e.value)return;let t=e.value.getBoundingClientRect();window.innerWidth<640?a.value={top:`${t.bottom+4}px`,left:`50%`,right:`auto`,transform:`translateX(-50%)`}:a.value={top:`${t.bottom+4}px`,right:`${window.innerWidth-t.right}px`,left:`auto`,transform:`none`}}function l(){o()?.addEventListener(`scroll`,s,{passive:!0}),s(),i.value=!0}function u(){o()?.removeEventListener(`scroll`,s),i.value=!1}function d(){i.value?u():l()}function f(e){let t=e.target,i=n.value?.contains(t)??!1,a=r.value?.contains(t)??!1;!i&&!a&&u()}return t(()=>document.addEventListener(`click`,f)),O(()=>{document.removeEventListener(`click`,f),o()?.removeEventListener(`scroll`,s)}),{triggerRef:e,wrapperRef:n,panelRef:r,isOpen:i,panelStyle:a,open:l,close:u,toggle:d}}var Hn=[`aria-label`,`title`],Un={key:0,xmlns:`http://www.w3.org/2000/svg`,class:`w-5 h-5 text-accent-amber`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`,"stroke-width":`2`},Wn={key:1,xmlns:`http://www.w3.org/2000/svg`,class:`w-5 h-5 text-content-secondary dark:text-content`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`,"stroke-width":`2`},Gn=h({__name:`ThemeToggle`,setup(e){let{theme:t,toggleTheme:n}=ie();return(e,r)=>(s(),E(`button`,{onClick:r[0]||=(...e)=>l(n)&&l(n)(...e),class:`w-[35px] h-[35px] rounded bg-background-mute dark:bg-surface-elevated flex items-center justify-center hover:bg-stroke-subtle dark:hover:bg-stroke/opacity-medium transition-colors`,"aria-label":l(t)===`dark`?`Switch to light mode`:`Switch to dark mode`,title:l(t)===`dark`?`Switch to light mode`:`Switch to dark mode`},[l(t)===`dark`?(s(),E(`svg`,Un,[...r[1]||=[T(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,d:`M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z`},null,-1)]])):(s(),E(`svg`,Wn,[...r[2]||=[T(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,d:`M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z`},null,-1)]]))],8,Hn))}}),Kn={class:`flex items-center justify-between p-6 pb-0 shrink-0`},qn={class:`p-6 space-y-5 overflow-y-auto flex-1`},Jn={class:`grid grid-cols-2 gap-3`},Yn={class:`bg-background-mute dark:bg-background-mute rounded-xl p-3 border border-stroke-subtle dark:border-stroke/opacity-light`},Xn={class:`text-sm font-mono font-medium text-content-primary`},Zn={key:0,class:`flex items-center gap-1.5 mt-1`},Qn={key:0,class:`flex items-start gap-3 bg-accent-amber/opacity-light dark:bg-accent-amber/opacity-light border border-accent-amber dark:border-accent-amber/opacity-medium rounded-xl p-3`},$n={class:`text-xs text-accent-amber`},er={class:`font-mono font-semibold`},tr={key:1,class:`flex items-center gap-2 bg-accent-green/opacity-light dark:bg-surface border border-accent-green dark:border-accent-green/opacity-medium border-l-2 border-l-green-600 dark:border-l-accent-green rounded-xl p-3 text-sm text-accent-green dark:text-content-primary`},nr={key:2,class:`space-y-1`},rr={class:`flex items-center gap-1`},ir={key:1,class:`text-content-muted`},ar={key:0,class:`bg-background-mute dark:bg-black/30 rounded-xl border border-stroke-subtle dark:border-stroke/opacity-light overflow-hidden`},or={class:`max-h-52 overflow-y-auto divide-y divide-stroke-subtle dark:divide-stroke/10`},sr=[`href`],cr={class:`font-mono text-[10px] text-content-muted shrink-0 mt-0.5 pt-px`},lr={class:`min-w-0 flex-1`},ur={class:`text-xs text-content-primary truncate group-hover:text-primary transition-colors`},dr={class:`text-[10px] text-content-muted mt-0.5`},fr={class:`space-y-2`},pr={class:`flex gap-2`},mr=[`disabled`],hr=[`value`],gr=[`disabled`],_r={key:0,class:`text-xs text-accent-green`},vr={key:1,class:`text-xs text-accent-red`},yr={key:3,class:`space-y-2`},br={class:`flex items-center justify-between`},xr={key:0,class:`flex items-center gap-1 text-xs text-primary`},Sr={key:1,class:`flex items-center gap-1 text-xs text-primary`},Cr={key:2,class:`flex items-center gap-1 text-xs text-accent-amber`},wr={key:3,class:`text-xs text-accent-green font-medium`},Tr={key:4,class:`text-xs text-accent-red font-medium`},Er={key:0,class:`w-2 h-4 bg-green-400 animate-pulse inline-block ml-1`},Dr={key:1,class:`flex items-center gap-2 mt-2 text-primary`},Or={key:2,class:`flex items-center gap-2 mt-2 text-accent-amber`},kr={key:3,class:`text-content-muted animate-pulse`},Ar={key:0,class:`text-xs text-accent-red`},jr={key:4,class:`flex items-center gap-3 bg-primary/opacity-light dark:bg-primary/opacity-light border border-primary/opacity-medium rounded-xl p-3 text-sm text-primary`},Mr={key:5},Nr={class:`flex items-center gap-3 bg-accent-amber/opacity-light dark:bg-accent-amber/opacity-light border border-accent-amber dark:border-accent-amber/opacity-medium rounded-xl p-3 text-sm text-accent-amber`},Pr={class:`font-medium`},Fr={class:`text-xs opacity-70 mt-0.5`},Ir={key:6,class:`bg-accent-green/opacity-light dark:bg-surface-elevated border border-accent-green dark:border-accent-green/opacity-heavy rounded-xl p-4`},Lr={class:`flex items-center gap-3`},Rr={class:`text-xs text-content-muted mt-0.5`},zr={class:`font-mono font-semibold`},Br={key:7,class:`bg-accent-red/opacity-light dark:bg-accent-red/opacity-light border border-accent-red/opacity-heavy rounded-xl p-4 space-y-3`},Vr={class:`flex items-center gap-3`},Hr={class:`flex-1 min-w-0`},Ur={class:`text-xs text-accent-red/opacity-heavy mt-0.5`},Wr={key:0,class:`grid grid-cols-2 gap-2 text-xs`},Gr={class:`bg-white/opacity-heavy dark:bg-black/opacity-medium rounded-lg px-3 py-2`},Kr={class:`font-mono font-semibold text-content-primary`},qr={class:`bg-white/opacity-heavy dark:bg-black/opacity-medium rounded-lg px-3 py-2`},Jr={class:`font-mono font-semibold text-accent-red`},Yr={class:`p-6 pt-0 flex items-center gap-3 shrink-0`},Xr=[`disabled`],Zr={key:0,class:`flex items-center justify-center gap-2`},Qr={key:1,class:`flex items-center justify-center gap-2`},$r={key:2},ei=h({__name:`UpdateModal`,props:{show:{type:Boolean},currentVersion:{default:``},latestVersion:{default:``},hasUpdate:{type:Boolean,default:!1},rateLimitUntil:{default:null}},emits:[`close`,`installed`,`version-updated`],setup(e,{emit:t}){let r=e,i=t,a=c(r.currentVersion),l=c(r.latestVersion),u=c(r.hasUpdate);v(()=>r.currentVersion,e=>{a.value=e}),v(()=>r.latestVersion,e=>{l.value=e}),v(()=>r.hasUpdate,e=>{u.value=e});let p=c([`main`]),m=c(`main`),h=c(``),y=c(``),D=c(!1),k=c(!1),A=c([]),N=c(!1),P=c(!0),F=c(`idle`),I=c(null),L=c([]),ee=c(null),R=c(!1),z=c(null),V=c(null),H=null,te=c(!1),W=null,ne=S(()=>F.value===`idle`||F.value===`error`||F.value===`verify-failed`),re=S(()=>{switch(F.value){case`installing`:return`Installing…`;case`restarting`:return`Restarting…`;case`verified`:return`Installed ✓`;case`verify-failed`:return`Retry Install`;case`complete`:return`Installed ✓`;case`error`:return`Retry Install`;default:return u.value?`Install Update`:`Force Reinstall`}});function G(){ee.value&&(ee.value.scrollTop=ee.value.scrollHeight)}function K(e){L.value.push(e),L.value.length>500&&L.value.splice(0,L.value.length-500),setTimeout(G,20)}function q(){H&&=(H.close(),null)}async function J(){N.value=!0,A.value=[];try{let e=await U.get(`/update/changelog`);e.success&&Array.isArray(e.commits)&&(A.value=e.commits)}catch{}finally{N.value=!1}}async function ie(){D.value=!0,y.value=``;try{let e=await U.get(`/update/channels`);e.success&&Array.isArray(e.channels)&&(p.value=e.channels,m.value=e.current_channel??`main`)}catch{p.value=[`main`],y.value=`Could not load channels from GitHub`}finally{D.value=!1}}async function ae(){if(m.value){h.value=``,y.value=``;try{let e=await U.post(`/update/set_channel`,{channel:m.value});if(!e.success){y.value=e.error??`Failed to set channel`;return}h.value=`Switched to '${m.value}' — checking version…`,F.value=`idle`,I.value=null,L.value=[],k.value=!0,l.value=``,u.value=!1;try{await U.post(`/update/check`);for(let e=0;e<24;e++){let e=await U.get(`/update/status`);if(e.success&&e.state!==`checking`){a.value=e.current_version??a.value,l.value=e.latest_version??``,u.value=!!e.has_update,h.value=`Switched to '${m.value}'`,i(`version-updated`,{currentVersion:a.value,latestVersion:l.value,hasUpdate:u.value}),J();break}await new Promise(e=>setTimeout(e,500))}}catch{h.value=`Switched to '${m.value}' (version check failed)`}finally{k.value=!1}}catch(e){y.value=e?.message??`Failed to set channel`}}}async function oe(){if(!ne.value)return;F.value=`installing`,I.value=null,L.value=[];try{let e=await U.post(`/update/install`,{force:!u.value});if(!e.success){F.value=`error`,I.value=e.error??`Failed to start install`;return}}catch(e){F.value=`error`,I.value=e?.message??`Network error`;return}q();let e=B(),t=e?`/api/update/progress?token=${encodeURIComponent(e)}`:`/api/update/progress`;H=new EventSource(t),H.onmessage=e=>{try{let t=JSON.parse(e.data);switch(t.type){case`line`:{let e=t.line??``;K(e),e.includes(`Restarting service`)&&(te.value=!0,W||=setTimeout(()=>{W=null,(F.value===`installing`||F.value===`complete`)&&(q(),F.value=`restarting`,K(`[openHop updater] Service is restarting — waiting for it to come back…`),se())},8e3));break}case`status`:t.state===`error`?F.value=`error`:t.state===`complete`&&(te.value=!0,F.value=`complete`);break;case`done`:q(),W&&=(clearTimeout(W),null),t.state===`complete`?(F.value=`restarting`,se()):(F.value=`error`,t.error&&(I.value=t.error));break}}catch{}},H.onerror=()=>{if(q(),W&&=(clearTimeout(W),null),te.value&&F.value!==`error`){F.value=`restarting`,K(`[openHop updater] Connection lost — waiting for service restart…`),se();return}F.value===`installing`&&(F.value=`error`,I.value=`Progress stream disconnected`)}}async function se(){let e=l.value;V.value=`going-down`;let t=Date.now()+2e4,n=!1;for(;Date.now()setTimeout(e,1e3));try{await U.get(`/update/status`)}catch{n=!0;break}}n||K(`[openHop updater] Service did not appear to stop — assuming fast restart`),V.value=`coming-up`;let r=Date.now()+6e4;for(;Date.now()setTimeout(e,2e3));try{let t=await U.get(`/update/status`);if(!t?.success)continue;V.value=`verifying`,await new Promise(e=>setTimeout(e,1200));let n=t.current_version??``;z.value=n,a.value=n||a.value,i(`version-updated`,{currentVersion:a.value,latestVersion:l.value,hasUpdate:!!t.has_update}),n&&e&&n===e?(F.value=`verified`,u.value=!1,V.value=null,i(`installed`)):(F.value=`verify-failed`,V.value=null);return}catch{}}F.value=`verify-failed`,V.value=null,I.value=`Service did not respond after restart — check logs`}v(()=>r.show,e=>{e?(F.value=`idle`,I.value=null,L.value=[],R.value=!1,z.value=null,V.value=null,te.value=!1,W&&=(clearTimeout(W),null),h.value=``,y.value=``,a.value=r.currentVersion,l.value=r.latestVersion,u.value=r.hasUpdate,ie(),J()):q()}),O(()=>{q(),W&&=(clearTimeout(W),null)});function ce(e){e.target===e.currentTarget&&F.value!==`installing`&&F.value!==`restarting`&&F.value!==`verified`&&i(`close`)}function le(){window.location.reload()}return(e,t)=>(s(),f(_,{to:`body`},[r.show?(s(),E(`div`,{key:0,class:`modal-backdrop`,onClick:ce},[T(`div`,{class:`bg-white dark:bg-surface-elevated rounded-[20px] w-full max-w-lg border border-stroke-subtle dark:border-white/opacity-light shadow-2xl flex flex-col max-h-[90vh]`,onClick:t[5]||=M(()=>{},[`stop`])},[T(`div`,Kn,[t[7]||=T(`div`,{class:`flex items-center gap-3`},[T(`div`,{class:`w-10 h-10 rounded-xl bg-primary/opacity-light flex items-center justify-center`},[T(`svg`,{class:`w-5 h-5 text-primary`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[T(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12`})])]),T(`div`,null,[T(`h3`,{class:`text-lg font-semibold text-content-primary`},` OTA Update `),T(`p`,{class:`text-xs text-content-muted`},` Update over the air from GitHub `)])],-1),F.value!==`installing`&&F.value!==`restarting`&&F.value!==`verified`?(s(),E(`button`,{key:0,onClick:t[0]||=e=>i(`close`),class:`text-content-secondary hover:text-content-primary transition-colors`},[...t[6]||=[T(`svg`,{class:`w-6 h-6`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[T(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]])):b(``,!0)]),T(`div`,qn,[T(`div`,Jn,[T(`div`,Yn,[t[8]||=T(`p`,{class:`text-xs text-content-muted mb-1`},`Installed`,-1),T(`p`,Xn,d(a.value||`—`),1)]),T(`div`,{class:g([`bg-background-mute dark:bg-background-mute rounded-xl p-3 border border-stroke-subtle dark:border-stroke/opacity-light`,u.value?`border-l-2 border-l-accent-red`:`border-l-2 border-l-accent-green`])},[t[10]||=T(`p`,{class:`text-xs text-content-muted mb-1`},`On GitHub`,-1),k.value?(s(),E(`div`,Zn,[x(Y,{size:`xs`,class:`inline-block`}),t[9]||=T(`span`,{class:`text-xs text-content-muted`},`Checking…`,-1)])):(s(),E(`p`,{key:1,class:g([`text-sm font-mono font-medium`,u.value?`text-accent-red`:`text-accent-green`])},d(l.value||`—`),3))],2)]),r.rateLimitUntil?(s(),E(`div`,Qn,[t[14]||=T(`svg`,{class:`w-4 h-4 shrink-0 mt-0.5 text-accent-amber`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[T(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z`})],-1),T(`div`,$n,[t[13]||=T(`p`,{class:`font-semibold mb-0.5`},`GitHub API rate limit reached`,-1),T(`p`,null,[t[11]||=C(` Version checks are paused until `,-1),T(`span`,er,d(new Date(r.rateLimitUntil).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})),1),t[12]||=C(`. This is a GitHub limit, not a software issue. You can still install or switch channels manually. `,-1)])])])):b(``,!0),!u.value&&a.value&&!k.value?(s(),E(`div`,tr,[...t[15]||=[T(`svg`,{class:`w-4 h-4 shrink-0`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[T(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 13l4 4L19 7`})],-1),C(` You are up to date. Use `,-1),T(`em`,{class:`mx-1`},`Force Reinstall`,-1),C(` to reinstall anyway. `,-1)]])):b(``,!0),A.value.length>0||N.value?(s(),E(`div`,nr,[T(`button`,{onClick:t[1]||=e=>P.value=!P.value,class:`flex items-center justify-between w-full text-xs font-medium text-content-secondary uppercase tracking-wide py-1 hover:text-content-primary transition-colors`},[t[17]||=T(`span`,null,`What's New`,-1),T(`span`,rr,[N.value?(s(),f(Y,{key:0,size:`xs`,class:`inline-block`})):(s(),E(`span`,ir,d(A.value.length)+` commit`+d(A.value.length===1?``:`s`),1)),(s(),E(`svg`,{class:g([`w-3.5 h-3.5 text-content-muted transition-transform`,P.value?`rotate-180`:``]),viewBox:`0 0 20 20`,fill:`currentColor`},[...t[16]||=[T(`path`,{"fill-rule":`evenodd`,d:`M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z`,"clip-rule":`evenodd`},null,-1)]],2))])]),P.value?(s(),E(`div`,ar,[T(`div`,or,[(s(!0),E(w,null,n(A.value,e=>(s(),E(`a`,{key:e.sha,href:e.url,target:`_blank`,class:`flex gap-3 px-3 py-2.5 hover:bg-background-soft dark:hover:bg-surface/opacity-heavy transition-colors group`},[T(`span`,cr,d(e.short_sha),1),T(`div`,lr,[T(`p`,ur,d(e.title),1),T(`p`,dr,d(e.author)+` · `+d(e.date?new Date(e.date).toLocaleDateString():``),1)]),t[18]||=T(`svg`,{class:`w-3 h-3 text-content-muted shrink-0 mt-1 opacity-0 group-hover:opacity-100 transition-opacity`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`},[T(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14`})],-1)],8,sr))),128))])])):b(``,!0)])):b(``,!0),T(`div`,fr,[t[19]||=T(`label`,{class:`text-xs font-medium text-content-secondary uppercase tracking-wide`},` Release Channel `,-1),T(`div`,pr,[o(T(`select`,{"onUpdate:modelValue":t[2]||=e=>m.value=e,disabled:D.value||F.value===`installing`||F.value===`verified`||k.value,class:`flex-1 bg-background-mute dark:bg-surface border border-stroke-subtle dark:border-stroke/opacity-medium rounded-xl px-3 py-2 text-sm text-content-primary disabled:opacity-50 focus:outline-none focus:ring-1 focus:ring-primary`},[(s(!0),E(w,null,n(p.value,e=>(s(),E(`option`,{key:e,value:e},d(e),9,hr))),128))],8,mr),[[j,m.value]]),T(`button`,{onClick:ae,disabled:D.value||F.value===`installing`||F.value===`verified`||k.value,class:`px-4 py-2 bg-primary/opacity-light hover:bg-primary/opacity-medium text-primary rounded-xl text-sm font-medium disabled:opacity-50 transition-colors`},d(D.value||k.value?`…`:`Apply`),9,gr)]),h.value?(s(),E(`p`,_r,d(h.value),1)):b(``,!0),y.value?(s(),E(`p`,vr,d(y.value),1)):b(``,!0),t[20]||=T(`p`,{class:`text-xs text-content-muted`},[T(`em`,null,`main`),C(` = stable releases \xA0|\xA0 `),T(`em`,null,`dev`),C(` = latest commits (may be unstable) `)],-1)]),F.value===`installing`||F.value===`restarting`||L.value.length>0&&(R.value||F.value===`error`)?(s(),E(`div`,yr,[T(`div`,br,[t[24]||=T(`label`,{class:`text-xs font-medium text-content-secondary uppercase tracking-wide`},`Install Log`,-1),F.value===`installing`?(s(),E(`span`,xr,[...t[21]||=[T(`span`,{class:`inline-block w-2 h-2 rounded-full bg-primary animate-pulse`},null,-1),C(` Running… `,-1)]])):F.value===`restarting`&&V.value===`verifying`?(s(),E(`span`,Sr,[...t[22]||=[T(`span`,{class:`inline-block w-2 h-2 rounded-full bg-primary animate-pulse`},null,-1),C(` Checking version… `,-1)]])):F.value===`restarting`?(s(),E(`span`,Cr,[t[23]||=T(`span`,{class:`inline-block w-2 h-2 rounded-full bg-accent-amber/opacity-light animate-pulse`},null,-1),C(` `+d(V.value===`going-down`?`Stopping service…`:`Waiting for service…`),1)])):F.value===`verified`?(s(),E(`span`,wr,`Complete ✓`)):F.value===`verify-failed`||F.value===`error`?(s(),E(`span`,Tr,`Failed ✗`)):b(``,!0)]),T(`div`,{ref_key:`logContainer`,ref:ee,class:`bg-surface-elevated dark:bg-black/opacity-heavy rounded-xl p-3 h-52 overflow-y-auto font-mono text-xs text-accent-green leading-relaxed border border-stroke/opacity-medium`},[(s(!0),E(w,null,n(L.value,(e,t)=>(s(),E(`div`,{key:t,class:g([`whitespace-pre-wrap break-all`,{"text-accent-red":e.includes(`✗`)||e.includes(`error`)||e.includes(`ERROR`)||e.includes(`Failed`),"text-accent-amber":e.includes(`WARNING`)||e.includes(`⚠`),"text-accent-green":e.includes(`✓`)||e.includes(`Successfully`),"text-content-muted/60":e.includes(`keepalive`)}])},d(e),3))),128)),F.value===`installing`?(s(),E(`div`,Er)):b(``,!0),F.value===`restarting`&&V.value===`verifying`?(s(),E(`div`,Dr,[x(Y,{size:`xs`,class:`inline-block`}),t[25]||=C(` Service is back — verifying version… `,-1)])):F.value===`restarting`?(s(),E(`div`,Or,[x(Y,{size:`xs`,class:`inline-block`}),C(` `+d(V.value===`going-down`?`Waiting for service to stop…`:`Waiting for service to come back up…`),1)])):b(``,!0),L.value.length===0&&F.value===`installing`?(s(),E(`div`,kr,` Waiting for output… `)):b(``,!0)],512),I.value?(s(),E(`p`,Ar,d(I.value),1)):b(``,!0)])):b(``,!0),F.value===`restarting`&&V.value===`verifying`?(s(),E(`div`,jr,[x(Y,{size:`sm`,class:`shrink-0`}),t[26]||=T(`div`,null,[T(`p`,{class:`font-medium`},`Checking version…`),T(`p`,{class:`text-xs opacity-70 mt-0.5`},` Confirming the installed version matches the target `)],-1)])):F.value===`restarting`&&L.value.length===0?(s(),E(`div`,Mr,[T(`div`,Nr,[x(Y,{size:`sm`,class:`shrink-0`}),T(`div`,null,[T(`p`,Pr,d(V.value===`going-down`?`Stopping service…`:`Starting service…`),1),T(`p`,Fr,d(V.value===`going-down`?`Waiting for the old process to exit`:`Waiting for the service to become healthy`),1)])])])):b(``,!0),F.value===`verified`?(s(),E(`div`,Ir,[T(`div`,Lr,[t[29]||=T(`div`,{class:`w-9 h-9 rounded-full bg-accent-green flex items-center justify-center shrink-0`},[T(`svg`,{class:`w-5 h-5 text-white`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[T(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2.5`,d:`M5 13l4 4L19 7`})])],-1),T(`div`,null,[t[28]||=T(`p`,{class:`font-semibold text-content-primary`},` Installed successfully! `,-1),T(`p`,Rr,[t[27]||=C(` Running version `,-1),T(`span`,zr,d(z.value),1)])])]),T(`button`,{onClick:le,class:`modal-btn-primary w-full mt-3 text-sm font-semibold`},` Refresh Page to Load New Version `)])):b(``,!0),F.value===`verify-failed`?(s(),E(`div`,Br,[T(`div`,Vr,[t[31]||=T(`div`,{class:`w-9 h-9 rounded-full bg-accent-red/opacity-light flex items-center justify-center shrink-0`},[T(`svg`,{class:`w-5 h-5 text-accent-red`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[T(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2.5`,d:`M6 18L18 6M6 6l12 12`})])],-1),T(`div`,Hr,[t[30]||=T(`p`,{class:`font-semibold text-accent-red`},`Installation may have failed`,-1),T(`p`,Ur,d(I.value||`Version mismatch after restart`),1)])]),z.value||l.value?(s(),E(`div`,Wr,[T(`div`,Gr,[t[32]||=T(`p`,{class:`text-content-muted mb-0.5`},`Expected`,-1),T(`p`,Kr,d(l.value||`—`),1)]),T(`div`,qr,[t[33]||=T(`p`,{class:`text-content-muted mb-0.5`},`Reported`,-1),T(`p`,Jr,d(z.value||`unknown`),1)])])):b(``,!0),L.value.length>0?(s(),E(`button`,{key:1,onClick:t[3]||=e=>R.value=!R.value,class:`w-full text-xs text-accent-red/opacity-heavy hover:text-accent-red underline underline-offset-2 hover:no-underline transition-all`},d(R.value?`Hide install log`:`View install log`),1)):b(``,!0)])):b(``,!0)]),T(`div`,Yr,[T(`button`,{onClick:oe,disabled:!ne.value,class:g([`flex-1 py-3 rounded-xl font-semibold text-sm transition-colors disabled:opacity-50 disabled:cursor-not-allowed`,F.value===`verified`||F.value===`complete`?`bg-accent-green/opacity-medium text-accent-green border border-accent-green/opacity-heavy cursor-default`:F.value===`error`||F.value===`verify-failed`?`bg-accent-red/opacity-medium hover:bg-accent-red/opacity-medium text-accent-red border border-accent-red/opacity-heavy`:F.value===`restarting`?`bg-accent-amber/opacity-medium text-accent-amber cursor-default`:`bg-primary/opacity-medium hover:bg-primary/opacity-medium text-primary border border-primary/opacity-heavy`])},[F.value===`installing`?(s(),E(`span`,Zr,[x(Y,{size:`sm`,color:`white`}),t[34]||=C(` Installing… `,-1)])):F.value===`restarting`?(s(),E(`span`,Qr,[x(Y,{size:`sm`}),t[35]||=C(` Restarting service… `,-1)])):(s(),E(`span`,$r,d(re.value),1))],10,Xr),F.value!==`installing`&&F.value!==`restarting`&&F.value!==`verified`?(s(),E(`button`,{key:0,onClick:t[4]||=e=>i(`close`),class:`px-6 py-3 rounded-xl border border-stroke-subtle dark:border-stroke/opacity-medium text-content-secondary hover:text-content-primary hover:bg-background-mute transition-colors text-sm`},` Close `)):b(``,!0)])])])):b(``,!0)]))}}),ti={class:`modal-card max-w-md shadow-xl`},ni={key:0,class:`flex flex-col items-center gap-5 py-2`},ri={key:1,class:`flex flex-col items-center gap-5 py-2`},ii={class:`flex items-start gap-3 mb-4`},ai={class:`mt-1 text-sm text-content-secondary dark:text-content-muted`},oi={class:`flex items-start gap-3 mb-4`},si={class:`text-base font-semibold text-content-primary`},ci={class:`mt-1 text-sm text-content-secondary dark:text-content-muted`},li={class:`flex items-start gap-2`},ui={key:0,class:`w-5 h-5 text-accent-green mt-0.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},di={key:1,class:`w-5 h-5 text-accent-amber mt-0.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},fi={key:2,class:`w-5 h-5 text-accent-red mt-0.5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},pi={class:`min-w-0`},mi={class:`text-sm font-semibold text-content-primary`},hi={class:`text-xs text-content-secondary dark:text-content-muted mt-1`},gi={key:0,class:`mt-3 max-h-44 overflow-auto rounded border border-accent-red/opacity-heavy dark:border-accent-red/opacity-heavy bg-white/60 dark:bg-black/10`},_i={class:`text-xs divide-y divide-red-100/70 dark:divide-red-800/40`},vi={class:`font-semibold text-accent-red`},yi={class:`text-accent-red`},bi={key:1,class:`mt-3 max-h-32 overflow-auto rounded border border-accent-amber/opacity-heavy dark:border-accent-amber/opacity-heavy bg-white/60 dark:bg-black/10`},xi={class:`text-xs divide-y divide-amber-100/70 dark:divide-amber-800/40`},Si={class:`font-semibold text-accent-amber`},Ci={class:`text-accent-amber`},wi={class:`modal-actions`},Ti=[`disabled`],Ei=h({__name:`RestartModal`,props:{modelValue:{type:Boolean},message:{},title:{default:`Service Restart Required`},startImmediately:{type:Boolean,default:!1}},emits:[`update:modelValue`],setup(e,{emit:t}){let r=e,i=t,o=c(!1),l=c(!1),u=c(!1),p=c(``),m=c(!1),h=c(!1),y=c(``),S=c([]),C=c([]),D=c(!1),O=null,A=0,j=0;function N(){l.value=!1,m.value=!1,h.value=!1,y.value=``,S.value=[],C.value=[],D.value=!1}function P(){(o.value||l.value)&&!u.value||(o.value=!1,l.value=!1,u.value=!1,p.value=``,N(),O&&=(clearTimeout(O),null),A=0,j=0,i(`update:modelValue`,!1))}async function I(){l.value=!0,m.value=!1,h.value=!1,y.value=``,S.value=[],C.value=[],D.value=!1;try{let e=(await U.get(`/validate_config`)).data||{},t=Array.isArray(e.errors)?e.errors:[],n=Array.isArray(e.warnings)?e.warnings:[],r=e.blocked_restart===!0,i=e.valid===!0&&!r&&t.length===0;return S.value=t,C.value=n,h.value=i,m.value=!0,i?(n.length>0?(y.value=e.message||`Configuration is valid but has warnings. Review them before continuing.`,D.value=!0):y.value=e.message||`Configuration preflight passed.`,!0):(y.value=e.message||(t.length>0?`Configuration preflight failed. Fix the errors below before restarting.`:`Configuration preflight blocked restart.`),!1)}catch(e){let t=e;if(t.response){let e=t.response.status,n=t.response.data?.error||t.response.data?.message;e===403||e===401?p.value=`Permission denied. Config preflight could not be completed.`:p.value=n?`Config preflight failed: ${n}`:`Config preflight failed (HTTP ${e}).`}else p.value=`Config preflight failed due to a network or server error.`;return u.value=!0,!1}finally{l.value=!1}}async function L(){if(u.value=!1,p.value=``,h.value&&D.value)D.value=!1;else if(!await I()||D.value)return;o.value=!0;try{let e=await U.post(`/restart_service`,{});if(!e.success){o.value=!1,u.value=!0,p.value=e.error||`Restart failed.`;return}}catch(e){let t=e;if(t.response){o.value=!1,u.value=!0;let e=t.response.status,n=t.response.data?.error||t.response.data?.message;e===403||e===401?p.value=`Permission denied. The service could not be restarted. Check polkit configuration.`:p.value=n?`Restart failed: ${n}`:`Restart failed (HTTP ${e}).`;return}}A=0,j=0,O=setTimeout(R,se)}function ee(){o.value=!0,l.value=!1,u.value=!1,A=0,j=0,O=setTimeout(R,se)}function R(){A++,fetch(ae,{method:`GET`}).then(e=>{e.ok?(j++,j>=5?window.location.reload():O=setTimeout(R,oe)):(j=0,z())}).catch(()=>{j=0,z()})}function z(){A<50?O=setTimeout(R,oe):(o.value=!1,u.value=!0)}return v(()=>r.modelValue,e=>{e?r.startImmediately&&ee():(o.value=!1,l.value=!1,u.value=!1,p.value=``,N(),O&&=(clearTimeout(O),null),A=0,j=0)}),k(()=>{O&&clearTimeout(O)}),(t,r)=>(s(),f(_,{to:`body`},[x(F,{"enter-active-class":`transition-opacity duration-200`,"enter-from-class":`opacity-0`,"leave-active-class":`transition-opacity duration-200`,"leave-to-class":`opacity-0`},{default:a(()=>[e.modelValue?(s(),E(`div`,{key:0,class:`modal-backdrop`,onClick:M(P,[`self`])},[T(`div`,ti,[o.value?(s(),E(`div`,ni,[x(Y,{size:`lg`}),r[0]||=T(`div`,{class:`text-center`},[T(`h3`,{class:`text-base font-semibold text-content-primary`},` Restarting… `),T(`p`,{class:`mt-1 text-sm text-content-secondary dark:text-content-muted`},` Please wait while the service restarts. This may take up to a minute. `)],-1)])):l.value?(s(),E(`div`,ri,[x(Y,{size:`lg`}),r[1]||=T(`div`,{class:`text-center`},[T(`h3`,{class:`text-base font-semibold text-content-primary`},` Validating Configuration… `),T(`p`,{class:`mt-1 text-sm text-content-secondary dark:text-content-muted`},` Running preflight checks on config.yaml before restarting. `)],-1)])):u.value?(s(),E(w,{key:2},[T(`div`,ii,[r[3]||=T(`div`,{class:`shrink-0 w-10 h-10 rounded-full bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium flex items-center justify-center`},[T(`svg`,{class:`w-5 h-5 text-accent-red`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[T(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z`})])],-1),T(`div`,null,[r[2]||=T(`h3`,{class:`text-base font-semibold text-content-primary`},` Service Did Not Restart `,-1),T(`p`,ai,d(p.value||`The service did not respond after 60 seconds. Please log into the device and check the system logs.`),1)])]),T(`div`,{class:`modal-actions`},[T(`button`,{onClick:P,class:`modal-btn-cancel`},`Dismiss`)])],64)):(s(),E(w,{key:3},[T(`div`,oi,[r[4]||=T(`div`,{class:`shrink-0 w-10 h-10 rounded-full bg-accent-amber/opacity-light dark:bg-accent-amber/opacity-medium flex items-center justify-center`},[T(`svg`,{class:`w-5 h-5 text-accent-amber`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[T(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z`})])],-1),T(`div`,null,[T(`h3`,si,d(e.title),1),T(`p`,ci,d(e.message),1)])]),m.value?(s(),E(`div`,{key:0,class:g([`mb-4 rounded-lg border px-3 py-3`,h.value?C.value.length?`border-accent-amber/opacity-heavy bg-accent-amber/opacity-light dark:bg-accent-amber/opacity-medium dark:border-accent-amber/opacity-heavy`:`border-accent-green/opacity-heavy bg-accent-green/opacity-light dark:bg-accent-green/opacity-medium dark:border-accent-green/opacity-heavy`:`border-accent-red/opacity-heavy bg-accent-red/opacity-light dark:bg-accent-red/opacity-medium dark:border-accent-red/opacity-heavy`])},[T(`div`,li,[h.value&&!C.value.length?(s(),E(`svg`,ui,[...r[5]||=[T(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M5 13l4 4L19 7`},null,-1)]])):h.value&&C.value.length?(s(),E(`svg`,di,[...r[6]||=[T(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z`},null,-1)]])):(s(),E(`svg`,fi,[...r[7]||=[T(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M12 9v2m0 4h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z`},null,-1)]])),T(`div`,pi,[T(`h4`,mi,d(h.value?C.value.length?`Preflight Warning`:`Preflight Passed`:`Preflight Failed`),1),T(`p`,hi,d(y.value),1)])]),!h.value&&S.value.length?(s(),E(`div`,gi,[T(`ul`,_i,[(s(!0),E(w,null,n(S.value,(e,t)=>(s(),E(`li`,{key:`err-${t}-${e.path}-${e.message}`,class:`px-2 py-2`},[T(`p`,vi,d(e.path||`config`),1),T(`p`,yi,d(e.message),1)]))),128))])])):b(``,!0),C.value.length?(s(),E(`div`,bi,[T(`ul`,xi,[(s(!0),E(w,null,n(C.value,(e,t)=>(s(),E(`li`,{key:`warn-${t}-${e.path}-${e.message}`,class:`px-2 py-2`},[T(`p`,Si,d(e.path||`config`),1),T(`p`,Ci,d(e.message),1)]))),128))])])):b(``,!0)],2)):b(``,!0),T(`div`,wi,[T(`button`,{onClick:P,class:`modal-btn-cancel`},`Cancel`),T(`button`,{onClick:L,class:`modal-btn-primary`,disabled:l.value||o.value},d(D.value?`Restart Anyway`:h.value?`Restart`:`Validate & Restart`),9,Ti)])],64))])])):b(``,!0)]),_:1})]))}}),Di={class:`modal-card max-w-md shadow-xl`},Oi={class:`text-content-secondary dark:text-content-muted text-sm mb-6`},ki={key:0,class:`bg-accent-red/opacity-light border border-accent-red/opacity-medium rounded-lg p-3`},Ai={class:`text-accent-red text-sm`},ji={key:1,class:`bg-accent-green/opacity-light border border-accent-green/opacity-medium rounded-lg p-3`},Mi={class:`text-accent-green text-sm`},Ni={class:`flex justify-end gap-3 mt-6`},Pi=[`disabled`],Fi=[`disabled`],Ii=h({name:`ChangePasswordModal`,__name:`ChangePasswordModal`,props:{isOpen:{type:Boolean},canSkip:{type:Boolean,default:!0}},emits:[`close`,`success`],setup(e,{emit:t}){let n=t,r=c(``),i=c(``),a=c(``),l=c(!1),u=c(``),p=c(``),m=()=>{l.value||n(`close`)},h=()=>{n(`close`)},g=async()=>{if(u.value=``,p.value=``,i.value.length<8){u.value=`New password must be at least 8 characters long`;return}if(i.value!==a.value){u.value=`Passwords do not match`;return}if(i.value===r.value){u.value=`New password must be different from current password`;return}l.value=!0;try{let e=(await V.post(`/auth/change_password`,{current_password:r.value,new_password:i.value})).data;e&&e.success?(p.value=e.message||`Password changed successfully!`,setTimeout(()=>{n(`success`),n(`close`)},1500)):u.value=e?.error||`Failed to change password`}catch(e){console.error(`Password change error:`,e),u.value=e.response?.data?.error||`Failed to change password. Please try again.`}finally{l.value=!1}};return(t,n)=>(s(),f(_,{to:`body`},[e.isOpen?(s(),E(`div`,{key:0,class:`modal-backdrop`,onClick:M(m,[`self`])},[T(`div`,Di,[n[6]||=T(`h3`,{class:`text-xl font-semibold text-content-primary mb-2`},` Change Password `,-1),T(`p`,Oi,d(e.canSkip?`You're using the default password. Please change it to secure your account.`:`Enter your current password and choose a new one.`),1),T(`form`,{onSubmit:M(g,[`prevent`]),class:`space-y-4`},[T(`div`,null,[n[3]||=T(`label`,{class:`block text-sm font-medium text-content-secondary dark:text-content-primary/opacity-heavy mb-2`},`Current Password`,-1),o(T(`input`,{"onUpdate:modelValue":n[0]||=e=>r.value=e,type:`password`,required:``,class:`modal-input`,placeholder:`Enter current password`},null,512),[[P,r.value]])]),T(`div`,null,[n[4]||=T(`label`,{class:`block text-sm font-medium text-content-secondary dark:text-content-primary/opacity-heavy mb-2`},`New Password`,-1),o(T(`input`,{"onUpdate:modelValue":n[1]||=e=>i.value=e,type:`password`,required:``,minlength:`8`,class:`modal-input`,placeholder:`Enter new password (min 8 characters)`},null,512),[[P,i.value]])]),T(`div`,null,[n[5]||=T(`label`,{class:`block text-sm font-medium text-content-secondary dark:text-content-primary/opacity-heavy mb-2`},`Confirm New Password`,-1),o(T(`input`,{"onUpdate:modelValue":n[2]||=e=>a.value=e,type:`password`,required:``,minlength:`8`,class:`modal-input`,placeholder:`Confirm new password`},null,512),[[P,a.value]])]),u.value?(s(),E(`div`,ki,[T(`p`,Ai,d(u.value),1)])):b(``,!0),p.value?(s(),E(`div`,ji,[T(`p`,Mi,d(p.value),1)])):b(``,!0),T(`div`,Ni,[T(`button`,{type:`button`,onClick:h,disabled:l.value,class:`px-4 py-2 bg-background-mute dark:bg-white/opacity-subtle hover:bg-stroke-subtle dark:hover:bg-white/opacity-light text-content-primary rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light transition-colors disabled:opacity-50`},d(e.canSkip?`Skip for Now`:`Cancel`),9,Pi),T(`button`,{type:`submit`,disabled:l.value,class:`btn-primary flex items-center gap-2`},[l.value?(s(),f(Y,{key:0,size:`sm`,color:`current`})):b(``,!0),C(` `+d(l.value?`Changing...`:`Change Password`),1)],8,Fi)])],32)])])):b(``,!0)]))}});function Li(e,t){let n=z(),r=null,i=null,a=S(()=>(t.enabled===void 0?!0:u(t.enabled))&&n.canMaintainConnections),o=async()=>i||(i=Promise.resolve(e()).finally(()=>{i=null}),i),s=()=>{r!==null&&(clearInterval(r),r=null)},c=async()=>{s(),a.value&&(t.immediate!==!1&&await o(),r=window.setInterval(()=>{o()},t.intervalMs))};return v(a,e=>{e?c():s()},{immediate:!0}),k(()=>{s()}),{start:c,stop:s,runNow:o}}var Ri={class:`glass-card p-3 sm:p-6 mb-5 rounded-[20px] relative z-10`},zi={class:`flex justify-between items-center`},Bi={class:`flex items-center gap-3`},Vi={class:`hidden sm:block`},Hi={class:`text-content-primary text-2xl lg:text-[35px] font-bold mb-1 sm:mb-2`},Ui={class:`flex items-center gap-3 sm:gap-4 relative`},Wi={class:`text-right min-w-[120px] sm:min-w-[180px]`},Gi={key:0,class:`flex items-center gap-2 justify-end`},Ki={key:1,class:`space-y-1`},qi={class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},Ji={class:`text-primary font-medium`},Yi={key:0,class:`text-xs text-content-muted/opacity-heavy min-h-4`},Xi={key:0},Zi={key:2},Qi={key:0,class:`text-xs text-content-muted/opacity-heavy hidden sm:block min-h-4`},$i={class:`flex items-center justify-between mb-3`},ea={class:`flex items-center gap-2`},ta=[`disabled`],na=[`disabled`],ra={class:`space-y-3 text-sm`},ia={key:0,class:`bg-accent-red/opacity-light dark:bg-background-mute p-3 rounded-lg border border-accent-red/opacity-medium border-l-2 border-l-accent-red`},aa={class:`flex items-center justify-between`},oa={class:`text-accent-red font-bold`},sa={class:`text-xs text-content-muted mt-1`},ca={class:`mt-2 flex items-center gap-2`},la=[`disabled`],ua={key:1,class:`flex items-start gap-2 bg-accent-amber/opacity-light dark:bg-accent-amber/opacity-light border border-accent-amber dark:border-accent-amber/opacity-medium border-l-2 border-l-amber-500 rounded-lg p-3 text-xs text-accent-amber`},da={key:2,class:`bg-accent-green/opacity-light dark:bg-background-mute p-3 rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light border-l-2 border-l-accent-green`},fa={class:`flex items-center justify-between`},pa={class:`text-accent-green font-bold`},ma={key:0,class:`text-xs text-content-muted mt-1`},ha={class:`mt-2 flex items-center gap-2`},ga=[`disabled`],_a={key:3,class:`bg-background-mute dark:bg-background-mute p-3 rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light`},va={class:`flex items-center justify-center gap-2`},ya={key:4,class:`bg-accent-red/opacity-light dark:bg-background-mute p-3 rounded-lg border border-accent-red/opacity-medium border-l-2 border-l-accent-red`},ba={class:`text-xs text-content-secondary dark:text-content-muted`},xa={class:`bg-background-mute dark:bg-background-mute p-3 rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light border-l-2 border-l-primary`},Sa={class:`flex items-center justify-between`},Ca={class:`text-primary font-bold`},wa={key:0,class:`text-xs text-content-muted mt-1`},Ta={class:`flex items-center justify-between`},Ea={class:`text-content-primary font-medium`},Da={key:0,class:`mt-2`},Oa={class:`text-xs text-content-muted`},ka={class:`text-content-secondary`},Aa={key:5,class:`bg-background-mute dark:bg-background-mute p-4 rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light text-center`},ja={key:6,class:`bg-background-mute dark:bg-background-mute p-3 rounded-lg border border-stroke-subtle dark:border-stroke/opacity-light text-center`},Ma={class:`flex items-center justify-center gap-2`},Na={key:0,class:`mt-4 rounded-xl border border-accent-amber/opacity-heavy bg-accent-amber/opacity-light px-4 py-3 text-accent-amber`,role:`alert`},Pa={class:`flex items-start gap-3`},Fa={class:`font-semibold`},Ia={class:`text-sm opacity-90`},La=X(h({name:`TopBar`,__name:`TopBar`,emits:[`toggleMobileSidebar`],setup(e,{emit:r}){let i=r;ee();let a=re(),o=K(),u=z(),h=Vn(),v=Vn(),y=c(!1),D=c(!1),O=c(!1),k=c({hasUpdate:!1,currentVersion:``,latestVersion:``,isChecking:!1,lastChecked:null,error:null,rateLimitUntil:null}),A=c(te()||`User`),j=[`Chat Node`,`Repeater`,`Room Server`],M=Object.fromEntries(Object.entries(G).map(([e,t])=>[t,e])),N=S(()=>{let e={};for(let t of j){let n=M[t];e[t]=o.advertsByType[n]||[]}return e}),P=S(()=>o.isLoading),F=S(()=>o.lastFetched?new Date(o.lastFetched):null),I=async(e=!1)=>{if(!k.value.isChecking)try{k.value.isChecking=!0,k.value.error=null,await U.post(`/update/check`,e?{force:!0}:{});for(let e=0;e<20;e++){let e=await U.get(`/update/status`);if(e.success&&e.state!==`checking`){k.value.currentVersion=e.current_version??``,k.value.latestVersion=e.latest_version??``,k.value.hasUpdate=!!e.has_update,k.value.lastChecked=new Date,k.value.error=e.error??null,k.value.rateLimitUntil=e.rate_limit_until??null;return}await new Promise(e=>setTimeout(e,500))}k.value.error=`Version check timed out`}catch(e){console.error(`Error checking for updates:`,e),k.value.error=e instanceof Error?e.message:`Failed to check for updates`}finally{k.value.isChecking=!1}},L=()=>{h.close(),I(),a.fetchStats()},R=e=>{k.value.currentVersion=e.currentVersion,k.value.latestVersion=e.latestVersion,k.value.hasUpdate=e.hasUpdate,k.value.lastChecked=new Date},B=()=>{u.stopSession(`logout`)},V=S(()=>Object.values(N.value).reduce((e,t)=>e+t.length,0)),H=S(()=>j.map(e=>({type:e,count:N.value[e]?.length||0})).filter(e=>e.count>0)),W=S(()=>!0),ne=S(()=>{if(String(a.stats?.radio_status??``).toLowerCase()!==`degraded`)return null;let e=a.stats?.config?.radio_type??`configured radio`,t=a.stats?.radio_error||`Radio initialization failed`;return{title:`Radio degraded (${e})`,details:t}}),q=e=>({"Chat Node":`text-primary`,Repeater:`text-accent-green`,"Room Server":`text-accent-purple`})[e]||`text-content-muted`,J=e=>{let t=N.value[e]||[];return t.length===0?`None`:t.reduce((e,t)=>t.last_seen>e.last_seen?t:e,t[0]).node_name||`Unknown Node`};t(()=>{I()}),Li(()=>I(),{intervalMs:6e5,enabled:!0,immediate:!1});let ie=()=>{i(`toggleMobileSidebar`)};return(e,t)=>(s(),E(w,null,[T(`div`,Ri,[T(`div`,zi,[T(`div`,Bi,[T(`button`,{onClick:ie,class:`lg:hidden topbar-icon-btn`},[...t[14]||=[T(`svg`,{class:`w-5 h-5 text-content-secondary dark:text-content-primary`,viewBox:`0 0 20 20`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`},[T(`path`,{d:`M3 6h14M3 10h14M3 14h14`,stroke:`currentColor`,"stroke-width":`1.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`})],-1)]]),T(`div`,Vi,[T(`h1`,Hi,` Hi `+d(A.value)+`👋 `,1)])]),T(`div`,Ui,[T(`div`,Wi,[P.value?(s(),E(`div`,Gi,[x(Y,{size:`xs`}),t[15]||=T(`p`,{class:`text-content-secondary dark:text-content-muted text-xs sm:text-sm`},` Loading... `,-1)])):V.value>0?(s(),E(`div`,Ki,[T(`p`,qi,[t[16]||=C(` Tracking: `,-1),T(`span`,Ji,d(V.value)+` node`+d(V.value===1?``:`s`),1)]),H.value.length>0?(s(),E(`div`,Yi,[(s(!0),E(w,null,n(H.value,(e,t)=>(s(),E(`span`,{key:e.type,class:`inline`},[C(d(e.count)+` `+d(e.type)+d(e.count===1?``:`s`),1),t