ocearo-ui 2.1.1 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/404.html +1 -1
  2. package/__next.__PAGE__.txt +3 -3
  3. package/__next._full.txt +3 -3
  4. package/__next._tree.txt +2 -2
  5. package/_next/static/chunks/0-19-ljntm5ig.js +1 -0
  6. package/_next/static/chunks/{096zaxs1gf_3q.js → 0-g-ujyrfgutp.js} +2 -2
  7. package/_next/static/chunks/0c91q-13wh8hk.js +1 -0
  8. package/_next/static/chunks/{2aivnrnff0avu.js → 0fv1wwxeyagln.js} +2 -2
  9. package/_next/static/chunks/0nq1o9-m7bhjg.js +1 -0
  10. package/_next/static/chunks/0o7hu-sypv2u9.js +1 -0
  11. package/_next/static/chunks/{2wayx8t5r5fi9.js → 0ujzg6ofy2r73.js} +1 -1
  12. package/_next/static/chunks/162bfkgcudvew.js +9 -0
  13. package/_next/static/chunks/{1l-jew0-1-3eq.js → 1bvrvkcwf3ge-.js} +2 -2
  14. package/_next/static/chunks/{33u782y6vhw-f.js → 1do-2zwq3ws0f.js} +1 -1
  15. package/_next/static/chunks/{2mzecccvvbjr1.js → 1ho2ekxa9io1_.js} +1 -1
  16. package/_next/static/chunks/1m3-nchdgcxy1.css +3 -0
  17. package/_next/static/chunks/{3qik_nv7zlj4e.js → 1quvj-861o57h.js} +1 -1
  18. package/_next/static/chunks/{0j11dppxb9l0b.js → 1zuex-na8y-w4.js} +1 -1
  19. package/_next/static/chunks/{2r98jty3a4wel.js → 271ys-u920uqd.js} +5 -5
  20. package/_next/static/chunks/2_iau6x7s0vil.js +1131 -0
  21. package/_next/static/chunks/2ab6q6u6uo_bf.js +1 -0
  22. package/_next/static/chunks/2pt-apz8_pa4j.js +1 -0
  23. package/_next/static/chunks/2rnpgrmuyhpkd.js +119 -0
  24. package/_next/static/chunks/3e5jmzthktu9w.js +1 -0
  25. package/_next/static/chunks/3l25j666ze4c1.js +1 -0
  26. package/_next/static/chunks/{2gr1d26f-ymoh.js → 3utjjgdhnlx86.js} +1 -1
  27. package/_next/static/chunks/44f5hh9caupby.js +1 -0
  28. package/_not-found/__next._full.txt +2 -2
  29. package/_not-found/__next._not-found.__PAGE__.txt +2 -2
  30. package/_not-found/__next._tree.txt +2 -2
  31. package/_not-found.html +1 -1
  32. package/_not-found.txt +2 -2
  33. package/index.html +1 -1
  34. package/index.txt +3 -3
  35. package/package.json +1 -1
  36. package/settings/__next._full.txt +2 -2
  37. package/settings/__next._tree.txt +2 -2
  38. package/settings/__next.settings.__PAGE__.txt +2 -2
  39. package/settings.html +1 -1
  40. package/settings.txt +2 -2
  41. package/_next/static/chunks/0b3cus8izqkmg.js +0 -119
  42. package/_next/static/chunks/0zvzu5fnwh4_a.js +0 -9
  43. package/_next/static/chunks/1_g85m2d7jjpo.css +0 -3
  44. package/_next/static/chunks/1arvue9o-atui.js +0 -739
  45. package/_next/static/chunks/1cp1kkarm5gxz.js +0 -1
  46. package/_next/static/chunks/1hz_mzl8l35j8.js +0 -1
  47. package/_next/static/chunks/1k72cpd0x8veh.js +0 -1
  48. package/_next/static/chunks/2fthh9f57zzm2.js +0 -1
  49. package/_next/static/chunks/2v6ebsavxlgyw.js +0 -1
  50. package/_next/static/chunks/3qzb9nvvw-b-k.js +0 -1
  51. package/_next/static/chunks/3td9mnhvcj9cq.js +0 -1
  52. package/_next/static/chunks/432vtxrssprta.js +0 -1
  53. /package/_next/static/{QMD1VkISjzTIQCzLSHPpB → m52l9mE01yTljNwbWjYQ7}/_buildManifest.js +0 -0
  54. /package/_next/static/{QMD1VkISjzTIQCzLSHPpB → m52l9mE01yTljNwbWjYQ7}/_clientMiddlewareManifest.js +0 -0
  55. /package/_next/static/{QMD1VkISjzTIQCzLSHPpB → m52l9mE01yTljNwbWjYQ7}/_ssgManifest.js +0 -0
@@ -0,0 +1,119 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,84226,e=>{"use strict";var t=e.i(43476),r=e.i(71645),a=e.i(57384);e.i(67561);var n=e.i(46991),i=e.i(85709),o=e.i(83402),l=e.i(90072),s=e.i(16196),u=e.i(83646);let d=({position:e=[0,0,0],rotation:r=[0,0,0],speed:a,color:n,fontSize:i=.5,textPosition:o=[0,.8,0],arrowSize:d=1})=>{let{scene:c}=(0,u.default)(),h=n||c.wind;return(0,t.jsxs)("group",{position:e,rotation:r,children:[(0,t.jsx)(s.Text,{characters:".0123456789",color:h,fontSize:i*d,position:o,font:"fonts/Roboto-Bold.ttf",anchorX:"center",anchorY:"middle",children:a.toFixed(1)}),(0,t.jsxs)("mesh",{children:[(0,t.jsx)("shapeGeometry",{args:[new l.Shape([new l.Vector2(0,0),new l.Vector2(.5*d*Math.cos(5*Math.PI/6),.5*d*Math.sin(5*Math.PI/6)),new l.Vector2(0,-.577*d),new l.Vector2(0,-.577*d),new l.Vector2(-.5*d*Math.cos(5*Math.PI/6),.5*d*Math.sin(5*Math.PI/6)),new l.Vector2(0,0)])]}),(0,t.jsx)("meshStandardMaterial",{color:h,side:l.DoubleSide})]})]})};d.propTypes={position:a.default.oneOfType([a.default.instanceOf(l.Vector3),a.default.arrayOf(a.default.number)]).isRequired,rotation:a.default.arrayOf(a.default.number).isRequired,speed:a.default.number.isRequired,color:a.default.oneOfType([a.default.string,a.default.number]).isRequired,fontSize:a.default.number,textPosition:a.default.arrayOf(a.default.number),arrowSize:a.default.number};let c=({outerRadius:e})=>{let a=o.default.get("preferredWindSpeedPath")||"speedTrue",s=o.default.get("preferredWindDirectionPath")||"directionTrue",c=o.default.get("preferredHeadingPath")||"courseOverGroundTrue",h=(0,r.useMemo)(()=>["environment.wind.angleTrueGround","environment.wind.speedOverGround","environment.wind.directionTrue","environment.wind.speedTrue","environment.wind.angleApparent","environment.wind.speedApparent","environment.wind.angleTrueWater","navigation.headingTrue","navigation.headingMagnetic","navigation.courseOverGroundTrue","navigation.courseOverGroundMagnetic"],[]),m=(0,i.useSignalKPaths)(h),f=(0,r.useMemo)(()=>{if("directionTrue"===s){let e=m[`environment.wind.${s}`]??m["environment.wind.directionTrue"];if(null!=e)return Math.PI/2-(e-(m[`navigation.${c}`]??m["navigation.headingTrue"]??m["navigation.courseOverGroundTrue"]??0));let t=m["environment.wind.angleTrueGround"]??m["environment.wind.angleTrueWater"];if(null!=t)return Math.PI/2-t}else{let e=m[`environment.wind.${s}`]??m["environment.wind.angleTrueGround"]??m["environment.wind.angleTrueWater"];if(null!=e)return Math.PI/2-e;let t=m["environment.wind.directionTrue"];if(null!=t)return Math.PI/2-(t-(m[`navigation.${c}`]??m["navigation.headingTrue"]??m["navigation.courseOverGroundTrue"]??0))}return Math.PI/2},[m,s,c]),p=(0,r.useMemo)(()=>{let e=m[`environment.wind.${a}`]??m["environment.wind.speedOverGround"]??m["environment.wind.speedTrue"];return(0,n.convertSpeedUnit)(e)||0},[m,a]),g=(0,r.useMemo)(()=>Math.PI/2-(m["environment.wind.angleApparent"]||0),[m]),v=(0,r.useMemo)(()=>(0,n.convertSpeedUnit)(m["environment.wind.speedApparent"])||0,[m]),y=(0,r.useMemo)(()=>new l.Vector3((e+.7)*Math.cos(f),0,-(e+.7)*Math.sin(f)),[e,f]),w=(0,r.useMemo)(()=>new l.Vector3((e+.7)*Math.cos(g),0,-(e+.7)*Math.sin(g)),[e,g]),M=(0,u.default)();return(0,t.jsxs)("group",{children:[p>0&&!0!==o.default.get("hideTrueWind")&&(0,t.jsx)(d,{position:y,rotation:[-Math.PI/2,0,-(Math.PI/2-f)],speed:p,color:M.ok,fontSize:1}),v>0&&(0,t.jsx)(d,{position:w,rotation:[-Math.PI/2,0,-(Math.PI/2-g)],speed:v,color:M.accent,fontSize:1})]})};c.propTypes={outerRadius:a.default.number.isRequired},e.s(["default",0,c])},88608,e=>{"use strict";let t=0,r=new Set;e.s(["getForecastHour",0,()=>t,"setForecastHour",0,e=>{t=Math.max(0,e),r.forEach(e=>e(t))},"subscribeForecast",0,e=>(r.add(e),()=>r.delete(e))])},3666,3950,e=>{"use strict";let t="ocearo-offline-v2",r=["ocearo-offline-v1"],a=!1,n=async(e,{kind:n="tile"}={})=>{if(!("u">typeof caches))return fetch(e,{referrerPolicy:"strict-origin-when-cross-origin"});a||(a=!0,r.forEach(e=>caches.delete(e).catch(()=>{})));let i=await caches.open(t);if("tile"===n){let t=await i.match(e);if(t)return t}try{let t=await fetch(e,{mode:"cors",referrerPolicy:"strict-origin-when-cross-origin"});if(t.ok)await i.put(e,t.clone());else{let t=await i.match(e);if(t)return t}return t}catch(r){let t=await i.match(e);if(t)return t;throw r}},i=async e=>{let t=await n(e,{kind:"tile"});if(!t.ok)throw Error(`${t.status} ${e}`);return createImageBitmap(await t.blob())},o=(e,t,r,a)=>{let n=2**a,i=(e,t)=>({x:Math.floor((t+180)/360*n),y:Math.floor((1-Math.log(Math.tan(e*Math.PI/180)+1/Math.cos(e*Math.PI/180))/Math.PI)/2*n)}),o=r/111320,l=r/(111320*Math.cos(e*Math.PI/180)),s=i(e+o,t-l),u=i(e-o,t+l),d=[];for(let e=s.x;e<=u.x;e++)for(let t=s.y;t<=u.y;t++)d.push({z:a,x:e,y:t});return d},l=async({lat:e,lon:t,radiusM:r,layers:a,urls:i=[],onProgress:l})=>{let s=[];for(let{template:n,zooms:i}of a)for(let a of i)for(let i of o(e,t,r,a))s.push(n.replace("{z}",i.z).replace("{x}",i.x).replace("{y}",i.y));s.push(...i);let u=0,d=0,c=[...s],h=async()=>{for(;c.length;){let e=c.shift();try{!(await n(e,{kind:e.includes("forecast")?"forecast":"tile"})).ok&&d++}catch{d++}u++,l?.(u,s.length,d)}};return await Promise.all(Array.from({length:4},h)),{done:u,failed:d,total:s.length}},s=async()=>{if(navigator.storage?.estimate){let{usage:e}=await navigator.storage.estimate();return e}return null},u=async(e,r)=>{if(!("u">typeof caches))return!1;let a=await caches.open(t);return await a.put(e,r),!0},d=async e=>{if(!("u">typeof caches))return null;let r=await caches.open(t);return await r.match(e)||null};e.s(["cachedFetch",0,n,"cachedImage",0,i,"clearOfflineCache",0,()=>"u">typeof caches?caches.delete(t):Promise.resolve(!1),"offlineCacheSize",0,s,"prefetchArea",0,l,"readCached",0,d,"storeCached",0,u],3950);let c={key:null,at:0,field:null},h=(e,t,r,a)=>({lat:e+(a/8*2-1)*4e4/6371e3*180/Math.PI,lon:t+(r/8*2-1)*4e4/(6371e3*Math.cos(e*Math.PI/180))*180/Math.PI}),m=(e,t)=>{let r=[],a=[];for(let n=0;n<9;n++)for(let i=0;i<9;i++){let o=h(e,t,i,n);r.push(o.lat.toFixed(4)),a.push(o.lon.toFixed(4))}return`https://api.open-meteo.com/v1/forecast?latitude=${r.join(",")}&longitude=${a.join(",")}&hourly=wind_speed_10m,wind_direction_10m&wind_speed_unit=ms&forecast_hours=48&timezone=GMT`},f=async(e,t)=>{let r=`${e.toFixed(1)},${t.toFixed(1)}`;if(c.field&&c.key===r&&Date.now()-c.at<18e5)return c.field;let a=m(e,t),i=await n(a,{kind:"forecast"});if(!i.ok)throw Error(`Open-Meteo ${i.status}`);let o=await i.json(),l=Array.isArray(o)?o:[o],s=l[0]?.hourly?.time||[],u=s.length,d=[],h=[];for(let e=0;e<u;e++){let t=new Float32Array(81),r=new Float32Array(81);l.forEach((a,n)=>{let i=a.hourly.wind_speed_10m[e]??0,o=(a.hourly.wind_direction_10m[e]??0)*Math.PI/180;t[n]=-i*Math.sin(o),r[n]=-i*Math.cos(o)}),d.push(t),h.push(r)}let f={origin:{lat:e,lon:t},start:Date.parse(`${s[0]}Z`),hours:u,u:d,v:h,source:"open-meteo"};return c={key:r,at:Date.now(),field:f},f},p=[[0,[98,113,183]],[1,[57,97,159]],[3,[74,148,169]],[5,[77,141,123]],[7,[83,165,83]],[9,[53,159,53]],[11,[167,157,81]],[13,[159,127,58]],[15,[161,108,92]],[17,[129,58,78]],[19,[175,80,136]],[21,[117,74,147]],[24,[109,97,163]],[27,[68,105,141]],[29,[92,144,152]],[36,[125,68,165]]];e.s(["HALF_EXTENT_M",0,4e4,"WINDY_SCALE",0,p,"fetchWindField",0,f,"sampleWind",0,(e,t,r,a=0)=>{let n=Math.min(9-1.001,Math.max(0,(t/4e4+1)/2*8)),i=Math.min(9-1.001,Math.max(0,(r/4e4+1)/2*8)),o=Math.floor(n),l=Math.floor(i),s=n-o,u=i-l,d=Math.min(e.hours-1,Math.max(0,Math.floor(a))),c=Math.min(e.hours-1,d+1),h=Math.min(1,Math.max(0,a-d)),m=(e,t)=>{let r=e[t],a=9*l+o;return(r[a]*(1-s)+r[a+1]*s)*(1-u)+(r[a+9]*(1-s)+r[a+9+1]*s)*u};return{u:m(e.u,d)*(1-h)+m(e.u,c)*h,v:m(e.v,d)*(1-h)+m(e.v,c)*h}},"uniformField",0,(e,t,r,a)=>{let n=new Float32Array(81).fill(-r*Math.sin(a)),i=new Float32Array(81).fill(-r*Math.cos(a));return{origin:{lat:e,lon:t},start:Date.now(),hours:1,u:[n],v:[i],source:"boat"}},"windColor",0,e=>{if(e<=p[0][0])return p[0][1];for(let t=1;t<p.length;t++)if(e<=p[t][0]){let[r,a]=p[t-1],[n,i]=p[t],o=(e-r)/(n-r);return a.map((e,t)=>e+(i[t]-e)*o)}return p[p.length-1][1]},"windFieldUrl",0,m],3666)},71415,e=>{"use strict";var t=e.i(43476),r=e.i(71645),a=e.i(90072),n=e.i(60099),i=e.i(43216),o=e.i(83646),l=e.i(83402),s=e.i(85709),u=e.i(78461),d=e.i(3950),c=e.i(48390);e.i(85269);var h=e.i(22831);let m="https://elevation-tiles-prod.s3.amazonaws.com/terrarium/{z}/{x}/{y}.png",f=10,p=.1,g=["navigation.position","design.draft","environment.tide.heightNow","environment.tide.heightHigh","environment.tide.heightLow","environment.depth.belowSurface","environment.depth.belowKeel","environment.depth.belowTransducer","environment.depth.surfaceToTransducer"],v=(e,t,r)=>{let a=2**r,n=e*Math.PI/180,i=(1-Math.log(Math.tan(n)+1/Math.cos(n))/Math.PI)/2*a;return{x:(t+180)/360*a,y:i}},y=(e,t,r)=>{let a=2**r;return{lat:180*Math.atan(Math.sinh(Math.PI*(1-2*t/a)))/Math.PI,lon:e/a*360-180}},w=new Map,M=async(e,t,r=m,a=f)=>{let n=v(e,t,a),i=Math.floor(n.x)-1,o=Math.floor(n.y)-1,l=`${r}|${a}/${i},${o}`;if(w.has(l))return w.get(l);let s=document.createElement("canvas");s.width=768,s.height=768;let u=s.getContext("2d",{willReadFrequently:!0});if(!(await Promise.all(Array.from({length:9},async(e,t)=>{let n=i+t%3,l=o+Math.floor(t/3),s=r.replace("{z}",a).replace("{x}",n).replace("{y}",l);try{let e=await (0,d.cachedImage)(s);return u.drawImage(e,t%3*256,256*Math.floor(t/3)),!0}catch{return!1}}))).some(Boolean))return null;let c=u.getImageData(0,0,768,768).data,h=new Float32Array(589824);for(let e=0;e<589824;e++)h[e]=c[4*e+3]<255?NaN:256*c[4*e]+c[4*e+1]+c[4*e+2]/256-32768;let p={heights:h,size:768,nw:y(i,o,a),se:y(i+3,o+3,a),z:a};return w.set(l,p),p},b=async(e,t)=>{let r=(0,c.bathymetryTileTemplate)(),[a,n]=await Promise.all([M(e,t),r?M(e,t,r,13).catch(()=>null):null]);if(!a&&!n)throw Error("No bathymetry");return{global:a,shom:n}},x=(e,t,r)=>{let{heights:a,size:n,nw:i,se:o,z:l}=e,s=(r-i.lon)/(o.lon-i.lon)*(n-1),u=v(i.lat,i.lon,l),d=v(o.lat,o.lon,l),c=(v(t,r,l).y-u.y)/(d.y-u.y)*(n-1);if(s<0||c<0||s>n-1||c>n-1)return NaN;let h=Math.min(n-2,Math.floor(s)),m=Math.min(n-2,Math.floor(c)),f=s-h,p=c-m,g=(e,t)=>a[t*n+e];return(g(h,m)*(1-f)+g(h+1,m)*f)*(1-p)+(g(h,m+1)*(1-f)+g(h+1,m+1)*f)*p},F=`
2
+ attribute float aDepth;
3
+ attribute float aDrying;
4
+ attribute vec2 aGround;
5
+ varying float vDepth;
6
+ varying float vDrying;
7
+ varying vec2 vGround;
8
+ varying vec3 vWorld;
9
+ void main() {
10
+ vDepth = aDepth;
11
+ vDrying = aDrying;
12
+ vGround = aGround;
13
+ vec4 w = modelMatrix * vec4(position, 1.0);
14
+ vWorld = w.xyz;
15
+ gl_Position = projectionMatrix * viewMatrix * w;
16
+ }
17
+ `,N=`
18
+ uniform float uDanger;
19
+ uniform vec3 uShallow;
20
+ uniform vec3 uMid;
21
+ uniform vec3 uDeep;
22
+ uniform vec3 uLand;
23
+ uniform vec3 uDrying;
24
+ uniform vec3 uLine;
25
+ uniform vec3 uDangerColor;
26
+ uniform vec3 uFade;
27
+ uniform float uFadeNear;
28
+ uniform float uFadeFar;
29
+ varying float vDepth;
30
+ varying float vDrying;
31
+ varying vec2 vGround;
32
+ varying vec3 vWorld;
33
+
34
+ float contour(float d, float level, float width) {
35
+ float w = fwidth(d);
36
+ return 1.0 - smoothstep(0.0, w * width, abs(d - level));
37
+ }
38
+ float gridLines(vec2 p, float spacing, float width) {
39
+ vec2 g = abs(fract(p / spacing - 0.5) - 0.5) * spacing;
40
+ vec2 w = fwidth(p) * width;
41
+ vec2 l = 1.0 - smoothstep(vec2(0.0), w, g);
42
+ return max(l.x, l.y);
43
+ }
44
+
45
+ void main() {
46
+ vec3 c;
47
+ if (vDepth <= 0.0) {
48
+ c = vDrying > 0.5 ? uDrying : uLand;
49
+ } else if (vDepth < 6.0) {
50
+ c = mix(uShallow, uMid, vDepth / 6.0);
51
+ } else {
52
+ // Darker with depth, as light fades under water: the relief reads at a glance
53
+ c = mix(uMid, uDeep, clamp((vDepth - 6.0) / 18.0, 0.0, 1.0));
54
+ }
55
+ // Relief: hill shading from the north-west, as on a shaded survey
56
+ vec3 n = normalize(cross(dFdx(vWorld), dFdy(vWorld)));
57
+ if (n.y < 0.0) n = -n;
58
+ c *= 0.5 + 0.65 * clamp(dot(n, normalize(vec3(-0.6, 0.7, -0.5))), 0.0, 1.0);
59
+ // Too shallow for us: orange hatching (not a fill, which reads as land)
60
+ if (vDepth > 0.0 && vDepth < uDanger) {
61
+ float hatch = step(0.55, fract((vGround.x + vGround.y) / 14.0));
62
+ c = mix(c, uDangerColor, 0.25 + 0.45 * hatch);
63
+ }
64
+ // The survey grid, fading out with distance before it shimmers
65
+ float dist = length(vWorld.xz);
66
+ float gridFade = 1.0 - smoothstep(900.0, 1700.0, dist);
67
+ float minor = gridLines(vGround, 50.0, 1.5) * 0.55;
68
+ float major = gridLines(vGround, 250.0, 2.4) * 0.85;
69
+ c = mix(c, uLine, max(minor, major) * gridFade * (vDepth > 0.0 ? 1.0 : 0.4));
70
+ // Isobaths, the drying line bold
71
+ float lines = max(max(contour(vDepth, 2.0, 1.5), contour(vDepth, 5.0, 1.5)), max(contour(vDepth, 10.0, 1.5), contour(vDepth, 20.0, 1.5)));
72
+ lines = max(lines, max(contour(vDepth, 30.0, 1.2), contour(vDepth, 50.0, 1.2)) * 0.7);
73
+ lines = max(lines, contour(vDepth, 0.0, 2.5));
74
+ lines = max(lines, contour(vDepth, uDanger, 2.0) * 0.9);
75
+ c = mix(c, uLine * 0.75, clamp(lines, 0.0, 1.0) * 0.85);
76
+ c = mix(c, uFade, smoothstep(uFadeNear, uFadeFar, dist));
77
+ gl_FragColor = vec4(c, 1.0);
78
+ #include <colorspace_fragment>
79
+ }
80
+ `,T={light:{water:"#8fd3ff",waterOpacity:.18,shallow:"#b5e0f2",mid:"#5fa8d8",deep:"#1c4f86",land:"#e2d6b8",drying:"#c7d3a6",line:"#0f3557",danger:"#e8873a",fade:"#e8eef3",text:"#0f2f4f",halo:"#ffffff"},dark:{water:"#7cc8f2",waterOpacity:.12,shallow:"#3a8fbc",mid:"#1d5f8c",deep:"#0b2238",land:"#4a4434",drying:"#34472e",line:"#8fdcff",danger:"#f0a060",fade:"#16191e",text:"#e6f4ff",halo:"#101216"},night:{water:"#c0503c",waterOpacity:.1,shallow:"#7a2a1e",mid:"#4f1a12",deep:"#24100c",land:"#3a1a10",drying:"#3a2410",line:"#ff8a72",danger:"#ffad80",fade:"#120807",text:"#ffb3a3",halo:"#0f0706"}},P=[96,40],k=`
81
+ attribute vec3 aCenter;
82
+ attribute vec2 aCell;
83
+ uniform vec2 uAtlas;
84
+ uniform float uSize;
85
+ varying vec2 vUv;
86
+ varying float vFade;
87
+ void main() {
88
+ vec4 mv = modelViewMatrix * vec4(aCenter, 1.0);
89
+ float d = -mv.z;
90
+ // Constant size on screen (like the HUD text), none right under the camera
91
+ float size = d * uSize;
92
+ mv.xy += position.xy * vec2(size * 2.4, size);
93
+ vUv = (aCell + vec2(position.x + 0.5, 0.5 - position.y)) / uAtlas;
94
+ vFade = (1.0 - smoothstep(1100.0, 1700.0, length(aCenter.xz))) * smoothstep(25.0, 60.0, d);
95
+ gl_Position = projectionMatrix * mv;
96
+ }
97
+ `,D=`
98
+ uniform sampler2D uMap;
99
+ varying vec2 vUv;
100
+ varying float vFade;
101
+ void main() {
102
+ vec4 t = texture2D(uMap, vUv);
103
+ if (t.a * vFade < 0.05) discard;
104
+ gl_FragColor = vec4(t.rgb, t.a * vFade);
105
+ #include <colorspace_fragment>
106
+ }
107
+ `,S=({items:e,palette:n})=>{let{geometry:i,material:o}=(0,r.useMemo)(()=>{if(!e.length)return{};let[t,r]=P,i=Math.ceil(e.length/16),o=document.createElement("canvas");o.width=16*t,o.height=r*i;let l=o.getContext("2d");l.textAlign="center",l.textBaseline="middle";let s=new a.PlaneGeometry(1,1),u=new a.InstancedBufferGeometry;u.index=s.index,u.setAttribute("position",s.attributes.position);let d=new Float32Array(3*e.length),c=new Float32Array(2*e.length);e.forEach((e,a)=>{let i=a%16*t,o=Math.floor(a/16)*r;l.font=`${e.danger?700:600} 28px Inter, Roboto, Arial, sans-serif`,l.lineWidth=7,l.strokeStyle=n.halo,l.strokeText(e.text,i+t/2,o+r/2+1),l.fillStyle=e.danger?n.danger:n.text,l.fillText(e.text,i+t/2,o+r/2+1),d.set(e.position,3*a),c.set([a%16,Math.floor(a/16)],2*a)}),u.setAttribute("aCenter",new a.InstancedBufferAttribute(d,3)),u.setAttribute("aCell",new a.InstancedBufferAttribute(c,2)),u.instanceCount=e.length;let h=new a.CanvasTexture(o);h.colorSpace=a.SRGBColorSpace,h.flipY=!1,h.anisotropy=4;let m=new a.ShaderMaterial({uniforms:{uMap:{value:h},uAtlas:{value:new a.Vector2(16,i)},uSize:{value:.03}},vertexShader:k,fragmentShader:D,transparent:!0,depthWrite:!1});return s.dispose(),{geometry:u,material:m}},[e,n]);return((0,r.useEffect)(()=>()=>{i?.dispose(),o?.uniforms.uMap.value.dispose(),o?.dispose()},[i,o]),i)?(0,t.jsx)("mesh",{geometry:i,material:o,frustumCulled:!1,renderOrder:3}):null},C=e=>e<10?e.toFixed(1):String(Math.round(e));e.s(["BATHY_ZOOM",0,10,"TERRARIUM",0,m,"default",0,({y:e=-.1})=>{let d,m=(0,s.useSignalKPaths)(g),{t:y}=(0,h.useTranslation)(),{id:w}=(0,o.default)(),M=m["navigation.position"],{heading:P}=(0,u.default)(),[k,D]=(0,r.useState)(null),I=l.default.get("aisLengthScalingFactor")||.7,_=Number.isFinite(m["design.draft"]?.maximum)?m["design.draft"].maximum:Number(l.default.get("boatDraft"))||2,A=m["environment.depth.belowSurface"],O=m["environment.depth.belowKeel"],j=m["environment.depth.belowTransducer"],$=m["environment.depth.surfaceToTransducer"],G=Number.isFinite(A)?A:Number.isFinite(O)?O+_:Number.isFinite(j)?j+(Number.isFinite($)?$:0):null,E=T[w]||T.light,R=M?.latitude,z=M?.longitude,L=Number.isFinite(R)?(d=v(R,z,f),`${Math.floor(d.x)},${Math.floor(d.y)}`):null;(0,r.useEffect)(()=>{if(!L)return;let e=!1,t=null,r=()=>b(R,z).then(a=>{!e&&(D(a),!a.shom&&(0,c.bathymetryTileTemplate)()&&(t=setTimeout(r,6e4)))}).catch(()=>{e||(t=setTimeout(r,6e4))});return r(),()=>{e=!0,clearTimeout(t)}},[L]);let W=Number.isFinite(R)?Math.round(5e3*R):null,B=Number.isFinite(z)?Math.round(5e3*z):null,H=(0,r.useMemo)(()=>k&&null!==W?{survey:k.shom?x(k.shom,R,z):NaN,global:k.global?x(k.global,R,z):NaN}:{},[k,W,B]),U=(({tideNow:e,tideHigh:t,tideLow:r,measured:a,surveyHere:n,globalHere:i})=>{let o=(e,t=p)=>Math.round(e/t)*t;if(Number.isFinite(e)){let a=Number.isFinite(t)&&Number.isFinite(r)?e-(t+r)/2:0;return{cd:o(e),msl:o(a),source:"tide"}}if(Number.isFinite(a)&&(Number.isFinite(n)||Number.isFinite(i))){let e=Number.isFinite(n)?a+n:0,t=Number.isFinite(i)?a+i:0;return{cd:o(e,.5),msl:o(t,.5),source:"sounder"}}return{cd:0,msl:0,source:"datum"}})({tideNow:m["environment.tide.heightNow"],tideHigh:m["environment.tide.heightHigh"],tideLow:m["environment.tide.heightLow"],measured:G,surveyHere:H.survey,globalHere:H.global}),V=U.cd,K=U.msl,q=(0,r.useMemo)(()=>k?(e,t)=>{let r=k.shom?x(k.shom,e,t):NaN;if(Number.isFinite(r))return{h:r-V,drying:r<6.5};let a=k.global?x(k.global,e,t):NaN;return Number.isFinite(a)?{h:a-K,drying:a<3}:null}:null,[k,V,K]),X=Math.round((Number.isFinite(G)?G:_+1)*2)/2,Y=(0,r.useMemo)(()=>{if(!q||!Number.isFinite(R))return q;let e=k.shom&&Number.isFinite(x(k.shom,R,z));return((e,t,r,a,n)=>{let i=e(t,r),o=-a;if(!i||i.h<=o)return e;let l=o-i.h,s=111320*Math.cos(t*Math.PI/180);return(a,i)=>{let o=e(a,i);if(!o)return o;let u=Math.hypot((a-t)*111320,(i-r)*s)/n;if(u>=1)return o;let d=1-u*u*(3-2*u);return{h:o.h+l*d,drying:!(d>.5)&&o.drying}}})(q,R,z,X,e?60:350)},[q,X,W,B]),Z=(0,r.useMemo)(()=>{let e,t;if(!Y||!Number.isFinite(R))return null;let r=k.shom?240:160,n=(k.shom,1),i=new a.PlaneGeometry(6e3*I,6e3*I,r,r),o=i.attributes.position,l=new Float32Array(o.count),s=new Float32Array(o.count),u=new Float32Array(2*o.count),d=111320*Math.cos(R*Math.PI/180),c=(e=Math.round(10*R)/10,t=Math.round(10*z)/10,{east:(z-t)*111320*Math.cos(e*Math.PI/180),north:(R-e)*111320});for(let e=0;e<o.count;e++){let t=o.getX(e)/I,r=o.getY(e)/I,a=Y(R+r/111320,z+t/d),i=a?a.h:0;l[e]=-i,s[e]=+!!a?.drying,u[2*e]=c.east+t,u[2*e+1]=c.north+r,o.setZ(e,i<0?i*n*I:(.15+ +Math.min(i,4))*I)}i.setAttribute("aDepth",new a.BufferAttribute(l,1)),i.setAttribute("aDrying",new a.BufferAttribute(s,1)),i.setAttribute("aGround",new a.BufferAttribute(u,2)),i.computeVertexNormals();let h=[],m=250*Math.ceil((c.east-1500)/250),f=250*Math.ceil((c.north-1500)/250);for(let e=m;e<=c.east+1500;e+=250)for(let t=f;t<=c.north+1500;t+=250){let r=e-c.east+125,a=t-c.north+125;if(Math.hypot(r,a)>1500)continue;let i=Y(R+a/111320,z+r/d);if(!i||i.h>=-.1)continue;let o=-i.h;h.push({text:C(o),danger:o<_+1,position:[r*I,i.h*n*I+2,-a*I]})}let p=Y(R,z);return{geometry:i,items:h,exaggeration:n,bottom:p&&p.h<0?p.h*n*I:null,depthHere:p?-p.h:null}},[Y,I,_,R&&Math.round(500*R),z&&Math.round(500*z)]);(0,r.useEffect)(()=>()=>Z?.geometry.dispose(),[Z]);let J=(0,r.useMemo)(()=>new a.ShaderMaterial({uniforms:{uDanger:{value:3},uShallow:{value:new a.Color},uMid:{value:new a.Color},uDeep:{value:new a.Color},uLand:{value:new a.Color},uDrying:{value:new a.Color},uLine:{value:new a.Color},uDangerColor:{value:new a.Color},uFade:{value:new a.Color},uFadeNear:{value:1500},uFadeFar:{value:2100}},vertexShader:F,fragmentShader:N}),[]);(0,r.useEffect)(()=>{let e=J.uniforms;e.uDanger.value=_+1,e.uShallow.value.set(E.shallow),e.uMid.value.set(E.mid),e.uDeep.value.set(E.deep),e.uLand.value.set(E.land),e.uDrying.value.set(E.drying),e.uLine.value.set(E.line),e.uDangerColor.value.set(E.danger),e.uFade.value.set(E.fade)},[J,_,E]),(0,r.useEffect)(()=>()=>J.dispose(),[J]);let Q=(0,r.useMemo)(()=>new a.ShaderMaterial({uniforms:{uColor:{value:new a.Color},uOpacity:{value:.16}},vertexShader:`
108
+ varying float vDist;
109
+ void main() {
110
+ vDist = length(position.xy);
111
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
112
+ }`,fragmentShader:`
113
+ uniform vec3 uColor;
114
+ uniform float uOpacity;
115
+ varying float vDist;
116
+ void main() {
117
+ gl_FragColor = vec4(uColor, uOpacity * (1.0 - smoothstep(1500.0, 2100.0, vDist)));
118
+ #include <colorspace_fragment>
119
+ }`,transparent:!0,depthWrite:!1,side:a.DoubleSide}),[]);if((0,r.useEffect)(()=>{let e=Q.uniforms;e.uColor.value.set(E.water),e.uOpacity.value=E.waterOpacity},[Q,E]),(0,r.useEffect)(()=>()=>Q.dispose(),[Q]),!Z||!Number.isFinite(R))return null;let ee=Z.depthHere,et=Number.isFinite(G)&&Number.isFinite(ee)&&"tide"===U.source?G-ee:null,er=(Number.isFinite(G)?-G*Z.exaggeration*I:null)??Z.bottom,ea=null!==et&&Math.abs(et)>=.3,en=Number.isFinite(G)?G:ee,ei=-_*I;return(0,t.jsxs)("group",{rotation:[0,P,0],position:[0,e,0],children:[(0,t.jsx)("mesh",{rotation:[-Math.PI/2,0,0],geometry:Z.geometry,material:J,renderOrder:-2}),(0,t.jsx)("mesh",{rotation:[-Math.PI/2,0,0],material:Q,renderOrder:1,children:(0,t.jsx)("circleGeometry",{args:[3e3*I,96]})}),(0,t.jsx)(S,{items:Z.items,palette:E}),null!==er&&er<ei&&(0,t.jsxs)("group",{children:[(0,t.jsx)(i.Line,{points:[[0,ei,0],[0,er,0]],color:E.line,lineWidth:2,dashed:!0,dashSize:1.2,gapSize:.8}),(0,t.jsxs)("mesh",{position:[0,er,0],rotation:[-Math.PI/2,0,0],children:[(0,t.jsx)("ringGeometry",{args:[1.2,1.8,32]}),(0,t.jsx)("meshBasicMaterial",{color:E.line,transparent:!0,opacity:.8,side:a.DoubleSide})]}),ea&&null!==Z.bottom&&(0,t.jsxs)("mesh",{position:[0,Z.bottom,0],rotation:[-Math.PI/2,0,0],children:[(0,t.jsx)("ringGeometry",{args:[1,1.4,32]}),(0,t.jsx)("meshBasicMaterial",{color:E.danger,transparent:!0,opacity:.8,side:a.DoubleSide})]}),Number.isFinite(en)&&(0,t.jsx)(n.Html,{position:[0,er/2,0],zIndexRange:[5,0],style:{pointerEvents:"none"},children:(0,t.jsxs)("div",{className:"ml-3 -translate-y-1/2 whitespace-nowrap px-1.5 py-px rounded-md text-caption font-semibold tabular-nums text-hud-main bg-hud-bg/70 backdrop-blur-sm",children:[C(en)," m",ea&&(0,t.jsxs)("span",{className:"ml-1.5 font-normal text-hud-muted",children:[y("bathymetry.chartDepth",{depth:C(ee)})," ","(",et>0?"+":"−",Math.abs(et).toFixed(1),")"]}),"sounder"===U.source&&(0,t.jsx)("span",{className:"ml-1.5 font-normal text-hud-muted",children:y("bathymetry.levelFromSounder")})]})})]})]})}])},20705,e=>{"use strict";let t=["north","east","south","west"],r=["port","starboard","preferred_channel_port","preferred_channel_starboard"],a=e=>{let a=Number(e);return a>=9&&a<=12?{kind:"cardinal",beacon:!0,category:t[a-9]}:a>=13&&a<=16?{kind:"lateral",beacon:!0,category:r[a-13]}:17===a?{kind:"isolated_danger",beacon:!0}:18===a?{kind:"safe_water",beacon:!0}:19===a?{kind:"special_purpose",beacon:!0}:a>=20&&a<=23?{kind:"cardinal",beacon:!1,category:t[a-20]}:a>=24&&a<=27?{kind:"lateral",beacon:!1,category:r[a-24]}:28===a?{kind:"isolated_danger",beacon:!1}:29===a?{kind:"safe_water",beacon:!1}:30===a?{kind:"special_purpose",beacon:!1}:4===a?{kind:"special_purpose",beacon:!1,colours:["blue","yellow"],pattern:"vertical",topmark:{shape:"cross",colours:["yellow"]}}:{kind:"station",beacon:!0}},n=e=>{let t=a(e.atonType);return{id:`ais:${e.id}`,lat:e.latitude,lon:e.longitude,name:e.name||"",kind:t.kind,beacon:t.beacon,category:t.category||"",shape:"",colours:t.colours||[],pattern:t.pattern||"",system:"",height:null,topmark:t.topmark||null,light:null,ais:!0,virtual:e.virtual,offPosition:e.offPosition}},i=(e,t)=>Math.hypot((t.lat-e.lat)*111320,(t.lon-e.lon)*111320*Math.cos(e.lat*Math.PI/180));e.s(["atonKind",0,a,"mergeAtons",0,(e,t)=>{if(!t.length)return e;let r=e.map(e=>({...e})),a=[];for(let e of t){if(!Number.isFinite(e.latitude)||!Number.isFinite(e.longitude))continue;let t=n(e),o=!t.virtual&&r.find(e=>!e.ais&&("station"===t.kind||e.kind===t.kind)&&60>=i(e,t));o?(o.ais=!0,o.offPosition=t.offPosition,o.name||(o.name=t.name)):a.push(t)}return[...r,...a]}])},97776,e=>{"use strict";var t=e.i(3950);let r=["https://overpass-api.de/api/interpreter","https://maps.mail.ru/osm/tools/overpass/api/interpreter"],a=["cardinal","lateral","isolated_danger","safe_water","special_purpose"],n=`^(buoy|beacon)_(${a.join("|")})$`,i=e=>Math.round(10*e)/10,o=(e,t,r)=>{let a=r/111320,n=r/(111320*Math.max(.1,Math.cos(e*Math.PI/180))),o=[];for(let r=Math.floor((e-a)/.1);r<=Math.floor((e+a)/.1);r++)for(let e=Math.floor((t-n)/.1);e<=Math.floor((t+n)/.1);e++)o.push({s:i(.1*r),w:i(.1*e),key:`${r}:${e}`});return o},l=({s:e,w:t})=>`${r[0]}?data=${encodeURIComponent(`[out:json];node["seamark:type"~"${n}"](${e},${t},${i(e+.1)},${i(t+.1)});out body;`)}`,s=e=>e?String(e).split(";").map(e=>e.trim().toLowerCase()).filter(Boolean):[],u=e=>{let t=parseFloat(e);return Number.isFinite(t)?t:null},d=e=>{let t=e.tags||{},r=t["seamark:type"]||"",[a,...n]=r.split("_"),i=n.join("_"),o=e=>t[`seamark:${r}:${e}`],l=t["seamark:light:character"]?{character:t["seamark:light:character"],group:t["seamark:light:group"]||"",period:u(t["seamark:light:period"]),colour:s(t["seamark:light:colour"])[0]||"white"}:null;return{id:e.id,lat:e.lat,lon:e.lon,name:t["seamark:name"]||t.name||"",kind:i,beacon:"beacon"===a,category:(o("category")||"").toLowerCase(),shape:(o("shape")||"").toLowerCase(),colours:s(o("colour")),pattern:(o("colour_pattern")||"").toLowerCase(),system:(o("system")||"").toLowerCase(),height:u(o("height")),topmark:t["seamark:topmark:shape"]?{shape:t["seamark:topmark:shape"].toLowerCase(),colours:s(t["seamark:topmark:colour"])}:null,light:l}},c=0,h=e=>e.filter(e=>"node"===e.type&&Number.isFinite(e.lat)&&Number.isFinite(e.lon)).map(d).filter(e=>a.includes(e.kind)),m=async(e,a=25)=>{let o=Math.min(...e.map(e=>e.s)),s=Math.min(...e.map(e=>e.w)),u=i(Math.max(...e.map(e=>e.s))+.1),d=i(Math.max(...e.map(e=>e.w))+.1),c=`[out:json][timeout:${a}];node["seamark:type"~"${n}"](${o},${s},${u},${d});out body;`;for(let a of r)try{let r=await fetch(`${a}?data=${encodeURIComponent(c)}`,{referrerPolicy:"strict-origin-when-cross-origin"});if(!r.ok)continue;let n=await r.json();if(n.remark&&/error|timeout|runtime/i.test(n.remark))continue;let i=n.elements||[],o={};return await Promise.all(e.map(e=>{o[e.key]=i.filter(t=>t.lat>=e.s&&t.lat<e.s+.1&&t.lon>=e.w&&t.lon<e.w+.1);let r=JSON.stringify({elements:o[e.key]});return(0,t.storeCached)(l(e),new Response(r,{headers:{"Content-Type":"application/json"}}))})),o}catch{}throw Error("Overpass unreachable")},f=async e=>{let r={},a=[];for(let n of e){let e=await (0,t.readCached)(l(n)).catch(()=>null);e?r[n.key]=h((await e.json()).elements||[]):a.push(n)}if(a.length&&Date.now()>=c)try{let e=await m(a);Object.entries(e).forEach(([e,t])=>{r[e]=h(t)})}catch{c=Date.now()+12e4}return r},p=async(e,t,r)=>{let a=o(e,t,r);return a.length?Object.keys(await m(a,90)).length:0};e.s(["cellsAround",0,o,"loadCells",0,f,"prefetchSeamarks",0,p])},83524,e=>{"use strict";var t=e.i(71645),r=e.i(62588),a=e.i(85709),n=e.i(61969),i=e.i(90669),o=e.i(539),l=e.i(83402),s=e.i(77291);let u=Math.PI/180,d=3*u,c=60*u,h=5*u,m=90*u,f=["navigation.speedOverGround","navigation.courseOverGroundTrue"];e.s(["default",0,()=>{let{targets:e}=(0,r.useAIS)({passive:!0}),u=(0,n.default)(),p=(0,a.useSignalKPaths)(f),g=(0,t.useMemo)(()=>(0,i.getCollisionThresholds)(),[]),v=(0,s.default)(),y=l.default.get("aisLengthScalingFactor")||.7;return(0,t.useMemo)(()=>{let t=p["navigation.speedOverGround"],r=p["navigation.courseOverGroundTrue"]??u.heading,a=v.giveWayTo||v.primary;if(a&&Number.isFinite(t)&&t>.3&&Number.isFinite(r)){let{target:n,role:l}=a,s={targetName:n.name,rule:l.rule,reason:l.reason},u="stand-on"===l.ownRole&&Number.isFinite(n.tcpaSeconds)&&n.tcpaSeconds<180&&Number.isFinite(n.cpaMeters)&&n.cpaMeters<.3*g.cpaMeters;if("stand-on"===l.ownRole&&!u)return{kind:"standOn",change:0,heading:r,...s};let d=Math.sign(Math.sin(Math.atan2(n.sceneX,-n.sceneZ)-r))||1,c=(({targets:e,sog:t,cog:r,scale:a,thresholds:n,preferSide:o=0})=>{let l=e.filter(e=>null!==e.distanceMeters&&null!==e.sceneX&&Number.isFinite(e.sog)&&Number.isFinite(e.cog??e.cogMagnetic)),s=(e,r=n.cpaMeters)=>l.every(o=>{let l=(0,i.closestApproach)({rx:o.sceneX/a,ry:-o.sceneZ/a,ownSog:t,ownCog:e,targetSog:o.sog,targetCog:o.cog??o.cogMagnetic});return!l||l.tcpa<=0||l.tcpa>n.tcpaSeconds||l.cpa>=r}),u=o<0?[-1,1]:[1,-1],d=(e,t)=>{for(let a=h;a<=m+1e-9;a+=h)if(s(r+e*a,t))return e*a;return null};if(0!==o)return d(u[0])??d(u[0],n.cpaMeters/2)??d(u[1]);for(let e=h;e<=m+1e-9;e+=h){if(s(r+e))return e;if(s(r-e))return-e}return null})({targets:e,sog:t,cog:r,scale:y,thresholds:g,preferSide:"both"===l.ownRole||"power"===v.ownCategory||u?1:d});return null!==c?{kind:"avoid",change:c,heading:(0,o.wrapPi)(r+c),lastMoment:u,...s}:{kind:"avoid",change:null,heading:r,lastMoment:u,noSolution:!0,...s}}let n=u.vmc;if(n&&Number.isFinite(n.current)&&Number.isFinite(u.heading)){let e=(0,o.wrapPi)(n.best.heading-u.heading),t=(n.best.vmc-n.current)*1.943844;if(t>=.15&&Math.abs(e)>=d&&Math.abs(e)<=c)return{kind:"vmg",change:e,heading:n.best.heading,gainKn:t}}return null},[e,u,p,y,g,v])}])},71029,e=>{"use strict";var t=e.i(71645),r=e.i(85709),a=e.i(66799),n=e.i(46991);let i="notifications.mob",o=e=>e*Math.PI/180;e.s(["distanceAndBearing",0,(e,t)=>{if(!Number.isFinite(e?.latitude)||!Number.isFinite(e?.longitude)||!Number.isFinite(t?.latitude)||!Number.isFinite(t?.longitude))return null;let r=o(e.latitude),a=o(t.latitude),i=o(t.longitude-e.longitude),l=Math.sin((a-r)/2)**2+Math.cos(r)*Math.cos(a)*Math.sin(i/2)**2;return{distance:2*n.EARTH_RADIUS_METERS*Math.asin(Math.min(1,Math.sqrt(l))),bearing:(180*Math.atan2(Math.sin(i)*Math.cos(a),Math.cos(r)*Math.sin(a)-Math.sin(r)*Math.cos(a)*Math.cos(i))/Math.PI+360)%360}},"useActiveMobs",0,()=>{let e=(0,r.useSignalKPrefix)(i);return(0,t.useMemo)(()=>Object.entries(e).filter(([e,t])=>(e===i||e.startsWith(`${i}.`))&&t?.state&&"normal"!==t.state).map(([e,t])=>({...t,path:e})).sort((e,t)=>String(e.createdAt??"").localeCompare(String(t.createdAt??""))),[e])},"useMobSupport",0,()=>{let e=(()=>{let[e,r]=(0,t.useState)(null);return(0,t.useEffect)(()=>{let e=!1,t=null,n=async()=>{let i=await a.default.getFeatures();e||(i?r(i):t=setTimeout(n,3e4))};return n(),()=>{e=!0,clearTimeout(t)}},[]),e})();return(0,t.useMemo)(()=>({raise:!!e?.apis.includes("notifications"),navigate:!!e?.apis.includes("course")}),[e])}],71029)},32189,(e,t,r)=>{"use strict";t.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},65156,(e,t,r)=>{"use strict";var a=e.r(32189);function n(){}function i(){}i.resetWarningCache=n,t.exports=function(){function e(e,t,r,n,i,o){if(o!==a){var l=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var r={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:i,resetWarningCache:n};return r.PropTypes=r,r}},57384,(e,t,r)=>{e.i(47167),t.exports=e.r(65156)()}]);
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,71311,e=>{"use strict";var n=e.i(43476),t=e.i(71645);e.i(85269);var i=e.i(22831),r=e.i(67561),a=e.i(85709),u=e.i(61969),l=e.i(37256),o=e.i(46991);let s=["navigation.headingTrue","navigation.courseOverGroundTrue","navigation.speedThroughWater","environment.wind.speedTrue","environment.wind.angleTrueWater","environment.wind.speedApparent","environment.wind.angleApparent","environment.depth.belowKeel","environment.depth.belowTransducer","environment.depth.belowSurface",...(0,l.coursePaths)("distance","timeToGo"),"performance.velocityMadeGood","performance.polarSpeedRatio","environment.current","navigation.anchor.currentRadius","navigation.anchor.maxRadius"],d=(e,n=1)=>Number.isFinite(e)?e.toFixed(n):"--",m=e=>Number.isFinite(e)?`${String((0,o.toDegrees)(e)).padStart(3,"0")}\xb0`:"--",p=(e,n)=>{if(!Number.isFinite(e))return"--";let t=Math.round(Math.abs((0,o.radToDeg)(e)));return`${t}\xb0${n(e>=0?"hud.starboardShort":"hud.portShort")}`},h=e=>e.anchorWatch?"anchor":e.parkingMode?"harbour":e.racing?"racing":"route";e.s(["default",0,({omitDepth:e=!1,maxItems:c=4})=>{let{t:v}=(0,i.useTranslation)(),{states:b}=(0,r.useOcearoContext)(),g=(0,a.useSignalKPaths)(s),w=(0,u.default)(),f=h(b),N=(0,t.useMemo)(()=>{let e=g["environment.depth.belowKeel"]??g["environment.depth.belowTransducer"]??g["environment.depth.belowSurface"],n={id:"depth",label:v("hud.depth"),value:d((0,o.convertDepthUnit)(e)),unit:(0,o.getDepthUnitLabel)(),warn:Number.isFinite(e)&&e<3},t={label:v("hud.tws"),value:d((0,o.convertSpeedUnit)(g["environment.wind.speedTrue"])),unit:(0,o.getSpeedUnitLabel)()},i=g["navigation.headingTrue"]??g["navigation.courseOverGroundTrue"];switch(f){case"racing":return[{label:v("hud.polar"),value:Number.isFinite(w.ratio)?Math.round(100*w.ratio):"--",unit:"%",sub:Number.isFinite(w.deltaKn)?`${w.deltaKn>=0?"+":"−"}${Math.abs(w.deltaKn).toFixed(1)} kn`:null,warn:Number.isFinite(w.ratio)&&w.ratio<.8},{label:v("hud.vmg"),value:d((0,o.convertSpeedUnit)(g["performance.velocityMadeGood"])),unit:(0,o.getSpeedUnitLabel)()},{label:v("hud.twa"),value:p(g["environment.wind.angleTrueWater"],v)},t];case"harbour":return[n,{label:v("hud.heading"),value:m(i)},{label:v("hud.stw"),value:d((0,o.convertSpeedUnit)(g["navigation.speedThroughWater"])),unit:(0,o.getSpeedUnitLabel)()},{label:v("hud.aws"),value:d((0,o.convertSpeedUnit)(g["environment.wind.speedApparent"])),unit:(0,o.getSpeedUnitLabel)()},{label:v("hud.awa"),value:p(g["environment.wind.angleApparent"],v)}];case"anchor":return[n,t,{label:v("hud.swing"),value:d(g["navigation.anchor.currentRadius"],0),unit:"m"},{label:v("hud.alarmRadius"),value:d(g["navigation.anchor.maxRadius"],0),unit:"m"}];default:{let e=(0,l.courseValue)(g,"distance");return[{label:v("hud.heading"),value:m(i)},t,{label:v("hud.awa"),value:p(g["environment.wind.angleApparent"],v)},n,Number.isFinite(e)&&{label:v("hud.waypoint"),value:d((0,o.convertDistanceUnit)(e)),unit:(0,o.getDistanceUnitLabel)(),sub:(e=>{if(!Number.isFinite(e)||e<0)return"--";let n=Math.floor(e/3600),t=Math.round(e%3600/60);return n>0?`${n}h${String(t).padStart(2,"0")}`:`${t} min`})((0,l.courseValue)(g,"timeToGo"))}].filter(Boolean)}}},[g,w,f,v]),F=(e?N.filter(e=>"depth"!==e.id):N).slice(0,c);return(0,n.jsx)("div",{className:"ml-3 mt-4 flex flex-col gap-3 select-none",children:F.map(e=>(0,n.jsxs)("div",{className:"leading-none",children:[(0,n.jsx)("div",{className:"text-caption font-semibold uppercase tracking-widest text-hud-muted",children:e.label}),(0,n.jsxs)("div",{className:"flex items-baseline gap-1 mt-1",children:[(0,n.jsx)("span",{className:`text-value font-semibold ${e.warn?"text-oRed":"text-hud-main"}`,children:e.value}),e.unit&&(0,n.jsx)("span",{className:"text-caption font-semibold text-hud-secondary",children:e.unit}),e.sub&&"--"!==e.sub&&(0,n.jsx)("span",{className:"text-caption text-hud-muted ml-1",children:e.sub})]})]},e.label))})},"hudMode",0,h])},85003,function(e){e.n(e.i(71311))},61969,e=>{"use strict";var n=e.i(71645),t=e.i(85709),i=e.i(539),r=e.i(37256);let a=180/Math.PI,u=["navigation.speedThroughWater","navigation.speedOverGround","navigation.headingTrue","navigation.courseOverGroundTrue","environment.wind.speedTrue","environment.wind.angleTrueWater","environment.wind.directionTrue","performance.polarSpeed","performance.polarSpeedRatio",...(0,r.coursePaths)("bearingTrue")];e.s(["default",0,()=>{let e=(0,t.useSignalKPaths)(u);return(0,n.useMemo)(()=>{let n=e["navigation.speedThroughWater"]??e["navigation.speedOverGround"]??null,t=e["navigation.headingTrue"]??e["navigation.courseOverGroundTrue"]??null,u=e["environment.wind.speedTrue"]??null,l=e["environment.wind.angleTrueWater"]??null,o=e["environment.wind.directionTrue"]??null;null===o&&Number.isFinite(l)&&Number.isFinite(t)&&(o=(0,i.wrapPi)(t+l));let s=e["performance.polarSpeed"]??(Number.isFinite(u)&&Number.isFinite(l)?(0,i.polarSpeedSi)(u,l):null),d=e["performance.polarSpeedRatio"]??null;null===d&&Number.isFinite(n)&&Number.isFinite(s)&&s>.2&&(d=n/s);let m=Number.isFinite(n)&&Number.isFinite(s)?(n-s)*1.943844:null,p=null,h=null,c=!Number.isFinite(l)||Math.abs(l)<Math.PI/2;if(Number.isFinite(u)){let e=c?(0,i.optimalUpwind)(1.943844*u):(0,i.optimalDownwind)(1.943844*u);e&&(p=e.twa/a,Number.isFinite(o)&&Number.isFinite(l)&&(h=(0,i.wrapPi)(o-Math.sign(l||1)*p)))}let v=(0,r.courseValue)(e,"bearingTrue"),b=null;if(Number.isFinite(v)&&Number.isFinite(o)&&Number.isFinite(u)){let e=(0,i.bestVmcHeading)({twd:o,tws:u,bearing:v}),n=Number.isFinite(t)?(0,i.vmcForHeading)({twd:o,tws:u,bearing:v,heading:t}):null;b=e?{bearing:v,best:e,current:n}:null}return{ratio:d,polarSpeed:s,boatSpeed:n,deltaKn:m,heading:t,twd:o,tws:u,twa:l,targetTwa:p,targetHeading:h,upwind:c,vmc:b}},[e])}])},74452,(e,n,t)=>{n.exports={vpp:{angles:[52,60,75,90,110,120,135,150],speeds:[6,8,10,12,14,16,20],52:[4.98,5.86,6.31,6.45,6.51,6.52,6.41],60:[5.25,6.11,6.56,6.73,6.79,6.82,6.79],75:[5.45,6.33,6.77,7.01,7.13,7.2,7.24],90:[5.66,6.55,7,7.25,7.38,7.53,7.7],110:[5.49,6.49,7.04,7.4,7.69,7.97,8.38],120:[5.32,6.36,6.97,7.39,7.77,8.1,8.6],135:[4.81,5.92,6.68,7.15,7.55,7.95,8.85],150:[4.09,5.17,6.04,6.61,6.99,7.31,7.93],beat_angle:[43.6,42,41.2,41.2,41.7,42.1,44.2],beat_vmg:[3.26,3.91,4.24,4.34,4.36,4.34,4.16],run_angle:[144.8,147.8,148.5,149.6,171.8,175.4,177.2],run_vmg:[3.54,4.48,5.23,5.73,6.17,6.67,7.36]}}},539,e=>{"use strict";var n=e.i(74452);let t=180/Math.PI,i=n.default.vpp,r=(e,n,t)=>e+(n-e)*t,a=(e,n)=>{if(n<=e[0])return[0,0];let t=e.length-1;if(n>=e[t])return[t-1,1];let i=0;for(;n>e[i+1];)i++;return[i,(n-e[i])/(e[i+1]-e[i])]},u=i.speeds.map((e,n)=>(e=>{let n=i.beat_angle[e],r=i.run_angle[e],a=i.beat_vmg[e]/Math.cos(n/t),u=i.run_vmg[e]/Math.abs(Math.cos(r/t)),l=[[0,0],[.7*n,.55*a],[n,a]];for(let t of i.angles)t>n&&t<r&&l.push([t,i[String(t)][e]]);return l.push([r,u]),r<180&&l.push([180,i.run_vmg[e]]),l})(n)),l=(e,n)=>{let[t,i]=a(e.map(e=>e[0]),n);return r(e[t][1],e[t+1][1],i)},o=(e,n)=>{if(!Number.isFinite(e)||!Number.isFinite(n)||e<=0)return null;let t=Math.min(180,Math.abs((n+540)%360-180)),o=i.speeds;if(e<o[0])return l(u[0],t)*(e/o[0]);let[s,d]=a(o,e);return r(l(u[s],t),l(u[s+1],t),d)},s=(e,n)=>{let[t,u]=a(i.speeds,n);return r(e[t],e[t+1],u)},d=(e,n)=>{let i=o(1.943844*e,n*t);return null===i?null:i/1.943844},m=e=>{let n=(e+Math.PI)%(2*Math.PI);return n<0&&(n+=2*Math.PI),n-Math.PI};e.s(["bestVmcHeading",0,({twd:e,tws:n,bearing:i})=>{if(![e,n,i].every(Number.isFinite)||n<=0)return null;let r=null;for(let a=-100;a<=100;a++){let u=i+a/t,l=d(n,m(e-u));if(null===l)continue;let o=l*Math.cos(u-i);(!r||o>r.vmc)&&(r={heading:m(u),speed:l,vmc:o})}return r},"optimalDownwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let n=s(i.run_angle,e),r=o(e,n);return{twa:n,speed:r,vmg:-r*Math.cos(n/t)}},"optimalUpwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let n=s(i.beat_angle,e),r=o(e,n);return{twa:n,speed:r,vmg:r*Math.cos(n/t)}},"polarSpeed",0,o,"polarSpeedSi",0,d,"vmcForHeading",0,({twd:e,tws:n,bearing:t,heading:i})=>{if(![e,n,t,i].every(Number.isFinite))return null;let r=d(n,m(e-i));return null===r?null:r*Math.cos(i-t)},"wrapPi",0,m])}]);
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,26822,e=>{"use strict";var t=e.i(43476),r=e.i(71645);e.i(85269);var n=e.i(22831),i=e.i(83524),a=e.i(85709),o=e.i(66799);let s=["compass","gps","heading","auto"],u=["steering.autopilot.engaged","steering.autopilot.state","steering.autopilot.mode"];e.s(["default",0,()=>{let{t:e}=(0,n.useTranslation)(),l=(0,i.default)(),d=(0,a.useSignalKPaths)(u),[g,c]=(0,r.useState)(!1),[p,m]=(0,r.useState)(null),h=(0,r.useRef)(null);if((0,r.useEffect)(()=>()=>clearTimeout(h.current),[]),!l)return null;let v=d["steering.autopilot.engaged"]??"enabled"===d["steering.autopilot.state"],f=d["steering.autopilot.mode"],b=!0===v&&(!f||s.includes(f))&&null!==l.change,w=Math.round((l.change??0)*180/Math.PI),M=async()=>{if(!g){c(!0),h.current=setTimeout(()=>c(!1),4e3);return}clearTimeout(h.current),c(!1);try{await o.default.adjustAutopilotTarget(w),m({ok:!0,text:e("advice.applied")})}catch(e){m({ok:!1,text:e?.message||String(e)})}setTimeout(()=>m(null),4e3)},T="avoid"===l.kind,N="standOn"===l.kind;return(0,t.jsxs)("div",{className:`tesla-card !p-3 flex items-center gap-3 max-w-[30rem] ${T?"border-oRed/60":""}`,children:[(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsx)("div",{className:`text-label font-semibold ${T?"text-oRed":N?"text-oGreen":"text-oYellow"}`,children:((e,t)=>{let r=Math.round(180*Math.abs(e.change)/Math.PI);if("standOn"===e.kind)return t("advice.standOn");if("avoid"===e.kind&&e.noSolution)return t("advice.avoidNoSolution");if("avoid"===e.kind)return t("advice.avoid",{deg:r,side:t(e.change>=0?"advice.starboard":"advice.port")});let n=e.change>=0?"+":"−";return t("advice.vmg",{change:`${n}${r}\xb0`,gain:e.gainKn.toFixed(1)})})(l,e)}),(0,t.jsx)("div",{className:"text-caption text-hud-muted truncate",children:p?p.text:l.reason?`${e(`colregs.${l.reason}`,{name:l.targetName||"AIS"})} \xb7 ${e("colregs.rule",{rule:l.lastMoment?"17b":l.rule})}`:T?e("advice.avoidHint",{name:l.targetName||"AIS"}):e("advice.vmgHint")})]}),b&&!N&&(0,t.jsx)("button",{type:"button",onClick:M,className:`shrink-0 px-3 py-2 rounded-lg text-caption font-semibold uppercase tracking-wider border transition-colors ${g?"bg-oYellow text-black border-oYellow":"border-hud text-hud-main tesla-hover"}`,children:g?e("advice.confirm"):e("advice.apply")})]})}],26822)},56101,function(e){e.n(e.i(26822))},77291,24752,e=>{"use strict";var t=e.i(71645),r=e.i(62588),n=e.i(85709),i=e.i(61969),a=e.i(539);let o=Math.PI/180,s={power:1,sail:2,fishing:3,restricted:4},u=e=>{let t=String(e.navState||"").toLowerCase();if(/not under command|restricted|constrained/.test(t))return"restricted";if(/fishing/.test(t))return"fishing";if(/sailing/.test(t))return"sail";if(/motoring|engine/.test(t))return"power";let r=Number(e.shipType);return 36===r?"sail":30===r?"fishing":33===r?"restricted":"power"},l=(e,t,r)=>(0,a.wrapPi)(Math.atan2(t.x-e.x,t.y-e.y)-r),d=(e,t,r)=>{let n={x:0,y:0},i=l(n,t,e.course),u=l(t,n,t.course),d=Math.sign(u)||1,g=e=>Math.abs(e)>112.5*o;if(g(i)&&t.speed>e.speed)return{ownRole:"stand-on",rule:"13",reason:"overtakenByTarget",targetTurn:0};if(g(u)&&e.speed>t.speed)return{ownRole:"give-way",rule:"13",reason:"overtaking",targetTurn:0};let c=s[e.category]??1,p=s[t.category]??1;if(c!==p)return c<p?{ownRole:"give-way",rule:"18",reason:`giveWayTo_${t.category}`,targetTurn:0}:{ownRole:"stand-on",rule:"18",reason:`standOnFrom_${t.category}`,targetTurn:d};if("sail"===e.category&&Number.isFinite(r)){let n=(0,a.wrapPi)(r-e.course)>=0?"starboard":"port";return n!==((0,a.wrapPi)(r-t.course)>=0?"starboard":"port")?"port"===n?{ownRole:"give-way",rule:"12a-i",reason:"portTack",targetTurn:0}:{ownRole:"stand-on",rule:"12a-i",reason:"targetPortTack",targetTurn:d}:t.x*Math.sin(r)+t.y*Math.cos(r)>0?{ownRole:"stand-on",rule:"12a-ii",reason:"targetWindward",targetTurn:d}:{ownRole:"give-way",rule:"12a-ii",reason:"ownWindward",targetTurn:0}}return Math.abs((0,a.wrapPi)(t.course-e.course-Math.PI))<10*o&&Math.abs(i)<6*o?{ownRole:"both",rule:"14",reason:"headOn",targetTurn:1}:i>0?{ownRole:"give-way",rule:"15",reason:"crossingStarboard",targetTurn:0}:{ownRole:"stand-on",rule:"15",reason:"crossingPort",targetTurn:d}};e.s(["rightOfWay",0,d,"targetCategory",0,u],24752);var g=e.i(83402),c=e.i(67561);let p=[],m=["navigation.speedOverGround","navigation.courseOverGroundTrue"];e.s(["default",0,({always:e=!1}={})=>{let a,o,{targets:s}=(0,r.useAIS)({passive:!0}),{states:l}=(0,c.useOcearoContext)(),h=l.anchorWatch||l.parkingMode||l.moored,v=(e||l.ais)&&!h?s:p,{twd:f,heading:b}=(0,i.default)(),w=(0,n.useSignalKPaths)(m),M=(a=(0,n.useSignalKPrefix)("propulsion."),o=g.default.get("ownVesselCategory"),(0,t.useMemo)(()=>"sail"===o||"power"===o?o:Object.entries(a).some(([e,t])=>e.endsWith(".revolutions")&&Number(t)>.5||e.endsWith(".state")&&"started"===t)?"power":"sail",[a,o])),T=g.default.get("aisLengthScalingFactor")||.7;return(0,t.useMemo)(()=>{let e=w["navigation.courseOverGroundTrue"]??b,t=w["navigation.speedOverGround"]??0,r=[];if(Number.isFinite(e))for(let n of v){if("danger"!==n.risk)continue;let i=n.cog??n.cogMagnetic??n.heading;if(!Number.isFinite(i)||null===n.sceneX)continue;let a=d({course:e,speed:t,category:M},{x:n.sceneX/T,y:-n.sceneZ/T,course:i,speed:n.sog??0,category:u(n)},f);r.push({target:{...n},role:a})}r.sort((e,t)=>(e.target.tcpaSeconds??1/0)-(t.target.tcpaSeconds??1/0));let n={};for(let e of v)"close"===e.risk?n[e.mmsi]="close":"danger"===e.risk&&(n[e.mmsi]="giveWay");for(let e of r)n[e.target.mmsi]="stand-on"===e.role.ownRole?"yields":"giveWay";let i=r.filter(e=>"stand-on"!==e.role.ownRole);return{ownCategory:M,encounters:r,statuses:n,giveWay:i.length>0,giveWayTo:i[0]||null,primary:r[0]||null}},[v,f,b,w,M,T])}],77291)},83524,e=>{"use strict";var t=e.i(71645),r=e.i(62588),n=e.i(85709),i=e.i(61969),a=e.i(90669),o=e.i(539),s=e.i(83402),u=e.i(77291);let l=Math.PI/180,d=3*l,g=60*l,c=5*l,p=90*l,m=["navigation.speedOverGround","navigation.courseOverGroundTrue"];e.s(["default",0,()=>{let{targets:e}=(0,r.useAIS)({passive:!0}),l=(0,i.default)(),h=(0,n.useSignalKPaths)(m),v=(0,t.useMemo)(()=>(0,a.getCollisionThresholds)(),[]),f=(0,u.default)(),b=s.default.get("aisLengthScalingFactor")||.7;return(0,t.useMemo)(()=>{let t=h["navigation.speedOverGround"],r=h["navigation.courseOverGroundTrue"]??l.heading,n=f.giveWayTo||f.primary;if(n&&Number.isFinite(t)&&t>.3&&Number.isFinite(r)){let{target:i,role:s}=n,u={targetName:i.name,rule:s.rule,reason:s.reason},l="stand-on"===s.ownRole&&Number.isFinite(i.tcpaSeconds)&&i.tcpaSeconds<180&&Number.isFinite(i.cpaMeters)&&i.cpaMeters<.3*v.cpaMeters;if("stand-on"===s.ownRole&&!l)return{kind:"standOn",change:0,heading:r,...u};let d=Math.sign(Math.sin(Math.atan2(i.sceneX,-i.sceneZ)-r))||1,g=(({targets:e,sog:t,cog:r,scale:n,thresholds:i,preferSide:o=0})=>{let s=e.filter(e=>null!==e.distanceMeters&&null!==e.sceneX&&Number.isFinite(e.sog)&&Number.isFinite(e.cog??e.cogMagnetic)),u=(e,r=i.cpaMeters)=>s.every(o=>{let s=(0,a.closestApproach)({rx:o.sceneX/n,ry:-o.sceneZ/n,ownSog:t,ownCog:e,targetSog:o.sog,targetCog:o.cog??o.cogMagnetic});return!s||s.tcpa<=0||s.tcpa>i.tcpaSeconds||s.cpa>=r}),l=o<0?[-1,1]:[1,-1],d=(e,t)=>{for(let n=c;n<=p+1e-9;n+=c)if(u(r+e*n,t))return e*n;return null};if(0!==o)return d(l[0])??d(l[0],i.cpaMeters/2)??d(l[1]);for(let e=c;e<=p+1e-9;e+=c){if(u(r+e))return e;if(u(r-e))return-e}return null})({targets:e,sog:t,cog:r,scale:b,thresholds:v,preferSide:"both"===s.ownRole||"power"===f.ownCategory||l?1:d});return null!==g?{kind:"avoid",change:g,heading:(0,o.wrapPi)(r+g),lastMoment:l,...u}:{kind:"avoid",change:null,heading:r,lastMoment:l,noSolution:!0,...u}}let i=l.vmc;if(i&&Number.isFinite(i.current)&&Number.isFinite(l.heading)){let e=(0,o.wrapPi)(i.best.heading-l.heading),t=(i.best.vmc-i.current)*1.943844;if(t>=.15&&Math.abs(e)>=d&&Math.abs(e)<=g)return{kind:"vmg",change:e,heading:i.best.heading,gainKn:t}}return null},[e,l,h,b,v,f])}])},61969,e=>{"use strict";var t=e.i(71645),r=e.i(85709),n=e.i(539),i=e.i(37256);let a=180/Math.PI,o=["navigation.speedThroughWater","navigation.speedOverGround","navigation.headingTrue","navigation.courseOverGroundTrue","environment.wind.speedTrue","environment.wind.angleTrueWater","environment.wind.directionTrue","performance.polarSpeed","performance.polarSpeedRatio",...(0,i.coursePaths)("bearingTrue")];e.s(["default",0,()=>{let e=(0,r.useSignalKPaths)(o);return(0,t.useMemo)(()=>{let t=e["navigation.speedThroughWater"]??e["navigation.speedOverGround"]??null,r=e["navigation.headingTrue"]??e["navigation.courseOverGroundTrue"]??null,o=e["environment.wind.speedTrue"]??null,s=e["environment.wind.angleTrueWater"]??null,u=e["environment.wind.directionTrue"]??null;null===u&&Number.isFinite(s)&&Number.isFinite(r)&&(u=(0,n.wrapPi)(r+s));let l=e["performance.polarSpeed"]??(Number.isFinite(o)&&Number.isFinite(s)?(0,n.polarSpeedSi)(o,s):null),d=e["performance.polarSpeedRatio"]??null;null===d&&Number.isFinite(t)&&Number.isFinite(l)&&l>.2&&(d=t/l);let g=Number.isFinite(t)&&Number.isFinite(l)?(t-l)*1.943844:null,c=null,p=null,m=!Number.isFinite(s)||Math.abs(s)<Math.PI/2;if(Number.isFinite(o)){let e=m?(0,n.optimalUpwind)(1.943844*o):(0,n.optimalDownwind)(1.943844*o);e&&(c=e.twa/a,Number.isFinite(u)&&Number.isFinite(s)&&(p=(0,n.wrapPi)(u-Math.sign(s||1)*c)))}let h=(0,i.courseValue)(e,"bearingTrue"),v=null;if(Number.isFinite(h)&&Number.isFinite(u)&&Number.isFinite(o)){let e=(0,n.bestVmcHeading)({twd:u,tws:o,bearing:h}),t=Number.isFinite(r)?(0,n.vmcForHeading)({twd:u,tws:o,bearing:h,heading:r}):null;v=e?{bearing:h,best:e,current:t}:null}return{ratio:d,polarSpeed:l,boatSpeed:t,deltaKn:g,heading:r,twd:u,tws:o,twa:s,targetTwa:c,targetHeading:p,upwind:m,vmc:v}},[e])}])},74452,(e,t,r)=>{t.exports={vpp:{angles:[52,60,75,90,110,120,135,150],speeds:[6,8,10,12,14,16,20],52:[4.98,5.86,6.31,6.45,6.51,6.52,6.41],60:[5.25,6.11,6.56,6.73,6.79,6.82,6.79],75:[5.45,6.33,6.77,7.01,7.13,7.2,7.24],90:[5.66,6.55,7,7.25,7.38,7.53,7.7],110:[5.49,6.49,7.04,7.4,7.69,7.97,8.38],120:[5.32,6.36,6.97,7.39,7.77,8.1,8.6],135:[4.81,5.92,6.68,7.15,7.55,7.95,8.85],150:[4.09,5.17,6.04,6.61,6.99,7.31,7.93],beat_angle:[43.6,42,41.2,41.2,41.7,42.1,44.2],beat_vmg:[3.26,3.91,4.24,4.34,4.36,4.34,4.16],run_angle:[144.8,147.8,148.5,149.6,171.8,175.4,177.2],run_vmg:[3.54,4.48,5.23,5.73,6.17,6.67,7.36]}}},539,e=>{"use strict";var t=e.i(74452);let r=180/Math.PI,n=t.default.vpp,i=(e,t,r)=>e+(t-e)*r,a=(e,t)=>{if(t<=e[0])return[0,0];let r=e.length-1;if(t>=e[r])return[r-1,1];let n=0;for(;t>e[n+1];)n++;return[n,(t-e[n])/(e[n+1]-e[n])]},o=n.speeds.map((e,t)=>(e=>{let t=n.beat_angle[e],i=n.run_angle[e],a=n.beat_vmg[e]/Math.cos(t/r),o=n.run_vmg[e]/Math.abs(Math.cos(i/r)),s=[[0,0],[.7*t,.55*a],[t,a]];for(let r of n.angles)r>t&&r<i&&s.push([r,n[String(r)][e]]);return s.push([i,o]),i<180&&s.push([180,n.run_vmg[e]]),s})(t)),s=(e,t)=>{let[r,n]=a(e.map(e=>e[0]),t);return i(e[r][1],e[r+1][1],n)},u=(e,t)=>{if(!Number.isFinite(e)||!Number.isFinite(t)||e<=0)return null;let r=Math.min(180,Math.abs((t+540)%360-180)),u=n.speeds;if(e<u[0])return s(o[0],r)*(e/u[0]);let[l,d]=a(u,e);return i(s(o[l],r),s(o[l+1],r),d)},l=(e,t)=>{let[r,o]=a(n.speeds,t);return i(e[r],e[r+1],o)},d=(e,t)=>{let n=u(1.943844*e,t*r);return null===n?null:n/1.943844},g=e=>{let t=(e+Math.PI)%(2*Math.PI);return t<0&&(t+=2*Math.PI),t-Math.PI};e.s(["bestVmcHeading",0,({twd:e,tws:t,bearing:n})=>{if(![e,t,n].every(Number.isFinite)||t<=0)return null;let i=null;for(let a=-100;a<=100;a++){let o=n+a/r,s=d(t,g(e-o));if(null===s)continue;let u=s*Math.cos(o-n);(!i||u>i.vmc)&&(i={heading:g(o),speed:s,vmc:u})}return i},"optimalDownwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let t=l(n.run_angle,e),i=u(e,t);return{twa:t,speed:i,vmg:-i*Math.cos(t/r)}},"optimalUpwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let t=l(n.beat_angle,e),i=u(e,t);return{twa:t,speed:i,vmg:i*Math.cos(t/r)}},"polarSpeed",0,u,"polarSpeedSi",0,d,"vmcForHeading",0,({twd:e,tws:t,bearing:r,heading:n})=>{if(![e,t,r,n].every(Number.isFinite))return null;let i=d(t,g(e-n));return null===i?null:i*Math.cos(n-r)},"wrapPi",0,g])}]);