worldorbit 3.2.1 → 3.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/obsidian-plugin/dist/diagnostics.d.ts +3 -0
- package/dist/browser/obsidian-plugin/dist/diagnostics.js +23 -0
- package/dist/browser/obsidian-plugin/dist/examples.d.ts +3 -0
- package/dist/browser/obsidian-plugin/dist/examples.js +77 -0
- package/dist/browser/obsidian-plugin/dist/index.d.ts +9 -0
- package/dist/browser/obsidian-plugin/dist/index.js +8 -0
- package/dist/browser/obsidian-plugin/dist/main.d.ts +2 -0
- package/dist/browser/obsidian-plugin/dist/main.js +2 -0
- package/dist/browser/obsidian-plugin/dist/navigation.d.ts +6 -0
- package/dist/browser/obsidian-plugin/dist/navigation.js +44 -0
- package/dist/browser/obsidian-plugin/dist/plugin.d.ts +8 -0
- package/dist/browser/obsidian-plugin/dist/plugin.js +508 -0
- package/dist/browser/obsidian-plugin/dist/positions.d.ts +7 -0
- package/dist/browser/obsidian-plugin/dist/positions.js +14 -0
- package/dist/browser/obsidian-plugin/dist/settings.d.ts +2 -0
- package/dist/browser/obsidian-plugin/dist/settings.js +5 -0
- package/dist/browser/obsidian-plugin/dist/theme.d.ts +2 -0
- package/dist/browser/obsidian-plugin/dist/theme.js +31 -0
- package/dist/browser/obsidian-plugin/dist/types.d.ts +42 -0
- package/dist/browser/obsidian-plugin/dist/types.js +1 -0
- package/dist/browser/obsidian-plugin/dist/viewer-host.d.ts +14 -0
- package/dist/browser/obsidian-plugin/dist/viewer-host.js +110 -0
- package/dist/browser/viewer/dist/index.d.ts +1 -0
- package/dist/browser/viewer/dist/index.js +1 -0
- package/dist/browser/viewer/dist/interactive-2d.d.ts +21 -0
- package/dist/browser/viewer/dist/interactive-2d.js +201 -0
- package/dist/browser/viewer/dist/render.d.ts +1 -1
- package/dist/browser/viewer/dist/render.js +2 -1
- package/dist/browser/viewer/dist/viewer-state.d.ts +1 -1
- package/dist/browser/viewer/dist/viewer-state.js +1 -1
- package/dist/obsidian-plugin/LICENSE +21 -0
- package/dist/obsidian-plugin/README.md +124 -0
- package/dist/obsidian-plugin/main.js +108 -0
- package/dist/obsidian-plugin/manifest.json +9 -0
- package/dist/obsidian-plugin/obsidian_scsh_1.png +0 -0
- package/dist/obsidian-plugin/obsidian_scsh_2.png +0 -0
- package/dist/obsidian-plugin/styles.css +164 -0
- package/dist/unpkg/obsidian-plugin/dist/diagnostics.d.ts +3 -0
- package/dist/unpkg/obsidian-plugin/dist/diagnostics.js +23 -0
- package/dist/unpkg/obsidian-plugin/dist/examples.d.ts +3 -0
- package/dist/unpkg/obsidian-plugin/dist/examples.js +77 -0
- package/dist/unpkg/obsidian-plugin/dist/index.d.ts +9 -0
- package/dist/unpkg/obsidian-plugin/dist/index.js +8 -0
- package/dist/unpkg/obsidian-plugin/dist/main.d.ts +2 -0
- package/dist/unpkg/obsidian-plugin/dist/main.js +2 -0
- package/dist/unpkg/obsidian-plugin/dist/navigation.d.ts +6 -0
- package/dist/unpkg/obsidian-plugin/dist/navigation.js +44 -0
- package/dist/unpkg/obsidian-plugin/dist/plugin.d.ts +8 -0
- package/dist/unpkg/obsidian-plugin/dist/plugin.js +508 -0
- package/dist/unpkg/obsidian-plugin/dist/positions.d.ts +7 -0
- package/dist/unpkg/obsidian-plugin/dist/positions.js +14 -0
- package/dist/unpkg/obsidian-plugin/dist/settings.d.ts +2 -0
- package/dist/unpkg/obsidian-plugin/dist/settings.js +5 -0
- package/dist/unpkg/obsidian-plugin/dist/theme.d.ts +2 -0
- package/dist/unpkg/obsidian-plugin/dist/theme.js +31 -0
- package/dist/unpkg/obsidian-plugin/dist/types.d.ts +42 -0
- package/dist/unpkg/obsidian-plugin/dist/types.js +1 -0
- package/dist/unpkg/obsidian-plugin/dist/viewer-host.d.ts +14 -0
- package/dist/unpkg/obsidian-plugin/dist/viewer-host.js +110 -0
- package/dist/unpkg/viewer/dist/index.d.ts +1 -0
- package/dist/unpkg/viewer/dist/index.js +1 -0
- package/dist/unpkg/viewer/dist/interactive-2d.d.ts +21 -0
- package/dist/unpkg/viewer/dist/interactive-2d.js +201 -0
- package/dist/unpkg/viewer/dist/render.d.ts +1 -1
- package/dist/unpkg/viewer/dist/render.js +2 -1
- package/dist/unpkg/viewer/dist/viewer-state.d.ts +1 -1
- package/dist/unpkg/viewer/dist/viewer-state.js +1 -1
- package/dist/unpkg/worldorbit-editor.min.js +56 -56
- package/dist/unpkg/worldorbit-markdown.min.js +15 -15
- package/dist/unpkg/worldorbit-viewer.min.js +207 -207
- package/dist/unpkg/worldorbit.js +200 -0
- package/dist/unpkg/worldorbit.min.js +210 -210
- package/package.json +18 -1
- package/packages/viewer/dist/index.d.ts +1 -0
- package/packages/viewer/dist/index.js +1 -0
- package/packages/viewer/dist/interactive-2d.d.ts +21 -0
- package/packages/viewer/dist/interactive-2d.js +201 -0
- package/packages/viewer/dist/render.d.ts +1 -1
- package/packages/viewer/dist/render.js +2 -1
- package/packages/viewer/dist/viewer-state.d.ts +1 -1
- package/packages/viewer/dist/viewer-state.js +1 -1
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
"use strict";var WorldOrbitMarkdown=(()=>{var st=Object.defineProperty;var rr=Object.getOwnPropertyDescriptor;var ir=Object.getOwnPropertyNames;var or=Object.prototype.hasOwnProperty;var ar=(e,t)=>{for(var n in t)st(e,n,{get:t[n],enumerable:!0})},sr=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ir(t))!or.call(e,i)&&i!==n&&st(e,i,{get:()=>t[i],enumerable:!(r=rr(t,i))||r.enumerable});return e};var lr=e=>sr(st({},"__esModule",{value:!0}),e);var $s={};ar($s,{rehypeWorldOrbit:()=>Hn,remarkWorldOrbit:()=>qn,renderWorldOrbitBlock:()=>fe,renderWorldOrbitError:()=>Vt});var f=class e extends Error{line;column;constructor(t,n,r){let i=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var pe=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],C=pe.filter(e=>e!=="system"),cr=["star","planet","moon","asteroid","comet","structure","phenomenon"],Rt=["structure","phenomenon"],X=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],ur=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function I(e,t){return{key:e,...t}}var Te=new Set(pe),_t=new Map([I("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:X}),I("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),I("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),I("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:X}),I("period",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"duration"}),I("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),I("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),I("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),I("at",{kind:"string",placement:!0,arity:"single",objectTypes:Rt}),I("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Rt}),I("free",{kind:"string",placement:!0,arity:"single",objectTypes:ur}),I("kind",{kind:"string",placement:!1,arity:"single",objectTypes:C}),I("class",{kind:"string",placement:!1,arity:"single",objectTypes:C}),I("culture",{kind:"string",placement:!1,arity:"single",objectTypes:C}),I("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:pe}),I("color",{kind:"string",placement:!1,arity:"single",objectTypes:pe}),I("image",{kind:"string",placement:!1,arity:"single",objectTypes:cr}),I("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:pe}),I("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"radius"}),I("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"mass"}),I("density",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"generic"}),I("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"generic"}),I("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"generic"}),I("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:C}),I("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),I("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),I("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),I("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("on",{kind:"string",placement:!1,arity:"single",objectTypes:C}),I("source",{kind:"string",placement:!1,arity:"single",objectTypes:C}),I("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:C,unitFamily:"duration"})].map(e=>[e.key,e])),dr=new Set(_t.keys());function D(e){return _t.get(e)}function Nt(e){return dr.has(e)}function Ut(e,t){return e.objectTypes.includes(t)}function De(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function me(e,t={}){let n=[],r=t.columnOffset??0,i="",o=null,a=!1,l=!1,s=null,c=()=>{o!==null&&(n.push({value:i,column:o,quoted:a}),i="",o=null,a=!1)};for(let u=0;u<e.length;u++){let d=e[u],m=r+u+1;if(l&&d==="\\"){let h=e[u+1];if(h==='"'||h==="\\"){i+=h,u++;continue}}if(d==='"'){l?l=!1:(o===null&&(o=m),a=!0,s=m,l=!0);continue}if(!l&&/\s/.test(d)){c();continue}o===null&&(o=m),i+=d}if(l)throw new f("Unclosed quote in line",t.line,s??r+e.length);return c(),n}function Fe(e){return e.match(/^\s*/)?.[0].length??0}function he(e){let t=e.split(/\r?\n/),n=[],r=null,i=null,o=!1,a=!1,l=null,s=null,c=null,u=null;for(let d=0;d<t.length;d++){let m=t[d],h=d+1;if(!m.trim())continue;let b=Fe(m),g=me(m.slice(b),{line:h,columnOffset:b});if(g.length!==0){if(b===0){if(o=!1,a=!1,l=null,s=null,c=null,u=null,g.length>=1&&g[0].value==="theme"){a=!0,s=0,r={type:"theme",preset:g.length>=2?g[1].value:null,blocks:[],location:{line:h,column:g[0].column}};continue}let w=fr(g,h);n.push(w),i=w;continue}if(a){if(g.length>=2&&g[0].value==="preset"&&(!c||b<=c)){r&&(r.preset=g[1].value);continue}u&&c!==null&&b>c?u.fields.push(hr(g,h)):(c=b,u={type:"theme-block",target:g[0].value,fields:[],location:{line:h,column:g[0].column}},r?.blocks.push(u));continue}if(!i)throw new f("Indented line without parent object",h,b+1);if(g.length===1&&g[0].value==="info"){o=!0,l=b;continue}o&&b<=(l??0)&&(o=!1),o?i.infoEntries.push(gr(g,h)):i.blockFields.push(mr(g,h))}}return{type:"document",theme:r,objects:n}}function fr(e,t){if(e.length<2)throw new f("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!Te.has(n.value))throw new f(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:pr(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function pr(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],o=D(i.value);if(!o)throw new f(`Unknown field "${i.value}"`,t,i.column);r++;let a=[];if(o.arity==="multiple")for(;r<e.length&&!Nt(e[r].value);)a.push(e[r]),r++;else{let l=e[r];l&&(a.push(l),r++)}if(a.length===0)throw new f(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:a.map(l=>l.value),location:{line:t,column:i.column}})}return n}function mr(e,t){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);if(!D(e[0].value))throw new f(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function hr(e,t){if(e.length<2)throw new f("Invalid theme field line",t,e[0]?.column??1);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function gr(e,t){if(e.length<2)throw new f("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var Wt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,br=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),yr=/^[A-Za-z][A-Za-z0-9+.-]*:/;function ge(e){let t=null,n=[],r=e.theme?wr(e.theme):null;for(let i of e.objects){let o=Ir(i);if(i.objectType==="system"){if(t)throw f.fromLocation("Only one system object is allowed",i.location);t=o}else n.push(o)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",theme:r,system:t,groups:[],relations:[],events:[],objects:n}}function wr(e){let t={};for(let n of e.blocks){let r=Yt(n.fields);t[n.target]=vr(r)}return{preset:e.preset,styles:t}}function vr(e){let t={};for(let[n,r]of e.entries()){if(r.values.length===1){let i=r.values[0];if(i==="true"){t[n]=!0;continue}if(i==="false"){t[n]=!1;continue}let o=Number(i);if(!Number.isNaN(o)&&i.trim()!==""){t[n]=o;continue}}t[n]=r.values.join(" ")}return t}function Ir(e){let t=[...e.inlineFields,...e.blockFields];xr(e.objectType,t);let n=Yt(t),r=$r(e.objectType,n),i=jr(n),o=Mr(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:o}:{type:e.objectType,id:e.name,properties:i,placement:r,info:o}}function xr(e,t){for(let n of t){let r=D(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Ut(r,e))throw f.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw f.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Yt(e){let t=new Map;for(let n of e){if(t.has(n.key))throw f.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function $r(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),o=t.has("free"),a=[n,r,i,o].filter(Boolean).length;if(a>1){let l=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw f.fromLocation("Object has multiple placement modes",l?.location)}if(e==="system"&&a>0)throw f.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Ce(t,"orbit"),distance:se(t,"distance"),semiMajor:se(t,"semiMajor"),eccentricity:Lr(t,"eccentricity"),period:se(t,"period"),angle:se(t,"angle"),inclination:se(t,"inclination"),phase:se(t,"phase")};if(r){let l=Ee(t,"at"),s=Ce(t,"at");return{mode:"at",target:s,reference:Or(s,l.location)}}if(i)return{mode:"surface",target:Ce(t,"surface")};if(o){let l=Ce(t,"free"),s=Ar(l);return{mode:"free",distance:s??void 0,descriptor:s?void 0:l}}return null}function jr(e){let t={};for(let[n,r]of e.entries()){let i=D(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=Pr(r);break;case"number":t[n]=qt(le(r),n,r.location);break;case"unit":t[n]=Gt(le(r),r.location,n);break;case"string":t[n]=Sr(n,r);break}}return t}function Sr(e,t){let n=t.values.join(" ").trim();return e==="image"&&kr(n,t.location),n}function kr(e,t){if(!e)throw f.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw f.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(yr);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw f.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Mr(e){let t={};for(let n of e){if(n.key in t)throw f.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function Or(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function Gt(e,t,n){let r=e.match(Wt);if(!r)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=D(n);if(o?.unitFamily&&!De(o.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Ar(e){let t=e.match(Wt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function se(e,t){if(!e.has(t))return;let n=Ee(e,t);return Gt(le(n),n.location,t)}function Lr(e,t){if(!e.has(t))return;let n=Ee(e,t);return qt(le(n),t,n.location)}function qt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Pr(e){let t=le(e).toLowerCase(),n=br.get(t);if(n===void 0)throw f.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Ee(e,t){let n=e.get(t);if(!n)throw new f(`Missing value for key "${t}"`);return n}function Ce(e,t){return le(Ee(e,t))}function le(e){if(e.values.length!==1)throw f.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Tr=new Set(["star","planet","moon","asteroid","comet"]);function be(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new f(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new f(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!Tr.has(i.type))throw new f(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Dr(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Fr(r,r.placement.reference,t))}}function Dr(e,t,n){if(!n.has(t.primary))throw new f(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new f(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Fr(e,t,n){if(!n.has(t.objectId))throw new f(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function ne(e,t,n=`${t}.failed`){return e instanceof f?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}var ye=1495978707e-1,Cr=6371,Er=71492,Vr=695700,zr=63241.077,Br=206264.806,Rr=206264806,en=.68,_r=.2,tn=28;function B(e,t={}){let n=Wr(t),r=n.width,i=n.height,o=n.padding,a=Ur(e),l=Gr(e,t.projection),s=ft(t.camera??null),c=dt(l,s),u=Zr(a),d=Hr(a,t.scaleModel,t.bodyScaleMode),m=e.system?.id??null,h=t.activeEventId??null,b=Nr(e.objects,e.events??[],h),g=Jr(b,r,i,o,u,d),w=new Map(b.map(y=>[y.id,y])),M=Ci(b,w),p=new Map,$=[],P=[],_=[],T=[],N=[],Y=new Map,ee=new Map;for(let y of b){let F=y.placement;if(!F){_.push(y);continue}if(F.mode==="orbit"){Zt(ee,F.target,y);continue}if(F.mode==="surface"){Zt(Y,F.target,y);continue}if(F.mode==="at"){N.push(y);continue}T.push(y)}let A=T.length>0?r*.42:r/2,ae=i/2,V={orbitChildren:ee,surfaceChildren:Y,objectMap:w,spacingFactor:u,projection:c,scaleModel:d,sceneMetricScale:g},U=_.find(y=>y.type==="star")??_[0]??null;U&&ct(U,A,ae,0,p,$,P,V);let G=_.filter(y=>y.id!==U?.id);if(G.length>0){let y=Math.min(r,i)*.28*u*d.orbitDistanceMultiplier;G.forEach((F,k)=>{let at=$e(k,G.length,-Math.PI/2),te=je(at,y,c,1);ct(F,A+te.x,ae+te.y,0,p,$,P,V)})}T.forEach((y,F)=>{let k=r-o-140-_i(y.placement?.mode==="free"?y.placement.distance:void 0,d,g),at=Math.max(76,(i-o*2-180)/Math.max(1,T.length)*u)*d.freePlacementMultiplier,te=o+92+F*at;p.set(y.id,{object:y,x:k,y:te,radius:_e(y,0,d,g),sortKey:Ue(k,te,0)}),P.push({object:y,groupId:M.groupIds.get(y.id)??null,x1:k-60,y1:te,x2:k-18,y2:te,mode:"free"}),Be(y,p,$,P,V,1)}),N.forEach((y,F)=>{if(p.has(y.id)||!y.placement||y.placement.mode!=="at")return;let k=Di(y.placement.reference,p,w,F,N.length,r,i,o,V);p.set(y.id,{object:y,x:k.x,y:k.y,radius:_e(y,2,d,g),sortKey:Ue(k.x,k.y,2),anchorX:k.anchorX,anchorY:k.anchorY}),k.anchorX!==void 0&&k.anchorY!==void 0&&P.push({object:y,groupId:M.groupIds.get(y.id)??null,x1:k.anchorX,y1:k.anchorY,x2:k.x,y2:k.y,mode:"at"}),Be(y,p,$,P,V,2)});let q=[...p.values()].map(y=>Qr(y,d,M)),Ae=$.map(y=>ei(y,M.groupIds.get(y.object.id)??null)),Le=P.map(y=>ti(y)),Pe=ni(q,r,i,d.labelMultiplier),zt=ui(e,q),Bt=di(e.events??[],q,h),Jn=si(Ae,zt,Bt,Le,q,Pe),Qn=li(q,Ae,Le,Pe,M,d.labelMultiplier),er=ci(e,q),tr=fi(e,l,n.preset,M,w),nr=ji(r,i,q,Ae,Le,Pe,d.labelMultiplier);return{width:r,height:i,padding:o,renderPreset:n.preset,projection:l,renderProjection:c,camera:s,scaleModel:d,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:Xr(l,c,a,s),systemId:m,viewMode:l,layoutPreset:a,metadata:{format:e.format,version:e.version,view:l,renderProjection:c,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom","body.scaleMode":d.bodyScaleMode,...s?.azimuth!==null?{"camera.azimuth":String(s?.azimuth)}:{},...s?.elevation!==null?{"camera.elevation":String(s?.elevation)}:{},...s?.roll!==null?{"camera.roll":String(s?.roll)}:{},...s?.distance!==null?{"camera.distance":String(s?.distance)}:{}},contentBounds:nr,layers:Jn,groups:Qn,semanticGroups:er,viewpoints:tr,events:Bt,activeEventId:h,objects:q,orbitVisuals:Ae,relations:zt,leaders:Le,labels:Pe}}function Nr(e,t,n){let r=e.map(l=>structuredClone(l));if(!n)return r;let i=t.find(l=>l.id===n);if(!i)return r;let o=new Map(r.map(l=>[l.id,l])),a=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(l=>l.objectId)]);for(let l of a){let s=o.get(l);s&&(i.epoch&&(s.epoch=i.epoch),i.referencePlane&&(s.referencePlane=i.referencePlane))}for(let l of i.positions){let s=o.get(l.objectId);s&&(l.placement&&(s.placement=structuredClone(l.placement)),l.inner&&(s.properties.inner={...l.inner}),l.outer&&(s.properties.outer={...l.outer}),l.epoch&&(s.epoch=l.epoch),l.referencePlane&&(s.referencePlane=l.referencePlane))}return r}function Ur(e){switch(String(e.system?.properties.scale??"balanced").toLowerCase()){case"compressed":case"compact":return"compact";case"expanded":case"presentation":return"presentation";default:return"balanced"}}function Wr(e){let t=Yr(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Yr(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function Gr(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return on(n)??"topdown"}function dt(e,t){switch(e){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return t&&(t.azimuth!==null||t.elevation!==null||t.roll!==null)?"isometric":"topdown";case"perspective":return"isometric"}}function ft(e){if(!e)return null;let t={azimuth:lt(e.azimuth),elevation:lt(e.elevation),roll:lt(e.roll),distance:qr(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function lt(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function qr(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function Xr(e,t,n,r){let i=[`${Jt(e)} view`,`${Jt(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let o=[r.azimuth!==null?`az ${r.azimuth}`:null,r.elevation!==null?`el ${r.elevation}`:null,r.roll!==null?`roll ${r.roll}`:null,r.distance!==null?`dist ${r.distance}`:null].filter(Boolean);o.length>0&&i.push(`camera ${o.join(" / ")}`)}return i.join(" - ")}function Hr(e,t,n){return{...Kr(e),...n?{bodyScaleMode:n}:{},...t}}function Kr(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36,bodyScaleMode:"readable"};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48,bodyScaleMode:"readable"};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40,bodyScaleMode:"readable"}}}function Zr(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Jr(e,t,n,r,i,o){let a=[],l=[];for(let h of e){let b=Ui(h);b!==null&&b>0&&l.push(b);let g=h.placement;if(g){if(g.mode==="orbit"){let w=H(g.semiMajor??g.distance??null);w!==null&&w>0&&a.push(w);continue}if(g.mode==="free"){let w=H(g.distance??null);w!==null&&w>0&&a.push(w)}}}let s=Math.max(...a,0),c=Math.max(...l,0),u=Math.max(s,c*6,0),d=u+Math.max(Math.sqrt(u),c*2,s>0?.25:0);return d<=0?{pixelsPerMetric:null,hasExplicitScale:!1}:{pixelsPerMetric:Math.max(Math.min(t,n)/2-r-24,120)*i*o.orbitDistanceMultiplier/d,hasExplicitScale:!0}}function Qr(e,t,n){let{object:r,x:i,y:o,radius:a,sortKey:l,anchorX:s,anchorY:c}=e,u=r.renderHints?.renderPriority??0;return{renderId:ce(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:o,radius:a,visualRadius:Ri(r,a,t),sortKey:l+u*.001,anchorX:s,anchorY:c,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Wi(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function ei(e,t){return{renderId:`${ce(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function ti(e){return{renderId:`${ce(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function ni(e,t,n,r){let i=[],o=[],a=new Map(e.map(s=>[s.objectId,s])),l=[...e].filter(s=>!s.hidden&&s.object.renderHints?.renderLabel!==!1).sort(ri);for(let s of l){let c=ii(s,a,o,t,n,r)??rn(s,nn(s,a.get(s.parentId??"")??null,n),0,r);o.push(un(s,c,r)),i.push({renderId:`${s.renderId}-label`,objectId:s.objectId,object:s.object,groupId:s.groupId,semanticGroupIds:[...s.semanticGroupIds],label:s.label,secondaryLabel:s.secondaryLabel,x:c.x,y:c.labelY,secondaryY:c.secondaryY,textAnchor:c.textAnchor,direction:c.direction,hidden:s.hidden})}return i}function ri(e,t){let n=Xt(e)-Xt(t);if(n!==0)return n;let r=(t.object.renderHints?.renderPriority??0)-(e.object.renderHints?.renderPriority??0);return r!==0?r:e.sortKey-t.sortKey}function Xt(e){switch(e.object.type){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":case"ring":return 3;case"asteroid":case"comet":return 4;case"structure":case"phenomenon":return 5}}function ii(e,t,n,r,i,o){for(let a of oi(e,t,r,i)){let l=a==="left"||a==="right"?4:6;for(let s=0;s<=l;s+=1){let c=rn(e,a,s,o),u=un(e,c,o);if(!n.some(d=>zi(d,u)))return c}}return null}function oi(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,o=nn(e,i,r),a=o==="below"?"above":"below",l=ai(e,i,n),s=l==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[l,o,s,a]:[o,l,a,s]}function nn(e,t,n){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>n*.62?"above":"below"}function ai(e,t,n){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=n/2?"right":"left"}function rn(e,t,n,r){let i=14*r;switch(t){case"above":{let o=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:o,secondaryY:o-16*r,textAnchor:"middle",direction:t}}case"below":{let o=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:o,secondaryY:o+16*r,textAnchor:"middle",direction:t}}case"left":{let o=e.x-(e.visualRadius+16*r+n*i),a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"end",direction:t}}case"right":{let o=e.x+e.visualRadius+16*r+n*i,a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"start",direction:t}}}}function si(e,t,n,r,i,o){let a=e.filter(s=>!s.hidden&&!!s.backArcPath).map(s=>s.renderId),l=e.filter(s=>!s.hidden).map(s=>s.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"orbits-back",renderIds:a},{id:"orbits-front",renderIds:l},{id:"relations",renderIds:t.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"events",renderIds:n.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"objects",renderIds:i.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"labels",renderIds:o.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function li(e,t,n,r,i,o){let a=new Map,l=s=>{if(!s)return null;let c=a.get(s);if(c)return c;let u=i.groupRoots.get(s)??null,d={renderId:s,rootObjectId:u,label:u??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:xe(0,0,0,0)};return a.set(s,d),d};for(let s of e){let c=l(s.groupId);c&&!s.hidden&&c.objectIds.push(s.objectId)}for(let s of t){let c=l(s.groupId);c&&!s.hidden&&c.orbitIds.push(s.objectId)}for(let s of n){let c=l(s.groupId);c&&!s.hidden&&c.leaderIds.push(s.objectId)}for(let s of r){let c=l(s.groupId);c&&!s.hidden&&c.labelIds.push(s.objectId)}for(let s of a.values())s.contentBounds=Ei(s,e,t,n,r,o);return[...a.values()].sort((s,c)=>s.label.localeCompare(c.label))}function ci(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function ui(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),o=n.get(r.to);return{renderId:`${ce(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:o?.x??0,y2:o?.y??0,hidden:r.hidden||!i||!o||i.hidden||o.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function di(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let o=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],a=o.map(c=>r.get(c)).filter(Boolean),l=a.length>0?a.reduce((c,u)=>c+u.x,0)/a.length:0,s=a.length>0?a.reduce((c,u)=>c+u.y,0)/a.length:0;return{renderId:`${ce(i.id)}-event`,eventId:i.id,event:i,objectIds:o,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:l,y:s,hidden:i.hidden||a.length===0||a.every(c=>c.hidden)||n!==null&&i.id!==n}}).sort((i,o)=>i.event.id.localeCompare(o.event.id))}function fi(e,t,n,r,i){let o=pi(e,t,n),a=new Map;for(let[c,u]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[d,m,...h]=c.split(".");if(d!=="viewpoint"||!m||h.length===0)continue;let b=Ii(m);if(!b)continue;let g=h.join(".").toLowerCase(),w=a.get(b)??{id:b};mi(w,g,u,e,t,n,r,i),a.set(b,w)}let l=[...a.values()].map(c=>hi(c,t,n,i)).filter(Boolean),s=l.findIndex(c=>c.id===o.id);return s>=0?l.splice(s,1,{...o,...l[s],layers:{...o.layers,...l[s].layers},filter:l[s].filter??o.filter,generated:!1}):l.unshift(o),l.sort((c,u)=>c.id==="overview"?-1:u.id==="overview"?1:c.label.localeCompare(u.label))}function pi(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",o=ft(null),a=dt(t,o);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:a,camera:o,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function mi(e,t,n,r,i,o,a,l){let s=n.trim();switch(t){case"label":case"title":s&&(e.label=s);return;case"summary":case"description":s&&(e.summary=s);return;case"focus":case"object":s&&(e.focus=s);return;case"select":case"selection":s&&(e.select=s);return;case"events":e.eventIds=Ie(s);return;case"projection":case"view":e.projection=on(s)??i;return;case"preset":e.preset=bi(s)??o;return;case"rotation":case"angle":e.rotationDeg=we(s)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??ze(),azimuth:we(s)};return;case"camera.elevation":e.camera={...e.camera??ze(),elevation:we(s)};return;case"camera.roll":e.camera={...e.camera??ze(),roll:we(s)};return;case"camera.distance":e.camera={...e.camera??ze(),distance:Ht(s)};return;case"zoom":case"scale":e.scale=Ht(s);return;case"layers":e.layers=yi(s);return;case"query":e.filter={...e.filter??Ve(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??Ve(),objectTypes:wi(s)};return;case"tags":e.filter={...e.filter??Ve(),tags:Ie(s)};return;case"groups":e.filter={...e.filter??Ve(),groupIds:vi(s,r,a,l)};return}}function hi(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,o=e.select&&r.has(e.select)?e.select:i,a=gi(e.filter),l=e.label?.trim()||xi(e.id),s=e.projection??t,c=ft(e.camera??null),u=dt(s,c);return{id:e.id,label:l,summary:e.summary?.trim()||$i(l,i,a),objectId:i,selectedObjectId:o,eventIds:[...new Set(e.eventIds??[])],projection:s,renderProjection:u,camera:c,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function Ve(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function ze(){return{azimuth:null,elevation:null,roll:null,distance:null}}function gi(e){if(!e)return null;let t={query:e.query?.trim()||null,objectTypes:[...new Set(e.objectTypes)],tags:[...new Set(e.tags)],groupIds:[...new Set(e.groupIds)]};return t.query||t.objectTypes.length>0||t.tags.length>0||t.groupIds.length>0?t:null}function on(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function bi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function we(e){let t=Number(e);return Number.isFinite(t)?t:null}function Ht(e){let t=we(e);return t!==null&&t>0?t:null}function yi(e){let t={};for(let n of Ie(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="events"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function wi(e){return Ie(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function vi(e,t,n,r){return Ie(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.schemaVersion==="2.6"||t.groups.some(o=>o.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??ve(i):(r.has(i),ve(i)))}function Ie(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Ii(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function xi(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function $i(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function ji(e,t,n,r,i,o,a){let l=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,d=(m,h)=>{l=Math.min(l,m),s=Math.min(s,h),c=Math.max(c,m),u=Math.max(u,h)};for(let m of r)m.hidden||an(m,d);for(let m of i)m.hidden||(d(m.x1,m.y1),d(m.x2,m.y2));for(let m of n)m.hidden||sn(m,d);for(let m of o)m.hidden||ln(m,d,a);return!Number.isFinite(l)||!Number.isFinite(s)?xe(0,0,e,t):xe(l,s,c,u)}function an(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,o=fn(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,tn*2);for(let a of o)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function xe(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function sn(e,t){t(e.x-e.visualRadius-24,e.y-e.visualRadius-16),t(e.x+e.visualRadius+24,e.y+e.visualRadius+36)}function ln(e,t,n){let r=dn(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,n);t(r.left,r.top),t(r.right,r.bottom)}function ct(e,t,n,r,i,o,a,l){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:_e(e,r,l.scaleModel,l.sceneMetricScale),sortKey:Ue(t,n,r)}),Be(e,i,o,a,l,r+1))}function Be(e,t,n,r,i,o){let a=t.get(e.id);if(!a)return;let l=[...i.orbitChildren.get(e.id)??[]].sort(Si),s=ki(l,a.radius,i.spacingFactor,i.scaleModel,i.sceneMetricScale),c=Ai(l,s);l.forEach((d,m)=>{let h=Mi(d,m,l.length,a,s,c[m]??s.innerPx,i);n.push({object:d,parentId:e.id,kind:h.kind,cx:h.cx,cy:h.cy,radius:h.radius,rx:h.rx,ry:h.ry,rotationDeg:h.rotationDeg,band:h.band,bandThickness:h.bandThickness,frontArcPath:h.frontArcPath,backArcPath:h.backArcPath}),ct(d,h.objectX,h.objectY,o,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((d,m)=>{let h=$e(m,u.length,-Math.PI/3),b=28*i.spacingFactor,g=je(h,a.radius,i.projection,i.projection==="isometric"?.9:1),w=je(h,a.radius+b,i.projection,i.projection==="isometric"?.9:1),M=a.x+g.x,p=a.y+g.y,$=a.x+w.x,P=a.y+w.y;t.set(d.id,{object:d,x:$,y:P,radius:_e(d,o+1,i.scaleModel,i.sceneMetricScale),sortKey:Ue($,P,o+1),anchorX:M,anchorY:p}),r.push({object:d,groupId:i.objectMap.has(d.id)?ve(Vi(d,i.objectMap)):null,x1:M,y1:p,x2:$,y2:P,mode:"surface"}),Be(d,t,n,r,i,o+1)})}function Si(e,t){let n=Re(e),r=Re(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function ki(e,t,n,r,i){let o=e.map(h=>Re(h)),a=o.filter(h=>h!==null),l=r.bodyScaleMode==="strict"?Math.max(2,8*n*r.orbitDistanceMultiplier):(e.length>2?54:64)*n*r.orbitDistanceMultiplier*.42,s=t+Math.max(l*1.2,24*n),c=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(a.length===0)return{metrics:o,minMetric:0,maxMetric:0,metricSpread:0,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:l,pixelsPerMetric:i.pixelsPerMetric};let u=Math.min(...a),d=Math.max(...a),m=d-u;return{metrics:o,minMetric:u,maxMetric:d,metricSpread:m,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:l,pixelsPerMetric:i.pixelsPerMetric}}function Mi(e,t,n,r,i,o,a){let l=e.placement,s=e.type==="belt"||e.type==="ring";if(!l||l.mode!=="orbit"){let Y=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:Y,rotationDeg:0,band:s,bandThickness:s?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-Y}}let c=S(typeof l.eccentricity=="number"?l.eccentricity:0,0,.92),u=o,d=Math.max(u*Math.sqrt(1-c*c),u*.18),m=ut(l.inclination)??0,h=a.projection==="isometric"?Math.max(_r,Math.cos(pt(m)))*en:1,b=Math.max(d*h,u*.14),g=ut(l.angle)??0,w=u*c,M=mn(-w,0,g),p=r.x+M.x,$=r.y+M.y,P=Pi(l.phase,t,n),_=pn(p,$,u,b,g,P),T=a.projection==="topdown"&&c<=1e-4&&Math.abs(g)<=1e-4,N=s?Ti(e,u,i,a.scaleModel):void 0;return{kind:T?"circle":"ellipse",cx:T?r.x:p,cy:T?r.y:$,radius:T?u:void 0,rx:T?void 0:u,ry:T?void 0:b,rotationDeg:g,band:s,bandThickness:N,frontArcPath:a.projection==="isometric"||s?Kt(p,$,u,b,g,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||s?Kt(p,$,u,b,g,Math.PI,Math.PI*2):void 0,objectX:_.x,objectY:_.y}}function Oi(e,t){return t.pixelsPerMetric!==null?e*t.pixelsPerMetric:t.innerPx+t.stepPx*Li(Math.max(e,0)+1)}function Ai(e,t){let n=[];return e.forEach((r,i)=>{let o=Re(r),a=t.innerPx+i*t.stepPx,l=o===null?a:Oi(o,t),s=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(l,s))}),n}function Re(e){return!e.placement||e.placement.mode!=="orbit"?null:H(e.placement.semiMajor??e.placement.distance??null)}function Li(e){return Math.log(e)/Math.log(2)}function Pi(e,t,n){let r=e?ut(e):null;return r!==null?pt(r-90):$e(t,n,-Math.PI/2)}function Ti(e,t,n,r){let i=H(Ne(e.properties.inner)),o=H(Ne(e.properties.outer));if(i!==null&&o!==null){let l=Math.abs(o-i);if(n.pixelsPerMetric!==null){let c=l*n.pixelsPerMetric;return r.bodyScaleMode==="strict"?Math.max(c*r.ringThicknessMultiplier,1):S(Math.max(c*r.ringThicknessMultiplier,8),8,54)}if(n.metricSpread>0)return S(l/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(i,o),1e-4);return S(l/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Di(e,t,n,r,i,o,a,l,s){if(e.kind==="lagrange")return Fi(e,t,n,o,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=$e(r,i,Math.PI/5),d=(c.radius+36)*s.scaleModel.labelMultiplier,m=je(u,d,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}if(e.kind==="named"){let c=t.get(e.name);if(c){let u=$e(r,i,Math.PI/6),d=(c.radius+36)*s.scaleModel.labelMultiplier,m=je(u,d,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}return{x:o-l-170,y:a-l-86-r*58*s.scaleModel.freePlacementMultiplier}}function Fi(e,t,n,r,i){let o=e.secondary?t.get(e.primary):Bi(e.primary,t,n),a=t.get(e.secondary??e.primary);if(!o||!a)return{x:r*.7,y:i*.25};let l=a.x-o.x,s=a.y-o.y,c=Math.hypot(l,s)||1,u=l/c,d=s/c,m=-d,h=u,b=S(c*.25,24,68);switch(e.point){case"L1":return{x:a.x-u*b,y:a.y-d*b,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+u*b,y:a.y+d*b,anchorX:a.x,anchorY:a.y};case"L3":return{x:o.x-u*b,y:o.y-d*b,anchorX:o.x,anchorY:o.y};case"L4":return{x:a.x+(u*.5-m*.8660254)*b,y:a.y+(d*.5-h*.8660254)*b,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+m*.8660254)*b,y:a.y+(d*.5+h*.8660254)*b,anchorX:a.x,anchorY:a.y}}}function Ci(e,t){let n=new Map,r=new Map;for(let c of e){let u=cn(c,t);if(n.set(c.id,u),u){let d=r.get(u);d?d.push(c.id):r.set(u,[c.id])}r.has(c.id)||r.set(c.id,[])}let i=new Map,o=new Map,a=new Map,l=c=>{let u=i.get(c);if(u)return u;let d=new Set,m=[],h=n.get(c)??null;for(;h&&!d.has(h);)m.push(h),d.add(h),h=n.get(h)??null;return i.set(c,m),m},s=c=>{let u=a.get(o.get(c)??"");if(u)return u;let d=n.get(c)??null,m=t.get(c),h=c;return m?.placement&&m.placement.mode!=="free"&&d&&(h=s(d)),h};for(let c of e){l(c.id);let u=s(c.id),d=ve(u);o.set(c.id,d),a.set(d,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:o,groupRoots:a}}function cn(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function Ei(e,t,n,r,i,o){let a=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=(d,m)=>{a=Math.min(a,d),l=Math.min(l,m),s=Math.max(s,d),c=Math.max(c,m)};for(let d of t)!d.hidden&&e.objectIds.includes(d.objectId)&&sn(d,u);for(let d of n)!d.hidden&&e.orbitIds.includes(d.objectId)&&an(d,u);for(let d of r)!d.hidden&&e.leaderIds.includes(d.objectId)&&(u(d.x1,d.y1),u(d.x2,d.y2));for(let d of i)!d.hidden&&e.labelIds.includes(d.objectId)&&ln(d,u,o);return!Number.isFinite(a)||!Number.isFinite(l)?xe(0,0,0,0):xe(a,l,s,c)}function Vi(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let i=cn(n,t);if(!i)break;let o=t.get(i);if(!o)break;n=o}return n.id}function un(e,t,n){return dn(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function dn(e,t,n,r,i,o,a,l){let s=Yi(o,a,l),c=s*2,u=i==="above"?18:12,d=i==="above"?8:12,m=e-s,h=e+s;return r==="start"?(m=e,h=e+c):r==="end"&&(m=e-c,h=e),{left:m,right:h,top:Math.min(t,n)-u,bottom:Math.max(t,n)+d}}function zi(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Bi(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function _e(e,t,n,r){let i=Ni(e.properties.radius,n,r);if(i!==null)return i;let o=n.bodyRadiusMultiplier;switch(e.type){case"star":return S((t===0?28:20)*o,n.minBodyRadius,n.maxBodyRadius);case"planet":return S(12*o,n.minBodyRadius,n.maxBodyRadius);case"moon":return S(7*o,n.minBodyRadius,n.maxBodyRadius);case"belt":return S(5*o,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return S(5*o,n.minBodyRadius,n.maxBodyRadius);case"comet":return S(6*o,n.minBodyRadius,n.maxBodyRadius);case"ring":return S(5*o,n.minBodyRadius,n.maxBodyRadius);case"structure":return S(6*o,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return S(8*o,n.minBodyRadius,n.maxBodyRadius)}}function Ri(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function H(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/ye;case"m":return e.value/1e3/ye;case"ly":return e.value*zr;case"pc":return e.value*Br;case"kpc":return e.value*Rr;case"re":return e.value*Cr/ye;case"rj":return e.value*Er/ye;case"sol":return e.value*Vr/ye;default:return e.value}}function _i(e,t,n){let r=H(e??null);if(r===null||r<=0)return 0;if(n.pixelsPerMetric!==null){let i=r*n.pixelsPerMetric*t.freePlacementMultiplier;return t.bodyScaleMode==="strict"?Math.max(i,0):S(i,0,420)}return S(r*96*t.freePlacementMultiplier,0,420)}function Ni(e,t,n){let r=Ne(e);if(!r)return null;let i=H(r);if(n.pixelsPerMetric!==null&&i!==null&&i>0){let a=i*n.pixelsPerMetric*t.bodyRadiusMultiplier;return t.bodyScaleMode==="strict"?Math.max(a,.1):S(Math.max(a,t.minBodyRadius),t.minBodyRadius,t.maxBodyRadius)}let o;switch(r.unit){case"sol":o=S(r.value*22,14,40);break;case"re":o=S(r.value*10,6,18);break;case"km":o=S(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:o=S(r.value*4,4,20);break}return S(o*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function Ui(e){return H(Ne(e.properties.radius))}function Ne(e){return!e||typeof e!="object"||!("value"in e)?null:e}function ut(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function $e(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function Kt(e,t,n,r,i,o,a){let l=fn(e,t,n,r,i,o,a,tn);return l.length===0?"":l.map((s,c)=>`${c===0?"M":"L"} ${Qt(s.x)} ${Qt(s.y)}`).join(" ")}function fn(e,t,n,r,i,o,a,l){let s=[];for(let c=0;c<=l;c+=1){let u=o+(a-o)*c/l;s.push(pn(e,t,n,r,i,u))}return s}function pn(e,t,n,r,i,o){let a=n*Math.cos(o),l=r*Math.sin(o),s=mn(a,l,i);return{x:e+s.x,y:t+s.y}}function mn(e,t,n){let r=pt(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function je(e,t,n,r){let i=n==="isometric"?en*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function Ue(e,t,n){return t*1e3+e+n*.01}function S(e,t,n){return Math.min(Math.max(e,t),n)}function Zt(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function ce(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function ve(e){return`${ce(e)}-group`}function Wi(e){return typeof e=="string"&&e.trim()?e:void 0}function Yi(e,t,n){let r=e.length*4.6*n+18,i=t.length*3.9*n+18;return Math.max(r,i,24)}function Jt(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function pt(e){return e*Math.PI/180}function Qt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var bn=86400,We=bn*365.25,Ye=18,hn=180;function Xe(e,t={}){let n={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,camera:t.camera,scaleModel:t.scaleModel,bodyScaleMode:t.bodyScaleMode,activeEventId:t.activeEventId},r=B(e,n),i=Ki(r.layoutPreset,t.spatialScaleModel),o={x:r.contentBounds.centerX,y:r.contentBounds.centerY},a=new Map(r.objects.map(g=>[g.objectId,g])),l=new Map(r.orbitVisuals.map(g=>[g.objectId,g])),s=new Map;for(let g of r.objects){let w=g.object.placement;!w||w.mode!=="orbit"||s.set(g.objectId,ht(w))}let c=Math.min(...[...s.values()].filter(g=>Number.isFinite(g)&&g>0))||1,u=new Map,d=r.objects.map(g=>Gi(g,r,o,a,l,i,u,c)),m=new Map(d.map(g=>[g.objectId,g])),h=r.orbitVisuals.map(g=>qi(g,m,c,r.activeEventId!==null)),b=d.map(g=>({objectId:g.objectId,center:{...g.position},radius:g.visualRadius+i.focusPadding}));return{width:r.width,height:r.height,padding:r.padding,renderPreset:r.renderPreset,projection:r.projection,camera:r.camera,scaleModel:i,title:r.title,subtitle:r.subtitle,systemId:r.systemId,viewMode:"3d",layoutPreset:r.layoutPreset,metadata:{...r.metadata,"viewer.mode":"3d"},contentBounds:Ji(d),semanticGroups:r.semanticGroups,viewpoints:r.viewpoints,activeEventId:r.activeEventId,timeFrozen:r.activeEventId!==null,objects:d,orbits:h,focusTargets:b}}function Gi(e,t,n,r,i,o,a,l){let s=Ge(e,t,n,r,i,a),c=gt(e.object,i.get(e.objectId),l,t.activeEventId!==null);return{objectId:e.objectId,object:e.object,parentId:e.parentId,ancestorIds:e.ancestorIds.slice(),childIds:e.childIds.slice(),groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),position:s,radius:ue(e.radius*o.bodyRadiusMultiplier,o.minBodyRadius,o.maxBodyRadius),visualRadius:ue(e.visualRadius*o.bodyRadiusMultiplier,o.minBodyRadius,o.maxBodyRadius+24),label:e.label,secondaryLabel:e.secondaryLabel,fillColor:e.fillColor,imageHref:e.imageHref,hidden:e.hidden,motion:c}}function qi(e,t,n,r){let i=t.get(e.objectId),o=t.get(e.parentId);return{objectId:e.objectId,object:e.object,parentId:e.parentId,groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),center:o?.position??{x:0,y:0,z:0},kind:e.kind,radius:e.radius,semiMajor:e.radius??e.rx??0,semiMinor:e.radius??e.ry??0,rotationDeg:e.rotationDeg,inclinationDeg:i?.motion?.inclinationDeg??qe(e.object.placement?.mode==="orbit"?e.object.placement.inclination:void 0)??0,band:e.band,bandThickness:e.bandThickness,hidden:e.hidden,motion:i?.motion??gt(e.object,e,n,r)}}function Ge(e,t,n,r,i,o){let a=o.get(e.objectId);if(a)return a;let l=e.object.placement,s;if(l?.mode==="orbit"&&e.parentId){let c=r.get(e.parentId),u=c?Ge(c,t,n,r,i,o):{x:0,y:0,z:0},d=i.get(e.objectId),m=gt(e.object,d,1,t.activeEventId!==null),h=m?Xi(m,0):{x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};s=Qi(u,h)}else if(l?.mode==="surface"&&e.parentId){let c=r.get(e.parentId),u=c?Ge(c,t,n,r,i,o):{x:0,y:0,z:0},d=c?.visualRadius??16,m=eo(e.objectId),h=m*Math.PI*2;s={x:u.x+Math.cos(h)*(d+e.visualRadius*.9),y:u.y+Math.sin(m*Math.PI)*Math.max(e.visualRadius*.2,2),z:u.z+Math.sin(h)*(d+e.visualRadius*.9)}}else if(l?.mode==="at"&&e.parentId){let c=r.get(e.parentId),u=c?Ge(c,t,n,r,i,o):{x:0,y:0,z:0},d=e.anchorX??c?.x??n.x,m=e.anchorY??c?.y??n.y;s={x:u.x+(e.x-d),y:u.y,z:u.z+(e.y-m)}}else s={x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};return o.set(e.objectId,s),s}function Xi(e,t){let n=e.phase0Deg+e.angularVelocityDegPerSecond*t,r=mt(n),i=mt(e.rotationDeg),o=mt(e.inclinationDeg),a=Math.cos(r)*e.semiMajor,l=Math.sin(r)*e.semiMinor,s=a*Math.cos(i)-l*Math.sin(i),c=a*Math.sin(i)+l*Math.cos(i);return{x:s,y:c*Math.sin(o),z:c*Math.cos(o)}}function gt(e,t,n,r){let i=e.placement;if(!i||i.mode!=="orbit")return null;let o=t?.radius??t?.rx??ue(ht(i)*48,24,1200),a=t?.radius??t?.ry??o,l=Hi(i.period),s=ht(i),c=ue(s/Math.max(n,1e-4),1,20),u=ue(l?Ye*c:Ye*Math.pow(c,.75),Ye,hn);return{phase0Deg:qe(i.phase)??0,rotationDeg:qe(i.angle)??t?.rotationDeg??0,inclinationDeg:qe(i.inclination)??0,semiMajor:o,semiMinor:a,eccentricity:i.eccentricity??0,periodSeconds:l,angularVelocityDegPerSecond:360/Math.max(u,.001),heuristic:l===null,frozen:r}}function ht(e){let t=gn(e.semiMajor)??gn(e.distance)??1;return Math.max(t,.01)}function gn(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/1495978707e-1;case"m":return e.value/149597870700;case"re":return e.value*6371/1495978707e-1;case"rj":return e.value*71492/1495978707e-1;case"sol":return e.value*695700/1495978707e-1;case"ly":return e.value*63241.077;case"pc":return e.value*206264.806;case"kpc":return e.value*206264806;default:return e.value}}function Hi(e){if(!e)return null;switch(e.unit){case"s":return e.value;case"min":return e.value*60;case"h":return e.value*3600;case"d":return e.value*bn;case"y":return e.value*We;case"ky":return e.value*We*1e3;case"my":return e.value*We*1e6;case"gy":return e.value*We*1e9;default:return null}}function qe(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Ki(e,t){return{...Zi(e),...t}}function Zi(e){switch(e){case"compact":return{orbitDistanceMultiplier:.92,bodyRadiusMultiplier:.92,markerSizeMultiplier:.92,ringThicknessMultiplier:.9,focusPadding:10,minBodyRadius:4,maxBodyRadius:34};case"presentation":return{orbitDistanceMultiplier:1.15,bodyRadiusMultiplier:1.12,markerSizeMultiplier:1.08,ringThicknessMultiplier:1.14,focusPadding:16,minBodyRadius:5,maxBodyRadius:44};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,markerSizeMultiplier:1,ringThicknessMultiplier:1,focusPadding:12,minBodyRadius:4,maxBodyRadius:40}}}function Ji(e){if(e.length===0)return{minX:0,minY:0,minZ:0,maxX:0,maxY:0,maxZ:0,width:0,height:0,depth:0,center:{x:0,y:0,z:0}};let t=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY,r=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(let l of e)t=Math.min(t,l.position.x-l.visualRadius),n=Math.min(n,l.position.y-l.visualRadius),r=Math.min(r,l.position.z-l.visualRadius),i=Math.max(i,l.position.x+l.visualRadius),o=Math.max(o,l.position.y+l.visualRadius),a=Math.max(a,l.position.z+l.visualRadius);return{minX:t,minY:n,minZ:r,maxX:i,maxY:o,maxZ:a,width:i-t,height:o-n,depth:a-r,center:{x:(t+i)/2,y:(n+o)/2,z:(r+a)/2}}}function Qi(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function eo(e){let t=0;for(let n=0;n<e.length;n+=1)t=t*31+e.charCodeAt(n)>>>0;return t%1e4/1e4}function ue(e,t,n){return Math.min(Math.max(e,t),n)}function mt(e){return e*Math.PI/180}function bt(e,t={}){let n=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:ao(e.system),info:so(e.system)}:null,r=e.objects.map(to);return io(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,theme:e.theme??null,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(no),objects:r}}function to(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:oo(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function no(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(ro)}}function ro(e){return{objectId:e.objectId,placement:yn(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function yn(e){return e?structuredClone(e):null}function io(e,t,n){if(!n)return;let r=t.find(a=>a.id===n);if(!r)return;let i=new Map(e.map(a=>[a.id,a])),o=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(a=>a.objectId)]);for(let a of o){let l=i.get(a);l&&(r.epoch&&(l.epoch=r.epoch),r.referencePlane&&(l.referencePlane=r.referencePlane))}for(let a of r.positions){let l=i.get(a.objectId);l&&(a.placement&&(l.placement=yn(a.placement)),a.inner&&(l.properties.inner={...a.inner}),a.outer&&(l.properties.outer={...a.outer}),a.epoch&&(l.epoch=a.epoch),a.referencePlane&&(l.referencePlane=a.referencePlane))}}function oo(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function ao(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function so(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg)),n.camera?.azimuth!==null&&(t[`${r}.camera.azimuth`]=String(n.camera?.azimuth)),n.camera?.elevation!==null&&(t[`${r}.camera.elevation`]=String(n.camera?.elevation)),n.camera?.roll!==null&&(t[`${r}.camera.roll`]=String(n.camera?.roll)),n.camera?.distance!==null&&(t[`${r}.camera.distance`]=String(n.camera?.distance));let i=lo(n.layers);i&&(t[`${r}.layers`]=i),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.join(" "))}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function lo(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}var wn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,fo=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),po=/^[A-Za-z][A-Za-z0-9+.-]*:/;function de(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function ke(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function yt(e,t,n){let r=e.match(wn);if(!r)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=D(n);if(o?.unitFamily&&!De(o.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function wt(e){let t=e.match(wn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function He(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function K(e,t,n){let r=fo.get(e.toLowerCase());if(r===void 0)throw f.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function vn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function mo(e,t){if(!e)throw f.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw f.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(po);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw f.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function In(e,t,n){let r=D(e);if(!r)throw f.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw f.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return K(Se(t,e,n),e,n);case"number":return He(Se(t,e,n),e,n);case"unit":return yt(Se(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&mo(i,n),i}}}function vt(e,t,n){let r=D(e);if(!r)throw f.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw f.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function Se(e,t,n){if(e.length!==1)throw f.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var $n=new Set(["star","planet","moon","asteroid","comet"]),ho=332946.0487,go=1047.3486,Ke=1495978707e-1,bo=6371,yo=695700,wo=63241.077,vo=206264.806,Io=206264806;function Ze(e,t){let n=[],r=new Map(e.objects.map(l=>[l.id,l])),i=new Set(e.groups.map(l=>l.id)),o=new Set(e.events.map(l=>l.id));e.system||n.push(v("validate.system.required","Atlas documents must declare exactly one system."));let a=new Map;for(let[l,s]of[["group",e.groups.map(c=>c.id)],["viewpoint",e.system?.viewpoints.map(c=>c.id)??[]],["annotation",e.system?.annotations.map(c=>c.id)??[]],["relation",e.relations.map(c=>c.id)],["event",e.events.map(c=>c.id)],["object",e.objects.map(c=>c.id)]])for(let c of s){let u=a.get(c);u?n.push(v("validate.id.duplicate",`Duplicate ${l} id "${c}" already used by ${u}.`)):a.set(c,l)}for(let l of e.relations)xo(l,r,n);for(let l of e.system?.viewpoints??[])$o(l,i,o,t,n,r);for(let l of e.objects)jo(l,e.system,r,i,n);for(let l of e.events)So(l,e.system,r,n);return n}function xo(e,t,n){e.from?t.has(e.from)||n.push(v("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(v("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(v("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(v("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(v("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function $o(e,t,n,r,i,o){let a=e.filter;if(r==="2.1"||r==="2.5"||r==="2.6"){if(a)for(let l of a.groupIds)t.has(l)||i.push(j("validate.viewpoint.group.unknown",`Unknown group "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let l of e.events??[])n.has(l)||i.push(j("validate.viewpoint.event.unknown",`Unknown event "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}Ao(e.projection,i,`viewpoint.${e.id}.projection`,e.id),Lo(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,a,o)}function jo(e,t,n,r,i){let o=e.placement,a=o?.mode==="orbit"?o:null,l=o?.mode==="orbit"?n.get(o.target)??null:null;if(e.groups)for(let s of e.groups)r.has(s)||i.push(j("validate.group.unknown",`Unknown group "${s}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(j("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(j("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),a&&(n.has(a.target)||i.push(v("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&i.push(v("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&i.push(j("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),a.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(j("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!xt(l?.properties.mass)&&i.push(j("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),o?.mode==="surface"){let s=n.get(o.target);s?$n.has(s.type)||i.push(v("validate.surface.target.invalid",`Surface target "${o.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(v("validate.surface.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"surface"))}if(o?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(v("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Mo(e,n,i)||i.push(v("validate.at.target.unknown",`Unknown at-reference target "${o.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let s=n.get(e.resonance.targetObjectId);s?(e.placement?.mode!=="orbit"||s.placement?.mode!=="orbit"||e.placement.target!==s.placement.target)&&i.push(j("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(v("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let s of e.deriveRules??[]){if(s.field!=="period"||s.strategy!=="kepler"){i.push(j("validate.derive.unsupported",`Unsupported derive rule "${s.field} ${s.strategy}" on "${e.id}".`,e.id,"derive"));continue}let c=xn(e,l);if(c===null){i.push(j("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||i.push(It("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Fo(c)}.`,e.id,"derive"))}for(let s of e.validationRules??[]){if(s.rule!=="kepler"){i.push(j("validate.rule.unsupported",`Unsupported validation rule "${s.rule}" on "${e.id}".`,e.id,"validate"));continue}let c=jn(a?.period),u=xn(e,l);if(c===null||u===null)continue;let d=Do(e,"period");Math.abs(c-u)>d&&i.push(v("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function So(e,t,n,r){let i=`event.${e.id}`,o=new Set;e.kind.trim()||r.push(v("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${i}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&r.push(j("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${i}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&r.push(j("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${i}.referencePlane`)),!e.targetObjectId&&e.participantObjectIds.length===0&&r.push(v("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${i}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),n.has(e.targetObjectId)||r.push(v("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${i}.target`)));let a=new Set;for(let c of e.participantObjectIds){if(o.add(c),a.has(c)){r.push(j("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${c}".`,void 0,`${i}.participants`));continue}a.add(c),n.has(c)||r.push(v("validate.event.participants.unknown",`Unknown event participant "${c}" on "${e.id}".`,void 0,`${i}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&r.push(j("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(j("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${i}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.size<3&&r.push(j("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${i}.participants`));let l=new Set;for(let c of e.positions){let u=`${i}.pose.${c.objectId}`;if(l.has(c.objectId)){r.push(v("validate.event.pose.duplicate",`Event "${e.id}" defines "${c.objectId}" more than once in positions.`,void 0,u));continue}l.add(c.objectId);let d=n.get(c.objectId);if(!d){r.push(v("validate.event.pose.object.unknown",`Unknown event pose object "${c.objectId}" on "${e.id}".`,void 0,u));continue}o.has(c.objectId)||r.push(j("validate.event.pose.unreferenced",`Event pose "${c.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,u)),ko(c,d,e,t,n,r,u,e.id)}let s=[...o].filter(c=>!l.has(c));e.positions.length>0&&s.length>0&&r.push(j("validate.event.positions.partial",`Event "${e.id}" leaves ${s.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function ko(e,t,n,r,i,o,a,l){let s=e.placement;if(!s){o.push(v("validate.event.pose.placement.required",`Event "${l}" pose "${e.objectId}" is missing a placement mode.`,void 0,a));return}if(s.mode==="orbit"){i.has(s.target)||o.push(v("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.orbit`)),s.distance&&s.semiMajor&&o.push(v("validate.event.pose.orbit.distanceConflict",`Event "${l}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${a}.distance`)),s.phase&&!Po(r,t,n,e)&&o.push(j("validate.event.pose.phase.epochMissing",`Event "${l}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${a}.phase`)),s.inclination&&!To(r,t,n,e)&&o.push(j("validate.event.pose.inclination.referencePlaneMissing",`Event "${l}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${a}.inclination`)),s.period&&!xt(i.get(s.target)?.properties.mass)&&o.push(j("validate.event.pose.period.massMissing",`Event "${l}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${a}.period`));return}if(s.mode==="surface"){let c=i.get(s.target);c?$n.has(c.type)||o.push(v("validate.event.pose.surface.target.invalid",`Event surface target "${s.target}" on "${l}:${e.objectId}" is not surface-capable.`,void 0,`${a}.surface`)):o.push(v("validate.event.pose.surface.target.unknown",`Unknown event surface target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.surface`));return}if(s.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&o.push(v("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${l}:${e.objectId}".`,void 0,`${a}.at`));let c=s.reference;c.kind==="named"&&!i.has(c.name)?o.push(v("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):c.kind==="anchor"&&!i.has(c.objectId)?o.push(v("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${c.objectId}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):c.kind==="lagrange"&&(i.has(c.primary)?c.secondary&&!i.has(c.secondary)&&o.push(v("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${c.secondary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):o.push(v("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${c.primary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)))}}function Mo(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(v("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(v("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(v("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function xn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=Oo(n.semiMajor??n.distance),i=xt(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function Oo(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Ke;case"m":return e.value/(Ke*1e3);case"ly":return e.value*wo;case"pc":return e.value*vo;case"kpc":return e.value*Io;case"re":return e.value*bo/Ke;case"sol":return e.value*yo/Ke;default:return null}}function xt(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/ho;case"mj":return t.value/go;default:return null}}function jn(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function Ao(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(v("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function Lo(e,t,n,r,i,o,a,l,s){if(!e)return;let c=`viewpoint.${i}.camera`;for(let[d,m]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])m!==null&&(!Number.isFinite(m)||d==="distance"&&m<=0)&&r.push(v("validate.viewpoint.camera.invalid",`Invalid camera ${d} "${String(m)}" in viewpoint "${i}".`,void 0,`${c}.${d}`));e.distance!==null&&t!=="perspective"&&r.push(j("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${c}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(j("validate.viewpoint.camera.topdownPartial",`Camera elevation/roll on topdown viewpoint "${i}" are currently stored for future 3D use and only partially affect 2D rendering.`,void 0,c)),t==="isometric"&&e.elevation!==null&&r.push(It("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${c}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(j("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${c}.azimuth`)),o!==null&&s.has(o)||a!==null&&s.has(a)||l||r.push(It("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,c))}function Po(e,t,n,r){return Z(r?.epoch)??Z(n?.epoch)??Z(t.epoch)??Z(e?.epoch)??null}function To(e,t,n,r){return Z(r?.referencePlane)??Z(n?.referencePlane)??Z(t.referencePlane)??Z(e?.referencePlane)??null}function Z(e){return typeof e=="string"&&e.trim()?e.trim():null}function Do(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?jn(n)??0:0}function Fo(e){return`${Math.round(e*100)/100}d`}function v(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function j(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function It(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Co=new Set(["climate","habitability","settlement"]),Qe=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=D(e);t&&Qe.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])Qe.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Eo=new Set(Qe.keys()),kn=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function $t(e){return Vo(e)}function Vo(e,t){let n=$a(e),r=n.source.split(/\r?\n/),i=[],o=!1,a="2.0",l=null,s=null,c=[],u=[],d=[],m=[],h=new Map,b=!1,g=!1,w=new Set,M=new Set,p=new Set,$=new Set,P=new Set;for(let A=0;A<r.length;A++){let ae=r[A],V=A+1;if(!ae.trim())continue;let U=Fe(ae),G=me(ae.slice(U),{line:V,columnOffset:U});if(G.length!==0){if(!o){a=zo(G,V),o=!0,n.comments.length>0&&et(a,"2.1")&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${a}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(U===0){s=Bo(G,V,a,i,l,c,u,d,m,h,w,M,p,$,P,{sawDefaults:b,sawAtlas:g}),s.kind==="system"?l=s.system:s.kind==="defaults"?b=!0:s.kind==="atlas"&&(g=!0);continue}if(!s)throw new f("Indented line without parent atlas section",V,U+1);qo(s,U,G,V)}}if(!o)throw new f('Missing required atlas schema header "schema 2.0"');let _=c.map(A=>fa(A,a,i)),T=m.map(A=>pa(A,h.get(A.id)??[])),N=t??(a==="2.0-draft"?"2.0":a),Y={format:"worldorbit",sourceVersion:"1.0",theme:null,system:l,groups:u,relations:d,events:T,objects:_,diagnostics:i};if(N==="2.0-draft"){let A={...Y,version:"2.0-draft",schemaVersion:"2.0-draft"};return A.diagnostics.push(...Ze(A,a)),A}let ee={...Y,version:N,schemaVersion:N};return a==="2.0-draft"&&ee.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),ee.diagnostics.push(...Ze(ee,a)),ee}function zo(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5","2.6"].includes(e[1].value.toLowerCase()))throw new f('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", "schema 2.6", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.6"?"2.6":n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Bo(e,t,n,r,i,o,a,l,s,c,u,d,m,h,b,g){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new f('Atlas section "system" may only appear once',t,e[0].column);return Ro(e,t,n,r);case"defaults":if(!i)throw new f('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(g.sawDefaults)throw new f('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,sourceSchemaVersion:n,diagnostics:r,seenFields:new Set};case"atlas":if(!i)throw new f('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(g.sawAtlas)throw new f('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:i,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!i)throw new f('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return _o(e,t,i,u,n,r);case"annotation":if(!i)throw new f('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return No(e,t,i,d);case"group":return E(n,r,"group",{line:t,column:e[0].column}),Uo(e,t,a,m);case"relation":return E(n,r,"relation",{line:t,column:e[0].column}),Wo(e,t,l,h);case"event":return E(n,r,"event",{line:t,column:e[0].column}),Yo(e,t,s,c,b,n,r);case"object":return Go(e,t,n,r,o);default:throw new f(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Ro(e,t,n,r){if(e.length!==2)throw new f("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function _o(e,t,n,r,i,o){if(e.length!==2)throw new f("Invalid viewpoint declaration",t,e[0]?.column??1);let a=de(e[1].value);if(!a)throw new f("Viewpoint id must not be empty",t,e[1].column);if(r.has(a))throw new f(`Duplicate viewpoint id "${a}"`,t,e[1].column);let l={id:a,label:ke(a),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null};return n.viewpoints.push(l),r.add(a),{kind:"viewpoint",viewpoint:l,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function No(e,t,n,r){if(e.length!==2)throw new f("Invalid annotation declaration",t,e[0]?.column??1);let i=de(e[1].value);if(!i)throw new f("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new f(`Duplicate annotation id "${i}"`,t,e[1].column);let o={id:i,label:ke(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(o),r.add(i),{kind:"annotation",annotation:o,seenFields:new Set}}function Uo(e,t,n,r){if(e.length!==2)throw new f("Invalid group declaration",t,e[0]?.column??1);let i=de(e[1].value);if(!i)throw new f("Group id must not be empty",t,e[1].column);if(r.has(i))throw new f(`Duplicate group id "${i}"`,t,e[1].column);let o={id:i,label:ke(i),summary:"",color:null,tags:[],hidden:!1};return n.push(o),r.add(i),{kind:"group",group:o,seenFields:new Set}}function Wo(e,t,n,r){if(e.length!==2)throw new f("Invalid relation declaration",t,e[0]?.column??1);let i=de(e[1].value);if(!i)throw new f("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new f(`Duplicate relation id "${i}"`,t,e[1].column);let o={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(o),r.add(i),{kind:"relation",relation:o,seenFields:new Set}}function Yo(e,t,n,r,i,o,a){if(e.length!==2)throw new f("Invalid event declaration",t,e[0]?.column??1);let l=de(e[1].value);if(!l)throw new f("Event id must not be empty",t,e[1].column);if(i.has(l))throw new f(`Duplicate event id "${l}"`,t,e[1].column);let s={id:l,kind:"",label:ke(l),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},c=[];return n.push(s),r.set(l,c),i.add(l),{kind:"event",event:s,sourceSchemaVersion:o,diagnostics:a,seenFields:new Set,rawPoses:c,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Go(e,t,n,r,i){if(e.length<3)throw new f("Invalid atlas object declaration",t,e[0]?.column??1);let o=e[1],a=e[2],l=o.value;if(!Te.has(l)||l==="system")throw new f(`Unknown object type "${o.value}"`,t,o.column);let s={objectType:l,id:a.value,fields:ua(e.slice(3),t,l,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:o.column}};return i.push(s),{kind:"object",objectNode:s,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function qo(e,t,n,r){switch(e.kind){case"system":Xo(e,n,r);return;case"defaults":Ho(e,n,r);return;case"atlas":Ko(e,t,n,r);return;case"viewpoint":Zo(e,t,n,r);return;case"annotation":ea(e,n,r);return;case"group":ta(e,n,r);return;case"relation":na(e,n,r);return;case"event":ra(e,t,n,r);return;case"object":oa(e,t,n,r);return}}function Xo(e,t,n){let r=W(t,e.seenFields,n),i=x(t,n);switch(r){case"title":e.system.title=i;return;case"description":E(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":E(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":E(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new f(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function Ho(e,t,n){let r=W(t,e.seenFields,n),i=x(t,n);switch(r){case"view":On(i)&&re(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=Mn(i,n,t[0].column);return;case"scale":e.system.defaults.scale=i;return;case"units":e.system.defaults.units=i;return;case"preset":e.system.defaults.preset=An(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new f(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function Ko(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=Ln(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new f(`Duplicate atlas metadata key "${i.key}"`,r,n[0].column);e.system.atlasMetadata[i.key]=i.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new f(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function Zo(e,t,n,r){if(e.inCamera&&t<=(e.cameraIndent??0)&&(e.inCamera=!1,e.cameraIndent=null),e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inCamera){Jo(e,n,r);return}if(e.inFilter){Qo(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(re(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new f('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??St();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new f('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=W(n,e.seenFields,r),o=x(n,r);switch(i){case"label":e.viewpoint.label=o;return;case"summary":e.viewpoint.summary=o;return;case"focus":e.viewpoint.focusObjectId=o;return;case"select":e.viewpoint.selectedObjectId=o;return;case"projection":On(o)&&re(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=Mn(o,r,n[0].column);return;case"preset":e.viewpoint.preset=An(o,r,n[0].column);return;case"zoom":e.viewpoint.zoom=jt(o,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=Q(o,r,n[0].column,"rotation");return;case"camera":re(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=ca(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=sa(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":E(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=R(n.slice(1),r,"events");return;default:throw new f(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Jo(e,t,n){let r=W(t,e.seenCameraFields,n),i=x(t,n),o=e.viewpoint.camera??St();switch(r){case"azimuth":o.azimuth=Q(i,n,t[0].column,"camera.azimuth");break;case"elevation":o.elevation=Q(i,n,t[0].column,"camera.elevation");break;case"roll":o.roll=Q(i,n,t[0].column,"camera.roll");break;case"distance":o.distance=jt(i,n,t[0].column,"camera.distance");break;default:throw new f(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=o}function Qo(e,t,n){let r=W(t,e.seenFilterFields,n),i=e.viewpoint.filter??la();switch(r){case"query":i.query=x(t,n);break;case"objecttypes":i.objectTypes=aa(t.slice(1),n);break;case"tags":i.tags=R(t.slice(1),n,"tags");break;case"groups":i.groupIds=R(t.slice(1),n,"groups");break;default:throw new f(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function ea(e,t,n){switch(W(t,e.seenFields,n)){case"label":e.annotation.label=x(t,n);return;case"target":e.annotation.targetObjectId=x(t,n);return;case"body":e.annotation.body=x(t,n);return;case"tags":e.annotation.tags=R(t.slice(1),n,"tags");return;default:throw new f(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function ta(e,t,n){switch(W(t,e.seenFields,n)){case"label":e.group.label=x(t,n);return;case"summary":e.group.summary=x(t,n);return;case"color":e.group.color=x(t,n);return;case"tags":e.group.tags=R(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=K(x(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new f(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function na(e,t,n){switch(W(t,e.seenFields,n)){case"from":e.relation.from=x(t,n);return;case"to":e.relation.to=x(t,n);return;case"kind":e.relation.kind=x(t,n);return;case"label":e.relation.label=x(t,n);return;case"summary":e.relation.summary=x(t,n);return;case"tags":e.relation.tags=R(t.slice(1),n,"tags");return;case"color":e.relation.color=x(t,n);return;case"hidden":e.relation.hidden=K(x(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new f(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function ra(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){(n[0]?.value==="epoch"||n[0]?.value==="referencePlane")&&re(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(ia(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new f(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let o=n[1].value;if(!o.trim())throw new f("Event pose object id must not be empty",r,n[1].column);let a={objectId:o,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(a),e.activePose=a,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new f('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(W(n,e.seenFields,r)){case"kind":e.event.kind=x(n,r);return;case"label":e.event.label=x(n,r);return;case"summary":e.event.summary=x(n,r);return;case"target":e.event.targetObjectId=x(n,r);return;case"participants":e.event.participantObjectIds=R(n.slice(1),r,"participants");return;case"timing":e.event.timing=x(n,r);return;case"visibility":e.event.visibility=x(n,r);return;case"epoch":re(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=x(n,r);return;case"referenceplane":re(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=x(n,r);return;case"tags":e.event.tags=R(n.slice(1),r,"tags");return;case"color":e.event.color=x(n,r);return;case"hidden":e.event.hidden=K(x(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new f(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function ia(e,t,n){if(e.length<2)throw new f("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!kn.has(r))throw new f(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new f(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(i=>i.value),location:{line:t,column:e[0].column}}}function oa(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let i=n[0].value.toLowerCase();if(i==="info"||Co.has(i)){i!=="info"&&E(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=Ln(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new f(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let o=e.activeBlock,a=e.seenTypedBlockKeys[o]??(e.seenTypedBlockKeys[o]=new Set);if(a.has(i.key))throw new f(`Duplicate ${o} key "${i.key}"`,r,n[0].column);a.add(i.key),(e.objectNode.typedBlockEntries[o]??(e.objectNode.typedBlockEntries[o]=[])).push(i);return}e.objectNode.fields.push(da(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function W(e,t,n){if(e.length<2)throw new f("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new f(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function x(e,t){if(e.length<2)throw new f("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function aa(e,t){return R(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function sa(e,t,n,r){let i={};for(let o of R(e,t,"layers")){let a=!o.startsWith("-")&&!o.startsWith("!"),l=o.replace(/^[-!]+/,"").toLowerCase();if(l==="orbits"){i["orbits-back"]=a,i["orbits-front"]=a;continue}(l==="background"||l==="guides"||l==="orbits-back"||l==="orbits-front"||l==="relations"||l==="events"||l==="objects"||l==="labels"||l==="metadata")&&(l==="events"&&n&&r&&E(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[l]=a)}return i}function R(e,t,n){if(e.length===0)throw new f(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new f(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function Mn(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new f(`Unknown projection "${e}"`,t,n);return r}function On(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function An(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new f(`Unknown render preset "${e}"`,t,n)}function jt(e,t,n,r){let i=Q(e,t,n,r);if(i<=0)throw new f(`Field "${r}" must be greater than zero`,t,n);return i}function Q(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new f(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function la(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function St(){return{azimuth:null,elevation:null,roll:null,distance:null}}function ca(e,t,n){if(e.length===0||e.length%2!==0)throw new f('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:St(),i=new Set;for(let o=0;o<e.length;o+=2){let a=e[o],l=e[o+1],s=a.value.toLowerCase();if(i.has(s))throw new f(`Duplicate viewpoint camera field "${a.value}"`,t,a.column);i.add(s);let c=l.value;switch(s){case"azimuth":r.azimuth=Q(c,t,a.column,"camera.azimuth");break;case"elevation":r.elevation=Q(c,t,a.column,"camera.elevation");break;case"roll":r.roll=Q(c,t,a.column,"camera.roll");break;case"distance":r.distance=jt(c,t,a.column,"camera.distance");break;default:throw new f(`Unknown viewpoint camera field "${a.value}"`,t,a.column)}}return r}function ua(e,t,n,r,i){let o=[],a=0;for(;a<e.length;){let l=e[a],s=Me(l.value);if(!s)throw new f(`Unknown field "${l.value}"`,t,l.column);s.version==="2.1"&&E(r,i,l.value,{line:t,column:l.column}),a++;let c=[];if(s.inlineMode==="single"){let u=e[a];u&&(c.push(u),a++)}else if(s.inlineMode==="pair")for(let u=0;u<2;u++){let d=e[a];if(!d)break;c.push(d),a++}else for(;a<e.length&&!Eo.has(e[a].value);)c.push(e[a]),a++;if(c.length===0)throw new f(`Missing value for field "${l.value}"`,t,l.column);o.push({type:"field",key:l.value,values:c.map(u=>u.value),location:{line:t,column:l.column}})}return Fn(o,n),o}function da(e,t,n,r,i){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);let o=Me(e[0].value);if(!o)throw new f(`Unknown field "${e[0].value}"`,t,e[0].column);o.version==="2.1"&&E(r,i,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(l=>l.value),location:{line:t,column:e[0].column}};return Fn([a],n),a}function Ln(e,t,n){if(e.length<2)throw new f(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function fa(e,t,n){let r=Pn(e.fields),i=Tn(r),o=ha(e.objectType,r),a=Ia(r.get("groups")?.[0]),l=Je(r.get("epoch")?.[0]),s=Je(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?K(z(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?ya(r.get("resonance")[0]):void 0,d=ba(r),m=r.get("derive")?.map($=>wa($)),h=r.get("validate")?.map($=>({rule:z($)})),b=r.has("locked")?[...new Set(r.get("locked").flatMap($=>$.values))]:void 0,g=r.get("tolerance")?.map($=>va($)),w=ga(e.typedBlockEntries),M=Dn(e.infoEntries,"info"),p={type:e.objectType,id:e.id,properties:o,placement:i,info:M};return a.length>0&&(p.groups=a),l&&(p.epoch=l),s&&(p.referencePlane=s),c!==void 0&&(p.tidalLock=c),u&&(p.resonance=u),d&&(p.renderHints=d),m?.length&&(p.deriveRules=m),h?.length&&(p.validationRules=h),b?.length&&(p.lockedFields=b),g?.length&&(p.tolerances=g),w&&Object.keys(w).length>0&&(p.typedBlocks=w),et(t,"2.1")&&(p.groups||p.epoch||p.referencePlane||p.tidalLock!==void 0||p.resonance||p.renderHints||p.deriveRules?.length||p.validationRules?.length||p.lockedFields?.length||p.tolerances?.length||p.typedBlocks)&&E(t,n,e.id,e.location),p}function pa(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>ma(n))}}function ma(e){let t=Pn(e.fields,"event-pose"),n=Tn(t);return{objectId:e.objectId,placement:n,inner:J(t.get("inner")?.[0],"inner"),outer:J(t.get("outer")?.[0],"outer"),epoch:Je(t.get("epoch")?.[0]),referencePlane:Je(t.get("referencePlane")?.[0])}}function Pn(e,t="object"){let n=new Map;for(let r of e){let i=Me(r.key);if(!i&&!kn.has(r.key))throw f.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw f.fromLocation(`Duplicate field "${r.key}"`,r.location);let o=n.get(r.key)??[];o.push(r),n.set(r.key,o)}return n}function Tn(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],i=e.get("free")?.[0];if([t,n,r,i].filter(Boolean).length>1){let a=t??n??r??i;throw f.fromLocation("Object has multiple placement modes",a?.location)}if(t)return{mode:"orbit",target:z(t),distance:J(e.get("distance")?.[0],"distance"),semiMajor:J(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:xa(e.get("eccentricity")?.[0],"eccentricity"),period:J(e.get("period")?.[0],"period"),angle:J(e.get("angle")?.[0],"angle"),inclination:J(e.get("inclination")?.[0],"inclination"),phase:J(e.get("phase")?.[0],"phase")};if(n){let a=z(n);return{mode:"at",target:a,reference:vn(a,n.location)}}if(r)return{mode:"surface",target:z(r)};if(i){let a=z(i),l=wt(a);return{mode:"free",distance:l??void 0,descriptor:l?void 0:a}}return null}function ha(e,t){let n={};for(let[r,i]of t.entries()){let o=i[0],a=Me(r);!o||!a?.legacySchema||a.legacySchema.placement||(vt(r,e,o.location),n[r]=In(r,o.values,o.location))}return n}function Dn(e,t){let n={};for(let r of e){if(r.key in n)throw f.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function ga(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Dn(r,n))}return t}function ba(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=K(z(n),"renderLabel",n.location)),r&&(t.renderOrbit=K(z(r),"renderOrbit",r.location)),i&&(t.renderPriority=He(z(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function ya(e){if(e.values.length!==2)throw f.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw f.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function wa(e){if(e.values.length!==2)throw f.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function va(e){if(e.values.length!==2)throw f.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=wt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function Ia(e){return e?[...new Set(e.values)]:[]}function Je(e){return e&&e.values.join(" ").trim()||null}function J(e,t){return e?yt(z(e),e.location,t):void 0}function xa(e,t){return e?He(z(e),t,e.location):void 0}function z(e){return Se(e.values,e.key,e.location)}function Me(e){return Qe.get(e)}function Fn(e,t){for(let n of e){let r=Me(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){vt(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw f.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function E(e,t,n,r){et(e,"2.1")&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function re(e,t,n,r){et(e,"2.5")&&t.push({code:"parse.schema25.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.5; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function et(e,t){return Sn(e)<Sn(t)}function Sn(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3;case"2.6":return 4;default:return 5}}function $a(e){let t=[...e],n=[],r=!1,i=!1,o=null,a=1,l=1;for(let s=0;s<t.length;s++){let c=t[s],u=t[s+1];if(i){if(c==="*"&&u==="/"){t[s]=" ",t[s+1]=" ",i=!1,o=null,s++,l+=2;continue}c!==`
|
|
1
|
+
"use strict";var WorldOrbitMarkdown=(()=>{var lt=Object.defineProperty;var lr=Object.getOwnPropertyDescriptor;var cr=Object.getOwnPropertyNames;var ur=Object.prototype.hasOwnProperty;var dr=(e,t)=>{for(var n in t)lt(e,n,{get:t[n],enumerable:!0})},fr=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of cr(t))!ur.call(e,i)&&i!==n&<(e,i,{get:()=>t[i],enumerable:!(r=lr(t,i))||r.enumerable});return e};var pr=e=>fr(lt({},"__esModule",{value:!0}),e);var $s={};dr($s,{rehypeWorldOrbit:()=>er,remarkWorldOrbit:()=>Jn,renderWorldOrbitBlock:()=>fe,renderWorldOrbitError:()=>Vt});var f=class e extends Error{line;column;constructor(t,n,r){let i=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var pe=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],F=pe.filter(e=>e!=="system"),mr=["star","planet","moon","asteroid","comet","structure","phenomenon"],Bt=["structure","phenomenon"],H=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],hr=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function I(e,t){return{key:e,...t}}var De=new Set(pe),_t=new Map([I("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:H}),I("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"distance"}),I("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"distance"}),I("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:H}),I("period",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"duration"}),I("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"angle"}),I("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"angle"}),I("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"angle"}),I("at",{kind:"string",placement:!0,arity:"single",objectTypes:Bt}),I("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Bt}),I("free",{kind:"string",placement:!0,arity:"single",objectTypes:hr}),I("kind",{kind:"string",placement:!1,arity:"single",objectTypes:F}),I("class",{kind:"string",placement:!1,arity:"single",objectTypes:F}),I("culture",{kind:"string",placement:!1,arity:"single",objectTypes:F}),I("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:pe}),I("color",{kind:"string",placement:!1,arity:"single",objectTypes:pe}),I("image",{kind:"string",placement:!1,arity:"single",objectTypes:mr}),I("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:pe}),I("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"radius"}),I("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"mass"}),I("density",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),I("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),I("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),I("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:F}),I("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),I("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),I("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),I("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("on",{kind:"string",placement:!1,arity:"single",objectTypes:F}),I("source",{kind:"string",placement:!1,arity:"single",objectTypes:F}),I("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"duration"})].map(e=>[e.key,e])),gr=new Set(_t.keys());function D(e){return _t.get(e)}function Nt(e){return gr.has(e)}function Ut(e,t){return e.objectTypes.includes(t)}function Ee(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function me(e,t={}){let n=[],r=t.columnOffset??0,i="",o=null,a=!1,l=!1,s=null,c=()=>{o!==null&&(n.push({value:i,column:o,quoted:a}),i="",o=null,a=!1)};for(let u=0;u<e.length;u++){let d=e[u],m=r+u+1;if(l&&d==="\\"){let h=e[u+1];if(h==='"'||h==="\\"){i+=h,u++;continue}}if(d==='"'){l?l=!1:(o===null&&(o=m),a=!0,s=m,l=!0);continue}if(!l&&/\s/.test(d)){c();continue}o===null&&(o=m),i+=d}if(l)throw new f("Unclosed quote in line",t.line,s??r+e.length);return c(),n}function Fe(e){return e.match(/^\s*/)?.[0].length??0}function he(e){let t=e.split(/\r?\n/),n=[],r=null,i=null,o=!1,a=!1,l=null,s=null,c=null,u=null;for(let d=0;d<t.length;d++){let m=t[d],h=d+1;if(!m.trim())continue;let b=Fe(m),g=me(m.slice(b),{line:h,columnOffset:b});if(g.length!==0){if(b===0){if(o=!1,a=!1,l=null,s=null,c=null,u=null,g.length>=1&&g[0].value==="theme"){a=!0,s=0,r={type:"theme",preset:g.length>=2?g[1].value:null,blocks:[],location:{line:h,column:g[0].column}};continue}let w=br(g,h);n.push(w),i=w;continue}if(a){if(g.length>=2&&g[0].value==="preset"&&(!c||b<=c)){r&&(r.preset=g[1].value);continue}u&&c!==null&&b>c?u.fields.push(vr(g,h)):(c=b,u={type:"theme-block",target:g[0].value,fields:[],location:{line:h,column:g[0].column}},r?.blocks.push(u));continue}if(!i)throw new f("Indented line without parent object",h,b+1);if(g.length===1&&g[0].value==="info"){o=!0,l=b;continue}o&&b<=(l??0)&&(o=!1),o?i.infoEntries.push(Ir(g,h)):i.blockFields.push(wr(g,h))}}return{type:"document",theme:r,objects:n}}function br(e,t){if(e.length<2)throw new f("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!De.has(n.value))throw new f(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:yr(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function yr(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],o=D(i.value);if(!o)throw new f(`Unknown field "${i.value}"`,t,i.column);r++;let a=[];if(o.arity==="multiple")for(;r<e.length&&!Nt(e[r].value);)a.push(e[r]),r++;else{let l=e[r];l&&(a.push(l),r++)}if(a.length===0)throw new f(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:a.map(l=>l.value),location:{line:t,column:i.column}})}return n}function wr(e,t){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);if(!D(e[0].value))throw new f(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function vr(e,t){if(e.length<2)throw new f("Invalid theme field line",t,e[0]?.column??1);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function Ir(e,t){if(e.length<2)throw new f("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var Wt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,xr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),$r=/^[A-Za-z][A-Za-z0-9+.-]*:/;function ge(e){let t=null,n=[],r=e.theme?Sr(e.theme):null;for(let i of e.objects){let o=kr(i);if(i.objectType==="system"){if(t)throw f.fromLocation("Only one system object is allowed",i.location);t=o}else n.push(o)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",theme:r,system:t,groups:[],relations:[],events:[],objects:n}}function Sr(e){let t={};for(let n of e.blocks){let r=Yt(n.fields);t[n.target]=jr(r)}return{preset:e.preset,styles:t}}function jr(e){let t={};for(let[n,r]of e.entries()){if(r.values.length===1){let i=r.values[0];if(i==="true"){t[n]=!0;continue}if(i==="false"){t[n]=!1;continue}let o=Number(i);if(!Number.isNaN(o)&&i.trim()!==""){t[n]=o;continue}}t[n]=r.values.join(" ")}return t}function kr(e){let t=[...e.inlineFields,...e.blockFields];Mr(e.objectType,t);let n=Yt(t),r=Or(e.objectType,n),i=Ar(n),o=Tr(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:o}:{type:e.objectType,id:e.name,properties:i,placement:r,info:o}}function Mr(e,t){for(let n of t){let r=D(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Ut(r,e))throw f.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw f.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Yt(e){let t=new Map;for(let n of e){if(t.has(n.key))throw f.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function Or(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),o=t.has("free"),a=[n,r,i,o].filter(Boolean).length;if(a>1){let l=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw f.fromLocation("Object has multiple placement modes",l?.location)}if(e==="system"&&a>0)throw f.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Ce(t,"orbit"),distance:se(t,"distance"),semiMajor:se(t,"semiMajor"),eccentricity:Fr(t,"eccentricity"),period:se(t,"period"),angle:se(t,"angle"),inclination:se(t,"inclination"),phase:se(t,"phase")};if(r){let l=Ve(t,"at"),s=Ce(t,"at");return{mode:"at",target:s,reference:Dr(s,l.location)}}if(i)return{mode:"surface",target:Ce(t,"surface")};if(o){let l=Ce(t,"free"),s=Er(l);return{mode:"free",distance:s??void 0,descriptor:s?void 0:l}}return null}function Ar(e){let t={};for(let[n,r]of e.entries()){let i=D(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=Cr(r);break;case"number":t[n]=qt(le(r),n,r.location);break;case"unit":t[n]=Gt(le(r),r.location,n);break;case"string":t[n]=Lr(n,r);break}}return t}function Lr(e,t){let n=t.values.join(" ").trim();return e==="image"&&Pr(n,t.location),n}function Pr(e,t){if(!e)throw f.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw f.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match($r);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw f.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Tr(e){let t={};for(let n of e){if(n.key in t)throw f.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function Dr(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function Gt(e,t,n){let r=e.match(Wt);if(!r)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=D(n);if(o?.unitFamily&&!Ee(o.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Er(e){let t=e.match(Wt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function se(e,t){if(!e.has(t))return;let n=Ve(e,t);return Gt(le(n),n.location,t)}function Fr(e,t){if(!e.has(t))return;let n=Ve(e,t);return qt(le(n),t,n.location)}function qt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Cr(e){let t=le(e).toLowerCase(),n=xr.get(t);if(n===void 0)throw f.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Ve(e,t){let n=e.get(t);if(!n)throw new f(`Missing value for key "${t}"`);return n}function Ce(e,t){return le(Ve(e,t))}function le(e){if(e.values.length!==1)throw f.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Vr=new Set(["star","planet","moon","asteroid","comet"]);function be(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new f(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new f(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!Vr.has(i.type))throw new f(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Rr(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&zr(r,r.placement.reference,t))}}function Rr(e,t,n){if(!n.has(t.primary))throw new f(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new f(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function zr(e,t,n){if(!n.has(t.objectId))throw new f(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function re(e,t,n=`${t}.failed`){return e instanceof f?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}var ye=1495978707e-1,Br=6371,_r=71492,Nr=695700,Ur=63241.077,Wr=206264.806,Yr=206264806,en=.68,Gr=.2,tn=28;function z(e,t={}){let n=Hr(t),r=n.width,i=n.height,o=n.padding,a=Xr(e),l=Zr(e,t.projection),s=pt(t.camera??null),c=ft(l,s),u=ni(a),d=ei(a,t.scaleModel,t.bodyScaleMode),m=e.system?.id??null,h=t.activeEventId??null,b=qr(e.objects,e.events??[],h),g=ri(b,r,i,o,u,d),w=new Map(b.map(y=>[y.id,y])),M=Bi(b,w),p=new Map,$=[],P=[],_=[],T=[],N=[],G=new Map,te=new Map;for(let y of b){let E=y.placement;if(!E){_.push(y);continue}if(E.mode==="orbit"){Zt(te,E.target,y);continue}if(E.mode==="surface"){Zt(G,E.target,y);continue}if(E.mode==="at"){N.push(y);continue}T.push(y)}let A=T.length>0?r*.42:r/2,ae=i/2,V={orbitChildren:te,surfaceChildren:G,objectMap:w,spacingFactor:u,projection:c,scaleModel:d,sceneMetricScale:g},U=_.find(y=>y.type==="star")??_[0]??null;U&&ut(U,A,ae,0,p,$,P,V);let q=_.filter(y=>y.id!==U?.id);if(q.length>0){let y=Math.min(r,i)*.28*u*d.orbitDistanceMultiplier;q.forEach((E,k)=>{let st=$e(k,q.length,-Math.PI/2),ne=Se(st,y,c,1);ut(E,A+ne.x,ae+ne.y,0,p,$,P,V)})}T.forEach((y,E)=>{let k=r-o-140-Gi(y.placement?.mode==="free"?y.placement.distance:void 0,d,g),st=Math.max(76,(i-o*2-180)/Math.max(1,T.length)*u)*d.freePlacementMultiplier,ne=o+92+E*st;p.set(y.id,{object:y,x:k,y:ne,radius:Ne(y,0,d,g),sortKey:We(k,ne,0)}),P.push({object:y,groupId:M.groupIds.get(y.id)??null,x1:k-60,y1:ne,x2:k-18,y2:ne,mode:"free"}),Be(y,p,$,P,V,1)}),N.forEach((y,E)=>{if(p.has(y.id)||!y.placement||y.placement.mode!=="at")return;let k=Ri(y.placement.reference,p,w,E,N.length,r,i,o,V);p.set(y.id,{object:y,x:k.x,y:k.y,radius:Ne(y,2,d,g),sortKey:We(k.x,k.y,2),anchorX:k.anchorX,anchorY:k.anchorY}),k.anchorX!==void 0&&k.anchorY!==void 0&&P.push({object:y,groupId:M.groupIds.get(y.id)??null,x1:k.anchorX,y1:k.anchorY,x2:k.x,y2:k.y,mode:"at"}),Be(y,p,$,P,V,2)});let X=[...p.values()].map(y=>ii(y,d,M)),Le=$.map(y=>oi(y,M.groupIds.get(y.object.id)??null)),Pe=P.map(y=>ai(y)),Te=si(X,r,i,d.labelMultiplier),Rt=hi(e,X),zt=gi(e.events??[],X,h),rr=fi(Le,Rt,zt,Pe,X,Te),ir=pi(X,Le,Pe,Te,M,d.labelMultiplier),or=mi(e,X),ar=bi(e,l,n.preset,M,w),sr=Ai(r,i,X,Le,Pe,Te,d.labelMultiplier);return{width:r,height:i,padding:o,renderPreset:n.preset,projection:l,renderProjection:c,camera:s,scaleModel:d,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:Qr(l,c,a,s),systemId:m,viewMode:l,layoutPreset:a,metadata:{format:e.format,version:e.version,view:l,renderProjection:c,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom","body.scaleMode":d.bodyScaleMode,...s?.azimuth!==null?{"camera.azimuth":String(s?.azimuth)}:{},...s?.elevation!==null?{"camera.elevation":String(s?.elevation)}:{},...s?.roll!==null?{"camera.roll":String(s?.roll)}:{},...s?.distance!==null?{"camera.distance":String(s?.distance)}:{}},contentBounds:sr,layers:rr,groups:ir,semanticGroups:or,viewpoints:ar,events:zt,activeEventId:h,objects:X,orbitVisuals:Le,relations:Rt,leaders:Pe,labels:Te}}function qr(e,t,n){let r=e.map(l=>structuredClone(l));if(!n)return r;let i=t.find(l=>l.id===n);if(!i)return r;let o=new Map(r.map(l=>[l.id,l])),a=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(l=>l.objectId)]);for(let l of a){let s=o.get(l);s&&(i.epoch&&(s.epoch=i.epoch),i.referencePlane&&(s.referencePlane=i.referencePlane))}for(let l of i.positions){let s=o.get(l.objectId);s&&(l.placement&&(s.placement=structuredClone(l.placement)),l.inner&&(s.properties.inner={...l.inner}),l.outer&&(s.properties.outer={...l.outer}),l.epoch&&(s.epoch=l.epoch),l.referencePlane&&(s.referencePlane=l.referencePlane))}return r}function Xr(e){switch(String(e.system?.properties.scale??"balanced").toLowerCase()){case"compressed":case"compact":return"compact";case"expanded":case"presentation":return"presentation";default:return"balanced"}}function Hr(e){let t=Kr(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Kr(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function Zr(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return on(n)??"topdown"}function ft(e,t){switch(e){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return t&&(t.azimuth!==null||t.elevation!==null||t.roll!==null)?"isometric":"topdown";case"perspective":return"isometric"}}function pt(e){if(!e)return null;let t={azimuth:ct(e.azimuth),elevation:ct(e.elevation),roll:ct(e.roll),distance:Jr(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function ct(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Jr(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function Qr(e,t,n,r){let i=[`${Jt(e)} view`,`${Jt(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let o=[r.azimuth!==null?`az ${r.azimuth}`:null,r.elevation!==null?`el ${r.elevation}`:null,r.roll!==null?`roll ${r.roll}`:null,r.distance!==null?`dist ${r.distance}`:null].filter(Boolean);o.length>0&&i.push(`camera ${o.join(" / ")}`)}return i.join(" - ")}function ei(e,t,n){return{...ti(e),...n?{bodyScaleMode:n}:{},...t}}function ti(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36,bodyScaleMode:"readable"};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48,bodyScaleMode:"readable"};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40,bodyScaleMode:"readable"}}}function ni(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function ri(e,t,n,r,i,o){let a=[],l=[];for(let h of e){let b=Xi(h);b!==null&&b>0&&l.push(b);let g=h.placement;if(g){if(g.mode==="orbit"){let w=K(g.semiMajor??g.distance??null);w!==null&&w>0&&a.push(w);continue}if(g.mode==="free"){let w=K(g.distance??null);w!==null&&w>0&&a.push(w)}}}let s=Math.max(...a,0),c=Math.max(...l,0),u=Math.max(s,c*6,0),d=u+Math.max(Math.sqrt(u),c*2,s>0?.25:0);return d<=0?{pixelsPerMetric:null,hasExplicitScale:!1}:{pixelsPerMetric:Math.max(Math.min(t,n)/2-r-24,120)*i*o.orbitDistanceMultiplier/d,hasExplicitScale:!0}}function ii(e,t,n){let{object:r,x:i,y:o,radius:a,sortKey:l,anchorX:s,anchorY:c}=e,u=r.renderHints?.renderPriority??0;return{renderId:ce(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:o,radius:a,visualRadius:Yi(r,a,t),sortKey:l+u*.001,anchorX:s,anchorY:c,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Hi(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function oi(e,t){return{renderId:`${ce(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function ai(e){return{renderId:`${ce(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function si(e,t,n,r){let i=[],o=[],a=new Map(e.map(s=>[s.objectId,s])),l=[...e].filter(s=>!s.hidden&&s.object.renderHints?.renderLabel!==!1).sort(li);for(let s of l){let c=ci(s,a,o,t,n,r)??rn(s,nn(s,a.get(s.parentId??"")??null,n),0,r);o.push(un(s,c,r)),i.push({renderId:`${s.renderId}-label`,objectId:s.objectId,object:s.object,groupId:s.groupId,semanticGroupIds:[...s.semanticGroupIds],label:s.label,secondaryLabel:s.secondaryLabel,x:c.x,y:c.labelY,secondaryY:c.secondaryY,textAnchor:c.textAnchor,direction:c.direction,hidden:s.hidden})}return i}function li(e,t){let n=Xt(e)-Xt(t);if(n!==0)return n;let r=(t.object.renderHints?.renderPriority??0)-(e.object.renderHints?.renderPriority??0);return r!==0?r:e.sortKey-t.sortKey}function Xt(e){switch(e.object.type){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":case"ring":return 3;case"asteroid":case"comet":return 4;case"structure":case"phenomenon":return 5}}function ci(e,t,n,r,i,o){for(let a of ui(e,t,r,i)){let l=a==="left"||a==="right"?4:6;for(let s=0;s<=l;s+=1){let c=rn(e,a,s,o),u=un(e,c,o);if(!n.some(d=>Ui(d,u)))return c}}return null}function ui(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,o=nn(e,i,r),a=o==="below"?"above":"below",l=di(e,i,n),s=l==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[l,o,s,a]:[o,l,a,s]}function nn(e,t,n){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>n*.62?"above":"below"}function di(e,t,n){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=n/2?"right":"left"}function rn(e,t,n,r){let i=14*r;switch(t){case"above":{let o=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:o,secondaryY:o-16*r,textAnchor:"middle",direction:t}}case"below":{let o=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:o,secondaryY:o+16*r,textAnchor:"middle",direction:t}}case"left":{let o=e.x-(e.visualRadius+16*r+n*i),a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"end",direction:t}}case"right":{let o=e.x+e.visualRadius+16*r+n*i,a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"start",direction:t}}}}function fi(e,t,n,r,i,o){let a=e.filter(s=>!s.hidden&&!!s.backArcPath).map(s=>s.renderId),l=e.filter(s=>!s.hidden).map(s=>s.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"orbits-back",renderIds:a},{id:"orbits-front",renderIds:l},{id:"relations",renderIds:t.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"events",renderIds:n.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"objects",renderIds:i.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"labels",renderIds:o.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function pi(e,t,n,r,i,o){let a=new Map,l=s=>{if(!s)return null;let c=a.get(s);if(c)return c;let u=i.groupRoots.get(s)??null,d={renderId:s,rootObjectId:u,label:u??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:xe(0,0,0,0)};return a.set(s,d),d};for(let s of e){let c=l(s.groupId);c&&!s.hidden&&c.objectIds.push(s.objectId)}for(let s of t){let c=l(s.groupId);c&&!s.hidden&&c.orbitIds.push(s.objectId)}for(let s of n){let c=l(s.groupId);c&&!s.hidden&&c.leaderIds.push(s.objectId)}for(let s of r){let c=l(s.groupId);c&&!s.hidden&&c.labelIds.push(s.objectId)}for(let s of a.values())s.contentBounds=_i(s,e,t,n,r,o);return[...a.values()].sort((s,c)=>s.label.localeCompare(c.label))}function mi(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function hi(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),o=n.get(r.to);return{renderId:`${ce(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:o?.x??0,y2:o?.y??0,hidden:r.hidden||!i||!o||i.hidden||o.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function gi(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let o=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],a=o.map(c=>r.get(c)).filter(Boolean),l=a.length>0?a.reduce((c,u)=>c+u.x,0)/a.length:0,s=a.length>0?a.reduce((c,u)=>c+u.y,0)/a.length:0;return{renderId:`${ce(i.id)}-event`,eventId:i.id,event:i,objectIds:o,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:l,y:s,hidden:i.hidden||a.length===0||a.every(c=>c.hidden)||n!==null&&i.id!==n}}).sort((i,o)=>i.event.id.localeCompare(o.event.id))}function bi(e,t,n,r,i){let o=yi(e,t,n),a=new Map;for(let[c,u]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[d,m,...h]=c.split(".");if(d!=="viewpoint"||!m||h.length===0)continue;let b=ki(m);if(!b)continue;let g=h.join(".").toLowerCase(),w=a.get(b)??{id:b};wi(w,g,u,e,t,n,r,i),a.set(b,w)}let l=[...a.values()].map(c=>vi(c,t,n,i)).filter(Boolean),s=l.findIndex(c=>c.id===o.id);return s>=0?l.splice(s,1,{...o,...l[s],layers:{...o.layers,...l[s].layers},filter:l[s].filter??o.filter,generated:!1}):l.unshift(o),l.sort((c,u)=>c.id==="overview"?-1:u.id==="overview"?1:c.label.localeCompare(u.label))}function yi(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",o=pt(null),a=ft(t,o);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:a,camera:o,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function wi(e,t,n,r,i,o,a,l){let s=n.trim();switch(t){case"label":case"title":s&&(e.label=s);return;case"summary":case"description":s&&(e.summary=s);return;case"focus":case"object":s&&(e.focus=s);return;case"select":case"selection":s&&(e.select=s);return;case"events":e.eventIds=Ie(s);return;case"projection":case"view":e.projection=on(s)??i;return;case"preset":e.preset=xi(s)??o;return;case"rotation":case"angle":e.rotationDeg=we(s)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??ze(),azimuth:we(s)};return;case"camera.elevation":e.camera={...e.camera??ze(),elevation:we(s)};return;case"camera.roll":e.camera={...e.camera??ze(),roll:we(s)};return;case"camera.distance":e.camera={...e.camera??ze(),distance:Ht(s)};return;case"zoom":case"scale":e.scale=Ht(s);return;case"layers":e.layers=$i(s);return;case"query":e.filter={...e.filter??Re(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??Re(),objectTypes:Si(s)};return;case"tags":e.filter={...e.filter??Re(),tags:Ie(s)};return;case"groups":e.filter={...e.filter??Re(),groupIds:ji(s,r,a,l)};return}}function vi(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,o=e.select&&r.has(e.select)?e.select:i,a=Ii(e.filter),l=e.label?.trim()||Mi(e.id),s=e.projection??t,c=pt(e.camera??null),u=ft(s,c);return{id:e.id,label:l,summary:e.summary?.trim()||Oi(l,i,a),objectId:i,selectedObjectId:o,eventIds:[...new Set(e.eventIds??[])],projection:s,renderProjection:u,camera:c,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function Re(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function ze(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Ii(e){if(!e)return null;let t={query:e.query?.trim()||null,objectTypes:[...new Set(e.objectTypes)],tags:[...new Set(e.tags)],groupIds:[...new Set(e.groupIds)]};return t.query||t.objectTypes.length>0||t.tags.length>0||t.groupIds.length>0?t:null}function on(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function xi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function we(e){let t=Number(e);return Number.isFinite(t)?t:null}function Ht(e){let t=we(e);return t!==null&&t>0?t:null}function $i(e){let t={};for(let n of Ie(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="events"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function Si(e){return Ie(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function ji(e,t,n,r){return Ie(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.schemaVersion==="2.6"||t.groups.some(o=>o.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??ve(i):(r.has(i),ve(i)))}function Ie(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function ki(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Mi(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Oi(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function Ai(e,t,n,r,i,o,a){let l=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,d=(m,h)=>{l=Math.min(l,m),s=Math.min(s,h),c=Math.max(c,m),u=Math.max(u,h)};for(let m of r)m.hidden||an(m,d);for(let m of i)m.hidden||(d(m.x1,m.y1),d(m.x2,m.y2));for(let m of n)m.hidden||sn(m,d);for(let m of o)m.hidden||ln(m,d,a);return!Number.isFinite(l)||!Number.isFinite(s)?xe(0,0,e,t):xe(l,s,c,u)}function an(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,o=fn(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,tn*2);for(let a of o)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function xe(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function sn(e,t){t(e.x-e.visualRadius-24,e.y-e.visualRadius-16),t(e.x+e.visualRadius+24,e.y+e.visualRadius+36)}function ln(e,t,n){let r=dn(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,n);t(r.left,r.top),t(r.right,r.bottom)}function ut(e,t,n,r,i,o,a,l){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Ne(e,r,l.scaleModel,l.sceneMetricScale),sortKey:We(t,n,r)}),Be(e,i,o,a,l,r+1))}function Be(e,t,n,r,i,o){let a=t.get(e.id);if(!a)return;let l=[...i.orbitChildren.get(e.id)??[]].sort(Li),s=Pi(l,a.radius,i.spacingFactor,i.scaleModel,i.sceneMetricScale),c=Ei(l,s);l.forEach((d,m)=>{let h=Ti(d,m,l.length,a,s,c[m]??s.innerPx,i);n.push({object:d,parentId:e.id,kind:h.kind,cx:h.cx,cy:h.cy,radius:h.radius,rx:h.rx,ry:h.ry,rotationDeg:h.rotationDeg,band:h.band,bandThickness:h.bandThickness,frontArcPath:h.frontArcPath,backArcPath:h.backArcPath}),ut(d,h.objectX,h.objectY,o,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((d,m)=>{let h=$e(m,u.length,-Math.PI/3),b=28*i.spacingFactor,g=Se(h,a.radius,i.projection,i.projection==="isometric"?.9:1),w=Se(h,a.radius+b,i.projection,i.projection==="isometric"?.9:1),M=a.x+g.x,p=a.y+g.y,$=a.x+w.x,P=a.y+w.y;t.set(d.id,{object:d,x:$,y:P,radius:Ne(d,o+1,i.scaleModel,i.sceneMetricScale),sortKey:We($,P,o+1),anchorX:M,anchorY:p}),r.push({object:d,groupId:i.objectMap.has(d.id)?ve(Ni(d,i.objectMap)):null,x1:M,y1:p,x2:$,y2:P,mode:"surface"}),Be(d,t,n,r,i,o+1)})}function Li(e,t){let n=_e(e),r=_e(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function Pi(e,t,n,r,i){let o=e.map(h=>_e(h)),a=o.filter(h=>h!==null),l=r.bodyScaleMode==="strict"?Math.max(2,8*n*r.orbitDistanceMultiplier):(e.length>2?54:64)*n*r.orbitDistanceMultiplier*.42,s=t+Math.max(l*1.2,24*n),c=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(a.length===0)return{metrics:o,minMetric:0,maxMetric:0,metricSpread:0,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:l,pixelsPerMetric:i.pixelsPerMetric};let u=Math.min(...a),d=Math.max(...a),m=d-u;return{metrics:o,minMetric:u,maxMetric:d,metricSpread:m,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:l,pixelsPerMetric:i.pixelsPerMetric}}function Ti(e,t,n,r,i,o,a){let l=e.placement,s=e.type==="belt"||e.type==="ring";if(!l||l.mode!=="orbit"){let G=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:G,rotationDeg:0,band:s,bandThickness:s?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-G}}let c=j(typeof l.eccentricity=="number"?l.eccentricity:0,0,.92),u=o,d=Math.max(u*Math.sqrt(1-c*c),u*.18),m=dt(l.inclination)??0,h=a.projection==="isometric"?Math.max(Gr,Math.cos(mt(m)))*en:1,b=Math.max(d*h,u*.14),g=dt(l.angle)??0,w=u*c,M=mn(-w,0,g),p=r.x+M.x,$=r.y+M.y,P=Ci(l.phase,t,n),_=pn(p,$,u,b,g,P),T=a.projection==="topdown"&&c<=1e-4&&Math.abs(g)<=1e-4,N=s?Vi(e,u,i,a.scaleModel):void 0;return{kind:T?"circle":"ellipse",cx:T?r.x:p,cy:T?r.y:$,radius:T?u:void 0,rx:T?void 0:u,ry:T?void 0:b,rotationDeg:g,band:s,bandThickness:N,frontArcPath:a.projection==="isometric"||s?Kt(p,$,u,b,g,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||s?Kt(p,$,u,b,g,Math.PI,Math.PI*2):void 0,objectX:_.x,objectY:_.y}}function Di(e,t){return t.pixelsPerMetric!==null?e*t.pixelsPerMetric:t.innerPx+t.stepPx*Fi(Math.max(e,0)+1)}function Ei(e,t){let n=[];return e.forEach((r,i)=>{let o=_e(r),a=t.innerPx+i*t.stepPx,l=o===null?a:Di(o,t),s=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(l,s))}),n}function _e(e){return!e.placement||e.placement.mode!=="orbit"?null:K(e.placement.semiMajor??e.placement.distance??null)}function Fi(e){return Math.log(e)/Math.log(2)}function Ci(e,t,n){let r=e?dt(e):null;return r!==null?mt(r-90):$e(t,n,-Math.PI/2)}function Vi(e,t,n,r){let i=K(Ue(e.properties.inner)),o=K(Ue(e.properties.outer));if(i!==null&&o!==null){let l=Math.abs(o-i);if(n.pixelsPerMetric!==null){let c=l*n.pixelsPerMetric;return r.bodyScaleMode==="strict"?Math.max(c*r.ringThicknessMultiplier,1):j(Math.max(c*r.ringThicknessMultiplier,8),8,54)}if(n.metricSpread>0)return j(l/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(i,o),1e-4);return j(l/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Ri(e,t,n,r,i,o,a,l,s){if(e.kind==="lagrange")return zi(e,t,n,o,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=$e(r,i,Math.PI/5),d=(c.radius+36)*s.scaleModel.labelMultiplier,m=Se(u,d,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}if(e.kind==="named"){let c=t.get(e.name);if(c){let u=$e(r,i,Math.PI/6),d=(c.radius+36)*s.scaleModel.labelMultiplier,m=Se(u,d,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+m.x,y:c.y+m.y,anchorX:c.x,anchorY:c.y}}}return{x:o-l-170,y:a-l-86-r*58*s.scaleModel.freePlacementMultiplier}}function zi(e,t,n,r,i){let o=e.secondary?t.get(e.primary):Wi(e.primary,t,n),a=t.get(e.secondary??e.primary);if(!o||!a)return{x:r*.7,y:i*.25};let l=a.x-o.x,s=a.y-o.y,c=Math.hypot(l,s)||1,u=l/c,d=s/c,m=-d,h=u,b=j(c*.25,24,68);switch(e.point){case"L1":return{x:a.x-u*b,y:a.y-d*b,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+u*b,y:a.y+d*b,anchorX:a.x,anchorY:a.y};case"L3":return{x:o.x-u*b,y:o.y-d*b,anchorX:o.x,anchorY:o.y};case"L4":return{x:a.x+(u*.5-m*.8660254)*b,y:a.y+(d*.5-h*.8660254)*b,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+m*.8660254)*b,y:a.y+(d*.5+h*.8660254)*b,anchorX:a.x,anchorY:a.y}}}function Bi(e,t){let n=new Map,r=new Map;for(let c of e){let u=cn(c,t);if(n.set(c.id,u),u){let d=r.get(u);d?d.push(c.id):r.set(u,[c.id])}r.has(c.id)||r.set(c.id,[])}let i=new Map,o=new Map,a=new Map,l=c=>{let u=i.get(c);if(u)return u;let d=new Set,m=[],h=n.get(c)??null;for(;h&&!d.has(h);)m.push(h),d.add(h),h=n.get(h)??null;return i.set(c,m),m},s=c=>{let u=a.get(o.get(c)??"");if(u)return u;let d=n.get(c)??null,m=t.get(c),h=c;return m?.placement&&m.placement.mode!=="free"&&d&&(h=s(d)),h};for(let c of e){l(c.id);let u=s(c.id),d=ve(u);o.set(c.id,d),a.set(d,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:o,groupRoots:a}}function cn(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function _i(e,t,n,r,i,o){let a=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=(d,m)=>{a=Math.min(a,d),l=Math.min(l,m),s=Math.max(s,d),c=Math.max(c,m)};for(let d of t)!d.hidden&&e.objectIds.includes(d.objectId)&&sn(d,u);for(let d of n)!d.hidden&&e.orbitIds.includes(d.objectId)&&an(d,u);for(let d of r)!d.hidden&&e.leaderIds.includes(d.objectId)&&(u(d.x1,d.y1),u(d.x2,d.y2));for(let d of i)!d.hidden&&e.labelIds.includes(d.objectId)&&ln(d,u,o);return!Number.isFinite(a)||!Number.isFinite(l)?xe(0,0,0,0):xe(a,l,s,c)}function Ni(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let i=cn(n,t);if(!i)break;let o=t.get(i);if(!o)break;n=o}return n.id}function un(e,t,n){return dn(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function dn(e,t,n,r,i,o,a,l){let s=Ki(o,a,l),c=s*2,u=i==="above"?18:12,d=i==="above"?8:12,m=e-s,h=e+s;return r==="start"?(m=e,h=e+c):r==="end"&&(m=e-c,h=e),{left:m,right:h,top:Math.min(t,n)-u,bottom:Math.max(t,n)+d}}function Ui(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Wi(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Ne(e,t,n,r){let i=qi(e.properties.radius,n,r);if(i!==null)return i;let o=n.bodyRadiusMultiplier;switch(e.type){case"star":return j((t===0?28:20)*o,n.minBodyRadius,n.maxBodyRadius);case"planet":return j(12*o,n.minBodyRadius,n.maxBodyRadius);case"moon":return j(7*o,n.minBodyRadius,n.maxBodyRadius);case"belt":return j(5*o,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return j(5*o,n.minBodyRadius,n.maxBodyRadius);case"comet":return j(6*o,n.minBodyRadius,n.maxBodyRadius);case"ring":return j(5*o,n.minBodyRadius,n.maxBodyRadius);case"structure":return j(6*o,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return j(8*o,n.minBodyRadius,n.maxBodyRadius)}}function Yi(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function K(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/ye;case"m":return e.value/1e3/ye;case"ly":return e.value*Ur;case"pc":return e.value*Wr;case"kpc":return e.value*Yr;case"re":return e.value*Br/ye;case"rj":return e.value*_r/ye;case"sol":return e.value*Nr/ye;default:return e.value}}function Gi(e,t,n){let r=K(e??null);if(r===null||r<=0)return 0;if(n.pixelsPerMetric!==null){let i=r*n.pixelsPerMetric*t.freePlacementMultiplier;return t.bodyScaleMode==="strict"?Math.max(i,0):j(i,0,420)}return j(r*96*t.freePlacementMultiplier,0,420)}function qi(e,t,n){let r=Ue(e);if(!r)return null;let i=K(r);if(n.pixelsPerMetric!==null&&i!==null&&i>0){let a=i*n.pixelsPerMetric*t.bodyRadiusMultiplier;return t.bodyScaleMode==="strict"?Math.max(a,.1):j(Math.max(a,t.minBodyRadius),t.minBodyRadius,t.maxBodyRadius)}let o;switch(r.unit){case"sol":o=j(r.value*22,14,40);break;case"re":o=j(r.value*10,6,18);break;case"km":o=j(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:o=j(r.value*4,4,20);break}return j(o*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function Xi(e){return K(Ue(e.properties.radius))}function Ue(e){return!e||typeof e!="object"||!("value"in e)?null:e}function dt(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function $e(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function Kt(e,t,n,r,i,o,a){let l=fn(e,t,n,r,i,o,a,tn);return l.length===0?"":l.map((s,c)=>`${c===0?"M":"L"} ${Qt(s.x)} ${Qt(s.y)}`).join(" ")}function fn(e,t,n,r,i,o,a,l){let s=[];for(let c=0;c<=l;c+=1){let u=o+(a-o)*c/l;s.push(pn(e,t,n,r,i,u))}return s}function pn(e,t,n,r,i,o){let a=n*Math.cos(o),l=r*Math.sin(o),s=mn(a,l,i);return{x:e+s.x,y:t+s.y}}function mn(e,t,n){let r=mt(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function Se(e,t,n,r){let i=n==="isometric"?en*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function We(e,t,n){return t*1e3+e+n*.01}function j(e,t,n){return Math.min(Math.max(e,t),n)}function Zt(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function ce(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function ve(e){return`${ce(e)}-group`}function Hi(e){return typeof e=="string"&&e.trim()?e:void 0}function Ki(e,t,n){let r=e.length*4.6*n+18,i=t.length*3.9*n+18;return Math.max(r,i,24)}function Jt(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function mt(e){return e*Math.PI/180}function Qt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var bn=86400,Ye=bn*365.25,Ge=18,hn=180;function He(e,t={}){let n={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,camera:t.camera,scaleModel:t.scaleModel,bodyScaleMode:t.bodyScaleMode,activeEventId:t.activeEventId},r=z(e,n),i=to(r.layoutPreset,t.spatialScaleModel),o={x:r.contentBounds.centerX,y:r.contentBounds.centerY},a=new Map(r.objects.map(g=>[g.objectId,g])),l=new Map(r.orbitVisuals.map(g=>[g.objectId,g])),s=new Map;for(let g of r.objects){let w=g.object.placement;!w||w.mode!=="orbit"||s.set(g.objectId,gt(w))}let c=Math.min(...[...s.values()].filter(g=>Number.isFinite(g)&&g>0))||1,u=new Map,d=r.objects.map(g=>Zi(g,r,o,a,l,i,u,c)),m=new Map(d.map(g=>[g.objectId,g])),h=r.orbitVisuals.map(g=>Ji(g,m,c,r.activeEventId!==null)),b=d.map(g=>({objectId:g.objectId,center:{...g.position},radius:g.visualRadius+i.focusPadding}));return{width:r.width,height:r.height,padding:r.padding,renderPreset:r.renderPreset,projection:r.projection,camera:r.camera,scaleModel:i,title:r.title,subtitle:r.subtitle,systemId:r.systemId,viewMode:"3d",layoutPreset:r.layoutPreset,metadata:{...r.metadata,"viewer.mode":"3d"},contentBounds:ro(d),semanticGroups:r.semanticGroups,viewpoints:r.viewpoints,activeEventId:r.activeEventId,timeFrozen:r.activeEventId!==null,objects:d,orbits:h,focusTargets:b}}function Zi(e,t,n,r,i,o,a,l){let s=qe(e,t,n,r,i,a),c=bt(e.object,i.get(e.objectId),l,t.activeEventId!==null);return{objectId:e.objectId,object:e.object,parentId:e.parentId,ancestorIds:e.ancestorIds.slice(),childIds:e.childIds.slice(),groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),position:s,radius:ue(e.radius*o.bodyRadiusMultiplier,o.minBodyRadius,o.maxBodyRadius),visualRadius:ue(e.visualRadius*o.bodyRadiusMultiplier,o.minBodyRadius,o.maxBodyRadius+24),label:e.label,secondaryLabel:e.secondaryLabel,fillColor:e.fillColor,imageHref:e.imageHref,hidden:e.hidden,motion:c}}function Ji(e,t,n,r){let i=t.get(e.objectId),o=t.get(e.parentId);return{objectId:e.objectId,object:e.object,parentId:e.parentId,groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),center:o?.position??{x:0,y:0,z:0},kind:e.kind,radius:e.radius,semiMajor:e.radius??e.rx??0,semiMinor:e.radius??e.ry??0,rotationDeg:e.rotationDeg,inclinationDeg:i?.motion?.inclinationDeg??Xe(e.object.placement?.mode==="orbit"?e.object.placement.inclination:void 0)??0,band:e.band,bandThickness:e.bandThickness,hidden:e.hidden,motion:i?.motion??bt(e.object,e,n,r)}}function qe(e,t,n,r,i,o){let a=o.get(e.objectId);if(a)return a;let l=e.object.placement,s;if(l?.mode==="orbit"&&e.parentId){let c=r.get(e.parentId),u=c?qe(c,t,n,r,i,o):{x:0,y:0,z:0},d=i.get(e.objectId),m=bt(e.object,d,1,t.activeEventId!==null),h=m?Qi(m,0):{x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};s=io(u,h)}else if(l?.mode==="surface"&&e.parentId){let c=r.get(e.parentId),u=c?qe(c,t,n,r,i,o):{x:0,y:0,z:0},d=c?.visualRadius??16,m=oo(e.objectId),h=m*Math.PI*2;s={x:u.x+Math.cos(h)*(d+e.visualRadius*.9),y:u.y+Math.sin(m*Math.PI)*Math.max(e.visualRadius*.2,2),z:u.z+Math.sin(h)*(d+e.visualRadius*.9)}}else if(l?.mode==="at"&&e.parentId){let c=r.get(e.parentId),u=c?qe(c,t,n,r,i,o):{x:0,y:0,z:0},d=e.anchorX??c?.x??n.x,m=e.anchorY??c?.y??n.y;s={x:u.x+(e.x-d),y:u.y,z:u.z+(e.y-m)}}else s={x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};return o.set(e.objectId,s),s}function Qi(e,t){let n=e.phase0Deg+e.angularVelocityDegPerSecond*t,r=ht(n),i=ht(e.rotationDeg),o=ht(e.inclinationDeg),a=Math.cos(r)*e.semiMajor,l=Math.sin(r)*e.semiMinor,s=a*Math.cos(i)-l*Math.sin(i),c=a*Math.sin(i)+l*Math.cos(i);return{x:s,y:c*Math.sin(o),z:c*Math.cos(o)}}function bt(e,t,n,r){let i=e.placement;if(!i||i.mode!=="orbit")return null;let o=t?.radius??t?.rx??ue(gt(i)*48,24,1200),a=t?.radius??t?.ry??o,l=eo(i.period),s=gt(i),c=ue(s/Math.max(n,1e-4),1,20),u=ue(l?Ge*c:Ge*Math.pow(c,.75),Ge,hn);return{phase0Deg:Xe(i.phase)??0,rotationDeg:Xe(i.angle)??t?.rotationDeg??0,inclinationDeg:Xe(i.inclination)??0,semiMajor:o,semiMinor:a,eccentricity:i.eccentricity??0,periodSeconds:l,angularVelocityDegPerSecond:360/Math.max(u,.001),heuristic:l===null,frozen:r}}function gt(e){let t=gn(e.semiMajor)??gn(e.distance)??1;return Math.max(t,.01)}function gn(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/1495978707e-1;case"m":return e.value/149597870700;case"re":return e.value*6371/1495978707e-1;case"rj":return e.value*71492/1495978707e-1;case"sol":return e.value*695700/1495978707e-1;case"ly":return e.value*63241.077;case"pc":return e.value*206264.806;case"kpc":return e.value*206264806;default:return e.value}}function eo(e){if(!e)return null;switch(e.unit){case"s":return e.value;case"min":return e.value*60;case"h":return e.value*3600;case"d":return e.value*bn;case"y":return e.value*Ye;case"ky":return e.value*Ye*1e3;case"my":return e.value*Ye*1e6;case"gy":return e.value*Ye*1e9;default:return null}}function Xe(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function to(e,t){return{...no(e),...t}}function no(e){switch(e){case"compact":return{orbitDistanceMultiplier:.92,bodyRadiusMultiplier:.92,markerSizeMultiplier:.92,ringThicknessMultiplier:.9,focusPadding:10,minBodyRadius:4,maxBodyRadius:34};case"presentation":return{orbitDistanceMultiplier:1.15,bodyRadiusMultiplier:1.12,markerSizeMultiplier:1.08,ringThicknessMultiplier:1.14,focusPadding:16,minBodyRadius:5,maxBodyRadius:44};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,markerSizeMultiplier:1,ringThicknessMultiplier:1,focusPadding:12,minBodyRadius:4,maxBodyRadius:40}}}function ro(e){if(e.length===0)return{minX:0,minY:0,minZ:0,maxX:0,maxY:0,maxZ:0,width:0,height:0,depth:0,center:{x:0,y:0,z:0}};let t=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY,r=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(let l of e)t=Math.min(t,l.position.x-l.visualRadius),n=Math.min(n,l.position.y-l.visualRadius),r=Math.min(r,l.position.z-l.visualRadius),i=Math.max(i,l.position.x+l.visualRadius),o=Math.max(o,l.position.y+l.visualRadius),a=Math.max(a,l.position.z+l.visualRadius);return{minX:t,minY:n,minZ:r,maxX:i,maxY:o,maxZ:a,width:i-t,height:o-n,depth:a-r,center:{x:(t+i)/2,y:(n+o)/2,z:(r+a)/2}}}function io(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function oo(e){let t=0;for(let n=0;n<e.length;n+=1)t=t*31+e.charCodeAt(n)>>>0;return t%1e4/1e4}function ue(e,t,n){return Math.min(Math.max(e,t),n)}function ht(e){return e*Math.PI/180}function yt(e,t={}){let n=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:fo(e.system),info:po(e.system)}:null,r=e.objects.map(ao);return co(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,theme:e.theme??null,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(so),objects:r}}function ao(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:uo(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function so(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(lo)}}function lo(e){return{objectId:e.objectId,placement:yn(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function yn(e){return e?structuredClone(e):null}function co(e,t,n){if(!n)return;let r=t.find(a=>a.id===n);if(!r)return;let i=new Map(e.map(a=>[a.id,a])),o=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(a=>a.objectId)]);for(let a of o){let l=i.get(a);l&&(r.epoch&&(l.epoch=r.epoch),r.referencePlane&&(l.referencePlane=r.referencePlane))}for(let a of r.positions){let l=i.get(a.objectId);l&&(a.placement&&(l.placement=yn(a.placement)),a.inner&&(l.properties.inner={...a.inner}),a.outer&&(l.properties.outer={...a.outer}),a.epoch&&(l.epoch=a.epoch),a.referencePlane&&(l.referencePlane=a.referencePlane))}}function uo(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function fo(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function po(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg)),n.camera?.azimuth!==null&&(t[`${r}.camera.azimuth`]=String(n.camera?.azimuth)),n.camera?.elevation!==null&&(t[`${r}.camera.elevation`]=String(n.camera?.elevation)),n.camera?.roll!==null&&(t[`${r}.camera.roll`]=String(n.camera?.roll)),n.camera?.distance!==null&&(t[`${r}.camera.distance`]=String(n.camera?.distance));let i=mo(n.layers);i&&(t[`${r}.layers`]=i),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.join(" "))}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function mo(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}var wn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,bo=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),yo=/^[A-Za-z][A-Za-z0-9+.-]*:/;function de(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function ke(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function wt(e,t,n){let r=e.match(wn);if(!r)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=D(n);if(o?.unitFamily&&!Ee(o.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function vt(e){let t=e.match(wn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Ke(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Z(e,t,n){let r=bo.get(e.toLowerCase());if(r===void 0)throw f.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function vn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function wo(e,t){if(!e)throw f.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw f.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(yo);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw f.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function In(e,t,n){let r=D(e);if(!r)throw f.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw f.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return Z(je(t,e,n),e,n);case"number":return Ke(je(t,e,n),e,n);case"unit":return wt(je(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&wo(i,n),i}}}function It(e,t,n){let r=D(e);if(!r)throw f.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw f.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function je(e,t,n){if(e.length!==1)throw f.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var $n=new Set(["star","planet","moon","asteroid","comet"]),vo=332946.0487,Io=1047.3486,Ze=1495978707e-1,xo=6371,$o=695700,So=63241.077,jo=206264.806,ko=206264806;function Je(e,t){let n=[],r=new Map(e.objects.map(l=>[l.id,l])),i=new Set(e.groups.map(l=>l.id)),o=new Set(e.events.map(l=>l.id));e.system||n.push(v("validate.system.required","Atlas documents must declare exactly one system."));let a=new Map;for(let[l,s]of[["group",e.groups.map(c=>c.id)],["viewpoint",e.system?.viewpoints.map(c=>c.id)??[]],["annotation",e.system?.annotations.map(c=>c.id)??[]],["relation",e.relations.map(c=>c.id)],["event",e.events.map(c=>c.id)],["object",e.objects.map(c=>c.id)]])for(let c of s){let u=a.get(c);u?n.push(v("validate.id.duplicate",`Duplicate ${l} id "${c}" already used by ${u}.`)):a.set(c,l)}for(let l of e.relations)Mo(l,r,n);for(let l of e.system?.viewpoints??[])Oo(l,i,o,t,n,r);for(let l of e.objects)Ao(l,e.system,r,i,n);for(let l of e.events)Lo(l,e.system,r,n);return n}function Mo(e,t,n){e.from?t.has(e.from)||n.push(v("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(v("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(v("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(v("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(v("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function Oo(e,t,n,r,i,o){let a=e.filter;if(r==="2.1"||r==="2.5"||r==="2.6"){if(a)for(let l of a.groupIds)t.has(l)||i.push(S("validate.viewpoint.group.unknown",`Unknown group "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let l of e.events??[])n.has(l)||i.push(S("validate.viewpoint.event.unknown",`Unknown event "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}Eo(e.projection,i,`viewpoint.${e.id}.projection`,e.id),Fo(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,a,o)}function Ao(e,t,n,r,i){let o=e.placement,a=o?.mode==="orbit"?o:null,l=o?.mode==="orbit"?n.get(o.target)??null:null;if(e.groups)for(let s of e.groups)r.has(s)||i.push(S("validate.group.unknown",`Unknown group "${s}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(S("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(S("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),a&&(n.has(a.target)||i.push(v("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&i.push(v("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&i.push(S("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),a.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(S("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!$t(l?.properties.mass)&&i.push(S("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),o?.mode==="surface"){let s=n.get(o.target);s?$n.has(s.type)||i.push(v("validate.surface.target.invalid",`Surface target "${o.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(v("validate.surface.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"surface"))}if(o?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(v("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),To(e,n,i)||i.push(v("validate.at.target.unknown",`Unknown at-reference target "${o.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let s=n.get(e.resonance.targetObjectId);s?(e.placement?.mode!=="orbit"||s.placement?.mode!=="orbit"||e.placement.target!==s.placement.target)&&i.push(S("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(v("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let s of e.deriveRules??[]){if(s.field!=="period"||s.strategy!=="kepler"){i.push(S("validate.derive.unsupported",`Unsupported derive rule "${s.field} ${s.strategy}" on "${e.id}".`,e.id,"derive"));continue}let c=xn(e,l);if(c===null){i.push(S("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||i.push(xt("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${zo(c)}.`,e.id,"derive"))}for(let s of e.validationRules??[]){if(s.rule!=="kepler"){i.push(S("validate.rule.unsupported",`Unsupported validation rule "${s.rule}" on "${e.id}".`,e.id,"validate"));continue}let c=Sn(a?.period),u=xn(e,l);if(c===null||u===null)continue;let d=Ro(e,"period");Math.abs(c-u)>d&&i.push(v("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function Lo(e,t,n,r){let i=`event.${e.id}`,o=new Set;e.kind.trim()||r.push(v("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${i}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&r.push(S("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${i}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&r.push(S("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${i}.referencePlane`)),!e.targetObjectId&&e.participantObjectIds.length===0&&r.push(v("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${i}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),n.has(e.targetObjectId)||r.push(v("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${i}.target`)));let a=new Set;for(let c of e.participantObjectIds){if(o.add(c),a.has(c)){r.push(S("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${c}".`,void 0,`${i}.participants`));continue}a.add(c),n.has(c)||r.push(v("validate.event.participants.unknown",`Unknown event participant "${c}" on "${e.id}".`,void 0,`${i}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&r.push(S("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(S("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${i}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.size<3&&r.push(S("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${i}.participants`));let l=new Set;for(let c of e.positions){let u=`${i}.pose.${c.objectId}`;if(l.has(c.objectId)){r.push(v("validate.event.pose.duplicate",`Event "${e.id}" defines "${c.objectId}" more than once in positions.`,void 0,u));continue}l.add(c.objectId);let d=n.get(c.objectId);if(!d){r.push(v("validate.event.pose.object.unknown",`Unknown event pose object "${c.objectId}" on "${e.id}".`,void 0,u));continue}o.has(c.objectId)||r.push(S("validate.event.pose.unreferenced",`Event pose "${c.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,u)),Po(c,d,e,t,n,r,u,e.id)}let s=[...o].filter(c=>!l.has(c));e.positions.length>0&&s.length>0&&r.push(S("validate.event.positions.partial",`Event "${e.id}" leaves ${s.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function Po(e,t,n,r,i,o,a,l){let s=e.placement;if(!s){o.push(v("validate.event.pose.placement.required",`Event "${l}" pose "${e.objectId}" is missing a placement mode.`,void 0,a));return}if(s.mode==="orbit"){i.has(s.target)||o.push(v("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.orbit`)),s.distance&&s.semiMajor&&o.push(v("validate.event.pose.orbit.distanceConflict",`Event "${l}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${a}.distance`)),s.phase&&!Co(r,t,n,e)&&o.push(S("validate.event.pose.phase.epochMissing",`Event "${l}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${a}.phase`)),s.inclination&&!Vo(r,t,n,e)&&o.push(S("validate.event.pose.inclination.referencePlaneMissing",`Event "${l}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${a}.inclination`)),s.period&&!$t(i.get(s.target)?.properties.mass)&&o.push(S("validate.event.pose.period.massMissing",`Event "${l}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${a}.period`));return}if(s.mode==="surface"){let c=i.get(s.target);c?$n.has(c.type)||o.push(v("validate.event.pose.surface.target.invalid",`Event surface target "${s.target}" on "${l}:${e.objectId}" is not surface-capable.`,void 0,`${a}.surface`)):o.push(v("validate.event.pose.surface.target.unknown",`Unknown event surface target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.surface`));return}if(s.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&o.push(v("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${l}:${e.objectId}".`,void 0,`${a}.at`));let c=s.reference;c.kind==="named"&&!i.has(c.name)?o.push(v("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${s.target}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):c.kind==="anchor"&&!i.has(c.objectId)?o.push(v("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${c.objectId}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):c.kind==="lagrange"&&(i.has(c.primary)?c.secondary&&!i.has(c.secondary)&&o.push(v("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${c.secondary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)):o.push(v("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${c.primary}" on "${l}:${e.objectId}".`,void 0,`${a}.at`)))}}function To(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(v("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(v("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(v("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function xn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=Do(n.semiMajor??n.distance),i=$t(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function Do(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Ze;case"m":return e.value/(Ze*1e3);case"ly":return e.value*So;case"pc":return e.value*jo;case"kpc":return e.value*ko;case"re":return e.value*xo/Ze;case"sol":return e.value*$o/Ze;default:return null}}function $t(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/vo;case"mj":return t.value/Io;default:return null}}function Sn(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function Eo(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(v("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function Fo(e,t,n,r,i,o,a,l,s){if(!e)return;let c=`viewpoint.${i}.camera`;for(let[d,m]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])m!==null&&(!Number.isFinite(m)||d==="distance"&&m<=0)&&r.push(v("validate.viewpoint.camera.invalid",`Invalid camera ${d} "${String(m)}" in viewpoint "${i}".`,void 0,`${c}.${d}`));e.distance!==null&&t!=="perspective"&&r.push(S("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${c}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(S("validate.viewpoint.camera.topdownPartial",`Camera elevation/roll on topdown viewpoint "${i}" are currently stored for future 3D use and only partially affect 2D rendering.`,void 0,c)),t==="isometric"&&e.elevation!==null&&r.push(xt("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${c}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(S("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${c}.azimuth`)),o!==null&&s.has(o)||a!==null&&s.has(a)||l||r.push(xt("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,c))}function Co(e,t,n,r){return J(r?.epoch)??J(n?.epoch)??J(t.epoch)??J(e?.epoch)??null}function Vo(e,t,n,r){return J(r?.referencePlane)??J(n?.referencePlane)??J(t.referencePlane)??J(e?.referencePlane)??null}function J(e){return typeof e=="string"&&e.trim()?e.trim():null}function Ro(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?Sn(n)??0:0}function zo(e){return`${Math.round(e*100)/100}d`}function v(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function S(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function xt(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Bo=new Set(["climate","habitability","settlement"]),et=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=D(e);t&&et.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])et.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var _o=new Set(et.keys()),kn=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function St(e){return No(e)}function No(e,t){let n=Oa(e),r=n.source.split(/\r?\n/),i=[],o=!1,a="2.0",l=null,s=null,c=[],u=[],d=[],m=[],h=new Map,b=!1,g=!1,w=new Set,M=new Set,p=new Set,$=new Set,P=new Set;for(let A=0;A<r.length;A++){let ae=r[A],V=A+1;if(!ae.trim())continue;let U=Fe(ae),q=me(ae.slice(U),{line:V,columnOffset:U});if(q.length!==0){if(!o){a=Uo(q,V),o=!0,n.comments.length>0&&tt(a,"2.1")&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${a}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(U===0){s=Wo(q,V,a,i,l,c,u,d,m,h,w,M,p,$,P,{sawDefaults:b,sawAtlas:g}),s.kind==="system"?l=s.system:s.kind==="defaults"?b=!0:s.kind==="atlas"&&(g=!0);continue}if(!s)throw new f("Indented line without parent atlas section",V,U+1);Jo(s,U,q,V)}}if(!o)throw new f('Missing required atlas schema header "schema 2.0"');let _=c.map(A=>ba(A,a,i)),T=m.map(A=>ya(A,h.get(A.id)??[])),N=t??(a==="2.0-draft"?"2.0":a),G={format:"worldorbit",sourceVersion:"1.0",theme:null,system:l,groups:u,relations:d,events:T,objects:_,diagnostics:i};if(N==="2.0-draft"){let A={...G,version:"2.0-draft",schemaVersion:"2.0-draft"};return A.diagnostics.push(...Je(A,a)),A}let te={...G,version:N,schemaVersion:N};return a==="2.0-draft"&&te.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),te.diagnostics.push(...Je(te,a)),te}function Uo(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5","2.6"].includes(e[1].value.toLowerCase()))throw new f('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", "schema 2.6", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.6"?"2.6":n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Wo(e,t,n,r,i,o,a,l,s,c,u,d,m,h,b,g){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new f('Atlas section "system" may only appear once',t,e[0].column);return Yo(e,t,n,r);case"defaults":if(!i)throw new f('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(g.sawDefaults)throw new f('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,sourceSchemaVersion:n,diagnostics:r,seenFields:new Set};case"atlas":if(!i)throw new f('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(g.sawAtlas)throw new f('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:i,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!i)throw new f('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return Go(e,t,i,u,n,r);case"annotation":if(!i)throw new f('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return qo(e,t,i,d);case"group":return C(n,r,"group",{line:t,column:e[0].column}),Xo(e,t,a,m);case"relation":return C(n,r,"relation",{line:t,column:e[0].column}),Ho(e,t,l,h);case"event":return C(n,r,"event",{line:t,column:e[0].column}),Ko(e,t,s,c,b,n,r);case"object":return Zo(e,t,n,r,o);default:throw new f(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Yo(e,t,n,r){if(e.length!==2)throw new f("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function Go(e,t,n,r,i,o){if(e.length!==2)throw new f("Invalid viewpoint declaration",t,e[0]?.column??1);let a=de(e[1].value);if(!a)throw new f("Viewpoint id must not be empty",t,e[1].column);if(r.has(a))throw new f(`Duplicate viewpoint id "${a}"`,t,e[1].column);let l={id:a,label:ke(a),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null};return n.viewpoints.push(l),r.add(a),{kind:"viewpoint",viewpoint:l,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function qo(e,t,n,r){if(e.length!==2)throw new f("Invalid annotation declaration",t,e[0]?.column??1);let i=de(e[1].value);if(!i)throw new f("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new f(`Duplicate annotation id "${i}"`,t,e[1].column);let o={id:i,label:ke(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(o),r.add(i),{kind:"annotation",annotation:o,seenFields:new Set}}function Xo(e,t,n,r){if(e.length!==2)throw new f("Invalid group declaration",t,e[0]?.column??1);let i=de(e[1].value);if(!i)throw new f("Group id must not be empty",t,e[1].column);if(r.has(i))throw new f(`Duplicate group id "${i}"`,t,e[1].column);let o={id:i,label:ke(i),summary:"",color:null,tags:[],hidden:!1};return n.push(o),r.add(i),{kind:"group",group:o,seenFields:new Set}}function Ho(e,t,n,r){if(e.length!==2)throw new f("Invalid relation declaration",t,e[0]?.column??1);let i=de(e[1].value);if(!i)throw new f("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new f(`Duplicate relation id "${i}"`,t,e[1].column);let o={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(o),r.add(i),{kind:"relation",relation:o,seenFields:new Set}}function Ko(e,t,n,r,i,o,a){if(e.length!==2)throw new f("Invalid event declaration",t,e[0]?.column??1);let l=de(e[1].value);if(!l)throw new f("Event id must not be empty",t,e[1].column);if(i.has(l))throw new f(`Duplicate event id "${l}"`,t,e[1].column);let s={id:l,kind:"",label:ke(l),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},c=[];return n.push(s),r.set(l,c),i.add(l),{kind:"event",event:s,sourceSchemaVersion:o,diagnostics:a,seenFields:new Set,rawPoses:c,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Zo(e,t,n,r,i){if(e.length<3)throw new f("Invalid atlas object declaration",t,e[0]?.column??1);let o=e[1],a=e[2],l=o.value;if(!De.has(l)||l==="system")throw new f(`Unknown object type "${o.value}"`,t,o.column);let s={objectType:l,id:a.value,fields:ha(e.slice(3),t,l,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:o.column}};return i.push(s),{kind:"object",objectNode:s,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function Jo(e,t,n,r){switch(e.kind){case"system":Qo(e,n,r);return;case"defaults":ea(e,n,r);return;case"atlas":ta(e,t,n,r);return;case"viewpoint":na(e,t,n,r);return;case"annotation":oa(e,n,r);return;case"group":aa(e,n,r);return;case"relation":sa(e,n,r);return;case"event":la(e,t,n,r);return;case"object":ua(e,t,n,r);return}}function Qo(e,t,n){let r=W(t,e.seenFields,n),i=x(t,n);switch(r){case"title":e.system.title=i;return;case"description":C(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":C(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":C(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new f(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function ea(e,t,n){let r=W(t,e.seenFields,n),i=x(t,n);switch(r){case"view":On(i)&&ie(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=Mn(i,n,t[0].column);return;case"scale":e.system.defaults.scale=i;return;case"units":e.system.defaults.units=i;return;case"preset":e.system.defaults.preset=An(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new f(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function ta(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=Ln(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new f(`Duplicate atlas metadata key "${i.key}"`,r,n[0].column);e.system.atlasMetadata[i.key]=i.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new f(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function na(e,t,n,r){if(e.inCamera&&t<=(e.cameraIndent??0)&&(e.inCamera=!1,e.cameraIndent=null),e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inCamera){ra(e,n,r);return}if(e.inFilter){ia(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(ie(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new f('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??kt();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new f('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=W(n,e.seenFields,r),o=x(n,r);switch(i){case"label":e.viewpoint.label=o;return;case"summary":e.viewpoint.summary=o;return;case"focus":e.viewpoint.focusObjectId=o;return;case"select":e.viewpoint.selectedObjectId=o;return;case"projection":On(o)&&ie(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=Mn(o,r,n[0].column);return;case"preset":e.viewpoint.preset=An(o,r,n[0].column);return;case"zoom":e.viewpoint.zoom=jt(o,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=ee(o,r,n[0].column,"rotation");return;case"camera":ie(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=ma(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=fa(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":C(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=B(n.slice(1),r,"events");return;default:throw new f(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function ra(e,t,n){let r=W(t,e.seenCameraFields,n),i=x(t,n),o=e.viewpoint.camera??kt();switch(r){case"azimuth":o.azimuth=ee(i,n,t[0].column,"camera.azimuth");break;case"elevation":o.elevation=ee(i,n,t[0].column,"camera.elevation");break;case"roll":o.roll=ee(i,n,t[0].column,"camera.roll");break;case"distance":o.distance=jt(i,n,t[0].column,"camera.distance");break;default:throw new f(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=o}function ia(e,t,n){let r=W(t,e.seenFilterFields,n),i=e.viewpoint.filter??pa();switch(r){case"query":i.query=x(t,n);break;case"objecttypes":i.objectTypes=da(t.slice(1),n);break;case"tags":i.tags=B(t.slice(1),n,"tags");break;case"groups":i.groupIds=B(t.slice(1),n,"groups");break;default:throw new f(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function oa(e,t,n){switch(W(t,e.seenFields,n)){case"label":e.annotation.label=x(t,n);return;case"target":e.annotation.targetObjectId=x(t,n);return;case"body":e.annotation.body=x(t,n);return;case"tags":e.annotation.tags=B(t.slice(1),n,"tags");return;default:throw new f(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function aa(e,t,n){switch(W(t,e.seenFields,n)){case"label":e.group.label=x(t,n);return;case"summary":e.group.summary=x(t,n);return;case"color":e.group.color=x(t,n);return;case"tags":e.group.tags=B(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=Z(x(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new f(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function sa(e,t,n){switch(W(t,e.seenFields,n)){case"from":e.relation.from=x(t,n);return;case"to":e.relation.to=x(t,n);return;case"kind":e.relation.kind=x(t,n);return;case"label":e.relation.label=x(t,n);return;case"summary":e.relation.summary=x(t,n);return;case"tags":e.relation.tags=B(t.slice(1),n,"tags");return;case"color":e.relation.color=x(t,n);return;case"hidden":e.relation.hidden=Z(x(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new f(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function la(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){(n[0]?.value==="epoch"||n[0]?.value==="referencePlane")&&ie(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(ca(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new f(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let o=n[1].value;if(!o.trim())throw new f("Event pose object id must not be empty",r,n[1].column);let a={objectId:o,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(a),e.activePose=a,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new f('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(W(n,e.seenFields,r)){case"kind":e.event.kind=x(n,r);return;case"label":e.event.label=x(n,r);return;case"summary":e.event.summary=x(n,r);return;case"target":e.event.targetObjectId=x(n,r);return;case"participants":e.event.participantObjectIds=B(n.slice(1),r,"participants");return;case"timing":e.event.timing=x(n,r);return;case"visibility":e.event.visibility=x(n,r);return;case"epoch":ie(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=x(n,r);return;case"referenceplane":ie(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=x(n,r);return;case"tags":e.event.tags=B(n.slice(1),r,"tags");return;case"color":e.event.color=x(n,r);return;case"hidden":e.event.hidden=Z(x(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new f(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function ca(e,t,n){if(e.length<2)throw new f("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!kn.has(r))throw new f(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new f(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(i=>i.value),location:{line:t,column:e[0].column}}}function ua(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let i=n[0].value.toLowerCase();if(i==="info"||Bo.has(i)){i!=="info"&&C(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=Ln(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new f(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let o=e.activeBlock,a=e.seenTypedBlockKeys[o]??(e.seenTypedBlockKeys[o]=new Set);if(a.has(i.key))throw new f(`Duplicate ${o} key "${i.key}"`,r,n[0].column);a.add(i.key),(e.objectNode.typedBlockEntries[o]??(e.objectNode.typedBlockEntries[o]=[])).push(i);return}e.objectNode.fields.push(ga(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function W(e,t,n){if(e.length<2)throw new f("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new f(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function x(e,t){if(e.length<2)throw new f("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function da(e,t){return B(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function fa(e,t,n,r){let i={};for(let o of B(e,t,"layers")){let a=!o.startsWith("-")&&!o.startsWith("!"),l=o.replace(/^[-!]+/,"").toLowerCase();if(l==="orbits"){i["orbits-back"]=a,i["orbits-front"]=a;continue}(l==="background"||l==="guides"||l==="orbits-back"||l==="orbits-front"||l==="relations"||l==="events"||l==="objects"||l==="labels"||l==="metadata")&&(l==="events"&&n&&r&&C(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[l]=a)}return i}function B(e,t,n){if(e.length===0)throw new f(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new f(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function Mn(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new f(`Unknown projection "${e}"`,t,n);return r}function On(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function An(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new f(`Unknown render preset "${e}"`,t,n)}function jt(e,t,n,r){let i=ee(e,t,n,r);if(i<=0)throw new f(`Field "${r}" must be greater than zero`,t,n);return i}function ee(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new f(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function pa(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function kt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function ma(e,t,n){if(e.length===0||e.length%2!==0)throw new f('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:kt(),i=new Set;for(let o=0;o<e.length;o+=2){let a=e[o],l=e[o+1],s=a.value.toLowerCase();if(i.has(s))throw new f(`Duplicate viewpoint camera field "${a.value}"`,t,a.column);i.add(s);let c=l.value;switch(s){case"azimuth":r.azimuth=ee(c,t,a.column,"camera.azimuth");break;case"elevation":r.elevation=ee(c,t,a.column,"camera.elevation");break;case"roll":r.roll=ee(c,t,a.column,"camera.roll");break;case"distance":r.distance=jt(c,t,a.column,"camera.distance");break;default:throw new f(`Unknown viewpoint camera field "${a.value}"`,t,a.column)}}return r}function ha(e,t,n,r,i){let o=[],a=0;for(;a<e.length;){let l=e[a],s=Me(l.value);if(!s)throw new f(`Unknown field "${l.value}"`,t,l.column);s.version==="2.1"&&C(r,i,l.value,{line:t,column:l.column}),a++;let c=[];if(s.inlineMode==="single"){let u=e[a];u&&(c.push(u),a++)}else if(s.inlineMode==="pair")for(let u=0;u<2;u++){let d=e[a];if(!d)break;c.push(d),a++}else for(;a<e.length&&!_o.has(e[a].value);)c.push(e[a]),a++;if(c.length===0)throw new f(`Missing value for field "${l.value}"`,t,l.column);o.push({type:"field",key:l.value,values:c.map(u=>u.value),location:{line:t,column:l.column}})}return En(o,n),o}function ga(e,t,n,r,i){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);let o=Me(e[0].value);if(!o)throw new f(`Unknown field "${e[0].value}"`,t,e[0].column);o.version==="2.1"&&C(r,i,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(l=>l.value),location:{line:t,column:e[0].column}};return En([a],n),a}function Ln(e,t,n){if(e.length<2)throw new f(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function ba(e,t,n){let r=Pn(e.fields),i=Tn(r),o=va(e.objectType,r),a=ka(r.get("groups")?.[0]),l=Qe(r.get("epoch")?.[0]),s=Qe(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?Z(R(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?$a(r.get("resonance")[0]):void 0,d=xa(r),m=r.get("derive")?.map($=>Sa($)),h=r.get("validate")?.map($=>({rule:R($)})),b=r.has("locked")?[...new Set(r.get("locked").flatMap($=>$.values))]:void 0,g=r.get("tolerance")?.map($=>ja($)),w=Ia(e.typedBlockEntries),M=Dn(e.infoEntries,"info"),p={type:e.objectType,id:e.id,properties:o,placement:i,info:M};return a.length>0&&(p.groups=a),l&&(p.epoch=l),s&&(p.referencePlane=s),c!==void 0&&(p.tidalLock=c),u&&(p.resonance=u),d&&(p.renderHints=d),m?.length&&(p.deriveRules=m),h?.length&&(p.validationRules=h),b?.length&&(p.lockedFields=b),g?.length&&(p.tolerances=g),w&&Object.keys(w).length>0&&(p.typedBlocks=w),tt(t,"2.1")&&(p.groups||p.epoch||p.referencePlane||p.tidalLock!==void 0||p.resonance||p.renderHints||p.deriveRules?.length||p.validationRules?.length||p.lockedFields?.length||p.tolerances?.length||p.typedBlocks)&&C(t,n,e.id,e.location),p}function ya(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>wa(n))}}function wa(e){let t=Pn(e.fields,"event-pose"),n=Tn(t);return{objectId:e.objectId,placement:n,inner:Q(t.get("inner")?.[0],"inner"),outer:Q(t.get("outer")?.[0],"outer"),epoch:Qe(t.get("epoch")?.[0]),referencePlane:Qe(t.get("referencePlane")?.[0])}}function Pn(e,t="object"){let n=new Map;for(let r of e){let i=Me(r.key);if(!i&&!kn.has(r.key))throw f.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw f.fromLocation(`Duplicate field "${r.key}"`,r.location);let o=n.get(r.key)??[];o.push(r),n.set(r.key,o)}return n}function Tn(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],i=e.get("free")?.[0];if([t,n,r,i].filter(Boolean).length>1){let a=t??n??r??i;throw f.fromLocation("Object has multiple placement modes",a?.location)}if(t)return{mode:"orbit",target:R(t),distance:Q(e.get("distance")?.[0],"distance"),semiMajor:Q(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:Ma(e.get("eccentricity")?.[0],"eccentricity"),period:Q(e.get("period")?.[0],"period"),angle:Q(e.get("angle")?.[0],"angle"),inclination:Q(e.get("inclination")?.[0],"inclination"),phase:Q(e.get("phase")?.[0],"phase")};if(n){let a=R(n);return{mode:"at",target:a,reference:vn(a,n.location)}}if(r)return{mode:"surface",target:R(r)};if(i){let a=R(i),l=vt(a);return{mode:"free",distance:l??void 0,descriptor:l?void 0:a}}return null}function va(e,t){let n={};for(let[r,i]of t.entries()){let o=i[0],a=Me(r);!o||!a?.legacySchema||a.legacySchema.placement||(It(r,e,o.location),n[r]=In(r,o.values,o.location))}return n}function Dn(e,t){let n={};for(let r of e){if(r.key in n)throw f.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function Ia(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Dn(r,n))}return t}function xa(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=Z(R(n),"renderLabel",n.location)),r&&(t.renderOrbit=Z(R(r),"renderOrbit",r.location)),i&&(t.renderPriority=Ke(R(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function $a(e){if(e.values.length!==2)throw f.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw f.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Sa(e){if(e.values.length!==2)throw f.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function ja(e){if(e.values.length!==2)throw f.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=vt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function ka(e){return e?[...new Set(e.values)]:[]}function Qe(e){return e&&e.values.join(" ").trim()||null}function Q(e,t){return e?wt(R(e),e.location,t):void 0}function Ma(e,t){return e?Ke(R(e),t,e.location):void 0}function R(e){return je(e.values,e.key,e.location)}function Me(e){return et.get(e)}function En(e,t){for(let n of e){let r=Me(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){It(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw f.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function C(e,t,n,r){tt(e,"2.1")&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function ie(e,t,n,r){tt(e,"2.5")&&t.push({code:"parse.schema25.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.5; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function tt(e,t){return jn(e)<jn(t)}function jn(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3;case"2.6":return 4;default:return 5}}function Oa(e){let t=[...e],n=[],r=!1,i=!1,o=null,a=1,l=1;for(let s=0;s<t.length;s++){let c=t[s],u=t[s+1];if(i){if(c==="*"&&u==="/"){t[s]=" ",t[s+1]=" ",i=!1,o=null,s++,l+=2;continue}c!==`
|
|
2
2
|
`&&c!=="\r"&&(t[s]=" "),c===`
|
|
3
|
-
`?(a++,l=1):l++;continue}if(!r&&c==="/"&&u==="*"){n.push({kind:"block",line:a,column:l}),t[s]=" ",t[s+1]=" ",i=!0,o={line:a,column:l},s++,l+=2;continue}if(!r&&c==="#"&&!
|
|
3
|
+
`?(a++,l=1):l++;continue}if(!r&&c==="/"&&u==="*"){n.push({kind:"block",line:a,column:l}),t[s]=" ",t[s+1]=" ",i=!0,o={line:a,column:l},s++,l+=2;continue}if(!r&&c==="#"&&!Aa(t,s)){n.push({kind:"line",line:a,column:l}),t[s]=" ";let d=s+1;for(;d<t.length&&t[d]!==`
|
|
4
4
|
`&&t[d]!=="\r";)t[d]=" ",d++;l+=d-s,s=d-1;continue}c==='"'&&t[s-1]!=="\\"&&(r=!r),c===`
|
|
5
|
-
`?(a++,l=1):l++}if(i)throw f.fromLocation("Unclosed block comment",o??void 0);return{source:t.join(""),comments:n}}function
|
|
6
|
-
`}var
|
|
5
|
+
`?(a++,l=1):l++}if(i)throw f.fromLocation("Unclosed block comment",o??void 0);return{source:t.join(""),comments:n}}function Aa(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let i=e[n];return i===void 0||i===" "||i===" "||i==="\r"||i===`
|
|
6
|
+
`}var La=/^schema\s+2(?:\.0|\.1|\.5|\.6)?$/i,Pa=/^schema\s+2\.1$/i,Ta=/^schema\s+2\.5$/i,Da=/^schema\s+2\.6$/i,Ea=/^schema\s+2\.0-draft$/i;function Fn(e){for(let t of Fa(e).split(/\r?\n/)){let n=t.trim();if(n)return Ea.test(n)?"2.0-draft":Pa.test(n)?"2.1":Ta.test(n)?"2.5":Da.test(n)?"2.6":La.test(n)?"2.0":"1.0"}return"1.0"}function Fa(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let o=t[i],a=t[i+1];if(r){if(o==="*"&&a==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}o!==`
|
|
7
7
|
`&&o!=="\r"&&(t[i]=" ");continue}if(!n&&o==="/"&&a==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&o==="#"){t[i]=" ";let l=i+1;for(;l<t.length&&t[l]!==`
|
|
8
|
-
`&&t[l]!=="\r";)t[l]=" ",l++;i=l-1;continue}o==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function
|
|
8
|
+
`&&t[l]!=="\r";)t[l]=" ",l++;i=l-1;continue}o==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function oe(e){let t=Cn(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new f(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function Cn(e){let t=Fn(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5"||t==="2.6")return Ca(e,t);let n;try{n=he(e)}catch(i){return{ok:!1,value:null,diagnostics:[re(i,"parse")]}}let r;try{r=ge(n)}catch(i){return{ok:!1,value:null,diagnostics:[re(i,"normalize")]}}try{be(r)}catch(i){return{ok:!1,value:null,diagnostics:[re(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Ca(e,t){let n;try{n=St(e)}catch(a){return{ok:!1,value:null,diagnostics:[re(a,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(a=>a.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=yt(n)}catch(a){return{ok:!1,value:null,diagnostics:[re(a,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var Ba={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0},nt={atlas:{name:"atlas",backgroundStart:"#041018",backgroundEnd:"#0a2331",backgroundGlow:"rgba(240, 180, 100, 0.18)",panel:"rgba(7, 17, 27, 0.9)",panelLine:"rgba(168, 207, 242, 0.18)",relation:"rgba(240, 180, 100, 0.42)",orbit:"rgba(163, 209, 255, 0.24)",orbitBand:"rgba(255, 190, 120, 0.28)",guide:"rgba(255, 255, 255, 0.04)",leader:"rgba(225, 238, 255, 0.4)",ink:"#e8f0ff",muted:"rgba(232, 240, 255, 0.7)",accent:"#f0b464",accentStrong:"#ff7f5f",selected:"rgba(255, 214, 139, 0.92)",starCore:"#ffcc67",starStroke:"rgba(255, 245, 203, 0.85)",starGlow:"#ffe8a3",spaceFog:"#07131d",starfield:"rgba(226, 239, 255, 0.9)",starfieldDim:"rgba(164, 194, 228, 0.45)",objectSpecular:"#f5f8ff",orbitOpacity:.34,orbitBandOpacity:.24,selectionHalo:"rgba(255, 214, 139, 0.9)",atmosphere:"rgba(143, 202, 255, 0.4)",cometTail:"rgba(193, 243, 255, 0.7)",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},nightglass:{name:"nightglass",backgroundStart:"#07131f",backgroundEnd:"#13283a",backgroundGlow:"rgba(120, 255, 215, 0.16)",panel:"rgba(7, 20, 30, 0.9)",panelLine:"rgba(120, 255, 215, 0.16)",relation:"rgba(156, 231, 255, 0.42)",orbit:"rgba(120, 255, 215, 0.2)",orbitBand:"rgba(137, 185, 255, 0.24)",guide:"rgba(255, 255, 255, 0.035)",leader:"rgba(192, 255, 233, 0.42)",ink:"#edfff8",muted:"rgba(237, 255, 248, 0.68)",accent:"#78ffd7",accentStrong:"#9ce7ff",selected:"rgba(120, 255, 215, 0.9)",starCore:"#e5f98c",starStroke:"rgba(246, 255, 217, 0.9)",starGlow:"#fffab4",spaceFog:"#071723",starfield:"rgba(220, 255, 245, 0.9)",starfieldDim:"rgba(124, 212, 195, 0.42)",objectSpecular:"#ecfffb",orbitOpacity:.3,orbitBandOpacity:.22,selectionHalo:"rgba(120, 255, 215, 0.85)",atmosphere:"rgba(120, 255, 215, 0.32)",cometTail:"rgba(181, 255, 236, 0.68)",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},ember:{name:"ember",backgroundStart:"#17090b",backgroundEnd:"#31111a",backgroundGlow:"rgba(255, 127, 95, 0.18)",panel:"rgba(24, 9, 13, 0.9)",panelLine:"rgba(255, 166, 149, 0.16)",relation:"rgba(255, 178, 125, 0.42)",orbit:"rgba(255, 188, 164, 0.22)",orbitBand:"rgba(255, 214, 139, 0.24)",guide:"rgba(255, 255, 255, 0.03)",leader:"rgba(255, 223, 209, 0.42)",ink:"#fff3ee",muted:"rgba(255, 243, 238, 0.68)",accent:"#ffb27d",accentStrong:"#ff7f5f",selected:"rgba(255, 178, 125, 0.9)",starCore:"#ffb766",starStroke:"rgba(255, 236, 205, 0.88)",starGlow:"#ffe2ad",spaceFog:"#1c0d12",starfield:"rgba(255, 232, 214, 0.88)",starfieldDim:"rgba(255, 176, 138, 0.38)",objectSpecular:"#fff0e6",orbitOpacity:.3,orbitBandOpacity:.24,selectionHalo:"rgba(255, 178, 125, 0.85)",atmosphere:"rgba(255, 190, 140, 0.26)",cometTail:"rgba(255, 214, 173, 0.62)",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'}};function Oe(e){return e?typeof e=="string"?nt[e]??nt.atlas:{...nt.atlas,...e}:nt.atlas}function Mt(e){return{...Ba,...e}}function rt(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:Ot(e.objectTypes??[]),tags:Ot((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:Ot((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return _a(t)?t:null}function _a(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function At(e,t){let n=rt(t),r=new Set;for(let i of e.objects)if(!i.hidden&&Na(i,n)&&(r.add(i.objectId),n?.includeAncestors!==!1))for(let o of i.ancestorIds)r.add(o);return n?r:new Set(e.objects.filter(i=>!i.hidden).map(i=>i.objectId))}function Na(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type))return!1;if(t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId))){let n=e.semanticGroupIds.length>0&&t.groupIds.some(i=>e.semanticGroupIds.includes(i)),r=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!n&&!r)return!1}if(t.tags?.length){let n=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[];if(!t.tags.every(r=>n.includes(r)))return!1}if(t.query?.trim()){let n=Ua(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(i=>n.includes(i)))return!1}return!0}function Ua(e,t){let n=Object.values(e.info),r=Object.values(e.properties).flatMap(i=>Array.isArray(i)?i:typeof i=="object"&&i&&"value"in i?[String(i.value),String(i.unit??"")]:[String(i)]).filter(Boolean);return[e.id,t,e.type,...r,...n].join(" ")}function Ot(e){return[...new Set(e)]}var ot="worldorbit-camera-root";function Y(e,t={}){let n=Oe(t.theme),r=os(t.preset??e.renderPreset??void 0),i=Mt({...r.layers,...t.layers}),o=t.subtitle??e.subtitle,a=At(e,t.filter??null),l=e.objects.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>i.structures||!it(p.object)).sort((p,$)=>p.sortKey-$.sortKey),s=e.labels.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>i.structures||!it(p.object)),c=Ga(l),u=i.orbits?Ya(e,a,i.structures):{back:"",front:""},d=i.guides?e.leaders.filter(p=>!p.hidden).filter(p=>a.has(p.objectId)).filter(p=>i.structures||!it(p.object)).map(p=>`<line class="wo-leader wo-leader-${p.mode}" x1="${p.x1}" y1="${p.y1}" x2="${p.x2}" y2="${p.y2}" data-render-id="${O(p.renderId)}" data-group-id="${L(p.groupId??"")}" />`).join(""):"",m=i.relations?e.relations.filter(p=>!p.hidden).filter(p=>a.has(p.fromObjectId)&&a.has(p.toObjectId)).map(p=>`<line class="wo-relation" x1="${p.x1}" y1="${p.y1}" x2="${p.x2}" y2="${p.y2}" data-render-id="${O(p.renderId)}" data-relation-id="${L(p.relationId)}" />`).join(""):"",h=i.events?e.events.filter(p=>!p.hidden).map(p=>Wa(e,p,a,n)).join(""):"",b=i.objects?l.map(p=>qa(p,t.selectedObjectId??null,n)).join(""):"",g=i.labels?s.map(p=>Xa(e,p,t.selectedObjectId??null)).join(""):"",w=i.metadata?`<text class="wo-title" x="56" y="64">${O(e.title)}</text>
|
|
9
9
|
<text class="wo-subtitle" x="56" y="88">${O(o)}</text>
|
|
10
|
-
<text class="wo-meta" x="56" y="${e.height-42}">${O(
|
|
10
|
+
<text class="wo-meta" x="56" y="${e.height-42}">${O(ss(e))}</text>`:"",M=i.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
11
11
|
<rect class="wo-bg-glow" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
12
|
-
${i.guides?
|
|
12
|
+
${i.guides?as(e.width,e.height):""}`:"";return`<svg xmlns="http://www.w3.org/2000/svg" data-worldorbit-svg="true" width="${e.width}" height="${e.height}" viewBox="0 0 ${e.width} ${e.height}" preserveAspectRatio="xMidYMid meet" role="img" aria-labelledby="worldorbit-title worldorbit-desc">
|
|
13
13
|
<title id="worldorbit-title">${O(e.title)}</title>
|
|
14
14
|
<desc id="worldorbit-desc">A ${O(e.viewMode)} WorldOrbit render with ${l.length} visible objects.</desc>
|
|
15
15
|
<defs>
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
${M}
|
|
69
69
|
${w}
|
|
70
70
|
<g data-worldorbit-world="true">
|
|
71
|
-
<g data-worldorbit-camera-root="${
|
|
71
|
+
<g data-worldorbit-camera-root="${ot}" id="${ot}">
|
|
72
72
|
<g data-worldorbit-world-content="true">
|
|
73
73
|
${i.orbits?`<g data-layer-id="orbits-back">${u.back}</g>`:""}
|
|
74
74
|
${i.guides?`<g data-layer-id="guides">${d}</g>`:""}
|
|
@@ -80,24 +80,24 @@
|
|
|
80
80
|
</g>
|
|
81
81
|
</g>
|
|
82
82
|
</g>
|
|
83
|
-
</svg>`}function
|
|
83
|
+
</svg>`}function Wa(e,t,n,r){let i=t.objectIds.filter(s=>n.has(s)).map(s=>e.objects.find(c=>c.objectId===s&&!c.hidden)).filter(Boolean);if(i.length===0)return"";let o=t.event.color||r.accent,a=t.event.label||t.event.id,l=i.map(s=>`<line class="wo-event-line" x1="${t.x}" y1="${t.y}" x2="${s.x}" y2="${s.y}" stroke="${L(o)}" data-event-id="${L(t.eventId)}" data-object-id="${L(s.objectId)}" />`).join("");return`<g class="wo-event" data-render-id="${O(t.renderId)}" data-event-id="${L(t.eventId)}">
|
|
84
84
|
${l}
|
|
85
85
|
<circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${L(o)}" />
|
|
86
86
|
<text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${O(a)}</text>
|
|
87
|
-
</g>`}function
|
|
87
|
+
</g>`}function Ya(e,t,n){let r=[],i=[];for(let o of e.orbitVisuals.filter(a=>!a.hidden&&t.has(a.objectId)&&(n||!it(a.object)))){let a=o.bandThickness??(o.band?10:1.5),l=o.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",s=`data-render-id="${O(o.renderId)}" data-orbit-object-id="${L(o.objectId)}" data-parent-id="${L(o.parentId)}" data-group-id="${L(o.groupId??"")}"`;if(o.backArcPath||o.frontArcPath){o.backArcPath&&r.push(`<path class="${l} wo-orbit-back" d="${o.backArcPath}" stroke-width="${a}" ${s} />`),o.frontArcPath&&i.push(`<path class="${l} wo-orbit-front" d="${o.frontArcPath}" stroke-width="${a}" ${s} />`);continue}if(o.kind==="ellipse"){let c=o.rx??o.radius??0,u=o.ry??o.radius??0;i.push(`<ellipse class="${l} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" rx="${c}" ry="${u}" transform="rotate(${o.rotationDeg} ${o.cx} ${o.cy})" stroke-width="${a}" ${s} />`);continue}i.push(`<circle class="${l} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" r="${o.radius??0}" stroke-width="${a}" ${s} />`)}return{back:r.join(""),front:i.join("")}}function Ga(e){return e.filter(t=>!!t.imageHref).map(t=>Za(t)).join("")}function qa(e,t,n){let{object:r,x:i,y:o,radius:a,visualRadius:l}=e,s=t===e.objectId?" wo-object-selected":"",c=r.properties.kind?` wo-kind-${String(r.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",u=Qa(e,n),d=Ka(e),m=d?Rn(r,i,o,a,u,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${r.type}${c}${s}" data-object-id="${O(e.objectId)}" data-parent-id="${L(e.parentId??"")}" data-group-id="${L(e.groupId??"")}" data-render-id="${O(e.renderId)}" tabindex="0" role="button" aria-label="${O(`${r.type} ${e.objectId}`)}">
|
|
88
88
|
<circle class="wo-selection-ring" cx="${i}" cy="${o}" r="${l+8}" />
|
|
89
|
-
${
|
|
90
|
-
${
|
|
89
|
+
${Ha(e,u)}
|
|
90
|
+
${Rn(r,i,o,a,u)}
|
|
91
91
|
${d}
|
|
92
92
|
${m}
|
|
93
|
-
</g>`}function
|
|
93
|
+
</g>`}function Xa(e,t,n){let r=n===t.objectId?" wo-object-label-selected":"",i=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${r}" data-object-id="${O(t.objectId)}" data-group-id="${L(t.groupId??"")}" data-render-id="${O(t.renderId)}">
|
|
94
94
|
<text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*i}">${O(t.label)}</text>
|
|
95
95
|
<text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*i}">${O(t.secondaryLabel)}</text>
|
|
96
|
-
</g>`}function
|
|
96
|
+
</g>`}function Rn(e,t,n,r,i,o={}){let a=o.outlineOnly?"transparent":i.fill,l=i.tail??i.fill;switch(e.type){case"star":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${n}" r="${r*2.4}" fill="${i.glow??"url(#wo-star-glow)"}" opacity="0.84" />
|
|
97
97
|
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="${o.outlineOnly?1.5:1.4}" />`;case"comet":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<path d="M ${t-r*2} ${n+r*1.3} Q ${t-r*.7} ${n+r*.3} ${t-r*.45} ${n}" fill="none" stroke="${l}" stroke-width="${Math.max(2,r*.8)}" stroke-linecap="round" opacity="0.85" />
|
|
98
98
|
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${Nn(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"phenomenon":{let s=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return o.outlineOnly?s==="black-hole"||s==="nebula"||s==="galaxy"||s==="dwarf-galaxy"?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<polygon points="${Lt(t,n,r)}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:s==="black-hole"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.4}" ry="${r*.55}" fill="none" stroke="${i.accentRing??i.stroke}" stroke-width="3.5" />
|
|
99
99
|
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="2" />`:s==="galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.6}" ry="${r}" fill="${i.halo??"none"}" stroke="none" />
|
|
100
100
|
<ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${a}" stroke="${i.stroke}" stroke-width="1.2" />
|
|
101
101
|
<circle cx="${t}" cy="${n}" r="${r*.28}" fill="${i.core??"#fff"}" stroke="none" />`:s==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*1.6}" ry="${r*.55}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />
|
|
102
102
|
<circle cx="${t}" cy="${n}" r="${r*.25}" fill="${i.core??"#fff"}" stroke="none" />`:s==="nebula"?`<circle cx="${t}" cy="${n}" r="${r*2.2}" fill="${i.halo??"none"}" stroke="none" />
|
|
103
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />`:`<polygon points="${Lt(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`}}}function
|
|
103
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />`:`<polygon points="${Lt(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`}}}function Ha(e,t){if(!t.atmosphere)return"";let{object:n,x:r,y:i,radius:o}=e;return n.type!=="planet"&&n.type!=="moon"&&n.type!=="asteroid"?"":`<circle cx="${r}" cy="${i}" r="${o+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function Ka(e){if(!e.imageHref)return"";let t=Ja(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${L(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${L(_n(e))})" />`}function Za(e){let{x:t,y:n,radius:r}=e,i="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":i=`<circle cx="${t}" cy="${n}" r="${r}" />`;break;case"structure":i=`<polygon points="${Nn(t,n,r)}" />`;break;case"phenomenon":i=`<polygon points="${Lt(t,n,r)}" />`;break;default:return""}return`<clipPath id="${L(_n(e))}" clipPathUnits="userSpaceOnUse">${i}</clipPath>`}function Ja(e){let{object:t,x:n,y:r,radius:i}=e;switch(t.type){case"structure":return{x:n-i,y:r-i,width:i*2,height:i*2};case"phenomenon":return{x:n-i*1.2,y:r-i*1.2,width:i*2.4,height:i*2.4};default:return{x:n-i,y:r-i,width:i*2,height:i*2}}}function Qa(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=es(e.object.type,n,t),i=e.fillColor&&cs(e.fillColor)?e.fillColor:r.fill,o=zn(e.object.properties.albedo),a=zn(e.object.properties.temperature),l=ns(i,a,o,e.object.type),s=Ae(l,"#ffffff",.4)??r.stroke,c=is(e.object.properties.atmosphere),u=e.object.type==="star"?Bn(Ae(l,"#fff2cb",.4)??l,.82):void 0;return{fill:l,stroke:s,glow:u,atmosphere:c,tail:e.object.type==="comet"?Bn(Ae(l,"#ffffff",.5)??l,.72):void 0}}function es(e,t,n){switch(e){case"star":return{fill:n.starCore,stroke:n.starStroke};case"planet":return{fill:"#72b7ff",stroke:"#d8efff"};case"moon":return{fill:"#c7d7ea",stroke:"#f2f8ff"};case"belt":return{fill:"#d9aa74",stroke:"#f7d5aa"};case"asteroid":return{fill:"#a7a5b8",stroke:"#ebe5ff"};case"comet":return{fill:"#9ce7ff",stroke:"#e7fbff"};case"ring":return{fill:"#e59f7d",stroke:"#fff0d3"};case"structure":return{fill:n.accentStrong,stroke:"#fff2ea"};case"phenomenon":return ts(t)}}function ts(e){return e==="galaxy"?{fill:"rgba(165,125,255,0.55)",stroke:"rgba(210,185,255,0.75)",halo:"rgba(160,120,255,0.10)",core:"#ede0ff"}:e==="dwarf-galaxy"?{fill:"rgba(190,165,255,0.45)",stroke:"rgba(220,205,255,0.75)",core:"#ddd0ff"}:e==="black-hole"?{fill:"#040408",stroke:"#ff6a00",accentRing:"rgba(255,140,20,0.72)"}:e==="nebula"?{fill:"rgba(105,205,255,0.45)",stroke:"rgba(180,235,255,0.72)",halo:"rgba(100,200,255,0.08)"}:e==="void"?{fill:"#05080f",stroke:"rgba(130,160,255,0.4)"}:{fill:"#78ffd7",stroke:"#e9fff7"}}function ns(e,t,n,r){let i=e;if(t!==null){let o=rs(t,r);i=Ae(i,o,r==="star"?.42:.2)??i}if(n!==null){let o=Math.min(Math.max(n,0),1);i=Ae(i,o>=.5?"#ffffff":"#0f1520",Math.abs(o-.5)*.7)??i}return i}function rs(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function is(e){if(typeof e!="string"||!e.trim())return;let t=e.trim().toLowerCase();return t.includes("methane")?"rgba(134, 236, 255, 0.75)":t.includes("nitrogen")||t.includes("oxygen")||t.includes("air")?"rgba(122, 194, 255, 0.75)":t.includes("carbon")||t.includes("co2")?"rgba(255, 198, 138, 0.75)":t.includes("sulfur")?"rgba(255, 233, 138, 0.75)":"rgba(180, 222, 255, 0.68)"}function os(e){switch(e){case"presentation":return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"atlas-card":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"markdown":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!1}};default:return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}}}}function zn(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function _n(e){return`${e.renderId}-clip`}function Nn(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function Lt(e,t,n){return`${e},${t-n*1.2} ${e+n*.9},${t-n*.3} ${e+n*1.2},${t+n*.8} ${e},${t+n*1.2} ${e-n*1.1},${t+n*.3} ${e-n*.8},${t-n*.8}`}function as(e,t){let n=Array.from({length:10},(i,o)=>{let a=90+o*((e-180)/9);return`<line class="wo-grid" x1="${a}" y1="120" x2="${a}" y2="${t-70}" />`}).join(""),r=Array.from({length:6},(i,o)=>{let a=150+o*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${a}" x2="${e-56}" y2="${a}" />`}).join("");return`${n}${r}`}function ss(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function it(e){return e.type==="structure"||e.type==="phenomenon"}function Ae(e,t,n){let r=Pt(e),i=Pt(t);if(!r||!i)return;let o=Math.min(Math.max(n,0),1);return ls({r:Math.round(r.r+(i.r-r.r)*o),g:Math.round(r.g+(i.g-r.g)*o),b:Math.round(r.b+(i.b-r.b)*o)})}function Bn(e,t){let n=Pt(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function Pt(e){let t=e.trim();return/^#[0-9a-f]{6}$/i.test(t)?{r:Number.parseInt(t.slice(1,3),16),g:Number.parseInt(t.slice(3,5),16),b:Number.parseInt(t.slice(5,7),16)}:/^#[0-9a-f]{3}$/i.test(t)?{r:Number.parseInt(t[1]+t[1],16),g:Number.parseInt(t[2]+t[2],16),b:Number.parseInt(t[3]+t[3],16)}:null}function ls(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function cs(e){return!!e.trim()}function O(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function L(e){return O(e)}function Xn(e){return encodeURIComponent(JSON.stringify(e))}function Ft(e,t,n={}){return{version:"2.0",mode:Dt(t),scene:e,spatialScene:n.spatialScene,options:{viewMode:n.viewMode??Hn(Dt(t)),initialViewpointId:n.initialViewpointId,initialSelectionObjectId:n.initialSelectionObjectId,initialFilter:n.initialFilter??null,atlasState:n.atlasState??null,minimap:n.minimap}}}function Ct(e,t={}){let n={...e,options:{...e.options,theme:t.theme??e.options?.theme,layers:t.layers??e.options?.layers,subtitle:t.subtitle??e.options?.subtitle,preset:t.preset??e.options?.preset,viewMode:t.viewMode??e.options?.viewMode??Hn(Dt(e.mode)),initialViewpointId:t.initialViewpointId??e.options?.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId??e.options?.initialSelectionObjectId,initialFilter:t.initialFilter??e.options?.initialFilter??null,atlasState:t.atlasState??e.options?.atlasState??null,minimap:t.minimap??e.options?.minimap}},r=Y(e.scene,{theme:n.options?.theme,layers:n.options?.layers,filter:n.options?.initialFilter??null,selectedObjectId:n.options?.initialSelectionObjectId??null,subtitle:n.options?.subtitle,preset:n.options?.preset});return`<div class="${at(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${n.mode}" data-worldorbit-preset="${at(n.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${at(n.options?.initialViewpointId??"")}" data-worldorbit-payload="${at(Xn(n))}">${r}</div>`}function at(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function Dt(e){return!e||e==="interactive"?"interactive-2d":e}function Hn(e){return e==="interactive-3d"?"3d":"2d"}function fe(e,t={}){try{let n=oe(e),r=z(n.document,Kn(n,t)),i=t.mode??"static";if(i==="interactive"||i==="interactive-2d"||i==="interactive-3d"){let o=i==="interactive"?"interactive-2d":i;return Ct(Ft(r,o,{spatialScene:o==="interactive-3d"?He(n.document,Kn(n,t)):void 0,viewMode:o==="interactive-3d"?"3d":"2d",initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}),{className:t.className??"worldorbit-block worldorbit-interactive",theme:t.theme,layers:t.layers,subtitle:t.subtitle,preset:t.preset,viewMode:o==="interactive-3d"?"3d":"2d",initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap})}return`<figure class="${vs(t.className??"worldorbit-block worldorbit-static")}">${Y(r,t)}</figure>`}catch(n){if(t.strict)throw n;return Vt(n instanceof Error?n.message:String(n))}}function Vt(e){return`<pre class="worldorbit-error">WorldOrbit error: ${Zn(e)}</pre>`}function Zn(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">")}function vs(e){return Zn(e).replaceAll('"',""")}function Kn(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function Jn(e={}){return function(n){Qn(n,(r,i,o)=>{!o||i===-1||r.type!=="code"||!Is(r.lang)||(o.children[i]={type:"html",value:fe(r.value??"",e)})})}}function Qn(e,t,n=null){let r=e.children??[];for(let i=0;i<r.length;i+=1){let o=r[i];t(o,i,e),Qn(o,t,e)}n||t(e,-1,null)}function Is(e){return(e??"").trim().toLowerCase()==="worldorbit"}function er(e={}){return function(n){tr(n,(r,i,o)=>{if(!o||i===-1||r.type!=="element"||r.tagName!=="pre")return;let a=r.children?.[0];if(!a||a.type!=="element"||a.tagName!=="code"||!xs(a.properties?.className).includes("language-worldorbit"))return;let s=nr(a);o.children[i]={type:"raw",value:fe(s,e)}})}}function tr(e,t,n=null){let r=e.children??[];for(let i=0;i<r.length;i+=1){let o=r[i];t(o,i,e),tr(o,t,e)}n||t(e,-1,null)}function xs(e){return Array.isArray(e)?e.map(t=>String(t)):typeof e=="string"?e.split(/\s+/).filter(Boolean):[]}function nr(e){return e.type==="text"?e.value??"":(e.children??[]).map(t=>nr(t)).join("")}return pr($s);})();
|