worldorbit 3.2.2 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +546 -545
  2. package/dist/browser/core/dist/atlas-edit.js +146 -1
  3. package/dist/browser/core/dist/atlas-validate.js +105 -10
  4. package/dist/browser/core/dist/draft-parse.js +341 -16
  5. package/dist/browser/core/dist/draft.d.ts +2 -1
  6. package/dist/browser/core/dist/draft.js +25 -3
  7. package/dist/browser/core/dist/format.js +86 -4
  8. package/dist/browser/core/dist/index.d.ts +1 -0
  9. package/dist/browser/core/dist/index.js +1 -0
  10. package/dist/browser/core/dist/load.js +7 -2
  11. package/dist/browser/core/dist/normalize.js +1 -0
  12. package/dist/browser/core/dist/scene.js +11 -2
  13. package/dist/browser/core/dist/schema.js +11 -1
  14. package/dist/browser/core/dist/solver.d.ts +26 -0
  15. package/dist/browser/core/dist/solver.js +27 -0
  16. package/dist/browser/core/dist/types.d.ts +57 -3
  17. package/dist/browser/editor/dist/editor.js +844 -719
  18. package/dist/browser/editor/dist/types.d.ts +2 -1
  19. package/dist/browser/viewer/dist/minimap.js +9 -7
  20. package/dist/browser/viewer/dist/render.js +23 -19
  21. package/dist/browser/viewer/dist/runtime-3d.js +2 -0
  22. package/dist/browser/viewer/dist/viewer.js +7 -3
  23. package/dist/obsidian-plugin/README.md +141 -124
  24. package/dist/obsidian-plugin/main.js +31 -31
  25. package/dist/unpkg/core/dist/atlas-edit.js +146 -1
  26. package/dist/unpkg/core/dist/atlas-validate.js +105 -10
  27. package/dist/unpkg/core/dist/draft-parse.js +341 -16
  28. package/dist/unpkg/core/dist/draft.d.ts +2 -1
  29. package/dist/unpkg/core/dist/draft.js +25 -3
  30. package/dist/unpkg/core/dist/format.js +86 -4
  31. package/dist/unpkg/core/dist/index.d.ts +1 -0
  32. package/dist/unpkg/core/dist/index.js +1 -0
  33. package/dist/unpkg/core/dist/load.js +7 -2
  34. package/dist/unpkg/core/dist/normalize.js +1 -0
  35. package/dist/unpkg/core/dist/scene.js +11 -2
  36. package/dist/unpkg/core/dist/schema.js +11 -1
  37. package/dist/unpkg/core/dist/solver.d.ts +26 -0
  38. package/dist/unpkg/core/dist/solver.js +27 -0
  39. package/dist/unpkg/core/dist/types.d.ts +57 -3
  40. package/dist/unpkg/editor/dist/editor.js +844 -719
  41. package/dist/unpkg/editor/dist/types.d.ts +2 -1
  42. package/dist/unpkg/viewer/dist/minimap.js +9 -7
  43. package/dist/unpkg/viewer/dist/render.js +23 -19
  44. package/dist/unpkg/viewer/dist/runtime-3d.js +2 -0
  45. package/dist/unpkg/viewer/dist/viewer.js +7 -3
  46. package/dist/unpkg/worldorbit-core.min.js +10 -10
  47. package/dist/unpkg/worldorbit-editor.min.js +359 -332
  48. package/dist/unpkg/worldorbit-markdown.min.js +28 -28
  49. package/dist/unpkg/worldorbit-viewer.min.js +214 -214
  50. package/dist/unpkg/worldorbit.js +758 -40
  51. package/dist/unpkg/worldorbit.min.js +223 -223
  52. package/package.json +5 -1
  53. package/packages/core/dist/atlas-edit.js +146 -1
  54. package/packages/core/dist/atlas-validate.js +105 -10
  55. package/packages/core/dist/draft-parse.js +341 -16
  56. package/packages/core/dist/draft.d.ts +2 -1
  57. package/packages/core/dist/draft.js +25 -3
  58. package/packages/core/dist/format.js +86 -4
  59. package/packages/core/dist/index.d.ts +1 -0
  60. package/packages/core/dist/index.js +1 -0
  61. package/packages/core/dist/load.js +7 -2
  62. package/packages/core/dist/normalize.js +1 -0
  63. package/packages/core/dist/scene.js +11 -2
  64. package/packages/core/dist/schema.js +11 -1
  65. package/packages/core/dist/solver.d.ts +26 -0
  66. package/packages/core/dist/solver.js +27 -0
  67. package/packages/core/dist/types.d.ts +57 -3
  68. package/packages/editor/dist/editor.js +844 -719
  69. package/packages/editor/dist/types.d.ts +2 -1
  70. package/packages/viewer/dist/minimap.js +9 -7
  71. package/packages/viewer/dist/render.js +23 -19
  72. package/packages/viewer/dist/runtime-3d.js +2 -0
  73. package/packages/viewer/dist/viewer.js +7 -3
@@ -1,12 +1,12 @@
1
- "use strict";var WorldOrbitCore=(()=>{var dt=Object.defineProperty;var kr=Object.getOwnPropertyDescriptor;var Or=Object.getOwnPropertyNames;var Sr=Object.prototype.hasOwnProperty;var Pr=(e,t)=>{for(var n in t)dt(e,n,{get:t[n],enumerable:!0})},Mr=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Or(t))!Sr.call(e,i)&&i!==n&&dt(e,i,{get:()=>t[i],enumerable:!(r=kr(t,i))||r.enumerable});return e};var Tr=e=>Mr(dt({},"__esModule",{value:!0}),e);var ws={};Pr(ws,{WORLDORBIT_FIELD_KEYS:()=>Yt,WORLDORBIT_FIELD_SCHEMAS:()=>ft,WORLDORBIT_OBJECT_TYPES:()=>be,WorldOrbitError:()=>f,cloneAtlasDocument:()=>st,createDiagnostic:()=>Zt,createEmptyAtlasDocument:()=>Et,detectWorldOrbitSchemaVersion:()=>Bt,diagnosticFromError:()=>L,evaluateSpatialSceneAtTime:()=>On,extractWorldOrbitBlocks:()=>br,formatAtlasDocument:()=>Qe,formatDocument:()=>et,formatDraftDocument:()=>xt,getAtlasDocumentNode:()=>Ft,getFieldSchema:()=>D,isKnownFieldKey:()=>pt,listAtlasDocumentPaths:()=>sr,load:()=>ys,loadWorldOrbitSource:()=>lt,loadWorldOrbitSourceWithDiagnostics:()=>Ct,materializeAtlasDocument:()=>Pe,materializeDraftDocument:()=>Tn,normalizeDocument:()=>U,normalizeWithDiagnostics:()=>Jt,parse:()=>vr,parseSafe:()=>bs,parseWithDiagnostics:()=>Ne,parseWorldOrbit:()=>Z,parseWorldOrbitAtlas:()=>at,parseWorldOrbitDraft:()=>Zn,removeAtlasDocumentNode:()=>lr,render:()=>gs,renderDocumentToScene:()=>Y,renderDocumentToSpatialScene:()=>kn,resolveAtlasDiagnosticPath:()=>zt,resolveAtlasDiagnostics:()=>_t,rotatePoint:()=>ln,stringify:()=>vs,supportsObjectType:()=>mt,tokenizeLine:()=>qt,tokenizeLineDetailed:()=>oe,unitFamilyAllowsUnit:()=>ve,updateAtlasDocumentNode:()=>cr,upgradeDocumentToDraftV2:()=>Je,upgradeDocumentToV2:()=>Se,upsertAtlasDocumentNode:()=>Rt,validateAtlasDocumentWithDiagnostics:()=>ur,validateDocument:()=>W,validateDocumentWithDiagnostics:()=>Qt});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 ye=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],F=ye.filter(e=>e!=="system"),Dr=["star","planet","moon","asteroid","comet","structure","phenomenon"],Wt=["structure","phenomenon"],X=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Ar=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function $(e,t){return{key:e,...t}}var be=new Set(ye),ft=new Map([$("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:X}),$("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),$("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),$("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:X}),$("period",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"duration"}),$("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),$("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),$("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),$("at",{kind:"string",placement:!0,arity:"single",objectTypes:Wt}),$("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Wt}),$("free",{kind:"string",placement:!0,arity:"single",objectTypes:Ar}),$("kind",{kind:"string",placement:!1,arity:"single",objectTypes:F}),$("class",{kind:"string",placement:!1,arity:"single",objectTypes:F}),$("culture",{kind:"string",placement:!1,arity:"single",objectTypes:F}),$("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:ye}),$("color",{kind:"string",placement:!1,arity:"single",objectTypes:ye}),$("image",{kind:"string",placement:!1,arity:"single",objectTypes:Dr}),$("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:ye}),$("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"radius"}),$("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"mass"}),$("density",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),$("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),$("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),$("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:F}),$("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),$("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),$("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),$("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),$("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),$("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),$("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),$("on",{kind:"string",placement:!1,arity:"single",objectTypes:F}),$("source",{kind:"string",placement:!1,arity:"single",objectTypes:F}),$("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"duration"})].map(e=>[e.key,e])),Yt=new Set(ft.keys());function D(e){return ft.get(e)}function pt(e){return Yt.has(e)}function mt(e,t){return e.objectTypes.includes(t)}function ve(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 qt(e){return oe(e).map(t=>t.value)}function oe(e,t={}){let n=[],r=t.columnOffset??0,i="",a=null,o=!1,c=!1,s=null,l=()=>{a!==null&&(n.push({value:i,column:a,quoted:o}),i="",a=null,o=!1)};for(let u=0;u<e.length;u++){let d=e[u],p=r+u+1;if(c&&d==="\\"){let m=e[u+1];if(m==='"'||m==="\\"){i+=m,u++;continue}}if(d==='"'){c?c=!1:(a===null&&(a=p),o=!0,s=p,c=!0);continue}if(!c&&/\s/.test(d)){l();continue}a===null&&(a=p),i+=d}if(c)throw new f("Unclosed quote in line",t.line,s??r+e.length);return l(),n}function Re(e){return e.match(/^\s*/)?.[0].length??0}function Z(e){let t=e.split(/\r?\n/),n=[],r=null,i=null,a=!1,o=!1,c=null,s=null,l=null,u=null;for(let d=0;d<t.length;d++){let p=t[d],m=d+1;if(!p.trim())continue;let g=Re(p),h=oe(p.slice(g),{line:m,columnOffset:g});if(h.length!==0){if(g===0){if(a=!1,o=!1,c=null,s=null,l=null,u=null,h.length>=1&&h[0].value==="theme"){o=!0,s=0,r={type:"theme",preset:h.length>=2?h[1].value:null,blocks:[],location:{line:m,column:h[0].column}};continue}let I=Lr(h,m);n.push(I),i=I;continue}if(o){if(h.length>=2&&h[0].value==="preset"&&(!l||g<=l)){r&&(r.preset=h[1].value);continue}u&&l!==null&&g>l?u.fields.push(Rr(h,m)):(l=g,u={type:"theme-block",target:h[0].value,fields:[],location:{line:m,column:h[0].column}},r?.blocks.push(u));continue}if(!i)throw new f("Indented line without parent object",m,g+1);if(h.length===1&&h[0].value==="info"){a=!0,c=g;continue}a&&g<=(c??0)&&(a=!1),a?i.infoEntries.push(_r(h,m)):i.blockFields.push(Fr(h,m))}}return{type:"document",theme:r,objects:n}}function Lr(e,t){if(e.length<2)throw new f("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!be.has(n.value))throw new f(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:Er(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function Er(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],a=D(i.value);if(!a)throw new f(`Unknown field "${i.value}"`,t,i.column);r++;let o=[];if(a.arity==="multiple")for(;r<e.length&&!pt(e[r].value);)o.push(e[r]),r++;else{let c=e[r];c&&(o.push(c),r++)}if(o.length===0)throw new f(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:o.map(c=>c.value),location:{line:t,column:i.column}})}return n}function Fr(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 Rr(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 _r(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 Gt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,zr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Nr=/^[A-Za-z][A-Za-z0-9+.-]*:/;function U(e){let t=null,n=[],r=e.theme?Br(e.theme):null;for(let i of e.objects){let a=Vr(i);if(i.objectType==="system"){if(t)throw f.fromLocation("Only one system object is allowed",i.location);t=a}else n.push(a)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",theme:r,system:t,groups:[],relations:[],events:[],objects:n}}function Br(e){let t={};for(let n of e.blocks){let r=Ht(n.fields);t[n.target]=Cr(r)}return{preset:e.preset,styles:t}}function Cr(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 a=Number(i);if(!Number.isNaN(a)&&i.trim()!==""){t[n]=a;continue}}t[n]=r.values.join(" ")}return t}function Vr(e){let t=[...e.inlineFields,...e.blockFields];Ur(e.objectType,t);let n=Ht(t),r=Wr(e.objectType,n),i=Yr(n),a=Hr(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:a}:{type:e.objectType,id:e.name,properties:i,placement:r,info:a}}function Ur(e,t){for(let n of t){let r=D(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(!mt(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 Ht(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 Wr(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),a=t.has("free"),o=[n,r,i,a].filter(Boolean).length;if(o>1){let c=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw f.fromLocation("Object has multiple placement modes",c?.location)}if(e==="system"&&o>0)throw f.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:_e(t,"orbit"),distance:ue(t,"distance"),semiMajor:ue(t,"semiMajor"),eccentricity:Zr(t,"eccentricity"),period:ue(t,"period"),angle:ue(t,"angle"),inclination:ue(t,"inclination"),phase:ue(t,"phase")};if(r){let c=ze(t,"at"),s=_e(t,"at");return{mode:"at",target:s,reference:Kr(s,c.location)}}if(i)return{mode:"surface",target:_e(t,"surface")};if(a){let c=_e(t,"free"),s=Xr(c);return{mode:"free",distance:s??void 0,descriptor:s?void 0:c}}return null}function Yr(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]=Jr(r);break;case"number":t[n]=Xt(de(r),n,r.location);break;case"unit":t[n]=Kt(de(r),r.location,n);break;case"string":t[n]=qr(n,r);break}}return t}function qr(e,t){let n=t.values.join(" ").trim();return e==="image"&&Gr(n,t.location),n}function Gr(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(Nr);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 Hr(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 Kr(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 Kt(e,t,n){let r=e.match(Gt);if(!r)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=D(n);if(a?.unitFamily&&!ve(a.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Xr(e){let t=e.match(Gt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function ue(e,t){if(!e.has(t))return;let n=ze(e,t);return Kt(de(n),n.location,t)}function Zr(e,t){if(!e.has(t))return;let n=ze(e,t);return Xt(de(n),t,n.location)}function Xt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Jr(e){let t=de(e).toLowerCase(),n=zr.get(t);if(n===void 0)throw f.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function ze(e,t){let n=e.get(t);if(!n)throw new f(`Missing value for key "${t}"`);return n}function _e(e,t){return de(ze(e,t))}function de(e){if(e.values.length!==1)throw f.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Qr=new Set(["star","planet","moon","asteroid","comet"]);function W(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||!Qr.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"&&ei(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&ti(r,r.placement.reference,t))}}function ei(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 ti(e,t,n){if(!n.has(t.objectId))throw new f(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function Zt(e){return{...e}}function L(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)}}function Ne(e){let t;try{t=Z(e)}catch(r){return{ok:!1,value:null,diagnostics:[L(r,"parse")]}}let n;try{n=U(t)}catch(r){return{ok:!1,value:null,diagnostics:[L(r,"normalize")]}}try{W(n)}catch(r){return{ok:!1,value:null,diagnostics:[L(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function Jt(e){try{return{ok:!0,value:U(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[L(t,"normalize")]}}}function Qt(e){try{return W(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[L(t,"validate")]}}}var we=1495978707e-1,ni=6371,ri=71492,ii=695700,ai=63241.077,oi=206264.806,si=206264806,sn=.68,ci=.2,cn=28;function Y(e,t={}){let n=di(t),r=n.width,i=n.height,a=n.padding,o=ui(e),c=pi(e,t.projection),s=vt(t.camera??null),l=bt(c,s),u=bi(o),d=gi(o,t.scaleModel,t.bodyScaleMode),p=e.system?.id??null,m=t.activeEventId??null,g=li(e.objects,e.events??[],m),h=vi(g,r,i,a,u,d),I=new Map(g.map(v=>[v.id,v])),P=na(g,I),b=new Map,k=[],T=[],B=[],A=[],C=[],G=new Map,ie=new Map;for(let v of g){let E=v.placement;if(!E){B.push(v);continue}if(E.mode==="orbit"){rn(ie,E.target,v);continue}if(E.mode==="surface"){rn(G,E.target,v);continue}if(E.mode==="at"){C.push(v);continue}A.push(v)}let M=A.length>0?r*.42:r/2,le=i/2,_={orbitChildren:ie,surfaceChildren:G,objectMap:I,spacingFactor:u,projection:l,scaleModel:d,sceneMetricScale:h},V=B.find(v=>v.type==="star")??B[0]??null;V&&gt(V,M,le,0,b,k,T,_);let H=B.filter(v=>v.id!==V?.id);if(H.length>0){let v=Math.min(r,i)*.28*u*d.orbitDistanceMultiplier;H.forEach((E,S)=>{let ut=ke(S,H.length,-Math.PI/2),ae=Oe(ut,v,l,1);gt(E,M+ae.x,le+ae.y,0,b,k,T,_)})}A.forEach((v,E)=>{let S=r-a-140-ca(v.placement?.mode==="free"?v.placement.distance:void 0,d,h),ut=Math.max(76,(i-a*2-180)/Math.max(1,A.length)*u)*d.freePlacementMultiplier,ae=a+92+E*ut;b.set(v.id,{object:v,x:S,y:ae,radius:We(v,0,d,h),sortKey:qe(S,ae,0)}),T.push({object:v,groupId:P.groupIds.get(v.id)??null,x1:S-60,y1:ae,x2:S-18,y2:ae,mode:"free"}),Ve(v,b,k,T,_,1)}),C.forEach((v,E)=>{if(b.has(v.id)||!v.placement||v.placement.mode!=="at")return;let S=ea(v.placement.reference,b,I,E,C.length,r,i,a,_);b.set(v.id,{object:v,x:S.x,y:S.y,radius:We(v,2,d,h),sortKey:qe(S.x,S.y,2),anchorX:S.anchorX,anchorY:S.anchorY}),S.anchorX!==void 0&&S.anchorY!==void 0&&T.push({object:v,groupId:P.groupIds.get(v.id)??null,x1:S.anchorX,y1:S.anchorY,x2:S.x,y2:S.y,mode:"at"}),Ve(v,b,k,T,_,2)});let K=[...b.values()].map(v=>wi(v,d,P)),Le=k.map(v=>Ii(v,P.groupIds.get(v.object.id)??null)),Ee=T.map(v=>$i(v)),Fe=xi(K,r,i,d.labelMultiplier),Vt=Di(e,K),Ut=Ai(e.events??[],K,m),wr=Pi(Le,Vt,Ut,Ee,K,Fe),Ir=Mi(K,Le,Ee,Fe,P,d.labelMultiplier),$r=Ti(e,K),xr=Li(e,c,n.preset,P,I),jr=Yi(r,i,K,Le,Ee,Fe,d.labelMultiplier);return{width:r,height:i,padding:a,renderPreset:n.preset,projection:c,renderProjection:l,camera:s,scaleModel:d,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:hi(c,l,o,s),systemId:p,viewMode:c,layoutPreset:o,metadata:{format:e.format,version:e.version,view:c,renderProjection:l,scale:String(e.system?.properties.scale??o),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:jr,layers:wr,groups:Ir,semanticGroups:$r,viewpoints:xr,events:Ut,activeEventId:m,objects:K,orbitVisuals:Le,relations:Vt,leaders:Ee,labels:Fe}}function ln(e,t,n){let r=Ge(n),i=Math.cos(r),a=Math.sin(r),o=e.x-t.x,c=e.y-t.y;return{x:t.x+o*i-c*a,y:t.y+o*a+c*i}}function li(e,t,n){let r=e.map(c=>structuredClone(c));if(!n)return r;let i=t.find(c=>c.id===n);if(!i)return r;let a=new Map(r.map(c=>[c.id,c])),o=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(c=>c.objectId)]);for(let c of o){let s=a.get(c);s&&(i.epoch&&(s.epoch=i.epoch),i.referencePlane&&(s.referencePlane=i.referencePlane))}for(let c of i.positions){let s=a.get(c.objectId);s&&(c.placement&&(s.placement=structuredClone(c.placement)),c.inner&&(s.properties.inner={...c.inner}),c.outer&&(s.properties.outer={...c.outer}),c.epoch&&(s.epoch=c.epoch),c.referencePlane&&(s.referencePlane=c.referencePlane))}return r}function ui(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 di(e){let t=fi(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function fi(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 pi(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return fn(n)??"topdown"}function bt(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 vt(e){if(!e)return null;let t={azimuth:ht(e.azimuth),elevation:ht(e.elevation),roll:ht(e.roll),distance:mi(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function ht(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function mi(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function hi(e,t,n,r){let i=[`${an(e)} view`,`${an(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let a=[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);a.length>0&&i.push(`camera ${a.join(" / ")}`)}return i.join(" - ")}function gi(e,t,n){return{...yi(e),...n?{bodyScaleMode:n}:{},...t}}function yi(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 bi(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function vi(e,t,n,r,i,a){let o=[],c=[];for(let m of e){let g=ua(m);g!==null&&g>0&&c.push(g);let h=m.placement;if(h){if(h.mode==="orbit"){let I=J(h.semiMajor??h.distance??null);I!==null&&I>0&&o.push(I);continue}if(h.mode==="free"){let I=J(h.distance??null);I!==null&&I>0&&o.push(I)}}}let s=Math.max(...o,0),l=Math.max(...c,0),u=Math.max(s,l*6,0),d=u+Math.max(Math.sqrt(u),l*2,s>0?.25:0);return d<=0?{pixelsPerMetric:null,hasExplicitScale:!1}:{pixelsPerMetric:Math.max(Math.min(t,n)/2-r-24,120)*i*a.orbitDistanceMultiplier/d,hasExplicitScale:!0}}function wi(e,t,n){let{object:r,x:i,y:a,radius:o,sortKey:c,anchorX:s,anchorY:l}=e,u=r.renderHints?.renderPriority??0;return{renderId:fe(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:a,radius:o,visualRadius:sa(r,o,t),sortKey:c+u*.001,anchorX:s,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:da(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function Ii(e,t){return{renderId:`${fe(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 $i(e){return{renderId:`${fe(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 xi(e,t,n,r){let i=[],a=[],o=new Map(e.map(s=>[s.objectId,s])),c=[...e].filter(s=>!s.hidden&&s.object.renderHints?.renderLabel!==!1).sort(ji);for(let s of c){let l=ki(s,o,a,t,n,r)??dn(s,un(s,o.get(s.parentId??"")??null,n),0,r);a.push(yn(s,l,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:l.x,y:l.labelY,secondaryY:l.secondaryY,textAnchor:l.textAnchor,direction:l.direction,hidden:s.hidden})}return i}function ji(e,t){let n=en(e)-en(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 en(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 ki(e,t,n,r,i,a){for(let o of Oi(e,t,r,i)){let c=o==="left"||o==="right"?4:6;for(let s=0;s<=c;s+=1){let l=dn(e,o,s,a),u=yn(e,l,a);if(!n.some(d=>aa(d,u)))return l}}return null}function Oi(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,a=un(e,i,r),o=a==="below"?"above":"below",c=Si(e,i,n),s=c==="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"?[c,a,s,o]:[a,c,o,s]}function un(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 Si(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 dn(e,t,n,r){let i=14*r;switch(t){case"above":{let a=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:a,secondaryY:a-16*r,textAnchor:"middle",direction:t}}case"below":{let a=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:a,secondaryY:a+16*r,textAnchor:"middle",direction:t}}case"left":{let a=e.x-(e.visualRadius+16*r+n*i),o=e.y-4*r;return{x:a,labelY:o,secondaryY:o+16*r,textAnchor:"end",direction:t}}case"right":{let a=e.x+e.visualRadius+16*r+n*i,o=e.y-4*r;return{x:a,labelY:o,secondaryY:o+16*r,textAnchor:"start",direction:t}}}}function Pi(e,t,n,r,i,a){let o=e.filter(s=>!s.hidden&&!!s.backArcPath).map(s=>s.renderId),c=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:o},{id:"orbits-front",renderIds:c},{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:a.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function Mi(e,t,n,r,i,a){let o=new Map,c=s=>{if(!s)return null;let l=o.get(s);if(l)return l;let u=i.groupRoots.get(s)??null,d={renderId:s,rootObjectId:u,label:u??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:je(0,0,0,0)};return o.set(s,d),d};for(let s of e){let l=c(s.groupId);l&&!s.hidden&&l.objectIds.push(s.objectId)}for(let s of t){let l=c(s.groupId);l&&!s.hidden&&l.orbitIds.push(s.objectId)}for(let s of n){let l=c(s.groupId);l&&!s.hidden&&l.leaderIds.push(s.objectId)}for(let s of r){let l=c(s.groupId);l&&!s.hidden&&l.labelIds.push(s.objectId)}for(let s of o.values())s.contentBounds=ra(s,e,t,n,r,a);return[...o.values()].sort((s,l)=>s.label.localeCompare(l.label))}function Ti(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 Di(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),a=n.get(r.to);return{renderId:`${fe(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:a?.x??0,y2:a?.y??0,hidden:r.hidden||!i||!a||i.hidden||a.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function Ai(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let a=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],o=a.map(l=>r.get(l)).filter(Boolean),c=o.length>0?o.reduce((l,u)=>l+u.x,0)/o.length:0,s=o.length>0?o.reduce((l,u)=>l+u.y,0)/o.length:0;return{renderId:`${fe(i.id)}-event`,eventId:i.id,event:i,objectIds:a,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:c,y:s,hidden:i.hidden||o.length===0||o.every(l=>l.hidden)||n!==null&&i.id!==n}}).sort((i,a)=>i.event.id.localeCompare(a.event.id))}function Li(e,t,n,r,i){let a=Ei(e,t,n),o=new Map;for(let[l,u]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[d,p,...m]=l.split(".");if(d!=="viewpoint"||!p||m.length===0)continue;let g=Vi(p);if(!g)continue;let h=m.join(".").toLowerCase(),I=o.get(g)??{id:g};Fi(I,h,u,e,t,n,r,i),o.set(g,I)}let c=[...o.values()].map(l=>Ri(l,t,n,i)).filter(Boolean),s=c.findIndex(l=>l.id===a.id);return s>=0?c.splice(s,1,{...a,...c[s],layers:{...a.layers,...c[s].layers},filter:c[s].filter??a.filter,generated:!1}):c.unshift(a),c.sort((l,u)=>l.id==="overview"?-1:u.id==="overview"?1:l.label.localeCompare(u.label))}function Ei(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",a=vt(null),o=bt(t,a);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:o,camera:a,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Fi(e,t,n,r,i,a,o,c){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=xe(s);return;case"projection":case"view":e.projection=fn(s)??i;return;case"preset":e.preset=zi(s)??a;return;case"rotation":case"angle":e.rotationDeg=Ie(s)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Ce(),azimuth:Ie(s)};return;case"camera.elevation":e.camera={...e.camera??Ce(),elevation:Ie(s)};return;case"camera.roll":e.camera={...e.camera??Ce(),roll:Ie(s)};return;case"camera.distance":e.camera={...e.camera??Ce(),distance:tn(s)};return;case"zoom":case"scale":e.scale=tn(s);return;case"layers":e.layers=Ni(s);return;case"query":e.filter={...e.filter??Be(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??Be(),objectTypes:Bi(s)};return;case"tags":e.filter={...e.filter??Be(),tags:xe(s)};return;case"groups":e.filter={...e.filter??Be(),groupIds:Ci(s,r,o,c)};return}}function Ri(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,a=e.select&&r.has(e.select)?e.select:i,o=_i(e.filter),c=e.label?.trim()||Ui(e.id),s=e.projection??t,l=vt(e.camera??null),u=bt(s,l);return{id:e.id,label:c,summary:e.summary?.trim()||Wi(c,i,o),objectId:i,selectedObjectId:a,eventIds:[...new Set(e.eventIds??[])],projection:s,renderProjection:u,camera:l,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:o,generated:!1}}function Be(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Ce(){return{azimuth:null,elevation:null,roll:null,distance:null}}function _i(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 fn(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function zi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function Ie(e){let t=Number(e);return Number.isFinite(t)?t:null}function tn(e){let t=Ie(e);return t!==null&&t>0?t:null}function Ni(e){let t={};for(let n of xe(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 Bi(e){return xe(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Ci(e,t,n,r){return xe(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.schemaVersion==="2.6"||t.groups.some(a=>a.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??$e(i):(r.has(i),$e(i)))}function xe(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Vi(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ui(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Wi(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 Yi(e,t,n,r,i,a,o){let c=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,d=(p,m)=>{c=Math.min(c,p),s=Math.min(s,m),l=Math.max(l,p),u=Math.max(u,m)};for(let p of r)p.hidden||pn(p,d);for(let p of i)p.hidden||(d(p.x1,p.y1),d(p.x2,p.y2));for(let p of n)p.hidden||mn(p,d);for(let p of a)p.hidden||hn(p,d,o);return!Number.isFinite(c)||!Number.isFinite(s)?je(0,0,e,t):je(c,s,l,u)}function pn(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,a=vn(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,cn*2);for(let o of a)t(o.x-n,o.y-n),t(o.x+n,o.y+n)}function je(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 mn(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 hn(e,t,n){let r=bn(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 gt(e,t,n,r,i,a,o,c){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:We(e,r,c.scaleModel,c.sceneMetricScale),sortKey:qe(t,n,r)}),Ve(e,i,a,o,c,r+1))}function Ve(e,t,n,r,i,a){let o=t.get(e.id);if(!o)return;let c=[...i.orbitChildren.get(e.id)??[]].sort(qi),s=Gi(c,o.radius,i.spacingFactor,i.scaleModel,i.sceneMetricScale),l=Xi(c,s);c.forEach((d,p)=>{let m=Hi(d,p,c.length,o,s,l[p]??s.innerPx,i);n.push({object:d,parentId:e.id,kind:m.kind,cx:m.cx,cy:m.cy,radius:m.radius,rx:m.rx,ry:m.ry,rotationDeg:m.rotationDeg,band:m.band,bandThickness:m.bandThickness,frontArcPath:m.frontArcPath,backArcPath:m.backArcPath}),gt(d,m.objectX,m.objectY,a,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((d,p)=>{let m=ke(p,u.length,-Math.PI/3),g=28*i.spacingFactor,h=Oe(m,o.radius,i.projection,i.projection==="isometric"?.9:1),I=Oe(m,o.radius+g,i.projection,i.projection==="isometric"?.9:1),P=o.x+h.x,b=o.y+h.y,k=o.x+I.x,T=o.y+I.y;t.set(d.id,{object:d,x:k,y:T,radius:We(d,a+1,i.scaleModel,i.sceneMetricScale),sortKey:qe(k,T,a+1),anchorX:P,anchorY:b}),r.push({object:d,groupId:i.objectMap.has(d.id)?$e(ia(d,i.objectMap)):null,x1:P,y1:b,x2:k,y2:T,mode:"surface"}),Ve(d,t,n,r,i,a+1)})}function qi(e,t){let n=Ue(e),r=Ue(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 Gi(e,t,n,r,i){let a=e.map(m=>Ue(m)),o=a.filter(m=>m!==null),c=r.bodyScaleMode==="strict"?Math.max(2,8*n*r.orbitDistanceMultiplier):(e.length>2?54:64)*n*r.orbitDistanceMultiplier*.42,s=t+Math.max(c*1.2,24*n),l=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(o.length===0)return{metrics:a,minMetric:0,maxMetric:0,metricSpread:0,innerPx:s,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:c,pixelsPerMetric:i.pixelsPerMetric};let u=Math.min(...o),d=Math.max(...o),p=d-u;return{metrics:a,minMetric:u,maxMetric:d,metricSpread:p,innerPx:s,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:c,pixelsPerMetric:i.pixelsPerMetric}}function Hi(e,t,n,r,i,a,o){let c=e.placement,s=e.type==="belt"||e.type==="ring";if(!c||c.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*o.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-G}}let l=O(typeof c.eccentricity=="number"?c.eccentricity:0,0,.92),u=a,d=Math.max(u*Math.sqrt(1-l*l),u*.18),p=yt(c.inclination)??0,m=o.projection==="isometric"?Math.max(ci,Math.cos(Ge(p)))*sn:1,g=Math.max(d*m,u*.14),h=yt(c.angle)??0,I=u*l,P=In(-I,0,h),b=r.x+P.x,k=r.y+P.y,T=Ji(c.phase,t,n),B=wn(b,k,u,g,h,T),A=o.projection==="topdown"&&l<=1e-4&&Math.abs(h)<=1e-4,C=s?Qi(e,u,i,o.scaleModel):void 0;return{kind:A?"circle":"ellipse",cx:A?r.x:b,cy:A?r.y:k,radius:A?u:void 0,rx:A?void 0:u,ry:A?void 0:g,rotationDeg:h,band:s,bandThickness:C,frontArcPath:o.projection==="isometric"||s?nn(b,k,u,g,h,0,Math.PI):void 0,backArcPath:o.projection==="isometric"||s?nn(b,k,u,g,h,Math.PI,Math.PI*2):void 0,objectX:B.x,objectY:B.y}}function Ki(e,t){return t.pixelsPerMetric!==null?e*t.pixelsPerMetric:t.innerPx+t.stepPx*Zi(Math.max(e,0)+1)}function Xi(e,t){let n=[];return e.forEach((r,i)=>{let a=Ue(r),o=t.innerPx+i*t.stepPx,c=a===null?o:Ki(a,t),s=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(c,s))}),n}function Ue(e){return!e.placement||e.placement.mode!=="orbit"?null:J(e.placement.semiMajor??e.placement.distance??null)}function Zi(e){return Math.log(e)/Math.log(2)}function Ji(e,t,n){let r=e?yt(e):null;return r!==null?Ge(r-90):ke(t,n,-Math.PI/2)}function Qi(e,t,n,r){let i=J(Ye(e.properties.inner)),a=J(Ye(e.properties.outer));if(i!==null&&a!==null){let c=Math.abs(a-i);if(n.pixelsPerMetric!==null){let l=c*n.pixelsPerMetric;return r.bodyScaleMode==="strict"?Math.max(l*r.ringThicknessMultiplier,1):O(Math.max(l*r.ringThicknessMultiplier,8),8,54)}if(n.metricSpread>0)return O(c/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(i,a),1e-4);return O(c/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function ea(e,t,n,r,i,a,o,c,s){if(e.kind==="lagrange")return ta(e,t,n,a,o);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let u=ke(r,i,Math.PI/5),d=(l.radius+36)*s.scaleModel.labelMultiplier,p=Oe(u,d,s.projection,s.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let u=ke(r,i,Math.PI/6),d=(l.radius+36)*s.scaleModel.labelMultiplier,p=Oe(u,d,s.projection,s.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}return{x:a-c-170,y:o-c-86-r*58*s.scaleModel.freePlacementMultiplier}}function ta(e,t,n,r,i){let a=e.secondary?t.get(e.primary):oa(e.primary,t,n),o=t.get(e.secondary??e.primary);if(!a||!o)return{x:r*.7,y:i*.25};let c=o.x-a.x,s=o.y-a.y,l=Math.hypot(c,s)||1,u=c/l,d=s/l,p=-d,m=u,g=O(l*.25,24,68);switch(e.point){case"L1":return{x:o.x-u*g,y:o.y-d*g,anchorX:o.x,anchorY:o.y};case"L2":return{x:o.x+u*g,y:o.y+d*g,anchorX:o.x,anchorY:o.y};case"L3":return{x:a.x-u*g,y:a.y-d*g,anchorX:a.x,anchorY:a.y};case"L4":return{x:o.x+(u*.5-p*.8660254)*g,y:o.y+(d*.5-m*.8660254)*g,anchorX:o.x,anchorY:o.y};case"L5":return{x:o.x+(u*.5+p*.8660254)*g,y:o.y+(d*.5+m*.8660254)*g,anchorX:o.x,anchorY:o.y}}}function na(e,t){let n=new Map,r=new Map;for(let l of e){let u=gn(l,t);if(n.set(l.id,u),u){let d=r.get(u);d?d.push(l.id):r.set(u,[l.id])}r.has(l.id)||r.set(l.id,[])}let i=new Map,a=new Map,o=new Map,c=l=>{let u=i.get(l);if(u)return u;let d=new Set,p=[],m=n.get(l)??null;for(;m&&!d.has(m);)p.push(m),d.add(m),m=n.get(m)??null;return i.set(l,p),p},s=l=>{let u=o.get(a.get(l)??"");if(u)return u;let d=n.get(l)??null,p=t.get(l),m=l;return p?.placement&&p.placement.mode!=="free"&&d&&(m=s(d)),m};for(let l of e){c(l.id);let u=s(l.id),d=$e(u);a.set(l.id,d),o.set(d,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:a,groupRoots:o}}function gn(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 ra(e,t,n,r,i,a){let o=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=(d,p)=>{o=Math.min(o,d),c=Math.min(c,p),s=Math.max(s,d),l=Math.max(l,p)};for(let d of t)!d.hidden&&e.objectIds.includes(d.objectId)&&mn(d,u);for(let d of n)!d.hidden&&e.orbitIds.includes(d.objectId)&&pn(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)&&hn(d,u,a);return!Number.isFinite(o)||!Number.isFinite(c)?je(0,0,0,0):je(o,c,s,l)}function ia(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=gn(n,t);if(!i)break;let a=t.get(i);if(!a)break;n=a}return n.id}function yn(e,t,n){return bn(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function bn(e,t,n,r,i,a,o,c){let s=fa(a,o,c),l=s*2,u=i==="above"?18:12,d=i==="above"?8:12,p=e-s,m=e+s;return r==="start"?(p=e,m=e+l):r==="end"&&(p=e-l,m=e),{left:p,right:m,top:Math.min(t,n)-u,bottom:Math.max(t,n)+d}}function aa(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function oa(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function We(e,t,n,r){let i=la(e.properties.radius,n,r);if(i!==null)return i;let a=n.bodyRadiusMultiplier;switch(e.type){case"star":return O((t===0?28:20)*a,n.minBodyRadius,n.maxBodyRadius);case"planet":return O(12*a,n.minBodyRadius,n.maxBodyRadius);case"moon":return O(7*a,n.minBodyRadius,n.maxBodyRadius);case"belt":return O(5*a,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return O(5*a,n.minBodyRadius,n.maxBodyRadius);case"comet":return O(6*a,n.minBodyRadius,n.maxBodyRadius);case"ring":return O(5*a,n.minBodyRadius,n.maxBodyRadius);case"structure":return O(6*a,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return O(8*a,n.minBodyRadius,n.maxBodyRadius)}}function sa(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 J(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/we;case"m":return e.value/1e3/we;case"ly":return e.value*ai;case"pc":return e.value*oi;case"kpc":return e.value*si;case"re":return e.value*ni/we;case"rj":return e.value*ri/we;case"sol":return e.value*ii/we;default:return e.value}}function ca(e,t,n){let r=J(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):O(i,0,420)}return O(r*96*t.freePlacementMultiplier,0,420)}function la(e,t,n){let r=Ye(e);if(!r)return null;let i=J(r);if(n.pixelsPerMetric!==null&&i!==null&&i>0){let o=i*n.pixelsPerMetric*t.bodyRadiusMultiplier;return t.bodyScaleMode==="strict"?Math.max(o,.1):O(Math.max(o,t.minBodyRadius),t.minBodyRadius,t.maxBodyRadius)}let a;switch(r.unit){case"sol":a=O(r.value*22,14,40);break;case"re":a=O(r.value*10,6,18);break;case"km":a=O(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:a=O(r.value*4,4,20);break}return O(a*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function ua(e){return J(Ye(e.properties.radius))}function Ye(e){return!e||typeof e!="object"||!("value"in e)?null:e}function yt(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ke(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function nn(e,t,n,r,i,a,o){let c=vn(e,t,n,r,i,a,o,cn);return c.length===0?"":c.map((s,l)=>`${l===0?"M":"L"} ${on(s.x)} ${on(s.y)}`).join(" ")}function vn(e,t,n,r,i,a,o,c){let s=[];for(let l=0;l<=c;l+=1){let u=a+(o-a)*l/c;s.push(wn(e,t,n,r,i,u))}return s}function wn(e,t,n,r,i,a){let o=n*Math.cos(a),c=r*Math.sin(a),s=In(o,c,i);return{x:e+s.x,y:t+s.y}}function In(e,t,n){let r=Ge(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function Oe(e,t,n,r){let i=n==="isometric"?sn*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function qe(e,t,n){return t*1e3+e+n*.01}function O(e,t,n){return Math.min(Math.max(e,t),n)}function rn(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function fe(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function $e(e){return`${fe(e)}-group`}function da(e){return typeof e=="string"&&e.trim()?e:void 0}function fa(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 an(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Ge(e){return e*Math.PI/180}function on(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var jn=86400,He=jn*365.25,Ke=18,$n=180;function kn(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=Y(e,n),i=ga(r.layoutPreset,t.spatialScaleModel),a={x:r.contentBounds.centerX,y:r.contentBounds.centerY},o=new Map(r.objects.map(h=>[h.objectId,h])),c=new Map(r.orbitVisuals.map(h=>[h.objectId,h])),s=new Map;for(let h of r.objects){let I=h.object.placement;!I||I.mode!=="orbit"||s.set(h.objectId,It(I))}let l=Math.min(...[...s.values()].filter(h=>Number.isFinite(h)&&h>0))||1,u=new Map,d=r.objects.map(h=>pa(h,r,a,o,c,i,u,l)),p=new Map(d.map(h=>[h.objectId,h])),m=r.orbitVisuals.map(h=>ma(h,p,l,r.activeEventId!==null)),g=d.map(h=>({objectId:h.objectId,center:{...h.position},radius:h.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:ba(d),semanticGroups:r.semanticGroups,viewpoints:r.viewpoints,activeEventId:r.activeEventId,timeFrozen:r.activeEventId!==null,objects:d,orbits:m,focusTargets:g}}function pa(e,t,n,r,i,a,o,c){let s=Xe(e,t,n,r,i,o),l=$t(e.object,i.get(e.objectId),c,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:pe(e.radius*a.bodyRadiusMultiplier,a.minBodyRadius,a.maxBodyRadius),visualRadius:pe(e.visualRadius*a.bodyRadiusMultiplier,a.minBodyRadius,a.maxBodyRadius+24),label:e.label,secondaryLabel:e.secondaryLabel,fillColor:e.fillColor,imageHref:e.imageHref,hidden:e.hidden,motion:l}}function ma(e,t,n,r){let i=t.get(e.objectId),a=t.get(e.parentId);return{objectId:e.objectId,object:e.object,parentId:e.parentId,groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),center:a?.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??Ze(e.object.placement?.mode==="orbit"?e.object.placement.inclination:void 0)??0,band:e.band,bandThickness:e.bandThickness,hidden:e.hidden,motion:i?.motion??$t(e.object,e,n,r)}}function Xe(e,t,n,r,i,a){let o=a.get(e.objectId);if(o)return o;let c=e.object.placement,s;if(c?.mode==="orbit"&&e.parentId){let l=r.get(e.parentId),u=l?Xe(l,t,n,r,i,a):{x:0,y:0,z:0},d=i.get(e.objectId),p=$t(e.object,d,1,t.activeEventId!==null),m=p?Sn(p,0):{x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};s=Pn(u,m)}else if(c?.mode==="surface"&&e.parentId){let l=r.get(e.parentId),u=l?Xe(l,t,n,r,i,a):{x:0,y:0,z:0},d=l?.visualRadius??16,p=va(e.objectId),m=p*Math.PI*2;s={x:u.x+Math.cos(m)*(d+e.visualRadius*.9),y:u.y+Math.sin(p*Math.PI)*Math.max(e.visualRadius*.2,2),z:u.z+Math.sin(m)*(d+e.visualRadius*.9)}}else if(c?.mode==="at"&&e.parentId){let l=r.get(e.parentId),u=l?Xe(l,t,n,r,i,a):{x:0,y:0,z:0},d=e.anchorX??l?.x??n.x,p=e.anchorY??l?.y??n.y;s={x:u.x+(e.x-d),y:u.y,z:u.z+(e.y-p)}}else s={x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};return a.set(e.objectId,s),s}function On(e,t){let n=new Map(e.objects.map(a=>[a.objectId,a])),r=new Map,i=a=>{let o=r.get(a);if(o)return o;let c=n.get(a);if(!c)return{x:0,y:0,z:0};let s={...c.position};if(c.motion&&c.parentId){let l=i(c.parentId),u=Sn(c.motion,e.timeFrozen?0:t);s=Pn(l,u)}return r.set(a,s),s};for(let a of e.objects)i(a.objectId);return r}function Sn(e,t){let n=e.phase0Deg+e.angularVelocityDegPerSecond*t,r=wt(n),i=wt(e.rotationDeg),a=wt(e.inclinationDeg),o=Math.cos(r)*e.semiMajor,c=Math.sin(r)*e.semiMinor,s=o*Math.cos(i)-c*Math.sin(i),l=o*Math.sin(i)+c*Math.cos(i);return{x:s,y:l*Math.sin(a),z:l*Math.cos(a)}}function $t(e,t,n,r){let i=e.placement;if(!i||i.mode!=="orbit")return null;let a=t?.radius??t?.rx??pe(It(i)*48,24,1200),o=t?.radius??t?.ry??a,c=ha(i.period),s=It(i),l=pe(s/Math.max(n,1e-4),1,20),u=pe(c?Ke*l:Ke*Math.pow(l,.75),Ke,$n);return{phase0Deg:Ze(i.phase)??0,rotationDeg:Ze(i.angle)??t?.rotationDeg??0,inclinationDeg:Ze(i.inclination)??0,semiMajor:a,semiMinor:o,eccentricity:i.eccentricity??0,periodSeconds:c,angularVelocityDegPerSecond:360/Math.max(u,.001),heuristic:c===null,frozen:r}}function It(e){let t=xn(e.semiMajor)??xn(e.distance)??1;return Math.max(t,.01)}function xn(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 ha(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*jn;case"y":return e.value*He;case"ky":return e.value*He*1e3;case"my":return e.value*He*1e6;case"gy":return e.value*He*1e9;default:return null}}function Ze(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ga(e,t){return{...ya(e),...t}}function ya(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 ba(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,a=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY;for(let c of e)t=Math.min(t,c.position.x-c.visualRadius),n=Math.min(n,c.position.y-c.visualRadius),r=Math.min(r,c.position.z-c.visualRadius),i=Math.max(i,c.position.x+c.visualRadius),a=Math.max(a,c.position.y+c.visualRadius),o=Math.max(o,c.position.z+c.visualRadius);return{minX:t,minY:n,minZ:r,maxX:i,maxY:a,maxZ:o,width:i-t,height:a-n,depth:o-r,center:{x:(t+i)/2,y:(n+a)/2,z:(r+o)/2}}}function Pn(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function va(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 pe(e,t,n){return Math.min(Math.max(e,t),n)}function wt(e){return e*Math.PI/180}function Se(e,t={}){let n=Y(e,t),r=[],i=$a(e,r),a=xa(e,r),o=Ia(e,n.renderPreset??t.preset??null,n.projection),c=e.system?wa(e,o,i,a,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(s=>!s.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(s=>!s.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.6",schemaVersion:"2.6",sourceVersion:e.version,theme:e.theme??null,system:c,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),objects:e.objects.map(Dn),diagnostics:r}}function Je(e,t={}){return Ea(Se(e,t))}function Pe(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:Da(e.system),info:Aa(e.system)}:null,r=e.objects.map(Dn);return Sa(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(ka),objects:r}}function Tn(e){return Pe(e)}function wa(e,t,n,r,i,a){let o=Y(e,{preset:a??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:n,viewpoints:o.viewpoints.map(ja),annotations:r}}function Ia(e,t,n){let r=typeof e.system?.properties.view=="string"?e.system.properties.view.toLowerCase():null;return{view:r==="topdown"||r==="isometric"||r==="orthographic"||r==="perspective"?r:n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function $a(e,t){let n={};for(let[i,a]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=a);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function xa(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,a,...o]=r.split(".");if(!a||o.length===0)continue;let c=Mn(a);if(!c)continue;let s=n.get(c)??{id:c};switch(o.join(".").toLowerCase()){case"label":s.label=i;break;case"target":case"object":s.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":s.body=i;break;case"tags":s.tags=Ma(i);break}n.set(c,s)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let a=Mn(`${r.id}-notes`);n.has(a)||(n.set(a,{id:a,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(o=>typeof o=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${a}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??Ta(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,i)=>r.label.localeCompare(i.label))}function ja(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,events:[...e.eventIds],projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,camera:e.camera?{...e.camera}:null,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function Dn(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:Pa(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function ka(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(Oa)}}function Oa(e){return{objectId:e.objectId,placement:An(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 An(e){return e?structuredClone(e):null}function Sa(e,t,n){if(!n)return;let r=t.find(o=>o.id===n);if(!r)return;let i=new Map(e.map(o=>[o.id,o])),a=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(o=>o.objectId)]);for(let o of a){let c=i.get(o);c&&(r.epoch&&(c.epoch=r.epoch),r.referencePlane&&(c.referencePlane=r.referencePlane))}for(let o of r.positions){let c=i.get(o.objectId);c&&(o.placement&&(c.placement=An(o.placement)),o.inner&&(c.properties.inner={...o.inner}),o.outer&&(c.properties.outer={...o.outer}),o.epoch&&(c.epoch=o.epoch),o.referencePlane&&(c.referencePlane=o.referencePlane))}}function Pa(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 Ma(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Mn(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ta(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Da(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 Aa(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=La(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 La(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(" ")}function Ea(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var Ln=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function et(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.6"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.6"||e.version==="2.0-draft"){if(n==="2.0-draft"){let s=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.6"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:Je(e);return xt(s)}let c=e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.6"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:Se(e);return(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.6")&&c.version!==n?Qe({...c,version:n,schemaVersion:n}):Qe(c)}let i=[],a=e;a.system&&i.push(...Fa(a.system));let o=[...a.objects].sort(Ot);for(let c of o)i.length>0&&i.push(""),i.push(..._a(c));return i.join(`
2
- `)}function Qe(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...Fn(e.system));for(let r of[...e.groups].sort(me))t.push(""),t.push(...Nn(r));for(let r of[...e.relations].sort(me))t.push(""),t.push(...Bn(r));for(let r of[...e.events].sort(me))t.push(""),t.push(...Cn(r));let n=[...e.objects].sort(Ot);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...Rn(r))}),t.join(`
3
- `)}function xt(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...Fn(t.system));for(let i of[...t.groups].sort(me))n.push(""),n.push(...Nn(i));for(let i of[...t.relations].sort(me))n.push(""),n.push(...Bn(i));for(let i of[...t.events].sort(me))n.push(""),n.push(...Cn(i));let r=[...t.objects].sort(Ot);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,a)=>{a>0&&n.push(""),n.push(...Rn(i))}),n.join(`
4
- `)}function Fa(e){return Ra("system",e.id,e.properties,null,e.info)}function Ra(e,t,n,r,i){let a=[`${e} ${t}`],o=[...jt(r),...zn(n)];for(let s of o)a.push(` ${s}`);let c=Object.entries(i).sort(([s],[l])=>s.localeCompare(l));if(c.length>0){o.length>0&&a.push(""),a.push(" info");for(let[s,l]of c)a.push(` ${s} ${y(l)}`)}return a}function Fn(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${y(e.title)}`),e.description&&t.push(` description ${y(e.description)}`),e.epoch&&t.push(` epoch ${y(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${y(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${y(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${y(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${y(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([i],[a])=>i.localeCompare(a)))t.push(` ${n} ${y(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...Na(n));for(let n of e.annotations)t.push(""),t.push(...Ba(n));return t}function _a(e){return _n(e.type,e.id,e)}function Rn(e){return _n(`object ${e.type}`,e.id,e)}function _n(e,t,n){let r=[`${e} ${t}`],i=[...jt(n.placement),...zn(n.properties),...za(n)];for(let o of i)r.push(` ${o}`);let a=Object.entries(n.info).sort(([o],[c])=>o.localeCompare(c));if(a.length>0){i.length>0&&r.push(""),r.push(" info");for(let[o,c]of a)r.push(` ${o} ${y(c)}`)}for(let o of["climate","habitability","settlement"]){let c=Object.entries(n.typedBlocks?.[o]??{}).sort(([s],[l])=>s.localeCompare(l));if(c.length>0){r.push(""),r.push(` ${o}`);for(let[s,l]of c)r.push(` ${s} ${y(l)}`)}}return r}function jt(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...Q("distance",e.distance),...Q("semiMajor",e.semiMajor),...Ua("eccentricity",e.eccentricity),...Q("period",e.period),...Q("angle",e.angle),...Q("inclination",e.inclination),...Q("phase",e.phase)];case"at":return[`at ${Wa(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?kt(e.distance):e.descriptor??""}`.trim()]}}function zn(e){return Object.keys(e).sort(qa).map(t=>`${t} ${Vn(e[t])}`)}function za(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${y(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${y(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let n of e.deriveRules??[])t.push(`derive ${n.field} ${n.strategy}`);for(let n of e.validationRules??[])t.push(`validate ${n.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let n of e.tolerances??[])t.push(`tolerance ${n.field} ${Vn(n.value)}`);return t}function Na(e){let t=[`viewpoint ${e.id}`,` label ${y(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`),e.camera&&Va(e.camera)&&(t.push(" camera"),e.camera.azimuth!==null&&t.push(` azimuth ${e.camera.azimuth}`),e.camera.elevation!==null&&t.push(` elevation ${e.camera.elevation}`),e.camera.roll!==null&&t.push(` roll ${e.camera.roll}`),e.camera.distance!==null&&t.push(` distance ${e.camera.distance}`));let n=Ya(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.events.length>0&&t.push(` events ${e.events.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${y(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map(y).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function Ba(e){let t=[`annotation ${e.id}`,` label ${y(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${y(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),t}function Nn(e){let t=[`group ${e.id}`,` label ${y(e.label)}`];return e.summary&&t.push(` summary ${y(e.summary)}`),e.color&&t.push(` color ${y(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function Bn(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${y(e.from)}`),e.to&&t.push(` to ${y(e.to)}`),e.kind&&t.push(` kind ${y(e.kind)}`),e.label&&t.push(` label ${y(e.label)}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.color&&t.push(` color ${y(e.color)}`),e.hidden&&t.push(" hidden true"),t}function Cn(e){let t=[`event ${e.id}`,` kind ${y(e.kind)}`];if(e.label&&t.push(` label ${y(e.label)}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${y(e.timing)}`),e.visibility&&t.push(` visibility ${y(e.visibility)}`),e.epoch&&t.push(` epoch ${y(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${y(e.referencePlane)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.color&&t.push(` color ${y(e.color)}`),e.hidden&&t.push(" hidden true"),e.positions.length>0){t.push(""),t.push(" positions");for(let n of[...e.positions].sort(Ga)){t.push(` pose ${n.objectId}`);for(let r of Ca(n))t.push(` ${r}`)}}return t}function Ca(e){return[...jt(e.placement),...e.epoch?[`epoch ${y(e.epoch)}`]:[],...e.referencePlane?[`referencePlane ${y(e.referencePlane)}`]:[],...Q("inner",e.inner),...Q("outer",e.outer)]}function Va(e){return e.azimuth!==null||e.elevation!==null||e.roll!==null||e.distance!==null}function Vn(e){return Array.isArray(e)?e.map(t=>y(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?y(e):kt(e)}function kt(e){return`${e.value}${e.unit??""}`}function Q(e,t){return t?[`${e} ${kt(t)}`]:[]}function Ua(e,t){return t===void 0?[]:[`${e} ${t}`]}function Wa(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function Ya(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}function qa(e,t){let n=Ln.indexOf(e),r=Ln.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function Ot(e,t){let n=En(e.type),r=En(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function me(e,t){return e.id.localeCompare(t.id)}function Ga(e,t){return e.objectId.localeCompare(t.objectId)}function En(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"structure":return 7;case"phenomenon":return 8}}function y(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var Un=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Ha=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Ka=/^[A-Za-z][A-Za-z0-9+.-]*:/;function he(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Te(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function St(e,t,n){let r=e.match(Un);if(!r)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=D(n);if(a?.unitFamily&&!ve(a.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Pt(e){let t=e.match(Un);return t?{value:Number(t[1]),unit:t[2]??null}:null}function tt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function ee(e,t,n){let r=Ha.get(e.toLowerCase());if(r===void 0)throw f.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Wn(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 Xa(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(Ka);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 Yn(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 ee(Me(t,e,n),e,n);case"number":return tt(Me(t,e,n),e,n);case"unit":return St(Me(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&Xa(i,n),i}}}function Mt(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 Me(e,t,n){if(e.length!==1)throw f.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var Gn=new Set(["star","planet","moon","asteroid","comet"]),Za=332946.0487,Ja=1047.3486,nt=1495978707e-1,Qa=6371,eo=695700,to=63241.077,no=206264.806,ro=206264806;function De(e,t){let n=[],r=new Map(e.objects.map(c=>[c.id,c])),i=new Set(e.groups.map(c=>c.id)),a=new Set(e.events.map(c=>c.id));e.system||n.push(w("validate.system.required","Atlas documents must declare exactly one system."));let o=new Map;for(let[c,s]of[["group",e.groups.map(l=>l.id)],["viewpoint",e.system?.viewpoints.map(l=>l.id)??[]],["annotation",e.system?.annotations.map(l=>l.id)??[]],["relation",e.relations.map(l=>l.id)],["event",e.events.map(l=>l.id)],["object",e.objects.map(l=>l.id)]])for(let l of s){let u=o.get(l);u?n.push(w("validate.id.duplicate",`Duplicate ${c} id "${l}" already used by ${u}.`)):o.set(l,c)}for(let c of e.relations)io(c,r,n);for(let c of e.system?.viewpoints??[])ao(c,i,a,t,n,r);for(let c of e.objects)oo(c,e.system,r,i,n);for(let c of e.events)so(c,e.system,r,n);return n}function io(e,t,n){e.from?t.has(e.from)||n.push(w("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(w("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(w("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(w("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(w("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function ao(e,t,n,r,i,a){let o=e.filter;if(r==="2.1"||r==="2.5"||r==="2.6"){if(o)for(let c of o.groupIds)t.has(c)||i.push(j("validate.viewpoint.group.unknown",`Unknown group "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let c of e.events??[])n.has(c)||i.push(j("validate.viewpoint.event.unknown",`Unknown event "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}fo(e.projection,i,`viewpoint.${e.id}.projection`,e.id),po(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,o,a)}function oo(e,t,n,r,i){let a=e.placement,o=a?.mode==="orbit"?a:null,c=a?.mode==="orbit"?n.get(a.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")),o&&(n.has(o.target)||i.push(w("validate.orbit.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"orbit")),o.distance&&o.semiMajor&&i.push(w("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),o.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")),o.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")),o.period&&!Dt(c?.properties.mass)&&i.push(j("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),a?.mode==="surface"){let s=n.get(a.target);s?Gn.has(s.type)||i.push(w("validate.surface.target.invalid",`Surface target "${a.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(w("validate.surface.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"surface"))}if(a?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(w("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),lo(e,n,i)||i.push(w("validate.at.target.unknown",`Unknown at-reference target "${a.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(w("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 l=qn(e,c);if(l===null){i.push(j("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}o?.period||i.push(Tt("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${yo(l)}.`,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 l=Hn(o?.period),u=qn(e,c);if(l===null||u===null)continue;let d=go(e,"period");Math.abs(l-u)>d&&i.push(w("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}`,a=new Set;e.kind.trim()||r.push(w("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(w("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${i}.participants`)),e.targetObjectId&&(a.add(e.targetObjectId),n.has(e.targetObjectId)||r.push(w("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${i}.target`)));let o=new Set;for(let l of e.participantObjectIds){if(a.add(l),o.has(l)){r.push(j("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${l}".`,void 0,`${i}.participants`));continue}o.add(l),n.has(l)||r.push(w("validate.event.participants.unknown",`Unknown event participant "${l}" 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)&&a.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 c=new Set;for(let l of e.positions){let u=`${i}.pose.${l.objectId}`;if(c.has(l.objectId)){r.push(w("validate.event.pose.duplicate",`Event "${e.id}" defines "${l.objectId}" more than once in positions.`,void 0,u));continue}c.add(l.objectId);let d=n.get(l.objectId);if(!d){r.push(w("validate.event.pose.object.unknown",`Unknown event pose object "${l.objectId}" on "${e.id}".`,void 0,u));continue}a.has(l.objectId)||r.push(j("validate.event.pose.unreferenced",`Event pose "${l.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,u)),co(l,d,e,t,n,r,u,e.id)}let s=[...a].filter(l=>!c.has(l));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 co(e,t,n,r,i,a,o,c){let s=e.placement;if(!s){a.push(w("validate.event.pose.placement.required",`Event "${c}" pose "${e.objectId}" is missing a placement mode.`,void 0,o));return}if(s.mode==="orbit"){i.has(s.target)||a.push(w("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${s.target}" on "${c}:${e.objectId}".`,void 0,`${o}.orbit`)),s.distance&&s.semiMajor&&a.push(w("validate.event.pose.orbit.distanceConflict",`Event "${c}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${o}.distance`)),s.phase&&!mo(r,t,n,e)&&a.push(j("validate.event.pose.phase.epochMissing",`Event "${c}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${o}.phase`)),s.inclination&&!ho(r,t,n,e)&&a.push(j("validate.event.pose.inclination.referencePlaneMissing",`Event "${c}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${o}.inclination`)),s.period&&!Dt(i.get(s.target)?.properties.mass)&&a.push(j("validate.event.pose.period.massMissing",`Event "${c}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${o}.period`));return}if(s.mode==="surface"){let l=i.get(s.target);l?Gn.has(l.type)||a.push(w("validate.event.pose.surface.target.invalid",`Event surface target "${s.target}" on "${c}:${e.objectId}" is not surface-capable.`,void 0,`${o}.surface`)):a.push(w("validate.event.pose.surface.target.unknown",`Unknown event surface target "${s.target}" on "${c}:${e.objectId}".`,void 0,`${o}.surface`));return}if(s.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&a.push(w("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${c}:${e.objectId}".`,void 0,`${o}.at`));let l=s.reference;l.kind==="named"&&!i.has(l.name)?a.push(w("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${s.target}" on "${c}:${e.objectId}".`,void 0,`${o}.at`)):l.kind==="anchor"&&!i.has(l.objectId)?a.push(w("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${l.objectId}" on "${c}:${e.objectId}".`,void 0,`${o}.at`)):l.kind==="lagrange"&&(i.has(l.primary)?l.secondary&&!i.has(l.secondary)&&a.push(w("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${l.secondary}" on "${c}:${e.objectId}".`,void 0,`${o}.at`)):a.push(w("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${l.primary}" on "${c}:${e.objectId}".`,void 0,`${o}.at`)))}}function lo(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(w("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(w("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(w("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function qn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=uo(n.semiMajor??n.distance),i=Dt(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function uo(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/nt;case"m":return e.value/(nt*1e3);case"ly":return e.value*to;case"pc":return e.value*no;case"kpc":return e.value*ro;case"re":return e.value*Qa/nt;case"sol":return e.value*eo/nt;default:return null}}function Dt(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/Za;case"mj":return t.value/Ja;default:return null}}function Hn(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 fo(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(w("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function po(e,t,n,r,i,a,o,c,s){if(!e)return;let l=`viewpoint.${i}.camera`;for(let[d,p]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])p!==null&&(!Number.isFinite(p)||d==="distance"&&p<=0)&&r.push(w("validate.viewpoint.camera.invalid",`Invalid camera ${d} "${String(p)}" in viewpoint "${i}".`,void 0,`${l}.${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,`${l}.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,l)),t==="isometric"&&e.elevation!==null&&r.push(Tt("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${l}.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,`${l}.azimuth`)),a!==null&&s.has(a)||o!==null&&s.has(o)||c||r.push(Tt("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,l))}function mo(e,t,n,r){return te(r?.epoch)??te(n?.epoch)??te(t.epoch)??te(e?.epoch)??null}function ho(e,t,n,r){return te(r?.referencePlane)??te(n?.referencePlane)??te(t.referencePlane)??te(e?.referencePlane)??null}function te(e){return typeof e=="string"&&e.trim()?e.trim():null}function go(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?Hn(n)??0:0}function yo(e){return`${Math.round(e*100)/100}d`}function w(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 Tt(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var bo=new Set(["climate","habitability","settlement"]),it=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&&it.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}])it.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var vo=new Set(it.keys()),Xn=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function at(e){return Jn(e)}function Zn(e){return Jn(e,"2.0-draft")}function Jn(e,t){let n=as(e),r=n.source.split(/\r?\n/),i=[],a=!1,o="2.0",c=null,s=null,l=[],u=[],d=[],p=[],m=new Map,g=!1,h=!1,I=new Set,P=new Set,b=new Set,k=new Set,T=new Set;for(let M=0;M<r.length;M++){let le=r[M],_=M+1;if(!le.trim())continue;let V=Re(le),H=oe(le.slice(V),{line:_,columnOffset:V});if(H.length!==0){if(!a){o=wo(H,_),a=!0,n.comments.length>0&&ot(o,"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 ${o}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(V===0){s=Io(H,_,o,i,c,l,u,d,p,m,I,P,b,k,T,{sawDefaults:g,sawAtlas:h}),s.kind==="system"?c=s.system:s.kind==="defaults"?g=!0:s.kind==="atlas"&&(h=!0);continue}if(!s)throw new f("Indented line without parent atlas section",_,V+1);Mo(s,V,H,_)}}if(!a)throw new f('Missing required atlas schema header "schema 2.0"');let B=l.map(M=>Ho(M,o,i)),A=p.map(M=>Ko(M,m.get(M.id)??[])),C=t??(o==="2.0-draft"?"2.0":o),G={format:"worldorbit",sourceVersion:"1.0",theme:null,system:c,groups:u,relations:d,events:A,objects:B,diagnostics:i};if(C==="2.0-draft"){let M={...G,version:"2.0-draft",schemaVersion:"2.0-draft"};return M.diagnostics.push(...De(M,o)),M}let ie={...G,version:C,schemaVersion:C};return o==="2.0-draft"&&ie.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".'}),ie.diagnostics.push(...De(ie,o)),ie}function wo(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 Io(e,t,n,r,i,a,o,c,s,l,u,d,p,m,g,h){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new f('Atlas section "system" may only appear once',t,e[0].column);return $o(e,t,n,r);case"defaults":if(!i)throw new f('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(h.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(h.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 xo(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 jo(e,t,i,d);case"group":return R(n,r,"group",{line:t,column:e[0].column}),ko(e,t,o,p);case"relation":return R(n,r,"relation",{line:t,column:e[0].column}),Oo(e,t,c,m);case"event":return R(n,r,"event",{line:t,column:e[0].column}),So(e,t,s,l,g,n,r);case"object":return Po(e,t,n,r,a);default:throw new f(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function $o(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 xo(e,t,n,r,i,a){if(e.length!==2)throw new f("Invalid viewpoint declaration",t,e[0]?.column??1);let o=he(e[1].value);if(!o)throw new f("Viewpoint id must not be empty",t,e[1].column);if(r.has(o))throw new f(`Duplicate viewpoint id "${o}"`,t,e[1].column);let c={id:o,label:Te(o),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(c),r.add(o),{kind:"viewpoint",viewpoint:c,sourceSchemaVersion:i,diagnostics:a,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function jo(e,t,n,r){if(e.length!==2)throw new f("Invalid annotation declaration",t,e[0]?.column??1);let i=he(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 a={id:i,label:Te(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(a),r.add(i),{kind:"annotation",annotation:a,seenFields:new Set}}function ko(e,t,n,r){if(e.length!==2)throw new f("Invalid group declaration",t,e[0]?.column??1);let i=he(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 a={id:i,label:Te(i),summary:"",color:null,tags:[],hidden:!1};return n.push(a),r.add(i),{kind:"group",group:a,seenFields:new Set}}function Oo(e,t,n,r){if(e.length!==2)throw new f("Invalid relation declaration",t,e[0]?.column??1);let i=he(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 a={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(a),r.add(i),{kind:"relation",relation:a,seenFields:new Set}}function So(e,t,n,r,i,a,o){if(e.length!==2)throw new f("Invalid event declaration",t,e[0]?.column??1);let c=he(e[1].value);if(!c)throw new f("Event id must not be empty",t,e[1].column);if(i.has(c))throw new f(`Duplicate event id "${c}"`,t,e[1].column);let s={id:c,kind:"",label:Te(c),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},l=[];return n.push(s),r.set(c,l),i.add(c),{kind:"event",event:s,sourceSchemaVersion:a,diagnostics:o,seenFields:new Set,rawPoses:l,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Po(e,t,n,r,i){if(e.length<3)throw new f("Invalid atlas object declaration",t,e[0]?.column??1);let a=e[1],o=e[2],c=a.value;if(!be.has(c)||c==="system")throw new f(`Unknown object type "${a.value}"`,t,a.column);let s={objectType:c,id:o.value,fields:qo(e.slice(3),t,c,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:a.column}};return i.push(s),{kind:"object",objectNode:s,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function Mo(e,t,n,r){switch(e.kind){case"system":To(e,n,r);return;case"defaults":Do(e,n,r);return;case"atlas":Ao(e,t,n,r);return;case"viewpoint":Lo(e,t,n,r);return;case"annotation":Ro(e,n,r);return;case"group":_o(e,n,r);return;case"relation":zo(e,n,r);return;case"event":No(e,t,n,r);return;case"object":Co(e,t,n,r);return}}function To(e,t,n){let r=q(t,e.seenFields,n),i=x(t,n);switch(r){case"title":e.system.title=i;return;case"description":R(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":R(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":R(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 Do(e,t,n){let r=q(t,e.seenFields,n),i=x(t,n);switch(r){case"view":er(i)&&se(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=Qn(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=tr(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 Ao(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=nr(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 Lo(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){Eo(e,n,r);return}if(e.inFilter){Fo(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(se(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??Lt();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=q(n,e.seenFields,r),a=x(n,r);switch(i){case"label":e.viewpoint.label=a;return;case"summary":e.viewpoint.summary=a;return;case"focus":e.viewpoint.focusObjectId=a;return;case"select":e.viewpoint.selectedObjectId=a;return;case"projection":er(a)&&se(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=Qn(a,r,n[0].column);return;case"preset":e.viewpoint.preset=tr(a,r,n[0].column);return;case"zoom":e.viewpoint.zoom=At(a,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=re(a,r,n[0].column,"rotation");return;case"camera":se(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=Yo(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=Uo(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":R(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=N(n.slice(1),r,"events");return;default:throw new f(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Eo(e,t,n){let r=q(t,e.seenCameraFields,n),i=x(t,n),a=e.viewpoint.camera??Lt();switch(r){case"azimuth":a.azimuth=re(i,n,t[0].column,"camera.azimuth");break;case"elevation":a.elevation=re(i,n,t[0].column,"camera.elevation");break;case"roll":a.roll=re(i,n,t[0].column,"camera.roll");break;case"distance":a.distance=At(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=a}function Fo(e,t,n){let r=q(t,e.seenFilterFields,n),i=e.viewpoint.filter??Wo();switch(r){case"query":i.query=x(t,n);break;case"objecttypes":i.objectTypes=Vo(t.slice(1),n);break;case"tags":i.tags=N(t.slice(1),n,"tags");break;case"groups":i.groupIds=N(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 Ro(e,t,n){switch(q(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=N(t.slice(1),n,"tags");return;default:throw new f(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function _o(e,t,n){switch(q(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=N(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=ee(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 zo(e,t,n){switch(q(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=N(t.slice(1),n,"tags");return;case"color":e.relation.color=x(t,n);return;case"hidden":e.relation.hidden=ee(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 No(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")&&se(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(Bo(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 a=n[1].value;if(!a.trim())throw new f("Event pose object id must not be empty",r,n[1].column);let o={objectId:a,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(o),e.activePose=o,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(q(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=N(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":se(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=x(n,r);return;case"referenceplane":se(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=x(n,r);return;case"tags":e.event.tags=N(n.slice(1),r,"tags");return;case"color":e.event.color=x(n,r);return;case"hidden":e.event.hidden=ee(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 Bo(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(!Xn.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 Co(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"&&R(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=nr(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 a=e.activeBlock,o=e.seenTypedBlockKeys[a]??(e.seenTypedBlockKeys[a]=new Set);if(o.has(i.key))throw new f(`Duplicate ${a} key "${i.key}"`,r,n[0].column);o.add(i.key),(e.objectNode.typedBlockEntries[a]??(e.objectNode.typedBlockEntries[a]=[])).push(i);return}e.objectNode.fields.push(Go(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function q(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 Vo(e,t){return N(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function Uo(e,t,n,r){let i={};for(let a of N(e,t,"layers")){let o=!a.startsWith("-")&&!a.startsWith("!"),c=a.replace(/^[-!]+/,"").toLowerCase();if(c==="orbits"){i["orbits-back"]=o,i["orbits-front"]=o;continue}(c==="background"||c==="guides"||c==="orbits-back"||c==="orbits-front"||c==="relations"||c==="events"||c==="objects"||c==="labels"||c==="metadata")&&(c==="events"&&n&&r&&R(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[c]=o)}return i}function N(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 Qn(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 er(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function tr(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 At(e,t,n,r){let i=re(e,t,n,r);if(i<=0)throw new f(`Field "${r}" must be greater than zero`,t,n);return i}function re(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 Wo(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Lt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Yo(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}:Lt(),i=new Set;for(let a=0;a<e.length;a+=2){let o=e[a],c=e[a+1],s=o.value.toLowerCase();if(i.has(s))throw new f(`Duplicate viewpoint camera field "${o.value}"`,t,o.column);i.add(s);let l=c.value;switch(s){case"azimuth":r.azimuth=re(l,t,o.column,"camera.azimuth");break;case"elevation":r.elevation=re(l,t,o.column,"camera.elevation");break;case"roll":r.roll=re(l,t,o.column,"camera.roll");break;case"distance":r.distance=At(l,t,o.column,"camera.distance");break;default:throw new f(`Unknown viewpoint camera field "${o.value}"`,t,o.column)}}return r}function qo(e,t,n,r,i){let a=[],o=0;for(;o<e.length;){let c=e[o],s=Ae(c.value);if(!s)throw new f(`Unknown field "${c.value}"`,t,c.column);s.version==="2.1"&&R(r,i,c.value,{line:t,column:c.column}),o++;let l=[];if(s.inlineMode==="single"){let u=e[o];u&&(l.push(u),o++)}else if(s.inlineMode==="pair")for(let u=0;u<2;u++){let d=e[o];if(!d)break;l.push(d),o++}else for(;o<e.length&&!vo.has(e[o].value);)l.push(e[o]),o++;if(l.length===0)throw new f(`Missing value for field "${c.value}"`,t,c.column);a.push({type:"field",key:c.value,values:l.map(u=>u.value),location:{line:t,column:c.column}})}return or(a,n),a}function Go(e,t,n,r,i){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);let a=Ae(e[0].value);if(!a)throw new f(`Unknown field "${e[0].value}"`,t,e[0].column);a.version==="2.1"&&R(r,i,e[0].value,{line:t,column:e[0].column});let o={type:"field",key:e[0].value,values:e.slice(1).map(c=>c.value),location:{line:t,column:e[0].column}};return or([o],n),o}function nr(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 Ho(e,t,n){let r=rr(e.fields),i=ir(r),a=Zo(e.objectType,r),o=rs(r.get("groups")?.[0]),c=rt(r.get("epoch")?.[0]),s=rt(r.get("referencePlane")?.[0]),l=r.has("tidalLock")?ee(z(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?es(r.get("resonance")[0]):void 0,d=Qo(r),p=r.get("derive")?.map(k=>ts(k)),m=r.get("validate")?.map(k=>({rule:z(k)})),g=r.has("locked")?[...new Set(r.get("locked").flatMap(k=>k.values))]:void 0,h=r.get("tolerance")?.map(k=>ns(k)),I=Jo(e.typedBlockEntries),P=ar(e.infoEntries,"info"),b={type:e.objectType,id:e.id,properties:a,placement:i,info:P};return o.length>0&&(b.groups=o),c&&(b.epoch=c),s&&(b.referencePlane=s),l!==void 0&&(b.tidalLock=l),u&&(b.resonance=u),d&&(b.renderHints=d),p?.length&&(b.deriveRules=p),m?.length&&(b.validationRules=m),g?.length&&(b.lockedFields=g),h?.length&&(b.tolerances=h),I&&Object.keys(I).length>0&&(b.typedBlocks=I),ot(t,"2.1")&&(b.groups||b.epoch||b.referencePlane||b.tidalLock!==void 0||b.resonance||b.renderHints||b.deriveRules?.length||b.validationRules?.length||b.lockedFields?.length||b.tolerances?.length||b.typedBlocks)&&R(t,n,e.id,e.location),b}function Ko(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>Xo(n))}}function Xo(e){let t=rr(e.fields,"event-pose"),n=ir(t);return{objectId:e.objectId,placement:n,inner:ne(t.get("inner")?.[0],"inner"),outer:ne(t.get("outer")?.[0],"outer"),epoch:rt(t.get("epoch")?.[0]),referencePlane:rt(t.get("referencePlane")?.[0])}}function rr(e,t="object"){let n=new Map;for(let r of e){let i=Ae(r.key);if(!i&&!Xn.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 a=n.get(r.key)??[];a.push(r),n.set(r.key,a)}return n}function ir(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 o=t??n??r??i;throw f.fromLocation("Object has multiple placement modes",o?.location)}if(t)return{mode:"orbit",target:z(t),distance:ne(e.get("distance")?.[0],"distance"),semiMajor:ne(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:is(e.get("eccentricity")?.[0],"eccentricity"),period:ne(e.get("period")?.[0],"period"),angle:ne(e.get("angle")?.[0],"angle"),inclination:ne(e.get("inclination")?.[0],"inclination"),phase:ne(e.get("phase")?.[0],"phase")};if(n){let o=z(n);return{mode:"at",target:o,reference:Wn(o,n.location)}}if(r)return{mode:"surface",target:z(r)};if(i){let o=z(i),c=Pt(o);return{mode:"free",distance:c??void 0,descriptor:c?void 0:o}}return null}function Zo(e,t){let n={};for(let[r,i]of t.entries()){let a=i[0],o=Ae(r);!a||!o?.legacySchema||o.legacySchema.placement||(Mt(r,e,a.location),n[r]=Yn(r,a.values,a.location))}return n}function ar(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 Jo(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=ar(r,n))}return t}function Qo(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=ee(z(n),"renderLabel",n.location)),r&&(t.renderOrbit=ee(z(r),"renderOrbit",r.location)),i&&(t.renderPriority=tt(z(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function es(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 ts(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 ns(e){if(e.values.length!==2)throw f.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=Pt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function rs(e){return e?[...new Set(e.values)]:[]}function rt(e){return e&&e.values.join(" ").trim()||null}function ne(e,t){return e?St(z(e),e.location,t):void 0}function is(e,t){return e?tt(z(e),t,e.location):void 0}function z(e){return Me(e.values,e.key,e.location)}function Ae(e){return it.get(e)}function or(e,t){for(let n of e){let r=Ae(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){Mt(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 R(e,t,n,r){ot(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 se(e,t,n,r){ot(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 ot(e,t){return Kn(e)<Kn(t)}function Kn(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 as(e){let t=[...e],n=[],r=!1,i=!1,a=null,o=1,c=1;for(let s=0;s<t.length;s++){let l=t[s],u=t[s+1];if(i){if(l==="*"&&u==="/"){t[s]=" ",t[s+1]=" ",i=!1,a=null,s++,c+=2;continue}l!==`
1
+ "use strict";var WorldOrbitCore=(()=>{var ht=Object.defineProperty;var Ar=Object.getOwnPropertyDescriptor;var Fr=Object.getOwnPropertyNames;var Er=Object.prototype.hasOwnProperty;var Lr=(e,t)=>{for(var n in t)ht(e,n,{get:t[n],enumerable:!0})},Rr=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Fr(t))!Er.call(e,i)&&i!==n&&ht(e,i,{get:()=>t[i],enumerable:!(r=Ar(t,i))||r.enumerable});return e};var _r=e=>Rr(ht({},"__esModule",{value:!0}),e);var qs={};Lr(qs,{WORLDORBIT_FIELD_KEYS:()=>Kt,WORLDORBIT_FIELD_SCHEMAS:()=>yt,WORLDORBIT_OBJECT_TYPES:()=>je,WorldOrbitError:()=>d,cloneAtlasDocument:()=>lt,createDiagnostic:()=>tn,createEmptyAtlasDocument:()=>_t,createTrajectorySolverSnapshot:()=>Fn,detectWorldOrbitSchemaVersion:()=>Wt,diagnosticFromError:()=>L,evaluateSpatialSceneAtTime:()=>Pn,extractWorldOrbitBlocks:()=>kr,formatAtlasDocument:()=>rt,formatDocument:()=>it,formatDraftDocument:()=>St,getAtlasDocumentNode:()=>zt,getFieldSchema:()=>F,isKnownFieldKey:()=>gt,listAtlasDocumentPaths:()=>pr,load:()=>Us,loadWorldOrbitSource:()=>pt,loadWorldOrbitSourceWithDiagnostics:()=>Yt,materializeAtlasDocument:()=>Fe,materializeDraftDocument:()=>Ln,normalizeDocument:()=>G,normalizeWithDiagnostics:()=>nn,parse:()=>Or,parseSafe:()=>Ws,parseWithDiagnostics:()=>Ue,parseWorldOrbit:()=>ee,parseWorldOrbitAtlas:()=>ct,parseWorldOrbitDraft:()=>rr,removeAtlasDocumentNode:()=>hr,render:()=>Bs,renderDocumentToScene:()=>K,renderDocumentToSpatialScene:()=>Tn,resolveAtlasDiagnosticPath:()=>Vt,resolveAtlasDiagnostics:()=>Ct,rotatePoint:()=>pn,stringify:()=>Ys,supportsObjectType:()=>vt,tokenizeLine:()=>Xt,tokenizeLineDetailed:()=>ue,unitFamilyAllowsUnit:()=>xe,updateAtlasDocumentNode:()=>mr,upgradeDocumentToDraftV2:()=>nt,upgradeDocumentToV2:()=>Ae,upsertAtlasDocumentNode:()=>Nt,validateAtlasDocumentWithDiagnostics:()=>yr,validateDocument:()=>H,validateDocumentWithDiagnostics:()=>rn});var d=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 $e=["system","star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"],N=$e.filter(e=>e!=="system"),zr=["star","planet","moon","asteroid","comet","craft","structure","phenomenon"],Ht=["craft","structure","phenomenon"],Q=["star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"],Nr=["star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"];function $(e,t){return{key:e,...t}}var je=new Set($e),yt=new Map([$("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:Q}),$("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"distance"}),$("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"distance"}),$("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:Q}),$("period",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"duration"}),$("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"angle"}),$("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"angle"}),$("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"angle"}),$("at",{kind:"string",placement:!0,arity:"single",objectTypes:Ht}),$("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Ht}),$("free",{kind:"string",placement:!0,arity:"single",objectTypes:Nr}),$("kind",{kind:"string",placement:!1,arity:"single",objectTypes:N}),$("class",{kind:"string",placement:!1,arity:"single",objectTypes:N}),$("culture",{kind:"string",placement:!1,arity:"single",objectTypes:N}),$("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:$e}),$("color",{kind:"string",placement:!1,arity:"single",objectTypes:$e}),$("image",{kind:"string",placement:!1,arity:"single",objectTypes:zr}),$("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:$e}),$("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:N,unitFamily:"radius"}),$("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:N,unitFamily:"mass"}),$("density",{kind:"unit",placement:!1,arity:"single",objectTypes:N,unitFamily:"generic"}),$("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:N,unitFamily:"generic"}),$("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:N,unitFamily:"generic"}),$("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:N}),$("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),$("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),$("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),$("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),$("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),$("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),$("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),$("on",{kind:"string",placement:!1,arity:"single",objectTypes:N}),$("source",{kind:"string",placement:!1,arity:"single",objectTypes:N}),$("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:N,unitFamily:"duration"}),$("trajectory",{kind:"string",placement:!1,arity:"single",objectTypes:["craft","structure"]})].map(e=>[e.key,e])),Kt=new Set(yt.keys());function F(e){return yt.get(e)}function gt(e){return Kt.has(e)}function vt(e,t){return e.objectTypes.includes(t)}function xe(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 Xt(e){return ue(e).map(t=>t.value)}function ue(e,t={}){let n=[],r=t.columnOffset??0,i="",a=null,o=!1,c=!1,s=null,l=()=>{a!==null&&(n.push({value:i,column:a,quoted:o}),i="",a=null,o=!1)};for(let u=0;u<e.length;u++){let f=e[u],p=r+u+1;if(c&&f==="\\"){let m=e[u+1];if(m==='"'||m==="\\"){i+=m,u++;continue}}if(f==='"'){c?c=!1:(a===null&&(a=p),o=!0,s=p,c=!0);continue}if(!c&&/\s/.test(f)){l();continue}a===null&&(a=p),i+=f}if(c)throw new d("Unclosed quote in line",t.line,s??r+e.length);return l(),n}function Ce(e){return e.match(/^\s*/)?.[0].length??0}function ee(e){let t=e.split(/\r?\n/),n=[],r=null,i=null,a=!1,o=!1,c=null,s=null,l=null,u=null;for(let f=0;f<t.length;f++){let p=t[f],m=f+1;if(!p.trim())continue;let g=Ce(p),h=ue(p.slice(g),{line:m,columnOffset:g});if(h.length!==0){if(g===0){if(a=!1,o=!1,c=null,s=null,l=null,u=null,h.length>=1&&h[0].value==="theme"){o=!0,s=0,r={type:"theme",preset:h.length>=2?h[1].value:null,blocks:[],location:{line:m,column:h[0].column}};continue}let I=Cr(h,m);n.push(I),i=I;continue}if(o){if(h.length>=2&&h[0].value==="preset"&&(!l||g<=l)){r&&(r.preset=h[1].value);continue}u&&l!==null&&g>l?u.fields.push(Ur(h,m)):(l=g,u={type:"theme-block",target:h[0].value,fields:[],location:{line:m,column:h[0].column}},r?.blocks.push(u));continue}if(!i)throw new d("Indented line without parent object",m,g+1);if(h.length===1&&h[0].value==="info"){a=!0,c=g;continue}a&&g<=(c??0)&&(a=!1),a?i.infoEntries.push(Wr(h,m)):i.blockFields.push(Br(h,m))}}return{type:"document",theme:r,objects:n}}function Cr(e,t){if(e.length<2)throw new d("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!je.has(n.value))throw new d(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:Vr(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function Vr(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],a=F(i.value);if(!a)throw new d(`Unknown field "${i.value}"`,t,i.column);r++;let o=[];if(a.arity==="multiple")for(;r<e.length&&!gt(e[r].value);)o.push(e[r]),r++;else{let c=e[r];c&&(o.push(c),r++)}if(o.length===0)throw new d(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:o.map(c=>c.value),location:{line:t,column:i.column}})}return n}function Br(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!F(e[0].value))throw new d(`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 Ur(e,t){if(e.length<2)throw new d("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 Wr(e,t){if(e.length<2)throw new d("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 Zt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Yr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),qr=/^[A-Za-z][A-Za-z0-9+.-]*:/;function G(e){let t=null,n=[],r=e.theme?Gr(e.theme):null;for(let i of e.objects){let a=Kr(i);if(i.objectType==="system"){if(t)throw d.fromLocation("Only one system object is allowed",i.location);t=a}else n.push(a)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",theme:r,system:t,groups:[],relations:[],events:[],trajectories:[],objects:n}}function Gr(e){let t={};for(let n of e.blocks){let r=Jt(n.fields);t[n.target]=Hr(r)}return{preset:e.preset,styles:t}}function Hr(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 a=Number(i);if(!Number.isNaN(a)&&i.trim()!==""){t[n]=a;continue}}t[n]=r.values.join(" ")}return t}function Kr(e){let t=[...e.inlineFields,...e.blockFields];Xr(e.objectType,t);let n=Jt(t),r=Zr(e.objectType,n),i=Jr(n),a=ti(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:a}:{type:e.objectType,id:e.name,properties:i,placement:r,info:a}}function Xr(e,t){for(let n of t){let r=F(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!vt(r,e))throw d.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw d.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Jt(e){let t=new Map;for(let n of e){if(t.has(n.key))throw d.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function Zr(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),a=t.has("free"),o=[n,r,i,a].filter(Boolean).length;if(o>1){let c=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw d.fromLocation("Object has multiple placement modes",c?.location)}if(e==="system"&&o>0)throw d.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Ve(t,"orbit"),distance:he(t,"distance"),semiMajor:he(t,"semiMajor"),eccentricity:ii(t,"eccentricity"),period:he(t,"period"),angle:he(t,"angle"),inclination:he(t,"inclination"),phase:he(t,"phase")};if(r){let c=Be(t,"at"),s=Ve(t,"at");return{mode:"at",target:s,reference:ni(s,c.location)}}if(i)return{mode:"surface",target:Ve(t,"surface")};if(a){let c=Ve(t,"free"),s=ri(c);return{mode:"free",distance:s??void 0,descriptor:s?void 0:c}}return null}function Jr(e){let t={};for(let[n,r]of e.entries()){let i=F(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=ai(r);break;case"number":t[n]=en(ye(r),n,r.location);break;case"unit":t[n]=Qt(ye(r),r.location,n);break;case"string":t[n]=Qr(n,r);break}}return t}function Qr(e,t){let n=t.values.join(" ").trim();return e==="image"&&ei(n,t.location),n}function ei(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(qr);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw d.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function ti(e){let t={};for(let n of e){if(n.key in t)throw d.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function ni(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.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 d.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 Qt(e,t,n){let r=e.match(Zt);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=F(n);if(a?.unitFamily&&!xe(a.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function ri(e){let t=e.match(Zt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function he(e,t){if(!e.has(t))return;let n=Be(e,t);return Qt(ye(n),n.location,t)}function ii(e,t){if(!e.has(t))return;let n=Be(e,t);return en(ye(n),t,n.location)}function en(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function ai(e){let t=ye(e).toLowerCase(),n=Yr.get(t);if(n===void 0)throw d.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Be(e,t){let n=e.get(t);if(!n)throw new d(`Missing value for key "${t}"`);return n}function Ve(e,t){return ye(Be(e,t))}function ye(e){if(e.values.length!==1)throw d.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var oi=new Set(["star","planet","moon","asteroid","comet"]);function H(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new d(`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 d(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!oi.has(i.type))throw new d(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&si(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&ci(r,r.placement.reference,t))}}function si(e,t,n){if(!n.has(t.primary))throw new d(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new d(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function ci(e,t,n){if(!n.has(t.objectId))throw new d(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function tn(e){return{...e}}function L(e,t,n=`${t}.failed`){return e instanceof d?{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)}}function Ue(e){let t;try{t=ee(e)}catch(r){return{ok:!1,value:null,diagnostics:[L(r,"parse")]}}let n;try{n=G(t)}catch(r){return{ok:!1,value:null,diagnostics:[L(r,"normalize")]}}try{H(n)}catch(r){return{ok:!1,value:null,diagnostics:[L(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function nn(e){try{return{ok:!0,value:G(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[L(t,"normalize")]}}}function rn(e){try{return H(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[L(t,"validate")]}}}var ke=1495978707e-1,li=6371,ui=71492,di=695700,fi=63241.077,pi=206264.806,mi=206264806,dn=.68,hi=.2,fn=28;function K(e,t={}){let n=vi(t),r=n.width,i=n.height,a=n.padding,o=gi(e),c=wi(e,t.projection),s=jt(t.camera??null),l=$t(c,s),u=ki(o),f=ji(o,t.scaleModel,t.bodyScaleMode),p=e.system?.id??null,m=t.activeEventId??null,g=yi(e.objects,e.events??[],m),h=Oi(g,r,i,a,u,f),I=new Map(g.map(w=>[w.id,w])),M=la(g,I),k=new Map,b=[],O=[],W=[],E=[],ae=[],oe=new Map,me=new Map;for(let w of g){let z=w.placement;if(!z){W.push(w);continue}if(z.mode==="orbit"){cn(me,z.target,w);continue}if(z.mode==="surface"){cn(oe,z.target,w);continue}if(z.mode==="at"){ae.push(w);continue}E.push(w)}let Ie=E.length>0?r*.42:r/2,se=i/2,T={orbitChildren:me,surfaceChildren:oe,objectMap:I,spacingFactor:u,projection:l,scaleModel:f,sceneMetricScale:h},ce=W.find(w=>w.type==="star")??W[0]??null;ce&&wt(ce,Ie,se,0,k,b,O,T);let Y=W.filter(w=>w.id!==ce?.id);if(Y.length>0){let w=Math.min(r,i)*.28*u*f.orbitDistanceMultiplier;Y.forEach((z,P)=>{let mt=Pe(P,Y.length,-Math.PI/2),le=De(mt,w,l,1);wt(z,Ie+le.x,se+le.y,0,k,b,O,T)})}E.forEach((w,z)=>{let P=r-a-140-ha(w.placement?.mode==="free"?w.placement.distance:void 0,f,h),mt=Math.max(76,(i-a*2-180)/Math.max(1,E.length)*u)*f.freePlacementMultiplier,le=a+92+z*mt;k.set(w.id,{object:w,x:P,y:le,radius:He(w,0,f,h),sortKey:Xe(P,le,0)}),O.push({object:w,groupId:M.groupIds.get(w.id)??null,x1:P-60,y1:le,x2:P-18,y2:le,mode:"free"}),qe(w,k,b,O,T,1)}),ae.forEach((w,z)=>{if(k.has(w.id)||!w.placement||w.placement.mode!=="at")return;let P=sa(w.placement.reference,k,I,z,ae.length,r,i,a,T);k.set(w.id,{object:w,x:P.x,y:P.y,radius:He(w,2,f,h),sortKey:Xe(P.x,P.y,2),anchorX:P.anchorX,anchorY:P.anchorY}),P.anchorX!==void 0&&P.anchorY!==void 0&&O.push({object:w,groupId:M.groupIds.get(w.id)??null,x1:P.anchorX,y1:P.anchorY,x2:P.x,y2:P.y,mode:"at"}),qe(w,k,b,O,T,2)});let A=[...k.values()].map(w=>Si(w,f,M)),q=b.map(w=>Mi(w,M.groupIds.get(w.object.id)??null)),ze=O.map(w=>Ti(w)),Ne=Pi(A,r,i,f.labelMultiplier),qt=zi(e,A),Gt=Ni(e.events??[],A,m),Sr=Li(q,qt,Gt,ze,A,Ne),Mr=Ri(A,q,ze,Ne,M,f.labelMultiplier),Tr=_i(e,A),Pr=Ci(e,c,n.preset,M,I),Dr=Ji(r,i,A,q,ze,Ne,f.labelMultiplier);return{width:r,height:i,padding:a,renderPreset:n.preset,projection:c,renderProjection:l,camera:s,scaleModel:f,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:$i(c,l,o,s),systemId:p,viewMode:c,layoutPreset:o,metadata:{format:e.format,version:e.version,view:c,renderProjection:l,scale:String(e.system?.properties.scale??o),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom","body.scaleMode":f.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:Dr,layers:Sr,groups:Mr,semanticGroups:Tr,viewpoints:Pr,events:Gt,activeEventId:m,objects:A,orbitVisuals:q,relations:qt,leaders:ze,labels:Ne}}function pn(e,t,n){let r=Ze(n),i=Math.cos(r),a=Math.sin(r),o=e.x-t.x,c=e.y-t.y;return{x:t.x+o*i-c*a,y:t.y+o*a+c*i}}function yi(e,t,n){let r=e.map(c=>structuredClone(c));if(!n)return r;let i=t.find(c=>c.id===n);if(!i)return r;let a=new Map(r.map(c=>[c.id,c])),o=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(c=>c.objectId)]);for(let c of o){let s=a.get(c);s&&(i.epoch&&(s.epoch=i.epoch),i.referencePlane&&(s.referencePlane=i.referencePlane))}for(let c of i.positions){let s=a.get(c.objectId);s&&(c.placement&&(s.placement=structuredClone(c.placement)),c.inner&&(s.properties.inner={...c.inner}),c.outer&&(s.properties.outer={...c.outer}),c.epoch&&(s.epoch=c.epoch),c.referencePlane&&(s.referencePlane=c.referencePlane))}return r}function gi(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 vi(e){let t=bi(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function bi(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 wi(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return yn(n)??"topdown"}function $t(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 jt(e){if(!e)return null;let t={azimuth:bt(e.azimuth),elevation:bt(e.elevation),roll:bt(e.roll),distance:Ii(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function bt(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Ii(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function $i(e,t,n,r){let i=[`${ln(e)} view`,`${ln(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let a=[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);a.length>0&&i.push(`camera ${a.join(" / ")}`)}return i.join(" - ")}function ji(e,t,n){return{...xi(e),...n?{bodyScaleMode:n}:{},...t}}function xi(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 ki(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Oi(e,t,n,r,i,a){let o=[],c=[];for(let m of e){let g=ga(m);g!==null&&g>0&&c.push(g);let h=m.placement;if(h){if(h.mode==="orbit"){let I=te(h.semiMajor??h.distance??null);I!==null&&I>0&&o.push(I);continue}if(h.mode==="free"){let I=te(h.distance??null);I!==null&&I>0&&o.push(I)}}}let s=Math.max(...o,0),l=Math.max(...c,0),u=Math.max(s,l*6,0),f=u+Math.max(Math.sqrt(u),l*2,s>0?.25:0);return f<=0?{pixelsPerMetric:null,hasExplicitScale:!1}:{pixelsPerMetric:Math.max(Math.min(t,n)/2-r-24,120)*i*a.orbitDistanceMultiplier/f,hasExplicitScale:!0}}function Si(e,t,n){let{object:r,x:i,y:a,radius:o,sortKey:c,anchorX:s,anchorY:l}=e,u=r.renderHints?.renderPriority??0;return{renderId:ge(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:a,radius:o,visualRadius:ma(r,o,t),sortKey:c+u*.001,anchorX:s,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"||r.type==="craft"?String(r.properties.kind??r.type):r.type,fillColor:va(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function Mi(e,t){return{renderId:`${ge(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:`${ge(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 Pi(e,t,n,r){let i=[],a=[],o=new Map(e.map(s=>[s.objectId,s])),c=[...e].filter(s=>!s.hidden&&s.object.renderHints?.renderLabel!==!1).sort(Di);for(let s of c){let l=Ai(s,o,a,t,n,r)??hn(s,mn(s,o.get(s.parentId??"")??null,n),0,r);a.push(In(s,l,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:l.x,y:l.labelY,secondaryY:l.secondaryY,textAnchor:l.textAnchor,direction:l.direction,hidden:s.hidden})}return i}function Di(e,t){let n=an(e)-an(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 an(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"craft":case"structure":case"phenomenon":return 5}}function Ai(e,t,n,r,i,a){for(let o of Fi(e,t,r,i)){let c=o==="left"||o==="right"?4:6;for(let s=0;s<=c;s+=1){let l=hn(e,o,s,a),u=In(e,l,a);if(!n.some(f=>fa(f,u)))return l}}return null}function Fi(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,a=mn(e,i,r),o=a==="below"?"above":"below",c=Ei(e,i,n),s=c==="right"?"left":"right";return e.object.type==="craft"||e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[c,a,s,o]:[a,c,o,s]}function mn(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 Ei(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 hn(e,t,n,r){let i=14*r;switch(t){case"above":{let a=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:a,secondaryY:a-16*r,textAnchor:"middle",direction:t}}case"below":{let a=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:a,secondaryY:a+16*r,textAnchor:"middle",direction:t}}case"left":{let a=e.x-(e.visualRadius+16*r+n*i),o=e.y-4*r;return{x:a,labelY:o,secondaryY:o+16*r,textAnchor:"end",direction:t}}case"right":{let a=e.x+e.visualRadius+16*r+n*i,o=e.y-4*r;return{x:a,labelY:o,secondaryY:o+16*r,textAnchor:"start",direction:t}}}}function Li(e,t,n,r,i,a){let o=e.filter(s=>!s.hidden&&!!s.backArcPath).map(s=>s.renderId),c=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:o},{id:"orbits-front",renderIds:c},{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:a.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function Ri(e,t,n,r,i,a){let o=new Map,c=s=>{if(!s)return null;let l=o.get(s);if(l)return l;let u=i.groupRoots.get(s)??null,f={renderId:s,rootObjectId:u,label:u??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:Te(0,0,0,0)};return o.set(s,f),f};for(let s of e){let l=c(s.groupId);l&&!s.hidden&&l.objectIds.push(s.objectId)}for(let s of t){let l=c(s.groupId);l&&!s.hidden&&l.orbitIds.push(s.objectId)}for(let s of n){let l=c(s.groupId);l&&!s.hidden&&l.leaderIds.push(s.objectId)}for(let s of r){let l=c(s.groupId);l&&!s.hidden&&l.labelIds.push(s.objectId)}for(let s of o.values())s.contentBounds=ua(s,e,t,n,r,a);return[...o.values()].sort((s,l)=>s.label.localeCompare(l.label))}function _i(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 zi(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),a=n.get(r.to);return{renderId:`${ge(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:a?.x??0,y2:a?.y??0,hidden:r.hidden||!i||!a||i.hidden||a.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function Ni(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let a=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],o=a.map(l=>r.get(l)).filter(Boolean),c=o.length>0?o.reduce((l,u)=>l+u.x,0)/o.length:0,s=o.length>0?o.reduce((l,u)=>l+u.y,0)/o.length:0;return{renderId:`${ge(i.id)}-event`,eventId:i.id,event:i,objectIds:a,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:c,y:s,hidden:i.hidden||o.length===0||o.every(l=>l.hidden)||n!==null&&i.id!==n}}).sort((i,a)=>i.event.id.localeCompare(a.event.id))}function Ci(e,t,n,r,i){let a=Vi(e,t,n),o=new Map;for(let[l,u]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[f,p,...m]=l.split(".");if(f!=="viewpoint"||!p||m.length===0)continue;let g=Ki(p);if(!g)continue;let h=m.join(".").toLowerCase(),I=o.get(g)??{id:g};Bi(I,h,u,e,t,n,r,i),o.set(g,I)}let c=[...o.values()].map(l=>Ui(l,t,n,i)).filter(Boolean),s=c.findIndex(l=>l.id===a.id);return s>=0?c.splice(s,1,{...a,...c[s],layers:{...a.layers,...c[s].layers},filter:c[s].filter??a.filter,generated:!1}):c.unshift(a),c.sort((l,u)=>l.id==="overview"?-1:u.id==="overview"?1:l.label.localeCompare(u.label))}function Vi(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",a=jt(null),o=$t(t,a);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:o,camera:a,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Bi(e,t,n,r,i,a,o,c){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=Me(s);return;case"projection":case"view":e.projection=yn(s)??i;return;case"preset":e.preset=Yi(s)??a;return;case"rotation":case"angle":e.rotationDeg=Oe(s)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Ye(),azimuth:Oe(s)};return;case"camera.elevation":e.camera={...e.camera??Ye(),elevation:Oe(s)};return;case"camera.roll":e.camera={...e.camera??Ye(),roll:Oe(s)};return;case"camera.distance":e.camera={...e.camera??Ye(),distance:on(s)};return;case"zoom":case"scale":e.scale=on(s);return;case"layers":e.layers=qi(s);return;case"query":e.filter={...e.filter??We(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??We(),objectTypes:Gi(s)};return;case"tags":e.filter={...e.filter??We(),tags:Me(s)};return;case"groups":e.filter={...e.filter??We(),groupIds:Hi(s,r,o,c)};return}}function Ui(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,a=e.select&&r.has(e.select)?e.select:i,o=Wi(e.filter),c=e.label?.trim()||Xi(e.id),s=e.projection??t,l=jt(e.camera??null),u=$t(s,l);return{id:e.id,label:c,summary:e.summary?.trim()||Zi(c,i,o),objectId:i,selectedObjectId:a,eventIds:[...new Set(e.eventIds??[])],projection:s,renderProjection:u,camera:l,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:o,generated:!1}}function We(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Ye(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Wi(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 yn(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function Yi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function Oe(e){let t=Number(e);return Number.isFinite(t)?t:null}function on(e){let t=Oe(e);return t!==null&&t>0?t:null}function qi(e){let t={};for(let n of Me(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 Gi(e){return Me(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="craft"||t==="structure"||t==="phenomenon")}function Hi(e,t,n,r){return Me(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.schemaVersion==="2.6"||t.groups.some(a=>a.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??Se(i):(r.has(i),Se(i)))}function Me(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 Xi(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Zi(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,a,o){let c=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,f=(p,m)=>{c=Math.min(c,p),s=Math.min(s,m),l=Math.max(l,p),u=Math.max(u,m)};for(let p of r)p.hidden||gn(p,f);for(let p of i)p.hidden||(f(p.x1,p.y1),f(p.x2,p.y2));for(let p of n)p.hidden||vn(p,f);for(let p of a)p.hidden||bn(p,f,o);return!Number.isFinite(c)||!Number.isFinite(s)?Te(0,0,e,t):Te(c,s,l,u)}function gn(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,a=jn(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,fn*2);for(let o of a)t(o.x-n,o.y-n),t(o.x+n,o.y+n)}function Te(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 vn(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 bn(e,t,n){let r=$n(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 wt(e,t,n,r,i,a,o,c){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:He(e,r,c.scaleModel,c.sceneMetricScale),sortKey:Xe(t,n,r)}),qe(e,i,a,o,c,r+1))}function qe(e,t,n,r,i,a){let o=t.get(e.id);if(!o)return;let c=[...i.orbitChildren.get(e.id)??[]].sort(Qi),s=ea(c,o.radius,i.spacingFactor,i.scaleModel,i.sceneMetricScale),l=ra(c,s);c.forEach((f,p)=>{let m=ta(f,p,c.length,o,s,l[p]??s.innerPx,i);n.push({object:f,parentId:e.id,kind:m.kind,cx:m.cx,cy:m.cy,radius:m.radius,rx:m.rx,ry:m.ry,rotationDeg:m.rotationDeg,band:m.band,bandThickness:m.bandThickness,frontArcPath:m.frontArcPath,backArcPath:m.backArcPath}),wt(f,m.objectX,m.objectY,a,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((f,p)=>{let m=Pe(p,u.length,-Math.PI/3),g=28*i.spacingFactor,h=De(m,o.radius,i.projection,i.projection==="isometric"?.9:1),I=De(m,o.radius+g,i.projection,i.projection==="isometric"?.9:1),M=o.x+h.x,k=o.y+h.y,b=o.x+I.x,O=o.y+I.y;t.set(f.id,{object:f,x:b,y:O,radius:He(f,a+1,i.scaleModel,i.sceneMetricScale),sortKey:Xe(b,O,a+1),anchorX:M,anchorY:k}),r.push({object:f,groupId:i.objectMap.has(f.id)?Se(da(f,i.objectMap)):null,x1:M,y1:k,x2:b,y2:O,mode:"surface"}),qe(f,t,n,r,i,a+1)})}function Qi(e,t){let n=Ge(e),r=Ge(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 ea(e,t,n,r,i){let a=e.map(m=>Ge(m)),o=a.filter(m=>m!==null),c=r.bodyScaleMode==="strict"?Math.max(2,8*n*r.orbitDistanceMultiplier):(e.length>2?54:64)*n*r.orbitDistanceMultiplier*.42,s=t+Math.max(c*1.2,24*n),l=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(o.length===0)return{metrics:a,minMetric:0,maxMetric:0,metricSpread:0,innerPx:s,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:c,pixelsPerMetric:i.pixelsPerMetric};let u=Math.min(...o),f=Math.max(...o),p=f-u;return{metrics:a,minMetric:u,maxMetric:f,metricSpread:p,innerPx:s,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:c,pixelsPerMetric:i.pixelsPerMetric}}function ta(e,t,n,r,i,a,o){let c=e.placement,s=e.type==="belt"||e.type==="ring";if(!c||c.mode!=="orbit"){let oe=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:oe,rotationDeg:0,band:s,bandThickness:s?12*o.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-oe}}let l=S(typeof c.eccentricity=="number"?c.eccentricity:0,0,.92),u=a,f=Math.max(u*Math.sqrt(1-l*l),u*.18),p=It(c.inclination)??0,m=o.projection==="isometric"?Math.max(hi,Math.cos(Ze(p)))*dn:1,g=Math.max(f*m,u*.14),h=It(c.angle)??0,I=u*l,M=kn(-I,0,h),k=r.x+M.x,b=r.y+M.y,O=aa(c.phase,t,n),W=xn(k,b,u,g,h,O),E=o.projection==="topdown"&&l<=1e-4&&Math.abs(h)<=1e-4,ae=s?oa(e,u,i,o.scaleModel):void 0;return{kind:E?"circle":"ellipse",cx:E?r.x:k,cy:E?r.y:b,radius:E?u:void 0,rx:E?void 0:u,ry:E?void 0:g,rotationDeg:h,band:s,bandThickness:ae,frontArcPath:o.projection==="isometric"||s?sn(k,b,u,g,h,0,Math.PI):void 0,backArcPath:o.projection==="isometric"||s?sn(k,b,u,g,h,Math.PI,Math.PI*2):void 0,objectX:W.x,objectY:W.y}}function na(e,t){return t.pixelsPerMetric!==null?e*t.pixelsPerMetric:t.innerPx+t.stepPx*ia(Math.max(e,0)+1)}function ra(e,t){let n=[];return e.forEach((r,i)=>{let a=Ge(r),o=t.innerPx+i*t.stepPx,c=a===null?o:na(a,t),s=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(c,s))}),n}function Ge(e){return!e.placement||e.placement.mode!=="orbit"?null:te(e.placement.semiMajor??e.placement.distance??null)}function ia(e){return Math.log(e)/Math.log(2)}function aa(e,t,n){let r=e?It(e):null;return r!==null?Ze(r-90):Pe(t,n,-Math.PI/2)}function oa(e,t,n,r){let i=te(Ke(e.properties.inner)),a=te(Ke(e.properties.outer));if(i!==null&&a!==null){let c=Math.abs(a-i);if(n.pixelsPerMetric!==null){let l=c*n.pixelsPerMetric;return r.bodyScaleMode==="strict"?Math.max(l*r.ringThicknessMultiplier,1):S(Math.max(l*r.ringThicknessMultiplier,8),8,54)}if(n.metricSpread>0)return S(c/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(i,a),1e-4);return S(c/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function sa(e,t,n,r,i,a,o,c,s){if(e.kind==="lagrange")return ca(e,t,n,a,o);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let u=Pe(r,i,Math.PI/5),f=(l.radius+36)*s.scaleModel.labelMultiplier,p=De(u,f,s.projection,s.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let u=Pe(r,i,Math.PI/6),f=(l.radius+36)*s.scaleModel.labelMultiplier,p=De(u,f,s.projection,s.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}return{x:a-c-170,y:o-c-86-r*58*s.scaleModel.freePlacementMultiplier}}function ca(e,t,n,r,i){let a=e.secondary?t.get(e.primary):pa(e.primary,t,n),o=t.get(e.secondary??e.primary);if(!a||!o)return{x:r*.7,y:i*.25};let c=o.x-a.x,s=o.y-a.y,l=Math.hypot(c,s)||1,u=c/l,f=s/l,p=-f,m=u,g=S(l*.25,24,68);switch(e.point){case"L1":return{x:o.x-u*g,y:o.y-f*g,anchorX:o.x,anchorY:o.y};case"L2":return{x:o.x+u*g,y:o.y+f*g,anchorX:o.x,anchorY:o.y};case"L3":return{x:a.x-u*g,y:a.y-f*g,anchorX:a.x,anchorY:a.y};case"L4":return{x:o.x+(u*.5-p*.8660254)*g,y:o.y+(f*.5-m*.8660254)*g,anchorX:o.x,anchorY:o.y};case"L5":return{x:o.x+(u*.5+p*.8660254)*g,y:o.y+(f*.5+m*.8660254)*g,anchorX:o.x,anchorY:o.y}}}function la(e,t){let n=new Map,r=new Map;for(let l of e){let u=wn(l,t);if(n.set(l.id,u),u){let f=r.get(u);f?f.push(l.id):r.set(u,[l.id])}r.has(l.id)||r.set(l.id,[])}let i=new Map,a=new Map,o=new Map,c=l=>{let u=i.get(l);if(u)return u;let f=new Set,p=[],m=n.get(l)??null;for(;m&&!f.has(m);)p.push(m),f.add(m),m=n.get(m)??null;return i.set(l,p),p},s=l=>{let u=o.get(a.get(l)??"");if(u)return u;let f=n.get(l)??null,p=t.get(l),m=l;return p?.placement&&p.placement.mode!=="free"&&f&&(m=s(f)),m};for(let l of e){c(l.id);let u=s(l.id),f=Se(u);a.set(l.id,f),o.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:a,groupRoots:o}}function wn(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 ua(e,t,n,r,i,a){let o=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=(f,p)=>{o=Math.min(o,f),c=Math.min(c,p),s=Math.max(s,f),l=Math.max(l,p)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&vn(f,u);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&gn(f,u);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of i)!f.hidden&&e.labelIds.includes(f.objectId)&&bn(f,u,a);return!Number.isFinite(o)||!Number.isFinite(c)?Te(0,0,0,0):Te(o,c,s,l)}function da(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=wn(n,t);if(!i)break;let a=t.get(i);if(!a)break;n=a}return n.id}function In(e,t,n){return $n(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function $n(e,t,n,r,i,a,o,c){let s=ba(a,o,c),l=s*2,u=i==="above"?18:12,f=i==="above"?8:12,p=e-s,m=e+s;return r==="start"?(p=e,m=e+l):r==="end"&&(p=e-l,m=e),{left:p,right:m,top:Math.min(t,n)-u,bottom:Math.max(t,n)+f}}function fa(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function pa(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function He(e,t,n,r){let i=ya(e.properties.radius,n,r);if(i!==null)return i;let a=n.bodyRadiusMultiplier;switch(e.type){case"star":return S((t===0?28:20)*a,n.minBodyRadius,n.maxBodyRadius);case"planet":return S(12*a,n.minBodyRadius,n.maxBodyRadius);case"moon":return S(7*a,n.minBodyRadius,n.maxBodyRadius);case"belt":return S(5*a,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return S(5*a,n.minBodyRadius,n.maxBodyRadius);case"comet":return S(6*a,n.minBodyRadius,n.maxBodyRadius);case"ring":return S(5*a,n.minBodyRadius,n.maxBodyRadius);case"craft":return S(5*a,n.minBodyRadius,n.maxBodyRadius);case"structure":return S(6*a,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return S(8*a,n.minBodyRadius,n.maxBodyRadius)}}function ma(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"craft":return t+1.5;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function te(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/ke;case"m":return e.value/1e3/ke;case"ly":return e.value*fi;case"pc":return e.value*pi;case"kpc":return e.value*mi;case"re":return e.value*li/ke;case"rj":return e.value*ui/ke;case"sol":return e.value*di/ke;default:return e.value}}function ha(e,t,n){let r=te(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 ya(e,t,n){let r=Ke(e);if(!r)return null;let i=te(r);if(n.pixelsPerMetric!==null&&i!==null&&i>0){let o=i*n.pixelsPerMetric*t.bodyRadiusMultiplier;return t.bodyScaleMode==="strict"?Math.max(o,.1):S(Math.max(o,t.minBodyRadius),t.minBodyRadius,t.maxBodyRadius)}let a;switch(r.unit){case"sol":a=S(r.value*22,14,40);break;case"re":a=S(r.value*10,6,18);break;case"km":a=S(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:a=S(r.value*4,4,20);break}return S(a*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function ga(e){return te(Ke(e.properties.radius))}function Ke(e){return!e||typeof e!="object"||!("value"in e)?null:e}function It(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Pe(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function sn(e,t,n,r,i,a,o){let c=jn(e,t,n,r,i,a,o,fn);return c.length===0?"":c.map((s,l)=>`${l===0?"M":"L"} ${un(s.x)} ${un(s.y)}`).join(" ")}function jn(e,t,n,r,i,a,o,c){let s=[];for(let l=0;l<=c;l+=1){let u=a+(o-a)*l/c;s.push(xn(e,t,n,r,i,u))}return s}function xn(e,t,n,r,i,a){let o=n*Math.cos(a),c=r*Math.sin(a),s=kn(o,c,i);return{x:e+s.x,y:t+s.y}}function kn(e,t,n){let r=Ze(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function De(e,t,n,r){let i=n==="isometric"?dn*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function Xe(e,t,n){return t*1e3+e+n*.01}function S(e,t,n){return Math.min(Math.max(e,t),n)}function cn(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function ge(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function Se(e){return`${ge(e)}-group`}function va(e){return typeof e=="string"&&e.trim()?e:void 0}function ba(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 ln(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Ze(e){return e*Math.PI/180}function un(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var Mn=86400,Je=Mn*365.25,Qe=18,On=180;function Tn(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=K(e,n),i=ja(r.layoutPreset,t.spatialScaleModel),a={x:r.contentBounds.centerX,y:r.contentBounds.centerY},o=new Map(r.objects.map(h=>[h.objectId,h])),c=new Map(r.orbitVisuals.map(h=>[h.objectId,h])),s=new Map;for(let h of r.objects){let I=h.object.placement;!I||I.mode!=="orbit"||s.set(h.objectId,kt(I))}let l=Math.min(...[...s.values()].filter(h=>Number.isFinite(h)&&h>0))||1,u=new Map,f=r.objects.map(h=>wa(h,r,a,o,c,i,u,l)),p=new Map(f.map(h=>[h.objectId,h])),m=r.orbitVisuals.map(h=>Ia(h,p,l,r.activeEventId!==null)),g=f.map(h=>({objectId:h.objectId,center:{...h.position},radius:h.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:ka(f),semanticGroups:r.semanticGroups,viewpoints:r.viewpoints,activeEventId:r.activeEventId,timeFrozen:r.activeEventId!==null,objects:f,orbits:m,focusTargets:g}}function wa(e,t,n,r,i,a,o,c){let s=et(e,t,n,r,i,o),l=Ot(e.object,i.get(e.objectId),c,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:ve(e.radius*a.bodyRadiusMultiplier,a.minBodyRadius,a.maxBodyRadius),visualRadius:ve(e.visualRadius*a.bodyRadiusMultiplier,a.minBodyRadius,a.maxBodyRadius+24),label:e.label,secondaryLabel:e.secondaryLabel,fillColor:e.fillColor,imageHref:e.imageHref,hidden:e.hidden,motion:l}}function Ia(e,t,n,r){let i=t.get(e.objectId),a=t.get(e.parentId);return{objectId:e.objectId,object:e.object,parentId:e.parentId,groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),center:a?.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??tt(e.object.placement?.mode==="orbit"?e.object.placement.inclination:void 0)??0,band:e.band,bandThickness:e.bandThickness,hidden:e.hidden,motion:i?.motion??Ot(e.object,e,n,r)}}function et(e,t,n,r,i,a){let o=a.get(e.objectId);if(o)return o;let c=e.object.placement,s;if(c?.mode==="orbit"&&e.parentId){let l=r.get(e.parentId),u=l?et(l,t,n,r,i,a):{x:0,y:0,z:0},f=i.get(e.objectId),p=Ot(e.object,f,1,t.activeEventId!==null),m=p?Dn(p,0):{x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};s=An(u,m)}else if(c?.mode==="surface"&&e.parentId){let l=r.get(e.parentId),u=l?et(l,t,n,r,i,a):{x:0,y:0,z:0},f=l?.visualRadius??16,p=Oa(e.objectId),m=p*Math.PI*2;s={x:u.x+Math.cos(m)*(f+e.visualRadius*.9),y:u.y+Math.sin(p*Math.PI)*Math.max(e.visualRadius*.2,2),z:u.z+Math.sin(m)*(f+e.visualRadius*.9)}}else if(c?.mode==="at"&&e.parentId){let l=r.get(e.parentId),u=l?et(l,t,n,r,i,a):{x:0,y:0,z:0},f=e.anchorX??l?.x??n.x,p=e.anchorY??l?.y??n.y;s={x:u.x+(e.x-f),y:u.y,z:u.z+(e.y-p)}}else s={x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};return a.set(e.objectId,s),s}function Pn(e,t){let n=new Map(e.objects.map(a=>[a.objectId,a])),r=new Map,i=a=>{let o=r.get(a);if(o)return o;let c=n.get(a);if(!c)return{x:0,y:0,z:0};let s={...c.position};if(c.motion&&c.parentId){let l=i(c.parentId),u=Dn(c.motion,e.timeFrozen?0:t);s=An(l,u)}return r.set(a,s),s};for(let a of e.objects)i(a.objectId);return r}function Dn(e,t){let n=e.phase0Deg+e.angularVelocityDegPerSecond*t,r=xt(n),i=xt(e.rotationDeg),a=xt(e.inclinationDeg),o=Math.cos(r)*e.semiMajor,c=Math.sin(r)*e.semiMinor,s=o*Math.cos(i)-c*Math.sin(i),l=o*Math.sin(i)+c*Math.cos(i);return{x:s,y:l*Math.sin(a),z:l*Math.cos(a)}}function Ot(e,t,n,r){let i=e.placement;if(!i||i.mode!=="orbit")return null;let a=t?.radius??t?.rx??ve(kt(i)*48,24,1200),o=t?.radius??t?.ry??a,c=$a(i.period),s=kt(i),l=ve(s/Math.max(n,1e-4),1,20),u=ve(c?Qe*l:Qe*Math.pow(l,.75),Qe,On);return{phase0Deg:tt(i.phase)??0,rotationDeg:tt(i.angle)??t?.rotationDeg??0,inclinationDeg:tt(i.inclination)??0,semiMajor:a,semiMinor:o,eccentricity:i.eccentricity??0,periodSeconds:c,angularVelocityDegPerSecond:360/Math.max(u,.001),heuristic:c===null,frozen:r}}function kt(e){let t=Sn(e.semiMajor)??Sn(e.distance)??1;return Math.max(t,.01)}function Sn(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 $a(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*Mn;case"y":return e.value*Je;case"ky":return e.value*Je*1e3;case"my":return e.value*Je*1e6;case"gy":return e.value*Je*1e9;default:return null}}function tt(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ja(e,t){return{...xa(e),...t}}function xa(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 ka(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,a=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY;for(let c of e)t=Math.min(t,c.position.x-c.visualRadius),n=Math.min(n,c.position.y-c.visualRadius),r=Math.min(r,c.position.z-c.visualRadius),i=Math.max(i,c.position.x+c.visualRadius),a=Math.max(a,c.position.y+c.visualRadius),o=Math.max(o,c.position.z+c.visualRadius);return{minX:t,minY:n,minZ:r,maxX:i,maxY:a,maxZ:o,width:i-t,height:a-n,depth:o-r,center:{x:(t+i)/2,y:(n+a)/2,z:(r+o)/2}}}function An(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function Oa(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 ve(e,t,n){return Math.min(Math.max(e,t),n)}function xt(e){return e*Math.PI/180}function Fn(e){return{trajectoryId:e.id,craftObjectId:e.craftObjectId,segments:e.segments.map(t=>({segmentId:t.id,kind:t.kind,fromObjectId:t.fromObjectId,toObjectId:t.toObjectId,aroundObjectId:t.aroundObjectId,assistObjectId:t.assist?.objectId??null,duration:t.duration??null,deltaV:t.deltaV??null})),maneuvers:e.segments.flatMap(t=>t.maneuvers.map(n=>Sa(t.id,n)))}}function Sa(e,t){return{segmentId:e,maneuverId:t.id,kind:t.kind,epoch:t.epoch,deltaV:t.deltaV??null,duration:t.duration??null}}function Ae(e,t={}){let n=K(e,t),r=[],i=Pa(e,r),a=Da(e,r),o=Ta(e,n.renderPreset??t.preset??null,n.projection),c=e.system?Ma(e,o,i,a,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(s=>!s.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(s=>!s.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"3.0",schemaVersion:"3.0",sourceVersion:e.version,theme:e.theme??null,system:c,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),trajectories:[],objects:e.objects.map(Rn).map(Ra),diagnostics:r}}function nt(e,t={}){return Wa(Ae(e,t))}function Fe(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:Va(e.system),info:Ba(e.system)}:null,r=e.objects.map(Rn);return _a(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(Fa),trajectories:e.trajectories.map(La),objects:r}}function Ln(e){return Fe(e)}function Ma(e,t,n,r,i,a){let o=K(e,{preset:a??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:n,viewpoints:o.viewpoints.map(Aa),annotations:r}}function Ta(e,t,n){let r=typeof e.system?.properties.view=="string"?e.system.properties.view.toLowerCase():null;return{view:r==="topdown"||r==="isometric"||r==="orthographic"||r==="perspective"?r:n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function Pa(e,t){let n={};for(let[i,a]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=a);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function Da(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,a,...o]=r.split(".");if(!a||o.length===0)continue;let c=En(a);if(!c)continue;let s=n.get(c)??{id:c};switch(o.join(".").toLowerCase()){case"label":s.label=i;break;case"target":case"object":s.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":s.body=i;break;case"tags":s.tags=Na(i);break}n.set(c,s)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let a=En(`${r.id}-notes`);n.has(a)||(n.set(a,{id:a,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(o=>typeof o=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${a}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??Ca(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,i)=>r.label.localeCompare(i.label))}function Aa(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,events:[...e.eventIds],projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,camera:e.camera?{...e.camera}:null,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function Rn(e){return{...e,trajectoryId:e.trajectoryId??null,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:za(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Fa(e){return{...e,trajectoryId:e.trajectoryId??null,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(Ea)}}function Ea(e){return{objectId:e.objectId,placement:_n(e.placement),trajectorySegmentId:e.trajectorySegmentId??null,trajectoryManeuverId:e.trajectoryManeuverId??null,inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function La(e){return structuredClone(e)}function Ra(e){if(e.type!=="structure")return e;let t=typeof e.properties.kind=="string"?e.properties.kind.toLowerCase():"";return["ship","probe","station"].includes(t)?{...e,type:"craft"}:e}function _n(e){return e?structuredClone(e):null}function _a(e,t,n){if(!n)return;let r=t.find(o=>o.id===n);if(!r)return;let i=new Map(e.map(o=>[o.id,o])),a=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(o=>o.objectId)]);for(let o of a){let c=i.get(o);c&&(r.epoch&&(c.epoch=r.epoch),r.referencePlane&&(c.referencePlane=r.referencePlane))}for(let o of r.positions){let c=i.get(o.objectId);c&&(o.placement&&(c.placement=_n(o.placement)),o.inner&&(c.properties.inner={...o.inner}),o.outer&&(c.properties.outer={...o.outer}),o.epoch&&(c.epoch=o.epoch),o.referencePlane&&(c.referencePlane=o.referencePlane))}}function za(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 Na(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function En(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ca(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Va(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 Ba(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=Ua(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 Ua(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(" ")}function Wa(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var zn=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function it(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.6"||n==="3.0"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="3.0"||e.version==="2.6"||e.version==="2.0-draft"){if(n==="2.0-draft"){let s=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.6"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:nt(e);return St(s)}let c=e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.6"||e.version==="3.0"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:Ae(e);return(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.6"||n==="3.0")&&c.version!==n?rt({...c,version:n,schemaVersion:n}):rt(c)}let i=[],a=e;a.system&&i.push(...Ya(a.system));let o=[...a.objects].sort(Pt);for(let c of o)i.length>0&&i.push(""),i.push(...Ga(c));return i.join(`
2
+ `)}function rt(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...Cn(e.system));for(let r of[...e.groups].sort(X))t.push(""),t.push(...Wn(r));for(let r of[...e.relations].sort(X))t.push(""),t.push(...Yn(r));for(let r of[...e.events].sort(X))t.push(""),t.push(...qn(r));for(let r of[...e.trajectories].sort(X))t.push(""),t.push(...Ja(r));let n=[...e.objects].sort(Pt);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...Vn(r))}),t.join(`
3
+ `)}function St(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...Cn(t.system));for(let i of[...t.groups].sort(X))n.push(""),n.push(...Wn(i));for(let i of[...t.relations].sort(X))n.push(""),n.push(...Yn(i));for(let i of[...t.events].sort(X))n.push(""),n.push(...qn(i));let r=[...t.objects].sort(Pt);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,a)=>{a>0&&n.push(""),n.push(...Vn(i))}),n.join(`
4
+ `)}function Ya(e){return qa("system",e.id,e.properties,null,e.info)}function qa(e,t,n,r,i){let a=[`${e} ${t}`],o=[...Mt(r),...Un(n)];for(let s of o)a.push(` ${s}`);let c=Object.entries(i).sort(([s],[l])=>s.localeCompare(l));if(c.length>0){o.length>0&&a.push(""),a.push(" info");for(let[s,l]of c)a.push(` ${s} ${y(l)}`)}return a}function Cn(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${y(e.title)}`),e.description&&t.push(` description ${y(e.description)}`),e.epoch&&t.push(` epoch ${y(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${y(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${y(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${y(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${y(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([i],[a])=>i.localeCompare(a)))t.push(` ${n} ${y(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...Ka(n));for(let n of e.annotations)t.push(""),t.push(...Xa(n));return t}function Ga(e){return Bn(e.type,e.id,e)}function Vn(e){return Bn(`object ${e.type}`,e.id,e)}function Bn(e,t,n){let r=[`${e} ${t}`],i=[...Mt(n.placement),...Un(n.properties),...Ha(n)];for(let o of i)r.push(` ${o}`);let a=Object.entries(n.info).sort(([o],[c])=>o.localeCompare(c));if(a.length>0){i.length>0&&r.push(""),r.push(" info");for(let[o,c]of a)r.push(` ${o} ${y(c)}`)}for(let o of["climate","habitability","settlement"]){let c=Object.entries(n.typedBlocks?.[o]??{}).sort(([s],[l])=>s.localeCompare(l));if(c.length>0){r.push(""),r.push(` ${o}`);for(let[s,l]of c)r.push(` ${s} ${y(l)}`)}}return r}function Mt(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...D("distance",e.distance),...D("semiMajor",e.semiMajor),...no("eccentricity",e.eccentricity),...D("period",e.period),...D("angle",e.angle),...D("inclination",e.inclination),...D("phase",e.phase)];case"at":return[`at ${ro(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?Tt(e.distance):e.descriptor??""}`.trim()]}}function Un(e){return Object.keys(e).sort(ao).map(t=>`${t} ${Gn(e[t])}`)}function Ha(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.trajectoryId&&t.push(`trajectory ${e.trajectoryId}`),e.epoch&&t.push(`epoch ${y(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${y(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let n of e.deriveRules??[])t.push(`derive ${n.field} ${n.strategy}`);for(let n of e.validationRules??[])t.push(`validate ${n.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let n of e.tolerances??[])t.push(`tolerance ${n.field} ${Gn(n.value)}`);return t}function Ka(e){let t=[`viewpoint ${e.id}`,` label ${y(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`),e.camera&&to(e.camera)&&(t.push(" camera"),e.camera.azimuth!==null&&t.push(` azimuth ${e.camera.azimuth}`),e.camera.elevation!==null&&t.push(` elevation ${e.camera.elevation}`),e.camera.roll!==null&&t.push(` roll ${e.camera.roll}`),e.camera.distance!==null&&t.push(` distance ${e.camera.distance}`));let n=io(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.events.length>0&&t.push(` events ${e.events.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${y(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map(y).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function Xa(e){let t=[`annotation ${e.id}`,` label ${y(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${y(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),t}function Wn(e){let t=[`group ${e.id}`,` label ${y(e.label)}`];return e.summary&&t.push(` summary ${y(e.summary)}`),e.color&&t.push(` color ${y(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function Yn(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${y(e.from)}`),e.to&&t.push(` to ${y(e.to)}`),e.kind&&t.push(` kind ${y(e.kind)}`),e.label&&t.push(` label ${y(e.label)}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.color&&t.push(` color ${y(e.color)}`),e.hidden&&t.push(" hidden true"),t}function qn(e){let t=[`event ${e.id}`,` kind ${y(e.kind)}`];if(e.label&&t.push(` label ${y(e.label)}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.trajectoryId&&t.push(` trajectory ${e.trajectoryId}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${y(e.timing)}`),e.visibility&&t.push(` visibility ${y(e.visibility)}`),e.epoch&&t.push(` epoch ${y(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${y(e.referencePlane)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.color&&t.push(` color ${y(e.color)}`),e.hidden&&t.push(" hidden true"),e.positions.length>0){t.push(""),t.push(" positions");for(let n of[...e.positions].sort(oo)){t.push(` pose ${n.objectId}`);for(let r of Za(n))t.push(` ${r}`)}}return t}function Za(e){return[...Mt(e.placement),...e.trajectorySegmentId?[`segment ${e.trajectorySegmentId}`]:[],...e.trajectoryManeuverId?[`maneuver ${e.trajectoryManeuverId}`]:[],...e.epoch?[`epoch ${y(e.epoch)}`]:[],...e.referencePlane?[`referencePlane ${y(e.referencePlane)}`]:[],...D("inner",e.inner),...D("outer",e.outer)]}function Ja(e){let t=[`trajectory ${e.id}`];e.label&&t.push(` label ${y(e.label)}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.craftObjectId&&t.push(` craft ${e.craftObjectId}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.color&&t.push(` color ${y(e.color)}`),e.hidden&&t.push(" hidden true");for(let n of[...e.segments].sort(X)){t.push(""),t.push(` segment ${n.id}`);for(let r of Qa(n))t.push(` ${r}`);for(let r of[...n.maneuvers].sort(X)){t.push(` maneuver ${r.id}`);for(let i of eo(r))t.push(` ${i}`)}}return t}function Qa(e){return[`kind ${e.kind}`,...e.label?[`label ${y(e.label)}`]:[],...e.summary?[`summary ${y(e.summary)}`]:[],...e.fromObjectId?[`from ${e.fromObjectId}`]:[],...e.toObjectId?[`to ${e.toObjectId}`]:[],...e.aroundObjectId?[`around ${e.aroundObjectId}`]:[],...e.assist?.objectId?[`assist ${e.assist.objectId}`]:[],...e.epoch?[`epoch ${y(e.epoch)}`]:[],...D("periapsis",e.periapsis),...D("apoapsis",e.apoapsis),...D("inclination",e.inclination),...D("duration",e.duration),...D("deltaV",e.deltaV),...D("phaseAngle",e.phaseAngle),...D("turnAngle",e.turnAngle),...D("energy",e.energy),...e.notes.length>0?[`notes ${e.notes.map(y).join(" ")}`]:[]]}function eo(e){return[`kind ${y(e.kind)}`,...e.label?[`label ${y(e.label)}`]:[],...e.epoch?[`epoch ${y(e.epoch)}`]:[],...D("deltaV",e.deltaV),...D("duration",e.duration),...e.notes.length>0?[`notes ${e.notes.map(y).join(" ")}`]:[]]}function to(e){return e.azimuth!==null||e.elevation!==null||e.roll!==null||e.distance!==null}function Gn(e){return Array.isArray(e)?e.map(t=>y(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?y(e):Tt(e)}function Tt(e){return`${e.value}${e.unit??""}`}function D(e,t){return t?[`${e} ${Tt(t)}`]:[]}function no(e,t){return t===void 0?[]:[`${e} ${t}`]}function ro(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function io(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}function ao(e,t){let n=zn.indexOf(e),r=zn.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function Pt(e,t){let n=Nn(e.type),r=Nn(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function X(e,t){return e.id.localeCompare(t.id)}function oo(e,t){return e.objectId.localeCompare(t.objectId)}function Nn(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"craft":return 7;case"structure":return 8;case"phenomenon":return 9}}function y(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var Hn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,so=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),co=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Z(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function be(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function R(e,t,n){let r=e.match(Hn);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=F(n);if(a?.unitFamily&&!xe(a.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Dt(e){let t=e.match(Hn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function at(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function J(e,t,n){let r=so.get(e.toLowerCase());if(r===void 0)throw d.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Kn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.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 d.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 lo(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(co);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw d.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Xn(e,t,n){let r=F(e);if(!r)throw d.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw d.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return J(Ee(t,e,n),e,n);case"number":return at(Ee(t,e,n),e,n);case"unit":return R(Ee(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&lo(i,n),i}}}function At(e,t,n){let r=F(e);if(!r)throw d.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw d.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function Ee(e,t,n){if(e.length!==1)throw d.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var Jn=new Set(["star","planet","moon","asteroid","comet"]),uo=332946.0487,fo=1047.3486,ot=1495978707e-1,po=6371,mo=695700,ho=63241.077,yo=206264.806,go=206264806;function Le(e,t){let n=[],r=new Map(e.objects.map(s=>[s.id,s])),i=new Set(e.groups.map(s=>s.id)),a=new Set(e.events.map(s=>s.id)),o=new Map(e.trajectories.map(s=>[s.id,s]));e.system||n.push(v("validate.system.required","Atlas documents must declare exactly one system."));let c=new Map;for(let[s,l]of[["group",e.groups.map(u=>u.id)],["viewpoint",e.system?.viewpoints.map(u=>u.id)??[]],["annotation",e.system?.annotations.map(u=>u.id)??[]],["relation",e.relations.map(u=>u.id)],["event",e.events.map(u=>u.id)],["trajectory",e.trajectories.map(u=>u.id)],["object",e.objects.map(u=>u.id)]])for(let u of l){let f=c.get(u);f?n.push(v("validate.id.duplicate",`Duplicate ${s} id "${u}" already used by ${f}.`)):c.set(u,s)}for(let s of e.relations)vo(s,r,n);for(let s of e.system?.viewpoints??[])bo(s,i,a,t,n,r);for(let s of e.objects)wo(s,e.system,r,i,o,n);for(let s of e.events)Io(s,e.system,r,o,n);for(let s of e.trajectories)jo(s,r,n);return n}function vo(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 bo(e,t,n,r,i,a){let o=e.filter;if(r==="2.1"||r==="2.5"||r==="2.6"){if(o)for(let c of o.groupIds)t.has(c)||i.push(x("validate.viewpoint.group.unknown",`Unknown group "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let c of e.events??[])n.has(c)||i.push(x("validate.viewpoint.event.unknown",`Unknown event "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}Po(e.projection,i,`viewpoint.${e.id}.projection`,e.id),Do(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,o,a)}function wo(e,t,n,r,i,a){let o=e.placement,c=o?.mode==="orbit"?o:null,s=o?.mode==="orbit"?n.get(o.target)??null:null;if(e.groups)for(let l of e.groups)r.has(l)||a.push(x("validate.group.unknown",`Unknown group "${l}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&a.push(x("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&a.push(x("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),e.trajectoryId&&(i.has(e.trajectoryId)?Qn(e)||a.push(v("validate.trajectory.object.invalidType",`Only craft or legacy ship-like structures may reference trajectories; found "${e.type}" on "${e.id}".`,e.id,"trajectory")):a.push(v("validate.trajectory.object.unknown",`Unknown trajectory "${e.trajectoryId}" on "${e.id}".`,e.id,"trajectory"))),c&&(n.has(c.target)||a.push(v("validate.orbit.target.unknown",`Unknown placement target "${c.target}" on "${e.id}".`,e.id,"orbit")),c.distance&&c.semiMajor&&a.push(v("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),c.phase&&!e.epoch&&!t?.epoch&&a.push(x("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),c.inclination&&!e.referencePlane&&!t?.referencePlane&&a.push(x("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),c.period&&!Et(s?.properties.mass)&&a.push(x("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),o?.mode==="surface"){let l=n.get(o.target);l?Jn.has(l.type)||a.push(v("validate.surface.target.invalid",`Surface target "${o.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):a.push(v("validate.surface.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"surface"))}if(o?.mode==="at"&&(e.type!=="craft"&&e.type!=="structure"&&e.type!=="phenomenon"&&a.push(v("validate.at.objectType",`Only craft, structures, and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Mo(e,n,a)||a.push(v("validate.at.target.unknown",`Unknown at-reference target "${o.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let l=n.get(e.resonance.targetObjectId);l?(e.placement?.mode!=="orbit"||l.placement?.mode!=="orbit"||e.placement.target!==l.placement.target)&&a.push(x("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):a.push(v("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let l of e.deriveRules??[]){if(l.field!=="period"||l.strategy!=="kepler"){a.push(x("validate.derive.unsupported",`Unsupported derive rule "${l.field} ${l.strategy}" on "${e.id}".`,e.id,"derive"));continue}let u=Zn(e,s);if(u===null){a.push(x("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}c?.period||a.push(Ft("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Lo(u)}.`,e.id,"derive"))}for(let l of e.validationRules??[]){if(l.rule!=="kepler"){a.push(x("validate.rule.unsupported",`Unsupported validation rule "${l.rule}" on "${e.id}".`,e.id,"validate"));continue}let u=er(c?.period),f=Zn(e,s);if(u===null||f===null)continue;let p=Eo(e,"period");Math.abs(u-f)>p&&a.push(v("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function Io(e,t,n,r,i){let a=`event.${e.id}`,o=new Set;e.kind.trim()||i.push(v("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${a}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(x("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${a}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(x("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${a}.referencePlane`)),e.trajectoryId&&!r.has(e.trajectoryId)&&i.push(v("validate.event.trajectory.unknown",`Unknown trajectory "${e.trajectoryId}" on event "${e.id}".`,void 0,`${a}.trajectory`)),!e.targetObjectId&&e.participantObjectIds.length===0&&i.push(v("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${a}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),n.has(e.targetObjectId)||i.push(v("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${a}.target`)));let c=new Set;for(let u of e.participantObjectIds){if(o.add(u),c.has(u)){i.push(x("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${u}".`,void 0,`${a}.participants`));continue}c.add(u),n.has(u)||i.push(v("validate.event.participants.unknown",`Unknown event participant "${u}" on "${e.id}".`,void 0,`${a}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&i.push(x("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${a}.target`)),e.positions.length===0&&i.push(x("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${a}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.size<3&&i.push(x("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${a}.participants`));let s=new Set;for(let u of e.positions){let f=`${a}.pose.${u.objectId}`;if(s.has(u.objectId)){i.push(v("validate.event.pose.duplicate",`Event "${e.id}" defines "${u.objectId}" more than once in positions.`,void 0,f));continue}s.add(u.objectId);let p=n.get(u.objectId);if(!p){i.push(v("validate.event.pose.object.unknown",`Unknown event pose object "${u.objectId}" on "${e.id}".`,void 0,f));continue}o.has(u.objectId)||i.push(x("validate.event.pose.unreferenced",`Event pose "${u.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,f)),$o(u,p,e,t,n,r,i,f,e.id)}let l=[...o].filter(u=>!s.has(u));e.positions.length>0&&l.length>0&&i.push(x("validate.event.positions.partial",`Event "${e.id}" leaves ${l.length} referenced object(s) on their base placement.`,void 0,`${a}.positions`))}function $o(e,t,n,r,i,a,o,c,s){let l=e.placement;if(!l){o.push(v("validate.event.pose.placement.required",`Event "${s}" pose "${e.objectId}" is missing a placement mode.`,void 0,c));return}if(e.trajectorySegmentId&&!Oo(a,e.trajectorySegmentId)&&o.push(v("validate.event.pose.segment.unknown",`Unknown trajectory segment "${e.trajectorySegmentId}" on "${s}:${e.objectId}".`,void 0,`${c}.segment`)),e.trajectoryManeuverId&&!So(a,e.trajectoryManeuverId)&&o.push(v("validate.event.pose.maneuver.unknown",`Unknown trajectory maneuver "${e.trajectoryManeuverId}" on "${s}:${e.objectId}".`,void 0,`${c}.maneuver`)),l.mode==="orbit"){i.has(l.target)||o.push(v("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${l.target}" on "${s}:${e.objectId}".`,void 0,`${c}.orbit`)),l.distance&&l.semiMajor&&o.push(v("validate.event.pose.orbit.distanceConflict",`Event "${s}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${c}.distance`)),l.phase&&!Ao(r,t,n,e)&&o.push(x("validate.event.pose.phase.epochMissing",`Event "${s}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${c}.phase`)),l.inclination&&!Fo(r,t,n,e)&&o.push(x("validate.event.pose.inclination.referencePlaneMissing",`Event "${s}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${c}.inclination`)),l.period&&!Et(i.get(l.target)?.properties.mass)&&o.push(x("validate.event.pose.period.massMissing",`Event "${s}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${c}.period`));return}if(l.mode==="surface"){let u=i.get(l.target);u?Jn.has(u.type)||o.push(v("validate.event.pose.surface.target.invalid",`Event surface target "${l.target}" on "${s}:${e.objectId}" is not surface-capable.`,void 0,`${c}.surface`)):o.push(v("validate.event.pose.surface.target.unknown",`Unknown event surface target "${l.target}" on "${s}:${e.objectId}".`,void 0,`${c}.surface`));return}if(l.mode==="at"){t.type!=="craft"&&t.type!=="structure"&&t.type!=="phenomenon"&&o.push(v("validate.event.pose.at.objectType",`Only craft, structures, and phenomena may use "at" placement in events; found "${t.type}" on "${s}:${e.objectId}".`,void 0,`${c}.at`));let u=l.reference;u.kind==="named"&&!i.has(u.name)?o.push(v("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${l.target}" on "${s}:${e.objectId}".`,void 0,`${c}.at`)):u.kind==="anchor"&&!i.has(u.objectId)?o.push(v("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${u.objectId}" on "${s}:${e.objectId}".`,void 0,`${c}.at`)):u.kind==="lagrange"&&(i.has(u.primary)?u.secondary&&!i.has(u.secondary)&&o.push(v("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${u.secondary}" on "${s}:${e.objectId}".`,void 0,`${c}.at`)):o.push(v("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${u.primary}" on "${s}:${e.objectId}".`,void 0,`${c}.at`)))}}function jo(e,t,n){if(e.craftObjectId){let r=t.get(e.craftObjectId);r?Qn(r)||n.push(v("validate.trajectory.craft.invalidType",`Trajectory "${e.id}" targets "${e.craftObjectId}", which is not craft-like.`,void 0,`trajectory.${e.id}.craft`)):n.push(v("validate.trajectory.craft.unknown",`Unknown craft "${e.craftObjectId}" on trajectory "${e.id}".`,void 0,`trajectory.${e.id}.craft`))}for(let r of e.segments)xo(e.id,r,t,n)}function xo(e,t,n,r){let i=`trajectory.${e}.segment.${t.id}`;for(let[a,o]of[["from",t.fromObjectId],["to",t.toObjectId],["around",t.aroundObjectId]])o&&!n.has(o)&&r.push(v(`validate.trajectory.segment.${a}.unknown`,`Unknown ${a} object "${o}" on trajectory "${e}" segment "${t.id}".`,void 0,`${i}.${a}`));t.assist?.objectId&&!n.has(t.assist.objectId)&&r.push(v("validate.trajectory.segment.assist.unknown",`Unknown assist object "${t.assist.objectId}" on trajectory "${e}" segment "${t.id}".`,void 0,`${i}.assist`)),t.kind==="flyby"&&!t.assist?.objectId&&r.push(v("validate.trajectory.segment.assist.required",`Trajectory "${e}" segment "${t.id}" is a flyby and requires an "assist" object.`,void 0,`${i}.assist`)),(t.kind==="capture"||t.kind==="departure")&&!t.toObjectId&&!t.aroundObjectId&&r.push(v("validate.trajectory.segment.target.required",`Trajectory "${e}" segment "${t.id}" requires a target reference.`,void 0,`${i}.to`));for(let a of t.maneuvers)ko(e,t.id,a,r)}function ko(e,t,n,r){n.kind.trim()||r.push(v("validate.trajectory.maneuver.kind.required",`Trajectory "${e}" segment "${t}" maneuver "${n.id}" is missing a kind.`,void 0,`trajectory.${e}.segment.${t}.maneuver.${n.id}.kind`))}function Qn(e){if(e.type==="craft")return!0;if(e.type!=="structure")return!1;let t=typeof e.properties.kind=="string"?e.properties.kind.toLowerCase():"";return t==="ship"||t==="probe"||t==="station"}function Oo(e,t){for(let n of e.values()){let r=n.segments.find(i=>i.id===t);if(r)return r}return null}function So(e,t){for(let n of e.values())for(let r of n.segments){let i=r.maneuvers.find(a=>a.id===t);if(i)return i}return null}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 Zn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=To(n.semiMajor??n.distance),i=Et(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function To(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/ot;case"m":return e.value/(ot*1e3);case"ly":return e.value*ho;case"pc":return e.value*yo;case"kpc":return e.value*go;case"re":return e.value*po/ot;case"sol":return e.value*mo/ot;default:return null}}function Et(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/uo;case"mj":return t.value/fo;default:return null}}function er(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 Po(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 Do(e,t,n,r,i,a,o,c,s){if(!e)return;let l=`viewpoint.${i}.camera`;for(let[f,p]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])p!==null&&(!Number.isFinite(p)||f==="distance"&&p<=0)&&r.push(v("validate.viewpoint.camera.invalid",`Invalid camera ${f} "${String(p)}" in viewpoint "${i}".`,void 0,`${l}.${f}`));e.distance!==null&&t!=="perspective"&&r.push(x("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${l}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(x("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,l)),t==="isometric"&&e.elevation!==null&&r.push(Ft("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${l}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(x("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${l}.azimuth`)),a!==null&&s.has(a)||o!==null&&s.has(o)||c||r.push(Ft("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,l))}function Ao(e,t,n,r){return ne(r?.epoch)??ne(n?.epoch)??ne(t.epoch)??ne(e?.epoch)??null}function Fo(e,t,n,r){return ne(r?.referencePlane)??ne(n?.referencePlane)??ne(t.referencePlane)??ne(e?.referencePlane)??null}function ne(e){return typeof e=="string"&&e.trim()?e.trim():null}function Eo(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?er(n)??0:0}function Lo(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 x(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function Ft(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Ro=new Set(["climate","habitability","settlement"]),_o=new Set(["departure","transfer","flyby","capture","stationkeeping","escape"]),st=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","trajectory"]){let t=F(e);t&&st.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},{key:"trajectory",inlineMode:"single",allowRepeat:!1}])st.set(e.key,{key:e.key,version:e.key==="trajectory"?"3.0":"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var zo=new Set(st.keys()),nr=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane","segment","maneuver"]);function ct(e){return ir(e)}function rr(e){return ir(e,"2.0-draft")}function ir(e,t){let n=Ms(e),r=n.source.split(/\r?\n/),i=[],a=!1,o="2.0",c=null,s=null,l=[],u=[],f=[],p=[],m=[],g=new Map,h=!1,I=!1,M=new Set,k=new Set,b=new Set,O=new Set,W=new Set,E=new Set;for(let T=0;T<r.length;T++){let ce=r[T],Y=T+1;if(!ce.trim())continue;let A=Ce(ce),q=ue(ce.slice(A),{line:Y,columnOffset:A});if(q.length!==0){if(!a){o=No(q,Y),a=!0,n.comments.length>0&&_e(o,"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 ${o}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(A===0){s=Co(q,Y,o,i,c,l,u,f,p,m,g,M,k,b,O,W,E,{sawDefaults:h,sawAtlas:I}),s.kind==="system"?c=s.system:s.kind==="defaults"?h=!0:s.kind==="atlas"&&(I=!0);continue}if(!s)throw new d("Indented line without parent atlas section",Y,A+1);Ko(s,A,q,Y)}}if(!a)throw new d('Missing required atlas schema header "schema 2.0" or "schema 3.0"');let ae=l.map(T=>gs(T,o,i)),oe=p.map(T=>vs(T,g.get(T.id)??[])),me=t??(o==="2.0-draft"?"2.0":o),Ie={format:"worldorbit",sourceVersion:"1.0",theme:null,system:c,groups:u,relations:f,events:oe,trajectories:m,objects:ae,diagnostics:i};if(me==="2.0-draft"){let T={...Ie,version:"2.0-draft",schemaVersion:"2.0-draft"};return T.diagnostics.push(...Le(T,o)),T}let se={...Ie,version:me,schemaVersion:me};return o==="2.0-draft"&&se.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".'}),se.diagnostics.push(...Le(se,o)),se}function No(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5","2.6","3.0"].includes(e[1].value.toLowerCase()))throw new d('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", "schema 2.6", "schema 3.0", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.6"?"2.6":n==="3.0"?"3.0":n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Co(e,t,n,r,i,a,o,c,s,l,u,f,p,m,g,h,I,M){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new d('Atlas section "system" may only appear once',t,e[0].column);return Vo(e,t,n,r);case"defaults":if(!i)throw new d('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(M.sawDefaults)throw new d('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 d('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(M.sawAtlas)throw new d('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 d('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return Bo(e,t,i,f,n,r);case"annotation":if(!i)throw new d('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Uo(e,t,i,p);case"group":return C(n,r,"group",{line:t,column:e[0].column}),Wo(e,t,o,m);case"relation":return C(n,r,"relation",{line:t,column:e[0].column}),Yo(e,t,c,g);case"event":return C(n,r,"event",{line:t,column:e[0].column}),qo(e,t,s,u,h,n,r);case"trajectory":return we(n,r,"trajectory",{line:t,column:e[0].column}),Go(e,t,l,I,n,r);case"object":return Ho(e,t,n,r,a);default:throw new d(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Vo(e,t,n,r){if(e.length!==2)throw new d("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 Bo(e,t,n,r,i,a){if(e.length!==2)throw new d("Invalid viewpoint declaration",t,e[0]?.column??1);let o=Z(e[1].value);if(!o)throw new d("Viewpoint id must not be empty",t,e[1].column);if(r.has(o))throw new d(`Duplicate viewpoint id "${o}"`,t,e[1].column);let c={id:o,label:be(o),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(c),r.add(o),{kind:"viewpoint",viewpoint:c,sourceSchemaVersion:i,diagnostics:a,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function Uo(e,t,n,r){if(e.length!==2)throw new d("Invalid annotation declaration",t,e[0]?.column??1);let i=Z(e[1].value);if(!i)throw new d("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate annotation id "${i}"`,t,e[1].column);let a={id:i,label:be(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(a),r.add(i),{kind:"annotation",annotation:a,seenFields:new Set}}function Wo(e,t,n,r){if(e.length!==2)throw new d("Invalid group declaration",t,e[0]?.column??1);let i=Z(e[1].value);if(!i)throw new d("Group id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate group id "${i}"`,t,e[1].column);let a={id:i,label:be(i),summary:"",color:null,tags:[],hidden:!1};return n.push(a),r.add(i),{kind:"group",group:a,seenFields:new Set}}function Yo(e,t,n,r){if(e.length!==2)throw new d("Invalid relation declaration",t,e[0]?.column??1);let i=Z(e[1].value);if(!i)throw new d("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate relation id "${i}"`,t,e[1].column);let a={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(a),r.add(i),{kind:"relation",relation:a,seenFields:new Set}}function qo(e,t,n,r,i,a,o){if(e.length!==2)throw new d("Invalid event declaration",t,e[0]?.column??1);let c=Z(e[1].value);if(!c)throw new d("Event id must not be empty",t,e[1].column);if(i.has(c))throw new d(`Duplicate event id "${c}"`,t,e[1].column);let s={id:c,kind:"",label:be(c),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},l=[];return n.push(s),r.set(c,l),i.add(c),{kind:"event",event:s,sourceSchemaVersion:a,diagnostics:o,seenFields:new Set,rawPoses:l,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Go(e,t,n,r,i,a){if(e.length!==2)throw new d("Invalid trajectory declaration",t,e[0]?.column??1);let o=Z(e[1].value);if(!o)throw new d("Trajectory id must not be empty",t,e[1].column);if(r.has(o))throw new d(`Duplicate trajectory id "${o}"`,t,e[1].column);let c={id:o,label:be(o),summary:null,craftObjectId:null,tags:[],color:null,hidden:!1,segments:[]};return n.push(c),r.add(o),{kind:"trajectory",trajectory:c,sourceSchemaVersion:i,diagnostics:a,seenFields:new Set,inSegment:!1,segmentIndent:null,activeSegment:null,activeSegmentSeenFields:new Set,inManeuver:!1,maneuverIndent:null,activeManeuver:null,activeManeuverSeenFields:new Set}}function Ho(e,t,n,r,i){if(e.length<3)throw new d("Invalid atlas object declaration",t,e[0]?.column??1);let a=e[1],o=e[2],c=a.value;if(!je.has(c)||c==="system")throw new d(`Unknown object type "${a.value}"`,t,a.column);let s={objectType:c,id:o.value,fields:hs(e.slice(3),t,c,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:a.column}};return i.push(s),{kind:"object",objectNode:s,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function Ko(e,t,n,r){switch(e.kind){case"system":Xo(e,n,r);return;case"defaults":Zo(e,n,r);return;case"atlas":Jo(e,t,n,r);return;case"viewpoint":Qo(e,t,n,r);return;case"annotation":ns(e,n,r);return;case"group":rs(e,n,r);return;case"relation":is(e,n,r);return;case"event":as(e,t,n,r);return;case"trajectory":os(e,t,n,r);return;case"object":us(e,t,n,r);return}}function Xo(e,t,n){let r=V(t,e.seenFields,n),i=j(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 d(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function Zo(e,t,n){let r=V(t,e.seenFields,n),i=j(t,n);switch(r){case"view":or(i)&&fe(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=ar(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=sr(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new d(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function Jo(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=cr(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new d(`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 d(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function Qo(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){es(e,n,r);return}if(e.inFilter){ts(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(fe(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new d('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??Rt();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new d('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=V(n,e.seenFields,r),a=j(n,r);switch(i){case"label":e.viewpoint.label=a;return;case"summary":e.viewpoint.summary=a;return;case"focus":e.viewpoint.focusObjectId=a;return;case"select":e.viewpoint.selectedObjectId=a;return;case"projection":or(a)&&fe(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=ar(a,r,n[0].column);return;case"preset":e.viewpoint.preset=sr(a,r,n[0].column);return;case"zoom":e.viewpoint.zoom=Lt(a,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=ie(a,r,n[0].column,"rotation");return;case"camera":fe(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=ms(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=fs(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=_(n.slice(1),r,"events");return;default:throw new d(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function es(e,t,n){let r=V(t,e.seenCameraFields,n),i=j(t,n),a=e.viewpoint.camera??Rt();switch(r){case"azimuth":a.azimuth=ie(i,n,t[0].column,"camera.azimuth");break;case"elevation":a.elevation=ie(i,n,t[0].column,"camera.elevation");break;case"roll":a.roll=ie(i,n,t[0].column,"camera.roll");break;case"distance":a.distance=Lt(i,n,t[0].column,"camera.distance");break;default:throw new d(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=a}function ts(e,t,n){let r=V(t,e.seenFilterFields,n),i=e.viewpoint.filter??ps();switch(r){case"query":i.query=j(t,n);break;case"objecttypes":i.objectTypes=ds(t.slice(1),n);break;case"tags":i.tags=_(t.slice(1),n,"tags");break;case"groups":i.groupIds=_(t.slice(1),n,"groups");break;default:throw new d(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function ns(e,t,n){switch(V(t,e.seenFields,n)){case"label":e.annotation.label=j(t,n);return;case"target":e.annotation.targetObjectId=j(t,n);return;case"body":e.annotation.body=j(t,n);return;case"tags":e.annotation.tags=_(t.slice(1),n,"tags");return;default:throw new d(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function rs(e,t,n){switch(V(t,e.seenFields,n)){case"label":e.group.label=j(t,n);return;case"summary":e.group.summary=j(t,n);return;case"color":e.group.color=j(t,n);return;case"tags":e.group.tags=_(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=J(j(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new d(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function is(e,t,n){switch(V(t,e.seenFields,n)){case"from":e.relation.from=j(t,n);return;case"to":e.relation.to=j(t,n);return;case"kind":e.relation.kind=j(t,n);return;case"label":e.relation.label=j(t,n);return;case"summary":e.relation.summary=j(t,n);return;case"tags":e.relation.tags=_(t.slice(1),n,"tags");return;case"color":e.relation.color=j(t,n);return;case"hidden":e.relation.hidden=J(j(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new d(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function as(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")&&fe(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),(n[0]?.value==="segment"||n[0]?.value==="maneuver")&&we(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(ls(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new d(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let a=n[1].value;if(!a.trim())throw new d("Event pose object id must not be empty",r,n[1].column);let o={objectId:a,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(o),e.activePose=o,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new d('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(V(n,e.seenFields,r)){case"kind":e.event.kind=j(n,r);return;case"label":e.event.label=j(n,r);return;case"summary":e.event.summary=j(n,r);return;case"trajectory":we(e.sourceSchemaVersion,e.diagnostics,"event.trajectory",{line:r,column:n[0].column}),e.event.trajectoryId=j(n,r);return;case"target":e.event.targetObjectId=j(n,r);return;case"participants":e.event.participantObjectIds=_(n.slice(1),r,"participants");return;case"timing":e.event.timing=j(n,r);return;case"visibility":e.event.visibility=j(n,r);return;case"epoch":fe(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=j(n,r);return;case"referenceplane":fe(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=j(n,r);return;case"tags":e.event.tags=_(n.slice(1),r,"tags");return;case"color":e.event.color=j(n,r);return;case"hidden":e.event.hidden=J(j(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new d(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function os(e,t,n,r){if(e.activeManeuver&&t<=(e.maneuverIndent??0)&&(e.activeManeuver=null,e.maneuverIndent=null,e.activeManeuverSeenFields.clear(),e.inManeuver=!1),e.activeSegment&&t<=(e.segmentIndent??0)&&(e.activeSegment=null,e.segmentIndent=null,e.activeSegmentSeenFields.clear(),e.inSegment=!1),e.activeManeuver){cs(e,n,r);return}if(e.activeSegment){if(n[0]?.value.toLowerCase()==="maneuver"){if(n.length!==2)throw new d("Invalid trajectory maneuver declaration",r,n[0]?.column??1);let o=Z(n[1].value);if(!o)throw new d("Trajectory maneuver id must not be empty",r,n[1].column);if(e.activeSegment.maneuvers.some(s=>s.id===o))throw new d(`Duplicate trajectory maneuver id "${o}"`,r,n[1].column);let c={id:o,kind:"burn",label:null,epoch:null,notes:[]};e.activeSegment.maneuvers.push(c),e.activeManeuver=c,e.inManeuver=!0,e.maneuverIndent=t,e.activeManeuverSeenFields=new Set;return}ss(e,n,r);return}if(n[0]?.value.toLowerCase()==="segment"){if(n.length!==2)throw new d("Invalid trajectory segment declaration",r,n[0]?.column??1);let o=Z(n[1].value);if(!o)throw new d("Trajectory segment id must not be empty",r,n[1].column);if(e.trajectory.segments.some(s=>s.id===o))throw new d(`Duplicate trajectory segment id "${o}"`,r,n[1].column);let c={id:o,kind:"transfer",label:null,summary:null,fromObjectId:null,toObjectId:null,aroundObjectId:null,assist:null,epoch:null,notes:[],maneuvers:[]};e.trajectory.segments.push(c),e.activeSegment={id:o,fields:[],maneuvers:c.maneuvers,assist:null,location:{line:r,column:n[0].column}},e.inSegment=!0,e.segmentIndent=t,e.activeSegmentSeenFields=new Set;return}let i=V(n,e.seenFields,r),a=j(n,r);switch(i){case"label":e.trajectory.label=a;return;case"summary":e.trajectory.summary=a;return;case"craft":e.trajectory.craftObjectId=a;return;case"tags":e.trajectory.tags=_(n.slice(1),r,"tags");return;case"color":e.trajectory.color=a;return;case"hidden":e.trajectory.hidden=J(a,"hidden",{line:r,column:n[0].column});return;default:throw new d(`Unknown trajectory field "${n[0].value}"`,r,n[0].column)}}function ss(e,t,n){let r=e.activeSegment;if(!r)return;let i=V(t,e.activeSegmentSeenFields,n),a=j(t,n),o=e.trajectory.segments.find(c=>c.id===r.id);switch(i){case"kind":{let c=a.toLowerCase();if(!_o.has(c))throw new d(`Unknown trajectory segment kind "${a}"`,n,t[0].column);o.kind=c;return}case"label":o.label=a;return;case"summary":o.summary=a;return;case"from":o.fromObjectId=a;return;case"to":o.toObjectId=a;return;case"around":o.aroundObjectId=a;return;case"assist":o.assist={objectId:a,notes:[]};return;case"epoch":o.epoch=a;return;case"periapsis":o.periapsis=R(a,{line:n,column:t[0].column},"periapsis");return;case"apoapsis":o.apoapsis=R(a,{line:n,column:t[0].column},"apoapsis");return;case"inclination":o.inclination=R(a,{line:n,column:t[0].column},"inclination");return;case"duration":o.duration=R(a,{line:n,column:t[0].column},"duration");return;case"deltav":o.deltaV=R(a,{line:n,column:t[0].column});return;case"phaseangle":o.phaseAngle=R(a,{line:n,column:t[0].column},"phaseAngle");return;case"turnangle":o.turnAngle=R(a,{line:n,column:t[0].column},"turnAngle");return;case"energy":o.energy=R(a,{line:n,column:t[0].column});return;case"notes":o.notes=_(t.slice(1),n,"notes");return;default:throw new d(`Unknown trajectory segment field "${t[0].value}"`,n,t[0].column)}}function cs(e,t,n){let r=e.activeManeuver;if(!r)return;let i=V(t,e.activeManeuverSeenFields,n),a=j(t,n);switch(i){case"kind":r.kind=a;return;case"label":r.label=a;return;case"epoch":r.epoch=a;return;case"deltav":r.deltaV=R(a,{line:n,column:t[0].column});return;case"duration":r.duration=R(a,{line:n,column:t[0].column},"duration");return;case"notes":r.notes=_(t.slice(1),n,"notes");return;default:throw new d(`Unknown trajectory maneuver field "${t[0].value}"`,n,t[0].column)}}function ls(e,t,n){if(e.length<2)throw new d("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!nr.has(r))throw new d(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new d(`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 us(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"||Ro.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=cr(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new d(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let a=e.activeBlock,o=e.seenTypedBlockKeys[a]??(e.seenTypedBlockKeys[a]=new Set);if(o.has(i.key))throw new d(`Duplicate ${a} key "${i.key}"`,r,n[0].column);o.add(i.key),(e.objectNode.typedBlockEntries[a]??(e.objectNode.typedBlockEntries[a]=[])).push(i);return}e.objectNode.fields.push(ys(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function V(e,t,n){if(e.length<2)throw new d("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new d(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function j(e,t){if(e.length<2)throw new d("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function ds(e,t){return _(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function fs(e,t,n,r){let i={};for(let a of _(e,t,"layers")){let o=!a.startsWith("-")&&!a.startsWith("!"),c=a.replace(/^[-!]+/,"").toLowerCase();if(c==="orbits"){i["orbits-back"]=o,i["orbits-front"]=o;continue}(c==="background"||c==="guides"||c==="orbits-back"||c==="orbits-front"||c==="relations"||c==="events"||c==="objects"||c==="labels"||c==="metadata")&&(c==="events"&&n&&r&&C(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[c]=o)}return i}function _(e,t,n){if(e.length===0)throw new d(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new d(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function ar(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new d(`Unknown projection "${e}"`,t,n);return r}function or(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function sr(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new d(`Unknown render preset "${e}"`,t,n)}function Lt(e,t,n,r){let i=ie(e,t,n,r);if(i<=0)throw new d(`Field "${r}" must be greater than zero`,t,n);return i}function ie(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new d(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function ps(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Rt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function ms(e,t,n){if(e.length===0||e.length%2!==0)throw new d('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:Rt(),i=new Set;for(let a=0;a<e.length;a+=2){let o=e[a],c=e[a+1],s=o.value.toLowerCase();if(i.has(s))throw new d(`Duplicate viewpoint camera field "${o.value}"`,t,o.column);i.add(s);let l=c.value;switch(s){case"azimuth":r.azimuth=ie(l,t,o.column,"camera.azimuth");break;case"elevation":r.elevation=ie(l,t,o.column,"camera.elevation");break;case"roll":r.roll=ie(l,t,o.column,"camera.roll");break;case"distance":r.distance=Lt(l,t,o.column,"camera.distance");break;default:throw new d(`Unknown viewpoint camera field "${o.value}"`,t,o.column)}}return r}function hs(e,t,n,r,i){let a=[],o=0;for(;o<e.length;){let c=e[o],s=Re(c.value);if(!s)throw new d(`Unknown field "${c.value}"`,t,c.column);s.version==="2.1"?C(r,i,c.value,{line:t,column:c.column}):s.version==="3.0"&&we(r,i,c.value,{line:t,column:c.column}),o++;let l=[];if(s.inlineMode==="single"){let u=e[o];u&&(l.push(u),o++)}else if(s.inlineMode==="pair")for(let u=0;u<2;u++){let f=e[o];if(!f)break;l.push(f),o++}else for(;o<e.length&&!zo.has(e[o].value);)l.push(e[o]),o++;if(l.length===0)throw new d(`Missing value for field "${c.value}"`,t,c.column);a.push({type:"field",key:c.value,values:l.map(u=>u.value),location:{line:t,column:c.column}})}return fr(a,n),a}function ys(e,t,n,r,i){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);let a=Re(e[0].value);if(!a)throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);a.version==="2.1"?C(r,i,e[0].value,{line:t,column:e[0].column}):a.version==="3.0"&&we(r,i,e[0].value,{line:t,column:e[0].column});let o={type:"field",key:e[0].value,values:e.slice(1).map(c=>c.value),location:{line:t,column:e[0].column}};return fr([o],n),o}function cr(e,t,n){if(e.length<2)throw new d(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 gs(e,t,n){let r=lr(e.fields),i=ur(r),a=ws(e.objectType,r),o=Os(r.get("groups")?.[0]),c=de(r.get("epoch")?.[0]),s=de(r.get("referencePlane")?.[0]),l=r.has("tidalLock")?J(U(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?js(r.get("resonance")[0]):void 0,f=$s(r),p=r.get("derive")?.map(O=>xs(O)),m=r.get("validate")?.map(O=>({rule:U(O)})),g=r.has("locked")?[...new Set(r.get("locked").flatMap(O=>O.values))]:void 0,h=r.get("tolerance")?.map(O=>ks(O)),I=Is(e.typedBlockEntries),M=dr(e.infoEntries,"info"),k=de(r.get("trajectory")?.[0]),b={type:e.objectType,id:e.id,properties:a,placement:i,info:M};return o.length>0&&(b.groups=o),c&&(b.epoch=c),s&&(b.referencePlane=s),l!==void 0&&(b.tidalLock=l),u&&(b.resonance=u),f&&(b.renderHints=f),p?.length&&(b.deriveRules=p),m?.length&&(b.validationRules=m),g?.length&&(b.lockedFields=g),h?.length&&(b.tolerances=h),I&&Object.keys(I).length>0&&(b.typedBlocks=I),k&&(b.trajectoryId=k),_e(t,"2.1")&&(b.groups||b.epoch||b.referencePlane||b.tidalLock!==void 0||b.resonance||b.renderHints||b.deriveRules?.length||b.validationRules?.length||b.lockedFields?.length||b.tolerances?.length||b.typedBlocks||b.trajectoryId)&&C(t,n,e.id,e.location),b.trajectoryId&&we(t,n,`${e.id}.trajectory`,e.location),b}function vs(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>bs(n))}}function bs(e){let t=lr(e.fields,"event-pose"),n=ur(t);return{objectId:e.objectId,placement:n,trajectorySegmentId:de(t.get("segment")?.[0]),trajectoryManeuverId:de(t.get("maneuver")?.[0]),inner:re(t.get("inner")?.[0],"inner"),outer:re(t.get("outer")?.[0],"outer"),epoch:de(t.get("epoch")?.[0]),referencePlane:de(t.get("referencePlane")?.[0])}}function lr(e,t="object"){let n=new Map;for(let r of e){let i=Re(r.key);if(!i&&!nr.has(r.key))throw d.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw d.fromLocation(`Duplicate field "${r.key}"`,r.location);let a=n.get(r.key)??[];a.push(r),n.set(r.key,a)}return n}function ur(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 o=t??n??r??i;throw d.fromLocation("Object has multiple placement modes",o?.location)}if(t)return{mode:"orbit",target:U(t),distance:re(e.get("distance")?.[0],"distance"),semiMajor:re(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:Ss(e.get("eccentricity")?.[0],"eccentricity"),period:re(e.get("period")?.[0],"period"),angle:re(e.get("angle")?.[0],"angle"),inclination:re(e.get("inclination")?.[0],"inclination"),phase:re(e.get("phase")?.[0],"phase")};if(n){let o=U(n);return{mode:"at",target:o,reference:Kn(o,n.location)}}if(r)return{mode:"surface",target:U(r)};if(i){let o=U(i),c=Dt(o);return{mode:"free",distance:c??void 0,descriptor:c?void 0:o}}return null}function ws(e,t){let n={};for(let[r,i]of t.entries()){let a=i[0],o=Re(r);!a||!o?.legacySchema||o.legacySchema.placement||(At(r,e,a.location),n[r]=Xn(r,a.values,a.location))}return n}function dr(e,t){let n={};for(let r of e){if(r.key in n)throw d.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function Is(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=dr(r,n))}return t}function $s(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=J(U(n),"renderLabel",n.location)),r&&(t.renderOrbit=J(U(r),"renderOrbit",r.location)),i&&(t.renderPriority=at(U(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function js(e){if(e.values.length!==2)throw d.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw d.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function xs(e){if(e.values.length!==2)throw d.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function ks(e){if(e.values.length!==2)throw d.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=Dt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function Os(e){return e?[...new Set(e.values)]:[]}function de(e){return e&&e.values.join(" ").trim()||null}function re(e,t){return e?R(U(e),e.location,t):void 0}function Ss(e,t){return e?at(U(e),t,e.location):void 0}function U(e){return Ee(e.values,e.key,e.location)}function Re(e){return st.get(e)}function fr(e,t){for(let n of e){let r=Re(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){At(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw d.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function C(e,t,n,r){_e(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 fe(e,t,n,r){_e(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 we(e,t,n,r){_e(e,"3.0")&&t.push({code:"parse.schema30.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 3.0; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function _e(e,t){return tr(e)<tr(t)}function tr(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;case"3.0":return 5;default:return 6}}function Ms(e){let t=[...e],n=[],r=!1,i=!1,a=null,o=1,c=1;for(let s=0;s<t.length;s++){let l=t[s],u=t[s+1];if(i){if(l==="*"&&u==="/"){t[s]=" ",t[s+1]=" ",i=!1,a=null,s++,c+=2;continue}l!==`
5
5
  `&&l!=="\r"&&(t[s]=" "),l===`
6
- `?(o++,c=1):c++;continue}if(!r&&l==="/"&&u==="*"){n.push({kind:"block",line:o,column:c}),t[s]=" ",t[s+1]=" ",i=!0,a={line:o,column:c},s++,c+=2;continue}if(!r&&l==="#"&&!os(t,s)){n.push({kind:"line",line:o,column:c}),t[s]=" ";let d=s+1;for(;d<t.length&&t[d]!==`
7
- `&&t[d]!=="\r";)t[d]=" ",d++;c+=d-s,s=d-1;continue}l==='"'&&t[s-1]!=="\\"&&(r=!r),l===`
8
- `?(o++,c=1):c++}if(i)throw f.fromLocation("Unclosed block comment",a??void 0);return{source:t.join(""),comments:n}}function os(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===`
9
- `}function Et(e="WorldOrbit",t="2.6"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",theme:{preset:"blueprint",styles:{}},system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],events:[],objects:[],diagnostics:[]}}function st(e){return structuredClone(e)}function sr(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let n of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:n});for(let n of[...e.system.viewpoints].sort(ce))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(ce))t.push({kind:"annotation",id:n.id})}for(let n of[...e.groups].sort(ce))t.push({kind:"group",id:n.id});for(let n of[...e.relations].sort(ce))t.push({kind:"relation",id:n.id});for(let n of[...e.events].sort(ce)){t.push({kind:"event",id:n.id});for(let r of[...n.positions].sort(yr))t.push({kind:"event-pose",id:n.id,key:r.objectId})}for(let n of[...e.objects].sort(ce))t.push({kind:"object",id:n.id});return t}function Ft(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"group":return t.id?fr(e,t.id):null;case"event":return t.id?ct(e,t.id):null;case"event-pose":return t.id&&t.key?mr(e,t.id,t.key):null;case"object":return t.id?dr(e,t.id):null;case"viewpoint":return t.id?hr(e.system,t.id):null;case"annotation":return t.id?gr(e.system,t.id):null;case"relation":return t.id?pr(e,t.id):null}}function Rt(e,t,n){let r=st(e),i=Nt(r);switch(t.kind){case"system":return r.system=n,r;case"defaults":return i.defaults={...i.defaults,...n},r;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return n==null||n===""?delete i.atlasMetadata[t.key]:i.atlasMetadata[t.key]=String(n),r;case"group":if(!t.id)throw new Error('Group updates require an "id" value.');return ge(r.groups,n),r;case"event":if(!t.id)throw new Error('Event updates require an "id" value.');return ge(r.events,n),r;case"event-pose":if(!t.id||!t.key)throw new Error('Event pose updates require an event "id" and pose "key" value.');return ss(r.events,t.id,n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return ge(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return ge(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return ge(i.annotations,n),r;case"relation":if(!t.id)throw new Error('Relation updates require an "id" value.');return ge(r.relations,n),r}}function cr(e,t,n){return Rt(e,t,n(Ft(e,t)))}function lr(e,t){let n=st(e),r=Nt(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"group":return t.id&&(n.groups=n.groups.filter(i=>i.id!==t.id)),n;case"event":return t.id&&(n.events=n.events.filter(i=>i.id!==t.id)),n;case"event-pose":if(t.id&&t.key){let i=ct(n,t.id);i&&(i.positions=i.positions.filter(a=>a.objectId!==t.key))}return n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(i=>i.id!==t.id)),n;default:return n}}function _t(e,t){return t.map(n=>({diagnostic:n,path:zt(e,n)}))}function zt(e,t){if(t.objectId&&dr(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&fr(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&hr(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&gr(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&pr(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&ct(e,n[1]))return n[2]==="pose"&&n[3]&&mr(e,n[1],n[3])?{kind:"event-pose",id:n[1],key:n[3]}:{kind:"event",id:n[1]}}return t.field&&t.field in Nt(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function ur(e){let t=[...e.diagnostics,...De(e,e.version)];return _t(e,t)}function Nt(e){return e.system||(e.system=Et().system),e.system}function dr(e,t){return e.objects.find(n=>n.id===t)??null}function fr(e,t){return e.groups.find(n=>n.id===t)??null}function pr(e,t){return e.relations.find(n=>n.id===t)??null}function ct(e,t){return e.events.find(n=>n.id===t)??null}function mr(e,t,n){return ct(e,t)?.positions.find(r=>r.objectId===n)??null}function hr(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function gr(e,t){return e?.annotations.find(n=>n.id===t)??null}function ge(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(ce);return}e[n]=t}function ss(e,t,n){let r=e.find(a=>a.id===t);if(!r)throw new Error(`Unknown event "${t}" for pose update.`);let i=r.positions.findIndex(a=>a.objectId===n.objectId);if(i===-1){r.positions.push(n),r.positions.sort(yr);return}r.positions[i]=n}function ce(e,t){return e.id.localeCompare(t.id)}function yr(e,t){return e.objectId.localeCompare(t.objectId)}var cs=/^schema\s+2(?:\.0|\.1|\.5|\.6)?$/i,ls=/^schema\s+2\.1$/i,us=/^schema\s+2\.5$/i,ds=/^schema\s+2\.6$/i,fs=/^schema\s+2\.0-draft$/i;function Bt(e){for(let t of ps(e).split(/\r?\n/)){let n=t.trim();if(n)return fs.test(n)?"2.0-draft":ls.test(n)?"2.1":us.test(n)?"2.5":ds.test(n)?"2.6":cs.test(n)?"2.0":"1.0"}return"1.0"}function ps(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let a=t[i],o=t[i+1];if(r){if(a==="*"&&o==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}a!==`
6
+ `?(o++,c=1):c++;continue}if(!r&&l==="/"&&u==="*"){n.push({kind:"block",line:o,column:c}),t[s]=" ",t[s+1]=" ",i=!0,a={line:o,column:c},s++,c+=2;continue}if(!r&&l==="#"&&!Ts(t,s)){n.push({kind:"line",line:o,column:c}),t[s]=" ";let f=s+1;for(;f<t.length&&t[f]!==`
7
+ `&&t[f]!=="\r";)t[f]=" ",f++;c+=f-s,s=f-1;continue}l==='"'&&t[s-1]!=="\\"&&(r=!r),l===`
8
+ `?(o++,c=1):c++}if(i)throw d.fromLocation("Unclosed block comment",a??void 0);return{source:t.join(""),comments:n}}function Ts(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===`
9
+ `}function _t(e="WorldOrbit",t="3.0"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",theme:{preset:"blueprint",styles:{}},system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],events:[],trajectories:[],objects:[],diagnostics:[]}}function lt(e){return structuredClone(e)}function pr(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let n of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:n});for(let n of[...e.system.viewpoints].sort(B))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(B))t.push({kind:"annotation",id:n.id})}for(let n of[...e.groups].sort(B))t.push({kind:"group",id:n.id});for(let n of[...e.relations].sort(B))t.push({kind:"relation",id:n.id});for(let n of[...e.events].sort(B)){t.push({kind:"event",id:n.id});for(let r of[...n.positions].sort(xr))t.push({kind:"event-pose",id:n.id,key:r.objectId})}for(let n of[...e.trajectories].sort(B)){t.push({kind:"trajectory",id:n.id});for(let r of[...n.segments].sort(B)){t.push({kind:"trajectory-segment",id:n.id,key:r.id});for(let i of[...r.maneuvers].sort(B))t.push({kind:"trajectory-maneuver",id:n.id,key:`${r.id}:${i.id}`})}}for(let n of[...e.objects].sort(B))t.push({kind:"object",id:n.id});return t}function zt(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"group":return t.id?vr(e,t.id):null;case"event":return t.id?ut(e,t.id):null;case"event-pose":return t.id&&t.key?wr(e,t.id,t.key):null;case"trajectory":return t.id?dt(e,t.id):null;case"trajectory-segment":return t.id&&t.key?ft(e,t.id,t.key):null;case"trajectory-maneuver":return t.id&&t.key?Ir(e,t.id,t.key):null;case"object":return t.id?gr(e,t.id):null;case"viewpoint":return t.id?$r(e.system,t.id):null;case"annotation":return t.id?jr(e.system,t.id):null;case"relation":return t.id?br(e,t.id):null}}function Nt(e,t,n){let r=lt(e),i=Bt(r);switch(t.kind){case"system":return r.system=n,r;case"defaults":return i.defaults={...i.defaults,...n},r;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return n==null||n===""?delete i.atlasMetadata[t.key]:i.atlasMetadata[t.key]=String(n),r;case"group":if(!t.id)throw new Error('Group updates require an "id" value.');return pe(r.groups,n),r;case"event":if(!t.id)throw new Error('Event updates require an "id" value.');return pe(r.events,n),r;case"event-pose":if(!t.id||!t.key)throw new Error('Event pose updates require an event "id" and pose "key" value.');return Ps(r.events,t.id,n),r;case"trajectory":if(!t.id)throw new Error('Trajectory updates require an "id" value.');return pe(r.trajectories,n),r;case"trajectory-segment":if(!t.id||!t.key)throw new Error('Trajectory segment updates require a trajectory "id" and segment "key" value.');return Ds(r.trajectories,t.id,n),r;case"trajectory-maneuver":if(!t.id||!t.key)throw new Error('Trajectory maneuver updates require a trajectory "id" and maneuver "key" value.');return As(r.trajectories,t.id,t.key,n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return pe(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return pe(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return pe(i.annotations,n),r;case"relation":if(!t.id)throw new Error('Relation updates require an "id" value.');return pe(r.relations,n),r}}function mr(e,t,n){return Nt(e,t,n(zt(e,t)))}function hr(e,t){let n=lt(e),r=Bt(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"group":return t.id&&(n.groups=n.groups.filter(i=>i.id!==t.id)),n;case"event":return t.id&&(n.events=n.events.filter(i=>i.id!==t.id)),n;case"event-pose":if(t.id&&t.key){let i=ut(n,t.id);i&&(i.positions=i.positions.filter(a=>a.objectId!==t.key))}return n;case"trajectory":return t.id&&(n.trajectories=n.trajectories.filter(i=>i.id!==t.id)),n;case"trajectory-segment":if(t.id&&t.key){let i=dt(n,t.id);i&&(i.segments=i.segments.filter(a=>a.id!==t.key))}return n;case"trajectory-maneuver":if(t.id&&t.key){let i=Ut(t.key);if(i){let a=ft(n,t.id,i.segmentId);a&&(a.maneuvers=a.maneuvers.filter(o=>o.id!==i.maneuverId))}}return n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(i=>i.id!==t.id)),n;default:return n}}function Ct(e,t){return t.map(n=>({diagnostic:n,path:Vt(e,n)}))}function Vt(e,t){if(t.objectId&&gr(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&vr(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&$r(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&jr(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&br(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&ut(e,n[1]))return n[2]==="pose"&&n[3]&&wr(e,n[1],n[3])?{kind:"event-pose",id:n[1],key:n[3]}:{kind:"event",id:n[1]}}if(t.field?.startsWith("trajectory.")){let n=t.field.split(".");if(n[1]&&dt(e,n[1]))return n[2]==="segment"&&n[3]&&ft(e,n[1],n[3])?n[4]==="maneuver"&&n[5]&&Ir(e,n[1],`${n[3]}:${n[5]}`)?{kind:"trajectory-maneuver",id:n[1],key:`${n[3]}:${n[5]}`}:{kind:"trajectory-segment",id:n[1],key:n[3]}:{kind:"trajectory",id:n[1]}}return t.field&&t.field in Bt(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function yr(e){let t=[...e.diagnostics,...Le(e,e.version)];return Ct(e,t)}function Bt(e){return e.system||(e.system=_t().system),e.system}function gr(e,t){return e.objects.find(n=>n.id===t)??null}function vr(e,t){return e.groups.find(n=>n.id===t)??null}function br(e,t){return e.relations.find(n=>n.id===t)??null}function ut(e,t){return e.events.find(n=>n.id===t)??null}function wr(e,t,n){return ut(e,t)?.positions.find(r=>r.objectId===n)??null}function dt(e,t){return e.trajectories.find(n=>n.id===t)??null}function ft(e,t,n){return dt(e,t)?.segments.find(r=>r.id===n)??null}function Ir(e,t,n){let r=Ut(n);return r?ft(e,t,r.segmentId)?.maneuvers.find(i=>i.id===r.maneuverId)??null:null}function $r(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function jr(e,t){return e?.annotations.find(n=>n.id===t)??null}function pe(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(B);return}e[n]=t}function Ps(e,t,n){let r=e.find(a=>a.id===t);if(!r)throw new Error(`Unknown event "${t}" for pose update.`);let i=r.positions.findIndex(a=>a.objectId===n.objectId);if(i===-1){r.positions.push(n),r.positions.sort(xr);return}r.positions[i]=n}function Ds(e,t,n){let r=e.find(a=>a.id===t);if(!r)throw new Error(`Unknown trajectory "${t}" for segment update.`);let i=r.segments.findIndex(a=>a.id===n.id);if(i===-1){r.segments.push(n),r.segments.sort(B);return}r.segments[i]=n}function As(e,t,n,r){let i=Ut(n);if(!i)throw new Error(`Invalid trajectory maneuver key "${n}".`);let a=e.find(s=>s.id===t);if(!a)throw new Error(`Unknown trajectory "${t}" for maneuver update.`);let o=a.segments.find(s=>s.id===i.segmentId);if(!o)throw new Error(`Unknown trajectory segment "${i.segmentId}" on "${t}".`);let c=o.maneuvers.findIndex(s=>s.id===r.id);if(c===-1){o.maneuvers.push(r),o.maneuvers.sort(B);return}o.maneuvers[c]=r}function Ut(e){let t=e.indexOf(":");return t<=0||t>=e.length-1?null:{segmentId:e.slice(0,t),maneuverId:e.slice(t+1)}}function B(e,t){return e.id.localeCompare(t.id)}function xr(e,t){return e.objectId.localeCompare(t.objectId)}var Fs=/^schema\s+(?:2(?:\.0|\.1|\.5|\.6)?|3(?:\.0)?)$/i,Es=/^schema\s+2\.1$/i,Ls=/^schema\s+2\.5$/i,Rs=/^schema\s+2\.6$/i,_s=/^schema\s+3(?:\.0)?$/i,zs=/^schema\s+2\.0-draft$/i;function Wt(e){for(let t of Ns(e).split(/\r?\n/)){let n=t.trim();if(n)return zs.test(n)?"2.0-draft":Es.test(n)?"2.1":Ls.test(n)?"2.5":Rs.test(n)?"2.6":_s.test(n)?"3.0":Fs.test(n)?"2.0":"1.0"}return"1.0"}function Ns(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let a=t[i],o=t[i+1];if(r){if(a==="*"&&o==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}a!==`
10
10
  `&&a!=="\r"&&(t[i]=" ");continue}if(!n&&a==="/"&&o==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&a==="#"){t[i]=" ";let c=i+1;for(;c<t.length&&t[c]!==`
11
- `&&t[c]!=="\r";)t[c]=" ",c++;i=c-1;continue}a==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function lt(e){let t=Ct(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 Ct(e){let t=Bt(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5"||t==="2.6")return ms(e,t);let n;try{n=Z(e)}catch(i){return{ok:!1,value:null,diagnostics:[L(i,"parse")]}}let r;try{r=U(n)}catch(i){return{ok:!1,value:null,diagnostics:[L(i,"normalize")]}}try{W(r)}catch(i){return{ok:!1,value:null,diagnostics:[L(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function ms(e,t){let n;try{n=at(e)}catch(o){return{ok:!1,value:null,diagnostics:[L(o,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(o=>o.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=Pe(n)}catch(o){return{ok:!1,value:null,diagnostics:[L(o,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var hs=/^```worldorbit(?:\s+(.*))?\s*$/;function br(e){let t=e.split(/\r?\n/),n=[],r=!1,i=null,a=0,o=[];return t.forEach((c,s)=>{let l=s+1;if(!r){let u=c.match(hs);u&&(r=!0,i=u[1]??null,a=l,o=[]);return}if(c.trim()==="```"){n.push({source:o.join(`
12
- `),info:i,startLine:a,endLine:l}),r=!1,i=null,a=0,o=[];return}o.push(c)}),n}function vr(e){let t=Z(e),n=U(t);return W(n),{ast:t,document:n}}function gs(e){let t=vr(e);return{...t,scene:Y(t.document)}}function ys(e){return lt(e)}function bs(e){return Ne(e)}function vs(e,t={}){return et(e,t)}return Tr(ws);})();
11
+ `&&t[c]!=="\r";)t[c]=" ",c++;i=c-1;continue}a==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function pt(e){let t=Yt(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new d(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function Yt(e){let t=Wt(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5"||t==="2.6"||t==="3.0")return Cs(e,t);let n;try{n=ee(e)}catch(i){return{ok:!1,value:null,diagnostics:[L(i,"parse")]}}let r;try{r=G(n)}catch(i){return{ok:!1,value:null,diagnostics:[L(i,"normalize")]}}try{H(r)}catch(i){return{ok:!1,value:null,diagnostics:[L(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Cs(e,t){let n;try{n=ct(e)}catch(o){return{ok:!1,value:null,diagnostics:[L(o,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(o=>o.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=Fe(n)}catch(o){return{ok:!1,value:null,diagnostics:[L(o,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var Vs=/^```worldorbit(?:\s+(.*))?\s*$/;function kr(e){let t=e.split(/\r?\n/),n=[],r=!1,i=null,a=0,o=[];return t.forEach((c,s)=>{let l=s+1;if(!r){let u=c.match(Vs);u&&(r=!0,i=u[1]??null,a=l,o=[]);return}if(c.trim()==="```"){n.push({source:o.join(`
12
+ `),info:i,startLine:a,endLine:l}),r=!1,i=null,a=0,o=[];return}o.push(c)}),n}function Or(e){let t=ee(e),n=G(t);return H(n),{ast:t,document:n}}function Bs(e){let t=Or(e);return{...t,scene:K(t.document)}}function Us(e){return pt(e)}function Ws(e){return Ue(e)}function Ys(e,t={}){return it(e,t)}return _r(qs);})();