diff --git a/NewHorizons/Assets/newhorizons_private b/NewHorizons/Assets/bundles/newhorizons_private similarity index 72% rename from NewHorizons/Assets/newhorizons_private rename to NewHorizons/Assets/bundles/newhorizons_private index 9392dc487..01e2c2650 100644 Binary files a/NewHorizons/Assets/newhorizons_private and b/NewHorizons/Assets/bundles/newhorizons_private differ diff --git a/NewHorizons/Assets/newhorizons_private.manifest b/NewHorizons/Assets/bundles/newhorizons_private.manifest similarity index 96% rename from NewHorizons/Assets/newhorizons_private.manifest rename to NewHorizons/Assets/bundles/newhorizons_private.manifest index 8c9d7ad4d..847ea3aa5 100644 --- a/NewHorizons/Assets/newhorizons_private.manifest +++ b/NewHorizons/Assets/bundles/newhorizons_private.manifest @@ -1,12 +1,12 @@ ManifestFileVersion: 0 -CRC: 2356174904 +CRC: 2772415118 Hashes: AssetFileHash: serializedVersion: 2 - Hash: c9b4a60ca4efa0ba50065dea6e758ce7 + Hash: a1c50cfbd83ea025ed5ff8a920ceb135 TypeTreeHash: serializedVersion: 2 - Hash: 65942a71d50cdc9f2387a8fa9383a3f8 + Hash: 8a96558a3d9470a68866aeaaa30830cf HashAppended: 0 ClassTypes: - Class: 1 @@ -87,6 +87,8 @@ ClassTypes: Script: {fileID: 11500000, guid: 13ab18a571ddf1b4f8dc92e3fa31b22e, type: 3} - Class: 114 Script: {fileID: 11500000, guid: 3d5c87c5a00ca19449219c7c54f41ee7, type: 3} +- Class: 114 + Script: {fileID: 11500000, guid: db82bd26294f5b848aaa8cb1ad0dc252, type: 3} - Class: 114 Script: {fileID: 11500000, guid: 840ab63696e59254eb425242136805dd, type: 3} - Class: 114 @@ -198,5 +200,6 @@ Assets: - Assets/SlideReels/Prefab_DW_Reel_8.prefab - Assets/Vessel_Body.prefab - Assets/AmbientLight_QM.png +- Assets/QuantumLightning/Prefab_EYE_QuantumLightningObject.prefab - Assets/SlideReels/Prefab_IP_Reel_7.prefab Dependencies: [] diff --git a/NewHorizons/Assets/newhorizons_public b/NewHorizons/Assets/bundles/newhorizons_public similarity index 100% rename from NewHorizons/Assets/newhorizons_public rename to NewHorizons/Assets/bundles/newhorizons_public diff --git a/NewHorizons/Assets/newhorizons_public.manifest b/NewHorizons/Assets/bundles/newhorizons_public.manifest similarity index 100% rename from NewHorizons/Assets/newhorizons_public.manifest rename to NewHorizons/Assets/bundles/newhorizons_public.manifest diff --git a/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs b/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs index 5e998cf33..3ad70e2f4 100644 --- a/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs +++ b/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs @@ -66,7 +66,7 @@ internal static void InitPrefabs() } _qmBottomMeshGroup.variants = variants.ToArray(); } - if (_transparentCloud == null) _transparentCloud = Main.NHAssetBundle.LoadAsset("Assets/Resources/TransparentCloud.mat"); + if (_transparentCloud == null) _transparentCloud = AssetBundleUtilities.NHAssetBundle.LoadAsset("Assets/Resources/TransparentCloud.mat"); } public static void Make(GameObject planetGO, Sector sector, AtmosphereModule atmo, bool cloaked, IModBehaviour mod) diff --git a/NewHorizons/Builder/Body/AsteroidBeltBuilder.cs b/NewHorizons/Builder/Body/AsteroidBeltBuilder.cs index 01fd7f188..fdc893c74 100644 --- a/NewHorizons/Builder/Body/AsteroidBeltBuilder.cs +++ b/NewHorizons/Builder/Body/AsteroidBeltBuilder.cs @@ -1,6 +1,7 @@ using NewHorizons.External; using NewHorizons.External.Configs; using NewHorizons.External.Modules; +using NewHorizons.External.Modules.Props; using NewHorizons.External.SerializableData; using NewHorizons.Handlers; using NewHorizons.Utility.OWML; @@ -36,7 +37,7 @@ public static void Make(string bodyName, PlanetConfig parentConfig, IModBehaviou config.Base = new BaseModule() { - surfaceGravity = 1, + surfaceGravity = belt.gravity, surfaceSize = size, gravityFallOff = GravityFallOff.InverseSquared }; @@ -49,7 +50,8 @@ public static void Make(string bodyName, PlanetConfig parentConfig, IModBehaviou trueAnomaly = 360f * (i + Random.Range(-0.2f, 0.2f)) / (float)count, primaryBody = bodyName, semiMajorAxis = Random.Range(belt.innerRadius, belt.outerRadius), - showOrbitLine = false + showOrbitLine = false, + isTidallyLocked = true }; config.ReferenceFrame = new ReferenceFrameModule() @@ -62,20 +64,37 @@ public static void Make(string bodyName, PlanetConfig parentConfig, IModBehaviou enabled = false }; - config.ProcGen = belt.procGen; - if (config.ProcGen == null) + if (!string.IsNullOrEmpty(belt.assetBundle) || !string.IsNullOrEmpty(belt.path)) { - config.ProcGen = new ProcGenModule() + config.Props = new PropModule() { - scale = size, - color = new MColor(126, 94, 73) + details = new DetailInfo[1] + { + new DetailInfo() + { + assetBundle = belt.assetBundle, + path = belt.path, + scale = size, + rotation = belt.randomOrientation ? Random.rotation.eulerAngles : Vector3.zero, + keepLoaded = true + } + } }; + } - else + else if (belt.procGen != null) { - // Still update the size + config.ProcGen = belt.procGen; config.ProcGen.scale = size; } + else + { + config.ProcGen = new ProcGenModule() + { + scale = size, + color = new MColor(126, 94, 73) + }; + } var asteroid = new NewHorizonsBody(config, mod); PlanetCreationHandler.GenerateBody(asteroid); diff --git a/NewHorizons/Builder/Body/BrambleDimensionBuilder.cs b/NewHorizons/Builder/Body/BrambleDimensionBuilder.cs index 8ccd735ec..e1c6d41ee 100644 --- a/NewHorizons/Builder/Body/BrambleDimensionBuilder.cs +++ b/NewHorizons/Builder/Body/BrambleDimensionBuilder.cs @@ -5,6 +5,7 @@ using NewHorizons.External.Modules; using NewHorizons.External.Modules.Props; using NewHorizons.Utility; +using NewHorizons.Utility.Files; using NewHorizons.Utility.OWML; using OWML.Common; using System.Collections.Generic; @@ -78,7 +79,7 @@ internal static void InitPrefabs() if (_exitWarps == null) _exitWarps = SearchUtilities.Find("DB_HubDimension_Body/Sector_HubDimension/Interactables_HubDimension/OuterWarp_Hub").InstantiateInactive().Rename("Prefab_Bramble_OuterWarp").DontDestroyOnLoad(); if (_repelVolume == null) _repelVolume = SearchUtilities.Find("DB_HubDimension_Body/BrambleRepelVolume").InstantiateInactive().Rename("Prefab_Bramble_RepelVolume").DontDestroyOnLoad(); if (_material == null) _material = new Material(GameObject.Find("DB_PioneerDimension_Body/Sector_PioneerDimension").GetComponent()._material).DontDestroyOnLoad(); - if (_wallCollision == null) _wallCollision = Main.NHPrivateAssetBundle.LoadAsset("BrambleCollision"); + if (_wallCollision == null) _wallCollision = AssetBundleUtilities.NHPrivateAssetBundle.LoadAsset("BrambleCollision"); } public static GameObject Make(NewHorizonsBody body, GameObject go, NHAstroObject ao, Sector sector, IModBehaviour mod, OWRigidbody owRigidBody) diff --git a/NewHorizons/Builder/Body/HeightMapBuilder.cs b/NewHorizons/Builder/Body/HeightMapBuilder.cs index 55b6f58c4..48e15193a 100644 --- a/NewHorizons/Builder/Body/HeightMapBuilder.cs +++ b/NewHorizons/Builder/Body/HeightMapBuilder.cs @@ -62,7 +62,7 @@ public static GameObject Make(GameObject planetGO, Sector sector, HeightMapModul cubeSphere.SetActive(false); cubeSphere.transform.SetParent(sector?.transform ?? planetGO.transform, false); - if (PlanetShader == null) PlanetShader = Main.NHAssetBundle.LoadAsset("Assets/Shaders/SphereTextureWrapperTriplanar.shader"); + if (PlanetShader == null) PlanetShader = AssetBundleUtilities.NHAssetBundle.LoadAsset("Assets/Shaders/SphereTextureWrapperTriplanar.shader"); var stretch = module.stretch != null ? (Vector3)module.stretch : Vector3.one; @@ -91,14 +91,15 @@ public static GameObject Make(GameObject planetGO, Sector sector, HeightMapModul level2.name += "1"; LODGroup.RecalculateBounds(); + + // do this only for LOD because only the main body uses LOD, while title screen and proxies dont + var superGroup = planetGO.GetComponent(); + if (superGroup != null) level2.gameObject.AddComponent()._superGroup = superGroup; } var cubeSphereSC = cubeSphere.AddComponent(); cubeSphereSC.radius = Mathf.Min(module.minHeight, module.maxHeight) * Mathf.Min(stretch.x, stretch.y, stretch.z); - var superGroup = planetGO.GetComponent(); - if (superGroup != null) cubeSphere.AddComponent()._superGroup = superGroup; - cubeSphere.SetActive(true); // Now that we've made the mesh we can delete the heightmap texture diff --git a/NewHorizons/Builder/Body/RingBuilder.cs b/NewHorizons/Builder/Body/RingBuilder.cs index d7e18da00..b5c567b83 100644 --- a/NewHorizons/Builder/Body/RingBuilder.cs +++ b/NewHorizons/Builder/Body/RingBuilder.cs @@ -84,10 +84,10 @@ public static GameObject MakeRingGraphics(GameObject rootObject, Sector sector, var ringMesh = ringMF.mesh; var ringMR = ringGO.AddComponent(); - if (RingShader == null) RingShader = Main.NHAssetBundle.LoadAsset("Assets/Shaders/Ring.shader"); - if (UnlitRingShader == null) UnlitRingShader = Main.NHAssetBundle.LoadAsset("Assets/Shaders/UnlitTransparent.shader"); - if (RingShader1Pixel == null) RingShader1Pixel = Main.NHAssetBundle.LoadAsset("Assets/Shaders/Ring1Pixel.shader"); - if (UnlitRingShader1Pixel == null) UnlitRingShader1Pixel = Main.NHAssetBundle.LoadAsset("Assets/Shaders/UnlitRing1Pixel.shader"); + if (RingShader == null) RingShader = AssetBundleUtilities.NHAssetBundle.LoadAsset("Assets/Shaders/Ring.shader"); + if (UnlitRingShader == null) UnlitRingShader = AssetBundleUtilities.NHAssetBundle.LoadAsset("Assets/Shaders/UnlitTransparent.shader"); + if (RingShader1Pixel == null) RingShader1Pixel = AssetBundleUtilities.NHAssetBundle.LoadAsset("Assets/Shaders/Ring1Pixel.shader"); + if (UnlitRingShader1Pixel == null) UnlitRingShader1Pixel = AssetBundleUtilities.NHAssetBundle.LoadAsset("Assets/Shaders/UnlitRing1Pixel.shader"); var mat = new Material(ring.unlit ? UnlitRingShader : RingShader); if (ringTexture.width == 1) diff --git a/NewHorizons/Builder/Body/StellarRemnantBuilder.cs b/NewHorizons/Builder/Body/StellarRemnantBuilder.cs index 5dd00158f..f34c3b670 100644 --- a/NewHorizons/Builder/Body/StellarRemnantBuilder.cs +++ b/NewHorizons/Builder/Body/StellarRemnantBuilder.cs @@ -26,6 +26,7 @@ public static GameObject Make(GameObject go, OWRigidbody rb, float soi, IModBeha NHLogger.Log($"Creating stellar remnant for [{star.Config.name}]"); var sector = SectorBuilder.Make(go, rb, soi); + sector._idString = star.Config.name; sector.name = "StellarRemnant"; sector.gameObject.SetActive(false); diff --git a/NewHorizons/Builder/General/AmbientLightBuilder.cs b/NewHorizons/Builder/General/AmbientLightBuilder.cs index 36d0c0c0c..8484c26d4 100644 --- a/NewHorizons/Builder/General/AmbientLightBuilder.cs +++ b/NewHorizons/Builder/General/AmbientLightBuilder.cs @@ -42,7 +42,7 @@ public static Light Make(GameObject planetGO, Sector sector, AmbientLightModule } else { - var baseCubemap = Main.NHPrivateAssetBundle.LoadAsset("AmbientLight_QM"); + var baseCubemap = AssetBundleUtilities.NHPrivateAssetBundle.LoadAsset("AmbientLight_QM"); var cubemap = new Cubemap(baseCubemap.width, baseCubemap.format, baseCubemap.mipmapCount != 1); cubemap.name = key; cubemap.wrapMode = baseCubemap.wrapMode; diff --git a/NewHorizons/Builder/General/GravityBuilder.cs b/NewHorizons/Builder/General/GravityBuilder.cs index 922cfee8a..7d202e274 100644 --- a/NewHorizons/Builder/General/GravityBuilder.cs +++ b/NewHorizons/Builder/General/GravityBuilder.cs @@ -15,10 +15,11 @@ public static GravityVolume Make(GameObject planetGO, AstroObject ao, OWRigidbod var gravityRadius = GM / 0.1f; if (exponent == 2f) gravityRadius = Mathf.Sqrt(gravityRadius); + if (config.FocalPoint != null) gravityRadius = 0; // keep it at the lowest possible + else if (config.Base.soiOverride != 0f) gravityRadius = config.Base.soiOverride; + else if (config.Star != null) gravityRadius = Mathf.Min(gravityRadius, 15 * config.Base.surfaceSize); // To let you actually orbit things the way you would expect we cap this at 4x the diameter if its not a star (this is what giants deep has) - if (config.Star == null) gravityRadius = Mathf.Min(gravityRadius, 4 * config.Base.surfaceSize); - else gravityRadius = Mathf.Min(gravityRadius, 15 * config.Base.surfaceSize); - if (config.Base.soiOverride != 0f) gravityRadius = config.Base.soiOverride; + else gravityRadius = Mathf.Min(gravityRadius, 4 * config.Base.surfaceSize); var gravityGO = new GameObject("GravityWell"); gravityGO.transform.parent = planetGO.transform; @@ -47,8 +48,8 @@ public static GravityVolume Make(GameObject planetGO, AstroObject ao, OWRigidbod var alignmentRadius = config.Atmosphere?.clouds?.outerCloudRadius ?? 1.5f * config.Base.surfaceSize; if (config.Base.surfaceGravity == 0) alignmentRadius = 0; - gravityVolume._alignmentRadius = alignmentRadius; - gravityVolume._upperSurfaceRadius = config.Base.surfaceSize; + gravityVolume._alignmentRadius = config.Base.gravityAlignmentRadiusOverride ?? alignmentRadius; + gravityVolume._upperSurfaceRadius = config.FocalPoint != null ? 0 : config.Base.surfaceSize; gravityVolume._lowerSurfaceRadius = 0; gravityVolume._layer = 3; gravityVolume._priority = config.Base.gravityVolumePriority; diff --git a/NewHorizons/Builder/General/SpawnPointBuilder.cs b/NewHorizons/Builder/General/SpawnPointBuilder.cs index 0e1eee40b..a38802b6d 100644 --- a/NewHorizons/Builder/General/SpawnPointBuilder.cs +++ b/NewHorizons/Builder/General/SpawnPointBuilder.cs @@ -51,7 +51,20 @@ public static SpawnPoint Make(GameObject planetGO, SpawnModule module, OWRigidbo // This was a stupid hack to stop players getting stuck in the ground and now we have to keep it forever spawnGO.transform.position += spawnGO.transform.TransformDirection(point.offset ?? Vector3.up * 4f); - if (PlayerSpawn == null || point.GetPriority() > PlayerSpawnInfo.GetPriority()) + var flagUseTHSpawn = false; + if (Main.Instance.CurrentStarSystem == "SolarSystem") + { + // When in the base solar system, treat the TH spawn point as being isDefault + // If the priority of any new spawn point is less than that, ignore it + // Do take them if they're equal tho + var minPriority = new SpawnModule.PlayerSpawnPoint() { isDefault = true }.GetPriority(); + if (point.GetPriority() < minPriority) + { + flagUseTHSpawn = true; + } + } + + if (!flagUseTHSpawn && (PlayerSpawn == null || point.GetPriority() > PlayerSpawnInfo.GetPriority())) { PlayerSpawn = playerSpawn; PlayerSpawnInfo = point; diff --git a/NewHorizons/Builder/Orbital/FocalPointBuilder.cs b/NewHorizons/Builder/Orbital/FocalPointBuilder.cs index 90aebab36..b3e633912 100644 --- a/NewHorizons/Builder/Orbital/FocalPointBuilder.cs +++ b/NewHorizons/Builder/Orbital/FocalPointBuilder.cs @@ -57,12 +57,13 @@ public static void ValidateConfig(PlanetConfig config) config.Base.surfaceGravity = gravitationalMass * GravityVolume.GRAVITATIONAL_CONSTANT; config.Base.gravityFallOff = primary.Config.Base.gravityFallOff; - // Other stuff to make the barycenter not interact with anything in any way - config.Base.soiOverride = 0; - var separation = primary.Config.Orbit.semiMajorAxis + secondary.Config.Orbit.semiMajorAxis; - config.ReferenceFrame.bracketRadius = separation; - config.ReferenceFrame.targetColliderRadius = separation; + var separationRadius = (separation / 2); + config.Base.soiOverride = separationRadius * 1.5f; + config.ReferenceFrame.bracketRadius = separationRadius; + config.ReferenceFrame.targetColliderRadius = separationRadius; + + config.Base.showMinimap = false; } private static float GetGravitationalMass(PlanetConfig config) diff --git a/NewHorizons/Builder/Props/Audio/SignalBuilder.cs b/NewHorizons/Builder/Props/Audio/SignalBuilder.cs index 9fd8617ce..e3ba5aed2 100644 --- a/NewHorizons/Builder/Props/Audio/SignalBuilder.cs +++ b/NewHorizons/Builder/Props/Audio/SignalBuilder.cs @@ -171,7 +171,15 @@ public static GameObject Make(GameObject planetGO, Sector sector, SignalInfo inf audioSignal._onlyAudibleToScope = info.onlyAudibleToScope; audioSignal._identificationDistance = info.identificationRadius; audioSignal._canBePickedUpByScope = true; - audioSignal._outerFogWarpVolume = planetGO.GetComponentInChildren(); // shouldn't break non-bramble signals + // The outsider adds outer fog warp volumes to Bramble which break any signals NH places there + if (Main.Instance.ModHelper.Interaction.ModExists("SBtT.TheOutsider") && planetGO?.GetComponent()?._name == AstroObject.Name.DarkBramble) + { + audioSignal._outerFogWarpVolume = null; + } + else + { + audioSignal._outerFogWarpVolume = planetGO.GetComponentInChildren(); // shouldn't break non-bramble signals + } // If it can be heard regularly then we play it immediately owAudioSource.playOnAwake = !info.onlyAudibleToScope; diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index f4009e7cf..2b7dbfde3 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -19,10 +19,23 @@ namespace NewHorizons.Builder.Props { public static class DetailBuilder { - private static readonly Dictionary _detailInfoToCorrespondingSpawnedGameObject = new(); private static readonly Dictionary<(Sector, string), (GameObject prefab, bool isItem)> _fixedPrefabCache = new(); private static GameObject _emptyPrefab; + private static readonly Dictionary _detailInfoToGameObject = new(); + + public static GameObject GetGameObjectFromDetailInfo(DetailInfo info) + { + if (_detailInfoToGameObject.ContainsKey(info)) + { + return _detailInfoToGameObject[info]; + } + else + { + return null; + } + } + static DetailBuilder() { SceneManager.sceneUnloaded += SceneManager_sceneUnloaded; @@ -48,19 +61,7 @@ private static void SceneManager_sceneUnloaded(Scene scene) UnityEngine.Object.Destroy(prefab.prefab); } _fixedPrefabCache.Clear(); - _detailInfoToCorrespondingSpawnedGameObject.Clear(); - } - - public static GameObject GetSpawnedGameObjectByDetailInfo(DetailInfo detail) - { - if (!_detailInfoToCorrespondingSpawnedGameObject.ContainsKey(detail)) - { - return null; - } - else - { - return _detailInfoToCorrespondingSpawnedGameObject[detail]; - } + _detailInfoToGameObject.Clear(); } /// @@ -274,7 +275,8 @@ public static GameObject Make(GameObject go, Sector sector, IModBehaviour mod, G // For DLC related props // Make sure to do this before its set active - if (detail.path.ToLowerInvariant().StartsWith("ringworld") || detail.path.ToLowerInvariant().StartsWith("dreamworld")) + if (!string.IsNullOrEmpty(detail?.path) && + (detail.path.ToLowerInvariant().StartsWith("ringworld") || detail.path.ToLowerInvariant().StartsWith("dreamworld"))) { prop.AddComponent()._destroyOnDLCNotOwned = true; } @@ -299,7 +301,7 @@ public static GameObject Make(GameObject go, Sector sector, IModBehaviour mod, G ConditionalObjectActivation.SetUp(prop, detail.deactivationCondition, detail.blinkWhenActiveChanged, false); } - _detailInfoToCorrespondingSpawnedGameObject[detail] = prop; + _detailInfoToGameObject[detail] = prop; return prop; } @@ -339,6 +341,16 @@ private static void FixSectoredComponent(Component component, Sector sector, Has { remoteCameraPlatform._visualSector = sector; } + + else if(component is SingleLightSensor singleLightSensor && !existingSectors.Contains(singleLightSensor._sector)) + { + if (singleLightSensor._sector != null) + { + singleLightSensor._sector.OnSectorOccupantsUpdated -= singleLightSensor.OnSectorOccupantsUpdated; + } + singleLightSensor._sector = sector; + singleLightSensor._sector.OnSectorOccupantsUpdated += singleLightSensor.OnSectorOccupantsUpdated; + } } /// diff --git a/NewHorizons/Builder/Props/DialogueBuilder.cs b/NewHorizons/Builder/Props/DialogueBuilder.cs index 1459230ff..8bd12c86c 100644 --- a/NewHorizons/Builder/Props/DialogueBuilder.cs +++ b/NewHorizons/Builder/Props/DialogueBuilder.cs @@ -343,7 +343,7 @@ private static void MakeAttentionPoints(GameObject go, Sector sector, CharacterD { var ptGo = GeneralPropBuilder.MakeNew("AttentionPoint", go, sector, info.attentionPoint, defaultParent: dialogue.transform); dialogue._attentionPoint = ptGo.transform; - dialogue._attentionPointOffset = info.attentionPoint.offset; + dialogue._attentionPointOffset = info.attentionPoint.offset ?? Vector3.zero; ptGo.SetActive(true); } if (info.swappedAttentionPoints != null && info.swappedAttentionPoints.Length > 0) @@ -354,7 +354,7 @@ private static void MakeAttentionPoints(GameObject go, Sector sector, CharacterD var swapper = ptGo.AddComponent(); swapper._dialogueTree = dialogue; swapper._attentionPoint = ptGo.transform; - swapper._attentionPointOffset = pointInfo.offset; + swapper._attentionPointOffset = pointInfo.offset ?? Vector3.zero; swapper._nodeName = pointInfo.dialogueNode; swapper._dialoguePage = pointInfo.dialoguePage; swapper._lookEasing = pointInfo.lookEasing; diff --git a/NewHorizons/Builder/Props/EchoesOfTheEye/AlarmTotemBuilder.cs b/NewHorizons/Builder/Props/EchoesOfTheEye/AlarmTotemBuilder.cs new file mode 100644 index 000000000..46144b6b5 --- /dev/null +++ b/NewHorizons/Builder/Props/EchoesOfTheEye/AlarmTotemBuilder.cs @@ -0,0 +1,60 @@ +using NewHorizons.External.Modules.Props; +using NewHorizons.External.Modules.Props.EchoesOfTheEye; +using NewHorizons.Handlers; +using NewHorizons.Utility; +using NewHorizons.Utility.OWML; +using OWML.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace NewHorizons.Builder.Props.EchoesOfTheEye +{ + public static class AlarmTotemBuilder + { + private static GameObject _prefab; + + internal static void InitPrefab() + { + if (_prefab == null) + { + _prefab = SearchUtilities.Find("DreamWorld_Body/Sector_DreamWorld/Sector_Underground/IslandsRoot/IslandPivot_C/Island_C/Interactibles_Island_C/Prefab_IP_AlarmTotem").InstantiateInactive().Rename("Prefab_AlarmTotem").DontDestroyOnLoad(); + if (_prefab == null) + { + NHLogger.LogWarning($"Tried to make a grapple totem but couldn't. Do you have the DLC installed?"); + return; + } + else + { + _prefab.AddComponent()._destroyOnDLCNotOwned = true; + var alarmTotem = _prefab.GetComponent(); + alarmTotem._sector = null; + } + } + } + + public static GameObject Make(GameObject planetGO, Sector sector, AlarmTotemInfo info, IModBehaviour mod) + { + InitPrefab(); + + if (_prefab == null || sector == null) return null; + + var totemObj = DetailBuilder.Make(planetGO, sector, mod, _prefab, new DetailInfo(info)); + + var alarmTotem = totemObj.GetComponent(); + alarmTotem._sightAngle = info.sightAngle; + alarmTotem._sightDistance = info.sightDistance; + + if (info.stretchVisionCone != null) + { + var visionCone = totemObj.transform.Find("Effects_IP_SIM_AlarmTotem/AlarmTotemVisionCone"); + visionCone.localScale = Vector3.Scale(visionCone.localScale, info.stretchVisionCone); + } + + return totemObj; + } + } +} diff --git a/NewHorizons/Builder/Props/EchoesOfTheEye/DreamCandleBuilder.cs b/NewHorizons/Builder/Props/EchoesOfTheEye/DreamCandleBuilder.cs new file mode 100644 index 000000000..38387bf8a --- /dev/null +++ b/NewHorizons/Builder/Props/EchoesOfTheEye/DreamCandleBuilder.cs @@ -0,0 +1,76 @@ +using NewHorizons.External.Modules.Props; +using NewHorizons.External.Modules.Props.EchoesOfTheEye; +using NewHorizons.Handlers; +using NewHorizons.Utility; +using NewHorizons.Utility.OWML; +using OWML.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace NewHorizons.Builder.Props.EchoesOfTheEye +{ + public static class DreamCandleBuilder + { + private static Dictionary _prefabs = new(); + + internal static void InitPrefabs() + { + InitPrefab(DreamCandleType.Ground, "DreamWorld_Body/Sector_DreamWorld/Sector_DreamZone_1/Interactibles_DreamZone_1/DreamHouseIsland/Prefab_IP_DreamCandle"); + InitPrefab(DreamCandleType.GroundSmall, "DreamWorld_Body/Sector_DreamWorld/Sector_DreamZone_2/Structure_DreamZone_2/City/StartingAreaLanterns/Prefab_IP_DreamCandle_Ground_Small"); + InitPrefab(DreamCandleType.GroundLarge, "DreamWorld_Body/Sector_DreamWorld/Sector_DreamZone_1/Interactibles_DreamZone_1/DreamHouseIsland/Prefab_IP_DreamCandle_Ground_Large"); + InitPrefab(DreamCandleType.GroundSingle, "DreamWorld_Body/Sector_DreamWorld/Sector_DreamZone_1/Sector_PartyHouse/Interactables_PartyHouse/Prefab_IP_DreamCandle_Ground_Single"); + InitPrefab(DreamCandleType.Wall, "DreamWorld_Body/Sector_DreamWorld/Sector_DreamZone_2/Structure_DreamZone_2/City/ParkLanterns/Prefab_IP_DreamCandle_Wall"); + InitPrefab(DreamCandleType.WallLargeFlame, "DreamWorld_Body/Sector_DreamWorld/Sector_DreamZone_2/Structure_DreamZone_2/City/FalseKnightHouse/CandleDoor/FirstDoorLanterns/Prefab_IP_DreamCandle_LargeFlame_Wall"); + InitPrefab(DreamCandleType.WallBigWick, "DreamWorld_Body/Sector_DreamWorld/Sector_DreamZone_2/Structure_DreamZone_2/DreamFireHouse_2/Interactibles_DreamFireHouse_2/Pivot_SlideReelRoom/CandleController/CandlePivot_0/Prefab_IP_DreamCandle_BigWick_Wall"); + InitPrefab(DreamCandleType.Standing, "DreamWorld_Body/Sector_DreamWorld/Sector_DreamZone_2/Structure_DreamZone_2/City/ElevatorHouse/CandleDoor/DoorTutorial/Prefab_IP_DreamCandle_LargeFlame_Standing"); + InitPrefab(DreamCandleType.Pile, "DreamWorld_Body/Sector_DreamWorld/Sector_DreamZone_3/Sector_Hotel/Gallery/Interactibles_Gallery/DreamCandles/Prefab_IP_DreamCandle_Pile"); + } + + private static void InitPrefab(DreamCandleType type, string path) + { + var prefab = _prefabs.ContainsKey(type) ? _prefabs[type] : null; + if (prefab == null) + { + prefab = SearchUtilities.Find(path).InstantiateInactive().Rename($"Prefab_DreamCandle_{type}").DontDestroyOnLoad(); + if (prefab == null) + { + NHLogger.LogWarning($"Tried to make a dream candle but couldn't. Do you have the DLC installed?"); + return; + } + else + { + prefab.AddComponent()._destroyOnDLCNotOwned = true; + var sensor = prefab.GetComponentInChildren(); + sensor._sector = null; + } + _prefabs.Add(type, prefab); + } + } + + public static GameObject Make(GameObject planetGO, Sector sector, DreamCandleInfo info, IModBehaviour mod) + { + InitPrefabs(); + + var prefab = _prefabs.ContainsKey(info.type) ? _prefabs[info.type] : null; + + if (prefab == null || sector == null) return null; + + var candleObj = DetailBuilder.Make(planetGO, sector, mod, prefab, new DetailInfo(info)); + + var dreamCandle = candleObj.GetComponent(); + + var sensor = candleObj.GetComponentInChildren(); + sensor._detectFlashlight = true; + sensor._lightSourceMask |= LightSourceType.FLASHLIGHT; + + dreamCandle._startLit = info.startLit; + dreamCandle.SetLit(info.startLit, false, true); + + return candleObj; + } + } +} diff --git a/NewHorizons/Builder/Props/EchoesOfTheEye/GrappleTotemBuilder.cs b/NewHorizons/Builder/Props/EchoesOfTheEye/GrappleTotemBuilder.cs new file mode 100644 index 000000000..9a25dd12d --- /dev/null +++ b/NewHorizons/Builder/Props/EchoesOfTheEye/GrappleTotemBuilder.cs @@ -0,0 +1,63 @@ +using NewHorizons.External.Modules.Props; +using NewHorizons.External.Modules.Props.EchoesOfTheEye; +using NewHorizons.Handlers; +using NewHorizons.Utility; +using NewHorizons.Utility.OWML; +using OWML.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace NewHorizons.Builder.Props.EchoesOfTheEye +{ + public static class GrappleTotemBuilder + { + private static GameObject _prefab; + + internal static void InitPrefab() + { + if (_prefab == null) + { + _prefab = SearchUtilities.Find("DreamWorld_Body/Sector_DreamWorld/Sector_DreamZone_4/Interactibles_DreamZone_4_Upper/Prefab_IP_GrappleTotem").InstantiateInactive().Rename("Prefab_GrappleTotem").DontDestroyOnLoad(); + if (_prefab == null) + { + NHLogger.LogWarning($"Tried to make a grapple totem but couldn't. Do you have the DLC installed?"); + return; + } + else + { + _prefab.AddComponent()._destroyOnDLCNotOwned = true; + var zoomPoint = _prefab.GetComponentInChildren(); + zoomPoint._sector = null; + var sensor = _prefab.GetComponentInChildren(); + sensor._sector = null; + } + } + } + + public static GameObject Make(GameObject planetGO, Sector sector, GrappleTotemInfo info, IModBehaviour mod) + { + InitPrefab(); + + if (_prefab == null || sector == null) return null; + + var totemObj = DetailBuilder.Make(planetGO, sector, mod, _prefab, new DetailInfo(info)); + + var zoomPoint = totemObj.GetComponentInChildren(); + zoomPoint._minActivationDistance = info.minDistance; + zoomPoint._arrivalDistance = info.arrivalDistance; + + var sensor = totemObj.GetComponentInChildren(); + sensor._detectionAngle = info.maxAngle; + sensor._maxDistance = info.maxDistance; + + sensor._detectFlashlight = true; + sensor._lightSourceMask |= LightSourceType.FLASHLIGHT; + + return totemObj; + } + } +} diff --git a/NewHorizons/Builder/Props/EchoesOfTheEye/PortholeBuilder.cs b/NewHorizons/Builder/Props/EchoesOfTheEye/PortholeBuilder.cs new file mode 100644 index 000000000..b466e2726 --- /dev/null +++ b/NewHorizons/Builder/Props/EchoesOfTheEye/PortholeBuilder.cs @@ -0,0 +1,94 @@ +using NewHorizons.External.Modules.Props; +using NewHorizons.External.Modules.Props.EchoesOfTheEye; +using NewHorizons.Handlers; +using NewHorizons.Utility; +using NewHorizons.Utility.OWML; +using OWML.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace NewHorizons.Builder.Props.EchoesOfTheEye +{ + public static class PortholeBuilder + { + private static GameObject _mainPrefab; + private static GameObject _simPrefab; + + internal static void InitPrefabs() + { + if (_mainPrefab == null) + { + _mainPrefab = SearchUtilities.Find("DreamWorld_Body/Sector_DreamWorld/Sector_DreamZone_4/Interactibles_DreamZone_4_Upper/Props_IP_Peephole_Prison").InstantiateInactive().Rename("Prefab_Porthole").DontDestroyOnLoad(); + if (_mainPrefab == null) + { + NHLogger.LogWarning($"Tried to make a grapple totem but couldn't. Do you have the DLC installed?"); + return; + } + else + { + _mainPrefab.AddComponent()._destroyOnDLCNotOwned = true; + var peephole = _mainPrefab.GetComponentInChildren(); + peephole._factIDs = new string[0]; + peephole._viewingSector = null; + } + } + if (_simPrefab == null) + { + _simPrefab = SearchUtilities.Find("DreamWorld_Body/Sector_DreamWorld/Sector_DreamZone_4/Simulation_DreamZone_4/Geo_DreamZone_4_Upper/Effects_IP_SIM_Porthole").InstantiateInactive().Rename("Prefab_SIM_Porthole").DontDestroyOnLoad(); + if (_simPrefab == null) + { + NHLogger.LogWarning($"Tried to make a grapple totem but couldn't. Do you have the DLC installed?"); + return; + } + else + { + _simPrefab.AddComponent()._destroyOnDLCNotOwned = true; + } + } + } + + public static GameObject Make(GameObject planetGO, Sector sector, PortholeInfo info, IModBehaviour mod) + { + InitPrefabs(); + + if (_mainPrefab == null || _simPrefab == null || sector == null) return null; + + var portholeObj = DetailBuilder.Make(planetGO, sector, mod, _mainPrefab, new DetailInfo(info)); + portholeObj.name = "Prefab_Porthole"; + + var simObj = DetailBuilder.Make(planetGO, sector, mod, _simPrefab, new DetailInfo(info)); + simObj.transform.parent = portholeObj.transform; + + var parentObj = GeneralPropBuilder.MakeNew("Porthole", planetGO, sector, info); + parentObj.SetActive(true); + portholeObj.transform.SetParent(parentObj.transform, true); + portholeObj.transform.localPosition = new Vector3(0f, -4f, 8f); + portholeObj.transform.localEulerAngles = new Vector3(0f, 315f, 0f); + + var peephole = portholeObj.GetComponentInChildren(); + if (info.revealFacts != null) + { + peephole._factIDs = info.revealFacts; + } + + peephole._peepholeCamera.farClipPlane = 4000f; + peephole._peepholeCamera.fieldOfView = info.fieldOfView; + + // Reposition the peephole camera later, after all planets are built, in case the target point is on a different astro body. + Delay.FireInNUpdates(() => + { + var cameraObj = GeneralPropBuilder.MakeFromExisting(peephole._peepholeCamera.gameObject, planetGO, sector, info.target); + cameraObj.transform.Rotate(Vector3.up, 180f, Space.Self); + cameraObj.transform.position += cameraObj.transform.up; + var viewingSector = cameraObj.GetComponentInParent(); + peephole._viewingSector = viewingSector; + }, 2); + + return portholeObj; + } + } +} diff --git a/NewHorizons/Builder/Props/EchoesOfTheEye/ProjectionTotemBuilder.cs b/NewHorizons/Builder/Props/EchoesOfTheEye/ProjectionTotemBuilder.cs new file mode 100644 index 000000000..691551476 --- /dev/null +++ b/NewHorizons/Builder/Props/EchoesOfTheEye/ProjectionTotemBuilder.cs @@ -0,0 +1,129 @@ +using NewHorizons.External.Modules.Props; +using NewHorizons.External.Modules.Props.EchoesOfTheEye; +using NewHorizons.Handlers; +using NewHorizons.Utility; +using NewHorizons.Utility.OWML; +using OWML.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using UnityEngine.InputSystem; + +namespace NewHorizons.Builder.Props.EchoesOfTheEye +{ + public static class ProjectionTotemBuilder + { + private static GameObject _prefab; + + internal static void InitPrefab() + { + if (_prefab == null) + { + _prefab = SearchUtilities.Find("DreamWorld_Body/Sector_DreamWorld/Sector_DreamZone_3/Interactibles_DreamZone_3/Prefab_IP_DreamObjectProjector_Bridge").InstantiateInactive().Rename("Prefab_ProjectionTotem").DontDestroyOnLoad(); + if (_prefab == null) + { + NHLogger.LogWarning($"Tried to make a grapple totem but couldn't. Do you have the DLC installed?"); + return; + } + else + { + _prefab.AddComponent()._destroyOnDLCNotOwned = true; + var projector = _prefab.GetComponent(); + projector._projections = new DreamObjectProjection[0]; + } + } + } + + public static GameObject Make(GameObject planetGO, Sector sector, ProjectionTotemInfo info, IModBehaviour mod) + { + InitPrefab(); + + if (_prefab == null || sector == null) return null; + + var totemObj = DetailBuilder.Make(planetGO, sector, mod, _prefab, new DetailInfo(info)); + + var projector = totemObj.GetComponent(); + + if (!string.IsNullOrEmpty(info.pathToAlarmTotem)) + { + var alarmTotemObj = planetGO.transform.Find(info.pathToAlarmTotem); + if (alarmTotemObj != null) + { + var alarmTotem = alarmTotemObj.GetComponentInChildren(); + if (alarmTotem != null) + { + projector._alarmTotem = alarmTotem; + } + } + } + + if (info.pathsToDreamCandles != null) + { + var dreamCandles = new List(); + foreach (var pathToDreamCandles in info.pathsToDreamCandles) + { + if (string.IsNullOrEmpty(pathToDreamCandles)) continue; + var dreamCandleObj = planetGO.transform.Find(pathToDreamCandles); + if (dreamCandleObj != null) + { + dreamCandles.AddRange(dreamCandleObj.GetComponentsInChildren()); + } + } + projector._dreamCandles = dreamCandles.ToArray(); + } + + if (info.pathsToProjectionTotems != null) + { + var projectionTotems = new List(); + foreach (var pathToProjectionTotems in info.pathsToProjectionTotems) + { + if (string.IsNullOrEmpty(pathToProjectionTotems)) continue; + var projectionTotemObj = planetGO.transform.Find(pathToProjectionTotems); + if (projectionTotemObj != null) + { + projectionTotems.AddRange(projectionTotemObj.GetComponentsInChildren()); + } + } + projector._extinguishedProjectors = projectionTotems.ToArray(); + } + + if (info.pathsToProjectedObjects != null) + { + var projections = new List(); + foreach (var pathToProjectedObject in info.pathsToProjectedObjects) + { + if (string.IsNullOrEmpty(pathToProjectedObject)) continue; + var projectionObj = planetGO.transform.Find(pathToProjectedObject); + if (projectionObj != null) + { + projectionObj.gameObject.AddComponent(); + var projection = projectionObj.gameObject.AddComponent(); + projection._setActive = info.toggleProjectedObjectsActive; + projection.Awake(); + projections.Add(projection); + } + } + projector._projections = projections.ToArray(); + } + + var sensor = projector._lightSensor as SingleLightSensor; + sensor._detectFlashlight = true; + sensor._lightSourceMask |= LightSourceType.FLASHLIGHT; + + projector._lit = info.startLit; + projector._startLit = info.startLit; + projector._extinguishOnly = info.extinguishOnly; + /* + Delay.FireOnNextUpdate(() => + { + projector.Start(); + }); + */ + + return totemObj; + } + } +} diff --git a/NewHorizons/Builder/Props/ItemBuilder.cs b/NewHorizons/Builder/Props/ItemBuilder.cs index 2a678d585..5d4dc7ba9 100644 --- a/NewHorizons/Builder/Props/ItemBuilder.cs +++ b/NewHorizons/Builder/Props/ItemBuilder.cs @@ -143,6 +143,11 @@ public static NHItemSocket MakeSocket(GameObject go, GameObject planetGO, Sector if (socket._socketTransform == null) { var socketGO = GeneralPropBuilder.MakeNew("Socket", planetGO, sector, info, defaultParent: go.transform); + if (info.colliderRadius > 0f) + { + go.AddComponent().radius = info.colliderRadius; + go.GetAddComponent(); + } socketGO.SetActive(true); socket._socketTransform = socketGO.transform; } diff --git a/NewHorizons/Builder/Props/ProjectionBuilder.cs b/NewHorizons/Builder/Props/ProjectionBuilder.cs index 8d9eaca66..7df34b6c1 100644 --- a/NewHorizons/Builder/Props/ProjectionBuilder.cs +++ b/NewHorizons/Builder/Props/ProjectionBuilder.cs @@ -1,4 +1,5 @@ using HarmonyLib; +using NewHorizons.Components.EOTE; using NewHorizons.External.Modules.Props; using NewHorizons.External.Modules.Props.EchoesOfTheEye; using NewHorizons.Handlers; @@ -12,7 +13,7 @@ using System.Linq; using UnityEngine; using UnityEngine.InputSystem; -using static NewHorizons.Main; +using static NewHorizons.Utility.Files.AssetBundleUtilities; namespace NewHorizons.Builder.Props { @@ -137,7 +138,10 @@ private static GameObject MakeSlideReel(GameObject planetGO, Sector sector, Proj slideReel.SetSector(sector); slideReel.SetVisible(true); - var slideCollectionContainer = slideReelObj.GetRequiredComponent(); + var toDestroy = slideReelObj.GetComponent(); + var slideCollectionContainer = slideReelObj.AddComponent(); + slideReel._slideCollectionContainer = slideCollectionContainer; + Component.DestroyImmediate(toDestroy); foreach (var renderer in slideReelObj.GetComponentsInChildren()) { @@ -342,7 +346,10 @@ public static GameObject MakeAutoProjector(GameObject planetGO, Sector sector, P var autoProjector = projectorObj.GetComponent(); autoProjector._sector = sector; - var slideCollectionContainer = autoProjector.GetRequiredComponent(); + var toDestroy = autoProjector.GetComponent(); + var slideCollectionContainer = autoProjector.gameObject.AddComponent(); + autoProjector._slideCollectionItem = slideCollectionContainer; + Component.DestroyImmediate(toDestroy); // Now we replace the slides int slidesCount = info.slides.Length; @@ -419,7 +426,7 @@ public static GameObject MakeMindSlidesTarget(GameObject planetGO, Sector sector // attach a component to store all the data for the slides that play when a vision torch scans this target var target = g.AddComponent(); - var slideCollectionContainer = g.AddComponent(); + var slideCollectionContainer = g.AddComponent(); slideCollectionContainer.slideCollection = slideCollection; target.slideCollection = g.AddComponent(); target.slideCollection._slideCollectionContainer = slideCollectionContainer; @@ -486,7 +493,7 @@ public static GameObject MakeStandingVisionTorch(GameObject planetGO, Sector sec ); // Set up the containers for the slides - var slideCollectionContainer = standingTorch.AddComponent(); + var slideCollectionContainer = standingTorch.AddComponent(); slideCollectionContainer.slideCollection = slideCollection; var mindSlideCollection = standingTorch.AddComponent(); @@ -536,12 +543,12 @@ private static (SlideReelAsyncImageLoader inverted, SlideReelAsyncImageLoader at if (useInvertedCache && cacheExists) { // Load the inverted images used when displaying slide reels to a screen - invertedImageLoader.PathsToLoad.Add((i, Path.Combine(Instance.ModHelper.Manifest.ModFolderPath, "Assets/textures/inverted_blank_slide_reel.png"))); + invertedImageLoader.PathsToLoad.Add((i, Path.Combine(Main.Instance.ModHelper.Manifest.ModFolderPath, "Assets/textures/inverted_blank_slide_reel.png"))); } else { // Used to then make cached stuff - imageLoader.PathsToLoad.Add((i, Path.Combine(Instance.ModHelper.Manifest.ModFolderPath, "Assets/textures/blank_slide_reel.png"))); + imageLoader.PathsToLoad.Add((i, Path.Combine(Main.Instance.ModHelper.Manifest.ModFolderPath, "Assets/textures/blank_slide_reel.png"))); } } else @@ -658,12 +665,15 @@ private static void AddModules(SlideInfo slideInfo, ref Slide slide, IModBehavio Slide.WriteModules(modules, ref slide._modulesList, ref slide._modulesData, ref slide.lengths); } - private static void LinkShipLogFacts(ProjectionInfo info, SlideCollectionContainer slideCollectionContainer) + private static void LinkShipLogFacts(ProjectionInfo info, NHSlideCollectionContainer slideCollectionContainer) { // Idk why but it wants reveals to be comma delimited not a list if (info.reveals != null) slideCollectionContainer._shipLogOnComplete = string.Join(",", info.reveals); // Don't use null value, NRE in SlideCollectionContainer.Initialize slideCollectionContainer._playWithShipLogFacts = info.playWithShipLogFacts ?? Array.Empty(); + + slideCollectionContainer.conditionsToSet = info.conditionsToSet; + slideCollectionContainer.persistentConditionsToSet = info.persistentConditionsToSet; } } diff --git a/NewHorizons/Builder/Props/PropBuildManager.cs b/NewHorizons/Builder/Props/PropBuildManager.cs index 8cff2939c..579d5e218 100644 --- a/NewHorizons/Builder/Props/PropBuildManager.cs +++ b/NewHorizons/Builder/Props/PropBuildManager.cs @@ -102,13 +102,20 @@ public static void Make(GameObject go, Sector sector, OWRigidbody planetBody, Ne // If a prop has set its parentPath and the parent cannot be found, add it to the next pass and try again later nextPass = new List(); - if (Main.HasDLC) MakeGeneralProps(go, config.Props.dreamCampfires, (campfire) => DreamCampfireBuilder.Make(go, sector, campfire, mod), (campfire) => campfire.id); - if (Main.HasDLC) MakeGeneralProps(go, config.Props.dreamArrivalPoints, (point) => DreamArrivalPointBuilder.Make(go, sector, point, mod), (point) => point.id); MakeGeneralProps(go, config.Props.gravityCannons, (cannon) => GravityCannonBuilder.Make(go, sector, cannon, mod), (cannon) => cannon.shuttleID); MakeGeneralProps(go, config.Props.shuttles, (shuttle) => ShuttleBuilder.Make(go, sector, mod, shuttle), (shuttle) => shuttle.id); MakeGeneralProps(go, config.Props.details, (detail) => DetailBuilder.Make(go, sector, mod, detail), (detail) => detail.path); MakeGeneralProps(go, config.Props.geysers, (geyser) => GeyserBuilder.Make(go, sector, geyser)); - if (Main.HasDLC) MakeGeneralProps(go, config.Props.rafts, (raft) => RaftBuilder.Make(go, sector, raft, planetBody)); + if (Main.HasDLC) + { + MakeGeneralProps(go, config.Props.dreamCandles, (candle) => DreamCandleBuilder.Make(go, sector, candle, mod)); + MakeGeneralProps(go, config.Props.portholes, (porthole) => PortholeBuilder.Make(go, sector, porthole, mod)); + MakeGeneralProps(go, config.Props.alarmTotems, (totem) => AlarmTotemBuilder.Make(go, sector, totem, mod)); + MakeGeneralProps(go, config.Props.grappleTotems, (totem) => GrappleTotemBuilder.Make(go, sector, totem, mod)); + MakeGeneralProps(go, config.Props.dreamCampfires, (campfire) => DreamCampfireBuilder.Make(go, sector, campfire, mod), (campfire) => campfire.id); + MakeGeneralProps(go, config.Props.dreamArrivalPoints, (point) => DreamArrivalPointBuilder.Make(go, sector, point, mod), (point) => point.id); + MakeGeneralProps(go, config.Props.rafts, (raft) => RaftBuilder.Make(go, sector, raft, planetBody)); + } MakeGeneralProps(go, config.Props.tornados, (tornado) => TornadoBuilder.Make(go, sector, tornado, config.Atmosphere?.clouds != null)); MakeGeneralProps(go, config.Props.volcanoes, (volcano) => VolcanoBuilder.Make(go, sector, volcano)); MakeGeneralProps(go, config.Props.dialogue, (dialogueInfo) => @@ -132,6 +139,11 @@ public static void Make(GameObject go, Sector sector, OWRigidbody planetBody, Ne MakeGeneralProps(go, config.Props.warpTransmitters, (warpTransmitter) => WarpPadBuilder.Make(go, sector, mod, warpTransmitter), (warpTransmitter) => warpTransmitter.frequency); MakeGeneralProps(go, config.Props.audioSources, (audioSource) => AudioSourceBuilder.Make(go, sector, audioSource, mod), (audioSource) => audioSource.audio); RemoteBuilder.MakeGeneralProps(go, sector, config.Props.remotes, nhBody); + if (Main.HasDLC) MakeGeneralProps(go, config.Props.projectionTotems, (totem) => ProjectionTotemBuilder.Make(go, sector, totem, mod)); + // For quantum groups, make the details in advance + if (config.Props.socketQuantumGroups != null) MakeGeneralProps(go, config.Props.socketQuantumGroups.SelectMany(x => x.details), (detail) => DetailBuilder.Make(go, sector, mod, detail), (detail) => detail.path); + if (config.Props.stateQuantumGroups != null) MakeGeneralProps(go, config.Props.stateQuantumGroups.SelectMany(x => x.details), (detail) => DetailBuilder.Make(go, sector, mod, detail), (detail) => detail.path); + if (config.Props.lightningQuantumGroups != null) MakeGeneralProps(go, config.Props.lightningQuantumGroups, (lightning) => QuantumBuilder.MakeQuantumLightning(go, sector, mod, lightning)); RunMultiPass(); @@ -154,33 +166,8 @@ public static void Make(GameObject go, Sector sector, OWRigidbody planetBody, Ne } } - if (config.Props.quantumGroups != null) - { - Dictionary> propsByGroup = new Dictionary>(); - foreach (var detail in config.Props.details) - { - if (detail.quantumGroupID != null) - { - if (!propsByGroup.ContainsKey(detail.quantumGroupID)) propsByGroup[detail.quantumGroupID] = new List(); - propsByGroup[detail.quantumGroupID].Add(DetailBuilder.GetSpawnedGameObjectByDetailInfo(detail)); - } - } - - foreach (var quantumGroup in config.Props.quantumGroups) - { - if (!propsByGroup.ContainsKey(quantumGroup.id)) continue; - var propsInGroup = propsByGroup[quantumGroup.id]; - - try - { - QuantumBuilder.Make(go, sector, config, mod, quantumGroup, propsInGroup.ToArray()); - } - catch (Exception ex) - { - NHLogger.LogError($"Couldn't make quantum group \"{quantumGroup.id}\" for [{go.name}]:\n{ex}"); - } - } - } + if (config.Props.socketQuantumGroups != null) QuantumBuilder.Make(go, sector, mod, config.Props.socketQuantumGroups); + if (config.Props.stateQuantumGroups != null) QuantumBuilder.Make(go, sector, mod, config.Props.stateQuantumGroups); } private static bool _ignoreParent; diff --git a/NewHorizons/Builder/Props/QuantumBuilder.cs b/NewHorizons/Builder/Props/QuantumBuilder.cs index dff1d3a75..90227e115 100644 --- a/NewHorizons/Builder/Props/QuantumBuilder.cs +++ b/NewHorizons/Builder/Props/QuantumBuilder.cs @@ -1,6 +1,7 @@ using NewHorizons.Components.Quantum; -using NewHorizons.External.Configs; +using NewHorizons.External.Modules.Props; using NewHorizons.External.Modules.Props.Quantum; +using NewHorizons.Utility.Files; using NewHorizons.Utility.Geometry; using NewHorizons.Utility.OWML; using OWML.Common; @@ -12,54 +13,148 @@ namespace NewHorizons.Builder.Props { public static class QuantumBuilder { - - public static void Make(GameObject go, Sector sector, PlanetConfig config, IModBehaviour mod, QuantumGroupInfo quantumGroup, GameObject[] propsInGroup) + public static void Make(GameObject planetGO, Sector sector, IModBehaviour mod, BaseQuantumGroupInfo[] quantumGroups) { - switch(quantumGroup.type) + foreach (var group in quantumGroups) { - case QuantumGroupType.Sockets: MakeSocketGroup (go, sector, config, mod, quantumGroup, propsInGroup); return; - case QuantumGroupType.States: MakeStateGroup (go, sector, config, mod, quantumGroup, propsInGroup); return; - // case PropModule.QuantumGroupType.Shuffle: MakeShuffleGroup(go, sector, config, mod, quantumGroup, propsInGroup); return; + Make(planetGO, sector, mod, group); } } - - // TODO: Socket groups that have an equal number of props and sockets + + public static void Make(GameObject planetGO, Sector sector, IModBehaviour mod, BaseQuantumGroupInfo quantumGroup) + { + if (quantumGroup.details == null || !quantumGroup.details.Any()) + { + NHLogger.LogError($"Found quantum group with no details - [{planetGO.name}] [{quantumGroup.rename}]"); + return; + } + + if (quantumGroup is SocketQuantumGroupInfo socketGroup) + { + MakeSocketGroup(planetGO, sector, mod, socketGroup); + } + else if (quantumGroup is StateQuantumGroupInfo stateGroup) + { + MakeStateGroup(planetGO, sector, mod, stateGroup); + } + } + + public static void MakeQuantumLightning(GameObject planetGO, Sector sector, IModBehaviour mod, LightningQuantumInfo quantumGroup) + { + (GameObject go, DetailInfo detail)[] propsInGroup = quantumGroup.details.Select(x => (DetailBuilder.Make(planetGO, sector, mod, x), x)).ToArray(); + + var lightning = DetailBuilder.Make(planetGO, sector, Main.Instance, AssetBundleUtilities.NHPrivateAssetBundle.LoadAsset("Prefab_EYE_QuantumLightningObject"), new DetailInfo(quantumGroup)); + AssetBundleUtilities.ReplaceShaders(lightning); + + foreach (var (go, _) in propsInGroup) + { + go.transform.parent = lightning.transform; + go.transform.localPosition = Vector3.zero; + go.transform.localRotation = Quaternion.identity; + } + + var lightningController = lightning.GetComponent(); + lightningController._models = propsInGroup.Select(x => x.go).ToArray(); + lightningController.enabled = true; + + lightning.name = quantumGroup.rename; + lightning.SetActive(true); + + // Not sure why but it isn't enabling itself + Delay.FireOnNextUpdate(() => lightningController.enabled = true); + } + // Nice to have: socket groups that specify a filledSocketObject and an emptySocketObject (eg the archway in the giant's deep tower) - public static void MakeSocketGroup(GameObject go, Sector sector, PlanetConfig config, IModBehaviour mod, QuantumGroupInfo quantumGroup, GameObject[] propsInGroup) + public static void MakeSocketGroup(GameObject planetGO, Sector sector, IModBehaviour mod, SocketQuantumGroupInfo quantumGroup) { - var groupRoot = new GameObject("Quantum Sockets - " + quantumGroup.id); - groupRoot.transform.parent = sector?.transform ?? go.transform; + (GameObject go, QuantumDetailInfo detail)[] propsInGroup = quantumGroup.details.Select(x => (DetailBuilder.GetGameObjectFromDetailInfo(x), x)).ToArray(); + + GameObject specialProp = null; + QuantumDetailInfo specialInfo = null; + if (propsInGroup.Length == quantumGroup.sockets.Length) + { + // Special case! + specialProp = propsInGroup.Last().go; + specialInfo = propsInGroup.Last().detail; + var propsInGroupList = propsInGroup.ToList(); + propsInGroupList.RemoveAt(propsInGroup.Length - 1); + propsInGroup = propsInGroupList.ToArray(); + } + + var groupRoot = new GameObject(quantumGroup.rename); + groupRoot.transform.parent = sector?.transform ?? planetGO.transform; groupRoot.transform.localPosition = Vector3.zero; groupRoot.transform.localEulerAngles = Vector3.zero; - + var sockets = new QuantumSocket[quantumGroup.sockets.Length]; for (int i = 0; i < quantumGroup.sockets.Length; i++) { var socketInfo = quantumGroup.sockets[i]; - var socket = GeneralPropBuilder.MakeNew("Socket " + i, go, sector, socketInfo, defaultParent: groupRoot.transform); + var socket = GeneralPropBuilder.MakeNew("Socket " + i, planetGO, sector, socketInfo, defaultParent: groupRoot.transform); sockets[i] = socket.AddComponent(); sockets[i]._lightSources = new Light[0]; // TODO: make this customizable? socket.SetActive(true); } - foreach(var prop in propsInGroup) + foreach (var prop in propsInGroup) { - prop.SetActive(false); - var quantumObject = prop.AddComponent(); + prop.go.SetActive(false); + var quantumObject = prop.go.AddComponent(); quantumObject._socketRoot = groupRoot; quantumObject._socketList = sockets.ToList(); quantumObject._sockets = sockets; quantumObject._prebuilt = true; + quantumObject._alignWithSocket = !prop.detail.alignWithGravity; + quantumObject._randomYRotation = prop.detail.randomizeYRotation; + quantumObject._alignWithGravity = prop.detail.alignWithGravity; quantumObject._childSockets = new List(); - // TODO: support _alignWithGravity? - if (prop.GetComponentInChildren() == null) AddBoundsVisibility(prop); - prop.SetActive(true); + if (prop.go.GetComponentInChildren() == null) + { + BoundsUtilities.AddBoundsVisibility(prop.go); + } + prop.go.SetActive(true); + } + + if (specialProp != null) + { + // Can't have 4 objects in 4 slots + // Instead we have a duplicate of the final object for each slot, which appears when that slot is "empty" + for (int i = 0; i < sockets.Length; i++) + { + var emptySocketObject = DetailBuilder.Make(planetGO, sector, mod, specialProp, new DetailInfo()); + var socket = sockets[i]; + socket._emptySocketObject = emptySocketObject; + emptySocketObject.SetActive(socket._quantumObject == null); + emptySocketObject.transform.parent = socket.transform; + emptySocketObject.transform.localPosition = Vector3.zero; + emptySocketObject.transform.localRotation = Quaternion.identity; + + // Need to add a visibility tracker for this socket else it doesn't stay "empty" when photographed + socket.SetActive(false); + var tracker = new GameObject("VisibilityTracker"); + tracker.transform.parent = socket.transform; + tracker.transform.localPosition = Vector3.zero; + tracker.transform.localRotation = Quaternion.identity; + var box = tracker.AddComponent(); + box.size = new Vector3(0.2f, 0.6f, 0.2f); + box.center = new Vector3(0, 0.3f, 0); + tracker.AddComponent(); + // Using a quantum object bc it can be locked by camera + var quantumObject = socket.gameObject.AddComponent(); + quantumObject._alignWithSocket = !specialInfo.alignWithGravity; + quantumObject._randomYRotation = specialInfo.randomizeYRotation; + quantumObject._alignWithGravity = specialInfo.alignWithGravity; + quantumObject.emptySocketObject = emptySocketObject; + socket._visibilityObject = quantumObject; + + socket.SetActive(true); + } } } - public static void MakeStateGroup(GameObject go, Sector sector, PlanetConfig config, IModBehaviour mod, QuantumGroupInfo quantumGroup, GameObject[] propsInGroup) + public static void MakeStateGroup(GameObject go, Sector sector, IModBehaviour mod, StateQuantumGroupInfo quantumGroup) { // NOTE: States groups need special consideration that socket groups don't // this is because the base class QuantumObject (and this is important) IGNORES PICTURES TAKEN FROM OVER 100 METERS AWAY @@ -67,12 +162,14 @@ public static void MakeStateGroup(GameObject go, Sector sector, PlanetConfig con // while states put the QuantumObject component (NHMultiStateQuantumObject) on the parent, which is located at the center of the planet // this means that the distance measured by QuantumObject is not accurate, since it's not measuring from the active prop, but from the center of the planet - var groupRoot = new GameObject("Quantum States - " + quantumGroup.id); + var propsInGroup = quantumGroup.details.Select(x => DetailBuilder.GetGameObjectFromDetailInfo(x)).ToArray(); + + var groupRoot = new GameObject(quantumGroup.rename); groupRoot.transform.parent = sector?.transform ?? go.transform; groupRoot.transform.localPosition = Vector3.zero; var states = new List(); - foreach(var prop in propsInGroup) + foreach (var prop in propsInGroup) { prop.transform.parent = groupRoot.transform; var state = prop.AddComponent(); @@ -81,24 +178,23 @@ public static void MakeStateGroup(GameObject go, Sector sector, PlanetConfig con if (prop.GetComponentInChildren() != null) continue; - AddBoundsVisibility(prop); + BoundsUtilities.AddBoundsVisibility(prop); } if (quantumGroup.hasEmptyState) { var template = propsInGroup[0]; - + var empty = new GameObject("Empty State"); empty.transform.parent = groupRoot.transform; var state = empty.AddComponent(); states.Add(state); - var boxBounds = GetBoundsOfSelfAndChildMeshes(template); + var boxBounds = BoundsUtilities.GetBoundsOfSelfAndChildMeshes(template); var boxShape = empty.AddComponent(); boxShape.center = boxBounds.center; boxShape.extents = boxBounds.size; - if (Main.Debug) empty.AddComponent(); - + empty.AddComponent(); empty.AddComponent(); } @@ -114,50 +210,50 @@ public static void MakeStateGroup(GameObject go, Sector sector, PlanetConfig con groupRoot.SetActive(true); } - public static void MakeShuffleGroup(GameObject go, Sector sector, PlanetConfig config, IModBehaviour mod, QuantumGroupInfo quantumGroup, GameObject[] propsInGroup) + public static void MakeShuffleGroup(GameObject go, Sector sector, BaseQuantumGroupInfo quantumGroup, GameObject[] propsInGroup) { //var averagePosition = propsInGroup.Aggregate(Vector3.zero, (avg, prop) => avg + prop.transform.position) / propsInGroup.Count(); - GameObject shuffleParent = new GameObject("Quantum Shuffle - " + quantumGroup.id); + GameObject shuffleParent = new GameObject(quantumGroup.rename); shuffleParent.SetActive(false); shuffleParent.transform.parent = sector?.transform ?? go.transform; shuffleParent.transform.localPosition = Vector3.zero; - propsInGroup.ToList().ForEach(p => p.transform.parent = shuffleParent.transform); + propsInGroup.ToList().ForEach(p => p.transform.parent = shuffleParent.transform); var shuffle = shuffleParent.AddComponent(); shuffle._shuffledObjects = propsInGroup.Select(p => p.transform).ToArray(); shuffle.Awake(); // this doesn't get called on its own for some reason. what? how? - + AddBoundsVisibility(shuffleParent); shuffleParent.SetActive(true); } - + struct BoxShapeReciever { public MeshFilter f; public SkinnedMeshRenderer s; - public GameObject g; + public GameObject gameObject; } public static void AddBoundsVisibility(GameObject g) { var meshFilters = g.GetComponentsInChildren(); var skinnedMeshRenderers = g.GetComponentsInChildren(); - + var boxShapeRecievers = meshFilters - .Select(f => new BoxShapeReciever() { f=f, g=f.gameObject }) - .Concat ( - skinnedMeshRenderers.Select(s => new BoxShapeReciever() { s=s, g=s.gameObject }) + .Select(f => new BoxShapeReciever() { f = f, gameObject = f.gameObject }) + .Concat( + skinnedMeshRenderers.Select(s => new BoxShapeReciever() { s = s, gameObject = s.gameObject }) ) .ToList(); - foreach(var boxshapeReciever in boxShapeRecievers) + foreach (var boxshapeReciever in boxShapeRecievers) { - var box = boxshapeReciever.g.AddComponent(); - boxshapeReciever.g.AddComponent(); - if (Main.Debug) boxshapeReciever.g.AddComponent(); + var box = boxshapeReciever.gameObject.AddComponent(); + boxshapeReciever.gameObject.AddComponent(); + boxshapeReciever.gameObject.AddComponent(); - var fixer = boxshapeReciever.g.AddComponent(); + var fixer = boxshapeReciever.gameObject.AddComponent(); fixer.shape = box; fixer.meshFilter = boxshapeReciever.f; fixer.skinnedMeshRenderer = boxshapeReciever.s; @@ -169,7 +265,7 @@ public static Bounds GetBoundsOfSelfAndChildMeshes(GameObject g) { var meshFilters = g.GetComponentsInChildren(); var corners = meshFilters.SelectMany(m => GetMeshCorners(m, g)).ToList(); - + Bounds b = new Bounds(corners[0], Vector3.zero); corners.ForEach(corner => b.Encapsulate(corner)); @@ -191,9 +287,9 @@ public static Vector3[] GetMeshCorners(MeshFilter m, GameObject relativeTo = nul new Vector3(bounds.max.x, bounds.min.y, bounds.max.z), new Vector3(bounds.max.x, bounds.max.y, bounds.min.z), }; - + var globalCorners = localCorners.Select(localCorner => m.transform.TransformPoint(localCorner)).ToArray(); - + if (relativeTo == null) return globalCorners; return globalCorners.Select(globalCorner => relativeTo.transform.InverseTransformPoint(globalCorner)).ToArray(); @@ -213,9 +309,13 @@ public class BoxShapeFixer : MonoBehaviour public MeshFilter meshFilter; public SkinnedMeshRenderer skinnedMeshRenderer; - void Update() + public void Update() { - if (meshFilter == null && skinnedMeshRenderer == null) { NHLogger.LogVerbose("Useless BoxShapeFixer, destroying"); DestroyImmediate(this); } + if (meshFilter == null && skinnedMeshRenderer == null) + { + NHLogger.LogVerbose("Useless BoxShapeFixer, destroying"); + DestroyImmediate(this); + } Mesh sharedMesh = null; if (meshFilter != null) sharedMesh = meshFilter.sharedMesh; @@ -223,7 +323,7 @@ void Update() if (sharedMesh == null) return; if (sharedMesh.bounds.size == Vector3.zero) return; - + shape.size = sharedMesh.bounds.size; shape.center = sharedMesh.bounds.center; diff --git a/NewHorizons/Builder/Props/TornadoBuilder.cs b/NewHorizons/Builder/Props/TornadoBuilder.cs index c2d29093e..098bf4663 100644 --- a/NewHorizons/Builder/Props/TornadoBuilder.cs +++ b/NewHorizons/Builder/Props/TornadoBuilder.cs @@ -158,7 +158,7 @@ private static void MakeTornado(GameObject planetGO, Sector sector, TornadoInfo // Resize it so the force volume goes all the way up var fluidGO = tornadoGO.transform.Find(downwards ? "MockDownTornado_FluidCenter" : "MockUpTornado_FluidCenter"); fluidGO.GetComponent()._fluidType = info.fluidType.ConvertToOW(FluidVolume.Type.CLOUD); - fluidGO.localScale = new Vector3(1, 2f, 1); + fluidGO.localPosition = Vector3.up * 4.8f; if (info.tint != null) { diff --git a/NewHorizons/Builder/ShipLog/MapModeBuilder.cs b/NewHorizons/Builder/ShipLog/MapModeBuilder.cs index c51ece61f..9d66447f7 100644 --- a/NewHorizons/Builder/ShipLog/MapModeBuilder.cs +++ b/NewHorizons/Builder/ShipLog/MapModeBuilder.cs @@ -21,11 +21,25 @@ public static class MapModeBuilder { // Takes the game object because sometimes we change the AO to an NHAO and it breaks private static Dictionary _astroObjectToShipLog = new(); + private static Dictionary _astroObjectToMapModeInfo = new(); + + public static MapModeInfo GetMapModeInfoForAstroObject(ShipLogAstroObject slao) + { + if (_astroObjectToMapModeInfo.TryGetValue(slao, out var mapModeInfo)) + { + return mapModeInfo; + } + else + { + return null; + } + } #region General public static ShipLogAstroObject[][] ConstructMapMode(string systemName, GameObject transformParent, ShipLogAstroObject[][] currentNav, int layer) { _astroObjectToShipLog = new(); + _astroObjectToMapModeInfo = new(); // Add stock planets foreach (var shipLogAstroObject in currentNav.SelectMany(x => x)) @@ -50,7 +64,7 @@ public static ShipLogAstroObject[][] ConstructMapMode(string systemName, GameObj Material greyScaleMaterial = SearchUtilities.Find(ShipLogHandler.PAN_ROOT_PATH + "/TimberHearth/Sprite").GetComponent().material; List bodies = Main.BodyDict[systemName].Where( - b => !(b.Config.ShipLog?.mapMode?.remove ?? false) && !b.Config.isQuantumState + b => !(b.Config.ShipLog?.mapMode?.remove ?? false) && !b.Config.isQuantumState && !b.Config.destroy ).ToList(); bool flagManualPositionUsed = systemName == "SolarSystem"; bool flagAutoPositionUsed = false; @@ -65,7 +79,7 @@ public static ShipLogAstroObject[][] ConstructMapMode(string systemName, GameObj else { flagManualPositionUsed = true; - if (body.Config.ShipLog?.mapMode?.manualNavigationPosition == null) + if (body.Config.ShipLog?.mapMode != null && body.Config.ShipLog.mapMode.manualNavigationPosition == null && body.Config.ShipLog.mapMode.selectable) { NHLogger.LogError("Navigation position is missing for: " + body.Config.name); return null; @@ -157,6 +171,12 @@ private static GameObject CreateMapModeGameObject(NewHorizonsBody body, GameObje private static ShipLogAstroObject AddShipLogAstroObject(GameObject gameObject, NewHorizonsBody body, Material greyScaleMaterial, int layer) { + if (body.Object == null) + { + NHLogger.LogError($"Tried to make ship logs for planet with null Object: [{body?.Config?.name}]"); + return null; + } + const float unviewedIconOffset = 15; NHLogger.LogVerbose($"Adding ship log astro object for {body.Config.name}"); @@ -166,6 +186,7 @@ private static ShipLogAstroObject AddShipLogAstroObject(GameObject gameObject, N ShipLogAstroObject astroObject = gameObject.AddComponent(); astroObject._id = ShipLogHandler.GetAstroObjectId(body); _astroObjectToShipLog[body.Object] = astroObject; + _astroObjectToMapModeInfo[astroObject] = body.Config.ShipLog?.mapMode; Texture2D image = null; Texture2D outline = null; @@ -440,6 +461,11 @@ private static void MakeAllNodes(ref MapModeObject parentNode, GameObject parent private static MapModeObject ConstructPrimaryNode(List bodies) { + float DistanceFromPrimary(NewHorizonsBody body) + { + return Mathf.Max(body.Config.Orbit.semiMajorAxis, body.Config.Orbit.staticPosition?.Length() ?? 0f); + } + foreach (NewHorizonsBody body in bodies.Where(b => b.Config.Base.centerOfSolarSystem)) { bodies.Sort((b, o) => b.Config.Orbit.semiMajorAxis.CompareTo(o.Config.Orbit.semiMajorAxis)); @@ -571,7 +597,10 @@ private static void MakeNode(ref MapModeObject node, GameObject parent, Material astroObject._unviewedObj.GetComponent().enabled = false; } node.astroObject = astroObject; - if (node.lastSibling != null) ConnectNodeToLastSibling(node, greyScaleMaterial); + if (NewHorizons.Main.Debug) + { + if (node.lastSibling != null) ConnectNodeToLastSibling(node, greyScaleMaterial); + } MakeDetails(node.mainBody, newNodeGO.transform, greyScaleMaterial); } #endregion diff --git a/NewHorizons/Builder/ShipLog/RumorModeBuilder.cs b/NewHorizons/Builder/ShipLog/RumorModeBuilder.cs index d224fffa4..7f4d28f2a 100644 --- a/NewHorizons/Builder/ShipLog/RumorModeBuilder.cs +++ b/NewHorizons/Builder/ShipLog/RumorModeBuilder.cs @@ -154,6 +154,35 @@ public static void GenerateEntryData(ShipLogManager manager) } } + public static void MergeEntries(ShipLogManager manager, ShipLogEntry entry, ShipLogEntry existing) + { + foreach (var fact in entry.GetRumorFacts()) + { + existing._rumorFacts.Add(fact); + fact.OnFactRevealed += existing.OnFactRevealed; + + manager._factRevealCount = Mathf.Max(manager._factRevealCount, fact.GetRevealOrder()); + manager._factList.Add(fact); + manager._factDict.Add(fact.GetID(), fact); + } + foreach (var fact in entry.GetExploreFacts()) + { + existing._exploreFacts.Add(fact); + existing._completionFacts.Add(fact); + fact.OnFactRevealed += existing.OnFactRevealed; + + manager._factRevealCount = Mathf.Max(manager._factRevealCount, fact.GetRevealOrder()); + manager._factList.Add(fact); + manager._factDict.Add(fact.GetID(), fact); + } + foreach (var child in entry.GetChildren()) + { + existing._childEntries.Add(child); + + manager.AddEntry(child); + } + } + private static void AddTranslation(XElement entry) { XElement nameElement = entry.Element("Name"); diff --git a/NewHorizons/Components/EOTE/NHSlideCollectionContainer.cs b/NewHorizons/Components/EOTE/NHSlideCollectionContainer.cs new file mode 100644 index 000000000..bcf979ec7 --- /dev/null +++ b/NewHorizons/Components/EOTE/NHSlideCollectionContainer.cs @@ -0,0 +1,62 @@ +using HarmonyLib; + +namespace NewHorizons.Components.EOTE; + +[HarmonyPatch(typeof(SlideCollectionContainer))] +public class NHSlideCollectionContainer : SlideCollectionContainer +{ + public string[] conditionsToSet; + public string[] persistentConditionsToSet; + + [HarmonyPrefix] + [HarmonyPatch(typeof(SlideCollectionContainer), nameof(SlideCollectionContainer.Initialize))] + public static bool SlideCollectionContainer_Initialize(SlideCollectionContainer __instance) + { + if (__instance is NHSlideCollectionContainer) + { + if (__instance._initialized) + return false; + __instance.SetupReadFlags(); + __instance.RegisterPerSlideCompletion(); + if (__instance.streamingTexturesAvailable) + __instance.SetupStreaming(); + __instance.BuildMusicRangesIndex(); + __instance._changeSlidesAllowed = true; + __instance._initialized = true; + __instance._slideCollection.isVision = __instance._owningItem == null; + foreach (var factID in __instance._playWithShipLogFacts) + { + var fact = Locator.GetShipLogManager().GetFact(factID); + fact?.RegisterSlideCollection(__instance._slideCollection); + } + return false; + } + return true; + } + + [HarmonyPostfix] + [HarmonyPatch(typeof(SlideCollectionContainer), nameof(SlideCollectionContainer.SetReadFlag))] + public static void SlideCollectionContainer_SetReadFlag(SlideCollectionContainer __instance) + { + if (__instance is NHSlideCollectionContainer container) + { + if (container._unreadSlideIndices.Count == 0) + { + if (container.conditionsToSet != null) + { + foreach (var condition in container.conditionsToSet) + { + DialogueConditionManager.SharedInstance.SetConditionState(condition, true); + } + } + if (container.persistentConditionsToSet != null) + { + foreach (var condition in container.persistentConditionsToSet) + { + PlayerData.SetPersistentCondition(condition, true); + } + } + } + } + } +} diff --git a/NewHorizons/Components/Props/NHItem.cs b/NewHorizons/Components/Props/NHItem.cs index bdf3e388e..cdc783b57 100644 --- a/NewHorizons/Components/Props/NHItem.cs +++ b/NewHorizons/Components/Props/NHItem.cs @@ -1,12 +1,5 @@ using NewHorizons.Builder.Props; using NewHorizons.Handlers; -using OWML.Utils; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; using UnityEngine; namespace NewHorizons.Components.Props diff --git a/NewHorizons/Components/Props/NHItemSocket.cs b/NewHorizons/Components/Props/NHItemSocket.cs index bd40a96d3..ce1cd9137 100644 --- a/NewHorizons/Components/Props/NHItemSocket.cs +++ b/NewHorizons/Components/Props/NHItemSocket.cs @@ -1,10 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using UnityEngine; - namespace NewHorizons.Components.Props { public class NHItemSocket : OWItemSocket diff --git a/NewHorizons/Components/Quantum/SnapshotLockableVisiblityObject.cs b/NewHorizons/Components/Quantum/SnapshotLockableVisiblityObject.cs new file mode 100644 index 000000000..ba139d661 --- /dev/null +++ b/NewHorizons/Components/Quantum/SnapshotLockableVisiblityObject.cs @@ -0,0 +1,78 @@ +using HarmonyLib; +using System.Linq; +using UnityEngine; + +namespace NewHorizons.Components.Quantum; + +/// +/// A quantum object that does nothing but track if its been photographed +/// +/// Adapted from Escape Room (mod I (xen) worked on for Jam 4) +/// +internal class SnapshotLockableVisibilityObject : SocketedQuantumObject +{ + public GameObject emptySocketObject; + + public override bool ChangeQuantumState(bool skipInstantVisibilityCheck) => true; +} + + +[HarmonyPatch(typeof(SocketedQuantumObject))] +public static class SocketedQuantumObjectPatches +{ + private static bool _skipPatch; + [HarmonyPrefix] + [HarmonyPatch(typeof(SocketedQuantumObject), nameof(SocketedQuantumObject.MoveToSocket))] + private static bool SocketedQuantumObject_MoveToSocket(SocketedQuantumObject __instance, QuantumSocket socket) + { + // Double check this is a normal allowed move, then do rotation stuff + if (socket.GetVisibilityObject() is SnapshotLockableVisibilityObject qObj1 && (!qObj1.IsLocked() || _skipPatch)) + { + if (qObj1._gravityVolume != null && qObj1._alignWithGravity) + { + Vector3 toDirection = qObj1.emptySocketObject.transform.position - qObj1._gravityVolume.GetCenterPosition(); + Quaternion lhs = Quaternion.FromToRotation(qObj1.emptySocketObject.transform.up, toDirection); + qObj1.emptySocketObject.transform.rotation = lhs * qObj1.emptySocketObject.transform.rotation; + } + if (qObj1._randomYRotation) + { + float d = Random.Range(0f, 360f); + qObj1.emptySocketObject.transform.localRotation *= Quaternion.Euler(Vector3.up * d); + } + } + + if (_skipPatch) + { + return true; + } + + if (socket.GetVisibilityObject() is SnapshotLockableVisibilityObject qObj) + { + // Do not allow it to switch to a socket that is photographed + // Instead try to swap with an occupied socket + if (qObj.IsLockedByProbeSnapshot()) + { + _skipPatch = true; + // Try to swap + var swapSocket = __instance._socketList.FirstOrDefault(x => x._quantumObject != null && x._quantumObject != __instance && !x._quantumObject.IsLocked()); + if (swapSocket != null) + { + var originalSocket = __instance.GetCurrentSocket(); + var otherQObj = swapSocket._quantumObject as SocketedQuantumObject; + otherQObj.MoveToSocket(socket); + __instance.MoveToSocket(swapSocket); + otherQObj.MoveToSocket(originalSocket); + } + else + { + __instance.MoveToSocket(__instance.GetCurrentSocket()); + } + + _skipPatch = false; + return false; + } + } + + return true; + } +} diff --git a/NewHorizons/External/Configs/PlanetConfig.cs b/NewHorizons/External/Configs/PlanetConfig.cs index 6119e1a6c..c5ef092cc 100644 --- a/NewHorizons/External/Configs/PlanetConfig.cs +++ b/NewHorizons/External/Configs/PlanetConfig.cs @@ -52,6 +52,13 @@ public class PlanetConfig /// public bool destroy; + /// + /// Do we track the position of this body when calculating the solar system radius? + /// `true` if you want the map zoom speed, map panning distance/speed, map camera farclip plane, + /// and autopilot-returning-to-solar-system to adjust to this planet's orbit + /// + [DefaultValue(true)] public bool trackForSolarSystemRadius = true; + /// /// A list of paths to child GameObjects to destroy on this planet /// @@ -234,59 +241,19 @@ public void Validate() if (Bramble?.dimension != null) canShowOnTitle = false; if (Orbit?.staticPosition != null) Orbit.isStatic = true; - // For each quantum group, verify the following: - // this group's id should be unique - // if type == sockets, group.sockets should not be null or empty - // if type == sockets, count every prop that references this group. the number should be < group.sockets.Count - // if type == sockets, for each socket, if rotation == null, rotation = Vector3.zero - // if type == sockets, for each socket, position must not be null - // For each detail prop, - // if detail.quantumGroupID != null, there exists a quantum group with that id - if (Props?.quantumGroups != null && Props?.details != null) - { - Dictionary existingGroups = new Dictionary(); - foreach (var quantumGroup in Props.quantumGroups) - { - if (existingGroups.ContainsKey(quantumGroup.id)) { NHLogger.LogWarning($"Duplicate quantumGroup id found: {quantumGroup.id}"); quantumGroup.type = QuantumGroupType.FailedValidation; } - - existingGroups[quantumGroup.id] = quantumGroup; - if (quantumGroup.type == QuantumGroupType.Sockets) - { - if (quantumGroup.sockets?.Length == 0) { NHLogger.LogError($"quantumGroup {quantumGroup.id} is of type \"sockets\" but has no defined sockets."); quantumGroup.type = QuantumGroupType.FailedValidation; } - else - { - foreach (var socket in quantumGroup.sockets) - { - if (socket.rotation == null) socket.rotation = UnityEngine.Vector3.zero; - if (socket.position == null) { NHLogger.LogError($"quantumGroup {quantumGroup.id} has a socket without a position."); quantumGroup.type = QuantumGroupType.FailedValidation; } - } - } - } - } - - var existingGroupsPropCounts = new Dictionary(); - foreach (var prop in Props?.details) - { - if (prop.quantumGroupID == null) continue; - if (!existingGroups.ContainsKey(prop.quantumGroupID)) NHLogger.LogWarning($"A prop wants to be a part of quantum group {prop.quantumGroupID}, but this group does not exist."); - else existingGroupsPropCounts[prop.quantumGroupID] = existingGroupsPropCounts.GetValueOrDefault(prop.quantumGroupID) + 1; - } - - foreach (var quantumGroup in Props.quantumGroups) - { - if (quantumGroup.type == QuantumGroupType.Sockets && existingGroupsPropCounts.GetValueOrDefault(quantumGroup.id) >= quantumGroup.sockets?.Length) - { - NHLogger.LogError($"quantumGroup {quantumGroup.id} is of type \"sockets\" and has more props than sockets."); - quantumGroup.type = QuantumGroupType.FailedValidation; - } - } - } - // Stars and focal points shouldnt be destroyed by stars if (Star != null || FocalPoint != null) Base.hasFluidDetector = false; // Disable map marker for dream dimensions if (Dream != null && Dream.inDreamWorld) MapMarker.enabled = false; + + // User error #983 + // This will not catch if they wrote the two names slightly differently but oh well don't be stupid + // Ideally we should just check for loops in PlanetGraph + if (Orbit.primaryBody == name && !string.IsNullOrEmpty(Orbit.primaryBody)) + { + throw new Exception($"You set {name} to orbit itself, that is invalid. The planet will not load."); + } } public void Migrate() @@ -690,6 +657,83 @@ public void Migrate() { Base.hasFluidDetector = false; } + + // OLD QUANTUM VALIDATION + // For each quantum group, verify the following: + // this group's id should be unique + // if type == sockets, group.sockets should not be null or empty + // if type == sockets, count every prop that references this group. the number should be < group.sockets.Count + // if type == sockets, for each socket, if rotation == null, rotation = Vector3.zero + // if type == sockets, for each socket, position must not be null + // For each detail prop, + // if detail.quantumGroupID != null, there exists a quantum group with that id + if (Props?.quantumGroups != null && Props?.details != null) + { + Dictionary existingGroups = new Dictionary(); + foreach (var quantumGroup in Props.quantumGroups) + { + if (existingGroups.ContainsKey(quantumGroup.id)) { NHLogger.LogWarning($"Duplicate quantumGroup id found: {quantumGroup.id}"); quantumGroup.type = QuantumGroupType.FailedValidation; } + + existingGroups[quantumGroup.id] = quantumGroup; + if (quantumGroup.type == QuantumGroupType.Sockets) + { + if (quantumGroup.sockets?.Length == 0) { NHLogger.LogError($"quantumGroup {quantumGroup.id} is of type \"sockets\" but has no defined sockets."); quantumGroup.type = QuantumGroupType.FailedValidation; } + else + { + foreach (var socket in quantumGroup.sockets) + { + if (socket.rotation == null) socket.rotation = UnityEngine.Vector3.zero; + if (socket.position == null) { NHLogger.LogError($"quantumGroup {quantumGroup.id} has a socket without a position."); quantumGroup.type = QuantumGroupType.FailedValidation; } + } + } + } + } + + var existingGroupsPropCounts = new Dictionary(); + foreach (var prop in Props?.details) + { + if (prop.quantumGroupID == null) continue; + if (!existingGroups.ContainsKey(prop.quantumGroupID)) NHLogger.LogWarning($"A prop wants to be a part of quantum group {prop.quantumGroupID}, but this group does not exist."); + else existingGroupsPropCounts[prop.quantumGroupID] = existingGroupsPropCounts.GetValueOrDefault(prop.quantumGroupID) + 1; + } + + foreach (var quantumGroup in Props.quantumGroups) + { + if (quantumGroup.type == QuantumGroupType.Sockets && existingGroupsPropCounts.GetValueOrDefault(quantumGroup.id) > quantumGroup.sockets?.Length) + { + NHLogger.LogError($"quantumGroup {quantumGroup.id} is of type \"sockets\" and has more props than sockets."); + quantumGroup.type = QuantumGroupType.FailedValidation; + } + } + } + + if (Props != null && Props.quantumGroups != null) + { + var socketQuantumGroups = Props.quantumGroups.Where(x => x.type == QuantumGroupType.Sockets).Select(x => new SocketQuantumGroupInfo() + { + rename = "Quantum Sockets - " + x.id, + sockets = x.sockets, + details = Props.details.Where(y => y.quantumGroupID == x.id).Select(x => new QuantumDetailInfo(x)).ToArray() + }); + if (socketQuantumGroups.Any()) + { + Props.socketQuantumGroups = socketQuantumGroups.ToArray(); + } + var stateQuantumGroups = Props.quantumGroups.Where(x => x.type == QuantumGroupType.States).Select(x => new StateQuantumGroupInfo() + { + rename = "Quantum States - " + x.id, + hasEmptyState = x.hasEmptyState, + loop = x.loop, + sequential = x.sequential, + details = Props.details.Where(y => y.quantumGroupID == x.id).Select(x => new QuantumDetailInfo(x)).ToArray() + }); + if (stateQuantumGroups.Any()) + { + Props.stateQuantumGroups = stateQuantumGroups.ToArray(); + } + + Props.details = Props.details.Where(x => string.IsNullOrEmpty(x.quantumGroupID)).ToArray(); + } } #endregion } diff --git a/NewHorizons/External/Configs/StarSystemConfig.cs b/NewHorizons/External/Configs/StarSystemConfig.cs index 4440c5d5f..08d0d9687 100644 --- a/NewHorizons/External/Configs/StarSystemConfig.cs +++ b/NewHorizons/External/Configs/StarSystemConfig.cs @@ -21,6 +21,12 @@ public class StarSystemConfig /// public string name; + /// + /// When changing star systems are you allowed to bring items into this system? + /// + [DefaultValue(true)] + public bool allowOutsideItems = true; + /// /// In this system should the player be able to rotate their map camera freely or be stuck above the plane of the solar system? /// diff --git a/NewHorizons/External/Modules/AsteroidBeltModule.cs b/NewHorizons/External/Modules/AsteroidBeltModule.cs index 29588801b..d042a9fc0 100644 --- a/NewHorizons/External/Modules/AsteroidBeltModule.cs +++ b/NewHorizons/External/Modules/AsteroidBeltModule.cs @@ -1,4 +1,4 @@ -using System.ComponentModel; +using System.ComponentModel; using System.ComponentModel.DataAnnotations; using Newtonsoft.Json; @@ -13,7 +13,7 @@ public class AsteroidBeltModule [Range(-1, 200)] [DefaultValue(-1)] public int amount = -1; /// - /// Angle between the rings and the equatorial plane of the planet. + /// Angle between the belt and the equatorial plane of the planet. /// public float inclination; @@ -23,7 +23,7 @@ public class AsteroidBeltModule [Range(0f, double.MaxValue)] public float innerRadius; /// - /// Angle defining the point where the rings rise up from the planet's equatorial plane if inclination is nonzero. + /// Angle defining the point where the belt rises up from the planet's equatorial plane if inclination is nonzero. /// public float longitudeOfAscendingNode; @@ -45,7 +45,7 @@ public class AsteroidBeltModule [Range(0f, double.MaxValue)] public float outerRadius; /// - /// How the asteroids are generated + /// How the asteroids are generated, unless you supply a detail yourself using "assetBundle" and "path" /// public ProcGenModule procGen; @@ -53,5 +53,30 @@ public class AsteroidBeltModule /// Number used to randomize asteroid positions /// public int randomSeed; + + /// + /// You can use this to load a custom asset or ingame object, instead of using ProcGen. It will be scaled by "minSize" and "maxSize", so ideally it should be near a 1 meter radius. + /// This is a relative filepath to an asset-bundle to load the prefab defined in `path` from. + /// + public string assetBundle; + + /// + /// You can use this to load a custom asset or ingame object, instead of using ProcGen. It will be scaled by "minSize" and "maxSize", so ideally it should be near a 1 meter radius. + /// This is either the path in the scene hierarchy of the item to copy or the path to the object in the supplied asset bundle. + /// + public string path; + + /// + /// Surface gravity of the asteroids. + /// + [Range(0f, double.MaxValue)] + [DefaultValue(1)] + public float gravity = 1f; + + /// + /// Should the detail of the asteroid be randomly oriented, or should it point towards the center. + /// + [DefaultValue(true)] + public bool randomOrientation = true; } } \ No newline at end of file diff --git a/NewHorizons/External/Modules/AtmosphereModule.cs b/NewHorizons/External/Modules/AtmosphereModule.cs index eb31dac2e..5aba48a5e 100644 --- a/NewHorizons/External/Modules/AtmosphereModule.cs +++ b/NewHorizons/External/Modules/AtmosphereModule.cs @@ -61,6 +61,7 @@ public class AtmosphereModule /// /// Relative filepath to the fog color ramp texture, if you put fog. /// x axis is angle to sun (left at midnight, right at noon), y axis is distance to camera (close at bottom, far at top). + /// Optional. If you set fogTint, a default fog ramp will be tinted for you. /// public string fogRampPath; diff --git a/NewHorizons/External/Modules/BaseModule.cs b/NewHorizons/External/Modules/BaseModule.cs index 01ddd0249..f57cb1fc8 100644 --- a/NewHorizons/External/Modules/BaseModule.cs +++ b/NewHorizons/External/Modules/BaseModule.cs @@ -70,6 +70,11 @@ public class BaseModule /// [DefaultValue(0)] public int gravityVolumePriority = 0; + /// + /// Optional. Overrides how far the player must be from the planet for their feet to automatically orient towards the ground. + /// + public int? gravityAlignmentRadiusOverride = null; + /// /// Apply physics to this planet when you bump into it. Will have a spherical collider the size of surfaceSize. /// For custom colliders they have to all be convex and you can leave surface size as 0. diff --git a/NewHorizons/External/Modules/PropModule.cs b/NewHorizons/External/Modules/PropModule.cs index 04662df7d..4a162bd8d 100644 --- a/NewHorizons/External/Modules/PropModule.cs +++ b/NewHorizons/External/Modules/PropModule.cs @@ -54,7 +54,7 @@ public class PropModule public DetailInfo[] proxyDetails; /// - /// Add rafts to this planet + /// Add rafts to this planet (requires Echoes of the Eye DLC) /// public RaftInfo[] rafts; @@ -64,15 +64,10 @@ public class PropModule public ScatterInfo[] scatter; /// - /// Add slideshows (from the DLC) to the planet + /// Add slideshows to the planet (requires Echoes of the Eye DLC) /// public ProjectionInfo[] slideShows; - /// - /// A list of quantum groups that props can be added to. An example of a group would be a list of possible locations for a QuantumSocketedObject. - /// - public QuantumGroupInfo[] quantumGroups; - /// /// Add tornadoes to this planet /// @@ -124,17 +119,60 @@ public class PropModule public ShuttleInfo[] shuttles; /// - /// Add campfires that allow you to enter the dream world/simulation. Must be paired with a dream arrival point, which can be placed on this planet or elsewhere. + /// Add a socket quantum object to a planet. Define the position of multiple "sockets" and multiple objects that jump between sockets. + /// If the number of sockets equals the number of objects, they will shuffle around. + /// + public SocketQuantumGroupInfo[] socketQuantumGroups; + + /// + /// Add a state quantum object to a planet. Switches between displaying different objects in a single place. + /// + public StateQuantumGroupInfo[] stateQuantumGroups; + + /// + /// Add quantum lightning to a planet. When lightning strikes, a different detail object is shown. The lightning will take the first defined position/rotation for all objects. + /// + public LightningQuantumInfo[] lightningQuantumGroups; + + /// + /// Add campfires that allow you to enter the dream world/simulation (requires Echoes of the Eye DLC). Must be paired with a dream arrival point, which can be placed on this planet or elsewhere. /// public DreamCampfireInfo[] dreamCampfires; - + /// - /// Add the points you will arrive at when entering the dream world/simulation from a paired dream campfire, which can be placed on this planet or elsewhere. The planet with the arrival point should be statically positioned to avoid issues with the simulation view materials. + /// Add the points you will arrive at when entering the dream world/simulation from a paired dream campfire (requires Echoes of the Eye DLC). The planet with the arrival point should be statically positioned to avoid issues with the simulation view materials. /// public DreamArrivalPointInfo[] dreamArrivalPoints; + /// + /// Adds dream world grapple totems to this planet (requires Echoes of the Eye DLC). + /// + public GrappleTotemInfo[] grappleTotems; + + /// + /// Adds dream world alarm totems to this planet (requires Echoes of the Eye DLC). + /// + public AlarmTotemInfo[] alarmTotems; + + /// + /// Adds portholes (the windows you can peek through in the Stranger) to this planet (requires Echoes of the Eye DLC). + /// + public PortholeInfo[] portholes; + + /// + /// Adds dream world candles to this planet (requires Echoes of the Eye DLC). + /// + public DreamCandleInfo[] dreamCandles; + + /// + /// Adds dream world projection totems (requires Echoes of the Eye DLC). + /// + public ProjectionTotemInfo[] projectionTotems; + [Obsolete("reveal is deprecated. Use Volumes->revealVolumes instead.")] public RevealVolumeInfo[] reveal; [Obsolete("audioVolumes is deprecated. Use Volumes->audioVolumes instead.")] public AudioVolumeInfo[] audioVolumes; + + [Obsolete("quantumGroups is deprecated. Use stateQuantumGroups or socketQuantumGroups instead.")] public QuantumGroupInfo[] quantumGroups; } } diff --git a/NewHorizons/External/Modules/Props/DetailInfo.cs b/NewHorizons/External/Modules/Props/DetailInfo.cs index 9cc8feb0f..c16ff6b29 100644 --- a/NewHorizons/External/Modules/Props/DetailInfo.cs +++ b/NewHorizons/External/Modules/Props/DetailInfo.cs @@ -48,9 +48,7 @@ public DetailInfo(GeneralPointPropInfo info) /// public MVector3 stretch; - /// - /// If this value is not null, this prop will be quantum. Assign this field to the id of the quantum group it should be a part of. The group it is assigned to determines what kind of quantum object it is - /// + [Obsolete("Use QuantumDetailInfo")] public string quantumGroupID; /// diff --git a/NewHorizons/External/Modules/Props/Dialogue/DialogueInfo.cs b/NewHorizons/External/Modules/Props/Dialogue/DialogueInfo.cs index d33959383..f79db1900 100644 --- a/NewHorizons/External/Modules/Props/Dialogue/DialogueInfo.cs +++ b/NewHorizons/External/Modules/Props/Dialogue/DialogueInfo.cs @@ -28,6 +28,10 @@ public class DialogueInfo : GeneralPointPropInfo /// If it's a Recorder this will also delete the existing dialogue already attached to that prop. /// /// If none of those components are present it will add a FacePlayerWhenTalking component. + /// + /// `pathToAnimController` also makes the dialogue into a child of the anim controller. This can be used with `isRelativeToParent` + /// to position the dialogue on relative to the speaker. If you also provide `parentPath`, that will instead override which object + /// is the parent, but the anim controller will otherwise function as expected. /// public string pathToAnimController; diff --git a/NewHorizons/External/Modules/Props/EchoesOfTheEye/AlarmTotemInfo.cs b/NewHorizons/External/Modules/Props/EchoesOfTheEye/AlarmTotemInfo.cs new file mode 100644 index 000000000..3537b9787 --- /dev/null +++ b/NewHorizons/External/Modules/Props/EchoesOfTheEye/AlarmTotemInfo.cs @@ -0,0 +1,30 @@ +using NewHorizons.External.SerializableData; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NewHorizons.External.Modules.Props.EchoesOfTheEye +{ + [JsonObject] + public class AlarmTotemInfo : GeneralPropInfo + { + /// + /// The maximum distance of the alarm's vision cone. + /// + [DefaultValue(45f)] public float sightDistance = 45; + + /// + /// The width of the alarm's vision cone in degrees. + /// + [DefaultValue(60f)] public float sightAngle = 60f; + + /// + /// Scales the visible vision cone in the simulation view (does not affect the actual vision cone detection). + /// + public MVector3 stretchVisionCone; + } +} diff --git a/NewHorizons/External/Modules/Props/EchoesOfTheEye/DreamCandleInfo.cs b/NewHorizons/External/Modules/Props/EchoesOfTheEye/DreamCandleInfo.cs new file mode 100644 index 000000000..10106fb80 --- /dev/null +++ b/NewHorizons/External/Modules/Props/EchoesOfTheEye/DreamCandleInfo.cs @@ -0,0 +1,24 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NewHorizons.External.Modules.Props.EchoesOfTheEye +{ + [JsonObject] + public class DreamCandleInfo : GeneralPropInfo + { + /// + /// The type of dream candle this is. + /// + [DefaultValue(DreamCandleType.Ground)] public DreamCandleType type = DreamCandleType.Ground; + + /// + /// Whether the candle should start lit or extinguished. + /// + public bool startLit; + } +} diff --git a/NewHorizons/External/Modules/Props/EchoesOfTheEye/DreamCandleType.cs b/NewHorizons/External/Modules/Props/EchoesOfTheEye/DreamCandleType.cs new file mode 100644 index 000000000..07d1f764f --- /dev/null +++ b/NewHorizons/External/Modules/Props/EchoesOfTheEye/DreamCandleType.cs @@ -0,0 +1,33 @@ +using Newtonsoft.Json.Converters; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace NewHorizons.External.Modules.Props.EchoesOfTheEye +{ + [JsonConverter(typeof(StringEnumConverter))] + public enum DreamCandleType + { + [EnumMember(Value = @"ground")] Ground, + + [EnumMember(Value = @"groundSmall")] GroundSmall, + + [EnumMember(Value = @"groundLarge")] GroundLarge, + + [EnumMember(Value = @"groundSingle")] GroundSingle, + + [EnumMember(Value = @"wall")] Wall, + + [EnumMember(Value = @"wallLargeFlame")] WallLargeFlame, + + [EnumMember(Value = @"wallBigWick")] WallBigWick, + + [EnumMember(Value = @"standing")] Standing, + + [EnumMember(Value = @"pile")] Pile, + } +} diff --git a/NewHorizons/External/Modules/Props/EchoesOfTheEye/GrappleTotemInfo.cs b/NewHorizons/External/Modules/Props/EchoesOfTheEye/GrappleTotemInfo.cs new file mode 100644 index 000000000..487e42d69 --- /dev/null +++ b/NewHorizons/External/Modules/Props/EchoesOfTheEye/GrappleTotemInfo.cs @@ -0,0 +1,34 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NewHorizons.External.Modules.Props.EchoesOfTheEye +{ + [JsonObject] + public class GrappleTotemInfo : GeneralPropInfo + { + /// + /// The minimum distance that the player must be from the grapple totem for it to activate. + /// + [DefaultValue(10f)] public float minDistance = 10f; + + /// + /// The distance from the grapple totem that the player will stop at when it activates. + /// + [DefaultValue(4f)] public float arrivalDistance = 4f; + + /// + /// The maximum angle in degrees allowed between the grapple totem's face and the player's lantern in order to activate the totem. + /// + [DefaultValue(45f)] public float maxAngle = 45f; + + /// + /// The maximum distance allowed between the grapple totem's face and the player's lantern in order to activate the totem. + /// + [DefaultValue(29f)] public float maxDistance = 29f; + } +} diff --git a/NewHorizons/External/Modules/Props/EchoesOfTheEye/PortholeInfo.cs b/NewHorizons/External/Modules/Props/EchoesOfTheEye/PortholeInfo.cs new file mode 100644 index 000000000..5f8659d30 --- /dev/null +++ b/NewHorizons/External/Modules/Props/EchoesOfTheEye/PortholeInfo.cs @@ -0,0 +1,35 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NewHorizons.External.Modules.Props.EchoesOfTheEye +{ + [JsonObject] + public class PortholeInfo : GeneralPropInfo + { + /// + /// Fact IDs to reveal when peeking through the porthole. + /// + public string[] revealFacts; + + /// + /// The field of view of the porthole camera. + /// + [DefaultValue(90f)] public float fieldOfView = 90f; + + /// + /// The location of the camera when the player peeks through the porthole. Can be placed on a different planet. + /// + public PortholeTargetInfo target; + } + + [JsonObject] + public class PortholeTargetInfo : GeneralSolarSystemPropInfo + { + + } +} diff --git a/NewHorizons/External/Modules/Props/EchoesOfTheEye/ProjectionInfo.cs b/NewHorizons/External/Modules/Props/EchoesOfTheEye/ProjectionInfo.cs index ba6a98d40..c61ef06b9 100644 --- a/NewHorizons/External/Modules/Props/EchoesOfTheEye/ProjectionInfo.cs +++ b/NewHorizons/External/Modules/Props/EchoesOfTheEye/ProjectionInfo.cs @@ -48,6 +48,16 @@ public enum SlideReelCondition /// public string[] reveals; + /// + /// The dialogue conditions to set after finishing this slide reel. + /// + public string[] conditionsToSet; + + /// + /// The persistent conditions to set after finishing this slide reel. + /// + public string[] persistentConditionsToSet; + /// /// The ship log facts that make the reel play when they are displayed in the computer (by selecting entries or arrows). /// You should probably include facts from `reveals` here. diff --git a/NewHorizons/External/Modules/Props/EchoesOfTheEye/ProjectionTotemInfo.cs b/NewHorizons/External/Modules/Props/EchoesOfTheEye/ProjectionTotemInfo.cs new file mode 100644 index 000000000..0852b7e93 --- /dev/null +++ b/NewHorizons/External/Modules/Props/EchoesOfTheEye/ProjectionTotemInfo.cs @@ -0,0 +1,49 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NewHorizons.External.Modules.Props.EchoesOfTheEye +{ + [JsonObject] + public class ProjectionTotemInfo : GeneralPropInfo + { + /// + /// Whether the totem should start lit or extinguished. + /// + public bool startLit; + + /// + /// Whether the projection totem should be able to extinguished but not be able to be lit again with the artifact. Mainly useful if `startLit` is set to true. + /// + public bool extinguishOnly; + + /// + /// A relative path from this planet to an alarm totem that will be activated or deactivated based on whether this totem is lit. + /// + public string pathToAlarmTotem; + + /// + /// Relative paths from this planet to objects containing dream candles that will be activated or deactivated based on whether this totem is lit. All dream candles in the selected objects will be connected to this totem, so they do not need to be specified individually if a parent object is specified. + /// + public string[] pathsToDreamCandles; + + /// + /// Relative paths from this planet to projection totems that will be deactivated if this totem is extinguished. All projection totems in the selected objects will be connected to this totem, so they do not need to be specified individually if a parent object is specified. + /// + public string[] pathsToProjectionTotems; + + /// + /// Relative paths from this planet to objects that will appear or disappear when this totem is lit or extinguished. Some types of objects and effects are not supported and will remain visible and active. + /// + public string[] pathsToProjectedObjects; + + /// + /// If set, projected objects will be set to fully active or fully disabled instantly instead of smoothly fading lights/renderers/colliders. Use this if the normal behavior is insufficient for the objects you're using. + /// + public bool toggleProjectedObjectsActive; + } +} diff --git a/NewHorizons/External/Modules/Props/Item/ItemSocketInfo.cs b/NewHorizons/External/Modules/Props/Item/ItemSocketInfo.cs index 76ac16f7d..7294fbb08 100644 --- a/NewHorizons/External/Modules/Props/Item/ItemSocketInfo.cs +++ b/NewHorizons/External/Modules/Props/Item/ItemSocketInfo.cs @@ -1,13 +1,5 @@ -using NewHorizons.External.SerializableData; using Newtonsoft.Json; -using Newtonsoft.Json.Converters; -using System; -using System.Collections.Generic; using System.ComponentModel; -using System.Linq; -using System.Runtime.Serialization; -using System.Text; -using System.Threading.Tasks; namespace NewHorizons.External.Modules.Props.Item { @@ -54,5 +46,10 @@ public class ItemSocketInfo : GeneralPropInfo /// A ship log fact to reveal when removing an item from this socket, or when the socket is empty. /// public string removalFact; + /// + /// Default collider radius when interacting with the socket + /// + [DefaultValue(0f)] + public float colliderRadius = 0f; } } diff --git a/NewHorizons/External/Modules/Props/Quantum/BaseQuantumGroupInfo.cs b/NewHorizons/External/Modules/Props/Quantum/BaseQuantumGroupInfo.cs new file mode 100644 index 000000000..1872b11e0 --- /dev/null +++ b/NewHorizons/External/Modules/Props/Quantum/BaseQuantumGroupInfo.cs @@ -0,0 +1,14 @@ +namespace NewHorizons.External.Modules.Props.Quantum; + +public class BaseQuantumGroupInfo +{ + /// + /// Optional name to help identify this group + /// + public string rename; + + /// + /// List of props which will be used in this quantum group + /// + public QuantumDetailInfo[] details; +} diff --git a/NewHorizons/External/Modules/Props/Quantum/LightningQuantumInfo.cs b/NewHorizons/External/Modules/Props/Quantum/LightningQuantumInfo.cs new file mode 100644 index 000000000..3c370dd1b --- /dev/null +++ b/NewHorizons/External/Modules/Props/Quantum/LightningQuantumInfo.cs @@ -0,0 +1,12 @@ +using Newtonsoft.Json; + +namespace NewHorizons.External.Modules.Props.Quantum; + +[JsonObject] +public class LightningQuantumInfo : GeneralPropInfo +{ + /// + /// List of props which will be alternated between during flashes of lightning + /// + public DetailInfo[] details; +} diff --git a/NewHorizons/External/Modules/Props/Quantum/QuantumDetailInfo.cs b/NewHorizons/External/Modules/Props/Quantum/QuantumDetailInfo.cs new file mode 100644 index 000000000..304f1c896 --- /dev/null +++ b/NewHorizons/External/Modules/Props/Quantum/QuantumDetailInfo.cs @@ -0,0 +1,24 @@ +using Newtonsoft.Json; +using System.ComponentModel; + +namespace NewHorizons.External.Modules.Props.Quantum; + +public class QuantumDetailInfo : DetailInfo +{ + public QuantumDetailInfo() { } + + public QuantumDetailInfo(DetailInfo info) + { + JsonConvert.PopulateObject(JsonConvert.SerializeObject(info), this); + } + + /// + /// When used in a quantum socket this object will randomize its rotation around the local Y axis. + /// + [DefaultValue(true)] public bool randomizeYRotation = true; + + /// + /// When used in a quantum socket this object will align to the nearest gravity volume. Else use the rotation of the quantum socket. + /// + [DefaultValue(true)] public bool alignWithGravity = true; +} diff --git a/NewHorizons/External/Modules/Props/Quantum/QuantumGroupInfo.cs b/NewHorizons/External/Modules/Props/Quantum/QuantumGroupInfo.cs index bb76c6e3a..2c056fe32 100644 --- a/NewHorizons/External/Modules/Props/Quantum/QuantumGroupInfo.cs +++ b/NewHorizons/External/Modules/Props/Quantum/QuantumGroupInfo.cs @@ -1,9 +1,11 @@ using Newtonsoft.Json; +using System; using System.ComponentModel; namespace NewHorizons.External.Modules.Props.Quantum { [JsonObject] + [Obsolete] public class QuantumGroupInfo { /// @@ -34,6 +36,6 @@ public class QuantumGroupInfo /// /// Optional. Only used if type is `states` and `sequential` is true. If this is false, then after the last state has appeared, the object will no longer change state /// - [DefaultValue(true)] public bool loop = true; + [DefaultValue(true)] public bool loop = true; } } diff --git a/NewHorizons/External/Modules/Props/Quantum/QuantumGroupType.cs b/NewHorizons/External/Modules/Props/Quantum/QuantumGroupType.cs index 8fb3a78f9..36264cc07 100644 --- a/NewHorizons/External/Modules/Props/Quantum/QuantumGroupType.cs +++ b/NewHorizons/External/Modules/Props/Quantum/QuantumGroupType.cs @@ -1,10 +1,12 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; +using System; using System.Runtime.Serialization; namespace NewHorizons.External.Modules.Props.Quantum { [JsonConverter(typeof(StringEnumConverter))] + [Obsolete] public enum QuantumGroupType { [EnumMember(Value = @"sockets")] Sockets = 0, diff --git a/NewHorizons/External/Modules/Props/Quantum/SocketQuantumGroupInfo.cs b/NewHorizons/External/Modules/Props/Quantum/SocketQuantumGroupInfo.cs new file mode 100644 index 000000000..54475773d --- /dev/null +++ b/NewHorizons/External/Modules/Props/Quantum/SocketQuantumGroupInfo.cs @@ -0,0 +1,9 @@ +using Newtonsoft.Json; + +namespace NewHorizons.External.Modules.Props.Quantum; + +[JsonObject] +public class SocketQuantumGroupInfo : BaseQuantumGroupInfo +{ + public QuantumSocketInfo[] sockets; +} diff --git a/NewHorizons/External/Modules/Props/Quantum/StateQuantumGroupInfo.cs b/NewHorizons/External/Modules/Props/Quantum/StateQuantumGroupInfo.cs new file mode 100644 index 000000000..4be2253b0 --- /dev/null +++ b/NewHorizons/External/Modules/Props/Quantum/StateQuantumGroupInfo.cs @@ -0,0 +1,23 @@ +using Newtonsoft.Json; +using System.ComponentModel; + +namespace NewHorizons.External.Modules.Props.Quantum; + +[JsonObject] +public class StateQuantumGroupInfo : BaseQuantumGroupInfo +{ + /// + /// Optional. If this is true, then the states will be presented in order, rather than in a random order + /// + public bool sequential; + + /// + /// Optional. Only used if `sequential` is true. If this is false, then after the last state has appeared, the object will no longer change state + /// + [DefaultValue(true)] public bool loop = true; + + /// + /// Optional. Only used if type is `states`. If this is true, then the first prop made part of this group will be used to construct a visibility box for an empty game object, which will be considered one of the states. + /// + public bool hasEmptyState; +} diff --git a/NewHorizons/External/Modules/ShipLogModule.cs b/NewHorizons/External/Modules/ShipLogModule.cs index 10828598e..3b9e56154 100644 --- a/NewHorizons/External/Modules/ShipLogModule.cs +++ b/NewHorizons/External/Modules/ShipLogModule.cs @@ -23,7 +23,7 @@ public class ShipLogModule public MapModeInfo mapMode; /// - /// A path to the folder where entry sprites are stored. + /// A path to the folder where entry sprites (.png) are stored. /// public string spriteFolder; @@ -61,7 +61,7 @@ public class MapModeInfo public float offset; /// - /// The path to the sprite to show when the planet is unexplored in map mode. + /// The path to the sprite (.png/.jpg/.exr) to show when the planet is unexplored in map mode. /// public string outlineSprite; @@ -71,7 +71,7 @@ public class MapModeInfo public bool remove; /// - /// The path to the sprite to show when the planet is revealed in map mode. + /// The path to the sprite (.png/.jpg/.exr) to show when the planet is revealed in map mode. /// public string revealedSprite; @@ -79,6 +79,12 @@ public class MapModeInfo /// Scale to apply to the planet in map mode. /// [DefaultValue(1f)] public float scale = 1f; + + /// + /// Can this ship log map mode entry be selected + /// Ex) Set to false for stars with no entries on them so they are skipped in navigation + /// + [DefaultValue(true)] public bool selectable = true; } [JsonObject] @@ -90,7 +96,7 @@ public class ShipLogDetailInfo public bool invisibleWhenHidden; /// - /// The sprite to show when the parent AstroBody is rumored/unexplored. + /// The sprite (.png/.jpg/.exr) to show when the parent AstroBody is rumored/unexplored. /// public string outlineSprite; @@ -100,7 +106,7 @@ public class ShipLogDetailInfo public MVector2 position; /// - /// The sprite to show when the parent AstroBody is revealed. + /// The sprite (.png/.jpg/.exr) to show when the parent AstroBody is revealed. /// public string revealedSprite; diff --git a/NewHorizons/External/NewHorizonBody.cs b/NewHorizons/External/NewHorizonBody.cs index 79fef54d5..2016d8d00 100644 --- a/NewHorizons/External/NewHorizonBody.cs +++ b/NewHorizons/External/NewHorizonBody.cs @@ -16,14 +16,6 @@ public NewHorizonsBody(PlanetConfig config, IModBehaviour mod, string relativePa Config = config; Mod = mod; RelativePath = relativePath; - - // Fall back to file name if name not given - if (!string.IsNullOrEmpty(relativePath) && string.IsNullOrEmpty(config.name)) - { - config.name = Path.GetFileNameWithoutExtension(relativePath); - } - - Migrate(); } public PlanetConfig Config; diff --git a/NewHorizons/External/SerializableData/MVector2.cs b/NewHorizons/External/SerializableData/MVector2.cs index 0e4aadd6d..5ab032485 100644 --- a/NewHorizons/External/SerializableData/MVector2.cs +++ b/NewHorizons/External/SerializableData/MVector2.cs @@ -1,6 +1,5 @@ #region -using NewHorizons.Utility.DebugTools.Menu; using NewHorizons.Utility.OWML; using Newtonsoft.Json; using System; diff --git a/NewHorizons/External/SerializableData/MVector3.cs b/NewHorizons/External/SerializableData/MVector3.cs index 33100bc13..f61cb87bf 100644 --- a/NewHorizons/External/SerializableData/MVector3.cs +++ b/NewHorizons/External/SerializableData/MVector3.cs @@ -27,6 +27,8 @@ public static implicit operator Vector3(MVector3 vec) return new Vector3(vec.x, vec.y, vec.z); } + public float Length() => Mathf.Sqrt(x * x + y * y + z * z); + public override string ToString() => $"{x}, {y}, {z}"; } } diff --git a/NewHorizons/External/SerializableEnums/NHDeathType.cs b/NewHorizons/External/SerializableEnums/NHDeathType.cs index d01b9beb2..f683e0ec4 100644 --- a/NewHorizons/External/SerializableEnums/NHDeathType.cs +++ b/NewHorizons/External/SerializableEnums/NHDeathType.cs @@ -4,6 +4,27 @@ namespace NewHorizons.External.SerializableEnums { + /// + /// Some special death types are: + /// + /// Supernova: Special death type used when the supernova hits you. You will not wake up if in the Dreamworld. + /// + /// Digestion: Death type used by anglerfish (and cut-content ghosts and water monster) + /// + /// Big bang: Special death type used at the end of the game + /// + /// Meditation: Special death type used when skipping to the next loop. You will not wake up if in the Dreamworld. + /// + /// Timeloop: Special death type used when the time loop ends. You will not wake up if in the Dreamworld. + /// + /// Blackhole: Special death type used by the ATP blackhole (and custom NH blackholes without whitehole destinations) + /// + /// Dream: Special DLC death type used to kill a player in the real world while in the Dreamworld (i.e., you will loop not wake up) + /// + /// DreamExplosion: Special DLC death type used by the prototype artifact to kill a player in the real world while in the Dreamworld (i.e., you will loop not wake up) + /// + /// CrushedByElevator: Similar to the Crushed death type, but much faster + /// [JsonConverter(typeof(StringEnumConverter))] public enum NHDeathType { diff --git a/NewHorizons/Handlers/DreamHandler.cs b/NewHorizons/Handlers/DreamHandler.cs index d96e6457e..9098170d5 100644 --- a/NewHorizons/Handlers/DreamHandler.cs +++ b/NewHorizons/Handlers/DreamHandler.cs @@ -2,10 +2,6 @@ using NewHorizons.Utility.OWML; using OWML.Utils; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using UnityEngine; namespace NewHorizons.Handlers @@ -32,57 +28,5 @@ public static DreamArrivalPoint.Location GetDreamArrivalLocation(string id) return DreamArrivalPoint.Location.Undefined; } } - - public static void MigrateDreamWorldController() - { - // Create new DreamWorldController instance since the existing one is disabled - var managerObj = new GameObject("DreamWorldManager"); - managerObj.SetActive(false); - var oldDWC = Locator.GetDreamWorldController(); - var dwc = managerObj.AddComponent(); - - var simRootObj = MigrateCopy(oldDWC._primarySimulationRoot.gameObject, managerObj); - - dwc._primarySimulationRoot = simRootObj.transform; - dwc._simulationRoots = new Transform[] { simRootObj.transform }; - dwc._simulationCamera = simRootObj.FindChild("Camera_Simulation").GetComponent(); - dwc._simulationSphere = simRootObj.FindChild("SimulationSphere").GetComponent(); - - dwc._tempSkyboxColor = oldDWC._tempSkyboxColor; - dwc._sarcophagusController = oldDWC._sarcophagusController; - dwc._prisonerDirector = oldDWC._prisonerDirector; - - // These should correspond to the arrival point's attached body - dwc._dreamBody = null; - dwc._dreamWorldSector = null; - dwc._dreamWorldVolume = null; - - // These should correspond to the campfire's attached body - dwc._planetBody = null; - dwc._ringWorldController = null; - - managerObj.SetActive(true); - - // Run after Start() completes - Delay.FireOnNextUpdate(() => - { - dwc._dreamBody = null; - dwc._dreamWorldSector = null; - dwc._dreamWorldVolume = null; - dwc._planetBody = null; - dwc._ringWorldController = null; - - // Dreamworld has a giant plane for simulation water, we don't want that in our custom world - dwc._primarySimulationRoot.Find("water_simulation").gameObject.SetActive(false); - }); - - } - - private static GameObject MigrateCopy(GameObject go, GameObject newParent) - { - var clone = GameObject.Instantiate(go); - clone.transform.SetParent(newParent.transform, false); - return clone; - } } } diff --git a/NewHorizons/Handlers/HeldItemHandler.cs b/NewHorizons/Handlers/HeldItemHandler.cs index d6e05c264..5ff7e5bbc 100644 --- a/NewHorizons/Handlers/HeldItemHandler.cs +++ b/NewHorizons/Handlers/HeldItemHandler.cs @@ -5,7 +5,6 @@ using NewHorizons.Utility.OWML; using System; using System.Collections.Generic; -using System.IO; using UnityEngine; namespace NewHorizons.Handlers; @@ -50,11 +49,11 @@ private static void Init() _isInitialized = true; Main.Instance.OnChangeStarSystem.AddListener(OnStarSystemChanging); Main.Instance.OnStarSystemLoaded.AddListener(OnSystemReady); - GlobalMessenger.AddListener("PlayerDeath", OnPlayerDeath); + GlobalMessenger.AddListener("DeathSequenceComplete", OnDeathSequenceComplete); } } - private static void OnPlayerDeath(DeathType _) + private static void OnDeathSequenceComplete() { NHLogger.Log("Player died, resetting held items"); @@ -90,8 +89,15 @@ private static void TrackPath(string path) _pathOfItemTakenFromSystem[Main.Instance.CurrentStarSystem].Add(path); } - private static void OnStarSystemChanging(string _) + private static void OnStarSystemChanging(string newSystem) { + // Double check we're still holding it + _currentlyHeldItem = Locator.GetToolModeSwapper().GetItemCarryTool().GetHeldItem()?.gameObject; + if (!Main.SystemDict[newSystem].Config.allowOutsideItems) + { + _currentlyHeldItem = null; + } + if (_currentlyHeldItem != null) { // Track it so that when we return to this system we can delete the original diff --git a/NewHorizons/Handlers/PlanetCreationHandler.cs b/NewHorizons/Handlers/PlanetCreationHandler.cs index 0c46ca26e..a0fba39a9 100644 --- a/NewHorizons/Handlers/PlanetCreationHandler.cs +++ b/NewHorizons/Handlers/PlanetCreationHandler.cs @@ -1,4 +1,3 @@ -using Epic.OnlineServices; using NewHorizons.Builder.Atmosphere; using NewHorizons.Builder.Body; using NewHorizons.Builder.General; @@ -240,6 +239,7 @@ public static bool LoadBody(NewHorizonsBody body, bool defaultPrimaryToSun = fal var rb = existingPlanet.GetComponent(); var sector = SectorBuilder.Make(existingPlanet, rb, GetSphereOfInfluence(body)); + sector._idString = body.Config.name; sector.name = $"Sector-{existingPlanet.GetComponentsInChildren().Count()}"; SharedGenerateBody(body, existingPlanet, sector, rb); @@ -399,6 +399,7 @@ public static GameObject GenerateBrambleDimensionBody(NewHorizonsBody body) var ao = AstroObjectBuilder.Make(go, null, body, false); var sector = SectorBuilder.Make(go, owRigidBody, sphereOfInfluence); + sector._idString = body.Config.name; ao._rootSector = sector; ao._type = AstroObject.Type.None; @@ -417,7 +418,7 @@ public static GameObject GenerateBrambleDimensionBody(NewHorizonsBody body) AstroObjectLocator.RegisterCustomAstroObject(ao); // Now that we're done move the planet into place - SetPositionFromVector(go, body.Config.Orbit.staticPosition); + SetPositionFromVector(go, body.Config.Orbit.staticPosition, body.Config.trackForSolarSystemRadius); NHLogger.LogVerbose($"Finished creating Bramble Dimension [{body.Config.name}]"); @@ -475,6 +476,7 @@ public static GameObject GenerateStandardBody(NewHorizonsBody body, bool default var ao = AstroObjectBuilder.Make(go, primaryBody, body, false); var sector = SectorBuilder.Make(go, owRigidBody, sphereOfInfluence * 2f); + sector._idString = body.Config.name; ao._rootSector = sector; if (body.Config.Base.surfaceGravity != 0) @@ -504,23 +506,16 @@ public static GameObject GenerateStandardBody(NewHorizonsBody body, bool default // Now that we're done move the planet into place if (body.Config.Orbit?.staticPosition != null) { - SetPositionFromVector(go, body.Config.Orbit.staticPosition); + SetPositionFromVector(go, body.Config.Orbit.staticPosition, body.Config.trackForSolarSystemRadius); } else { - UpdatePosition(go, body.Config.Orbit, primaryBody, ao); + UpdatePosition(go, body.Config.Orbit, primaryBody, ao, body.Config.trackForSolarSystemRadius); } // Have to do this after setting position var initialMotion = InitialMotionBuilder.Make(go, primaryBody, ao, owRigidBody, body.Config.Orbit); - // Spawning on other planets is a bit hacky so we do it last - if (body.Config.Spawn != null) - { - NHLogger.LogVerbose($"Making spawn point on {body.Config.name}"); - var spawnPoint = SpawnPointBuilder.Make(go, body.Config.Spawn, owRigidBody); - } - if (body.Config.Orbit.showOrbitLine && !body.Config.Orbit.isStatic) { OrbitlineBuilder.Make(body.Object, body.Config.Orbit.isMoon, body.Config); @@ -607,6 +602,7 @@ private static GameObject SharedGenerateBody(NewHorizonsBody body, GameObject go var remnant = Main.BodyDict[body.Config.starSystem].Where(x => x.Config.name == body.Config.name && x.Config.isStellarRemnant).FirstOrDefault(); var remnantSector = SectorBuilder.Make(go, rb, sphereOfInfluence); + remnantSector._idString = body.Config.name; remnantSector.name = "CustomStellarRemnant"; SharedGenerateBody(remnant, go, remnantSector, rb); @@ -750,6 +746,12 @@ private static GameObject SharedGenerateBody(NewHorizonsBody body, GameObject go SupernovaEffectBuilder.Make(go, sector, body.Config, body.Mod, procGen, ambientLight, fog, atmosphere, null, fog?._fogImpostor); } + if (body.Config.Spawn != null) + { + NHLogger.LogVerbose($"Making spawn point on {body.Config.name}"); + SpawnPointBuilder.Make(go, body.Config.Spawn, rb); + } + SplashColourizer.Make(go, body.Config, sphereOfInfluence); // We allow removing children afterwards so you can also take bits off of the modules you used @@ -854,6 +856,8 @@ public static void UpdateBodyOrbit(NewHorizonsBody body, GameObject go) // Get ready to move all the satellites var relativeMoonPositions = children.Select(x => x.transform.position - go.transform.position).ToArray(); + var relativeMoonMoonPositions = children.Select(x => AstroObjectLocator.GetChildren(x.GetComponent()) + .Select(childchild => (childchild?.transform?.position ?? Vector3.zero) - go.transform.position)).ToArray(); // If its tidally locked change the alignment var alignment = go.GetComponent(); @@ -863,7 +867,7 @@ public static void UpdateBodyOrbit(NewHorizonsBody body, GameObject go) } // Move the primary - UpdatePosition(go, body.Config.Orbit, primary, newAO); + UpdatePosition(go, body.Config.Orbit, primary, newAO, body.Config.trackForSolarSystemRadius); for (int i = 0; i < children.Count(); i++) { @@ -880,11 +884,15 @@ public static void UpdateBodyOrbit(NewHorizonsBody body, GameObject go) } else { + var j = 0; foreach (var childChild in AstroObjectLocator.GetChildren(childAO)) { - if (childChild == null) continue; - var dPos = childChild.transform.position - child.transform.position; - childChild.transform.position = go.transform.position + relativeMoonPositions[i] + dPos; + if (childChild != null) + { + var dPos = relativeMoonMoonPositions[i].ElementAt(j); + childChild.transform.position = go.transform.position + dPos; + } + j++; } // Make sure the moons get updated to the new AO childAO._primaryBody = newAO; @@ -912,6 +920,12 @@ public static void UpdateBodyOrbit(NewHorizonsBody body, GameObject go) } public static void UpdatePosition(GameObject go, IOrbitalParameters orbit, AstroObject primaryBody, AstroObject secondaryBody) + { + // Keeping old method signature because its the kind of method I think something somewhere might call + UpdatePosition(go, orbit, primaryBody, secondaryBody, true); + } + + public static void UpdatePosition(GameObject go, IOrbitalParameters orbit, AstroObject primaryBody, AstroObject secondaryBody, bool trackForSolarSystemRadius) { NHLogger.LogVerbose($"Placing [{secondaryBody?.name}] around [{primaryBody?.name}]"); @@ -921,15 +935,15 @@ public static void UpdatePosition(GameObject go, IOrbitalParameters orbit, Astro var secondaryGravity = new Gravity(secondaryBody.GetGravityVolume()); var pos = orbit.GetOrbitalParameters(primaryGravity, secondaryGravity).InitialPosition + primaryBody.transform.position; - SetPositionFromVector(go, pos); + SetPositionFromVector(go, pos, trackForSolarSystemRadius); } else { - SetPositionFromVector(go, Vector3.zero); + SetPositionFromVector(go, Vector3.zero, trackForSolarSystemRadius); } } - public static void SetPositionFromVector(GameObject go, Vector3 position) + public static void SetPositionFromVector(GameObject go, Vector3 position, bool trackForSolarSystemRadius) { var rb = go.GetAttachedOWRigidbody(); if (rb) @@ -961,7 +975,7 @@ public static void SetPositionFromVector(GameObject go, Vector3 position) // Uses the ratio of the interlopers furthest point to what the base game considers the edge of the solar system var distanceToCenter = go.transform.position.magnitude / (24000 / 30000f); - if (distanceToCenter > SolarSystemRadius) + if (distanceToCenter > SolarSystemRadius && trackForSolarSystemRadius) { SolarSystemRadius = distanceToCenter; } diff --git a/NewHorizons/Handlers/PlanetDestructionHandler.cs b/NewHorizons/Handlers/PlanetDestructionHandler.cs index 65152541b..01b5fabe0 100644 --- a/NewHorizons/Handlers/PlanetDestructionHandler.cs +++ b/NewHorizons/Handlers/PlanetDestructionHandler.cs @@ -93,7 +93,13 @@ public static void StrangerRemoved() private static void DreamWorldRemoved() { - DreamHandler.MigrateDreamWorldController(); + // No you didn't + // Needs to stay alive so that custom Dreamworlds can use its Dreamworld controller + // We had a separate dreamworld controller solution before, but that broke Eyes of the Past somehow + Locator.GetAstroObject(AstroObject.Name.DreamWorld).gameObject.SetActive(true); + // We thought of disabling the children for consistency: However this broke the tronworld for some reason + // Basically, leaving the real Dreamworld in is fine since as long as you don't place your own custom dreamworld on top + // of it, you'll never have it appear when you dont want it to } private static void SunRemoved() diff --git a/NewHorizons/Handlers/VesselWarpHandler.cs b/NewHorizons/Handlers/VesselWarpHandler.cs index bac8fdf70..5cf611e56 100644 --- a/NewHorizons/Handlers/VesselWarpHandler.cs +++ b/NewHorizons/Handlers/VesselWarpHandler.cs @@ -7,6 +7,7 @@ using NewHorizons.Utility.OWML; using UnityEngine; using static NewHorizons.Main; +using static NewHorizons.Utility.Files.AssetBundleUtilities; namespace NewHorizons.Handlers { @@ -248,7 +249,8 @@ public static VesselSpawnPoint CreateVessel() var power = vesselWarpController.transform.Find("PowerSwitchInterface"); var orb = power.GetComponentInChildren(true); - Delay.FireOnNextUpdate(() => SetupWarpController(vesselWarpController, orb)); + // Run after Start (when pillar is lowered immediately) and then skip 100 frames so that the weird orb rising thing doesn't happen #958 + Delay.RunWhenAndInNUpdates(() => SetupWarpController(vesselWarpController, orb), () => !vesselWarpController._coordinateInterface._pillarRaised, 100); return spawnPoint; } @@ -290,7 +292,8 @@ public static VesselSpawnPoint UpdateVessel() var power = vesselWarpController.transform.Find("PowerSwitchInterface"); var orb = power.GetComponentInChildren(true); - Delay.FireOnNextUpdate(() => SetupWarpController(vesselWarpController, orb, true)); + // Run after Start (when pillar is lowered immediately) and then skip 100 frames so that the weird orb rising thing doesn't happen #958 + Delay.RunWhenAndInNUpdates(() => SetupWarpController(vesselWarpController, orb, true), () => !vesselWarpController._coordinateInterface._pillarRaised, 100); return vesselSpawnPoint; } @@ -355,7 +358,7 @@ public static void SetupWarpController(VesselWarpController vesselWarpController orb.SetOrbPosition(vesselWarpController._coordinatePowerSlot.transform.position); orb._occupiedSlot = vesselWarpController._coordinatePowerSlot; orb._enterSlotTime = Time.time; - Delay.RunWhen(() => !vesselWarpController._coordinateInterface._pillarRaised, () => vesselWarpController.OnSlotActivated(vesselWarpController._coordinatePowerSlot)); + vesselWarpController.OnSlotActivated(vesselWarpController._coordinatePowerSlot); vesselWarpController._coordinateCable.SetPowered(true); vesselWarpController._cageClosed = true; if (vesselWarpController._cageAnimator != null) diff --git a/NewHorizons/INewHorizons.cs b/NewHorizons/INewHorizons.cs index 12002b1ea..350d0e2be 100644 --- a/NewHorizons/INewHorizons.cs +++ b/NewHorizons/INewHorizons.cs @@ -146,7 +146,8 @@ AudioSignal SpawnSignal(IModBehaviour mod, GameObject root, string audio, string void DefineStarSystem(string name, string config, IModBehaviour mod); /// - /// Allows creation of dialogue by directly passing the xml and dialogueInfo json contents as strings + /// Allows creation of dialogue by directly passing the xml and dialogueInfo json contents as strings. + /// Must be called at least 2 frames before entering dialogue if you're using ReuseDialogueOptionsFrom /// /// TextAsset name used for compatibility with voice mod. Just has to be a unique identifier. /// The contents of the dialogue xml file as a string diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 418273100..c964744f0 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -20,7 +20,6 @@ using NewHorizons.Streaming; using NewHorizons.Utility; using NewHorizons.Utility.DebugTools; -using NewHorizons.Utility.DebugTools.Menu; using NewHorizons.Utility.Files; using NewHorizons.Utility.OuterWilds; using NewHorizons.Utility.OWML; @@ -41,12 +40,11 @@ namespace NewHorizons public class Main : ModBehaviour { - public static AssetBundle NHAssetBundle { get; private set; } - public static AssetBundle NHPrivateAssetBundle { get; private set; } public static Main Instance { get; private set; } // Settings public static bool Debug { get; private set; } + public static bool VisualizeQuantumObjects { get; private set; } public static bool VerboseLogs { get; private set; } public static bool SequentialPreCaching { get; private set; } public static bool CustomTitleScreen { get; private set; } @@ -134,13 +132,13 @@ public override void Configure(IModConfig config) var currentScene = SceneManager.GetActiveScene().name; Debug = config.GetSettingsValue(nameof(Debug)); + VisualizeQuantumObjects = config.GetSettingsValue(nameof(VisualizeQuantumObjects)); VerboseLogs = config.GetSettingsValue(nameof(VerboseLogs)); SequentialPreCaching = config.GetSettingsValue(nameof(SequentialPreCaching)); if (currentScene == "SolarSystem") { DebugReload.UpdateReloadButton(); - DebugMenu.UpdatePauseMenuButton(); } if (VerboseLogs) NHLogger.UpdateLogLevel(NHLogger.LogType.Verbose); @@ -244,18 +242,6 @@ public void Start() GlobalMessenger.AddListener("PlayerDeath", OnDeath); GlobalMessenger.AddListener("WakeUp", OnWakeUp); - NHAssetBundle = ModHelper.Assets.LoadBundle("Assets/newhorizons_public"); - if (NHAssetBundle == null) - { - NHLogger.LogError("Couldn't find NHAssetBundle: The mod will likely not work."); - } - - NHPrivateAssetBundle = ModHelper.Assets.LoadBundle("Assets/newhorizons_private"); - if (NHPrivateAssetBundle == null) - { - NHLogger.LogError("Couldn't find NHPrivateAssetBundle: The mod will likely not work."); - } - VesselWarpHandler.Initialize(); ResetConfigs(resetTranslation: false); @@ -289,7 +275,6 @@ public override void SetupPauseMenu(IPauseMenuManager pauseMenu) { base.SetupPauseMenu(pauseMenu); DebugReload.InitializePauseMenu(pauseMenu); - DebugMenu.InitializePauseMenu(pauseMenu); } public void OnDestroy() @@ -620,8 +605,6 @@ private void OnSystemReady(bool shouldWarpInFromShip, bool shouldWarpInFromVesse } Locator.GetPlayerBody().gameObject.AddComponent(); - Locator.GetPlayerBody().gameObject.AddComponent(); - Locator.GetPlayerBody().gameObject.AddComponent(); Locator.GetPlayerBody().gameObject.AddComponent(); if (HasDLC) Locator.GetPlayerBody().gameObject.AddComponent(); @@ -922,6 +905,12 @@ public NewHorizonsBody RegisterPlanetConfig(PlanetConfig config, IModBehaviour m BodyDict.Add(config.starSystem, new List()); } + // Fall back to file name if name not given + if (!string.IsNullOrEmpty(relativePath) && string.IsNullOrEmpty(config.name)) + { + config.name = Path.GetFileNameWithoutExtension(relativePath); + } + // Has to happen after we make sure theres a system config config.Validate(); config.Migrate(); diff --git a/NewHorizons/Patches/EchoesOfTheEyePatches/AlarmTotemPatches.cs b/NewHorizons/Patches/EchoesOfTheEyePatches/AlarmTotemPatches.cs new file mode 100644 index 000000000..5ec80d5d2 --- /dev/null +++ b/NewHorizons/Patches/EchoesOfTheEyePatches/AlarmTotemPatches.cs @@ -0,0 +1,21 @@ +using HarmonyLib; +using NewHorizons.Components.EOTE; +using System.Collections.Generic; +using System.Reflection.Emit; +using UnityEngine; + +namespace NewHorizons.Patches.EchoesOfTheEyePatches +{ + [HarmonyPatch(typeof(AlarmTotem))] + public static class AlarmTotemPatches + { + [HarmonyPostfix] + [HarmonyPatch(nameof(AlarmTotem.SetFaceOpen))] + public static void AlarmTotem_SetFaceOpen(AlarmTotem __instance, bool open) + { + // This method is unused in the base game and sets the rotations incorrectly (-90f instead of 90f); this corrects that + __instance._rightFaceCover.localEulerAngles = Vector3.up * (open ? 90f : 0f); + __instance._leftFaceCover.localEulerAngles = Vector3.up * (open ? -90f : 0f); + } + } +} diff --git a/NewHorizons/Patches/EchoesOfTheEyePatches/DreamworldControllerPatches.cs b/NewHorizons/Patches/EchoesOfTheEyePatches/DreamworldControllerPatches.cs index ded7f3d5e..3d37b4b2c 100644 --- a/NewHorizons/Patches/EchoesOfTheEyePatches/DreamworldControllerPatches.cs +++ b/NewHorizons/Patches/EchoesOfTheEyePatches/DreamworldControllerPatches.cs @@ -75,8 +75,7 @@ public static bool DreamWorldController_EnterDreamWorld(DreamWorldController __i } else { - var departureAO = dreamCampfire.GetComponentInParent(); - __instance._planetBody = departureAO.GetAttachedOWRigidbody(); + __instance._planetBody = dreamCampfire.GetAttachedOWRigidbody(); __instance._ringWorldController = null; } diff --git a/NewHorizons/Patches/EchoesOfTheEyePatches/LanternZoomPointPatches.cs b/NewHorizons/Patches/EchoesOfTheEyePatches/LanternZoomPointPatches.cs new file mode 100644 index 000000000..38503ef4c --- /dev/null +++ b/NewHorizons/Patches/EchoesOfTheEyePatches/LanternZoomPointPatches.cs @@ -0,0 +1,117 @@ +using HarmonyLib; +using NewHorizons.Components.EOTE; +using System.Collections.Generic; +using System.Reflection.Emit; +using UnityEngine; + +namespace NewHorizons.Patches.EchoesOfTheEyePatches +{ + [HarmonyPatch(typeof(LanternZoomPoint))] + public static class LanternZoomPointPatches + { + // Patching all methods that assume the player is holding an artifact (_playerLantern) to add null checks so they'll work outside of the dream world + + [HarmonyPrefix] + [HarmonyPatch(nameof(LanternZoomPoint.Update))] + public static bool LanternZoomPoint_Update(LanternZoomPoint __instance) + { + if (PlayerState.InDreamWorld()) return true; + if (!__instance.enabled) + { + return false; + } + if (__instance._state != LanternZoomPoint.State.RetroZoom) + { + if (__instance._playerLantern != null) + { + __instance._playerLantern.GetLanternController().MoveTowardFocus(1f, 2f); + } + } + if (__instance._state == LanternZoomPoint.State.LookAt && Time.time > __instance._stateChangeTime + 0.4f) + { + __instance.ChangeState(LanternZoomPoint.State.ZoomIn); + __instance.StartZoomIn(); + } + else if (__instance._state == LanternZoomPoint.State.ZoomIn) + { + __instance.UpdateZoomIn(); + } + if (__instance._state == LanternZoomPoint.State.RetroZoom) + { + __instance.UpdateRetroZoom(); + } + return false; + } + + [HarmonyPrefix] + [HarmonyPatch(nameof(LanternZoomPoint.UpdateRetroZoom))] + public static bool LanternZoomPoint_UpdateRetroZoom(LanternZoomPoint __instance) + { + if (PlayerState.InDreamWorld()) return true; + float num = Mathf.InverseLerp(__instance._stateChangeTime, __instance._stateChangeTime + 1.2f, Time.time); + float focus = Mathf.Pow(Mathf.SmoothStep(0f, 1f, 1f - num), 0.2f); + if (__instance._playerLantern != null) + { + __instance._playerLantern.GetLanternController().SetFocus(focus); + } + float t = __instance._retroZoomCurve.Evaluate(num); + float targetFieldOfView = Mathf.Lerp(__instance._startFOV, Locator.GetPlayerCameraController().GetOrigFieldOfView(), t); + Locator.GetPlayerCameraController().SetTargetFieldOfView(targetFieldOfView); + float d = __instance._imageHalfWidth / Mathf.Tan(Locator.GetPlayerCamera().fieldOfView * 0.017453292f * 0.5f); + Vector3 vector = __instance._startLocalPos - __instance._endLocalPos; + __instance._attachPoint.transform.localPosition = __instance._endLocalPos + vector.normalized * d; + if (num >= 1f) + { + __instance.FinishRetroZoom(); + } + return false; + } + + [HarmonyPrefix] + [HarmonyPatch(nameof(LanternZoomPoint.FinishRetroZoom))] + public static bool LanternZoomPoint_FinishRetroZoom(LanternZoomPoint __instance) + { + if (PlayerState.InDreamWorld()) return true; + __instance.ChangeState(LanternZoomPoint.State.Idle); + __instance.enabled = false; + __instance._attachPoint.DetachPlayer(); + GlobalMessenger.FireEvent("PlayerRepositioned"); + if (__instance._playerLantern != null) + { + __instance._playerLantern.ForceUnfocus(); + __instance._playerLantern.enabled = true; + __instance._playerLantern = null; + } + OWInput.ChangeInputMode(InputMode.Character); + __instance._lightController.FadeTo(0f, 1f); + Locator.GetPlayerController().SetColliderActivation(true); + Locator.GetPlayerTransform().GetComponent().BreakLock(); + Locator.GetDreamWorldController().SetActiveZoomPoint(null); + return false; + } + + [HarmonyPrefix] + [HarmonyPatch(nameof(LanternZoomPoint.OnDetectLight))] + public static bool LanternZoomPoint_OnDetectLight(LanternZoomPoint __instance) + { + if (PlayerState.InDreamWorld()) return true; + if (__instance._state == LanternZoomPoint.State.Idle && !PlayerState.IsAttached() && Time.time > __instance._stateChangeTime + 1f && Vector3.Distance(__instance.transform.position, Locator.GetPlayerCamera().transform.position) > __instance._minActivationDistance) + { + __instance._playerLantern = Locator.GetToolModeSwapper().GetItemCarryTool().GetHeldItem() as DreamLanternItem; + Locator.GetDreamWorldController().SetActiveZoomPoint(__instance); + __instance._attachPoint.transform.position = Locator.GetPlayerTransform().position; + __instance._attachPoint.transform.rotation = Locator.GetPlayerTransform().rotation; + __instance._attachPoint.AttachPlayer(); + Locator.GetPlayerTransform().GetComponent().LockOn(__instance.transform, 5f, false, 1f); + OWInput.ChangeInputMode(InputMode.None); + if (__instance._playerLantern != null) + { + __instance._playerLantern.enabled = false; + } + __instance.ChangeState(LanternZoomPoint.State.LookAt); + __instance.enabled = true; + } + return false; + } + } +} diff --git a/NewHorizons/Patches/EchoesOfTheEyePatches/PeepholePatches.cs b/NewHorizons/Patches/EchoesOfTheEyePatches/PeepholePatches.cs new file mode 100644 index 000000000..f0b6df44a --- /dev/null +++ b/NewHorizons/Patches/EchoesOfTheEyePatches/PeepholePatches.cs @@ -0,0 +1,69 @@ +using HarmonyLib; +using NewHorizons.Components.EOTE; +using System.Collections.Generic; +using System.Reflection.Emit; +using UnityEngine; + +namespace NewHorizons.Patches.EchoesOfTheEyePatches +{ + [HarmonyPatch(typeof(Peephole))] + public static class PeepholePatches + { + static List _previousSectors = new List(); + + [HarmonyPrefix] + [HarmonyPatch(nameof(Peephole.SwitchToPeepholeCamera))] + public static void Peephole_SwitchToPeepholeCamera_Prefix() + { + _previousSectors.Clear(); + _previousSectors.AddRange(Locator.GetPlayerSectorDetector()._sectorList); + } + + + [HarmonyPostfix] + [HarmonyPatch(nameof(Peephole.SwitchToPeepholeCamera))] + public static void Peephole_SwitchToPeepholeCamera(Peephole __instance) + { + if (__instance._viewingSector) + { + var sector = __instance._viewingSector; + while (sector._parentSector != null) + { + sector = sector._parentSector; + + if (!_previousSectors.Contains(sector)) + { + sector.AddOccupant(Locator.GetPlayerSectorDetector()); + } + } + } + } + + [HarmonyPostfix] + [HarmonyPatch(nameof(Peephole.SwitchToPlayerCamera))] + public static void Peephole_SwitchToPlayerCamera(Peephole __instance) + { + if (__instance._viewingSector) + { + var sector = __instance._viewingSector; + + if (_previousSectors.Contains(sector)) + { + sector.AddOccupant(Locator.GetPlayerSectorDetector()); + } + + while (sector._parentSector != null) + { + sector = sector._parentSector; + + if (!_previousSectors.Contains(sector)) + { + sector.RemoveOccupant(Locator.GetPlayerSectorDetector()); + } + } + } + + _previousSectors.Clear(); + } + } +} diff --git a/NewHorizons/Patches/ShipLogPatches/ShipLogAstroObjectPatches.cs b/NewHorizons/Patches/ShipLogPatches/ShipLogAstroObjectPatches.cs index abfc67a8a..dd1654bd6 100644 --- a/NewHorizons/Patches/ShipLogPatches/ShipLogAstroObjectPatches.cs +++ b/NewHorizons/Patches/ShipLogPatches/ShipLogAstroObjectPatches.cs @@ -31,7 +31,7 @@ public static bool ShipLogAstroObject_UpdateState_Pre(ShipLogAstroObject __insta { // Custom astro objects might have no entries, in this case they will be permanently hidden // Just treat it as if it were revealed - if (__instance._entries.Count == 0) + if (__instance._entries == null || __instance._entries.Count == 0) { __instance._state = ShipLogEntry.State.Explored; __instance._imageObj.SetActive(true); diff --git a/NewHorizons/Patches/ShipLogPatches/ShipLogManagerPatches.cs b/NewHorizons/Patches/ShipLogPatches/ShipLogManagerPatches.cs index b76d61bbe..5fe2684b8 100644 --- a/NewHorizons/Patches/ShipLogPatches/ShipLogManagerPatches.cs +++ b/NewHorizons/Patches/ShipLogPatches/ShipLogManagerPatches.cs @@ -129,5 +129,18 @@ public static bool ShipLogManager_Start(ShipLogManager __instance) return false; } } + + [HarmonyPrefix] + [HarmonyPatch(nameof(ShipLogManager.AddEntry))] + public static bool ShipLogManager_AddEntry(ShipLogManager __instance, ShipLogEntry entry) + { + if (__instance._entryDict.TryGetValue(entry.GetID(), out var existing)) + { + NHLogger.LogVerbose($"Merging duplicate shiplog entry: {entry.GetID()}"); + RumorModeBuilder.MergeEntries(__instance, entry, existing); + return false; + } + return true; + } } } diff --git a/NewHorizons/Patches/ShipLogPatches/ShipLogMapModePatches.cs b/NewHorizons/Patches/ShipLogPatches/ShipLogMapModePatches.cs index e6fd50ad9..464118324 100644 --- a/NewHorizons/Patches/ShipLogPatches/ShipLogMapModePatches.cs +++ b/NewHorizons/Patches/ShipLogPatches/ShipLogMapModePatches.cs @@ -1,5 +1,6 @@ using HarmonyLib; using NewHorizons.Builder.ShipLog; +using NewHorizons.Components.Orbital; using NewHorizons.Handlers; using NewHorizons.Utility; using NewHorizons.Utility.OWML; @@ -19,6 +20,29 @@ public static void ShipLogMapMode_Initialize(ShipLogMapMode __instance) GameObject panRoot = SearchUtilities.Find(ShipLogHandler.PAN_ROOT_PATH); GameObject sunObject = SearchUtilities.Find(ShipLogHandler.PAN_ROOT_PATH + "/Sun"); ShipLogAstroObject[][] navMatrix = MapModeBuilder.ConstructMapMode(Main.Instance.CurrentStarSystem, panRoot, __instance._astroObjects, sunObject.layer); + // Remove anything that isnt meant to be selectable + var flagRemovedUnselectable = false; + for (int i = 0; i < navMatrix.Length; i++) + { + for (int j = 0; j < navMatrix[i].Length; j++) + { + if (!(MapModeBuilder.GetMapModeInfoForAstroObject(navMatrix[i][j])?.selectable ?? true)) + { + flagRemovedUnselectable = true; + navMatrix[i][j].UpdateState(); + navMatrix[i][j] = null; + } + } + } + if (flagRemovedUnselectable) + { + navMatrix = navMatrix.Where(a => a.Count(c => c != null) > 0).ToArray(); + for (var index = 0; index < navMatrix.Length; index++) + { + navMatrix[index] = navMatrix[index].Where(a => a != null).ToArray(); + } + } + if (navMatrix == null || navMatrix.Length <= 1) { NHLogger.LogWarning("Skipping Map Mode Generation."); diff --git a/NewHorizons/Patches/ShipLogPatches/SlideCollectionContainerPatches.cs b/NewHorizons/Patches/ShipLogPatches/SlideCollectionContainerPatches.cs deleted file mode 100644 index d3c4cae70..000000000 --- a/NewHorizons/Patches/ShipLogPatches/SlideCollectionContainerPatches.cs +++ /dev/null @@ -1,30 +0,0 @@ -using HarmonyLib; - -namespace NewHorizons.Patches.ShipLogPatches -{ - [HarmonyPatch(typeof(SlideCollectionContainer))] - public static class SlideCollectionContainerPatches - { - [HarmonyPrefix] - [HarmonyPatch(typeof(SlideCollectionContainer), nameof(SlideCollectionContainer.Initialize))] - public static bool SlideCollectionContainer_Initialize(SlideCollectionContainer __instance) - { - if (__instance._initialized) - return false; - __instance.SetupReadFlags(); - __instance.RegisterPerSlideCompletion(); - if (__instance.streamingTexturesAvailable) - __instance.SetupStreaming(); - __instance.BuildMusicRangesIndex(); - __instance._changeSlidesAllowed = true; - __instance._initialized = true; - __instance._slideCollection.isVision = __instance._owningItem == null; - foreach (var factID in __instance._playWithShipLogFacts) - { - var fact = Locator.GetShipLogManager().GetFact(factID); - fact?.RegisterSlideCollection(__instance._slideCollection); - } - return false; - } - } -} \ No newline at end of file diff --git a/NewHorizons/Patches/WarpPatches/VesselWarpControllerPatches.cs b/NewHorizons/Patches/WarpPatches/VesselWarpControllerPatches.cs index e4f993a31..e62d1d75c 100644 --- a/NewHorizons/Patches/WarpPatches/VesselWarpControllerPatches.cs +++ b/NewHorizons/Patches/WarpPatches/VesselWarpControllerPatches.cs @@ -23,7 +23,10 @@ public static bool VesselWarpController_WarpVessel(VesselWarpController __instan if (!Main.Instance.IsWarpingFromVessel) PlayerData.SaveWarpedToTheEye(TimeLoopUtilities.GetVanillaSecondsRemaining()); + // This is totally letting us see the interior of bramble when warping Locator.GetPlayerSectorDetector().RemoveFromAllSectors(); + // This is a very jank workaround to stop us seeing all that #957 + Locator.GetPlayerCamera().farClipPlane = 0; LoadManager.EnableAsyncLoadTransition(); return false; diff --git a/NewHorizons/Schemas/body_schema.json b/NewHorizons/Schemas/body_schema.json index 100d8d92c..7ed834cb6 100644 --- a/NewHorizons/Schemas/body_schema.json +++ b/NewHorizons/Schemas/body_schema.json @@ -31,6 +31,11 @@ "type": "boolean", "description": "`true` if you want to delete this planet" }, + "trackForSolarSystemRadius": { + "type": "boolean", + "description": "Do we track the position of this body when calculating the solar system radius?\n`true` if you want the map zoom speed, map panning distance/speed, map camera farclip plane,\nand autopilot-returning-to-solar-system to adjust to this planet's orbit", + "default": true + }, "removeChildren": { "type": "array", "description": "A list of paths to child GameObjects to destroy on this planet", @@ -275,7 +280,7 @@ }, "inclination": { "type": "number", - "description": "Angle between the rings and the equatorial plane of the planet.", + "description": "Angle between the belt and the equatorial plane of the planet.", "format": "float" }, "innerRadius": { @@ -286,7 +291,7 @@ }, "longitudeOfAscendingNode": { "type": "number", - "description": "Angle defining the point where the rings rise up from the planet's equatorial plane if inclination is nonzero.", + "description": "Angle defining the point where the belt rises up from the planet's equatorial plane if inclination is nonzero.", "format": "float" }, "maxSize": { @@ -310,13 +315,33 @@ "minimum": 0.0 }, "procGen": { - "description": "How the asteroids are generated", + "description": "How the asteroids are generated, unless you supply a detail yourself using \"assetBundle\" and \"path\"", "$ref": "#/definitions/ProcGenModule" }, "randomSeed": { "type": "integer", "description": "Number used to randomize asteroid positions", "format": "int32" + }, + "assetBundle": { + "type": "string", + "description": "You can use this to load a custom asset or ingame object, instead of using ProcGen. It will be scaled by \"minSize\" and \"maxSize\", so ideally it should be near a 1 meter radius.\nThis is a relative filepath to an asset-bundle to load the prefab defined in `path` from." + }, + "path": { + "type": "string", + "description": "You can use this to load a custom asset or ingame object, instead of using ProcGen. It will be scaled by \"minSize\" and \"maxSize\", so ideally it should be near a 1 meter radius.\nThis is either the path in the scene hierarchy of the item to copy or the path to the object in the supplied asset bundle. " + }, + "gravity": { + "type": "number", + "description": "Surface gravity of the asteroids.", + "format": "float", + "default": 1, + "minimum": 0.0 + }, + "randomOrientation": { + "type": "boolean", + "description": "Should the detail of the asteroid be randomly oriented, or should it point towards the center.", + "default": true } } }, @@ -370,7 +395,7 @@ }, "fogRampPath": { "type": "string", - "description": "Relative filepath to the fog color ramp texture, if you put fog.\nx axis is angle to sun (left at midnight, right at noon), y axis is distance to camera (close at bottom, far at top)." + "description": "Relative filepath to the fog color ramp texture, if you put fog.\nx axis is angle to sun (left at midnight, right at noon), y axis is distance to camera (close at bottom, far at top).\nOptional. If you set fogTint, a default fog ramp will be tinted for you." }, "hasOxygen": { "type": "boolean", @@ -583,6 +608,14 @@ "format": "int32", "default": 0 }, + "gravityAlignmentRadiusOverride": { + "type": [ + "integer", + "null" + ], + "description": "Optional. Overrides how far the player must be from the planet for their feet to automatically orient towards the ground.", + "format": "int32" + }, "pushable": { "type": "boolean", "description": "Apply physics to this planet when you bump into it. Will have a spherical collider the size of surfaceSize. \nFor custom colliders they have to all be convex and you can leave surface size as 0.\nThis is meant for stuff like satellites which are relatively simple and can be de-orbited.\nIf you are using an orbit line but a tracking line, it will be removed when the planet is bumped in to." @@ -1217,7 +1250,7 @@ }, "rafts": { "type": "array", - "description": "Add rafts to this planet", + "description": "Add rafts to this planet (requires Echoes of the Eye DLC)", "items": { "$ref": "#/definitions/RaftInfo" } @@ -1231,18 +1264,11 @@ }, "slideShows": { "type": "array", - "description": "Add slideshows (from the DLC) to the planet", + "description": "Add slideshows to the planet (requires Echoes of the Eye DLC)", "items": { "$ref": "#/definitions/ProjectionInfo" } }, - "quantumGroups": { - "type": "array", - "description": "A list of quantum groups that props can be added to. An example of a group would be a list of possible locations for a QuantumSocketedObject.", - "items": { - "$ref": "#/definitions/QuantumGroupInfo" - } - }, "tornados": { "type": "array", "description": "Add tornadoes to this planet", @@ -1313,19 +1339,75 @@ "$ref": "#/definitions/ShuttleInfo" } }, + "socketQuantumGroups": { + "type": "array", + "description": "Add a socket quantum object to a planet. Define the position of multiple \"sockets\" and multiple objects that jump between sockets. \nIf the number of sockets equals the number of objects, they will shuffle around.", + "items": { + "$ref": "#/definitions/SocketQuantumGroupInfo" + } + }, + "stateQuantumGroups": { + "type": "array", + "description": "Add a state quantum object to a planet. Switches between displaying different objects in a single place.", + "items": { + "$ref": "#/definitions/StateQuantumGroupInfo" + } + }, + "lightningQuantumGroups": { + "type": "array", + "description": "Add quantum lightning to a planet. When lightning strikes, a different detail object is shown. The lightning will take the first defined position/rotation for all objects.", + "items": { + "$ref": "#/definitions/LightningQuantumInfo" + } + }, "dreamCampfires": { "type": "array", - "description": "Add campfires that allow you to enter the dream world/simulation. Must be paired with a dream arrival point, which can be placed on this planet or elsewhere.", + "description": "Add campfires that allow you to enter the dream world/simulation (requires Echoes of the Eye DLC). Must be paired with a dream arrival point, which can be placed on this planet or elsewhere.", "items": { "$ref": "#/definitions/DreamCampfireInfo" } }, "dreamArrivalPoints": { "type": "array", - "description": "Add the points you will arrive at when entering the dream world/simulation from a paired dream campfire, which can be placed on this planet or elsewhere. The planet with the arrival point should be statically positioned to avoid issues with the simulation view materials.", + "description": "Add the points you will arrive at when entering the dream world/simulation from a paired dream campfire (requires Echoes of the Eye DLC). The planet with the arrival point should be statically positioned to avoid issues with the simulation view materials.", "items": { "$ref": "#/definitions/DreamArrivalPointInfo" } + }, + "grappleTotems": { + "type": "array", + "description": "Adds dream world grapple totems to this planet (requires Echoes of the Eye DLC).", + "items": { + "$ref": "#/definitions/GrappleTotemInfo" + } + }, + "alarmTotems": { + "type": "array", + "description": "Adds dream world alarm totems to this planet (requires Echoes of the Eye DLC).", + "items": { + "$ref": "#/definitions/AlarmTotemInfo" + } + }, + "portholes": { + "type": "array", + "description": "Adds portholes (the windows you can peek through in the Stranger) to this planet (requires Echoes of the Eye DLC).", + "items": { + "$ref": "#/definitions/PortholeInfo" + } + }, + "dreamCandles": { + "type": "array", + "description": "Adds dream world candles to this planet (requires Echoes of the Eye DLC).", + "items": { + "$ref": "#/definitions/DreamCandleInfo" + } + }, + "projectionTotems": { + "type": "array", + "description": "Adds dream world projection totems (requires Echoes of the Eye DLC).", + "items": { + "$ref": "#/definitions/ProjectionTotemInfo" + } } } }, @@ -1389,10 +1471,6 @@ "description": "Scale each axis of the prop. Overrides `scale`.", "$ref": "#/definitions/MVector3" }, - "quantumGroupID": { - "type": "string", - "description": "If this value is not null, this prop will be quantum. Assign this field to the id of the quantum group it should be a part of. The group it is assigned to determines what kind of quantum object it is" - }, "keepLoaded": { "type": "boolean", "description": "Should this detail stay loaded (visible and collideable) even if you're outside the sector (good for very large props)?\nAlso makes this detail visible on the map.\nKeeping many props loaded is bad for performance so use this only when it's actually relevant\nMost logic/behavior scripts will still only work inside the sector, as most of those scripts break if a sector is not provided." @@ -1607,6 +1685,12 @@ "removalFact": { "type": "string", "description": "A ship log fact to reveal when removing an item from this socket, or when the socket is empty." + }, + "colliderRadius": { + "type": "number", + "description": "Default collider radius when interacting with the socket", + "format": "float", + "default": 0.0 } } }, @@ -1641,7 +1725,7 @@ }, "pathToAnimController": { "type": "string", - "description": "If this dialogue is meant for a character, this is the relative path from the planet to that character's\nCharacterAnimController, TravelerController, TravelerEyeController (eye of the universe), FacePlayerWhenTalking, \nHearthianRecorderEffects or SolanumAnimController.\n\nIf it's a Recorder this will also delete the existing dialogue already attached to that prop.\n\nIf none of those components are present it will add a FacePlayerWhenTalking component." + "description": "If this dialogue is meant for a character, this is the relative path from the planet to that character's\nCharacterAnimController, TravelerController, TravelerEyeController (eye of the universe), FacePlayerWhenTalking, \nHearthianRecorderEffects or SolanumAnimController.\n\nIf it's a Recorder this will also delete the existing dialogue already attached to that prop.\n\nIf none of those components are present it will add a FacePlayerWhenTalking component.\n\n`pathToAnimController` also makes the dialogue into a child of the anim controller. This can be used with `isRelativeToParent`\nto position the dialogue on relative to the speaker. If you also provide `parentPath`, that will instead override which object \nis the parent, but the anim controller will otherwise function as expected." }, "pathToExistingDialogue": { "type": "string", @@ -2222,6 +2306,20 @@ "type": "string" } }, + "conditionsToSet": { + "type": "array", + "description": "The dialogue conditions to set after finishing this slide reel.", + "items": { + "type": "string" + } + }, + "persistentConditionsToSet": { + "type": "array", + "description": "The persistent conditions to set after finishing this slide reel.", + "items": { + "type": "string" + } + }, "playWithShipLogFacts": { "type": "array", "description": "The ship log facts that make the reel play when they are displayed in the computer (by selecting entries or arrows).\nYou should probably include facts from `reveals` here.\nIf you only specify a rumor fact, then it would only play in its ship log entry if this has revealed only\nrumor facts because an entry with revealed explore facts doesn't display rumor facts.", @@ -2369,91 +2467,6 @@ "rusted" ] }, - "QuantumGroupInfo": { - "type": "object", - "additionalProperties": false, - "properties": { - "type": { - "description": "What type of group this is: does it define a list of states a single quantum object could take or a list of sockets one or more quantum objects could share?", - "$ref": "#/definitions/QuantumGroupType" - }, - "id": { - "type": "string", - "description": "A unique string used by props (that are marked as quantum) use to refer back to this group" - }, - "sockets": { - "type": "array", - "description": "Only required if type is `sockets`. This lists all the possible locations for any props assigned to this group.", - "items": { - "$ref": "#/definitions/QuantumSocketInfo" - } - }, - "hasEmptyState": { - "type": "boolean", - "description": "Optional. Only used if type is `states`. If this is true, then the first prop made part of this group will be used to construct a visibility box for an empty game object, which will be considered one of the states." - }, - "sequential": { - "type": "boolean", - "description": "Optional. Only used if type is `states`. If this is true, then the states will be presented in order, rather than in a random order" - }, - "loop": { - "type": "boolean", - "description": "Optional. Only used if type is `states` and `sequential` is true. If this is false, then after the last state has appeared, the object will no longer change state", - "default": true - } - } - }, - "QuantumGroupType": { - "type": "string", - "description": "", - "x-enumNames": [ - "Sockets", - "States" - ], - "enum": [ - "sockets", - "states" - ] - }, - "QuantumSocketInfo": { - "type": "object", - "additionalProperties": false, - "properties": { - "rotation": { - "description": "Rotation of the object", - "$ref": "#/definitions/MVector3" - }, - "alignRadial": { - "type": [ - "boolean", - "null" - ], - "description": "Do we try to automatically align this object to stand upright relative to the body's center? Stacks with rotation.\nDefaults to true for geysers, tornados, and volcanoes, and false for everything else." - }, - "position": { - "description": "Position of the object", - "$ref": "#/definitions/MVector3" - }, - "isRelativeToParent": { - "type": "boolean", - "description": "Whether the positional and rotational coordinates are relative to parent instead of the root planet object." - }, - "parentPath": { - "type": "string", - "description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)." - }, - "rename": { - "type": "string", - "description": "An optional rename of this object" - }, - "probability": { - "type": "number", - "description": "The probability any props that are part of this group will occupy this socket", - "format": "float", - "default": 1.0 - } - } - }, "TornadoInfo": { "type": "object", "additionalProperties": false, @@ -3403,10 +3416,112 @@ } } }, - "DreamCampfireInfo": { + "SocketQuantumGroupInfo": { + "type": "object", + "additionalProperties": false, + "properties": { + "rename": { + "type": "string", + "description": "Optional name to help identify this group" + }, + "details": { + "type": "array", + "description": "List of props which will be used in this quantum group", + "items": { + "$ref": "#/definitions/QuantumDetailInfo" + } + }, + "sockets": { + "type": "array", + "items": { + "$ref": "#/definitions/QuantumSocketInfo" + } + } + } + }, + "QuantumDetailInfo": { "type": "object", "additionalProperties": false, "properties": { + "assetBundle": { + "type": "string", + "description": "Relative filepath to an asset-bundle to load the prefab defined in `path` from" + }, + "path": { + "type": "string", + "description": "Either the path in the scene hierarchy of the item to copy or the path to the object in the supplied asset bundle. \nIf empty, will make an empty game object. This can be useful for adding other props to it as its children." + }, + "removeChildren": { + "type": "array", + "description": "A list of children to remove from this detail", + "items": { + "type": "string" + } + }, + "removeComponents": { + "type": "boolean", + "description": "Do we reset all the components on this object? Useful for certain props that have dialogue components attached to\nthem." + }, + "scale": { + "type": "number", + "description": "Scale the prop", + "format": "float", + "default": 1.0 + }, + "stretch": { + "description": "Scale each axis of the prop. Overrides `scale`.", + "$ref": "#/definitions/MVector3" + }, + "keepLoaded": { + "type": "boolean", + "description": "Should this detail stay loaded (visible and collideable) even if you're outside the sector (good for very large props)?\nAlso makes this detail visible on the map.\nKeeping many props loaded is bad for performance so use this only when it's actually relevant\nMost logic/behavior scripts will still only work inside the sector, as most of those scripts break if a sector is not provided." + }, + "hasPhysics": { + "type": "boolean", + "description": "Should this object dynamically move around?\nThis tries to make all mesh colliders convex, as well as adding a sphere collider in case the detail has no others." + }, + "physicsMass": { + "type": "number", + "description": "The mass of the physics object.\nMost pushable props use the default value, which matches the player mass.", + "format": "float", + "default": 0.001 + }, + "physicsRadius": { + "type": "number", + "description": "The radius that the added sphere collider will use for physics collision.\nIf there's already good colliders on the detail, you can make this 0.", + "format": "float", + "default": 1.0 + }, + "physicsSuspendUntilImpact": { + "type": "boolean", + "description": "If true, this detail will stay still until it touches something.\nGood for zero-g props.", + "default": false + }, + "ignoreSun": { + "type": "boolean", + "description": "Set to true if this object's lighting should ignore the effects of sunlight" + }, + "activationCondition": { + "type": "string", + "description": "Activates this game object when the dialogue condition is met" + }, + "deactivationCondition": { + "type": "string", + "description": "Deactivates this game object when the dialogue condition is met" + }, + "blinkWhenActiveChanged": { + "type": "boolean", + "description": "Should the player close their eyes while the activation state changes. Only relevant if activationCondition or deactivationCondition are set.", + "default": true + }, + "item": { + "description": "Should this detail be treated as an interactible item", + "$ref": "#/definitions/ItemInfo" + }, + "itemSocket": { + "description": "Should this detail be treated as a socket for an interactible item", + "$ref": "#/definitions/ItemSocketInfo" + }, "rotation": { "description": "Rotation of the object", "$ref": "#/definitions/MVector3" @@ -3434,9 +3549,161 @@ "type": "string", "description": "An optional rename of this object" }, - "id": { - "type": "string", - "description": "Unique ID for this dream-world campfire" + "randomizeYRotation": { + "type": "boolean", + "description": "When used in a quantum socket this object will randomize its rotation around the local Y axis.", + "default": true + }, + "alignWithGravity": { + "type": "boolean", + "description": "When used in a quantum socket this object will align to the nearest gravity volume. Else use the rotation of the quantum socket.", + "default": true + } + } + }, + "QuantumSocketInfo": { + "type": "object", + "additionalProperties": false, + "properties": { + "rotation": { + "description": "Rotation of the object", + "$ref": "#/definitions/MVector3" + }, + "alignRadial": { + "type": [ + "boolean", + "null" + ], + "description": "Do we try to automatically align this object to stand upright relative to the body's center? Stacks with rotation.\nDefaults to true for geysers, tornados, and volcanoes, and false for everything else." + }, + "position": { + "description": "Position of the object", + "$ref": "#/definitions/MVector3" + }, + "isRelativeToParent": { + "type": "boolean", + "description": "Whether the positional and rotational coordinates are relative to parent instead of the root planet object." + }, + "parentPath": { + "type": "string", + "description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)." + }, + "rename": { + "type": "string", + "description": "An optional rename of this object" + }, + "probability": { + "type": "number", + "description": "The probability any props that are part of this group will occupy this socket", + "format": "float", + "default": 1.0 + } + } + }, + "StateQuantumGroupInfo": { + "type": "object", + "additionalProperties": false, + "properties": { + "rename": { + "type": "string", + "description": "Optional name to help identify this group" + }, + "details": { + "type": "array", + "description": "List of props which will be used in this quantum group", + "items": { + "$ref": "#/definitions/QuantumDetailInfo" + } + }, + "sequential": { + "type": "boolean", + "description": "Optional. If this is true, then the states will be presented in order, rather than in a random order" + }, + "loop": { + "type": "boolean", + "description": "Optional. Only used if `sequential` is true. If this is false, then after the last state has appeared, the object will no longer change state", + "default": true + }, + "hasEmptyState": { + "type": "boolean", + "description": "Optional. Only used if type is `states`. If this is true, then the first prop made part of this group will be used to construct a visibility box for an empty game object, which will be considered one of the states." + } + } + }, + "LightningQuantumInfo": { + "type": "object", + "additionalProperties": false, + "properties": { + "rotation": { + "description": "Rotation of the object", + "$ref": "#/definitions/MVector3" + }, + "alignRadial": { + "type": [ + "boolean", + "null" + ], + "description": "Do we try to automatically align this object to stand upright relative to the body's center? Stacks with rotation.\nDefaults to true for geysers, tornados, and volcanoes, and false for everything else." + }, + "position": { + "description": "Position of the object", + "$ref": "#/definitions/MVector3" + }, + "isRelativeToParent": { + "type": "boolean", + "description": "Whether the positional and rotational coordinates are relative to parent instead of the root planet object." + }, + "parentPath": { + "type": "string", + "description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)." + }, + "rename": { + "type": "string", + "description": "An optional rename of this object" + }, + "details": { + "type": "array", + "description": "List of props which will be alternated between during flashes of lightning", + "items": { + "$ref": "#/definitions/DetailInfo" + } + } + } + }, + "DreamCampfireInfo": { + "type": "object", + "additionalProperties": false, + "properties": { + "rotation": { + "description": "Rotation of the object", + "$ref": "#/definitions/MVector3" + }, + "alignRadial": { + "type": [ + "boolean", + "null" + ], + "description": "Do we try to automatically align this object to stand upright relative to the body's center? Stacks with rotation.\nDefaults to true for geysers, tornados, and volcanoes, and false for everything else." + }, + "position": { + "description": "Position of the object", + "$ref": "#/definitions/MVector3" + }, + "isRelativeToParent": { + "type": "boolean", + "description": "Whether the positional and rotational coordinates are relative to parent instead of the root planet object." + }, + "parentPath": { + "type": "string", + "description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)." + }, + "rename": { + "type": "string", + "description": "An optional rename of this object" + }, + "id": { + "type": "string", + "description": "Unique ID for this dream-world campfire" } } }, @@ -3481,6 +3748,337 @@ } } }, + "GrappleTotemInfo": { + "type": "object", + "additionalProperties": false, + "properties": { + "rotation": { + "description": "Rotation of the object", + "$ref": "#/definitions/MVector3" + }, + "alignRadial": { + "type": [ + "boolean", + "null" + ], + "description": "Do we try to automatically align this object to stand upright relative to the body's center? Stacks with rotation.\nDefaults to true for geysers, tornados, and volcanoes, and false for everything else." + }, + "position": { + "description": "Position of the object", + "$ref": "#/definitions/MVector3" + }, + "isRelativeToParent": { + "type": "boolean", + "description": "Whether the positional and rotational coordinates are relative to parent instead of the root planet object." + }, + "parentPath": { + "type": "string", + "description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)." + }, + "rename": { + "type": "string", + "description": "An optional rename of this object" + }, + "minDistance": { + "type": "number", + "description": "The minimum distance that the player must be from the grapple totem for it to activate.", + "format": "float", + "default": 10.0 + }, + "arrivalDistance": { + "type": "number", + "description": "The distance from the grapple totem that the player will stop at when it activates.", + "format": "float", + "default": 4.0 + }, + "maxAngle": { + "type": "number", + "description": "The maximum angle in degrees allowed between the grapple totem's face and the player's lantern in order to activate the totem.", + "format": "float", + "default": 45.0 + }, + "maxDistance": { + "type": "number", + "description": "The maximum distance allowed between the grapple totem's face and the player's lantern in order to activate the totem.", + "format": "float", + "default": 29.0 + } + } + }, + "AlarmTotemInfo": { + "type": "object", + "additionalProperties": false, + "properties": { + "rotation": { + "description": "Rotation of the object", + "$ref": "#/definitions/MVector3" + }, + "alignRadial": { + "type": [ + "boolean", + "null" + ], + "description": "Do we try to automatically align this object to stand upright relative to the body's center? Stacks with rotation.\nDefaults to true for geysers, tornados, and volcanoes, and false for everything else." + }, + "position": { + "description": "Position of the object", + "$ref": "#/definitions/MVector3" + }, + "isRelativeToParent": { + "type": "boolean", + "description": "Whether the positional and rotational coordinates are relative to parent instead of the root planet object." + }, + "parentPath": { + "type": "string", + "description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)." + }, + "rename": { + "type": "string", + "description": "An optional rename of this object" + }, + "sightDistance": { + "type": "number", + "description": "The maximum distance of the alarm's vision cone.", + "format": "float", + "default": 45.0 + }, + "sightAngle": { + "type": "number", + "description": "The width of the alarm's vision cone in degrees.", + "format": "float", + "default": 60.0 + }, + "stretchVisionCone": { + "description": "Scales the visible vision cone in the simulation view (does not affect the actual vision cone detection).", + "$ref": "#/definitions/MVector3" + } + } + }, + "PortholeInfo": { + "type": "object", + "additionalProperties": false, + "properties": { + "rotation": { + "description": "Rotation of the object", + "$ref": "#/definitions/MVector3" + }, + "alignRadial": { + "type": [ + "boolean", + "null" + ], + "description": "Do we try to automatically align this object to stand upright relative to the body's center? Stacks with rotation.\nDefaults to true for geysers, tornados, and volcanoes, and false for everything else." + }, + "position": { + "description": "Position of the object", + "$ref": "#/definitions/MVector3" + }, + "isRelativeToParent": { + "type": "boolean", + "description": "Whether the positional and rotational coordinates are relative to parent instead of the root planet object." + }, + "parentPath": { + "type": "string", + "description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)." + }, + "rename": { + "type": "string", + "description": "An optional rename of this object" + }, + "revealFacts": { + "type": "array", + "description": "Fact IDs to reveal when peeking through the porthole.", + "items": { + "type": "string" + } + }, + "fieldOfView": { + "type": "number", + "description": "The field of view of the porthole camera.", + "format": "float", + "default": 90.0 + }, + "target": { + "description": "The location of the camera when the player peeks through the porthole. Can be placed on a different planet.", + "$ref": "#/definitions/PortholeTargetInfo" + } + } + }, + "PortholeTargetInfo": { + "type": "object", + "additionalProperties": false, + "properties": { + "parentBody": { + "type": "string", + "description": "The name of the planet that will be used with `parentPath`. Must be set if `parentPath` is set." + }, + "rotation": { + "description": "Rotation of the object", + "$ref": "#/definitions/MVector3" + }, + "alignRadial": { + "type": [ + "boolean", + "null" + ], + "description": "Do we try to automatically align this object to stand upright relative to the body's center? Stacks with rotation.\nDefaults to true for geysers, tornados, and volcanoes, and false for everything else." + }, + "position": { + "description": "Position of the object", + "$ref": "#/definitions/MVector3" + }, + "isRelativeToParent": { + "type": "boolean", + "description": "Whether the positional and rotational coordinates are relative to parent instead of the root planet object." + }, + "parentPath": { + "type": "string", + "description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)." + }, + "rename": { + "type": "string", + "description": "An optional rename of this object" + } + } + }, + "DreamCandleInfo": { + "type": "object", + "additionalProperties": false, + "properties": { + "rotation": { + "description": "Rotation of the object", + "$ref": "#/definitions/MVector3" + }, + "alignRadial": { + "type": [ + "boolean", + "null" + ], + "description": "Do we try to automatically align this object to stand upright relative to the body's center? Stacks with rotation.\nDefaults to true for geysers, tornados, and volcanoes, and false for everything else." + }, + "position": { + "description": "Position of the object", + "$ref": "#/definitions/MVector3" + }, + "isRelativeToParent": { + "type": "boolean", + "description": "Whether the positional and rotational coordinates are relative to parent instead of the root planet object." + }, + "parentPath": { + "type": "string", + "description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)." + }, + "rename": { + "type": "string", + "description": "An optional rename of this object" + }, + "type": { + "description": "The type of dream candle this is.", + "default": "Ground", + "$ref": "#/definitions/DreamCandleType" + }, + "startLit": { + "type": "boolean", + "description": "Whether the candle should start lit or extinguished." + } + } + }, + "DreamCandleType": { + "type": "string", + "description": "", + "x-enumNames": [ + "Ground", + "GroundSmall", + "GroundLarge", + "GroundSingle", + "Wall", + "WallLargeFlame", + "WallBigWick", + "Standing", + "Pile" + ], + "enum": [ + "ground", + "groundSmall", + "groundLarge", + "groundSingle", + "wall", + "wallLargeFlame", + "wallBigWick", + "standing", + "pile" + ] + }, + "ProjectionTotemInfo": { + "type": "object", + "additionalProperties": false, + "properties": { + "rotation": { + "description": "Rotation of the object", + "$ref": "#/definitions/MVector3" + }, + "alignRadial": { + "type": [ + "boolean", + "null" + ], + "description": "Do we try to automatically align this object to stand upright relative to the body's center? Stacks with rotation.\nDefaults to true for geysers, tornados, and volcanoes, and false for everything else." + }, + "position": { + "description": "Position of the object", + "$ref": "#/definitions/MVector3" + }, + "isRelativeToParent": { + "type": "boolean", + "description": "Whether the positional and rotational coordinates are relative to parent instead of the root planet object." + }, + "parentPath": { + "type": "string", + "description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)." + }, + "rename": { + "type": "string", + "description": "An optional rename of this object" + }, + "startLit": { + "type": "boolean", + "description": "Whether the totem should start lit or extinguished." + }, + "extinguishOnly": { + "type": "boolean", + "description": "Whether the projection totem should be able to extinguished but not be able to be lit again with the artifact. Mainly useful if `startLit` is set to true." + }, + "pathToAlarmTotem": { + "type": "string", + "description": "A relative path from this planet to an alarm totem that will be activated or deactivated based on whether this totem is lit." + }, + "pathsToDreamCandles": { + "type": "array", + "description": "Relative paths from this planet to objects containing dream candles that will be activated or deactivated based on whether this totem is lit. All dream candles in the selected objects will be connected to this totem, so they do not need to be specified individually if a parent object is specified.", + "items": { + "type": "string" + } + }, + "pathsToProjectionTotems": { + "type": "array", + "description": "Relative paths from this planet to projection totems that will be deactivated if this totem is extinguished. All projection totems in the selected objects will be connected to this totem, so they do not need to be specified individually if a parent object is specified.", + "items": { + "type": "string" + } + }, + "pathsToProjectedObjects": { + "type": "array", + "description": "Relative paths from this planet to objects that will appear or disappear when this totem is lit or extinguished. Some types of objects and effects are not supported and will remain visible and active.", + "items": { + "type": "string" + } + }, + "toggleProjectedObjectsActive": { + "type": "boolean", + "description": "If set, projected objects will be set to fully active or fully disabled instantly instead of smoothly fading lights/renderers/colliders. Use this if the normal behavior is insufficient for the objects you're using." + } + } + }, "ReferenceFrameModule": { "type": "object", "additionalProperties": false, @@ -3615,7 +4213,7 @@ }, "spriteFolder": { "type": "string", - "description": "A path to the folder where entry sprites are stored." + "description": "A path to the folder where entry sprites (.png) are stored." }, "xmlFile": { "type": "string", @@ -3653,7 +4251,7 @@ }, "outlineSprite": { "type": "string", - "description": "The path to the sprite to show when the planet is unexplored in map mode." + "description": "The path to the sprite (.png/.jpg/.exr) to show when the planet is unexplored in map mode." }, "remove": { "type": "boolean", @@ -3661,13 +4259,18 @@ }, "revealedSprite": { "type": "string", - "description": "The path to the sprite to show when the planet is revealed in map mode." + "description": "The path to the sprite (.png/.jpg/.exr) to show when the planet is revealed in map mode." }, "scale": { "type": "number", "description": "Scale to apply to the planet in map mode.", "format": "float", "default": 1.0 + }, + "selectable": { + "type": "boolean", + "description": "Can this ship log map mode entry be selected\nEx) Set to false for stars with no entries on them so they are skipped in navigation", + "default": true } } }, @@ -3681,7 +4284,7 @@ }, "outlineSprite": { "type": "string", - "description": "The sprite to show when the parent AstroBody is rumored/unexplored." + "description": "The sprite (.png/.jpg/.exr) to show when the parent AstroBody is rumored/unexplored." }, "position": { "description": "The position (relative to the parent) to place the detail.", @@ -3689,7 +4292,7 @@ }, "revealedSprite": { "type": "string", - "description": "The sprite to show when the parent AstroBody is revealed." + "description": "The sprite (.png/.jpg/.exr) to show when the parent AstroBody is revealed." }, "rotation": { "type": "number", @@ -4519,7 +5122,7 @@ }, "NHDeathType": { "type": "string", - "description": "", + "description": "Some special death types are:\n\nSupernova: Special death type used when the supernova hits you. You will not wake up if in the Dreamworld. \n\nDigestion: Death type used by anglerfish (and cut-content ghosts and water monster)\n\nBig bang: Special death type used at the end of the game\n\nMeditation: Special death type used when skipping to the next loop. You will not wake up if in the Dreamworld. \n\nTimeloop: Special death type used when the time loop ends. You will not wake up if in the Dreamworld. \n\nBlackhole: Special death type used by the ATP blackhole (and custom NH blackholes without whitehole destinations)\n\nDream: Special DLC death type used to kill a player in the real world while in the Dreamworld (i.e., you will loop not wake up)\n\nDreamExplosion: Special DLC death type used by the prototype artifact to kill a player in the real world while in the Dreamworld (i.e., you will loop not wake up)\n\nCrushedByElevator: Similar to the Crushed death type, but much faster", "x-enumNames": [ "Default", "Impact", diff --git a/NewHorizons/Schemas/star_system_schema.json b/NewHorizons/Schemas/star_system_schema.json index 0bd6055cb..d1466958d 100644 --- a/NewHorizons/Schemas/star_system_schema.json +++ b/NewHorizons/Schemas/star_system_schema.json @@ -9,6 +9,11 @@ "type": "string", "description": "Unique name of your system. If not specified, the file name (without the extension) is used." }, + "allowOutsideItems": { + "type": "boolean", + "description": "When changing star systems are you allowed to bring items into this system?", + "default": true + }, "freeMapAngle": { "type": "boolean", "description": "In this system should the player be able to rotate their map camera freely or be stuck above the plane of the solar system?" diff --git a/NewHorizons/Utility/DebugTools/DebugPropPlacer.cs b/NewHorizons/Utility/DebugTools/DebugPropPlacer.cs deleted file mode 100644 index 088d3ec5b..000000000 --- a/NewHorizons/Utility/DebugTools/DebugPropPlacer.cs +++ /dev/null @@ -1,312 +0,0 @@ -using NewHorizons.Builder.Props; -using NewHorizons.External.Configs; -using NewHorizons.External.Modules.Props; -using NewHorizons.Handlers; -using NewHorizons.Utility.Files; -using NewHorizons.Utility.OWML; -using NewHorizons.Utility.OuterWilds; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; -using UnityEngine.InputSystem; - -namespace NewHorizons.Utility.DebugTools -{ - - // - // The prop placer. Doesn't interact with any files, just places and tracks props. - // - - [RequireComponent(typeof(DebugRaycaster))] - class DebugPropPlacer : MonoBehaviour - { - private struct PropPlacementData - { - public AstroObject body; - public string system; - public GameObject gameObject; - public DetailInfo detailInfo; - } - - // VASE - public static readonly string DEFAULT_OBJECT = "BrittleHollow_Body/Sector_BH/Sector_NorthHemisphere/Sector_NorthPole/Sector_HangingCity/Sector_HangingCity_District1/Props_HangingCity_District1/OtherComponentsGroup/Props_HangingCity_Building_10/Prefab_NOM_VaseThin"; - - public string currentObject { get; private set; } // path of the prop to be placed - private bool hasAddedCurrentObjectToRecentsList = false; - private List props = new List(); - private List deletedProps = new List(); - private DebugRaycaster _rc; - - public static HashSet RecentlyPlacedProps = new HashSet(); - - public static bool active = false; - public GameObject mostRecentlyPlacedPropGO { get { return props.Count() <= 0 ? null : props[props.Count() - 1].gameObject; } } - public string mostRecentlyPlacedPropPath { get { return props.Count() <= 0 ? "" : props[props.Count() - 1].detailInfo.path; } } - - private ScreenPrompt _placePrompt; - private ScreenPrompt _undoPrompt; - private ScreenPrompt _redoPrompt; - - private void Awake() - { - _rc = this.GetRequiredComponent(); - currentObject = DEFAULT_OBJECT; - - _placePrompt = new ScreenPrompt(TranslationHandler.GetTranslation("DEBUG_PLACE", TranslationHandler.TextType.UI) + " ", ImageUtilities.GetButtonSprite(KeyCode.G)); - _undoPrompt = new ScreenPrompt(TranslationHandler.GetTranslation("DEBUG_UNDO", TranslationHandler.TextType.UI) + " ", ImageUtilities.GetButtonSprite(KeyCode.Minus)); - _redoPrompt = new ScreenPrompt(TranslationHandler.GetTranslation("DEBUG_REDO", TranslationHandler.TextType.UI) + " ", ImageUtilities.GetButtonSprite(KeyCode.Equals)); - - Locator.GetPromptManager().AddScreenPrompt(_placePrompt, PromptPosition.UpperRight, false); - Locator.GetPromptManager().AddScreenPrompt(_undoPrompt, PromptPosition.UpperRight, false); - Locator.GetPromptManager().AddScreenPrompt(_redoPrompt, PromptPosition.UpperRight, false); - } - - private void OnDestroy() - { - var promptManager = Locator.GetPromptManager(); - if (promptManager == null) return; - promptManager.RemoveScreenPrompt(_placePrompt, PromptPosition.UpperRight); - promptManager.RemoveScreenPrompt(_undoPrompt, PromptPosition.UpperRight); - promptManager.RemoveScreenPrompt(_redoPrompt, PromptPosition.UpperRight); - } - - private void Update() - { - UpdatePromptVisibility(); - if (!Main.Debug) return; - if (!active) return; - - if (Keyboard.current[Key.G].wasReleasedThisFrame) - { - PlaceObject(); - } - - if (Keyboard.current[Key.Minus].wasReleasedThisFrame) - { - DeleteLast(); - } - - if (Keyboard.current[Key.Equals].wasReleasedThisFrame) - { - UndoDelete(); - } - } - - public void UpdatePromptVisibility() - { - var visible = !OWTime.IsPaused() && Main.Debug && active; - _placePrompt.SetVisibility(visible); - _undoPrompt.SetVisibility(visible && props.Count > 0); - _redoPrompt.SetVisibility(visible && deletedProps.Count > 0); - } - - public void SetCurrentObject(string s) - { - currentObject = s; - hasAddedCurrentObjectToRecentsList = false; - } - - internal void PlaceObject() - { - DebugRaycastData data = _rc.Raycast(); - PlaceObject(data); - - //TODO: use DropItem logic to make props not clip through the ground when placed - //public virtual void DropItem(Vector3 position, Vector3 normal, Transform parent, Sector sector, IItemDropTarget customDropTarget) - - if (!hasAddedCurrentObjectToRecentsList) - { - hasAddedCurrentObjectToRecentsList = true; - - if (!RecentlyPlacedProps.Contains(currentObject)) - { - RecentlyPlacedProps.Add(currentObject); - } - } - } - - public void PlaceObject(DebugRaycastData data) - { - // TODO: implement sectors - // if this hits a sector, store that sector and add a config file option for it - - if (data.hitBodyGameObject == null) - { - NHLogger.LogError($"Failed to place object {currentObject} on nothing."); - return; - } - - try - { - if (currentObject == "" || currentObject == null) - { - SetCurrentObject(DEFAULT_OBJECT); - } - - var planetGO = data.hitBodyGameObject; - - if (!planetGO.name.EndsWith("_Body")) - { - NHLogger.LogWarning("Cannot place object on non-body object: " + data.hitBodyGameObject.name); - } - - var sector = planetGO.GetComponentInChildren(); - var prefab = SearchUtilities.Find(currentObject); - var detailInfo = new DetailInfo() - { - position = data.pos, - rotation = data.rot.eulerAngles, - keepLoaded = true - }; - var prop = DetailBuilder.Make(planetGO, sector, null, prefab, detailInfo); - - var body = data.hitBodyGameObject.GetComponent(); - if (body != null) RegisterProp(body, prop); - } - catch - { - NHLogger.LogError($"Failed to place object {currentObject} on body ${data.hitBodyGameObject} at location ${data.pos}."); - } - } - - - - public static string GetAstroObjectName(string bodyName) - { - var astroObject = AstroObjectLocator.GetAstroObject(bodyName); - if (astroObject == null) return null; - - var astroObjectName = astroObject.name; - - return astroObjectName; - } - - public void FindAndRegisterPropsFromConfig(PlanetConfig config, List pathsList = null) - { - if (config.starSystem != Main.Instance.CurrentStarSystem) return; - - var planet = AstroObjectLocator.GetAstroObject(config.name); - - if (planet == null) return; - if (config.Props == null || config.Props.details == null) return; - - var astroObject = AstroObjectLocator.GetAstroObject(config.name); - - foreach (var detail in config.Props.details) - { - var spawnedProp = DetailBuilder.GetSpawnedGameObjectByDetailInfo(detail); - - if (spawnedProp == null) - { - NHLogger.LogError("No spawned prop found for " + detail.path); - continue; - } - - var data = RegisterProp_WithReturn(astroObject, spawnedProp, detail.path, detail); - - // note: we do not support placing props from assetbundles, so they will not be added to the - // selectable list of placed props - if (detail.assetBundle == null && !RecentlyPlacedProps.Contains(data.detailInfo.path)) - { - if (pathsList != null) pathsList.Add(data.detailInfo.path); - } - } - } - - public void RegisterProp(AstroObject body, GameObject prop) - { - RegisterProp_WithReturn(body, prop); - } - - private PropPlacementData RegisterProp_WithReturn(AstroObject body, GameObject prop, string propPath = null, DetailInfo detailInfo = null) - { - if (Main.Debug) - { - // TOOD: make this prop an item - } - - //var body = AstroObjectLocator.GetAstroObject(bodyGameObjectName); - - NHLogger.LogVerbose($"Adding prop to {Main.Instance.CurrentStarSystem}::{body.name}"); - - - detailInfo = detailInfo == null ? new DetailInfo() : detailInfo; - detailInfo.path = propPath == null ? currentObject : propPath; - - PropPlacementData data = new PropPlacementData - { - body = body, - gameObject = prop, - system = Main.Instance.CurrentStarSystem, - detailInfo = detailInfo - }; - - props.Add(data); - return data; - } - - public Dictionary GetPropsConfigByBody() - { - var groupedProps = props - .GroupBy(p => p.system + "." + p.body) - .Select(grp => grp.ToList()) - .ToList(); - - Dictionary propConfigs = new(); - - foreach (List bodyProps in groupedProps) - { - if (bodyProps == null || bodyProps.Count == 0) continue; - if (bodyProps[0].body == null) continue; - var body = bodyProps[0].body; - NHLogger.LogVerbose("getting prop group for body " + body.name); - //string bodyName = GetAstroObjectName(bodyProps[0].body); - - DetailInfo[] infoArray = new DetailInfo[bodyProps.Count]; - propConfigs[body] = infoArray; - - for (int i = 0; i < bodyProps.Count; i++) - { - var prop = bodyProps[i]; - var rootTransform = prop.gameObject.transform.root; - - // Objects are parented to the sector and not to the planet - // However, raycasted positions are reported relative to the root game object - // Normally these two are the same, but there are some notable exceptions (ex, floating islands) - // So we can't use local position/rotation here, we have to inverse transform the global position/rotation relative to root object - prop.detailInfo.position = rootTransform.InverseTransformPoint(prop.gameObject.transform.position); - prop.detailInfo.scale = prop.gameObject.transform.localScale.x; - if (!prop.detailInfo.alignRadial.GetValueOrDefault()) prop.detailInfo.rotation = rootTransform.InverseTransformRotation(prop.gameObject.transform.rotation).eulerAngles; - - infoArray[i] = prop.detailInfo; - } - } - - return propConfigs; - } - - public void DeleteLast() - { - if (props.Count <= 0) return; - - PropPlacementData last = props[props.Count - 1]; - props.RemoveAt(props.Count - 1); - - last.gameObject.SetActive(false); - - deletedProps.Add(last); - } - - public void UndoDelete() - { - if (deletedProps.Count <= 0) return; - - PropPlacementData last = deletedProps[deletedProps.Count - 1]; - deletedProps.RemoveAt(deletedProps.Count - 1); - - last.gameObject.SetActive(true); - - props.Add(last); - } - } -} diff --git a/NewHorizons/Utility/DebugTools/Menu/DebugMenu.cs b/NewHorizons/Utility/DebugTools/Menu/DebugMenu.cs deleted file mode 100644 index 882b9cee5..000000000 --- a/NewHorizons/Utility/DebugTools/Menu/DebugMenu.cs +++ /dev/null @@ -1,321 +0,0 @@ -using NewHorizons.External.Configs; -using NewHorizons.Handlers; -using NewHorizons.Utility.Files; -using NewHorizons.Utility.OWML; -using Newtonsoft.Json; -using OWML.Common; -using OWML.Common.Menus; -using OWML.Utils; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using UnityEngine; - -namespace NewHorizons.Utility.DebugTools.Menu -{ - class DebugMenu : MonoBehaviour - { - private static SubmitAction pauseMenuButton; - - public GUIStyle _editorMenuStyle; - public GUIStyle _tabBarStyle; - public GUIStyle _submenuStyle; - internal Vector2 EditorMenuSize = new Vector2(600, 900); - bool menuOpen = false; - static bool openMenuOnPause; - - // Menu params - internal static IModBehaviour loadedMod = null; - internal Dictionary loadedConfigFiles = new Dictionary(); - private bool saveButtonUnlocked = false; - private Vector2 recentModListScrollPosition = Vector2.zero; - - // Submenus - private List submenus; - private int activeSubmenu = 0; - - private static DebugMenu _instance; - - internal static JsonSerializerSettings jsonSettings = new JsonSerializerSettings - { - NullValueHandling = NullValueHandling.Ignore, - DefaultValueHandling = DefaultValueHandling.Ignore, - Formatting = Formatting.Indented, - }; - - private void Awake() - { - submenus = new List() - { - new DebugMenuPropPlacer(), - new DebugMenuShipLogs(), - }; - - submenus.ForEach((submenu) => submenu.OnAwake(this)); - } - - private void Start() - { - _instance = this; - - Main.Instance.ModHelper.MenuHelper.PauseMenuManager.PauseMenuOpened += OnOpenMenu; - Main.Instance.ModHelper.MenuHelper.PauseMenuManager.PauseMenuClosed += OnCloseMenu; - Main.Instance.OnChangeStarSystem.AddListener(OnChangeStarSystem); - - InitMenu(); - - if (loadedMod != null) - { - LoadMod(loadedMod); - } - } - - public void OnDestroy() - { - Main.Instance.ModHelper.MenuHelper.PauseMenuManager.PauseMenuOpened -= OnOpenMenu; - Main.Instance.ModHelper.MenuHelper.PauseMenuManager.PauseMenuClosed -= OnCloseMenu; - Main.Instance.OnChangeStarSystem.RemoveListener(OnChangeStarSystem); - } - - private void OnChangeStarSystem(string _) - { - if (saveButtonUnlocked) - { - SaveLoadedConfigsForRecentSystem(); - saveButtonUnlocked = false; - } - } - - public static void InitializePauseMenu(IPauseMenuManager pauseMenu) - { - pauseMenuButton = pauseMenu.MakeSimpleButton(TranslationHandler.GetTranslation("Toggle Dev Tools Menu", TranslationHandler.TextType.UI).ToUpperFixed(), 3, true); - _instance?.InitMenu(); - } - - public static void UpdatePauseMenuButton() - { - pauseMenuButton?.SetButtonVisible(Main.Debug); - } - - private void OnOpenMenu() { menuOpen = openMenuOnPause; } - - private void ToggleMenu() { menuOpen = !menuOpen; openMenuOnPause = !openMenuOnPause; } - - private void OnCloseMenu() { menuOpen = false; } - - private void OnGUI() - { - if (!menuOpen) return; - if (!Main.Debug) return; - - Vector2 menuPosition = new Vector2(10, 40); - - GUILayout.BeginArea(new Rect(menuPosition.x, menuPosition.y, EditorMenuSize.x, EditorMenuSize.y), _editorMenuStyle); - - // Continue working on existing mod - GUILayout.Label("Name of your mod"); - if (loadedMod == null) - { - recentModListScrollPosition = GUILayout.BeginScrollView(recentModListScrollPosition, GUILayout.Width(EditorMenuSize.x), GUILayout.Height(100)); - - foreach (var mod in Main.MountedAddons) - { - if (GUILayout.Button(mod.ModHelper.Manifest.UniqueName)) - { - LoadMod(mod); - submenus[activeSubmenu].GainActive(); - } - } - - GUILayout.EndScrollView(); - } - else - { - GUILayout.Label(loadedMod.ModHelper.Manifest.UniqueName); - } - - GUILayout.Space(5); - - // Save your work - if (loadedMod != null) - { - GUILayout.BeginHorizontal(); - if (GUILayout.Button(saveButtonUnlocked ? " O " : " | ", GUILayout.ExpandWidth(false))) - { - saveButtonUnlocked = !saveButtonUnlocked; - } - GUI.enabled = saveButtonUnlocked; - if (GUILayout.Button("Update your mod's configs")) - { - SaveLoadedConfigsForRecentSystem(); - saveButtonUnlocked = false; - } - GUI.enabled = true; - GUILayout.EndHorizontal(); - - if (GUILayout.Button("Print config changes for your mod")) - { - PrintLoadedConfigChangesForRecentSystem(); - saveButtonUnlocked = false; - } - } - - GUILayout.Space(20); - - // Draw submenu stuff - if (loadedMod != null) - { - GUILayout.BeginHorizontal(_tabBarStyle); - GUILayout.Space(5); - for (int i = 0; i < submenus.Count; i++) - { - GUI.enabled = i != activeSubmenu; - var style = i == activeSubmenu ? _submenuStyle : _tabBarStyle; - if (GUILayout.Button(" " + submenus[i].SubmenuName() + " ", style, GUILayout.ExpandWidth(false))) - { - GUI.enabled = true; - submenus[activeSubmenu].LoseActive(); - activeSubmenu = i; - submenus[activeSubmenu].GainActive(); - - } - GUI.enabled = true; - - // if (i < submenus.Count-1) GUILayout.Label("|", GUILayout.ExpandWidth(false)); - } - GUILayout.EndHorizontal(); - - GUILayout.BeginVertical(_submenuStyle); - GUILayout.Space(10); - submenus[activeSubmenu].OnGUI(this); - GUILayout.EndVertical(); - } - - GUILayout.EndArea(); - } - - private void LoadMod(IModBehaviour mod) - { - loadedMod = mod; - submenus.ForEach(submenu => submenu.OnBeginLoadMod(this)); - - var folder = loadedMod.ModHelper.Manifest.ModFolderPath; - - var bodiesForThisMod = Main.BodyDict.Values.SelectMany(x => x).Where(x => x.Mod == loadedMod).ToList(); - foreach (var body in bodiesForThisMod) - { - if (body.RelativePath == null) - { - NHLogger.LogWarning($"Error loading config for {body.Config.name} in {body.Config.starSystem}"); - continue; - } - - loadedConfigFiles[Path.Combine(folder, body.RelativePath)] = body.Config; - submenus.ForEach(submenu => submenu.LoadConfigFile(this, body.Config)); - } - } - - private void SaveLoadedConfigsForRecentSystem() - { - submenus.ForEach(submenu => submenu.PreSave(this)); - - var backupFolderName = $"configBackups\\{DateTime.Now.ToString("yyyyMMddTHHmmss")}\\"; - - NHLogger.Log($"Potentially saving {loadedConfigFiles.Keys.Count} files"); - - foreach (var filePath in loadedConfigFiles.Keys) - { - NHLogger.LogVerbose($"Possibly Saving... {loadedConfigFiles[filePath].name} @ {filePath}"); - - if (loadedConfigFiles[filePath].starSystem != Main.Instance.CurrentStarSystem) continue; - - var relativePath = filePath.Replace(loadedMod.ModHelper.Manifest.ModFolderPath, ""); - - var json = loadedConfigFiles[filePath].ToSerializedJson(); - - try - { - var path = Path.Combine(loadedMod.ModHelper.Manifest.ModFolderPath, backupFolderName, relativePath); - NHLogger.LogVerbose($"Backing up... {relativePath} to {path}"); - var oldPath = Path.Combine(loadedMod.ModHelper.Manifest.ModFolderPath, relativePath); - var directoryName = Path.GetDirectoryName(path); - Directory.CreateDirectory(directoryName); - - if (File.Exists(oldPath)) - File.WriteAllBytes(path, File.ReadAllBytes(oldPath)); - else - File.WriteAllText(path, json); - } - catch (Exception e) - { - NHLogger.LogError($"Failed to save backup file {backupFolderName}{relativePath}:\n{e}"); - } - - try - { - NHLogger.Log($"Saving... {relativePath} to {filePath}"); - var path = Path.Combine(loadedMod.ModHelper.Manifest.ModFolderPath, relativePath); - var directoryName = Path.GetDirectoryName(path); - Directory.CreateDirectory(directoryName); - - File.WriteAllText(path, json); - } - catch (Exception e) - { - NHLogger.LogError($"Failed to save file {relativePath}:\n{e}"); - } - } - } - - private void PrintLoadedConfigChangesForRecentSystem() - { - foreach(DebugSubmenu menu in submenus) - { - menu.PrintNewConfigSection(this); - } - } - - private void InitMenu() - { - if (_editorMenuStyle != null) return; - - UpdatePauseMenuButton(); - - // TODO: figure out how to clear this event list so that we don't pile up useless instances of the DebugMenu that can't get garbage collected - pauseMenuButton.OnSubmitAction += ToggleMenu; - - submenus.ForEach(submenu => submenu.OnInit(this)); - - _editorMenuStyle = new GUIStyle - { - normal = - { - background = ImageUtilities.MakeSolidColorTexture(1, 1, Color.black) - } - }; - - _tabBarStyle = new GUIStyle - { - normal = - { - background = ImageUtilities.MakeSolidColorTexture(1, 1, new Color(0.2f, 0.2f, 0.2f, 1)), - textColor = Color.white - }, - fontStyle = FontStyle.Bold, - fontSize = 16 - }; - - _submenuStyle = new GUIStyle - { - normal = - { - background = ImageUtilities.MakeSolidColorTexture(1, 1, new Color(0.1f, 0.1f, 0.1f, 1)), - textColor = Color.white - }, - fontStyle = FontStyle.Bold, - fontSize = 16 - }; - } - } -} diff --git a/NewHorizons/Utility/DebugTools/Menu/DebugMenuPropPlacer.cs b/NewHorizons/Utility/DebugTools/Menu/DebugMenuPropPlacer.cs deleted file mode 100644 index 74d671693..000000000 --- a/NewHorizons/Utility/DebugTools/Menu/DebugMenuPropPlacer.cs +++ /dev/null @@ -1,401 +0,0 @@ -using HarmonyLib; -using NewHorizons.External.Configs; -using NewHorizons.External.Modules; -using NewHorizons.Utility.Geometry; -using NewHorizons.Utility.OWML; -using NewHorizons.Utility.OuterWilds; -using Newtonsoft.Json; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; - -namespace NewHorizons.Utility.DebugTools.Menu -{ - class DebugMenuPropPlacer : DebugSubmenu - { - private HashSet favoriteProps = new HashSet(); - private List propsLoadedFromConfig = new List(); - public static readonly char separatorCharacter = '☧'; // since no chars are illegal in game object names, I picked one that's extremely unlikely to be used to be a separator - private static readonly string favoritePropsPlayerPrefKey = "FavoriteProps"; - - internal DebugPropPlacer _dpp; - internal DebugRaycaster _drc; - - // misc - private GameObject mostRecentlyPlacedProp; - private Vector3 mostRecentlyPlacedPropSphericalPos; - - // menu params - private Vector2 recentPropsScrollPosition = Vector2.zero; - private bool propsCollapsed = false; - private bool propPositioningCollapsed = false; - private Vector3 propPosDelta = new Vector3(0.1f, 0.1f, 0.1f); - private Vector3 propRotDelta = new Vector3(0.1f, 0.1f, 0.1f); - private Vector3 propSphericalPosDelta = new Vector3(0.1f, 0.1f, 0.1f); - private float propRotationAboutLocalUpDelta = 0.1f; - private float propScaleDelta = 0.1f; - - internal override string SubmenuName() - { - return "Prop Placer"; - } - - internal override void OnInit(DebugMenu menu) - { - _dpp = menu.GetComponent(); - _drc = menu.GetComponent(); - } - - internal override void OnAwake(DebugMenu menu) - { - _dpp = menu.GetComponent(); - _drc = menu.GetComponent(); - LoadFavoriteProps(); - } - - internal override void OnBeginLoadMod(DebugMenu debugMenu) - { - - } - - internal override void GainActive() - { - DebugPropPlacer.active = true; - } - - internal override void LoseActive() - { - DebugPropPlacer.active = false; - } - - internal override void LoadConfigFile(DebugMenu menu, PlanetConfig config) - { - _dpp.FindAndRegisterPropsFromConfig(config, propsLoadedFromConfig); - } - - private void LoadFavoriteProps() - { - string favoritePropsPlayerPref = PlayerPrefs.GetString(favoritePropsPlayerPrefKey); - - if (favoritePropsPlayerPref == null || favoritePropsPlayerPref == "") return; - - var favoritePropPaths = favoritePropsPlayerPref.Split(separatorCharacter); - foreach (string favoriteProp in favoritePropPaths) - { - DebugPropPlacer.RecentlyPlacedProps.Add(favoriteProp); - this.favoriteProps.Add(favoriteProp); - } - } - - internal override void OnGUI(DebugMenu menu) - { - // - // DebugPropPlacer - // - GUILayout.Label("Currently placing: "); - _dpp.SetCurrentObject(GUILayout.TextArea(_dpp.currentObject)); - - GUILayout.Space(5); - GUILayout.Space(5); - - - var arrow = propsCollapsed ? " > " : " v "; - if (GUILayout.Button(arrow + "Recently placed objects", menu._tabBarStyle)) propsCollapsed = !propsCollapsed; - if (!propsCollapsed) DrawPropsList(menu); - GUILayout.Space(5); - - if (_dpp.mostRecentlyPlacedPropGO != null) - { - arrow = propPositioningCollapsed ? " > " : " v "; - if (GUILayout.Button(arrow + "Position last placed prop", menu._tabBarStyle)) propPositioningCollapsed = !propPositioningCollapsed; - if (!propPositioningCollapsed) DrawPropsAdustmentControls(menu); - } - } - - private void DrawPropsAdustmentControls(DebugMenu menu) - { - var propPath = _dpp.mostRecentlyPlacedPropPath; - var propPathElements = propPath[propPath.Length - 1] == '/' - ? propPath.Substring(0, propPath.Length - 1).Split('/') - : propPath.Split('/'); - string propName = propPathElements[propPathElements.Length - 1]; - GUILayout.Label($"Reposition {propName}: "); - - - Vector3 latestPropPosDelta = VectorInput(_dpp.mostRecentlyPlacedPropGO.transform.localPosition, propPosDelta, out propPosDelta, "x", "y", "z"); - _dpp.mostRecentlyPlacedPropGO.transform.localPosition += latestPropPosDelta; - if (latestPropPosDelta != Vector3.zero) mostRecentlyPlacedPropSphericalPos = DeltaSphericalPosition(mostRecentlyPlacedProp, Vector3.zero); - - //GUILayout.Space(5); - //Vector3 latestPropRotDelta = VectorInput(_dpp.mostRecentlyPlacedPropGO.transform.localEulerAngles, propRotDelta, out propRotDelta, "x", "y", "z"); - //_dpp.mostRecentlyPlacedPropGO.transform.localEulerAngles += latestPropRotDelta; - - GUILayout.Space(5); - GUILayout.Space(5); - - - if (mostRecentlyPlacedProp != _dpp.mostRecentlyPlacedPropGO) - { - mostRecentlyPlacedProp = _dpp.mostRecentlyPlacedPropGO; - mostRecentlyPlacedPropSphericalPos = DeltaSphericalPosition(mostRecentlyPlacedProp, Vector3.zero); - } - - Vector3 latestPropSphericalPosDelta = VectorInput(mostRecentlyPlacedPropSphericalPos, propSphericalPosDelta, out propSphericalPosDelta, "lat ", "lon ", "height"); - if (latestPropSphericalPosDelta != Vector3.zero) - { - SetSphericalPosition(mostRecentlyPlacedProp, mostRecentlyPlacedPropSphericalPos + latestPropSphericalPosDelta); - mostRecentlyPlacedPropSphericalPos = mostRecentlyPlacedPropSphericalPos + latestPropSphericalPosDelta; - } - - GUILayout.Space(5); - GUILayout.Space(5); - - - GUILayout.BeginHorizontal(); - GUILayout.Label("Rotate about up: ", GUILayout.Width(50)); - float deltaRot = 0; - if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) deltaRot += propRotationAboutLocalUpDelta; - if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) deltaRot -= propRotationAboutLocalUpDelta; - propRotationAboutLocalUpDelta = float.Parse(GUILayout.TextField(propRotationAboutLocalUpDelta + "", GUILayout.Width(100))); - - if (deltaRot != 0) - { - Transform astroObject = mostRecentlyPlacedProp.transform.parent.parent; - mostRecentlyPlacedProp.transform.RotateAround(mostRecentlyPlacedProp.transform.position, mostRecentlyPlacedProp.transform.up, deltaRot); - } - GUILayout.EndHorizontal(); - - - GUILayout.BeginHorizontal(); - GUILayout.Label("scale: ", GUILayout.Width(50)); - var scaleString = mostRecentlyPlacedProp.transform.localScale.x + ""; - var newScaleString = GUILayout.TextField(scaleString, GUILayout.Width(50)); - var parsedScaleString = mostRecentlyPlacedProp.transform.localScale.x; try { parsedScaleString = float.Parse(newScaleString); } catch { } - float deltaScale = scaleString == newScaleString ? 0 : parsedScaleString - mostRecentlyPlacedProp.transform.localScale.x; - if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) deltaScale += propScaleDelta; - if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) deltaScale -= propScaleDelta; - propScaleDelta = float.Parse(GUILayout.TextField(propScaleDelta + "", GUILayout.Width(100))); - - if (deltaScale != 0) - { - float newScale = mostRecentlyPlacedProp.transform.localScale.x + deltaScale; - mostRecentlyPlacedProp.transform.localScale = new Vector3(newScale, newScale, newScale); - } - GUILayout.EndHorizontal(); - } - private Vector3 DeltaSphericalPosition(GameObject prop, Vector3 deltaSpherical) - { - Transform astroObject = prop.transform.parent.parent; - Transform sector = prop.transform.parent; - Vector3 originalLocalPos = astroObject.InverseTransformPoint(prop.transform.position); // parent is the sector, this gives localPos relative to the astroobject (what the DetailBuilder asks for) - Vector3 sphericalPos = CoordinateUtilities.CartesianToSpherical(originalLocalPos); - - if (deltaSpherical == Vector3.zero) return sphericalPos; - Vector3 newSpherical = sphericalPos + deltaSpherical; - - Vector3 finalLocalPosition = CoordinateUtilities.SphericalToCartesian(newSpherical); - Vector3 finalAbsolutePosition = astroObject.TransformPoint(finalLocalPosition); - prop.transform.localPosition = prop.transform.parent.InverseTransformPoint(finalAbsolutePosition); - // prop.transform.rotation = Quaternion.FromToRotation(originalLocalPos.normalized, finalLocalPosition.normalized) * prop.transform.rotation; - - // first, rotate the object by the astroObject's rotation, that means anything afterwards is relative to this rotation (ie, we can pretend the astroObject has 0 rotation) - // then, rotate by the difference in position, basically accounting for the curvature of a sphere - // then re-apply the local rotations of the hierarchy down to the prop (apply the sector local rotation, then the prop local rotation) - - // since we're doing all rotation relative to the astro object, we start with its absolute rotation - // then we apply the rotation about the astroobject using FromTooRotation - // then we reapply the local rotations down through the hierarchy - prop.transform.rotation = astroObject.rotation * Quaternion.FromToRotation(originalLocalPos.normalized, finalLocalPosition.normalized) * sector.localRotation * prop.transform.localRotation; - - return newSpherical; - } - - // DB_EscapePodDimension_Body/Sector_EscapePodDimension/Interactables_EscapePodDimension/InnerWarp_ToAnglerNest - // DB_ExitOnlyDimension_Body/Sector_ExitOnlyDimension/Interactables_ExitOnlyDimension/InnerWarp_ToExitOnly // need to change the colors - // DB_HubDimension_Body/Sector_HubDimension/Interactables_HubDimension/InnerWarp_ToCluster // need to delete the child "Signal_Harmonica" - - private Vector3 SetSphericalPosition(GameObject prop, Vector3 newSpherical) - { - Transform astroObject = prop.transform.parent.parent; - Transform sector = prop.transform.parent; - Vector3 originalLocalPos = astroObject.InverseTransformPoint(prop.transform.position); // parent is the sector, this gives localPos relative to the astroobject (what the DetailBuilder asks for) - Vector3 sphericalPos = CoordinateUtilities.CartesianToSpherical(originalLocalPos); - - if (newSpherical == sphericalPos) return sphericalPos; - - Vector3 finalLocalPosition = CoordinateUtilities.SphericalToCartesian(newSpherical); - Vector3 finalAbsolutePosition = astroObject.TransformPoint(finalLocalPosition); - prop.transform.localPosition = prop.transform.parent.InverseTransformPoint(finalAbsolutePosition); - NHLogger.Log("new position: " + prop.transform.localPosition); - - var onlyChangingRAndRIsNegative = false; - - // first, rotate the object by the astroObject's rotation, that means anything afterwards is relative to this rotation (ie, we can pretend the astroObject has 0 rotation) - // then, rotate by the difference in position, basically accounting for the curvature of a sphere - // then re-apply the local rotations of the hierarchy down to the prop (apply the sector local rotation, then the prop local rotation) - - // since we're doing all rotation relative to the astro object, we start with its absolute rotation - // then we apply the rotation about the astroobject using FromTooRotation - // then we reapply the local rotations down through the hierarchy - Vector3 originalLocalPos_ForcedPositiveR = CoordinateUtilities.SphericalToCartesian(new Vector3(sphericalPos.x, sphericalPos.y, Mathf.Abs(sphericalPos.z))); - Vector3 finalLocalPos_ForcedPositiveR = CoordinateUtilities.SphericalToCartesian(new Vector3(newSpherical.x, newSpherical.y, Mathf.Abs(newSpherical.z))); - if (!onlyChangingRAndRIsNegative) prop.transform.rotation = astroObject.rotation * Quaternion.FromToRotation(originalLocalPos_ForcedPositiveR.normalized, finalLocalPos_ForcedPositiveR.normalized) * sector.localRotation * prop.transform.localRotation; - - return newSpherical; - } - - private Vector3 VectorInput(Vector3 input, Vector3 deltaControls, out Vector3 deltaControlsOut, string labelX, string labelY, string labelZ) - { - var dx = deltaControls.x; - var dy = deltaControls.y; - var dz = deltaControls.z; - - // x - GUILayout.BeginHorizontal(); - GUILayout.Label(labelX + ": ", GUILayout.Width(50)); - var xString = input.x + ""; - var newXString = GUILayout.TextField(xString, GUILayout.Width(50)); - var parsedXString = input.x; try { parsedXString = float.Parse(newXString); } catch { } - float deltaX = xString == newXString ? 0 : parsedXString - input.x; - if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) deltaX += dx; - if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) deltaX -= dx; - dx = float.Parse(GUILayout.TextField(dx + "", GUILayout.Width(100))); - GUILayout.EndHorizontal(); - - // y - GUILayout.BeginHorizontal(); - GUILayout.Label(labelY + ": ", GUILayout.Width(50)); - var yString = input.y + ""; - var newYString = GUILayout.TextField(yString, GUILayout.Width(50)); - var parsedYString = input.y; try { parsedYString = float.Parse(newYString); } catch { } - float deltaY = yString == newYString ? 0 : parsedYString - input.y; - if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) deltaY += dy; - if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) deltaY -= dy; - dy = float.Parse(GUILayout.TextField(dy + "", GUILayout.Width(100))); - GUILayout.EndHorizontal(); - - // z - GUILayout.BeginHorizontal(); - GUILayout.Label(labelZ + ": ", GUILayout.Width(50)); - var zString = input.z + ""; - var newZString = GUILayout.TextField(zString, GUILayout.Width(50)); - var parsedZString = input.z; try { parsedZString = float.Parse(newZString); } catch { } - float deltaZ = zString == newZString ? 0 : parsedZString - input.z; - if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) deltaZ += dz; - if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) deltaZ -= dz; - dz = float.Parse(GUILayout.TextField(dz + "", GUILayout.Width(100))); - GUILayout.EndHorizontal(); - - deltaControlsOut = new Vector3(dx, dy, dz); - return new Vector3(deltaX, deltaY, deltaZ); - } - - private void DrawPropsList(DebugMenu menu) - { - // List of recently placed objects - recentPropsScrollPosition = GUILayout.BeginScrollView(recentPropsScrollPosition, GUILayout.Width(menu.EditorMenuSize.x), GUILayout.Height(500)); - foreach (string propPath in DebugPropPlacer.RecentlyPlacedProps) - { - GUILayout.BeginHorizontal(); - - var propPathElements = propPath[propPath.Length - 1] == '/' - ? propPath.Substring(0, propPath.Length - 1).Split('/') - : propPath.Split('/'); - string propName = propPathElements[propPathElements.Length - 1]; - - string favoriteButtonIcon = favoriteProps.Contains(propPath) ? "★" : "☆"; - if (GUILayout.Button(favoriteButtonIcon, GUILayout.ExpandWidth(false))) - { - if (favoriteProps.Contains(propPath)) - { - favoriteProps.Remove(propPath); - } - else - { - favoriteProps.Add(propPath); - } - - string[] favoritePropsArray = favoriteProps.ToArray(); - PlayerPrefs.SetString(favoritePropsPlayerPrefKey, string.Join(separatorCharacter + "", favoritePropsArray)); - } - - if (GUILayout.Button(propName)) - { - _dpp.SetCurrentObject(propPath); - } - - GUILayout.EndHorizontal(); - } - GUILayout.EndScrollView(); - } - - internal override void PreSave(DebugMenu menu) - { - UpdateLoadedConfigsForRecentSystem(menu); - } - - private void UpdateLoadedConfigsForRecentSystem(DebugMenu menu) - { - var newDetails = _dpp.GetPropsConfigByBody(); - - var newDetailsCountsByPlanet = string.Join(", ", newDetails.Keys.Select(x => $"{x.name} ({newDetails[x].Length})")); - NHLogger.Log($"Updating config files. New Details Counts by planet: {newDetailsCountsByPlanet}"); - - var planetToConfigPath = new Dictionary(); - - // Get all configs - foreach (var filePath in menu.loadedConfigFiles.Keys) - { - NHLogger.LogVerbose($"Potentially updating copy of config at {filePath}"); - NHLogger.LogVerbose($"{menu.loadedConfigFiles[filePath].name} {AstroObjectLocator.GetAstroObject(menu.loadedConfigFiles[filePath].name)?.name}"); - NHLogger.LogVerbose($"{menu.loadedConfigFiles[filePath].name}"); - - if (menu.loadedConfigFiles[filePath].starSystem != Main.Instance.CurrentStarSystem) return; - if (menu.loadedConfigFiles[filePath].name == null || AstroObjectLocator.GetAstroObject(menu.loadedConfigFiles[filePath].name) == null) - { - NHLogger.LogWarning("Failed to update copy of config at " + filePath); - continue; - } - - var astroObject = AstroObjectLocator.GetAstroObject(menu.loadedConfigFiles[filePath].name); - planetToConfigPath[astroObject] = filePath; - - if (!newDetails.ContainsKey(astroObject)) continue; - - if (menu.loadedConfigFiles[filePath].Props == null) menu.loadedConfigFiles[filePath].Props = new PropModule(); - menu.loadedConfigFiles[filePath].Props.details = newDetails[astroObject]; - - NHLogger.Log($"Successfully updated copy of config file for {astroObject.name}"); - } - - // find all new planets that do not yet have config paths - var planetsThatDoNotHaveConfigFiles = newDetails.Keys.Where(x => !planetToConfigPath.ContainsKey(x)).ToList(); - foreach (var astroObject in planetsThatDoNotHaveConfigFiles) - { - NHLogger.Log("Fabricating new config file for " + astroObject.name); - - var filepath = $"planets/{Main.Instance.CurrentStarSystem}/{astroObject.name}.json"; - - var config = new PlanetConfig(); - config.starSystem = Main.Instance.CurrentStarSystem; - config.name = astroObject._name == AstroObject.Name.CustomString ? astroObject.GetCustomName() : astroObject._name.ToString(); - config.Props = new PropModule(); - config.Props.details = newDetails[astroObject]; - - menu.loadedConfigFiles[filepath] = config; - } - } - - internal override void PrintNewConfigSection(DebugMenu menu) - { - foreach (var body in _dpp.GetPropsConfigByBody()) - { - var json = body.Value.Join( - detail => "\t" + JsonConvert.SerializeObject(detail, DebugMenu.jsonSettings), - ",\n" - ); - NHLogger.Log($"{body.Key.name} ({body.Value.Length})\n[\n{json}\n]"); - } - } - } -} diff --git a/NewHorizons/Utility/DebugTools/Menu/DebugMenuShipLogs.cs b/NewHorizons/Utility/DebugTools/Menu/DebugMenuShipLogs.cs deleted file mode 100644 index 77053a883..000000000 --- a/NewHorizons/Utility/DebugTools/Menu/DebugMenuShipLogs.cs +++ /dev/null @@ -1,81 +0,0 @@ -using HarmonyLib; -using NewHorizons.External.Configs; -using NewHorizons.External.Modules; -using NewHorizons.External.SerializableData; -using NewHorizons.Utility.OWML; -using Newtonsoft.Json; -using System.Linq; -using UnityEngine; - -namespace NewHorizons.Utility.DebugTools.Menu -{ - class DebugMenuShipLogs : DebugSubmenu - { - string entryPositionsText = ""; - - internal override void GainActive() - { - - } - internal override void LoseActive() - { - - } - - internal override void LoadConfigFile(DebugMenu menu, PlanetConfig config) - { - - } - - - internal override void OnAwake(DebugMenu menu) - { - } - - internal override void OnBeginLoadMod(DebugMenu debugMenu) - { - } - - private string GetEntryPositionsJSON() => - Resources - .FindObjectsOfTypeAll() - .Join( - entry => JsonConvert.SerializeObject(new ShipLogModule.EntryPositionInfo - { - id = entry.name, - position = new MVector2(entry.transform.localPosition.x, entry.transform.localPosition.y) - }, DebugMenu.jsonSettings), - ",\n" - ); - - internal override void OnGUI(DebugMenu menu) - { - if (GUILayout.Button("Print Ship Log Positions")) - { - entryPositionsText = GetEntryPositionsJSON(); - } - - GUILayout.TextArea(entryPositionsText); - } - - internal override void OnInit(DebugMenu menu) - { - - } - - internal override void PreSave(DebugMenu menu) - { - - } - - internal override string SubmenuName() - { - return "Ship Log"; - } - - internal override void PrintNewConfigSection(DebugMenu menu) - { - NHLogger.Log(GetEntryPositionsJSON()); - } - } -} diff --git a/NewHorizons/Utility/DebugTools/Menu/DebugSubmenu.cs b/NewHorizons/Utility/DebugTools/Menu/DebugSubmenu.cs deleted file mode 100644 index 0bcc90993..000000000 --- a/NewHorizons/Utility/DebugTools/Menu/DebugSubmenu.cs +++ /dev/null @@ -1,21 +0,0 @@ -using NewHorizons.External.Configs; - -namespace NewHorizons.Utility.DebugTools.Menu -{ - abstract class DebugSubmenu - { - internal abstract void OnAwake(DebugMenu menu); - internal abstract void OnGUI(DebugMenu menu); - internal abstract void PrintNewConfigSection(DebugMenu menu); - internal abstract void PreSave(DebugMenu menu); - internal abstract void OnInit(DebugMenu menu); - internal abstract void LoadConfigFile(DebugMenu menu, PlanetConfig config); - internal abstract void OnBeginLoadMod(DebugMenu debugMenu); - - internal abstract string SubmenuName(); - - internal abstract void GainActive(); - internal abstract void LoseActive(); - - } -} diff --git a/NewHorizons/Utility/Files/AssetBundleUtilities.cs b/NewHorizons/Utility/Files/AssetBundleUtilities.cs index 12083f5b7..87170770b 100644 --- a/NewHorizons/Utility/Files/AssetBundleUtilities.cs +++ b/NewHorizons/Utility/Files/AssetBundleUtilities.cs @@ -1,5 +1,6 @@ using NewHorizons.Utility.OWML; using OWML.Common; +using OWML.ModHelper; using System; using System.Collections.Generic; using System.IO; @@ -14,6 +15,25 @@ public static class AssetBundleUtilities private static readonly List _loadingBundles = new(); + public static AssetBundle NHAssetBundle { get; private set; } + public static AssetBundle NHPrivateAssetBundle { get; private set; } + + static AssetBundleUtilities() + { + NHAssetBundle = LoadRequiredBundle("Assets/bundles/newhorizons_public"); + NHPrivateAssetBundle = LoadRequiredBundle("Assets/bundles/newhorizons_private"); + } + + private static AssetBundle LoadRequiredBundle(string path) + { + var bundle = Main.Instance.ModHelper.Assets.LoadBundle(path); + if (bundle == null) + { + NHLogger.LogError($"Couldn't find [{Path.GetFileName(path)}]: Some features of NH will not work."); + } + return bundle; + } + public static void ClearCache() { foreach (var pair in AssetBundles) diff --git a/NewHorizons/Utility/Files/ImageUtilities.cs b/NewHorizons/Utility/Files/ImageUtilities.cs index fa4bd87e0..63f9d8da3 100644 --- a/NewHorizons/Utility/Files/ImageUtilities.cs +++ b/NewHorizons/Utility/Files/ImageUtilities.cs @@ -112,8 +112,8 @@ public static void ClearCache() } /// - /// used specifically for projected slides. - /// also adds a border (to prevent weird visual bug) and makes the texture linear (otherwise the projected image is too bright). + /// used to fix projection slides + /// adds a border (to prevent weird visual bug) and does some magic with gamma correction and inverting /// public static Texture2D InvertSlideReel(IModBehaviour mod, Texture2D texture, string originalPath) { @@ -146,13 +146,20 @@ public static Texture2D InvertSlideReel(IModBehaviour mod, Texture2D texture, st } else { - pixels[i].r = 1f - pixels[i].r; - pixels[i].g = 1f - pixels[i].g; - pixels[i].b = 1f - pixels[i].b; + // convert gamma to linear, then invert + // outer wilds will invert, then convert linear to gamma (reversing the process) + pixels[i].r = 1f - Mathf.GammaToLinearSpace(pixels[i].r); + pixels[i].g = 1f - Mathf.GammaToLinearSpace(pixels[i].g); + pixels[i].b = 1f - Mathf.GammaToLinearSpace(pixels[i].b); } } - var newTexture = new Texture2D(texture.width, texture.height, texture.format, texture.mipmapCount != 1, true); + // making this linear makes vanilla reel atlas match vanilla reels. + // however, it also makes it darker than the source image. + // for custom slides this is unintuitive. + // people will be like "wtf why is it darker than my image?" + // see https://github.com/Outer-Wilds-New-Horizons/new-horizons/pull/986#issuecomment-2449223761 for comparisons + var newTexture = new Texture2D(texture.width, texture.height, texture.format, texture.mipmapCount != 1); newTexture.name = key; newTexture.SetPixels(pixels); newTexture.Apply(); diff --git a/NewHorizons/Utility/Geometry/BoundsUtilities.cs b/NewHorizons/Utility/Geometry/BoundsUtilities.cs new file mode 100644 index 000000000..b251a6d79 --- /dev/null +++ b/NewHorizons/Utility/Geometry/BoundsUtilities.cs @@ -0,0 +1,76 @@ +using System.Linq; +using UnityEngine; + +namespace NewHorizons.Utility.Geometry; + +public static class BoundsUtilities +{ + private struct BoxShapeReciever + { + public MeshFilter meshFilter; + public SkinnedMeshRenderer skinnedMeshRenderer; + public GameObject gameObject; + } + + public static void AddBoundsVisibility(GameObject gameObject) + { + var meshFilters = gameObject.GetComponentsInChildren(); + var skinnedMeshRenderers = gameObject.GetComponentsInChildren(); + + var boxShapeRecievers = meshFilters + .Select(meshFilter => new BoxShapeReciever() { meshFilter = meshFilter, gameObject = meshFilter.gameObject }) + .Concat( + skinnedMeshRenderers.Select(skinnedMeshRenderer => new BoxShapeReciever() { skinnedMeshRenderer = skinnedMeshRenderer, gameObject = skinnedMeshRenderer.gameObject }) + ) + .ToList(); + + foreach (var boxshapeReciever in boxShapeRecievers) + { + var box = boxshapeReciever.gameObject.AddComponent(); + boxshapeReciever.gameObject.AddComponent(); + if (Main.Debug) + { + boxshapeReciever.gameObject.AddComponent(); + } + + var fixer = boxshapeReciever.gameObject.AddComponent(); + fixer.shape = box; + fixer.meshFilter = boxshapeReciever.meshFilter; + fixer.skinnedMeshRenderer = boxshapeReciever.skinnedMeshRenderer; + } + } + + public static Bounds GetBoundsOfSelfAndChildMeshes(GameObject gameObject) + { + var meshFilters = gameObject.GetComponentsInChildren(); + var corners = meshFilters.SelectMany(meshFilter => GetMeshCorners(meshFilter, gameObject)).ToList(); + + var bounds = new Bounds(corners[0], Vector3.zero); + corners.ForEach(bounds.Encapsulate); + + return bounds; + } + + public static Vector3[] GetMeshCorners(MeshFilter meshFilter, GameObject relativeTo = null) + { + var bounds = meshFilter.mesh.bounds; + + var localCorners = new Vector3[] + { + bounds.min, + bounds.max, + new Vector3(bounds.min.x, bounds.min.y, bounds.max.z), + new Vector3(bounds.min.x, bounds.max.y, bounds.min.z), + new Vector3(bounds.max.x, bounds.min.y, bounds.min.z), + new Vector3(bounds.min.x, bounds.max.y, bounds.max.z), + new Vector3(bounds.max.x, bounds.min.y, bounds.max.z), + new Vector3(bounds.max.x, bounds.max.y, bounds.min.z), + }; + + var globalCorners = localCorners.Select(meshFilter.transform.TransformPoint).ToArray(); + + if (relativeTo == null) return globalCorners; + + return globalCorners.Select(relativeTo.transform.InverseTransformPoint).ToArray(); + } +} diff --git a/NewHorizons/Utility/Geometry/BoxShapeFinder.cs b/NewHorizons/Utility/Geometry/BoxShapeFinder.cs new file mode 100644 index 000000000..ebdfd9e4e --- /dev/null +++ b/NewHorizons/Utility/Geometry/BoxShapeFinder.cs @@ -0,0 +1,43 @@ +using NewHorizons.Utility.OWML; +using UnityEngine; + +namespace NewHorizons.Utility.Geometry; + +internal class BoxShapeFixer : MonoBehaviour +{ + public BoxShape shape; + public MeshFilter meshFilter; + public SkinnedMeshRenderer skinnedMeshRenderer; + + public void Update() + { + if (meshFilter == null && skinnedMeshRenderer == null) + { + NHLogger.LogVerbose("Useless BoxShapeFixer, destroying"); DestroyImmediate(this); + } + + Mesh sharedMesh = null; + if (meshFilter != null) + { + sharedMesh = meshFilter.sharedMesh; + } + if (skinnedMeshRenderer != null) + { + sharedMesh = skinnedMeshRenderer.sharedMesh; + } + + if (sharedMesh == null) + { + return; + } + if (sharedMesh.bounds.size == Vector3.zero) + { + return; + } + + shape.size = sharedMesh.bounds.size; + shape.center = sharedMesh.bounds.center; + + DestroyImmediate(this); + } +} diff --git a/NewHorizons/Utility/Geometry/BoxShapeVisualizer.cs b/NewHorizons/Utility/Geometry/BoxShapeVisualizer.cs index 77dbf6cfd..039e7bdc0 100644 --- a/NewHorizons/Utility/Geometry/BoxShapeVisualizer.cs +++ b/NewHorizons/Utility/Geometry/BoxShapeVisualizer.cs @@ -4,16 +4,19 @@ namespace NewHorizons.Utility.Geometry { public class BoxShapeVisualizer : MonoBehaviour { - BoxShape box; + private BoxShape _box; - void Awake() + public void Awake() { - box = GetComponent(); + _box = GetComponent(); } - void OnRenderObject() + public void OnRenderObject() { - Popcron.Gizmos.Cube(transform.TransformPoint(box.center), transform.rotation, Vector3.Scale(box.size, transform.lossyScale)); + if (Main.Debug && Main.VisualizeQuantumObjects) + { + Popcron.Gizmos.Cube(transform.TransformPoint(_box.center), transform.rotation, Vector3.Scale(_box.size, transform.lossyScale)); + } } } } diff --git a/NewHorizons/default-config.json b/NewHorizons/default-config.json index e4b87a61f..4f3239c2e 100644 --- a/NewHorizons/default-config.json +++ b/NewHorizons/default-config.json @@ -16,6 +16,12 @@ "value": false, "tooltip": "Enables the debug raycast, visible quantum object colliders, and debug options menu." }, + "VisualizeQuantumObjects": { + "title": "Visualize Quantum Objects", + "type": "toggle", + "value": false, + "tooltip": "Draws boundaries around quantum objects when Debug mode is on." + }, "VerboseLogs": { "title": "Verbose Logs", "type": "toggle", diff --git a/NewHorizons/manifest.json b/NewHorizons/manifest.json index f8d4dec53..69de585e3 100644 --- a/NewHorizons/manifest.json +++ b/NewHorizons/manifest.json @@ -4,7 +4,7 @@ "author": "xen, Bwc9876, JohnCorby, MegaPiggy, Trifid, and friends", "name": "New Horizons", "uniqueName": "xen.NewHorizons", - "version": "1.23.0", + "version": "1.25.0", "owmlVersion": "2.12.1", "dependencies": [ "JohnCorby.VanillaFix", "xen.CommonCameraUtility", "dgarro.CustomShipLogModes" ], "conflicts": [ "PacificEngine.OW_CommonResources" ], diff --git a/SchemaExporter/SchemaExporter.cs b/SchemaExporter/SchemaExporter.cs index 9dd0b4599..00e37f024 100644 --- a/SchemaExporter/SchemaExporter.cs +++ b/SchemaExporter/SchemaExporter.cs @@ -85,8 +85,6 @@ private JsonSchema GetJsonSchema() schema.Definitions["NomaiTextType"].EnumerationNames.Remove("Cairn"); schema.Definitions["NomaiTextType"].Enumeration.Remove("cairnVariant"); schema.Definitions["NomaiTextType"].EnumerationNames.Remove("CairnVariant"); - schema.Definitions["QuantumGroupType"].Enumeration.Remove("FailedValidation"); - schema.Definitions["QuantumGroupType"].EnumerationNames.Remove("FailedValidation"); schema.Definitions["StellarRemnantType"].Enumeration.Remove("Pulsar"); schema.Definitions["StellarRemnantType"].EnumerationNames.Remove("Pulsar"); break; diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 6e7191ae9..f70ba5614 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -8,10 +8,10 @@ Thank you for your interest in contributing to NH Docs! We are excited to have y Pages in the NH docs are all markdown files. The folder with all the pages is in `src/content/docs`. -- `index.mdx` Is a special file that is the home page of the docs. This is a markdown X file that allows us to use Astro components in the markdown. -- `start-here` is the folder that contains all the pages for the start here section of the docs. -- `getting-started` is the folder that contains all the pages for the getting started section of the docs. -- `reference` is the folder that contains all the pages for the api section of the docs. +- `index.mdx` Is a special file that is the home page of the docs. This is a markdown X file that allows us to use Astro components in the markdown. +- `start-here` is the folder that contains all the pages for the start here section of the docs. +- `getting-started` is the folder that contains all the pages for the getting started section of the docs. +- `reference` is the folder that contains all the pages for the api section of the docs. Finally, the `schemas` folder contains all the schema pages. You might notice that the schema folder is not present in GitHub. This is because the schema pages are auto-generated from the schema files in `../NewHorizons/Schemas`. In order to edit these you need to edit the C# class they correspond to. More info in the main contributing document found one folder up. @@ -23,10 +23,10 @@ One thing to note is the section fenced with `---` at the top of each page. This If you open this folder (`docs` not the entire repo), VSCode should prompt you to install the recommended extensions. If it doesn't, you can install them manually. The recommended extensions are: -- astro-build.astro-vscode -- davidanson.vscode-markdownlint -- yzhang.markdown-all-in-one -- esbenp.prettier-vscode +- astro-build.astro-vscode +- davidanson.vscode-markdownlint +- yzhang.markdown-all-in-one +- esbenp.prettier-vscode ## How To Add Pages @@ -48,8 +48,8 @@ Your images will be automatically optimized when the site is built. If you want to get a local copy of the site running, you'll need a few programs -- [Node.js](https://nodejs.org/en/) -- [PNPM](https://pnpm.io/) +- [Node.js](https://nodejs.org/en/) +- [PNPM](https://pnpm.io/) Once you have these installed, you can run the following commands to get the site running locally: diff --git a/docs/package.json b/docs/package.json index cd4b9ff8c..a7c8ec9dd 100644 --- a/docs/package.json +++ b/docs/package.json @@ -12,18 +12,18 @@ "format": "prettier --write ." }, "dependencies": { - "@astrojs/starlight": "^0.24.2", - "astro": "4.10.2", + "@astrojs/starlight": "^0.30.3", + "astro": "5.1.3", "rehype-external-links": "^3.0.0", - "sharp": "^0.33.4" + "sharp": "^0.33.5" }, "devDependencies": { - "@apidevtools/json-schema-ref-parser": "^11.6.4", - "eslint": "^8.56.0", - "eslint-plugin-prettier": "^5.1.3", - "fast-xml-parser": "^4.4.0", - "prettier": "^3.3.2", - "prettier-plugin-astro": "^0.14.0", + "@apidevtools/json-schema-ref-parser": "^11.7.3", + "eslint": "^9.17.0", + "eslint-plugin-prettier": "^5.2.1", + "fast-xml-parser": "^4.5.1", + "prettier": "^3.4.2", + "prettier-plugin-astro": "^0.14.1", "xml-js": "^1.6.11" } } diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index adae6b5a8..7954ba136 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -1,768 +1,502 @@ -lockfileVersion: "6.0" +lockfileVersion: "9.0" settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - "@astrojs/starlight": - specifier: ^0.24.2 - version: 0.24.2(astro@4.10.2) - astro: - specifier: 4.10.2 - version: 4.10.2 - rehype-external-links: - specifier: ^3.0.0 - version: 3.0.0 - sharp: - specifier: ^0.33.4 - version: 0.33.4 - -devDependencies: - "@apidevtools/json-schema-ref-parser": - specifier: ^11.6.4 - version: 11.6.4 - eslint: - specifier: ^8.56.0 - version: 8.57.0 - eslint-plugin-prettier: - specifier: ^5.1.3 - version: 5.1.3(eslint@8.57.0)(prettier@3.3.2) - fast-xml-parser: - specifier: ^4.4.0 - version: 4.4.0 - prettier: - specifier: ^3.3.2 - version: 3.3.2 - prettier-plugin-astro: - specifier: ^0.14.0 - version: 0.14.0 - xml-js: - specifier: ^1.6.11 - version: 1.6.11 +importers: + .: + dependencies: + "@astrojs/starlight": + specifier: ^0.30.3 + version: 0.30.3(astro@5.1.3(rollup@4.30.0)(typescript@5.6.3)) + astro: + specifier: 5.1.3 + version: 5.1.3(rollup@4.30.0)(typescript@5.6.3) + rehype-external-links: + specifier: ^3.0.0 + version: 3.0.0 + sharp: + specifier: ^0.33.5 + version: 0.33.5 + devDependencies: + "@apidevtools/json-schema-ref-parser": + specifier: ^11.7.3 + version: 11.7.3 + eslint: + specifier: ^9.17.0 + version: 9.17.0 + eslint-plugin-prettier: + specifier: ^5.2.1 + version: 5.2.1(eslint@9.17.0)(prettier@3.4.2) + fast-xml-parser: + specifier: ^4.5.1 + version: 4.5.1 + prettier: + specifier: ^3.4.2 + version: 3.4.2 + prettier-plugin-astro: + specifier: ^0.14.1 + version: 0.14.1 + xml-js: + specifier: ^1.6.11 + version: 1.6.11 packages: - /@ampproject/remapping@2.3.0: + "@apidevtools/json-schema-ref-parser@11.7.3": resolution: { - integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - } - engines: { node: ">=6.0.0" } - dependencies: - "@jridgewell/gen-mapping": 0.3.5 - "@jridgewell/trace-mapping": 0.3.25 - dev: false - - /@apidevtools/json-schema-ref-parser@11.6.4: - resolution: - { - integrity: sha512-9K6xOqeevacvweLGik6LnZCb1fBtCOSIWQs8d096XGeqoLKC33UVMGz9+77Gw44KvbH4pKcQPWo4ZpxkXYj05w== + integrity: sha512-WApSdLdXEBb/1FUPca2lteASewEfpjEYJ8oXZP+0gExK5qSfsEKBKcA+WjY6Q4wvXwyv0+W6Kvc372pSceib9w== } engines: { node: ">= 16" } - dependencies: - "@jsdevtools/ono": 7.1.3 - "@types/json-schema": 7.0.15 - js-yaml: 4.1.0 - dev: true - - /@astrojs/compiler@1.8.2: - resolution: - { - integrity: sha512-o/ObKgtMzl8SlpIdzaxFnt7SATKPxu4oIP/1NL+HDJRzxfJcAkOTAb/ZKMRyULbz4q+1t2/DAebs2Z1QairkZw== - } - dev: true - /@astrojs/compiler@2.8.0: + "@astrojs/compiler@2.10.3": resolution: { - integrity: sha512-yrpD1WRGqsJwANaDIdtHo+YVjvIOFAjC83lu5qENIgrafwZcJgSXDuwVMXOgok4tFzpeKLsFQ6c3FoUdloLWBQ== + integrity: sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw== } - dev: false - /@astrojs/internal-helpers@0.4.0: + "@astrojs/internal-helpers@0.4.2": resolution: { - integrity: sha512-6B13lz5n6BrbTqCTwhXjJXuR1sqiX/H6rTxzlXx+lN1NnV4jgnq/KJldCQaUWJzPL5SiWahQyinxAbxQtwgPHA== + integrity: sha512-EdDWkC3JJVcpGpqJAU/5hSk2LKXyG3mNGkzGoAuyK+xoPHbaVdSuIWoN1QTnmK3N/gGfaaAfM8gO2KDCAW7S3w== } - dev: false - /@astrojs/markdown-remark@5.1.0: + "@astrojs/markdown-remark@6.0.1": resolution: { - integrity: sha512-S6Z3K2hOB7MfjeDoHsotnP/q2UsnEDB8NlNAaCjMDsGBZfTUbWxyLW3CaphEWw08f6KLZi2ibK9yC3BaMhh2NQ== + integrity: sha512-CTSYijj25NfxgZi15TU3CwPwgyD1/7yA3FcdcNmB9p94nydupiUbrIiq3IqeTp2m5kCVzxbPZeC7fTwEOaNyGw== } - dependencies: - "@astrojs/prism": 3.1.0 - github-slugger: 2.0.0 - hast-util-from-html: 2.0.1 - hast-util-to-text: 4.0.2 - import-meta-resolve: 4.1.0 - mdast-util-definitions: 6.0.0 - rehype-raw: 7.0.0 - rehype-stringify: 10.0.0 - remark-gfm: 4.0.0 - remark-parse: 11.0.0 - remark-rehype: 11.1.0 - remark-smartypants: 2.1.0 - shiki: 1.6.4 - unified: 11.0.4 - unist-util-remove-position: 5.0.0 - unist-util-visit: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: false - /@astrojs/mdx@3.1.0(astro@4.10.2): + "@astrojs/mdx@4.0.3": resolution: { - integrity: sha512-yuGDaOcCAfYgLQvUAlJDezYGK4twHlzW1Kvpyg3inxtDJuAsHdyVyYLWl0Wo5nwkyrbZktdrjnoW5scqzoAqAg== + integrity: sha512-8HcuyNG/KgYUAQWVzKFkboXcTOBCW6aQ0WK0Er/iSmVSF0y3yimg4/3QSt+Twv9dogpwIHL+E8iBJKqieFv4+g== } - engines: { node: ^18.17.1 || ^20.3.0 || >=21.0.0 } + engines: { node: ^18.17.1 || ^20.3.0 || >=22.0.0 } peerDependencies: - astro: ^4.8.0 - dependencies: - "@astrojs/markdown-remark": 5.1.0 - "@mdx-js/mdx": 3.0.1 - acorn: 8.11.3 - astro: 4.10.2 - es-module-lexer: 1.5.3 - estree-util-visit: 2.0.0 - github-slugger: 2.0.0 - gray-matter: 4.0.3 - hast-util-to-html: 9.0.1 - kleur: 4.1.5 - rehype-raw: 7.0.0 - remark-gfm: 4.0.0 - remark-smartypants: 3.0.1 - source-map: 0.7.4 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: false + astro: ^5.0.0 - /@astrojs/prism@3.1.0: + "@astrojs/prism@3.2.0": resolution: { - integrity: sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw== + integrity: sha512-GilTHKGCW6HMq7y3BUv9Ac7GMe/MO9gi9GW62GzKtth0SwukCu/qp2wLiGpEujhY+VVhaG9v7kv/5vFzvf4NYw== } - engines: { node: ^18.17.1 || ^20.3.0 || >=21.0.0 } - dependencies: - prismjs: 1.29.0 - dev: false + engines: { node: ^18.17.1 || ^20.3.0 || >=22.0.0 } - /@astrojs/sitemap@3.1.5: + "@astrojs/sitemap@3.2.1": resolution: { - integrity: sha512-GLdzJ01387Uzb8RKYpsYLlg/GzoPnGbmDeQNkarSE11i2+l9Qp8Nj/WoTEy9nkTS25fxxy0kxDfJmreeVleCqg== + integrity: sha512-uxMfO8f7pALq0ADL6Lk68UV6dNYjJ2xGUzyjjVj60JLBs5a6smtlkBYv3tQ0DzoqwS7c9n4FUx5lgv0yPo/fgA== } - dependencies: - sitemap: 7.1.2 - stream-replace-string: 2.0.0 - zod: 3.23.8 - dev: false - /@astrojs/starlight@0.24.2(astro@4.10.2): + "@astrojs/starlight@0.30.3": resolution: { - integrity: sha512-hXFVBHcr2a4UwX5GDCNQEZsRXdgVlNzZ7txpI2jlMvtzbgfoLEGOHjaHpB5QTW/OCrRAMjcx9Zx0HxRliohaxQ== + integrity: sha512-HbGYYIR2Rnrvvc2jD0dUpp8zUzv3jQYtG5im3aulDgE4Jo21Ahw0yXlb/Y134G3LALLbqhImmlbt/h/nDV3yMA== } peerDependencies: - astro: ^4.8.6 - dependencies: - "@astrojs/mdx": 3.1.0(astro@4.10.2) - "@astrojs/sitemap": 3.1.5 - "@pagefind/default-ui": 1.1.0 - "@types/hast": 3.0.4 - "@types/mdast": 4.0.4 - astro: 4.10.2 - astro-expressive-code: 0.35.3(astro@4.10.2) - bcp-47: 2.1.0 - hast-util-from-html: 2.0.1 - hast-util-select: 6.0.2 - hast-util-to-string: 3.0.0 - hastscript: 9.0.0 - mdast-util-directive: 3.0.0 - mdast-util-to-markdown: 2.1.0 - pagefind: 1.1.0 - rehype: 13.0.1 - rehype-format: 5.0.0 - remark-directive: 3.0.0 - unified: 11.0.4 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: false + astro: ^5.0.0 - /@astrojs/telemetry@3.1.0: + "@astrojs/telemetry@3.2.0": resolution: { - integrity: sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA== + integrity: sha512-wxhSKRfKugLwLlr4OFfcqovk+LIFtKwLyGPqMsv+9/ibqqnW3Gv7tBhtKEb0gAyUAC4G9BTVQeQahqnQAhd6IQ== } - engines: { node: ^18.17.1 || ^20.3.0 || >=21.0.0 } - dependencies: - ci-info: 4.0.0 - debug: 4.3.5 - dlv: 1.1.3 - dset: 3.1.3 - is-docker: 3.0.0 - is-wsl: 3.1.0 - which-pm-runs: 1.1.0 - transitivePeerDependencies: - - supports-color - dev: false + engines: { node: ^18.17.1 || ^20.3.0 || >=22.0.0 } - /@babel/code-frame@7.24.7: + "@babel/helper-string-parser@7.25.9": resolution: { - integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== } engines: { node: ">=6.9.0" } - dependencies: - "@babel/highlight": 7.24.7 - picocolors: 1.0.1 - dev: false - /@babel/compat-data@7.24.7: + "@babel/helper-validator-identifier@7.25.9": resolution: { - integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== + integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== } engines: { node: ">=6.9.0" } - dev: false - /@babel/core@7.24.7: + "@babel/parser@7.26.3": resolution: { - integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== + integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== } - engines: { node: ">=6.9.0" } - dependencies: - "@ampproject/remapping": 2.3.0 - "@babel/code-frame": 7.24.7 - "@babel/generator": 7.24.7 - "@babel/helper-compilation-targets": 7.24.7 - "@babel/helper-module-transforms": 7.24.7(@babel/core@7.24.7) - "@babel/helpers": 7.24.7 - "@babel/parser": 7.24.7 - "@babel/template": 7.24.7 - "@babel/traverse": 7.24.7 - "@babel/types": 7.24.7 - convert-source-map: 2.0.0 - debug: 4.3.5 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false + engines: { node: ">=6.0.0" } + hasBin: true - /@babel/generator@7.24.7: + "@babel/runtime@7.26.0": resolution: { - integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== + integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== } engines: { node: ">=6.9.0" } - dependencies: - "@babel/types": 7.24.7 - "@jridgewell/gen-mapping": 0.3.5 - "@jridgewell/trace-mapping": 0.3.25 - jsesc: 2.5.2 - dev: false - /@babel/helper-annotate-as-pure@7.24.7: + "@babel/types@7.26.3": resolution: { - integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== + integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== } engines: { node: ">=6.9.0" } - dependencies: - "@babel/types": 7.24.7 - dev: false - /@babel/helper-compilation-targets@7.24.7: + "@ctrl/tinycolor@4.1.0": resolution: { - integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== + integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ== } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/compat-data": 7.24.7 - "@babel/helper-validator-option": 7.24.7 - browserslist: 4.23.1 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: false + engines: { node: ">=14" } - /@babel/helper-environment-visitor@7.24.7: + "@emnapi/runtime@1.3.1": resolution: { - integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== + integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw== } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/types": 7.24.7 - dev: false - /@babel/helper-function-name@7.24.7: + "@esbuild/aix-ppc64@0.21.5": resolution: { - integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== + integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/template": 7.24.7 - "@babel/types": 7.24.7 - dev: false + engines: { node: ">=12" } + cpu: [ppc64] + os: [aix] - /@babel/helper-hoist-variables@7.24.7: + "@esbuild/aix-ppc64@0.24.2": resolution: { - integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== + integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA== } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/types": 7.24.7 - dev: false + engines: { node: ">=18" } + cpu: [ppc64] + os: [aix] - /@babel/helper-module-imports@7.24.7: + "@esbuild/android-arm64@0.21.5": resolution: { - integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/traverse": 7.24.7 - "@babel/types": 7.24.7 - transitivePeerDependencies: - - supports-color - dev: false + engines: { node: ">=12" } + cpu: [arm64] + os: [android] - /@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7): + "@esbuild/android-arm64@0.24.2": resolution: { - integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== + integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg== } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-environment-visitor": 7.24.7 - "@babel/helper-module-imports": 7.24.7 - "@babel/helper-simple-access": 7.24.7 - "@babel/helper-split-export-declaration": 7.24.7 - "@babel/helper-validator-identifier": 7.24.7 - transitivePeerDependencies: - - supports-color - dev: false + engines: { node: ">=18" } + cpu: [arm64] + os: [android] - /@babel/helper-plugin-utils@7.24.7: + "@esbuild/android-arm@0.21.5": resolution: { - integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== + integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== } - engines: { node: ">=6.9.0" } - dev: false + engines: { node: ">=12" } + cpu: [arm] + os: [android] - /@babel/helper-simple-access@7.24.7: + "@esbuild/android-arm@0.24.2": resolution: { - integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q== } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/traverse": 7.24.7 - "@babel/types": 7.24.7 - transitivePeerDependencies: - - supports-color - dev: false + engines: { node: ">=18" } + cpu: [arm] + os: [android] - /@babel/helper-split-export-declaration@7.24.7: + "@esbuild/android-x64@0.21.5": resolution: { - integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== + integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/types": 7.24.7 - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [android] - /@babel/helper-string-parser@7.24.7: + "@esbuild/android-x64@0.24.2": resolution: { - integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== + integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw== } - engines: { node: ">=6.9.0" } - dev: false + engines: { node: ">=18" } + cpu: [x64] + os: [android] - /@babel/helper-validator-identifier@7.24.7: + "@esbuild/darwin-arm64@0.21.5": resolution: { - integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== } - engines: { node: ">=6.9.0" } - dev: false + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] - /@babel/helper-validator-option@7.24.7: + "@esbuild/darwin-arm64@0.24.2": resolution: { - integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== + integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA== } - engines: { node: ">=6.9.0" } - dev: false + engines: { node: ">=18" } + cpu: [arm64] + os: [darwin] - /@babel/helpers@7.24.7: + "@esbuild/darwin-x64@0.21.5": resolution: { - integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg== + integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/template": 7.24.7 - "@babel/types": 7.24.7 - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] - /@babel/highlight@7.24.7: + "@esbuild/darwin-x64@0.24.2": resolution: { - integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA== } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/helper-validator-identifier": 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 - dev: false + engines: { node: ">=18" } + cpu: [x64] + os: [darwin] - /@babel/parser@7.24.7: + "@esbuild/freebsd-arm64@0.21.5": resolution: { - integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== + integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== } - engines: { node: ">=6.0.0" } - hasBin: true - dependencies: - "@babel/types": 7.24.7 - dev: false + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] - /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7): + "@esbuild/freebsd-arm64@0.24.2": resolution: { - integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== + integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg== } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - dev: false + engines: { node: ">=18" } + cpu: [arm64] + os: [freebsd] - /@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.24.7): + "@esbuild/freebsd-x64@0.21.5": resolution: { - integrity: sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA== + integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-annotate-as-pure": 7.24.7 - "@babel/helper-module-imports": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/plugin-syntax-jsx": 7.24.7(@babel/core@7.24.7) - "@babel/types": 7.24.7 - transitivePeerDependencies: - - supports-color - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] - /@babel/template@7.24.7: + "@esbuild/freebsd-x64@0.24.2": resolution: { - integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== + integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q== } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/code-frame": 7.24.7 - "@babel/parser": 7.24.7 - "@babel/types": 7.24.7 - dev: false + engines: { node: ">=18" } + cpu: [x64] + os: [freebsd] - /@babel/traverse@7.24.7: + "@esbuild/linux-arm64@0.21.5": resolution: { - integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== + integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/code-frame": 7.24.7 - "@babel/generator": 7.24.7 - "@babel/helper-environment-visitor": 7.24.7 - "@babel/helper-function-name": 7.24.7 - "@babel/helper-hoist-variables": 7.24.7 - "@babel/helper-split-export-declaration": 7.24.7 - "@babel/parser": 7.24.7 - "@babel/types": 7.24.7 - debug: 4.3.5 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] - /@babel/types@7.24.7: + "@esbuild/linux-arm64@0.24.2": resolution: { - integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== + integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg== } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/helper-string-parser": 7.24.7 - "@babel/helper-validator-identifier": 7.24.7 - to-fast-properties: 2.0.0 - dev: false + engines: { node: ">=18" } + cpu: [arm64] + os: [linux] - /@ctrl/tinycolor@4.1.0: + "@esbuild/linux-arm@0.21.5": resolution: { - integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ== + integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== } - engines: { node: ">=14" } - dev: false + engines: { node: ">=12" } + cpu: [arm] + os: [linux] - /@emnapi/runtime@1.2.0: + "@esbuild/linux-arm@0.24.2": resolution: { - integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ== + integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA== } - requiresBuild: true - dependencies: - tslib: 2.6.3 - dev: false - optional: true + engines: { node: ">=18" } + cpu: [arm] + os: [linux] - /@esbuild/aix-ppc64@0.21.5: + "@esbuild/linux-ia32@0.21.5": resolution: { - integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== } engines: { node: ">=12" } - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: false - optional: true + cpu: [ia32] + os: [linux] - /@esbuild/android-arm64@0.21.5: + "@esbuild/linux-ia32@0.24.2": resolution: { - integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw== } - engines: { node: ">=12" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true + engines: { node: ">=18" } + cpu: [ia32] + os: [linux] - /@esbuild/android-arm@0.21.5: + "@esbuild/linux-loong64@0.21.5": resolution: { - integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== } engines: { node: ">=12" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true + cpu: [loong64] + os: [linux] - /@esbuild/android-x64@0.21.5: + "@esbuild/linux-loong64@0.24.2": resolution: { - integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ== } - engines: { node: ">=12" } - cpu: [x64] - os: [android] - requiresBuild: true - dev: false - optional: true + engines: { node: ">=18" } + cpu: [loong64] + os: [linux] - /@esbuild/darwin-arm64@0.21.5: + "@esbuild/linux-mips64el@0.21.5": resolution: { - integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== } engines: { node: ">=12" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true + cpu: [mips64el] + os: [linux] - /@esbuild/darwin-x64@0.21.5: + "@esbuild/linux-mips64el@0.24.2": resolution: { - integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw== } - engines: { node: ">=12" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true + engines: { node: ">=18" } + cpu: [mips64el] + os: [linux] - /@esbuild/freebsd-arm64@0.21.5: + "@esbuild/linux-ppc64@0.21.5": resolution: { - integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== } engines: { node: ">=12" } - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true + cpu: [ppc64] + os: [linux] - /@esbuild/freebsd-x64@0.21.5: + "@esbuild/linux-ppc64@0.24.2": resolution: { - integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw== } - engines: { node: ">=12" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true + engines: { node: ">=18" } + cpu: [ppc64] + os: [linux] - /@esbuild/linux-arm64@0.21.5: + "@esbuild/linux-riscv64@0.21.5": resolution: { - integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== } engines: { node: ">=12" } - cpu: [arm64] + cpu: [riscv64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-arm@0.21.5: + "@esbuild/linux-riscv64@0.24.2": resolution: { - integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q== } - engines: { node: ">=12" } - cpu: [arm] + engines: { node: ">=18" } + cpu: [riscv64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-ia32@0.21.5: + "@esbuild/linux-s390x@0.21.5": resolution: { - integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== } engines: { node: ">=12" } - cpu: [ia32] + cpu: [s390x] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-loong64@0.21.5: + "@esbuild/linux-s390x@0.24.2": resolution: { - integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw== } - engines: { node: ">=12" } - cpu: [loong64] + engines: { node: ">=18" } + cpu: [s390x] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-mips64el@0.21.5: + "@esbuild/linux-x64@0.21.5": resolution: { - integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== } engines: { node: ">=12" } - cpu: [mips64el] + cpu: [x64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-ppc64@0.21.5: + "@esbuild/linux-x64@0.24.2": resolution: { - integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q== } - engines: { node: ">=12" } - cpu: [ppc64] + engines: { node: ">=18" } + cpu: [x64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@esbuild/linux-riscv64@0.21.5: + "@esbuild/netbsd-arm64@0.24.2": resolution: { - integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw== } - engines: { node: ">=12" } - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: false - optional: true + engines: { node: ">=18" } + cpu: [arm64] + os: [netbsd] - /@esbuild/linux-s390x@0.21.5: + "@esbuild/netbsd-x64@0.21.5": resolution: { - integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== } engines: { node: ">=12" } - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: false - optional: true + cpu: [x64] + os: [netbsd] - /@esbuild/linux-x64@0.21.5: + "@esbuild/netbsd-x64@0.24.2": resolution: { - integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw== } - engines: { node: ">=12" } + engines: { node: ">=18" } cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true + os: [netbsd] - /@esbuild/netbsd-x64@0.21.5: + "@esbuild/openbsd-arm64@0.24.2": resolution: { - integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A== } - engines: { node: ">=12" } - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: false - optional: true + engines: { node: ">=18" } + cpu: [arm64] + os: [openbsd] - /@esbuild/openbsd-x64@0.21.5: + "@esbuild/openbsd-x64@0.21.5": resolution: { integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== @@ -770,11 +504,17 @@ packages: engines: { node: ">=12" } cpu: [x64] os: [openbsd] - requiresBuild: true - dev: false - optional: true - /@esbuild/sunos-x64@0.21.5: + "@esbuild/openbsd-x64@0.24.2": + resolution: + { + integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA== + } + engines: { node: ">=18" } + cpu: [x64] + os: [openbsd] + + "@esbuild/sunos-x64@0.21.5": resolution: { integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== @@ -782,11 +522,17 @@ packages: engines: { node: ">=12" } cpu: [x64] os: [sunos] - requiresBuild: true - dev: false - optional: true - /@esbuild/win32-arm64@0.21.5: + "@esbuild/sunos-x64@0.24.2": + resolution: + { + integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig== + } + engines: { node: ">=18" } + cpu: [x64] + os: [sunos] + + "@esbuild/win32-arm64@0.21.5": resolution: { integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== @@ -794,11 +540,17 @@ packages: engines: { node: ">=12" } cpu: [arm64] os: [win32] - requiresBuild: true - dev: false - optional: true - /@esbuild/win32-ia32@0.21.5: + "@esbuild/win32-arm64@0.24.2": + resolution: + { + integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ== + } + engines: { node: ">=18" } + cpu: [arm64] + os: [win32] + + "@esbuild/win32-ia32@0.21.5": resolution: { integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== @@ -806,11 +558,17 @@ packages: engines: { node: ">=12" } cpu: [ia32] os: [win32] - requiresBuild: true - dev: false - optional: true - /@esbuild/win32-x64@0.21.5: + "@esbuild/win32-ia32@0.24.2": + resolution: + { + integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA== + } + engines: { node: ">=18" } + cpu: [ia32] + os: [win32] + + "@esbuild/win32-x64@0.21.5": resolution: { integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== @@ -818,1619 +576,1075 @@ packages: engines: { node: ">=12" } cpu: [x64] os: [win32] - requiresBuild: true - dev: false - optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + "@esbuild/win32-x64@0.24.2": + resolution: + { + integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg== + } + engines: { node: ">=18" } + cpu: [x64] + os: [win32] + + "@eslint-community/eslint-utils@4.4.1": resolution: { - integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.10.1: + "@eslint-community/regexpp@4.12.1": resolution: { - integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== + integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== } engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - dev: true - /@eslint/eslintrc@2.1.4: + "@eslint/config-array@0.19.1": resolution: { - integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - ajv: 6.12.6 - debug: 4.3.5 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - /@eslint/js@8.57.0: + "@eslint/core@0.9.1": resolution: { - integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dev: true + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - /@expressive-code/core@0.35.3: + "@eslint/eslintrc@3.2.0": resolution: { - integrity: sha512-SYamcarAjufYhbuK/kfvJSvAXLsfnM7DKc78R7Dq4B73R5bKQK2m5zR0l57tXr4yp2C5Z8lu5xZncdwWxcmPdg== + integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w== } - dependencies: - "@ctrl/tinycolor": 4.1.0 - hast-util-select: 6.0.2 - hast-util-to-html: 9.0.1 - hast-util-to-text: 4.0.2 - hastscript: 9.0.0 - postcss: 8.4.38 - postcss-nested: 6.0.1(postcss@8.4.38) - unist-util-visit: 5.0.0 - unist-util-visit-parents: 6.0.1 - dev: false + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - /@expressive-code/plugin-frames@0.35.3: + "@eslint/js@9.17.0": resolution: { - integrity: sha512-QYytMq6IsaHgTofQ5b6d+CnbxkqLdikSF2hC+IL/ZZwPYHYZoUlmjIwmJZhY4/hHqJGELrtZsyVdlt06RntgmA== + integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w== } - dependencies: - "@expressive-code/core": 0.35.3 - dev: false + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - /@expressive-code/plugin-shiki@0.35.3: + "@eslint/object-schema@2.1.5": resolution: { - integrity: sha512-aFQBPepv0zhVXqJFAvfQ4vXYv/meJKiqmEEKSxdjAfwXllIV49PDlnGEXmbGYjR4hUQQjbfDgzAbrbfePc3YVQ== + integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ== } - dependencies: - "@expressive-code/core": 0.35.3 - shiki: 1.6.4 - dev: false + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - /@expressive-code/plugin-text-markers@0.35.3: + "@eslint/plugin-kit@0.2.4": resolution: { - integrity: sha512-gDdnQrfDRXw5Y+PKHJDkpAUdf2pthYOthGcgy3JB8GOTQ3EL1h+755Ct/bGc4MR6jn+dgnQP47uHMWQaccvN6Q== + integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg== } - dependencies: - "@expressive-code/core": 0.35.3 - dev: false + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - /@humanwhocodes/config-array@0.11.14: + "@expressive-code/core@0.38.3": resolution: { - integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + integrity: sha512-s0/OtdRpBONwcn23O8nVwDNQqpBGKscysejkeBkwlIeHRLZWgiTVrusT5Idrdz1d8cW5wRk9iGsAIQmwDPXgJg== } - engines: { node: ">=10.10.0" } - deprecated: Use @eslint/config-array instead - dependencies: - "@humanwhocodes/object-schema": 2.0.3 - debug: 4.3.5 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: + "@expressive-code/plugin-frames@0.38.3": + resolution: + { + integrity: sha512-qL2oC6FplmHNQfZ8ZkTR64/wKo9x0c8uP2WDftR/ydwN/yhe1ed7ZWYb8r3dezxsls+tDokCnN4zYR594jbpvg== + } + + "@expressive-code/plugin-shiki@0.38.3": + resolution: + { + integrity: sha512-kqHnglZeesqG3UKrb6e9Fq5W36AZ05Y9tCREmSN2lw8LVTqENIeCIkLDdWtQ5VoHlKqwUEQFTVlRehdwoY7Gmw== + } + + "@expressive-code/plugin-text-markers@0.38.3": + resolution: + { + integrity: sha512-dPK3+BVGTbTmGQGU3Fkj3jZ3OltWUAlxetMHI6limUGCWBCucZiwoZeFM/WmqQa71GyKRzhBT+iEov6kkz2xVA== + } + + "@humanfs/core@0.19.1": + resolution: + { + integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + } + engines: { node: ">=18.18.0" } + + "@humanfs/node@0.16.6": + resolution: + { + integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + } + engines: { node: ">=18.18.0" } + + "@humanwhocodes/module-importer@1.0.1": resolution: { integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== } engines: { node: ">=12.22" } - dev: true - /@humanwhocodes/object-schema@2.0.3: + "@humanwhocodes/retry@0.3.1": resolution: { - integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== } - deprecated: Use @eslint/object-schema instead - dev: true + engines: { node: ">=18.18" } - /@img/sharp-darwin-arm64@0.33.4: + "@humanwhocodes/retry@0.4.1": resolution: { - integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA== + integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA== } - engines: + engines: { node: ">=18.18" } + + "@img/sharp-darwin-arm64@0.33.5": + resolution: { - glibc: ">=2.26", - node: ^18.17.0 || ^20.3.0 || >=21.0.0, - npm: ">=9.6.5", - pnpm: ">=7.1.0", - yarn: ">=3.2.0" + integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm64] os: [darwin] - requiresBuild: true - optionalDependencies: - "@img/sharp-libvips-darwin-arm64": 1.0.2 - dev: false - optional: true - /@img/sharp-darwin-x64@0.33.4: + "@img/sharp-darwin-x64@0.33.5": resolution: { - integrity: sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw== - } - engines: - { - glibc: ">=2.26", - node: ^18.17.0 || ^20.3.0 || >=21.0.0, - npm: ">=9.6.5", - pnpm: ">=7.1.0", - yarn: ">=3.2.0" + integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [x64] os: [darwin] - requiresBuild: true - optionalDependencies: - "@img/sharp-libvips-darwin-x64": 1.0.2 - dev: false - optional: true - /@img/sharp-libvips-darwin-arm64@1.0.2: + "@img/sharp-libvips-darwin-arm64@1.0.4": resolution: { - integrity: sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA== + integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg== } - engines: { macos: ">=11", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } cpu: [arm64] os: [darwin] - requiresBuild: true - dev: false - optional: true - /@img/sharp-libvips-darwin-x64@1.0.2: + "@img/sharp-libvips-darwin-x64@1.0.4": resolution: { - integrity: sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw== + integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ== } - engines: { macos: ">=10.13", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } cpu: [x64] os: [darwin] - requiresBuild: true - dev: false - optional: true - /@img/sharp-libvips-linux-arm64@1.0.2: + "@img/sharp-libvips-linux-arm64@1.0.4": resolution: { - integrity: sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw== + integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA== } - engines: { glibc: ">=2.26", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } cpu: [arm64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@img/sharp-libvips-linux-arm@1.0.2: + "@img/sharp-libvips-linux-arm@1.0.5": resolution: { - integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw== + integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g== } - engines: { glibc: ">=2.28", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } cpu: [arm] os: [linux] - requiresBuild: true - dev: false - optional: true - /@img/sharp-libvips-linux-s390x@1.0.2: + "@img/sharp-libvips-linux-s390x@1.0.4": resolution: { - integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog== + integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA== } - engines: { glibc: ">=2.28", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } cpu: [s390x] os: [linux] - requiresBuild: true - dev: false - optional: true - /@img/sharp-libvips-linux-x64@1.0.2: + "@img/sharp-libvips-linux-x64@1.0.4": resolution: { - integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ== + integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw== } - engines: { glibc: ">=2.26", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } cpu: [x64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@img/sharp-libvips-linuxmusl-arm64@1.0.2: + "@img/sharp-libvips-linuxmusl-arm64@1.0.4": resolution: { - integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ== + integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA== } - engines: { musl: ">=1.2.2", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } cpu: [arm64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@img/sharp-libvips-linuxmusl-x64@1.0.2: + "@img/sharp-libvips-linuxmusl-x64@1.0.4": resolution: { - integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw== + integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw== } - engines: { musl: ">=1.2.2", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } cpu: [x64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@img/sharp-linux-arm64@0.33.4: + "@img/sharp-linux-arm64@0.33.5": resolution: { - integrity: sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q== - } - engines: - { - glibc: ">=2.26", - node: ^18.17.0 || ^20.3.0 || >=21.0.0, - npm: ">=9.6.5", - pnpm: ">=7.1.0", - yarn: ">=3.2.0" + integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm64] os: [linux] - requiresBuild: true - optionalDependencies: - "@img/sharp-libvips-linux-arm64": 1.0.2 - dev: false - optional: true - /@img/sharp-linux-arm@0.33.4: + "@img/sharp-linux-arm@0.33.5": resolution: { - integrity: sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ== - } - engines: - { - glibc: ">=2.28", - node: ^18.17.0 || ^20.3.0 || >=21.0.0, - npm: ">=9.6.5", - pnpm: ">=7.1.0", - yarn: ">=3.2.0" + integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm] os: [linux] - requiresBuild: true - optionalDependencies: - "@img/sharp-libvips-linux-arm": 1.0.2 - dev: false - optional: true - /@img/sharp-linux-s390x@0.33.4: + "@img/sharp-linux-s390x@0.33.5": resolution: { - integrity: sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ== - } - engines: - { - glibc: ">=2.31", - node: ^18.17.0 || ^20.3.0 || >=21.0.0, - npm: ">=9.6.5", - pnpm: ">=7.1.0", - yarn: ">=3.2.0" + integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [s390x] os: [linux] - requiresBuild: true - optionalDependencies: - "@img/sharp-libvips-linux-s390x": 1.0.2 - dev: false - optional: true - /@img/sharp-linux-x64@0.33.4: + "@img/sharp-linux-x64@0.33.5": resolution: { - integrity: sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw== - } - engines: - { - glibc: ">=2.26", - node: ^18.17.0 || ^20.3.0 || >=21.0.0, - npm: ">=9.6.5", - pnpm: ">=7.1.0", - yarn: ">=3.2.0" + integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [x64] os: [linux] - requiresBuild: true - optionalDependencies: - "@img/sharp-libvips-linux-x64": 1.0.2 - dev: false - optional: true - /@img/sharp-linuxmusl-arm64@0.33.4: + "@img/sharp-linuxmusl-arm64@0.33.5": resolution: { - integrity: sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ== - } - engines: - { - musl: ">=1.2.2", - node: ^18.17.0 || ^20.3.0 || >=21.0.0, - npm: ">=9.6.5", - pnpm: ">=7.1.0", - yarn: ">=3.2.0" + integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm64] os: [linux] - requiresBuild: true - optionalDependencies: - "@img/sharp-libvips-linuxmusl-arm64": 1.0.2 - dev: false - optional: true - /@img/sharp-linuxmusl-x64@0.33.4: + "@img/sharp-linuxmusl-x64@0.33.5": resolution: { - integrity: sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw== - } - engines: - { - musl: ">=1.2.2", - node: ^18.17.0 || ^20.3.0 || >=21.0.0, - npm: ">=9.6.5", - pnpm: ">=7.1.0", - yarn: ">=3.2.0" + integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [x64] os: [linux] - requiresBuild: true - optionalDependencies: - "@img/sharp-libvips-linuxmusl-x64": 1.0.2 - dev: false - optional: true - /@img/sharp-wasm32@0.33.4: + "@img/sharp-wasm32@0.33.5": resolution: { - integrity: sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ== - } - engines: - { - node: ^18.17.0 || ^20.3.0 || >=21.0.0, - npm: ">=9.6.5", - pnpm: ">=7.1.0", - yarn: ">=3.2.0" + integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [wasm32] - requiresBuild: true - dependencies: - "@emnapi/runtime": 1.2.0 - dev: false - optional: true - /@img/sharp-win32-ia32@0.33.4: + "@img/sharp-win32-ia32@0.33.5": resolution: { - integrity: sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw== - } - engines: - { - node: ^18.17.0 || ^20.3.0 || >=21.0.0, - npm: ">=9.6.5", - pnpm: ">=7.1.0", - yarn: ">=3.2.0" + integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [ia32] os: [win32] - requiresBuild: true - dev: false - optional: true - /@img/sharp-win32-x64@0.33.4: + "@img/sharp-win32-x64@0.33.5": resolution: { - integrity: sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw== - } - engines: - { - node: ^18.17.0 || ^20.3.0 || >=21.0.0, - npm: ">=9.6.5", - pnpm: ">=7.1.0", - yarn: ">=3.2.0" + integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [x64] os: [win32] - requiresBuild: true - dev: false - optional: true - /@jridgewell/gen-mapping@0.3.5: + "@jridgewell/sourcemap-codec@1.5.0": resolution: { - integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== } - engines: { node: ">=6.0.0" } - dependencies: - "@jridgewell/set-array": 1.2.1 - "@jridgewell/sourcemap-codec": 1.4.15 - "@jridgewell/trace-mapping": 0.3.25 - dev: false - - /@jridgewell/resolve-uri@3.1.2: - resolution: - { - integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - } - engines: { node: ">=6.0.0" } - dev: false - - /@jridgewell/set-array@1.2.1: - resolution: - { - integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - } - engines: { node: ">=6.0.0" } - dev: false - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: - { - integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - } - dev: false - /@jridgewell/trace-mapping@0.3.25: - resolution: - { - integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - } - dependencies: - "@jridgewell/resolve-uri": 3.1.2 - "@jridgewell/sourcemap-codec": 1.4.15 - dev: false - - /@jsdevtools/ono@7.1.3: + "@jsdevtools/ono@7.1.3": resolution: { integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== } - dev: true - /@mdx-js/mdx@3.0.1: + "@mdx-js/mdx@3.1.0": resolution: { - integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA== + integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw== } - dependencies: - "@types/estree": 1.0.5 - "@types/estree-jsx": 1.0.5 - "@types/hast": 3.0.4 - "@types/mdx": 2.0.13 - collapse-white-space: 2.1.0 - devlop: 1.1.0 - estree-util-build-jsx: 3.0.1 - estree-util-is-identifier-name: 3.0.0 - estree-util-to-js: 2.0.0 - estree-walker: 3.0.3 - hast-util-to-estree: 3.1.0 - hast-util-to-jsx-runtime: 2.3.0 - markdown-extensions: 2.0.0 - periscopic: 3.1.0 - remark-mdx: 3.0.1 - remark-parse: 11.0.0 - remark-rehype: 11.1.0 - source-map: 0.7.4 - unified: 11.0.4 - unist-util-position-from-estree: 2.0.0 - unist-util-stringify-position: 4.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: false - /@nodelib/fs.scandir@2.1.5: + "@nodelib/fs.scandir@2.1.5": resolution: { integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== } engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: 1.2.0 - /@nodelib/fs.stat@2.0.5: + "@nodelib/fs.stat@2.0.5": resolution: { integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== } engines: { node: ">= 8" } - /@nodelib/fs.walk@1.2.8: + "@nodelib/fs.walk@1.2.8": resolution: { integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== } engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: 1.17.1 - /@pagefind/darwin-arm64@1.1.0: + "@oslojs/encoding@1.1.0": + resolution: + { + integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ== + } + + "@pagefind/darwin-arm64@1.3.0": resolution: { - integrity: sha512-SLsXNLtSilGZjvqis8sX42fBWsWAVkcDh1oerxwqbac84HbiwxpxOC2jm8hRwcR0Z55HPZPWO77XeRix/8GwTg== + integrity: sha512-365BEGl6ChOsauRjyVpBjXybflXAOvoMROw3TucAROHIcdBvXk9/2AmEvGFU0r75+vdQI4LJdJdpH4Y6Yqaj4A== } cpu: [arm64] os: [darwin] - requiresBuild: true - dev: false - optional: true - /@pagefind/darwin-x64@1.1.0: + "@pagefind/darwin-x64@1.3.0": resolution: { - integrity: sha512-QjQSE/L5oS1C8N8GdljGaWtjCBMgMtfrPAoiCmINTu9Y9dp0ggAyXvF8K7Qg3VyIMYJ6v8vg2PN7Z3b+AaAqUA== + integrity: sha512-zlGHA23uuXmS8z3XxEGmbHpWDxXfPZ47QS06tGUq0HDcZjXjXHeLG+cboOy828QIV5FXsm9MjfkP5e4ZNbOkow== } cpu: [x64] os: [darwin] - requiresBuild: true - dev: false - optional: true - /@pagefind/default-ui@1.1.0: + "@pagefind/default-ui@1.3.0": resolution: { - integrity: sha512-+XiAJAK++C64nQcD7s3Prdmd5S92lT05fwjOxm0L1jj80jbL+tmvcqkkFnPpoqhnicIPgcAX/Y5W0HRZnBt35w== + integrity: sha512-CGKT9ccd3+oRK6STXGgfH+m0DbOKayX6QGlq38TfE1ZfUcPc5+ulTuzDbZUnMo+bubsEOIypm4Pl2iEyzZ1cNg== } - dev: false - /@pagefind/linux-arm64@1.1.0: + "@pagefind/linux-arm64@1.3.0": resolution: { - integrity: sha512-8zjYCa2BtNEL7KnXtysPtBELCyv5DSQ4yHeK/nsEq6w4ToAMTBl0K06khqxdSGgjMSwwrxvLzq3so0LC5Q14dA== + integrity: sha512-8lsxNAiBRUk72JvetSBXs4WRpYrQrVJXjlRRnOL6UCdBN9Nlsz0t7hWstRk36+JqHpGWOKYiuHLzGYqYAqoOnQ== } cpu: [arm64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@pagefind/linux-x64@1.1.0: + "@pagefind/linux-x64@1.3.0": resolution: { - integrity: sha512-4lsg6VB7A6PWTwaP8oSmXV4O9H0IHX7AlwTDcfyT+YJo/sPXOVjqycD5cdBgqNLfUk8B9bkWcTDCRmJbHrKeCw== + integrity: sha512-hAvqdPJv7A20Ucb6FQGE6jhjqy+vZ6pf+s2tFMNtMBG+fzcdc91uTw7aP/1Vo5plD0dAOHwdxfkyw0ugal4kcQ== } cpu: [x64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@pagefind/windows-x64@1.1.0: + "@pagefind/windows-x64@1.3.0": resolution: { - integrity: sha512-OboCM76BcMKT9IoSfZuFhiqMRgTde8x4qDDvKulFmycgiJrlL5WnIqBHJLQxZq+o2KyZpoHF97iwsGAm8c32sQ== + integrity: sha512-BR1bIRWOMqkf8IoU576YDhij1Wd/Zf2kX/kCI0b2qzCKC8wcc2GQJaaRMCpzvCCrmliO4vtJ6RITp/AnoYUUmQ== } cpu: [x64] os: [win32] - requiresBuild: true - dev: false - optional: true - /@pkgr/core@0.1.1: + "@pkgr/core@0.1.1": resolution: { integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== } engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } - dev: true - /@rollup/rollup-android-arm-eabi@4.18.0: + "@rollup/pluginutils@5.1.4": + resolution: + { + integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ== + } + engines: { node: ">=14.0.0" } + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + "@rollup/rollup-android-arm-eabi@4.30.0": resolution: { - integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== + integrity: sha512-qFcFto9figFLz2g25DxJ1WWL9+c91fTxnGuwhToCl8BaqDsDYMl/kOnBXAyAqkkzAWimYMSWNPWEjt+ADAHuoQ== } cpu: [arm] os: [android] - requiresBuild: true - dev: false - optional: true - /@rollup/rollup-android-arm64@4.18.0: + "@rollup/rollup-android-arm64@4.30.0": resolution: { - integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== + integrity: sha512-vqrQdusvVl7dthqNjWCL043qelBK+gv9v3ZiqdxgaJvmZyIAAXMjeGVSqZynKq69T7062T5VrVTuikKSAAVP6A== } cpu: [arm64] os: [android] - requiresBuild: true - dev: false - optional: true - /@rollup/rollup-darwin-arm64@4.18.0: + "@rollup/rollup-darwin-arm64@4.30.0": resolution: { - integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== + integrity: sha512-617pd92LhdA9+wpixnzsyhVft3szYiN16aNUMzVkf2N+yAk8UXY226Bfp36LvxYTUt7MO/ycqGFjQgJ0wlMaWQ== } cpu: [arm64] os: [darwin] - requiresBuild: true - dev: false - optional: true - /@rollup/rollup-darwin-x64@4.18.0: + "@rollup/rollup-darwin-x64@4.30.0": resolution: { - integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== + integrity: sha512-Y3b4oDoaEhCypg8ajPqigKDcpi5ZZovemQl9Edpem0uNv6UUjXv7iySBpGIUTSs2ovWOzYpfw9EbFJXF/fJHWw== } cpu: [x64] os: [darwin] - requiresBuild: true - dev: false - optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.18.0: + "@rollup/rollup-freebsd-arm64@4.30.0": resolution: { - integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== + integrity: sha512-3REQJ4f90sFIBfa0BUokiCdrV/E4uIjhkWe1bMgCkhFXbf4D8YN6C4zwJL881GM818qVYE9BO3dGwjKhpo2ABA== + } + cpu: [arm64] + os: [freebsd] + + "@rollup/rollup-freebsd-x64@4.30.0": + resolution: + { + integrity: sha512-ZtY3Y8icbe3Cc+uQicsXG5L+CRGUfLZjW6j2gn5ikpltt3Whqjfo5mkyZ86UiuHF9Q3ZsaQeW7YswlHnN+lAcg== + } + cpu: [x64] + os: [freebsd] + + "@rollup/rollup-linux-arm-gnueabihf@4.30.0": + resolution: + { + integrity: sha512-bsPGGzfiHXMhQGuFGpmo2PyTwcrh2otL6ycSZAFTESviUoBOuxF7iBbAL5IJXc/69peXl5rAtbewBFeASZ9O0g== } cpu: [arm] os: [linux] - requiresBuild: true - dev: false - optional: true - /@rollup/rollup-linux-arm-musleabihf@4.18.0: + "@rollup/rollup-linux-arm-musleabihf@4.30.0": resolution: { - integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== + integrity: sha512-kvyIECEhs2DrrdfQf++maCWJIQ974EI4txlz1nNSBaCdtf7i5Xf1AQCEJWOC5rEBisdaMFFnOWNLYt7KpFqy5A== } cpu: [arm] os: [linux] - requiresBuild: true - dev: false - optional: true - /@rollup/rollup-linux-arm64-gnu@4.18.0: + "@rollup/rollup-linux-arm64-gnu@4.30.0": resolution: { - integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== + integrity: sha512-CFE7zDNrokaotXu+shwIrmWrFxllg79vciH4E/zeK7NitVuWEaXRzS0mFfFvyhZfn8WfVOG/1E9u8/DFEgK7WQ== } cpu: [arm64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@rollup/rollup-linux-arm64-musl@4.18.0: + "@rollup/rollup-linux-arm64-musl@4.30.0": resolution: { - integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== + integrity: sha512-MctNTBlvMcIBP0t8lV/NXiUwFg9oK5F79CxLU+a3xgrdJjfBLVIEHSAjQ9+ipofN2GKaMLnFFXLltg1HEEPaGQ== } cpu: [arm64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.18.0: + "@rollup/rollup-linux-loongarch64-gnu@4.30.0": resolution: { - integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== + integrity: sha512-fBpoYwLEPivL3q368+gwn4qnYnr7GVwM6NnMo8rJ4wb0p/Y5lg88vQRRP077gf+tc25akuqd+1Sxbn9meODhwA== + } + cpu: [loong64] + os: [linux] + + "@rollup/rollup-linux-powerpc64le-gnu@4.30.0": + resolution: + { + integrity: sha512-1hiHPV6dUaqIMXrIjN+vgJqtfkLpqHS1Xsg0oUfUVD98xGp1wX89PIXgDF2DWra1nxAd8dfE0Dk59MyeKaBVAw== } cpu: [ppc64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@rollup/rollup-linux-riscv64-gnu@4.18.0: + "@rollup/rollup-linux-riscv64-gnu@4.30.0": resolution: { - integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== + integrity: sha512-U0xcC80SMpEbvvLw92emHrNjlS3OXjAM0aVzlWfar6PR0ODWCTQtKeeB+tlAPGfZQXicv1SpWwRz9Hyzq3Jx3g== } cpu: [riscv64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@rollup/rollup-linux-s390x-gnu@4.18.0: + "@rollup/rollup-linux-s390x-gnu@4.30.0": resolution: { - integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== + integrity: sha512-VU/P/IODrNPasgZDLIFJmMiLGez+BN11DQWfTVlViJVabyF3JaeaJkP6teI8760f18BMGCQOW9gOmuzFaI1pUw== } cpu: [s390x] os: [linux] - requiresBuild: true - dev: false - optional: true - /@rollup/rollup-linux-x64-gnu@4.18.0: + "@rollup/rollup-linux-x64-gnu@4.30.0": resolution: { - integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== + integrity: sha512-laQVRvdbKmjXuFA3ZiZj7+U24FcmoPlXEi2OyLfbpY2MW1oxLt9Au8q9eHd0x6Pw/Kw4oe9gwVXWwIf2PVqblg== } cpu: [x64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@rollup/rollup-linux-x64-musl@4.18.0: + "@rollup/rollup-linux-x64-musl@4.30.0": resolution: { - integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== + integrity: sha512-3wzKzduS7jzxqcOvy/ocU/gMR3/QrHEFLge5CD7Si9fyHuoXcidyYZ6jyx8OPYmCcGm3uKTUl+9jUSAY74Ln5A== } cpu: [x64] os: [linux] - requiresBuild: true - dev: false - optional: true - /@rollup/rollup-win32-arm64-msvc@4.18.0: + "@rollup/rollup-win32-arm64-msvc@4.30.0": resolution: { - integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== + integrity: sha512-jROwnI1+wPyuv696rAFHp5+6RFhXGGwgmgSfzE8e4xfit6oLRg7GyMArVUoM3ChS045OwWr9aTnU+2c1UdBMyw== } cpu: [arm64] os: [win32] - requiresBuild: true - dev: false - optional: true - /@rollup/rollup-win32-ia32-msvc@4.18.0: + "@rollup/rollup-win32-ia32-msvc@4.30.0": resolution: { - integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== + integrity: sha512-duzweyup5WELhcXx5H1jokpr13i3BV9b48FMiikYAwk/MT1LrMYYk2TzenBd0jj4ivQIt58JWSxc19y4SvLP4g== } cpu: [ia32] os: [win32] - requiresBuild: true - dev: false - optional: true - /@rollup/rollup-win32-x64-msvc@4.18.0: + "@rollup/rollup-win32-x64-msvc@4.30.0": resolution: { - integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== + integrity: sha512-DYvxS0M07PvgvavMIybCOBYheyrqlui6ZQBHJs6GqduVzHSZ06TPPvlfvnYstjODHQ8UUXFwt5YE+h0jFI8kwg== } cpu: [x64] os: [win32] - requiresBuild: true - dev: false - optional: true - /@shikijs/core@1.6.4: + "@shikijs/core@1.26.1": resolution: { - integrity: sha512-WTU9rzZae1p2v6LOxMf6LhtmZOkIHYYW160IuahUyJy7YXPPjyWZLR1ag+SgD22ZMxZtz1gfU6Tccc8t0Il/XA== + integrity: sha512-yeo7sG+WZQblKPclUOKRPwkv1PyoHYkJ4gP9DzhFJbTdueKR7wYTI1vfF/bFi1NTgc545yG/DzvVhZgueVOXMA== } - dev: false - /@types/acorn@4.0.6: + "@shikijs/engine-javascript@1.26.1": resolution: { - integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ== + integrity: sha512-CRhA0b8CaSLxS0E9A4Bzcb3LKBNpykfo9F85ozlNyArxjo2NkijtiwrJZ6eHa+NT5I9Kox2IXVdjUsP4dilsmw== } - dependencies: - "@types/estree": 1.0.5 - dev: false - /@types/babel__core@7.20.5: + "@shikijs/engine-oniguruma@1.26.1": resolution: { - integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + integrity: sha512-F5XuxN1HljLuvfXv7d+mlTkV7XukC1cawdtOo+7pKgPD83CAB1Sf8uHqP3PK0u7njFH0ZhoXE1r+0JzEgAQ+kg== } - dependencies: - "@babel/parser": 7.24.7 - "@babel/types": 7.24.7 - "@types/babel__generator": 7.6.8 - "@types/babel__template": 7.4.4 - "@types/babel__traverse": 7.20.6 - dev: false - /@types/babel__generator@7.6.8: + "@shikijs/langs@1.26.1": resolution: { - integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + integrity: sha512-oz/TQiIqZejEIZbGtn68hbJijAOTtYH4TMMSWkWYozwqdpKR3EXgILneQy26WItmJjp3xVspHdiUxUCws4gtuw== } - dependencies: - "@babel/types": 7.24.7 - dev: false - /@types/babel__template@7.4.4: + "@shikijs/themes@1.26.1": resolution: { - integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + integrity: sha512-JDxVn+z+wgLCiUhBGx2OQrLCkKZQGzNH3nAxFir4PjUcYiyD8Jdms9izyxIogYmSwmoPTatFTdzyrRKbKlSfPA== } - dependencies: - "@babel/parser": 7.24.7 - "@babel/types": 7.24.7 - dev: false - /@types/babel__traverse@7.20.6: + "@shikijs/types@1.26.1": resolution: { - integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== + integrity: sha512-d4B00TKKAMaHuFYgRf3L0gwtvqpW4hVdVwKcZYbBfAAQXspgkbWqnFfuFl3MDH6gLbsubOcr+prcnsqah3ny7Q== + } + + "@shikijs/vscode-textmate@10.0.1": + resolution: + { + integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg== } - dependencies: - "@babel/types": 7.24.7 - dev: false - /@types/cookie@0.6.0: + "@types/acorn@4.0.6": + resolution: + { + integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ== + } + + "@types/cookie@0.6.0": resolution: { integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== } - dev: false - /@types/debug@4.1.12: + "@types/debug@4.1.12": resolution: { integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== } - dependencies: - "@types/ms": 0.7.34 - dev: false - /@types/estree-jsx@1.0.5: + "@types/estree-jsx@1.0.5": resolution: { integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== } - dependencies: - "@types/estree": 1.0.5 - dev: false - /@types/estree@1.0.5: + "@types/estree@1.0.6": resolution: { - integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== } - dev: false - /@types/hast@3.0.4: + "@types/hast@3.0.4": resolution: { integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== } - dependencies: - "@types/unist": 3.0.2 - dev: false - /@types/json-schema@7.0.15: + "@types/js-yaml@4.0.9": resolution: { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg== } - dev: true - /@types/mdast@4.0.4: + "@types/json-schema@7.0.15": resolution: { - integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== } - dependencies: - "@types/unist": 3.0.2 - dev: false - /@types/mdx@2.0.13: + "@types/mdast@4.0.4": resolution: { - integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw== + integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== } - dev: false - /@types/ms@0.7.34: + "@types/mdx@2.0.13": resolution: { - integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw== } - dev: false - /@types/nlcst@1.0.4: + "@types/ms@0.7.34": resolution: { - integrity: sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg== + integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== } - dependencies: - "@types/unist": 2.0.10 - dev: false - /@types/nlcst@2.0.3: + "@types/nlcst@2.0.3": resolution: { integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA== } - dependencies: - "@types/unist": 3.0.2 - dev: false - /@types/node@17.0.45: + "@types/node@17.0.45": resolution: { integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== } - dev: false - /@types/sax@1.2.7: + "@types/sax@1.2.7": resolution: { integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A== } - dependencies: - "@types/node": 17.0.45 - dev: false - /@types/unist@2.0.10: + "@types/unist@2.0.11": resolution: { - integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== + integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== } - dev: false - /@types/unist@3.0.2: + "@types/unist@3.0.3": resolution: { - integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== + integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== } - dev: false - /@ungap/structured-clone@1.2.0: + "@ungap/structured-clone@1.2.1": resolution: { - integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA== } - /acorn-jsx@5.3.2(acorn@8.11.3): + acorn-jsx@5.3.2: resolution: { integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== } peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.3 - /acorn@8.11.3: + acorn@8.14.0: resolution: { - integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== } engines: { node: ">=0.4.0" } hasBin: true - /ajv@6.12.6: + ajv@6.12.6: resolution: { integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== } - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - /ansi-align@3.0.1: + ansi-align@3.0.1: resolution: { integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== } - dependencies: - string-width: 4.2.3 - dev: false - /ansi-regex@5.0.1: + ansi-regex@5.0.1: resolution: { integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== } engines: { node: ">=8" } - /ansi-regex@6.0.1: + ansi-regex@6.1.0: resolution: { - integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== } engines: { node: ">=12" } - dev: false - - /ansi-styles@3.2.1: - resolution: - { - integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - } - engines: { node: ">=4" } - dependencies: - color-convert: 1.9.3 - dev: false - /ansi-styles@4.3.0: + ansi-styles@4.3.0: resolution: { integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== } engines: { node: ">=8" } - dependencies: - color-convert: 2.0.1 - dev: true - /ansi-styles@6.2.1: + ansi-styles@6.2.1: resolution: { integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== } engines: { node: ">=12" } - dev: false - /anymatch@3.1.3: + anymatch@3.1.3: resolution: { integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== } engines: { node: ">= 8" } - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: false - /arg@5.0.2: + arg@5.0.2: resolution: { integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== } - dev: false - /argparse@1.0.10: + argparse@1.0.10: resolution: { integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== } - dependencies: - sprintf-js: 1.0.3 - dev: false - /argparse@2.0.1: + argparse@2.0.1: resolution: { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } - /aria-query@5.3.0: + aria-query@5.3.2: resolution: { - integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== } - dependencies: - dequal: 2.0.3 - dev: false + engines: { node: ">= 0.4" } - /array-iterate@2.0.1: + array-iterate@2.0.1: resolution: { integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg== } - dev: false - /astring@1.8.6: + astring@1.9.0: resolution: { - integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg== + integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg== } hasBin: true - dev: false - /astro-expressive-code@0.35.3(astro@4.10.2): + astro-expressive-code@0.38.3: resolution: { - integrity: sha512-f1L1m3J3EzZHDEox6TXmuKo5fTSbaNxE/HU0S0UQmvlCowtOKnU/LOsoDwsbQSYGKz+fdLRPsCjFMiKqEoyfcw== + integrity: sha512-Tvdc7RV0G92BbtyEOsfJtXU35w41CkM94fOAzxbQP67Wj5jArfserJ321FO4XA7WG9QMV0GIBmQq77NBIRDzpQ== } peerDependencies: - astro: ^4.0.0-beta || ^3.3.0 - dependencies: - astro: 4.10.2 - rehype-expressive-code: 0.35.3 - dev: false + astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 - /astro@4.10.2: + astro@5.1.3: resolution: { - integrity: sha512-SBdkoOanPsxKlKVU4uu/XG0G7NYAFoqmfBtq9SPMJ34B7Hr1MxVdEugERs8IwYN6UaxdDVcqA++9PvH6Onq2cg== + integrity: sha512-Zl/B4hmueJmlI5FJQcwbBRhHbRvbTWaTJzimkbH+jYczR5blt4uSh0DheyAt/+NwcnGfiC11z/XXJYIBR4LPUw== } - engines: { node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: ">=9.6.5", pnpm: ">=7.1.0" } + engines: { node: ^18.17.1 || ^20.3.0 || >=22.0.0, npm: ">=9.6.5", pnpm: ">=7.1.0" } hasBin: true - dependencies: - "@astrojs/compiler": 2.8.0 - "@astrojs/internal-helpers": 0.4.0 - "@astrojs/markdown-remark": 5.1.0 - "@astrojs/telemetry": 3.1.0 - "@babel/core": 7.24.7 - "@babel/generator": 7.24.7 - "@babel/parser": 7.24.7 - "@babel/plugin-transform-react-jsx": 7.24.7(@babel/core@7.24.7) - "@babel/traverse": 7.24.7 - "@babel/types": 7.24.7 - "@types/babel__core": 7.20.5 - "@types/cookie": 0.6.0 - acorn: 8.11.3 - aria-query: 5.3.0 - axobject-query: 4.0.0 - boxen: 7.1.1 - chokidar: 3.6.0 - ci-info: 4.0.0 - clsx: 2.1.1 - common-ancestor-path: 1.0.1 - cookie: 0.6.0 - cssesc: 3.0.0 - debug: 4.3.5 - deterministic-object-hash: 2.0.2 - devalue: 5.0.0 - diff: 5.2.0 - dlv: 1.1.3 - dset: 3.1.3 - es-module-lexer: 1.5.3 - esbuild: 0.21.5 - estree-walker: 3.0.3 - execa: 8.0.1 - fast-glob: 3.3.2 - flattie: 1.1.1 - github-slugger: 2.0.0 - gray-matter: 4.0.3 - html-escaper: 3.0.3 - http-cache-semantics: 4.1.1 - js-yaml: 4.1.0 - kleur: 4.1.5 - magic-string: 0.30.10 - mrmime: 2.0.0 - ora: 8.0.1 - p-limit: 5.0.0 - p-queue: 8.0.1 - path-to-regexp: 6.2.2 - preferred-pm: 3.1.3 - prompts: 2.4.2 - rehype: 13.0.1 - resolve: 1.22.8 - semver: 7.6.2 - shiki: 1.6.4 - string-width: 7.1.0 - strip-ansi: 7.1.0 - tsconfck: 3.1.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - vite: 5.3.0 - vitefu: 0.2.5(vite@5.3.0) - which-pm: 2.2.0 - yargs-parser: 21.1.1 - zod: 3.23.8 - zod-to-json-schema: 3.23.0(zod@3.23.8) - optionalDependencies: - sharp: 0.33.4 - transitivePeerDependencies: - - "@types/node" - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - - typescript - dev: false - /axobject-query@4.0.0: + axobject-query@4.1.0: resolution: { - integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw== + integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== } - dependencies: - dequal: 2.0.3 - dev: false + engines: { node: ">= 0.4" } - /bail@2.0.2: + bail@2.0.2: resolution: { integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== } - dev: false - /balanced-match@1.0.2: + balanced-match@1.0.2: resolution: { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } - dev: true - /base-64@1.0.0: + base-64@1.0.0: resolution: { integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg== } - dev: false - /bcp-47-match@2.0.3: + bcp-47-match@2.0.3: resolution: { integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ== } - dev: false - /bcp-47@2.1.0: + bcp-47@2.1.0: resolution: { integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w== } - dependencies: - is-alphabetical: 2.0.1 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - dev: false - /binary-extensions@2.3.0: + binary-extensions@2.3.0: resolution: { integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== } engines: { node: ">=8" } - dev: false - /boolbase@1.0.0: + boolbase@1.0.0: resolution: { integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== } - dev: false - /boxen@7.1.1: + boxen@8.0.1: resolution: { - integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog== + integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw== } - engines: { node: ">=14.16" } - dependencies: - ansi-align: 3.0.1 - camelcase: 7.0.1 - chalk: 5.3.0 - cli-boxes: 3.0.0 - string-width: 5.1.2 - type-fest: 2.19.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 - dev: false + engines: { node: ">=18" } - /brace-expansion@1.1.11: + brace-expansion@1.1.11: resolution: { integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== } - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - /braces@3.0.3: + braces@3.0.3: resolution: { integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== } engines: { node: ">=8" } - dependencies: - fill-range: 7.1.1 - dev: false - - /browserslist@4.23.1: - resolution: - { - integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } - hasBin: true - dependencies: - caniuse-lite: 1.0.30001633 - electron-to-chromium: 1.4.802 - node-releases: 2.0.14 - update-browserslist-db: 1.0.16(browserslist@4.23.1) - dev: false - /callsites@3.1.0: + callsites@3.1.0: resolution: { integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== } engines: { node: ">=6" } - dev: true - /camelcase@7.0.1: + camelcase@8.0.0: resolution: { - integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== + integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA== } - engines: { node: ">=14.16" } - dev: false - - /caniuse-lite@1.0.30001633: - resolution: - { - integrity: sha512-6sT0yf/z5jqf8tISAgpJDrmwOpLsrpnyCdD/lOZKvKkkJK4Dn0X5i7KF7THEZhOq+30bmhwBlNEaqPUiHiKtZg== - } - dev: false + engines: { node: ">=16" } - /ccount@2.0.1: + ccount@2.0.1: resolution: { integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== } - dev: false - - /chalk@2.4.2: - resolution: - { - integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - } - engines: { node: ">=4" } - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: false - /chalk@4.1.2: + chalk@4.1.2: resolution: { integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== } engines: { node: ">=10" } - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - /chalk@5.3.0: + chalk@5.4.1: resolution: { - integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== } engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } - dev: false - /character-entities-html4@2.1.0: + character-entities-html4@2.1.0: resolution: { integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== } - dev: false - /character-entities-legacy@3.0.0: + character-entities-legacy@3.0.0: resolution: { integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== } - dev: false - /character-entities@2.0.2: + character-entities@2.0.2: resolution: { integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== } - dev: false - /character-reference-invalid@2.0.1: + character-reference-invalid@2.0.1: resolution: { integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== } - dev: false - /chokidar@3.6.0: + chokidar@3.6.0: resolution: { integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== } engines: { node: ">= 8.10.0" } - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: false - /ci-info@4.0.0: + ci-info@4.1.0: resolution: { - integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg== + integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A== } engines: { node: ">=8" } - dev: false - /cli-boxes@3.0.0: + cli-boxes@3.0.0: resolution: { integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== } engines: { node: ">=10" } - dev: false - - /cli-cursor@4.0.0: - resolution: - { - integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - restore-cursor: 4.0.0 - dev: false - - /cli-spinners@2.9.2: - resolution: - { - integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - } - engines: { node: ">=6" } - dev: false - /clsx@2.1.1: + clsx@2.1.1: resolution: { integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== } engines: { node: ">=6" } - dev: false - /collapse-white-space@2.1.0: + collapse-white-space@2.1.0: resolution: { integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw== } - dev: false - - /color-convert@1.9.3: - resolution: - { - integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - } - dependencies: - color-name: 1.1.3 - dev: false - /color-convert@2.0.1: + color-convert@2.0.1: resolution: { integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== } engines: { node: ">=7.0.0" } - dependencies: - color-name: 1.1.4 - - /color-name@1.1.3: - resolution: - { - integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - } - dev: false - /color-name@1.1.4: + color-name@1.1.4: resolution: { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== } - /color-string@1.9.1: + color-string@1.9.1: resolution: { integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== } - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - dev: false - /color@4.2.3: + color@4.2.3: resolution: { integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== } engines: { node: ">=12.5.0" } - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - dev: false - /comma-separated-tokens@2.0.3: + comma-separated-tokens@2.0.3: resolution: { integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== } - dev: false - /common-ancestor-path@1.0.1: + common-ancestor-path@1.0.1: resolution: { integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== } - dev: false - /concat-map@0.0.1: + concat-map@0.0.1: resolution: { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== } - dev: true - /convert-source-map@2.0.0: + consola@3.3.3: + resolution: + { + integrity: sha512-Qil5KwghMzlqd51UXM0b6fyaGHtOC22scxrwrz4A2882LyUMwQjnvaedN1HAeXzphspQ6CpHkzMAWxBTUruDLg== + } + engines: { node: ^14.18.0 || >=16.10.0 } + + cookie-es@1.2.2: resolution: { - integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg== } - dev: false - /cookie@0.6.0: + cookie@0.7.2: resolution: { - integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== } engines: { node: ">= 0.6" } - dev: false - /cross-spawn@7.0.3: + cross-spawn@7.0.6: resolution: { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== } engines: { node: ">= 8" } - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - /css-selector-parser@3.0.5: + crossws@0.3.1: + resolution: + { + integrity: sha512-HsZgeVYaG+b5zA+9PbIPGq4+J/CJynJuearykPsXx4V/eMhyQ5EDVg3Ak2FBZtVXCiOLu/U7IiwDHTr9MA+IKw== + } + + css-selector-parser@3.0.5: resolution: { integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g== } - dev: false - /cssesc@3.0.0: + cssesc@3.0.0: resolution: { integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== } engines: { node: ">=4" } hasBin: true - dev: false - /debug@4.3.5: + debug@4.4.0: resolution: { - integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== } engines: { node: ">=6.0" } peerDependencies: @@ -2438,228 +1652,168 @@ packages: peerDependenciesMeta: supports-color: optional: true - dependencies: - ms: 2.1.2 - /decode-named-character-reference@1.0.2: + decode-named-character-reference@1.0.2: resolution: { integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== } - dependencies: - character-entities: 2.0.2 - dev: false - /deep-is@0.1.4: + deep-is@0.1.4: resolution: { integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== } - dev: true - /dequal@2.0.3: + defu@6.1.4: + resolution: + { + integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== + } + + dequal@2.0.3: resolution: { integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== } engines: { node: ">=6" } - dev: false - /detect-libc@2.0.3: + destr@2.0.3: + resolution: + { + integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ== + } + + detect-libc@2.0.3: resolution: { integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== } engines: { node: ">=8" } - dev: false - /deterministic-object-hash@2.0.2: + deterministic-object-hash@2.0.2: resolution: { integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ== } engines: { node: ">=18" } - dependencies: - base-64: 1.0.0 - dev: false - /devalue@5.0.0: + devalue@5.1.1: resolution: { - integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA== + integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw== } - dev: false - /devlop@1.1.0: + devlop@1.1.0: resolution: { integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== } - dependencies: - dequal: 2.0.3 - dev: false - /diff@5.2.0: + diff@5.2.0: resolution: { integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== } engines: { node: ">=0.3.1" } - dev: false - /direction@2.0.1: + direction@2.0.1: resolution: { integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA== } hasBin: true - dev: false - /dlv@1.1.3: + dlv@1.1.3: resolution: { integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== } - dev: false - /doctrine@3.0.0: + dset@3.1.4: resolution: { - integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA== } - engines: { node: ">=6.0.0" } - dependencies: - esutils: 2.0.3 - dev: true + engines: { node: ">=4" } - /dset@3.1.3: + emoji-regex-xs@1.0.0: resolution: { - integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ== + integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg== } - engines: { node: ">=4" } - dev: false - /eastasianwidth@0.2.0: + emoji-regex@10.4.0: resolution: { - integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== } - dev: false - /electron-to-chromium@1.4.802: + emoji-regex@8.0.0: resolution: { - integrity: sha512-TnTMUATbgNdPXVSHsxvNVSG0uEd6cSZsANjm8c9HbvflZVVn1yTRcmVXYT1Ma95/ssB/Dcd30AHweH2TE+dNpA== + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== } - dev: false - /emoji-regex@10.3.0: + entities@4.5.0: resolution: { - integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== } - dev: false + engines: { node: ">=0.12" } - /emoji-regex@8.0.0: + es-module-lexer@1.6.0: resolution: { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== } - dev: false - /emoji-regex@9.2.2: + esast-util-from-estree@2.0.0: resolution: { - integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ== } - dev: false - /entities@4.5.0: + esast-util-from-js@2.0.1: resolution: { - integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw== } - engines: { node: ">=0.12" } - dev: false - /es-module-lexer@1.5.3: + esbuild@0.21.5: resolution: { - integrity: sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg== + integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== } - dev: false + engines: { node: ">=12" } + hasBin: true - /esbuild@0.21.5: + esbuild@0.24.2: resolution: { - integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== + integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA== } - engines: { node: ">=12" } + engines: { node: ">=18" } hasBin: true - requiresBuild: true - optionalDependencies: - "@esbuild/aix-ppc64": 0.21.5 - "@esbuild/android-arm": 0.21.5 - "@esbuild/android-arm64": 0.21.5 - "@esbuild/android-x64": 0.21.5 - "@esbuild/darwin-arm64": 0.21.5 - "@esbuild/darwin-x64": 0.21.5 - "@esbuild/freebsd-arm64": 0.21.5 - "@esbuild/freebsd-x64": 0.21.5 - "@esbuild/linux-arm": 0.21.5 - "@esbuild/linux-arm64": 0.21.5 - "@esbuild/linux-ia32": 0.21.5 - "@esbuild/linux-loong64": 0.21.5 - "@esbuild/linux-mips64el": 0.21.5 - "@esbuild/linux-ppc64": 0.21.5 - "@esbuild/linux-riscv64": 0.21.5 - "@esbuild/linux-s390x": 0.21.5 - "@esbuild/linux-x64": 0.21.5 - "@esbuild/netbsd-x64": 0.21.5 - "@esbuild/openbsd-x64": 0.21.5 - "@esbuild/sunos-x64": 0.21.5 - "@esbuild/win32-arm64": 0.21.5 - "@esbuild/win32-ia32": 0.21.5 - "@esbuild/win32-x64": 0.21.5 - dev: false - - /escalade@3.1.2: - resolution: - { - integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - } - engines: { node: ">=6" } - dev: false - - /escape-string-regexp@1.0.5: - resolution: - { - integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - } - engines: { node: ">=0.8.0" } - dev: false - /escape-string-regexp@4.0.0: + escape-string-regexp@4.0.0: resolution: { integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== } engines: { node: ">=10" } - dev: true - /escape-string-regexp@5.0.0: + escape-string-regexp@5.0.0: resolution: { integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== } engines: { node: ">=12" } - dev: false - /eslint-plugin-prettier@5.1.3(eslint@8.57.0)(prettier@3.3.2): + eslint-plugin-prettier@5.2.1: resolution: { - integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== + integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw== } engines: { node: ^14.18.0 || >=16.0.0 } peerDependencies: @@ -2672,3942 +1826,4965 @@ packages: optional: true eslint-config-prettier: optional: true - dependencies: - eslint: 8.57.0 - prettier: 3.3.2 - prettier-linter-helpers: 1.0.0 - synckit: 0.8.8 - dev: true - /eslint-scope@7.2.2: + eslint-scope@8.2.0: resolution: { - integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - /eslint-visitor-keys@3.4.3: + eslint-visitor-keys@3.4.3: resolution: { integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dev: true - /eslint@8.57.0: + eslint-visitor-keys@4.2.0: resolution: { - integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + eslint@9.17.0: + resolution: + { + integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA== + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } hasBin: true - dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.57.0) - "@eslint-community/regexpp": 4.10.1 - "@eslint/eslintrc": 2.1.4 - "@eslint/js": 8.57.0 - "@humanwhocodes/config-array": 0.11.14 - "@humanwhocodes/module-importer": 1.0.1 - "@nodelib/fs.walk": 1.2.8 - "@ungap/structured-clone": 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.5 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.1 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true - /espree@9.6.1: + espree@10.3.0: resolution: { - integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 3.4.3 - dev: true + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - /esprima@4.0.1: + esprima@4.0.1: resolution: { integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== } engines: { node: ">=4" } hasBin: true - dev: false - /esquery@1.5.0: + esquery@1.6.0: resolution: { - integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== } engines: { node: ">=0.10" } - dependencies: - estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: + esrecurse@4.3.0: resolution: { integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== } engines: { node: ">=4.0" } - dependencies: - estraverse: 5.3.0 - dev: true - /estraverse@5.3.0: + estraverse@5.3.0: resolution: { integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== } engines: { node: ">=4.0" } - dev: true - /estree-util-attach-comments@3.0.0: + estree-util-attach-comments@3.0.0: resolution: { integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw== } - dependencies: - "@types/estree": 1.0.5 - dev: false - /estree-util-build-jsx@3.0.1: + estree-util-build-jsx@3.0.1: resolution: { integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ== } - dependencies: - "@types/estree-jsx": 1.0.5 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - estree-walker: 3.0.3 - dev: false - /estree-util-is-identifier-name@3.0.0: + estree-util-is-identifier-name@3.0.0: resolution: { integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== } - dev: false - /estree-util-to-js@2.0.0: + estree-util-scope@1.0.0: resolution: { - integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg== + integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ== } - dependencies: - "@types/estree-jsx": 1.0.5 - astring: 1.8.6 - source-map: 0.7.4 - dev: false - /estree-util-visit@2.0.0: + estree-util-to-js@2.0.0: resolution: { - integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww== + integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg== } - dependencies: - "@types/estree-jsx": 1.0.5 - "@types/unist": 3.0.2 - dev: false - /estree-walker@3.0.3: + estree-util-visit@2.0.0: resolution: { - integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww== } - dependencies: - "@types/estree": 1.0.5 - dev: false - /esutils@2.0.3: + estree-walker@2.0.2: resolution: { - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== } - engines: { node: ">=0.10.0" } - dev: true - /eventemitter3@5.0.1: + estree-walker@3.0.3: resolution: { - integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== } - dev: false - /execa@8.0.1: + esutils@2.0.3: resolution: { - integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== } - engines: { node: ">=16.17" } - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - dev: false + engines: { node: ">=0.10.0" } - /expressive-code@0.35.3: + eventemitter3@5.0.1: resolution: { - integrity: sha512-XjWWUCxS4uQjPoRM98R7SNWWIYlFEaOeHm1piWv+c7coHCekuWno81thsc3g/UJ+DajNtOEsIQIAAcsBQZ8LMg== + integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== } - dependencies: - "@expressive-code/core": 0.35.3 - "@expressive-code/plugin-frames": 0.35.3 - "@expressive-code/plugin-shiki": 0.35.3 - "@expressive-code/plugin-text-markers": 0.35.3 - dev: false - /extend-shallow@2.0.1: + expressive-code@0.38.3: resolution: { - integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + integrity: sha512-COM04AiUotHCKJgWdn7NtW2lqu8OW8owAidMpkXt1qxrZ9Q2iC7+tok/1qIn2ocGnczvr9paIySgGnEwFeEQ8Q== } - engines: { node: ">=0.10.0" } - dependencies: - is-extendable: 0.1.1 - dev: false - /extend@3.0.2: + extend@3.0.2: resolution: { integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== } - dev: false - /fast-deep-equal@3.1.3: + fast-deep-equal@3.1.3: resolution: { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== } - dev: true - /fast-diff@1.3.0: + fast-diff@1.3.0: resolution: { integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== } - dev: true - /fast-glob@3.3.2: + fast-glob@3.3.3: resolution: { - integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== } engines: { node: ">=8.6.0" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.7 - dev: false - /fast-json-stable-stringify@2.1.0: + fast-json-stable-stringify@2.1.0: resolution: { integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== } - dev: true - /fast-levenshtein@2.0.6: + fast-levenshtein@2.0.6: resolution: { integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== } - dev: true - /fast-xml-parser@4.4.0: + fast-xml-parser@4.5.1: resolution: { - integrity: sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg== + integrity: sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w== } hasBin: true - dependencies: - strnum: 1.0.5 - dev: true - /fastq@1.17.1: + fastq@1.18.0: resolution: { - integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw== } - dependencies: - reusify: 1.0.4 - /file-entry-cache@6.0.1: + file-entry-cache@8.0.0: resolution: { - integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flat-cache: 3.2.0 - dev: true + engines: { node: ">=16.0.0" } - /fill-range@7.1.1: + fill-range@7.1.1: resolution: { integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== } engines: { node: ">=8" } - dependencies: - to-regex-range: 5.0.1 - dev: false - /find-up@4.1.0: + find-up-simple@1.0.0: + resolution: + { + integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw== + } + engines: { node: ">=18" } + + find-up@4.1.0: resolution: { integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== } engines: { node: ">=8" } - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: false - /find-up@5.0.0: + find-up@5.0.0: resolution: { integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== } engines: { node: ">=10" } - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - /find-yarn-workspace-root2@1.2.16: + find-yarn-workspace-root2@1.2.16: resolution: { integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA== } - dependencies: - micromatch: 4.0.7 - pkg-dir: 4.2.0 - dev: false - /flat-cache@3.2.0: + flat-cache@4.0.1: resolution: { - integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - rimraf: 3.0.2 - dev: true + engines: { node: ">=16" } - /flatted@3.3.1: + flatted@3.3.2: resolution: { - integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== } - dev: true - /flattie@1.1.1: + flattie@1.1.1: resolution: { integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ== } engines: { node: ">=8" } - dev: false - /fs.realpath@1.0.0: + fsevents@2.3.3: resolution: { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== } - dev: true + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] - /fsevents@2.3.3: + get-east-asian-width@1.3.0: resolution: { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== + } + engines: { node: ">=18" } + + github-slugger@2.0.0: + resolution: + { + integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw== } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] - requiresBuild: true - dev: false - optional: true - /function-bind@1.1.2: + glob-parent@5.1.2: resolution: { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== } - dev: false + engines: { node: ">= 6" } - /gensync@1.0.0-beta.2: + glob-parent@6.0.2: resolution: { - integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== } - engines: { node: ">=6.9.0" } - dev: false + engines: { node: ">=10.13.0" } - /get-east-asian-width@1.2.0: + globals@14.0.0: resolution: { - integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== + integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== } engines: { node: ">=18" } - dev: false - /get-stream@8.0.1: + graceful-fs@4.2.11: resolution: { - integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== } - engines: { node: ">=16" } - dev: false - /github-slugger@2.0.0: + h3@1.13.0: resolution: { - integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw== + integrity: sha512-vFEAu/yf8UMUcB4s43OaDaigcqpQd14yanmOsn+NcRX3/guSKncyE2rOYhq8RIchgJrPSs/QiIddnTTR1ddiAg== } - dev: false - /glob-parent@5.1.2: + has-flag@4.0.0: resolution: { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== } - engines: { node: ">= 6" } - dependencies: - is-glob: 4.0.3 - dev: false + engines: { node: ">=8" } - /glob-parent@6.0.2: + hast-util-embedded@3.0.0: resolution: { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA== } - engines: { node: ">=10.13.0" } - dependencies: - is-glob: 4.0.3 - dev: true - /glob@7.2.3: + hast-util-format@1.1.0: resolution: { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA== } - deprecated: Glob versions prior to v9 are no longer supported - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - /globals@11.12.0: + hast-util-from-html@2.0.3: resolution: { - integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw== } - engines: { node: ">=4" } - dev: false - /globals@13.24.0: + hast-util-from-parse5@8.0.2: resolution: { - integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + integrity: sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A== } - engines: { node: ">=8" } - dependencies: - type-fest: 0.20.2 - dev: true - /graceful-fs@4.2.11: + hast-util-has-property@3.0.0: resolution: { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA== } - dev: false - /graphemer@1.4.0: + hast-util-is-body-ok-link@3.0.1: resolution: { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ== } - dev: true - /gray-matter@4.0.3: + hast-util-is-element@3.0.0: resolution: { - integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== + integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g== } - engines: { node: ">=6.0" } - dependencies: - js-yaml: 3.14.1 - kind-of: 6.0.3 - section-matter: 1.0.0 - strip-bom-string: 1.0.0 - dev: false - /has-flag@3.0.0: + hast-util-minify-whitespace@1.0.1: resolution: { - integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw== } - engines: { node: ">=4" } - dev: false - /has-flag@4.0.0: + hast-util-parse-selector@4.0.0: resolution: { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== } - engines: { node: ">=8" } - dev: true - /hasown@2.0.2: + hast-util-phrasing@3.0.1: resolution: { - integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ== } - engines: { node: ">= 0.4" } - dependencies: - function-bind: 1.1.2 - dev: false - /hast-util-embedded@3.0.0: + hast-util-raw@9.1.0: resolution: { - integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA== + integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw== } - dependencies: - "@types/hast": 3.0.4 - hast-util-is-element: 3.0.0 - dev: false - /hast-util-from-html@2.0.1: + hast-util-select@6.0.3: resolution: { - integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g== + integrity: sha512-OVRQlQ1XuuLP8aFVLYmC2atrfWHS5UD3shonxpnyrjcCkwtvmt/+N6kYJdcY4mkMJhxp4kj2EFIxQ9kvkkt/eQ== } - dependencies: - "@types/hast": 3.0.4 - devlop: 1.1.0 - hast-util-from-parse5: 8.0.1 - parse5: 7.1.2 - vfile: 6.0.1 - vfile-message: 4.0.2 - dev: false - /hast-util-from-parse5@8.0.1: + hast-util-to-estree@3.1.1: resolution: { - integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ== + integrity: sha512-IWtwwmPskfSmma9RpzCappDUitC8t5jhAynHhc1m2+5trOgsrp7txscUSavc5Ic8PATyAjfrCK1wgtxh2cICVQ== } - dependencies: - "@types/hast": 3.0.4 - "@types/unist": 3.0.2 - devlop: 1.1.0 - hastscript: 8.0.0 - property-information: 6.5.0 - vfile: 6.0.1 - vfile-location: 5.0.2 - web-namespaces: 2.0.1 - dev: false - /hast-util-has-property@3.0.0: + hast-util-to-html@9.0.4: resolution: { - integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA== + integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA== } - dependencies: - "@types/hast": 3.0.4 - dev: false - /hast-util-is-body-ok-link@3.0.0: + hast-util-to-jsx-runtime@2.3.2: resolution: { - integrity: sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w== + integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg== } - dependencies: - "@types/hast": 3.0.4 - dev: false - /hast-util-is-element@3.0.0: + hast-util-to-parse5@8.0.0: resolution: { - integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g== + integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw== } - dependencies: - "@types/hast": 3.0.4 - dev: false - /hast-util-parse-selector@4.0.0: + hast-util-to-string@3.0.1: resolution: { - integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== + integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A== } - dependencies: - "@types/hast": 3.0.4 - dev: false - /hast-util-phrasing@3.0.1: + hast-util-to-text@4.0.2: resolution: { - integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ== + integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A== } - dependencies: - "@types/hast": 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-has-property: 3.0.0 - hast-util-is-body-ok-link: 3.0.0 - hast-util-is-element: 3.0.0 - dev: false - /hast-util-raw@9.0.3: + hast-util-whitespace@3.0.0: resolution: { - integrity: sha512-ICWvVOF2fq4+7CMmtCPD5CM4QKjPbHpPotE6+8tDooV0ZuyJVUzHsrNX+O5NaRbieTf0F7FfeBOMAwi6Td0+yQ== + integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== } - dependencies: - "@types/hast": 3.0.4 - "@types/unist": 3.0.2 - "@ungap/structured-clone": 1.2.0 - hast-util-from-parse5: 8.0.1 - hast-util-to-parse5: 8.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 - parse5: 7.1.2 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: false - /hast-util-select@6.0.2: + hastscript@9.0.0: resolution: { - integrity: sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q== + integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw== } - dependencies: - "@types/hast": 3.0.4 - "@types/unist": 3.0.2 - bcp-47-match: 2.0.3 - comma-separated-tokens: 2.0.3 - css-selector-parser: 3.0.5 - devlop: 1.1.0 - direction: 2.0.1 - hast-util-has-property: 3.0.0 - hast-util-to-string: 3.0.0 - hast-util-whitespace: 3.0.0 - not: 0.1.0 - nth-check: 2.1.1 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - dev: false - /hast-util-to-estree@3.1.0: + html-escaper@3.0.3: resolution: { - integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw== + integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ== } - dependencies: - "@types/estree": 1.0.5 - "@types/estree-jsx": 1.0.5 - "@types/hast": 3.0.4 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - estree-util-attach-comments: 3.0.0 - estree-util-is-identifier-name: 3.0.0 - hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.2 - mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - style-to-object: 0.4.4 - unist-util-position: 5.0.0 - zwitch: 2.0.4 - transitivePeerDependencies: - - supports-color - dev: false - /hast-util-to-html@9.0.1: + html-void-elements@3.0.0: resolution: { - integrity: sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ== + integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== } - dependencies: - "@types/hast": 3.0.4 - "@types/unist": 3.0.2 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-raw: 9.0.3 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.4 - zwitch: 2.0.4 - dev: false - /hast-util-to-jsx-runtime@2.3.0: + html-whitespace-sensitive-tag-names@3.0.1: resolution: { - integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ== + integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA== } - dependencies: - "@types/estree": 1.0.5 - "@types/hast": 3.0.4 - "@types/unist": 3.0.2 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.2 - mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - style-to-object: 1.0.6 - unist-util-position: 5.0.0 - vfile-message: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: false - /hast-util-to-parse5@8.0.0: + http-cache-semantics@4.1.1: resolution: { - integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw== + integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== } - dependencies: - "@types/hast": 3.0.4 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: false - /hast-util-to-string@3.0.0: + i18next@23.16.8: resolution: { - integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA== + integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg== } - dependencies: - "@types/hast": 3.0.4 - dev: false - /hast-util-to-text@4.0.2: + ignore@5.3.2: resolution: { - integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A== + integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== } - dependencies: - "@types/hast": 3.0.4 - "@types/unist": 3.0.2 - hast-util-is-element: 3.0.0 - unist-util-find-after: 5.0.0 - dev: false + engines: { node: ">= 4" } - /hast-util-whitespace@3.0.0: + import-fresh@3.3.0: resolution: { - integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== } - dependencies: - "@types/hast": 3.0.4 - dev: false + engines: { node: ">=6" } - /hastscript@8.0.0: + import-meta-resolve@4.1.0: resolution: { - integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw== + integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== } - dependencies: - "@types/hast": 3.0.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - dev: false - /hastscript@9.0.0: + imurmurhash@0.1.4: resolution: { - integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw== + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== } - dependencies: - "@types/hast": 3.0.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - dev: false + engines: { node: ">=0.8.19" } - /html-escaper@3.0.3: + inline-style-parser@0.2.4: resolution: { - integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ== + integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q== } - dev: false - /html-void-elements@3.0.0: + iron-webcrypto@1.2.1: resolution: { - integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== + integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg== } - dev: false - /html-whitespace-sensitive-tag-names@3.0.0: + is-absolute-url@4.0.1: resolution: { - integrity: sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w== + integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A== } - dev: false + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - /http-cache-semantics@4.1.1: + is-alphabetical@2.0.1: resolution: { - integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== } - dev: false - /human-signals@5.0.0: + is-alphanumerical@2.0.1: resolution: { - integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== } - engines: { node: ">=16.17.0" } - dev: false - /ignore@5.3.1: + is-arrayish@0.3.2: resolution: { - integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== } - engines: { node: ">= 4" } - dev: true - /import-fresh@3.3.0: + is-binary-path@2.1.0: resolution: { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== } - engines: { node: ">=6" } - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true + engines: { node: ">=8" } - /import-meta-resolve@4.1.0: + is-decimal@2.0.1: resolution: { - integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== + integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== } - dev: false - /imurmurhash@0.1.4: + is-docker@3.0.0: resolution: { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== } - engines: { node: ">=0.8.19" } - dev: true + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + hasBin: true - /inflight@1.0.6: + is-extglob@2.1.1: resolution: { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== } - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true + engines: { node: ">=0.10.0" } - /inherits@2.0.4: + is-fullwidth-code-point@3.0.0: resolution: { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== } - dev: true + engines: { node: ">=8" } - /inline-style-parser@0.1.1: + is-glob@4.0.3: resolution: { - integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== } - dev: false + engines: { node: ">=0.10.0" } - /inline-style-parser@0.2.3: + is-hexadecimal@2.0.1: resolution: { - integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g== + integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== } - dev: false - /is-absolute-url@4.0.1: + is-inside-container@1.0.0: resolution: { - integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A== + integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: false + engines: { node: ">=14.16" } + hasBin: true - /is-alphabetical@2.0.1: + is-number@7.0.0: resolution: { - integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== } - dev: false + engines: { node: ">=0.12.0" } - /is-alphanumerical@2.0.1: + is-plain-obj@4.1.0: resolution: { - integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== + integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== } - dependencies: - is-alphabetical: 2.0.1 - is-decimal: 2.0.1 - dev: false + engines: { node: ">=12" } - /is-arrayish@0.3.2: + is-wsl@3.1.0: resolution: { - integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== } - dev: false + engines: { node: ">=16" } - /is-binary-path@2.1.0: + isexe@2.0.0: resolution: { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } - engines: { node: ">=8" } - dependencies: - binary-extensions: 2.3.0 - dev: false - /is-buffer@2.0.5: + js-yaml@3.14.1: resolution: { - integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== } - engines: { node: ">=4" } - dev: false + hasBin: true - /is-core-module@2.13.1: + js-yaml@4.1.0: resolution: { - integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== } - dependencies: - hasown: 2.0.2 - dev: false + hasBin: true - /is-decimal@2.0.1: + json-buffer@3.0.1: resolution: { - integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== } - dev: false - /is-docker@3.0.0: + json-schema-traverse@0.4.1: resolution: { - integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - hasBin: true - dev: false - /is-extendable@0.1.1: + json-stable-stringify-without-jsonify@1.0.1: resolution: { - integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== } - engines: { node: ">=0.10.0" } - dev: false - /is-extglob@2.1.1: + keyv@4.5.4: resolution: { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== } - engines: { node: ">=0.10.0" } - /is-fullwidth-code-point@3.0.0: + kleur@3.0.3: resolution: { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== } - engines: { node: ">=8" } - dev: false + engines: { node: ">=6" } - /is-glob@4.0.3: + kleur@4.1.5: resolution: { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== } - engines: { node: ">=0.10.0" } - dependencies: - is-extglob: 2.1.1 + engines: { node: ">=6" } - /is-hexadecimal@2.0.1: + levn@0.4.1: resolution: { - integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== } - dev: false + engines: { node: ">= 0.8.0" } - /is-inside-container@1.0.0: + load-yaml-file@0.2.0: resolution: { - integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw== } - engines: { node: ">=14.16" } - hasBin: true - dependencies: - is-docker: 3.0.0 - dev: false + engines: { node: ">=6" } - /is-interactive@2.0.0: + locate-path@5.0.0: resolution: { - integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== } - engines: { node: ">=12" } - dev: false + engines: { node: ">=8" } - /is-number@7.0.0: + locate-path@6.0.0: resolution: { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== } - engines: { node: ">=0.12.0" } - dev: false + engines: { node: ">=10" } - /is-path-inside@3.0.3: + lodash.merge@4.6.2: resolution: { - integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== } - engines: { node: ">=8" } - dev: true - /is-plain-obj@4.1.0: + longest-streak@3.1.0: resolution: { - integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== } - engines: { node: ">=12" } - dev: false - /is-reference@3.0.2: + lru-cache@10.4.3: resolution: { - integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg== + integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== } - dependencies: - "@types/estree": 1.0.5 - dev: false - /is-stream@3.0.0: + magic-string@0.30.17: resolution: { - integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: false - /is-unicode-supported@1.3.0: + magicast@0.3.5: resolution: { - integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== + integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ== } - engines: { node: ">=12" } - dev: false - /is-unicode-supported@2.0.0: + markdown-extensions@2.0.0: resolution: { - integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q== + integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== } - engines: { node: ">=18" } - dev: false + engines: { node: ">=16" } - /is-wsl@3.1.0: + markdown-table@3.0.4: resolution: { - integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== + integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== } - engines: { node: ">=16" } - dependencies: - is-inside-container: 1.0.0 - dev: false - /isexe@2.0.0: + mdast-util-definitions@6.0.0: resolution: { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ== } - /js-tokens@4.0.0: + mdast-util-directive@3.0.0: resolution: { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q== } - dev: false - /js-yaml@3.14.1: + mdast-util-find-and-replace@3.0.2: resolution: { - integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg== } - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: false - /js-yaml@4.1.0: + mdast-util-from-markdown@2.0.2: resolution: { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA== } - hasBin: true - dependencies: - argparse: 2.0.1 - /jsesc@2.5.2: + mdast-util-gfm-autolink-literal@2.0.1: resolution: { - integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ== } - engines: { node: ">=4" } - hasBin: true - dev: false - /json-buffer@3.0.1: + mdast-util-gfm-footnote@2.0.0: resolution: { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ== } - dev: true - /json-schema-traverse@0.4.1: + mdast-util-gfm-strikethrough@2.0.0: resolution: { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== } - dev: true - /json-stable-stringify-without-jsonify@1.0.1: + mdast-util-gfm-table@2.0.0: resolution: { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== } - dev: true - /json5@2.2.3: + mdast-util-gfm-task-list-item@2.0.0: resolution: { - integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== } - engines: { node: ">=6" } - hasBin: true - dev: false - /keyv@4.5.4: + mdast-util-gfm@3.0.0: resolution: { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw== } - dependencies: - json-buffer: 3.0.1 - dev: true - /kind-of@6.0.3: + mdast-util-mdx-expression@2.0.1: resolution: { - integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ== } - engines: { node: ">=0.10.0" } - dev: false - /kleur@3.0.3: + mdast-util-mdx-jsx@3.1.3: resolution: { - integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ== } - engines: { node: ">=6" } - dev: false - /kleur@4.1.5: + mdast-util-mdx@3.0.0: resolution: { - integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w== } - engines: { node: ">=6" } - dev: false - /levn@0.4.1: + mdast-util-mdxjs-esm@2.0.1: resolution: { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== } - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - /load-yaml-file@0.2.0: + mdast-util-phrasing@4.1.0: resolution: { - integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw== + integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== } - engines: { node: ">=6" } - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - dev: false - /locate-path@5.0.0: + mdast-util-to-hast@13.2.0: resolution: { - integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== } - engines: { node: ">=8" } - dependencies: - p-locate: 4.1.0 - dev: false - /locate-path@6.0.0: + mdast-util-to-markdown@2.1.2: resolution: { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA== } - engines: { node: ">=10" } - dependencies: - p-locate: 5.0.0 - /lodash.merge@4.6.2: + mdast-util-to-string@4.0.0: resolution: { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== } - dev: true - /log-symbols@6.0.0: + merge2@1.4.1: resolution: { - integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw== + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== } - engines: { node: ">=18" } - dependencies: - chalk: 5.3.0 - is-unicode-supported: 1.3.0 - dev: false + engines: { node: ">= 8" } - /longest-streak@3.1.0: + micromark-core-commonmark@2.0.2: resolution: { - integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w== } - dev: false - /lru-cache@5.1.1: + micromark-extension-directive@3.0.2: resolution: { - integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA== } - dependencies: - yallist: 3.1.1 - dev: false - /magic-string@0.30.10: + micromark-extension-gfm-autolink-literal@2.1.0: resolution: { - integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== + integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw== } - dependencies: - "@jridgewell/sourcemap-codec": 1.4.15 - dev: false - /markdown-extensions@2.0.0: + micromark-extension-gfm-footnote@2.1.0: resolution: { - integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== + integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== } - engines: { node: ">=16" } - dev: false - /markdown-table@3.0.3: + micromark-extension-gfm-strikethrough@2.1.0: resolution: { - integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== + integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw== } - dev: false - /mdast-util-definitions@6.0.0: + micromark-extension-gfm-table@2.1.0: resolution: { - integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ== + integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g== } - dependencies: - "@types/mdast": 4.0.4 - "@types/unist": 3.0.2 - unist-util-visit: 5.0.0 - dev: false - /mdast-util-directive@3.0.0: + micromark-extension-gfm-tagfilter@2.0.0: resolution: { - integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q== + integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== } - dependencies: - "@types/mdast": 4.0.4 - "@types/unist": 3.0.2 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - parse-entities: 4.0.1 - stringify-entities: 4.0.4 - unist-util-visit-parents: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: false - /mdast-util-find-and-replace@3.0.1: + micromark-extension-gfm-task-list-item@2.1.0: resolution: { - integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA== + integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw== } - dependencies: - "@types/mdast": 4.0.4 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: false - /mdast-util-from-markdown@2.0.1: + micromark-extension-gfm@3.0.0: resolution: { - integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA== + integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== } - dependencies: - "@types/mdast": 4.0.4 - "@types/unist": 3.0.2 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-decode-string: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: false - /mdast-util-gfm-autolink-literal@2.0.0: + micromark-extension-mdx-expression@3.0.0: resolution: { - integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg== + integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ== } - dependencies: - "@types/mdast": 4.0.4 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.1 - micromark-util-character: 2.1.0 - dev: false - /mdast-util-gfm-footnote@2.0.0: + micromark-extension-mdx-jsx@3.0.1: resolution: { - integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ== + integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg== } - dependencies: - "@types/mdast": 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: false - /mdast-util-gfm-strikethrough@2.0.0: + micromark-extension-mdx-md@2.0.0: resolution: { - integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== + integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ== } - dependencies: - "@types/mdast": 4.0.4 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - /mdast-util-gfm-table@2.0.0: + micromark-extension-mdxjs-esm@3.0.0: resolution: { - integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== + integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A== } - dependencies: - "@types/mdast": 4.0.4 - devlop: 1.1.0 - markdown-table: 3.0.3 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - /mdast-util-gfm-task-list-item@2.0.0: + micromark-extension-mdxjs@3.0.0: resolution: { - integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== + integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ== } - dependencies: - "@types/mdast": 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - /mdast-util-gfm@3.0.0: + micromark-factory-destination@2.0.1: resolution: { - integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw== + integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== } - dependencies: - mdast-util-from-markdown: 2.0.1 - mdast-util-gfm-autolink-literal: 2.0.0 - mdast-util-gfm-footnote: 2.0.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - /mdast-util-mdx-expression@2.0.0: + micromark-factory-label@2.0.1: resolution: { - integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw== + integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== } - dependencies: - "@types/estree-jsx": 1.0.5 - "@types/hast": 3.0.4 - "@types/mdast": 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - /mdast-util-mdx-jsx@3.1.2: + micromark-factory-mdx-expression@2.0.2: resolution: { - integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA== + integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw== } - dependencies: - "@types/estree-jsx": 1.0.5 - "@types/hast": 3.0.4 - "@types/mdast": 4.0.4 - "@types/unist": 3.0.2 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - parse-entities: 4.0.1 - stringify-entities: 4.0.4 - unist-util-remove-position: 5.0.0 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: false - /mdast-util-mdx@3.0.0: + micromark-factory-space@2.0.1: resolution: { - integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w== + integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== } - dependencies: - mdast-util-from-markdown: 2.0.1 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.2 - mdast-util-mdxjs-esm: 2.0.1 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - /mdast-util-mdxjs-esm@2.0.1: + micromark-factory-title@2.0.1: resolution: { - integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== + integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== } - dependencies: - "@types/estree-jsx": 1.0.5 - "@types/hast": 3.0.4 - "@types/mdast": 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - /mdast-util-phrasing@4.1.0: + micromark-factory-whitespace@2.0.1: resolution: { - integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== + integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== } - dependencies: - "@types/mdast": 4.0.4 - unist-util-is: 6.0.0 - dev: false - /mdast-util-to-hast@13.2.0: + micromark-util-character@2.1.1: resolution: { - integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== + integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== } - dependencies: - "@types/hast": 3.0.4 - "@types/mdast": 4.0.4 - "@ungap/structured-clone": 1.2.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.0 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - dev: false - /mdast-util-to-markdown@2.1.0: + micromark-util-chunked@2.0.1: resolution: { - integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ== + integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== } - dependencies: - "@types/mdast": 4.0.4 - "@types/unist": 3.0.2 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.1.0 - mdast-util-to-string: 4.0.0 - micromark-util-decode-string: 2.0.0 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - dev: false - /mdast-util-to-string@4.0.0: + micromark-util-classify-character@2.0.1: resolution: { - integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== + integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== } - dependencies: - "@types/mdast": 4.0.4 - dev: false - /merge-stream@2.0.0: + micromark-util-combine-extensions@2.0.1: resolution: { - integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== } - dev: false - /merge2@1.4.1: + micromark-util-decode-numeric-character-reference@2.0.2: resolution: { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== } - engines: { node: ">= 8" } - dev: false - /micromark-core-commonmark@2.0.1: + micromark-util-decode-string@2.0.1: resolution: { - integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA== + integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== } - dependencies: - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-factory-destination: 2.0.0 - micromark-factory-label: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-factory-title: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-html-tag-name: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - /micromark-extension-directive@3.0.0: + micromark-util-encode@2.0.1: resolution: { - integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg== + integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== } - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - parse-entities: 4.0.1 - dev: false - /micromark-extension-gfm-autolink-literal@2.0.0: + micromark-util-events-to-acorn@2.0.2: resolution: { - integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg== + integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA== } - dependencies: - micromark-util-character: 2.1.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - /micromark-extension-gfm-footnote@2.0.0: + micromark-util-html-tag-name@2.0.1: resolution: { - integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg== + integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== } - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - /micromark-extension-gfm-strikethrough@2.0.0: + micromark-util-normalize-identifier@2.0.1: resolution: { - integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw== + integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== } - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - /micromark-extension-gfm-table@2.0.0: + micromark-util-resolve-all@2.0.1: resolution: { - integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw== + integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== } - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - /micromark-extension-gfm-tagfilter@2.0.0: + micromark-util-sanitize-uri@2.0.1: resolution: { - integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== + integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== } - dependencies: - micromark-util-types: 2.0.0 - dev: false - /micromark-extension-gfm-task-list-item@2.0.1: + micromark-util-subtokenize@2.0.3: resolution: { - integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw== + integrity: sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg== } - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - /micromark-extension-gfm@3.0.0: + micromark-util-symbol@2.0.1: resolution: { - integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== + integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== } - dependencies: - micromark-extension-gfm-autolink-literal: 2.0.0 - micromark-extension-gfm-footnote: 2.0.0 - micromark-extension-gfm-strikethrough: 2.0.0 - micromark-extension-gfm-table: 2.0.0 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.0.1 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - /micromark-extension-mdx-expression@3.0.0: + micromark-util-types@2.0.1: resolution: { - integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ== + integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ== } - dependencies: - "@types/estree": 1.0.5 - devlop: 1.1.0 - micromark-factory-mdx-expression: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - /micromark-extension-mdx-jsx@3.0.0: + micromark@4.0.1: resolution: { - integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w== + integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw== } - dependencies: - "@types/acorn": 4.0.6 - "@types/estree": 1.0.5 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - micromark-factory-mdx-expression: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - vfile-message: 4.0.2 - dev: false - /micromark-extension-mdx-md@2.0.0: + micromatch@4.0.8: resolution: { - integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ== + integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== } - dependencies: - micromark-util-types: 2.0.0 - dev: false + engines: { node: ">=8.6" } - /micromark-extension-mdxjs-esm@3.0.0: + mime@3.0.0: resolution: { - integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A== + integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== } - dependencies: - "@types/estree": 1.0.5 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-util-character: 2.1.0 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.2 - dev: false + engines: { node: ">=10.0.0" } + hasBin: true - /micromark-extension-mdxjs@3.0.0: + minimatch@3.1.2: resolution: { - integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ== + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== } - dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - micromark-extension-mdx-expression: 3.0.0 - micromark-extension-mdx-jsx: 3.0.0 - micromark-extension-mdx-md: 2.0.0 - micromark-extension-mdxjs-esm: 3.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - /micromark-factory-destination@2.0.0: + mrmime@2.0.0: resolution: { - integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA== + integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== } - dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false + engines: { node: ">=10" } - /micromark-factory-label@2.0.0: + ms@2.1.3: resolution: { - integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw== + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== } - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - /micromark-factory-mdx-expression@2.0.1: + nanoid@3.3.8: resolution: { - integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg== + integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== } - dependencies: - "@types/estree": 1.0.5 - devlop: 1.1.0 - micromark-util-character: 2.1.0 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.2 - dev: false + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true - /micromark-factory-space@2.0.0: + natural-compare@1.4.0: resolution: { - integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg== + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== } - dependencies: - micromark-util-character: 2.1.0 - micromark-util-types: 2.0.0 - dev: false - /micromark-factory-title@2.0.0: + neotraverse@0.6.18: resolution: { - integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A== + integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA== } - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false + engines: { node: ">= 10" } - /micromark-factory-whitespace@2.0.0: + nlcst-to-string@4.0.0: resolution: { - integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA== + integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA== } - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - /micromark-util-character@2.1.0: + node-fetch-native@1.6.4: resolution: { - integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ== + integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ== } - dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - /micromark-util-chunked@2.0.0: + normalize-path@3.0.0: resolution: { - integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg== + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== } - dependencies: - micromark-util-symbol: 2.0.0 - dev: false + engines: { node: ">=0.10.0" } - /micromark-util-classify-character@2.0.0: + nth-check@2.1.1: resolution: { - integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw== + integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== } - dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - /micromark-util-combine-extensions@2.0.0: + ofetch@1.4.1: resolution: { - integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ== + integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw== } - dependencies: - micromark-util-chunked: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - /micromark-util-decode-numeric-character-reference@2.0.1: + ohash@1.1.4: resolution: { - integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ== + integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g== } - dependencies: - micromark-util-symbol: 2.0.0 - dev: false - /micromark-util-decode-string@2.0.0: + oniguruma-to-es@0.10.0: resolution: { - integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA== + integrity: sha512-zapyOUOCJxt+xhiNRPPMtfJkHGsZ98HHB9qJEkdT8BGytO/+kpe4m1Ngf0MzbzTmhacn11w9yGeDP6tzDhnCdg== } - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 2.1.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-symbol: 2.0.0 - dev: false - /micromark-util-encode@2.0.0: + optionator@0.9.4: resolution: { - integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== + integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== } - dev: false + engines: { node: ">= 0.8.0" } - /micromark-util-events-to-acorn@2.0.2: + p-limit@2.3.0: resolution: { - integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA== + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== } - dependencies: - "@types/acorn": 4.0.6 - "@types/estree": 1.0.5 - "@types/unist": 3.0.2 - devlop: 1.1.0 - estree-util-visit: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - vfile-message: 4.0.2 - dev: false + engines: { node: ">=6" } - /micromark-util-html-tag-name@2.0.0: + p-limit@3.1.0: resolution: { - integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== } - dev: false + engines: { node: ">=10" } - /micromark-util-normalize-identifier@2.0.0: + p-limit@6.2.0: resolution: { - integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w== + integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA== } - dependencies: - micromark-util-symbol: 2.0.0 - dev: false + engines: { node: ">=18" } - /micromark-util-resolve-all@2.0.0: + p-locate@4.1.0: resolution: { - integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA== + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== } - dependencies: - micromark-util-types: 2.0.0 - dev: false + engines: { node: ">=8" } - /micromark-util-sanitize-uri@2.0.0: + p-locate@5.0.0: resolution: { - integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw== + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== } - dependencies: - micromark-util-character: 2.1.0 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 - dev: false + engines: { node: ">=10" } - /micromark-util-subtokenize@2.0.1: + p-queue@8.0.1: resolution: { - integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q== + integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA== } - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false + engines: { node: ">=18" } - /micromark-util-symbol@2.0.0: + p-timeout@6.1.4: resolution: { - integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== + integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg== } - dev: false + engines: { node: ">=14.16" } - /micromark-util-types@2.0.0: + p-try@2.2.0: resolution: { - integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== } - dev: false + engines: { node: ">=6" } - /micromark@4.0.0: + pagefind@1.3.0: resolution: { - integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ== + integrity: sha512-8KPLGT5g9s+olKMRTU9LFekLizkVIu9tes90O1/aigJ0T5LmyPqTzGJrETnSw3meSYg58YH7JTzhTTW/3z6VAw== } - dependencies: - "@types/debug": 4.1.12 - debug: 4.3.5 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: false + hasBin: true - /micromatch@4.0.7: + parent-module@1.0.1: resolution: { - integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== } - engines: { node: ">=8.6" } - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - dev: false + engines: { node: ">=6" } - /mimic-fn@2.1.0: + parse-entities@4.0.2: resolution: { - integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== } - engines: { node: ">=6" } - dev: false - /mimic-fn@4.0.0: + parse-latin@7.0.0: resolution: { - integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ== } - engines: { node: ">=12" } - dev: false - /minimatch@3.1.2: + parse5@7.2.1: resolution: { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== } - dependencies: - brace-expansion: 1.1.11 - dev: true - /mrmime@2.0.0: + path-exists@4.0.0: resolution: { - integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== } - engines: { node: ">=10" } - dev: false + engines: { node: ">=8" } - /ms@2.1.2: + path-key@3.1.1: resolution: { - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== } + engines: { node: ">=8" } - /nanoid@3.3.7: + pathe@1.1.2: resolution: { - integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } - hasBin: true - dev: false - /natural-compare@1.4.0: + picocolors@1.1.1: resolution: { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== } - dev: true - /nlcst-to-string@3.1.1: + picomatch@2.3.1: resolution: { - integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw== + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== } - dependencies: - "@types/nlcst": 1.0.4 - dev: false + engines: { node: ">=8.6" } - /nlcst-to-string@4.0.0: + picomatch@4.0.2: resolution: { - integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA== + integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== } - dependencies: - "@types/nlcst": 2.0.3 - dev: false + engines: { node: ">=12" } - /node-releases@2.0.14: + pify@4.0.1: resolution: { - integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== } - dev: false + engines: { node: ">=6" } - /normalize-path@3.0.0: + pkg-dir@4.2.0: resolution: { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== } - engines: { node: ">=0.10.0" } - dev: false + engines: { node: ">=8" } - /not@0.1.0: + postcss-nested@6.2.0: resolution: { - integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA== + integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== } - dev: false + engines: { node: ">=12.0" } + peerDependencies: + postcss: ^8.2.14 - /npm-run-path@5.3.0: + postcss-selector-parser@6.1.2: resolution: { - integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - path-key: 4.0.0 - dev: false + engines: { node: ">=4" } - /nth-check@2.1.1: + postcss@8.4.49: resolution: { - integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== } - dependencies: - boolbase: 1.0.0 - dev: false + engines: { node: ^10 || ^12 || >=14 } - /once@1.4.0: + preferred-pm@4.0.0: resolution: { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + integrity: sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw== } - dependencies: - wrappy: 1.0.2 - dev: true + engines: { node: ">=18.12" } - /onetime@5.1.2: + prelude-ls@1.2.1: resolution: { - integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== } - engines: { node: ">=6" } - dependencies: - mimic-fn: 2.1.0 - dev: false + engines: { node: ">= 0.8.0" } - /onetime@6.0.0: + prettier-linter-helpers@1.0.0: resolution: { - integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== } - engines: { node: ">=12" } - dependencies: - mimic-fn: 4.0.0 - dev: false + engines: { node: ">=6.0.0" } - /optionator@0.9.4: + prettier-plugin-astro@0.14.1: resolution: { - integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + integrity: sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw== } - engines: { node: ">= 0.8.0" } - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - dev: true + engines: { node: ^14.15.0 || >=16.0.0 } - /ora@8.0.1: + prettier@3.4.2: resolution: { - integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ== + integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== } - engines: { node: ">=18" } - dependencies: - chalk: 5.3.0 - cli-cursor: 4.0.0 - cli-spinners: 2.9.2 - is-interactive: 2.0.0 - is-unicode-supported: 2.0.0 - log-symbols: 6.0.0 - stdin-discarder: 0.2.2 - string-width: 7.1.0 - strip-ansi: 7.1.0 - dev: false + engines: { node: ">=14" } + hasBin: true - /p-limit@2.3.0: + prismjs@1.29.0: resolution: { - integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== } engines: { node: ">=6" } - dependencies: - p-try: 2.2.0 - dev: false - /p-limit@3.1.0: + prompts@2.4.2: resolution: { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== } - engines: { node: ">=10" } - dependencies: - yocto-queue: 0.1.0 + engines: { node: ">= 6" } - /p-limit@5.0.0: + property-information@6.5.0: resolution: { - integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== + integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== } - engines: { node: ">=18" } - dependencies: - yocto-queue: 1.0.0 - dev: false - /p-locate@4.1.0: + punycode@2.3.1: resolution: { - integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== } - engines: { node: ">=8" } - dependencies: - p-limit: 2.3.0 - dev: false + engines: { node: ">=6" } - /p-locate@5.0.0: + queue-microtask@1.2.3: resolution: { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== } - engines: { node: ">=10" } - dependencies: - p-limit: 3.1.0 - /p-queue@8.0.1: + radix3@1.1.2: resolution: { - integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA== + integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA== } - engines: { node: ">=18" } - dependencies: - eventemitter3: 5.0.1 - p-timeout: 6.1.2 - dev: false - /p-timeout@6.1.2: + readdirp@3.6.0: resolution: { - integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ== + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== } - engines: { node: ">=14.16" } - dev: false + engines: { node: ">=8.10.0" } - /p-try@2.2.0: + recma-build-jsx@1.0.0: resolution: { - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew== } - engines: { node: ">=6" } - dev: false - /pagefind@1.1.0: + recma-jsx@1.0.0: resolution: { - integrity: sha512-1nmj0/vfYcMxNEQj0YDRp6bTVv9hI7HLdPhK/vBBYlrnwjATndQvHyicj5Y7pUHrpCFZpFnLVQXIF829tpFmaw== + integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q== } - hasBin: true - optionalDependencies: - "@pagefind/darwin-arm64": 1.1.0 - "@pagefind/darwin-x64": 1.1.0 - "@pagefind/linux-arm64": 1.1.0 - "@pagefind/linux-x64": 1.1.0 - "@pagefind/windows-x64": 1.1.0 - dev: false - /parent-module@1.0.1: + recma-parse@1.0.0: resolution: { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ== } - engines: { node: ">=6" } - dependencies: - callsites: 3.1.0 - dev: true - /parse-entities@4.0.1: + recma-stringify@1.0.0: resolution: { - integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w== + integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g== } - dependencies: - "@types/unist": 2.0.10 - character-entities: 2.0.2 - character-entities-legacy: 3.0.0 - character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.0.2 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - is-hexadecimal: 2.0.1 - dev: false - /parse-latin@5.0.1: + regenerator-runtime@0.14.1: resolution: { - integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg== + integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== } - dependencies: - nlcst-to-string: 3.1.1 - unist-util-modify-children: 3.1.1 - unist-util-visit-children: 2.0.2 - dev: false - /parse-latin@7.0.0: + regex-recursion@5.1.1: resolution: { - integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ== + integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w== } - dependencies: - "@types/nlcst": 2.0.3 - "@types/unist": 3.0.2 - nlcst-to-string: 4.0.0 - unist-util-modify-children: 4.0.0 - unist-util-visit-children: 3.0.0 - vfile: 6.0.1 - dev: false - /parse5@7.1.2: + regex-utilities@2.3.0: resolution: { - integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng== } - dependencies: - entities: 4.5.0 - dev: false - /path-exists@4.0.0: + regex@5.1.1: resolution: { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw== } - engines: { node: ">=8" } - /path-is-absolute@1.0.1: + rehype-expressive-code@0.38.3: resolution: { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + integrity: sha512-RYSSDkMBikoTbycZPkcWp6ELneANT4eTpND1DSRJ6nI2eVFUwTBDCvE2vO6jOOTaavwnPiydi4i/87NRyjpdOA== } - engines: { node: ">=0.10.0" } - dev: true - /path-key@3.1.1: + rehype-external-links@3.0.0: resolution: { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw== } - engines: { node: ">=8" } - /path-key@4.0.0: + rehype-format@5.0.1: resolution: { - integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ== } - engines: { node: ">=12" } - dev: false - /path-parse@1.0.7: + rehype-parse@9.0.1: resolution: { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag== } - dev: false - /path-to-regexp@6.2.2: + rehype-raw@7.0.0: resolution: { - integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw== + integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== } - dev: false - /periscopic@3.1.0: + rehype-recma@1.0.0: resolution: { - integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== + integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw== } - dependencies: - "@types/estree": 1.0.5 - estree-walker: 3.0.3 - is-reference: 3.0.2 - dev: false - /picocolors@1.0.1: + rehype-stringify@10.0.1: resolution: { - integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA== } - dev: false - /picomatch@2.3.1: + rehype@13.0.2: resolution: { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A== } - engines: { node: ">=8.6" } - dev: false - /pify@4.0.1: + remark-directive@3.0.0: resolution: { - integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA== } - engines: { node: ">=6" } - dev: false - /pkg-dir@4.2.0: + remark-gfm@4.0.0: resolution: { - integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA== } - engines: { node: ">=8" } - dependencies: - find-up: 4.1.0 - dev: false - /postcss-nested@6.0.1(postcss@8.4.38): + remark-mdx@3.1.0: resolution: { - integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA== } - engines: { node: ">=12.0" } - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.38 - postcss-selector-parser: 6.1.0 - dev: false - /postcss-selector-parser@6.1.0: + remark-parse@11.0.0: resolution: { - integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== + integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== } - engines: { node: ">=4" } - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: false - /postcss@8.4.38: + remark-rehype@11.1.1: resolution: { - integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ== } - engines: { node: ^10 || ^12 || >=14 } - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 - dev: false - /preferred-pm@3.1.3: + remark-smartypants@3.0.2: resolution: { - integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w== + integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA== } - engines: { node: ">=10" } - dependencies: - find-up: 5.0.0 - find-yarn-workspace-root2: 1.2.16 - path-exists: 4.0.0 - which-pm: 2.0.0 - dev: false + engines: { node: ">=16.0.0" } - /prelude-ls@1.2.1: + remark-stringify@11.0.0: resolution: { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== } - engines: { node: ">= 0.8.0" } - dev: true - /prettier-linter-helpers@1.0.0: + resolve-from@4.0.0: resolution: { - integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== } - engines: { node: ">=6.0.0" } - dependencies: - fast-diff: 1.3.0 - dev: true + engines: { node: ">=4" } - /prettier-plugin-astro@0.14.0: + retext-latin@4.0.0: resolution: { - integrity: sha512-7jRGJsexaRIyUzTk8uzXlP45cw6DQ5Ci4bTe0xCBCcuO1Fff8jJy9oI+kRCQKSdDFTSAArMSg8GpvzlKBtSaZA== + integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA== } - engines: { node: ^14.15.0 || >=16.0.0 } - dependencies: - "@astrojs/compiler": 1.8.2 - prettier: 3.3.2 - sass-formatter: 0.7.9 - dev: true - /prettier@3.3.2: + retext-smartypants@6.2.0: resolution: { - integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA== + integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ== } - engines: { node: ">=14" } - hasBin: true - dev: true - /prismjs@1.29.0: + retext-stringify@4.0.0: resolution: { - integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA== } - engines: { node: ">=6" } - dev: false - /prompts@2.4.2: + retext@9.0.0: resolution: { - integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA== } - engines: { node: ">= 6" } - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: false - /property-information@6.5.0: + reusify@1.0.4: resolution: { - integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== } - dev: false + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } - /punycode@2.3.1: + rollup@4.30.0: resolution: { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + integrity: sha512-sDnr1pcjTgUT69qBksNF1N1anwfbyYG6TBQ22b03bII8EdiUQ7J0TlozVaTMjT/eEJAO49e1ndV7t+UZfL1+vA== } - engines: { node: ">=6" } - dev: true + engines: { node: ">=18.0.0", npm: ">=8.0.0" } + hasBin: true - /queue-microtask@1.2.3: + run-parallel@1.2.0: resolution: { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== } - /readdirp@3.6.0: + s.color@0.0.15: resolution: { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA== } - engines: { node: ">=8.10.0" } - dependencies: - picomatch: 2.3.1 - dev: false - /rehype-expressive-code@0.35.3: + sass-formatter@0.7.9: resolution: { - integrity: sha512-kj43Rg+WzYUs8RRr6XyBr60pnrIZEgbmn9yJoV6qka1UDpcx7r8icn6Q2uSAgaLtlEUy+HCPgQJraOZrA53LOQ== + integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw== } - dependencies: - expressive-code: 0.35.3 - dev: false - /rehype-external-links@3.0.0: + sax@1.4.1: resolution: { - integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw== + integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== } - dependencies: - "@types/hast": 3.0.4 - "@ungap/structured-clone": 1.2.0 - hast-util-is-element: 3.0.0 - is-absolute-url: 4.0.1 - space-separated-tokens: 2.0.2 - unist-util-visit: 5.0.0 - dev: false - /rehype-format@5.0.0: + semver@7.6.3: resolution: { - integrity: sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg== + integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== } - dependencies: - "@types/hast": 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-is-element: 3.0.0 - hast-util-phrasing: 3.0.1 - hast-util-whitespace: 3.0.0 - html-whitespace-sensitive-tag-names: 3.0.0 - rehype-minify-whitespace: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: false + engines: { node: ">=10" } + hasBin: true - /rehype-minify-whitespace@6.0.0: + sharp@0.33.5: resolution: { - integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA== + integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw== } - dependencies: - "@types/hast": 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-is-element: 3.0.0 - hast-util-whitespace: 3.0.0 - unist-util-is: 6.0.0 - dev: false + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } - /rehype-parse@9.0.0: + shebang-command@2.0.0: resolution: { - integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw== + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== } - dependencies: - "@types/hast": 3.0.4 - hast-util-from-html: 2.0.1 - unified: 11.0.4 - dev: false + engines: { node: ">=8" } - /rehype-raw@7.0.0: + shebang-regex@3.0.0: resolution: { - integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== } - dependencies: - "@types/hast": 3.0.4 - hast-util-raw: 9.0.3 - vfile: 6.0.1 - dev: false + engines: { node: ">=8" } - /rehype-stringify@10.0.0: + shiki@1.26.1: resolution: { - integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ== + integrity: sha512-Gqg6DSTk3wYqaZ5OaYtzjcdxcBvX5kCy24yvRJEgjT5U+WHlmqCThLuBUx0juyxQBi+6ug53IGeuQS07DWwpcw== } - dependencies: - "@types/hast": 3.0.4 - hast-util-to-html: 9.0.1 - unified: 11.0.4 - dev: false - /rehype@13.0.1: + simple-swizzle@0.2.2: resolution: { - integrity: sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg== + integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== } - dependencies: - "@types/hast": 3.0.4 - rehype-parse: 9.0.0 - rehype-stringify: 10.0.0 - unified: 11.0.4 - dev: false - /remark-directive@3.0.0: + sisteransi@1.0.5: resolution: { - integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA== + integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== } - dependencies: - "@types/mdast": 4.0.4 - mdast-util-directive: 3.0.0 - micromark-extension-directive: 3.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: false - /remark-gfm@4.0.0: + sitemap@8.0.0: resolution: { - integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA== + integrity: sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A== } - dependencies: - "@types/mdast": 4.0.4 - mdast-util-gfm: 3.0.0 - micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: false + engines: { node: ">=14.0.0", npm: ">=6.0.0" } + hasBin: true - /remark-mdx@3.0.1: + source-map-js@1.2.1: resolution: { - integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA== + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== } - dependencies: - mdast-util-mdx: 3.0.0 - micromark-extension-mdxjs: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: false + engines: { node: ">=0.10.0" } - /remark-parse@11.0.0: + source-map@0.7.4: resolution: { - integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== + integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== } - dependencies: - "@types/mdast": 4.0.4 - mdast-util-from-markdown: 2.0.1 - micromark-util-types: 2.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: false + engines: { node: ">= 8" } - /remark-rehype@11.1.0: + space-separated-tokens@2.0.2: resolution: { - integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g== + integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== } - dependencies: - "@types/hast": 3.0.4 - "@types/mdast": 4.0.4 - mdast-util-to-hast: 13.2.0 - unified: 11.0.4 - vfile: 6.0.1 - dev: false - /remark-smartypants@2.1.0: + sprintf-js@1.0.3: resolution: { - integrity: sha512-qoF6Vz3BjU2tP6OfZqHOvCU0ACmu/6jhGaINSQRI9mM7wCxNQTKB3JUAN4SVoN2ybElEDTxBIABRep7e569iJw== + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - retext: 8.1.0 - retext-smartypants: 5.2.0 - unist-util-visit: 5.0.0 - dev: false - /remark-smartypants@3.0.1: + stream-replace-string@2.0.0: resolution: { - integrity: sha512-qyshfCl2eLO0i0558e79ZJsfojC5wjnYLByjt0FmjJQN6aYwcRxpoj784LZJSoWCdnA2ubh5rLNGb8Uur/wDng== + integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w== } - engines: { node: ">=16.0.0" } - dependencies: - retext: 9.0.0 - retext-smartypants: 6.1.0 - unified: 11.0.4 - unist-util-visit: 5.0.0 - dev: false - /remark-stringify@11.0.0: + string-width@4.2.3: resolution: { - integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== } - dependencies: - "@types/mdast": 4.0.4 - mdast-util-to-markdown: 2.1.0 - unified: 11.0.4 - dev: false + engines: { node: ">=8" } - /resolve-from@4.0.0: + string-width@7.2.0: resolution: { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== } - engines: { node: ">=4" } - dev: true + engines: { node: ">=18" } - /resolve@1.22.8: + stringify-entities@4.0.4: resolution: { - integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== } - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: false - /restore-cursor@4.0.0: + strip-ansi@6.0.1: resolution: { - integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: false + engines: { node: ">=8" } - /retext-latin@3.1.0: + strip-ansi@7.1.0: resolution: { - integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ== + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== } - dependencies: - "@types/nlcst": 1.0.4 - parse-latin: 5.0.1 - unherit: 3.0.1 - unified: 10.1.2 - dev: false + engines: { node: ">=12" } - /retext-latin@4.0.0: + strip-bom@3.0.0: resolution: { - integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA== + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== } - dependencies: - "@types/nlcst": 2.0.3 - parse-latin: 7.0.0 - unified: 11.0.4 - dev: false + engines: { node: ">=4" } - /retext-smartypants@5.2.0: + strip-json-comments@3.1.1: resolution: { - integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw== + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== } - dependencies: - "@types/nlcst": 1.0.4 - nlcst-to-string: 3.1.1 - unified: 10.1.2 - unist-util-visit: 4.1.2 - dev: false + engines: { node: ">=8" } - /retext-smartypants@6.1.0: + strnum@1.0.5: resolution: { - integrity: sha512-LDPXg95346bqFZnDMHo0S7Rq5p64+B+N8Vz733+wPMDtwb9rCOs9LIdIEhrUOU+TAywX9St+ocQWJt8wrzivcQ== + integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== } - dependencies: - "@types/nlcst": 2.0.3 - nlcst-to-string: 4.0.0 - unist-util-visit: 5.0.0 - dev: false - /retext-stringify@3.1.0: + style-to-object@1.0.8: resolution: { - integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w== + integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g== } - dependencies: - "@types/nlcst": 1.0.4 - nlcst-to-string: 3.1.1 - unified: 10.1.2 - dev: false - /retext-stringify@4.0.0: + suf-log@2.5.3: resolution: { - integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA== + integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow== } - dependencies: - "@types/nlcst": 2.0.3 - nlcst-to-string: 4.0.0 - unified: 11.0.4 - dev: false - /retext@8.1.0: + supports-color@7.2.0: resolution: { - integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q== + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== } - dependencies: - "@types/nlcst": 1.0.4 - retext-latin: 3.1.0 - retext-stringify: 3.1.0 - unified: 10.1.2 - dev: false + engines: { node: ">=8" } - /retext@9.0.0: + synckit@0.9.2: resolution: { - integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA== + integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw== } - dependencies: - "@types/nlcst": 2.0.3 - retext-latin: 4.0.0 - retext-stringify: 4.0.0 - unified: 11.0.4 - dev: false + engines: { node: ^14.18.0 || >=16.0.0 } - /reusify@1.0.4: + tinyexec@0.3.2: resolution: { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } - /rimraf@3.0.2: + to-regex-range@5.0.1: resolution: { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== } - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - dependencies: - glob: 7.2.3 - dev: true + engines: { node: ">=8.0" } - /rollup@4.18.0: + trim-lines@3.0.1: resolution: { - integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg== + integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== } - engines: { node: ">=18.0.0", npm: ">=8.0.0" } - hasBin: true - dependencies: - "@types/estree": 1.0.5 - optionalDependencies: - "@rollup/rollup-android-arm-eabi": 4.18.0 - "@rollup/rollup-android-arm64": 4.18.0 - "@rollup/rollup-darwin-arm64": 4.18.0 - "@rollup/rollup-darwin-x64": 4.18.0 - "@rollup/rollup-linux-arm-gnueabihf": 4.18.0 - "@rollup/rollup-linux-arm-musleabihf": 4.18.0 - "@rollup/rollup-linux-arm64-gnu": 4.18.0 - "@rollup/rollup-linux-arm64-musl": 4.18.0 - "@rollup/rollup-linux-powerpc64le-gnu": 4.18.0 - "@rollup/rollup-linux-riscv64-gnu": 4.18.0 - "@rollup/rollup-linux-s390x-gnu": 4.18.0 - "@rollup/rollup-linux-x64-gnu": 4.18.0 - "@rollup/rollup-linux-x64-musl": 4.18.0 - "@rollup/rollup-win32-arm64-msvc": 4.18.0 - "@rollup/rollup-win32-ia32-msvc": 4.18.0 - "@rollup/rollup-win32-x64-msvc": 4.18.0 - fsevents: 2.3.3 - dev: false - /run-parallel@1.2.0: + trough@2.2.0: resolution: { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== } - dependencies: - queue-microtask: 1.2.3 - /s.color@0.0.15: + tsconfck@3.1.4: resolution: { - integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA== + integrity: sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ== } - dev: true + engines: { node: ^18 || >=20 } + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /sass-formatter@0.7.9: + tslib@2.8.1: resolution: { - integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw== + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== } - dependencies: - suf-log: 2.5.3 - dev: true - /sax@1.4.1: + type-check@0.4.0: resolution: { - integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== } + engines: { node: ">= 0.8.0" } - /section-matter@1.0.0: + type-fest@4.31.0: resolution: { - integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + integrity: sha512-yCxltHW07Nkhv/1F6wWBr8kz+5BGMfP+RbRSYFnegVb0qV/UMT0G0ElBloPVerqn4M2ZV80Ir1FtCcYv1cT6vQ== } - engines: { node: ">=4" } - dependencies: - extend-shallow: 2.0.1 - kind-of: 6.0.3 - dev: false + engines: { node: ">=16" } - /semver@6.3.1: + typescript@5.6.3: resolution: { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== } + engines: { node: ">=14.17" } hasBin: true - dev: false - /semver@7.6.2: + ufo@1.5.4: resolution: { - integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== } - engines: { node: ">=10" } - hasBin: true - dev: false - /sharp@0.33.4: - resolution: - { - integrity: sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q== - } - engines: { libvips: ">=8.15.2", node: ^18.17.0 || ^20.3.0 || >=21.0.0 } - requiresBuild: true - dependencies: - color: 4.2.3 - detect-libc: 2.0.3 - semver: 7.6.2 - optionalDependencies: - "@img/sharp-darwin-arm64": 0.33.4 - "@img/sharp-darwin-x64": 0.33.4 - "@img/sharp-libvips-darwin-arm64": 1.0.2 - "@img/sharp-libvips-darwin-x64": 1.0.2 - "@img/sharp-libvips-linux-arm": 1.0.2 - "@img/sharp-libvips-linux-arm64": 1.0.2 - "@img/sharp-libvips-linux-s390x": 1.0.2 - "@img/sharp-libvips-linux-x64": 1.0.2 - "@img/sharp-libvips-linuxmusl-arm64": 1.0.2 - "@img/sharp-libvips-linuxmusl-x64": 1.0.2 - "@img/sharp-linux-arm": 0.33.4 - "@img/sharp-linux-arm64": 0.33.4 - "@img/sharp-linux-s390x": 0.33.4 - "@img/sharp-linux-x64": 0.33.4 - "@img/sharp-linuxmusl-arm64": 0.33.4 - "@img/sharp-linuxmusl-x64": 0.33.4 - "@img/sharp-wasm32": 0.33.4 - "@img/sharp-win32-ia32": 0.33.4 - "@img/sharp-win32-x64": 0.33.4 - dev: false - - /shebang-command@2.0.0: + ultrahtml@1.5.3: resolution: { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + integrity: sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg== } - engines: { node: ">=8" } - dependencies: - shebang-regex: 3.0.0 - /shebang-regex@3.0.0: + uncrypto@0.1.3: resolution: { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q== } - engines: { node: ">=8" } - /shiki@1.6.4: + unenv@1.10.0: resolution: { - integrity: sha512-X88chM7w8jnadoZtjPTi5ahCJx9pc9f8GfEkZAEYUTlcUZIEw2D/RY86HI/LkkE7Nj8TQWkiBfaFTJ3VJT6ESg== + integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ== } - dependencies: - "@shikijs/core": 1.6.4 - dev: false - /signal-exit@3.0.7: + unified@11.0.5: resolution: { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== } - dev: false - /signal-exit@4.1.0: + unist-util-find-after@5.0.0: resolution: { - integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ== } - engines: { node: ">=14" } - dev: false - /simple-swizzle@0.2.2: + unist-util-is@6.0.0: resolution: { - integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== } - dependencies: - is-arrayish: 0.3.2 - dev: false - /sisteransi@1.0.5: + unist-util-modify-children@4.0.0: resolution: { - integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw== } - dev: false - /sitemap@7.1.2: + unist-util-position-from-estree@2.0.0: resolution: { - integrity: sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw== + integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ== } - engines: { node: ">=12.0.0", npm: ">=5.6.0" } - hasBin: true - dependencies: - "@types/node": 17.0.45 - "@types/sax": 1.2.7 - arg: 5.0.2 - sax: 1.4.1 - dev: false - /source-map-js@1.2.0: + unist-util-position@5.0.0: resolution: { - integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== } - engines: { node: ">=0.10.0" } - dev: false - /source-map@0.7.4: + unist-util-remove-position@5.0.0: resolution: { - integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q== } - engines: { node: ">= 8" } - dev: false - /space-separated-tokens@2.0.2: + unist-util-stringify-position@4.0.0: resolution: { - integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== } - dev: false - /sprintf-js@1.0.3: + unist-util-visit-children@3.0.0: resolution: { - integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA== } - dev: false - /stdin-discarder@0.2.2: + unist-util-visit-parents@6.0.1: resolution: { - integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ== + integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== } - engines: { node: ">=18" } - dev: false - /stream-replace-string@2.0.0: + unist-util-visit@5.0.0: resolution: { - integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w== + integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== } - dev: false - /string-width@4.2.3: + unstorage@1.14.4: resolution: { - integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + integrity: sha512-1SYeamwuYeQJtJ/USE1x4l17LkmQBzg7deBJ+U9qOBoHo15d1cDxG4jM31zKRgF7pG0kirZy4wVMX6WL6Zoscg== } - engines: { node: ">=8" } - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: false + peerDependencies: + "@azure/app-configuration": ^1.8.0 + "@azure/cosmos": ^4.2.0 + "@azure/data-tables": ^13.3.0 + "@azure/identity": ^4.5.0 + "@azure/keyvault-secrets": ^4.9.0 + "@azure/storage-blob": ^12.26.0 + "@capacitor/preferences": ^6.0.3 + "@deno/kv": ">=0.8.4" + "@netlify/blobs": ^6.5.0 || ^7.0.0 || ^8.1.0 + "@planetscale/database": ^1.19.0 + "@upstash/redis": ^1.34.3 + "@vercel/blob": ">=0.27.0" + "@vercel/kv": ^1.0.1 + aws4fetch: ^1.0.20 + db0: ">=0.2.1" + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.1 + peerDependenciesMeta: + "@azure/app-configuration": + optional: true + "@azure/cosmos": + optional: true + "@azure/data-tables": + optional: true + "@azure/identity": + optional: true + "@azure/keyvault-secrets": + optional: true + "@azure/storage-blob": + optional: true + "@capacitor/preferences": + optional: true + "@deno/kv": + optional: true + "@netlify/blobs": + optional: true + "@planetscale/database": + optional: true + "@upstash/redis": + optional: true + "@vercel/blob": + optional: true + "@vercel/kv": + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true - /string-width@5.1.2: + uri-js@4.4.1: resolution: { - integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== } - engines: { node: ">=12" } - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - dev: false - /string-width@7.1.0: + util-deprecate@1.0.2: resolution: { - integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw== + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== } - engines: { node: ">=18" } - dependencies: - emoji-regex: 10.3.0 - get-east-asian-width: 1.2.0 - strip-ansi: 7.1.0 - dev: false - /stringify-entities@4.0.4: + vfile-location@5.0.3: resolution: { - integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== + integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg== } - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - dev: false - /strip-ansi@6.0.1: + vfile-message@4.0.2: resolution: { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== } - engines: { node: ">=8" } - dependencies: - ansi-regex: 5.0.1 - /strip-ansi@7.1.0: + vfile@6.0.3: resolution: { - integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== } - engines: { node: ">=12" } - dependencies: - ansi-regex: 6.0.1 - dev: false - /strip-bom-string@1.0.0: + vite@6.0.7: resolution: { - integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== + integrity: sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ== } - engines: { node: ">=0.10.0" } - dev: false + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + hasBin: true + peerDependencies: + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: ">=1.21.0" + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + "@types/node": + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true - /strip-bom@3.0.0: + vitefu@1.0.5: resolution: { - integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + integrity: sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA== } - engines: { node: ">=4" } - dev: false + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + vite: + optional: true - /strip-final-newline@3.0.0: + web-namespaces@2.0.1: resolution: { - integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== } - engines: { node: ">=12" } - dev: false - /strip-json-comments@3.1.1: + which-pm-runs@1.1.0: resolution: { - integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== } - engines: { node: ">=8" } - dev: true + engines: { node: ">=4" } - /strnum@1.0.5: + which-pm@3.0.0: resolution: { - integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + integrity: sha512-ysVYmw6+ZBhx3+ZkcPwRuJi38ZOTLJJ33PSHaitLxSKUMsh0LkKd0nC69zZCwt5D+AYUcMK2hhw4yWny20vSGg== } - dev: true + engines: { node: ">=18.12" } - /style-to-object@0.4.4: + which@2.0.2: resolution: { - integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== } - dependencies: - inline-style-parser: 0.1.1 - dev: false + engines: { node: ">= 8" } + hasBin: true - /style-to-object@1.0.6: + widest-line@5.0.0: resolution: { - integrity: sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA== + integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA== } - dependencies: - inline-style-parser: 0.2.3 - dev: false + engines: { node: ">=18" } - /suf-log@2.5.3: + word-wrap@1.2.5: resolution: { - integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow== + integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== } - dependencies: - s.color: 0.0.15 - dev: true + engines: { node: ">=0.10.0" } - /supports-color@5.5.0: + wrap-ansi@9.0.0: resolution: { - integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== } - engines: { node: ">=4" } - dependencies: - has-flag: 3.0.0 - dev: false + engines: { node: ">=18" } - /supports-color@7.2.0: + xml-js@1.6.11: resolution: { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== } - engines: { node: ">=8" } - dependencies: - has-flag: 4.0.0 - dev: true + hasBin: true - /supports-preserve-symlinks-flag@1.0.0: + xxhash-wasm@1.1.0: resolution: { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA== } - engines: { node: ">= 0.4" } - dev: false - /synckit@0.8.8: + yargs-parser@21.1.1: resolution: { - integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== } - engines: { node: ^14.18.0 || >=16.0.0 } - dependencies: - "@pkgr/core": 0.1.1 - tslib: 2.6.3 - dev: true + engines: { node: ">=12" } - /text-table@0.2.0: + yocto-queue@0.1.0: resolution: { - integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== } - dev: true + engines: { node: ">=10" } - /to-fast-properties@2.0.0: + yocto-queue@1.1.1: resolution: { - integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g== } - engines: { node: ">=4" } - dev: false + engines: { node: ">=12.20" } - /to-regex-range@5.0.1: + yocto-spinner@0.1.2: resolution: { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + integrity: sha512-VfmLIh/ZSZOJnVRQZc/dvpPP90lWL4G0bmxQMP0+U/2vKBA8GSpcBuWv17y7F+CZItRuO97HN1wdbb4p10uhOg== } - engines: { node: ">=8.0" } - dependencies: - is-number: 7.0.0 - dev: false + engines: { node: ">=18.19" } - /trim-lines@3.0.1: + yoctocolors@2.1.1: resolution: { - integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ== } - dev: false + engines: { node: ">=18" } - /trough@2.2.0: + zod-to-json-schema@3.24.1: resolution: { - integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== + integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w== } - dev: false + peerDependencies: + zod: ^3.24.1 - /tsconfck@3.1.0: + zod-to-ts@1.2.0: resolution: { - integrity: sha512-CMjc5zMnyAjcS9sPLytrbFmj89st2g+JYtY/c02ug4Q+CZaAtCgbyviI0n1YvjZE/pzoc6FbNsINS13DOL1B9w== + integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA== } - engines: { node: ^18 || >=20 } - hasBin: true peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - dev: false + typescript: ^4.9.4 || ^5.0.2 + zod: ^3 - /tslib@2.6.3: + zod@3.24.1: resolution: { - integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A== } - /type-check@0.4.0: + zwitch@2.0.4: resolution: { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== } - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: 1.2.1 - dev: true - /type-fest@0.20.2: - resolution: - { - integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - } - engines: { node: ">=10" } - dev: true +snapshots: + "@apidevtools/json-schema-ref-parser@11.7.3": + dependencies: + "@jsdevtools/ono": 7.1.3 + "@types/json-schema": 7.0.15 + js-yaml: 4.1.0 - /type-fest@2.19.0: - resolution: - { - integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - } - engines: { node: ">=12.20" } - dev: false + "@astrojs/compiler@2.10.3": {} - /unherit@3.0.1: - resolution: - { - integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg== - } - dev: false + "@astrojs/internal-helpers@0.4.2": {} - /unified@10.1.2: - resolution: - { - integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== - } + "@astrojs/markdown-remark@6.0.1": dependencies: - "@types/unist": 2.0.10 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.2.0 - vfile: 5.3.7 - dev: false - - /unified@11.0.4: - resolution: - { - integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ== - } + "@astrojs/prism": 3.2.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.2 + import-meta-resolve: 4.1.0 + js-yaml: 4.1.0 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.1 + remark-smartypants: 3.0.2 + shiki: 1.26.1 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + "@astrojs/mdx@4.0.3(astro@5.1.3(rollup@4.30.0)(typescript@5.6.3))": + dependencies: + "@astrojs/markdown-remark": 6.0.1 + "@mdx-js/mdx": 3.1.0(acorn@8.14.0) + acorn: 8.14.0 + astro: 5.1.3(rollup@4.30.0)(typescript@5.6.3) + es-module-lexer: 1.6.0 + estree-util-visit: 2.0.0 + hast-util-to-html: 9.0.4 + kleur: 4.1.5 + rehype-raw: 7.0.0 + remark-gfm: 4.0.0 + remark-smartypants: 3.0.2 + source-map: 0.7.4 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + "@astrojs/prism@3.2.0": + dependencies: + prismjs: 1.29.0 + + "@astrojs/sitemap@3.2.1": + dependencies: + sitemap: 8.0.0 + stream-replace-string: 2.0.0 + zod: 3.24.1 + + "@astrojs/starlight@0.30.3(astro@5.1.3(rollup@4.30.0)(typescript@5.6.3))": + dependencies: + "@astrojs/mdx": 4.0.3(astro@5.1.3(rollup@4.30.0)(typescript@5.6.3)) + "@astrojs/sitemap": 3.2.1 + "@pagefind/default-ui": 1.3.0 + "@types/hast": 3.0.4 + "@types/js-yaml": 4.0.9 + "@types/mdast": 4.0.4 + astro: 5.1.3(rollup@4.30.0)(typescript@5.6.3) + astro-expressive-code: 0.38.3(astro@5.1.3(rollup@4.30.0)(typescript@5.6.3)) + bcp-47: 2.1.0 + hast-util-from-html: 2.0.3 + hast-util-select: 6.0.3 + hast-util-to-string: 3.0.1 + hastscript: 9.0.0 + i18next: 23.16.8 + js-yaml: 4.1.0 + mdast-util-directive: 3.0.0 + mdast-util-to-markdown: 2.1.2 + mdast-util-to-string: 4.0.0 + pagefind: 1.3.0 + rehype: 13.0.2 + rehype-format: 5.0.1 + remark-directive: 3.0.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + "@astrojs/telemetry@3.2.0": + dependencies: + ci-info: 4.1.0 + debug: 4.4.0 + dlv: 1.1.3 + dset: 3.1.4 + is-docker: 3.0.0 + is-wsl: 3.1.0 + which-pm-runs: 1.1.0 + transitivePeerDependencies: + - supports-color + + "@babel/helper-string-parser@7.25.9": {} + + "@babel/helper-validator-identifier@7.25.9": {} + + "@babel/parser@7.26.3": + dependencies: + "@babel/types": 7.26.3 + + "@babel/runtime@7.26.0": + dependencies: + regenerator-runtime: 0.14.1 + + "@babel/types@7.26.3": + dependencies: + "@babel/helper-string-parser": 7.25.9 + "@babel/helper-validator-identifier": 7.25.9 + + "@ctrl/tinycolor@4.1.0": {} + + "@emnapi/runtime@1.3.1": + dependencies: + tslib: 2.8.1 + optional: true + + "@esbuild/aix-ppc64@0.21.5": + optional: true + + "@esbuild/aix-ppc64@0.24.2": + optional: true + + "@esbuild/android-arm64@0.21.5": + optional: true + + "@esbuild/android-arm64@0.24.2": + optional: true + + "@esbuild/android-arm@0.21.5": + optional: true + + "@esbuild/android-arm@0.24.2": + optional: true + + "@esbuild/android-x64@0.21.5": + optional: true + + "@esbuild/android-x64@0.24.2": + optional: true + + "@esbuild/darwin-arm64@0.21.5": + optional: true + + "@esbuild/darwin-arm64@0.24.2": + optional: true + + "@esbuild/darwin-x64@0.21.5": + optional: true + + "@esbuild/darwin-x64@0.24.2": + optional: true + + "@esbuild/freebsd-arm64@0.21.5": + optional: true + + "@esbuild/freebsd-arm64@0.24.2": + optional: true + + "@esbuild/freebsd-x64@0.21.5": + optional: true + + "@esbuild/freebsd-x64@0.24.2": + optional: true + + "@esbuild/linux-arm64@0.21.5": + optional: true + + "@esbuild/linux-arm64@0.24.2": + optional: true + + "@esbuild/linux-arm@0.21.5": + optional: true + + "@esbuild/linux-arm@0.24.2": + optional: true + + "@esbuild/linux-ia32@0.21.5": + optional: true + + "@esbuild/linux-ia32@0.24.2": + optional: true + + "@esbuild/linux-loong64@0.21.5": + optional: true + + "@esbuild/linux-loong64@0.24.2": + optional: true + + "@esbuild/linux-mips64el@0.21.5": + optional: true + + "@esbuild/linux-mips64el@0.24.2": + optional: true + + "@esbuild/linux-ppc64@0.21.5": + optional: true + + "@esbuild/linux-ppc64@0.24.2": + optional: true + + "@esbuild/linux-riscv64@0.21.5": + optional: true + + "@esbuild/linux-riscv64@0.24.2": + optional: true + + "@esbuild/linux-s390x@0.21.5": + optional: true + + "@esbuild/linux-s390x@0.24.2": + optional: true + + "@esbuild/linux-x64@0.21.5": + optional: true + + "@esbuild/linux-x64@0.24.2": + optional: true + + "@esbuild/netbsd-arm64@0.24.2": + optional: true + + "@esbuild/netbsd-x64@0.21.5": + optional: true + + "@esbuild/netbsd-x64@0.24.2": + optional: true + + "@esbuild/openbsd-arm64@0.24.2": + optional: true + + "@esbuild/openbsd-x64@0.21.5": + optional: true + + "@esbuild/openbsd-x64@0.24.2": + optional: true + + "@esbuild/sunos-x64@0.21.5": + optional: true + + "@esbuild/sunos-x64@0.24.2": + optional: true + + "@esbuild/win32-arm64@0.21.5": + optional: true + + "@esbuild/win32-arm64@0.24.2": + optional: true + + "@esbuild/win32-ia32@0.21.5": + optional: true + + "@esbuild/win32-ia32@0.24.2": + optional: true + + "@esbuild/win32-x64@0.21.5": + optional: true + + "@esbuild/win32-x64@0.24.2": + optional: true + + "@eslint-community/eslint-utils@4.4.1(eslint@9.17.0)": + dependencies: + eslint: 9.17.0 + eslint-visitor-keys: 3.4.3 + + "@eslint-community/regexpp@4.12.1": {} + + "@eslint/config-array@0.19.1": + dependencies: + "@eslint/object-schema": 2.1.5 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + "@eslint/core@0.9.1": + dependencies: + "@types/json-schema": 7.0.15 + + "@eslint/eslintrc@3.2.0": + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + "@eslint/js@9.17.0": {} + + "@eslint/object-schema@2.1.5": {} + + "@eslint/plugin-kit@0.2.4": + dependencies: + levn: 0.4.1 + + "@expressive-code/core@0.38.3": + dependencies: + "@ctrl/tinycolor": 4.1.0 + hast-util-select: 6.0.3 + hast-util-to-html: 9.0.4 + hast-util-to-text: 4.0.2 + hastscript: 9.0.0 + postcss: 8.4.49 + postcss-nested: 6.2.0(postcss@8.4.49) + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + + "@expressive-code/plugin-frames@0.38.3": + dependencies: + "@expressive-code/core": 0.38.3 + + "@expressive-code/plugin-shiki@0.38.3": + dependencies: + "@expressive-code/core": 0.38.3 + shiki: 1.26.1 + + "@expressive-code/plugin-text-markers@0.38.3": + dependencies: + "@expressive-code/core": 0.38.3 + + "@humanfs/core@0.19.1": {} + + "@humanfs/node@0.16.6": + dependencies: + "@humanfs/core": 0.19.1 + "@humanwhocodes/retry": 0.3.1 + + "@humanwhocodes/module-importer@1.0.1": {} + + "@humanwhocodes/retry@0.3.1": {} + + "@humanwhocodes/retry@0.4.1": {} + + "@img/sharp-darwin-arm64@0.33.5": + optionalDependencies: + "@img/sharp-libvips-darwin-arm64": 1.0.4 + optional: true + + "@img/sharp-darwin-x64@0.33.5": + optionalDependencies: + "@img/sharp-libvips-darwin-x64": 1.0.4 + optional: true + + "@img/sharp-libvips-darwin-arm64@1.0.4": + optional: true + + "@img/sharp-libvips-darwin-x64@1.0.4": + optional: true + + "@img/sharp-libvips-linux-arm64@1.0.4": + optional: true + + "@img/sharp-libvips-linux-arm@1.0.5": + optional: true + + "@img/sharp-libvips-linux-s390x@1.0.4": + optional: true + + "@img/sharp-libvips-linux-x64@1.0.4": + optional: true + + "@img/sharp-libvips-linuxmusl-arm64@1.0.4": + optional: true + + "@img/sharp-libvips-linuxmusl-x64@1.0.4": + optional: true + + "@img/sharp-linux-arm64@0.33.5": + optionalDependencies: + "@img/sharp-libvips-linux-arm64": 1.0.4 + optional: true + + "@img/sharp-linux-arm@0.33.5": + optionalDependencies: + "@img/sharp-libvips-linux-arm": 1.0.5 + optional: true + + "@img/sharp-linux-s390x@0.33.5": + optionalDependencies: + "@img/sharp-libvips-linux-s390x": 1.0.4 + optional: true + + "@img/sharp-linux-x64@0.33.5": + optionalDependencies: + "@img/sharp-libvips-linux-x64": 1.0.4 + optional: true + + "@img/sharp-linuxmusl-arm64@0.33.5": + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64": 1.0.4 + optional: true + + "@img/sharp-linuxmusl-x64@0.33.5": + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64": 1.0.4 + optional: true + + "@img/sharp-wasm32@0.33.5": + dependencies: + "@emnapi/runtime": 1.3.1 + optional: true + + "@img/sharp-win32-ia32@0.33.5": + optional: true + + "@img/sharp-win32-x64@0.33.5": + optional: true + + "@jridgewell/sourcemap-codec@1.5.0": {} + + "@jsdevtools/ono@7.1.3": {} + + "@mdx-js/mdx@3.1.0(acorn@8.14.0)": + dependencies: + "@types/estree": 1.0.6 + "@types/estree-jsx": 1.0.5 + "@types/hast": 3.0.4 + "@types/mdx": 2.0.13 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.2 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.0(acorn@8.14.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.1 + source-map: 0.7.4 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - acorn + - supports-color + + "@nodelib/fs.scandir@2.1.5": + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + + "@nodelib/fs.stat@2.0.5": {} + + "@nodelib/fs.walk@1.2.8": + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.18.0 + + "@oslojs/encoding@1.1.0": {} + + "@pagefind/darwin-arm64@1.3.0": + optional: true + + "@pagefind/darwin-x64@1.3.0": + optional: true + + "@pagefind/default-ui@1.3.0": {} + + "@pagefind/linux-arm64@1.3.0": + optional: true + + "@pagefind/linux-x64@1.3.0": + optional: true + + "@pagefind/windows-x64@1.3.0": + optional: true + + "@pkgr/core@0.1.1": {} + + "@rollup/pluginutils@5.1.4(rollup@4.30.0)": + dependencies: + "@types/estree": 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.30.0 + + "@rollup/rollup-android-arm-eabi@4.30.0": + optional: true + + "@rollup/rollup-android-arm64@4.30.0": + optional: true + + "@rollup/rollup-darwin-arm64@4.30.0": + optional: true + + "@rollup/rollup-darwin-x64@4.30.0": + optional: true + + "@rollup/rollup-freebsd-arm64@4.30.0": + optional: true + + "@rollup/rollup-freebsd-x64@4.30.0": + optional: true + + "@rollup/rollup-linux-arm-gnueabihf@4.30.0": + optional: true + + "@rollup/rollup-linux-arm-musleabihf@4.30.0": + optional: true + + "@rollup/rollup-linux-arm64-gnu@4.30.0": + optional: true + + "@rollup/rollup-linux-arm64-musl@4.30.0": + optional: true + + "@rollup/rollup-linux-loongarch64-gnu@4.30.0": + optional: true + + "@rollup/rollup-linux-powerpc64le-gnu@4.30.0": + optional: true + + "@rollup/rollup-linux-riscv64-gnu@4.30.0": + optional: true + + "@rollup/rollup-linux-s390x-gnu@4.30.0": + optional: true + + "@rollup/rollup-linux-x64-gnu@4.30.0": + optional: true + + "@rollup/rollup-linux-x64-musl@4.30.0": + optional: true + + "@rollup/rollup-win32-arm64-msvc@4.30.0": + optional: true + + "@rollup/rollup-win32-ia32-msvc@4.30.0": + optional: true + + "@rollup/rollup-win32-x64-msvc@4.30.0": + optional: true + + "@shikijs/core@1.26.1": + dependencies: + "@shikijs/engine-javascript": 1.26.1 + "@shikijs/engine-oniguruma": 1.26.1 + "@shikijs/types": 1.26.1 + "@shikijs/vscode-textmate": 10.0.1 + "@types/hast": 3.0.4 + hast-util-to-html: 9.0.4 + + "@shikijs/engine-javascript@1.26.1": + dependencies: + "@shikijs/types": 1.26.1 + "@shikijs/vscode-textmate": 10.0.1 + oniguruma-to-es: 0.10.0 + + "@shikijs/engine-oniguruma@1.26.1": + dependencies: + "@shikijs/types": 1.26.1 + "@shikijs/vscode-textmate": 10.0.1 + + "@shikijs/langs@1.26.1": + dependencies: + "@shikijs/types": 1.26.1 + + "@shikijs/themes@1.26.1": + dependencies: + "@shikijs/types": 1.26.1 + + "@shikijs/types@1.26.1": + dependencies: + "@shikijs/vscode-textmate": 10.0.1 + "@types/hast": 3.0.4 + + "@shikijs/vscode-textmate@10.0.1": {} + + "@types/acorn@4.0.6": + dependencies: + "@types/estree": 1.0.6 + + "@types/cookie@0.6.0": {} + + "@types/debug@4.1.12": + dependencies: + "@types/ms": 0.7.34 + + "@types/estree-jsx@1.0.5": + dependencies: + "@types/estree": 1.0.6 + + "@types/estree@1.0.6": {} + + "@types/hast@3.0.4": + dependencies: + "@types/unist": 3.0.3 + + "@types/js-yaml@4.0.9": {} + + "@types/json-schema@7.0.15": {} + + "@types/mdast@4.0.4": + dependencies: + "@types/unist": 3.0.3 + + "@types/mdx@2.0.13": {} + + "@types/ms@0.7.34": {} + + "@types/nlcst@2.0.3": + dependencies: + "@types/unist": 3.0.3 + + "@types/node@17.0.45": {} + + "@types/sax@1.2.7": + dependencies: + "@types/node": 17.0.45 + + "@types/unist@2.0.11": {} + + "@types/unist@3.0.3": {} + + "@ungap/structured-clone@1.2.1": {} + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + array-iterate@2.0.1: {} + + astring@1.9.0: {} + + astro-expressive-code@0.38.3(astro@5.1.3(rollup@4.30.0)(typescript@5.6.3)): + dependencies: + astro: 5.1.3(rollup@4.30.0)(typescript@5.6.3) + rehype-expressive-code: 0.38.3 + + astro@5.1.3(rollup@4.30.0)(typescript@5.6.3): + dependencies: + "@astrojs/compiler": 2.10.3 + "@astrojs/internal-helpers": 0.4.2 + "@astrojs/markdown-remark": 6.0.1 + "@astrojs/telemetry": 3.2.0 + "@oslojs/encoding": 1.1.0 + "@rollup/pluginutils": 5.1.4(rollup@4.30.0) + "@types/cookie": 0.6.0 + acorn: 8.14.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + boxen: 8.0.1 + ci-info: 4.1.0 + clsx: 2.1.1 + common-ancestor-path: 1.0.1 + cookie: 0.7.2 + cssesc: 3.0.0 + debug: 4.4.0 + deterministic-object-hash: 2.0.2 + devalue: 5.1.1 + diff: 5.2.0 + dlv: 1.1.3 + dset: 3.1.4 + es-module-lexer: 1.6.0 + esbuild: 0.21.5 + estree-walker: 3.0.3 + fast-glob: 3.3.3 + flattie: 1.1.1 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.1.1 + js-yaml: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.17 + magicast: 0.3.5 + micromatch: 4.0.8 + mrmime: 2.0.0 + neotraverse: 0.6.18 + p-limit: 6.2.0 + p-queue: 8.0.1 + preferred-pm: 4.0.0 + prompts: 2.4.2 + rehype: 13.0.2 + semver: 7.6.3 + shiki: 1.26.1 + tinyexec: 0.3.2 + tsconfck: 3.1.4(typescript@5.6.3) + ultrahtml: 1.5.3 + unist-util-visit: 5.0.0 + unstorage: 1.14.4 + vfile: 6.0.3 + vite: 6.0.7 + vitefu: 1.0.5(vite@6.0.7) + which-pm: 3.0.0 + xxhash-wasm: 1.1.0 + yargs-parser: 21.1.1 + yocto-spinner: 0.1.2 + zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) + zod-to-ts: 1.2.0(typescript@5.6.3)(zod@3.24.1) + optionalDependencies: + sharp: 0.33.5 + transitivePeerDependencies: + - "@azure/app-configuration" + - "@azure/cosmos" + - "@azure/data-tables" + - "@azure/identity" + - "@azure/keyvault-secrets" + - "@azure/storage-blob" + - "@capacitor/preferences" + - "@deno/kv" + - "@netlify/blobs" + - "@planetscale/database" + - "@types/node" + - "@upstash/redis" + - "@vercel/blob" + - "@vercel/kv" + - aws4fetch + - db0 + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - yaml + + axobject-query@4.1.0: {} + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + base-64@1.0.0: {} + + bcp-47-match@2.0.3: {} + + bcp-47@2.1.0: + dependencies: + is-alphabetical: 2.0.1 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + + binary-extensions@2.3.0: {} + + boolbase@1.0.0: {} + + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.4.1 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.31.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.0 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + callsites@3.1.0: {} + + camelcase@8.0.0: {} + + ccount@2.0.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + ci-info@4.1.0: {} + + cli-boxes@3.0.0: {} + + clsx@2.1.1: {} + + collapse-white-space@2.1.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + comma-separated-tokens@2.0.3: {} + + common-ancestor-path@1.0.1: {} + + concat-map@0.0.1: {} + + consola@3.3.3: {} + + cookie-es@1.2.2: {} + + cookie@0.7.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crossws@0.3.1: + dependencies: + uncrypto: 0.1.3 + + css-selector-parser@3.0.5: {} + + cssesc@3.0.0: {} + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + deep-is@0.1.4: {} + + defu@6.1.4: {} + + dequal@2.0.3: {} + + destr@2.0.3: {} + + detect-libc@2.0.3: {} + + deterministic-object-hash@2.0.2: + dependencies: + base-64: 1.0.0 + + devalue@5.1.1: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff@5.2.0: {} + + direction@2.0.1: {} + + dlv@1.1.3: {} + + dset@3.1.4: {} + + emoji-regex-xs@1.0.0: {} + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + entities@4.5.0: {} + + es-module-lexer@1.6.0: {} + + esast-util-from-estree@2.0.0: + dependencies: + "@types/estree-jsx": 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + "@types/estree-jsx": 1.0.5 + acorn: 8.14.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.2 + + esbuild@0.21.5: + optionalDependencies: + "@esbuild/aix-ppc64": 0.21.5 + "@esbuild/android-arm": 0.21.5 + "@esbuild/android-arm64": 0.21.5 + "@esbuild/android-x64": 0.21.5 + "@esbuild/darwin-arm64": 0.21.5 + "@esbuild/darwin-x64": 0.21.5 + "@esbuild/freebsd-arm64": 0.21.5 + "@esbuild/freebsd-x64": 0.21.5 + "@esbuild/linux-arm": 0.21.5 + "@esbuild/linux-arm64": 0.21.5 + "@esbuild/linux-ia32": 0.21.5 + "@esbuild/linux-loong64": 0.21.5 + "@esbuild/linux-mips64el": 0.21.5 + "@esbuild/linux-ppc64": 0.21.5 + "@esbuild/linux-riscv64": 0.21.5 + "@esbuild/linux-s390x": 0.21.5 + "@esbuild/linux-x64": 0.21.5 + "@esbuild/netbsd-x64": 0.21.5 + "@esbuild/openbsd-x64": 0.21.5 + "@esbuild/sunos-x64": 0.21.5 + "@esbuild/win32-arm64": 0.21.5 + "@esbuild/win32-ia32": 0.21.5 + "@esbuild/win32-x64": 0.21.5 + + esbuild@0.24.2: + optionalDependencies: + "@esbuild/aix-ppc64": 0.24.2 + "@esbuild/android-arm": 0.24.2 + "@esbuild/android-arm64": 0.24.2 + "@esbuild/android-x64": 0.24.2 + "@esbuild/darwin-arm64": 0.24.2 + "@esbuild/darwin-x64": 0.24.2 + "@esbuild/freebsd-arm64": 0.24.2 + "@esbuild/freebsd-x64": 0.24.2 + "@esbuild/linux-arm": 0.24.2 + "@esbuild/linux-arm64": 0.24.2 + "@esbuild/linux-ia32": 0.24.2 + "@esbuild/linux-loong64": 0.24.2 + "@esbuild/linux-mips64el": 0.24.2 + "@esbuild/linux-ppc64": 0.24.2 + "@esbuild/linux-riscv64": 0.24.2 + "@esbuild/linux-s390x": 0.24.2 + "@esbuild/linux-x64": 0.24.2 + "@esbuild/netbsd-arm64": 0.24.2 + "@esbuild/netbsd-x64": 0.24.2 + "@esbuild/openbsd-arm64": 0.24.2 + "@esbuild/openbsd-x64": 0.24.2 + "@esbuild/sunos-x64": 0.24.2 + "@esbuild/win32-arm64": 0.24.2 + "@esbuild/win32-ia32": 0.24.2 + "@esbuild/win32-x64": 0.24.2 + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-plugin-prettier@5.2.1(eslint@9.17.0)(prettier@3.4.2): + dependencies: + eslint: 9.17.0 + prettier: 3.4.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.2 + + eslint-scope@8.2.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.17.0: + dependencies: + "@eslint-community/eslint-utils": 4.4.1(eslint@9.17.0) + "@eslint-community/regexpp": 4.12.1 + "@eslint/config-array": 0.19.1 + "@eslint/core": 0.9.1 + "@eslint/eslintrc": 3.2.0 + "@eslint/js": 9.17.0 + "@eslint/plugin-kit": 0.2.4 + "@humanfs/node": 0.16.6 + "@humanwhocodes/module-importer": 1.0.1 + "@humanwhocodes/retry": 0.4.1 + "@types/estree": 1.0.6 + "@types/json-schema": 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-util-attach-comments@3.0.0: + dependencies: + "@types/estree": 1.0.6 + + estree-util-build-jsx@3.0.1: + dependencies: + "@types/estree-jsx": 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + "@types/estree": 1.0.6 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + "@types/estree-jsx": 1.0.5 + astring: 1.9.0 + source-map: 0.7.4 + + estree-util-visit@2.0.0: + dependencies: + "@types/estree-jsx": 1.0.5 + "@types/unist": 3.0.3 + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + "@types/estree": 1.0.6 + + esutils@2.0.3: {} + + eventemitter3@5.0.1: {} + + expressive-code@0.38.3: + dependencies: + "@expressive-code/core": 0.38.3 + "@expressive-code/plugin-frames": 0.38.3 + "@expressive-code/plugin-shiki": 0.38.3 + "@expressive-code/plugin-text-markers": 0.38.3 + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.3: + dependencies: + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-xml-parser@4.5.1: + dependencies: + strnum: 1.0.5 + + fastq@1.18.0: + dependencies: + reusify: 1.0.4 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up-simple@1.0.0: {} + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-yarn-workspace-root2@1.2.16: + dependencies: + micromatch: 4.0.8 + pkg-dir: 4.2.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + + flatted@3.3.2: {} + + flattie@1.1.1: {} + + fsevents@2.3.3: + optional: true + + get-east-asian-width@1.3.0: {} + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@14.0.0: {} + + graceful-fs@4.2.11: {} + + h3@1.13.0: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.1 + defu: 6.1.4 + destr: 2.0.3 + iron-webcrypto: 1.2.1 + ohash: 1.1.4 + radix3: 1.1.2 + ufo: 1.5.4 + uncrypto: 0.1.3 + unenv: 1.10.0 + + has-flag@4.0.0: {} + + hast-util-embedded@3.0.0: + dependencies: + "@types/hast": 3.0.4 + hast-util-is-element: 3.0.0 + + hast-util-format@1.1.0: + dependencies: + "@types/hast": 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-minify-whitespace: 1.0.1 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.1 + unist-util-visit-parents: 6.0.1 + + hast-util-from-html@2.0.3: + dependencies: + "@types/hast": 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.2 + parse5: 7.2.1 + vfile: 6.0.3 + vfile-message: 4.0.2 + + hast-util-from-parse5@8.0.2: + dependencies: + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.0 + property-information: 6.5.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-has-property@3.0.0: + dependencies: + "@types/hast": 3.0.4 + + hast-util-is-body-ok-link@3.0.1: + dependencies: + "@types/hast": 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + "@types/hast": 3.0.4 + + hast-util-minify-whitespace@1.0.1: + dependencies: + "@types/hast": 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.0 + + hast-util-parse-selector@4.0.0: + dependencies: + "@types/hast": 3.0.4 + + hast-util-phrasing@3.0.1: + dependencies: + "@types/hast": 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.1 + hast-util-is-element: 3.0.0 + + hast-util-raw@9.1.0: + dependencies: + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 + "@ungap/structured-clone": 1.2.1 + hast-util-from-parse5: 8.0.2 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.2.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-select@6.0.3: + dependencies: + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.0.5 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.1 + hast-util-whitespace: 3.0.0 + nth-check: 2.1.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.1: + dependencies: + "@types/estree": 1.0.6 + "@types/estree-jsx": 1.0.5 + "@types/hast": 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.8 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.4: + dependencies: + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.2: + dependencies: + "@types/estree": 1.0.6 + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.8 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.0: + dependencies: + "@types/hast": 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@3.0.1: + dependencies: + "@types/hast": 3.0.4 + + hast-util-to-text@4.0.2: + dependencies: + "@types/hast": 3.0.4 + "@types/unist": 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + "@types/hast": 3.0.4 + + hastscript@9.0.0: + dependencies: + "@types/hast": 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + + html-escaper@3.0.3: {} + + html-void-elements@3.0.0: {} + + html-whitespace-sensitive-tag-names@3.0.1: {} + + http-cache-semantics@4.1.1: {} + + i18next@23.16.8: + dependencies: + "@babel/runtime": 7.26.0 + + ignore@5.3.2: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-meta-resolve@4.1.0: {} + + imurmurhash@0.1.4: {} + + inline-style-parser@0.2.4: {} + + iron-webcrypto@1.2.1: {} + + is-absolute-url@4.0.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-arrayish@0.3.2: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-decimal@2.0.1: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isexe@2.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + load-yaml-file@0.2.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + longest-streak@3.1.0: {} + + lru-cache@10.4.3: {} + + magic-string@0.30.17: + dependencies: + "@jridgewell/sourcemap-codec": 1.5.0 + + magicast@0.3.5: + dependencies: + "@babel/parser": 7.26.3 + "@babel/types": 7.26.3 + source-map-js: 1.2.1 + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.4: {} + + mdast-util-definitions@6.0.0: + dependencies: + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 + unist-util-visit: 5.0.0 + + mdast-util-directive@3.0.0: + dependencies: + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-find-and-replace@3.0.2: + dependencies: + "@types/mdast": 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + "@types/mdast": 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.0.0: + dependencies: + "@types/mdast": 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + "@types/mdast": 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + "@types/mdast": 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + "@types/mdast": 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + "@types/estree-jsx": 1.0.5 + "@types/hast": 3.0.4 + "@types/mdast": 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.1.3: + dependencies: + "@types/estree-jsx": 1.0.5 + "@types/hast": 3.0.4 + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + "@types/estree-jsx": 1.0.5 + "@types/hast": 3.0.4 + "@types/mdast": 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + "@types/mdast": 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + "@types/hast": 3.0.4 + "@types/mdast": 4.0.4 + "@ungap/structured-clone": 1.2.1 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + "@types/mdast": 4.0.4 + "@types/unist": 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + "@types/mdast": 4.0.4 + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.2: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-directive@3.0.2: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + parse-entities: 4.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-table@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.1 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-mdx-expression@3.0.0: + dependencies: + "@types/estree": 1.0.6 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-mdx-jsx@3.0.1: + dependencies: + "@types/acorn": 4.0.6 + "@types/estree": 1.0.6 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.1 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + "@types/estree": 1.0.6 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.1 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-mdx-expression@2.0.2: + dependencies: + "@types/estree": 1.0.6 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.1 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.2: + dependencies: + "@types/acorn": 4.0.6 + "@types/estree": 1.0.6 + "@types/unist": 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + vfile-message: 4.0.2 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.1 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.0.3: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.1: {} + + micromark@4.0.1: + dependencies: + "@types/debug": 4.1.12 + debug: 4.4.0 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime@3.0.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + mrmime@2.0.0: {} + + ms@2.1.3: {} + + nanoid@3.3.8: {} + + natural-compare@1.4.0: {} + + neotraverse@0.6.18: {} + + nlcst-to-string@4.0.0: dependencies: - "@types/unist": 3.0.2 - bail: 2.0.2 - devlop: 1.1.0 - extend: 3.0.2 - is-plain-obj: 4.1.0 - trough: 2.2.0 - vfile: 6.0.1 - dev: false + "@types/nlcst": 2.0.3 - /unist-util-find-after@5.0.0: - resolution: - { - integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ== - } + node-fetch-native@1.6.4: {} + + normalize-path@3.0.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + ofetch@1.4.1: + dependencies: + destr: 2.0.3 + node-fetch-native: 1.6.4 + ufo: 1.5.4 + + ohash@1.1.4: {} + + oniguruma-to-es@0.10.0: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 5.1.1 + regex-recursion: 5.1.1 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@6.2.0: + dependencies: + yocto-queue: 1.1.1 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-queue@8.0.1: + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.4 + + p-timeout@6.1.4: {} + + p-try@2.2.0: {} + + pagefind@1.3.0: + optionalDependencies: + "@pagefind/darwin-arm64": 1.3.0 + "@pagefind/darwin-x64": 1.3.0 + "@pagefind/linux-arm64": 1.3.0 + "@pagefind/linux-x64": 1.3.0 + "@pagefind/windows-x64": 1.3.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@4.0.2: + dependencies: + "@types/unist": 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-latin@7.0.0: + dependencies: + "@types/nlcst": 2.0.3 + "@types/unist": 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + + parse5@7.2.1: + dependencies: + entities: 4.5.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + pathe@1.1.2: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pify@4.0.1: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + postcss-nested@6.2.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.4.49: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + preferred-pm@4.0.0: + dependencies: + find-up-simple: 1.0.0 + find-yarn-workspace-root2: 1.2.16 + which-pm: 3.0.0 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier-plugin-astro@0.14.1: + dependencies: + "@astrojs/compiler": 2.10.3 + prettier: 3.4.2 + sass-formatter: 0.7.9 + + prettier@3.4.2: {} + + prismjs@1.29.0: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + property-information@6.5.0: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + radix3@1.1.2: {} + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + recma-build-jsx@1.0.0: + dependencies: + "@types/estree": 1.0.6 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.0(acorn@8.14.0): + dependencies: + acorn-jsx: 5.3.2(acorn@8.14.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - acorn + + recma-parse@1.0.0: + dependencies: + "@types/estree": 1.0.6 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + "@types/estree": 1.0.6 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + regenerator-runtime@0.14.1: {} + + regex-recursion@5.1.1: + dependencies: + regex: 5.1.1 + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@5.1.1: + dependencies: + regex-utilities: 2.3.0 + + rehype-expressive-code@0.38.3: + dependencies: + expressive-code: 0.38.3 + + rehype-external-links@3.0.0: + dependencies: + "@types/hast": 3.0.4 + "@ungap/structured-clone": 1.2.1 + hast-util-is-element: 3.0.0 + is-absolute-url: 4.0.1 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + + rehype-format@5.0.1: + dependencies: + "@types/hast": 3.0.4 + hast-util-format: 1.1.0 + + rehype-parse@9.0.1: + dependencies: + "@types/hast": 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-raw@7.0.0: + dependencies: + "@types/hast": 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-recma@1.0.0: + dependencies: + "@types/estree": 1.0.6 + "@types/hast": 3.0.4 + hast-util-to-estree: 3.1.1 + transitivePeerDependencies: + - supports-color + + rehype-stringify@10.0.1: + dependencies: + "@types/hast": 3.0.4 + hast-util-to-html: 9.0.4 + unified: 11.0.5 + + rehype@13.0.2: + dependencies: + "@types/hast": 3.0.4 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 + + remark-directive@3.0.0: + dependencies: + "@types/mdast": 4.0.4 + mdast-util-directive: 3.0.0 + micromark-extension-directive: 3.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.0: + dependencies: + "@types/mdast": 4.0.4 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.0: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + "@types/mdast": 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.1 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.1: + dependencies: + "@types/hast": 3.0.4 + "@types/mdast": 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + remark-stringify@11.0.0: + dependencies: + "@types/mdast": 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + resolve-from@4.0.0: {} + + retext-latin@4.0.0: + dependencies: + "@types/nlcst": 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 + + retext-smartypants@6.2.0: + dependencies: + "@types/nlcst": 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.0.0 + + retext-stringify@4.0.0: + dependencies: + "@types/nlcst": 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 + + retext@9.0.0: + dependencies: + "@types/nlcst": 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 + + reusify@1.0.4: {} + + rollup@4.30.0: + dependencies: + "@types/estree": 1.0.6 + optionalDependencies: + "@rollup/rollup-android-arm-eabi": 4.30.0 + "@rollup/rollup-android-arm64": 4.30.0 + "@rollup/rollup-darwin-arm64": 4.30.0 + "@rollup/rollup-darwin-x64": 4.30.0 + "@rollup/rollup-freebsd-arm64": 4.30.0 + "@rollup/rollup-freebsd-x64": 4.30.0 + "@rollup/rollup-linux-arm-gnueabihf": 4.30.0 + "@rollup/rollup-linux-arm-musleabihf": 4.30.0 + "@rollup/rollup-linux-arm64-gnu": 4.30.0 + "@rollup/rollup-linux-arm64-musl": 4.30.0 + "@rollup/rollup-linux-loongarch64-gnu": 4.30.0 + "@rollup/rollup-linux-powerpc64le-gnu": 4.30.0 + "@rollup/rollup-linux-riscv64-gnu": 4.30.0 + "@rollup/rollup-linux-s390x-gnu": 4.30.0 + "@rollup/rollup-linux-x64-gnu": 4.30.0 + "@rollup/rollup-linux-x64-musl": 4.30.0 + "@rollup/rollup-win32-arm64-msvc": 4.30.0 + "@rollup/rollup-win32-ia32-msvc": 4.30.0 + "@rollup/rollup-win32-x64-msvc": 4.30.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + s.color@0.0.15: {} + + sass-formatter@0.7.9: + dependencies: + suf-log: 2.5.3 + + sax@1.4.1: {} + + semver@7.6.3: {} + + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.3 + optionalDependencies: + "@img/sharp-darwin-arm64": 0.33.5 + "@img/sharp-darwin-x64": 0.33.5 + "@img/sharp-libvips-darwin-arm64": 1.0.4 + "@img/sharp-libvips-darwin-x64": 1.0.4 + "@img/sharp-libvips-linux-arm": 1.0.5 + "@img/sharp-libvips-linux-arm64": 1.0.4 + "@img/sharp-libvips-linux-s390x": 1.0.4 + "@img/sharp-libvips-linux-x64": 1.0.4 + "@img/sharp-libvips-linuxmusl-arm64": 1.0.4 + "@img/sharp-libvips-linuxmusl-x64": 1.0.4 + "@img/sharp-linux-arm": 0.33.5 + "@img/sharp-linux-arm64": 0.33.5 + "@img/sharp-linux-s390x": 0.33.5 + "@img/sharp-linux-x64": 0.33.5 + "@img/sharp-linuxmusl-arm64": 0.33.5 + "@img/sharp-linuxmusl-x64": 0.33.5 + "@img/sharp-wasm32": 0.33.5 + "@img/sharp-win32-ia32": 0.33.5 + "@img/sharp-win32-x64": 0.33.5 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shiki@1.26.1: + dependencies: + "@shikijs/core": 1.26.1 + "@shikijs/engine-javascript": 1.26.1 + "@shikijs/engine-oniguruma": 1.26.1 + "@shikijs/langs": 1.26.1 + "@shikijs/themes": 1.26.1 + "@shikijs/types": 1.26.1 + "@shikijs/vscode-textmate": 10.0.1 + "@types/hast": 3.0.4 + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + sisteransi@1.0.5: {} + + sitemap@8.0.0: + dependencies: + "@types/node": 17.0.45 + "@types/sax": 1.2.7 + arg: 5.0.2 + sax: 1.4.1 + + source-map-js@1.2.1: {} + + source-map@0.7.4: {} + + space-separated-tokens@2.0.2: {} + + sprintf-js@1.0.3: {} + + stream-replace-string@2.0.0: {} + + string-width@4.2.3: dependencies: - "@types/unist": 3.0.2 - unist-util-is: 6.0.0 - dev: false + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 - /unist-util-is@5.2.1: - resolution: - { - integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== - } + string-width@7.2.0: dependencies: - "@types/unist": 2.0.10 - dev: false + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 - /unist-util-is@6.0.0: - resolution: - { - integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== - } + stringify-entities@4.0.4: dependencies: - "@types/unist": 3.0.2 - dev: false + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 - /unist-util-modify-children@3.1.1: - resolution: - { - integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA== - } + strip-ansi@6.0.1: dependencies: - "@types/unist": 2.0.10 - array-iterate: 2.0.1 - dev: false + ansi-regex: 5.0.1 - /unist-util-modify-children@4.0.0: - resolution: - { - integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw== - } + strip-ansi@7.1.0: dependencies: - "@types/unist": 3.0.2 - array-iterate: 2.0.1 - dev: false + ansi-regex: 6.1.0 - /unist-util-position-from-estree@2.0.0: - resolution: - { - integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ== - } + strip-bom@3.0.0: {} + + strip-json-comments@3.1.1: {} + + strnum@1.0.5: {} + + style-to-object@1.0.8: dependencies: - "@types/unist": 3.0.2 - dev: false + inline-style-parser: 0.2.4 - /unist-util-position@5.0.0: - resolution: - { - integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== - } + suf-log@2.5.3: dependencies: - "@types/unist": 3.0.2 - dev: false + s.color: 0.0.15 - /unist-util-remove-position@5.0.0: - resolution: - { - integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q== - } + supports-color@7.2.0: dependencies: - "@types/unist": 3.0.2 - unist-util-visit: 5.0.0 - dev: false + has-flag: 4.0.0 - /unist-util-stringify-position@3.0.3: - resolution: - { - integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== - } + synckit@0.9.2: dependencies: - "@types/unist": 2.0.10 - dev: false + "@pkgr/core": 0.1.1 + tslib: 2.8.1 - /unist-util-stringify-position@4.0.0: - resolution: - { - integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== - } + tinyexec@0.3.2: {} + + to-regex-range@5.0.1: dependencies: - "@types/unist": 3.0.2 - dev: false + is-number: 7.0.0 - /unist-util-visit-children@2.0.2: - resolution: - { - integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q== - } + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + tsconfck@3.1.4(typescript@5.6.3): + optionalDependencies: + typescript: 5.6.3 + + tslib@2.8.1: {} + + type-check@0.4.0: dependencies: - "@types/unist": 2.0.10 - dev: false + prelude-ls: 1.2.1 - /unist-util-visit-children@3.0.0: - resolution: - { - integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA== - } + type-fest@4.31.0: {} + + typescript@5.6.3: {} + + ufo@1.5.4: {} + + ultrahtml@1.5.3: {} + + uncrypto@0.1.3: {} + + unenv@1.10.0: dependencies: - "@types/unist": 3.0.2 - dev: false + consola: 3.3.3 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.4 + pathe: 1.1.2 - /unist-util-visit-parents@5.1.3: - resolution: - { - integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== - } + unified@11.0.5: dependencies: - "@types/unist": 2.0.10 - unist-util-is: 5.2.1 - dev: false + "@types/unist": 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 - /unist-util-visit-parents@6.0.1: - resolution: - { - integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== - } + unist-util-find-after@5.0.0: dependencies: - "@types/unist": 3.0.2 + "@types/unist": 3.0.3 unist-util-is: 6.0.0 - dev: false - /unist-util-visit@4.1.2: - resolution: - { - integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== - } + unist-util-is@6.0.0: dependencies: - "@types/unist": 2.0.10 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: false + "@types/unist": 3.0.3 - /unist-util-visit@5.0.0: - resolution: - { - integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== - } + unist-util-modify-children@4.0.0: dependencies: - "@types/unist": 3.0.2 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: false + "@types/unist": 3.0.3 + array-iterate: 2.0.1 - /update-browserslist-db@1.0.16(browserslist@4.23.1): - resolution: - { - integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== - } - hasBin: true - peerDependencies: - browserslist: ">= 4.21.0" + unist-util-position-from-estree@2.0.0: dependencies: - browserslist: 4.23.1 - escalade: 3.1.2 - picocolors: 1.0.1 - dev: false + "@types/unist": 3.0.3 - /uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - } + unist-util-position@5.0.0: dependencies: - punycode: 2.3.1 - dev: true + "@types/unist": 3.0.3 - /util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - } - dev: false + unist-util-remove-position@5.0.0: + dependencies: + "@types/unist": 3.0.3 + unist-util-visit: 5.0.0 - /vfile-location@5.0.2: - resolution: - { - integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg== - } + unist-util-stringify-position@4.0.0: dependencies: - "@types/unist": 3.0.2 - vfile: 6.0.1 - dev: false + "@types/unist": 3.0.3 - /vfile-message@3.1.4: - resolution: - { - integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== - } + unist-util-visit-children@3.0.0: dependencies: - "@types/unist": 2.0.10 - unist-util-stringify-position: 3.0.3 - dev: false + "@types/unist": 3.0.3 - /vfile-message@4.0.2: - resolution: - { - integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== - } + unist-util-visit-parents@6.0.1: dependencies: - "@types/unist": 3.0.2 - unist-util-stringify-position: 4.0.0 - dev: false + "@types/unist": 3.0.3 + unist-util-is: 6.0.0 - /vfile@5.3.7: - resolution: - { - integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== - } + unist-util-visit@5.0.0: dependencies: - "@types/unist": 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - dev: false + "@types/unist": 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 - /vfile@6.0.1: - resolution: - { - integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw== - } + unstorage@1.14.4: dependencies: - "@types/unist": 3.0.2 + anymatch: 3.1.3 + chokidar: 3.6.0 + destr: 2.0.3 + h3: 1.13.0 + lru-cache: 10.4.3 + node-fetch-native: 1.6.4 + ofetch: 1.4.1 + ufo: 1.5.4 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + vfile-location@5.0.3: + dependencies: + "@types/unist": 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.2: + dependencies: + "@types/unist": 3.0.3 unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + "@types/unist": 3.0.3 vfile-message: 4.0.2 - dev: false - /vite@5.3.0: - resolution: - { - integrity: sha512-hA6vAVK977NyW1Qw+fLvqSo7xDPej7von7C3DwwqPRmnnnK36XEBC/J3j1V5lP8fbt7y0TgTKJbpNGSwM+Bdeg== - } - engines: { node: ^18.0.0 || >=20.0.0 } - hasBin: true - peerDependencies: - "@types/node": ^18.0.0 || >=20.0.0 - less: "*" - lightningcss: ^1.21.0 - sass: "*" - stylus: "*" - sugarss: "*" - terser: ^5.4.0 - peerDependenciesMeta: - "@types/node": - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@6.0.7: dependencies: - esbuild: 0.21.5 - postcss: 8.4.38 - rollup: 4.18.0 + esbuild: 0.24.2 + postcss: 8.4.49 + rollup: 4.30.0 optionalDependencies: fsevents: 2.3.3 - dev: false - - /vitefu@0.2.5(vite@5.3.0): - resolution: - { - integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q== - } - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - vite: - optional: true - dependencies: - vite: 5.3.0 - dev: false - /web-namespaces@2.0.1: - resolution: - { - integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== - } - dev: false + vitefu@1.0.5(vite@6.0.7): + optionalDependencies: + vite: 6.0.7 - /which-pm-runs@1.1.0: - resolution: - { - integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== - } - engines: { node: ">=4" } - dev: false + web-namespaces@2.0.1: {} - /which-pm@2.0.0: - resolution: - { - integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w== - } - engines: { node: ">=8.15" } - dependencies: - load-yaml-file: 0.2.0 - path-exists: 4.0.0 - dev: false + which-pm-runs@1.1.0: {} - /which-pm@2.2.0: - resolution: - { - integrity: sha512-MOiaDbA5ZZgUjkeMWM5EkJp4loW5ZRoa5bc3/aeMox/PJelMhE6t7S/mLuiY43DBupyxH+S0U1bTui9kWUlmsw== - } - engines: { node: ">=8.15" } + which-pm@3.0.0: dependencies: load-yaml-file: 0.2.0 - path-exists: 4.0.0 - dev: false - /which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - } - engines: { node: ">= 8" } - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - /widest-line@4.0.1: - resolution: - { - integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== - } - engines: { node: ">=12" } + widest-line@5.0.0: dependencies: - string-width: 5.1.2 - dev: false + string-width: 7.2.0 - /word-wrap@1.2.5: - resolution: - { - integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - } - engines: { node: ">=0.10.0" } - dev: true + word-wrap@1.2.5: {} - /wrap-ansi@8.1.0: - resolution: - { - integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - } - engines: { node: ">=12" } + wrap-ansi@9.0.0: dependencies: ansi-styles: 6.2.1 - string-width: 5.1.2 + string-width: 7.2.0 strip-ansi: 7.1.0 - dev: false - - /wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - } - dev: true - /xml-js@1.6.11: - resolution: - { - integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== - } - hasBin: true + xml-js@1.6.11: dependencies: sax: 1.4.1 - dev: true - /yallist@3.1.1: - resolution: - { - integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - } - dev: false + xxhash-wasm@1.1.0: {} - /yargs-parser@21.1.1: - resolution: - { - integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - } - engines: { node: ">=12" } - dev: false + yargs-parser@21.1.1: {} - /yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - } - engines: { node: ">=10" } + yocto-queue@0.1.0: {} - /yocto-queue@1.0.0: - resolution: - { - integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== - } - engines: { node: ">=12.20" } - dev: false + yocto-queue@1.1.1: {} - /zod-to-json-schema@3.23.0(zod@3.23.8): - resolution: - { - integrity: sha512-az0uJ243PxsRIa2x1WmNE/pnuA05gUq/JB8Lwe1EDCCL/Fz9MgjYQ0fPlyc2Tcv6aF2ZA7WM5TWaRZVEFaAIag== - } - peerDependencies: - zod: ^3.23.3 + yocto-spinner@0.1.2: dependencies: - zod: 3.23.8 - dev: false + yoctocolors: 2.1.1 - /zod@3.23.8: - resolution: - { - integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== - } - dev: false + yoctocolors@2.1.1: {} - /zwitch@2.0.4: - resolution: - { - integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== - } - dev: false + zod-to-json-schema@3.24.1(zod@3.24.1): + dependencies: + zod: 3.24.1 + + zod-to-ts@1.2.0(typescript@5.6.3)(zod@3.24.1): + dependencies: + typescript: 5.6.3 + zod: 3.24.1 + + zod@3.24.1: {} + + zwitch@2.0.4: {} diff --git a/docs/src/assets/docs-images/details/asset_bundle.webp b/docs/src/assets/docs-images/details/asset_bundle.webp deleted file mode 100644 index 9484111f8..000000000 Binary files a/docs/src/assets/docs-images/details/asset_bundle.webp and /dev/null differ diff --git a/docs/src/content/docs/guides/details.md b/docs/src/content/docs/guides/details.md index ea05b3d0d..f62e9eea7 100644 --- a/docs/src/content/docs/guides/details.md +++ b/docs/src/content/docs/guides/details.md @@ -5,77 +5,27 @@ description: A guide to adding details to planets in New Horizons For physical objects there are currently two ways of setting them up: specify an asset bundle and path to load a custom asset you created, or specify the path to the item you want to copy from the game in the scene hierarchy. Use the [Unity Explorer](https://outerwildsmods.com/mods/unityexplorer) mod to find an object you want to copy onto your new body. Some objects work better than others for this. Good luck. Some pointers: -- Use "Object Explorer" to search -- Generally you can find planets by writing their name with no spaces/punctuation followed by "\_Body". -- There's also [this community-maintained list of props](https://docs.google.com/spreadsheets/d/1VJaglB1kRL0VqaXhvXepIeymo93zqhWex-j7_QDm6NE/edit?usp=sharing) which you can use to find interesting props and check to see if they have collision. +- Use "Object Explorer" to search +- Generally you can find planets by writing their name with no spaces/punctuation followed by "\_Body". +- There's also [this community-maintained list of props](https://docs.google.com/spreadsheets/d/1VJaglB1kRL0VqaXhvXepIeymo93zqhWex-j7_QDm6NE/edit?usp=sharing) which you can use to find interesting props and check to see if they have collision. -## Using the Prop Placer +## Debug Raycast -The Prop Placer is a convenience tool that lets you manually place details from inside the game. Once enabled, press "G" and your currently selected prop will be placed wherever your crosshair is pointing. +If you turn on debug mode (the mod option), you can press P to shoot a ray where you're looking. This will print location info to the console that you can paste into your configs, as well as paths that you can explore further in Unity Explorer. +Of note: the rotation of the raycast will have the up direction facing away from the ground/wall/ceiling and the forward direction facing you. -### Enabling +## [Unity Explorer](https://outerwildsmods.com/mods/unityexplorer/) -1. Pause the game. You will see an extra menu option titled "Toggle Prop Placer Menu". Click it -2. The prop placer menu should now be open. At the bottom of the menu, you will see a list of mods. Click yours. - 1. This menu scrolls. If you do not see your mod, it may be further down the list. -3. The Prop Placer is now active! Unpause the game, and you can now place Nomai vases using "G" - -### How to Select Props - -1. Pause the game again. The prop placer menu should still be visible. -2. At the top of the menu, you'll see a text box containing the path for the vase. Replace this with the path for the prop you want to place. For example: `DreamWorld_Body/Sector_DreamWorld/Sector_DreamZone_1/Props_DreamZone_1/OtherComponentsGroup/Trees_Z1/DreamHouseIsland/Tree_DW_M_Var` -3. Tip: use the Unity Explorer mod to find the path for the object you want to place. You only have to do this once. -4. Unpause the game and press "G". Say hello to your new tree! -5. Pause the game again. You will now see the prop you just placed on the list of recently placed props just below the "path" text box. -6. Click on the button titled "Prefab_NOM_VaseThin". You can now place vases again. - -### Extra features - -1. Made a mistake? **Press the "-" key to undo.** Press the "+" key to redo. -2. If you have the Unity Explorer mod enabled, you can use this to tweak the position, rotation, and scale of your props. Your changes will be saved. -3. Want to save some recently placed props between game launches? On the recently placed props list, click the star next to the prop's name to favorite it. -4. Found a bug that ruined your configs? Check `AppData\Roaming\OuterWildsModManager\OWML\Mods\xen.NewHorizons\configBackups` for backup saves of your work. Folders are titled "\[date\]T\[time\]". -5. Want to add props to Ember Twin but don't feel like making a config file for it? We got you! Place that prop and the config file will be created automatically on your next save. -6. This even works for planets that were created by other mods! +You can use this to tweak the position, rotation, and scale of your props. These docs will not elaborate too much on this tool. There are other tutorials out there. ## Asset Bundles -Here is a template project: [Outer Wilds Unity Template](https://github.com/xen-42/outer-wilds-unity-template) - -The template project contains ripped versions of all the game scripts, meaning you can put things like DirectionalForceVolumes in your Unity project to have artificial gravity volumes loaded right into the game. - -If for whatever reason you want to set up a Unity project manually instead of using the template, follow these instructions: - -1. Start up a Unity 2019.4.39f1 project -2. In the "Assets" folder in Unity, create a new folder called "Editor". In it create a file called "CreateAssetBundle.cs" with the following code in it: - -```cs title="Editor/CreateAssetBundle.cs" -using UnityEditor; -using UnityEngine; -using System.IO; - -public class CreateAssetBundles -{ - [MenuItem("Assets/Build AssetBundles")] - static void BuildAllAssetBundles() - { - string assetBundleDirectory = "Assets/StreamingAssets"; - if (!Directory.Exists(Application.streamingAssetsPath)) - { - Directory.CreateDirectory(assetBundleDirectory); - } - BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); - } -} -``` - -3. Create your object in the Unity scene and save it as a prefab. -4. Add all files used (models, prefabs, textures, materials, etc.) to an asset bundle by selecting them and using the dropdown in the bottom right. Here I am adding a rover model to my "rss" asset bundle for the Real Solar System add-on. +There is an [old unity template](https://github.com/xen-42/outer-wilds-unity-template) and a [new one](https://github.com/ow-mods/outer-wilds-unity-wiki/wiki#outer-wilds-unity-assets) -![setting asset bundle](@/assets/docs-images/details/asset_bundle.webp) +The project contains ripped versions of all the game scripts, meaning you can put things like DirectionalForceVolumes in your Unity project to have artificial gravity volumes loaded right into the game. +Either one works, but the tool one has more tools and more feature-full versions of the scripts (in exchange for being invite-only) -1. In the top left click the "Assets" drop-down and select "Build AssetBundles". This should create your asset bundle in a folder in the root directory called "StreamingAssets". -2. Copy the asset bundle and asset bundle .manifest files from StreamingAssets into your mod's "planets" folder. If you did everything properly they should work in game. To double-check everything is included, open the .manifest file in a text editor to see the files included and their paths. +Read [this guide](https://github.com/ow-mods/outer-wilds-unity-wiki/wiki/Tutorials-%E2%80%90-Using-asset-bundles) on how to work with asset bundles in editor. ## Importing a planet's surface from Unity @@ -146,6 +96,157 @@ You can swap these around too. The following would scatter 12 Mars rovers across } ``` +## Custom Items and Item Sockets + +### Items + +You can convert details into custom items for the player to pick up and hold by adding the `item` properties to your detail: + +```json +{ + "Props": { + "details": [ + { + "path": "Moon_Body/Sector_THM/Interactables_THM/Prefab_HEA_Recorder/Props_HEA_Recorder_Geo", + "position": {"x": -35.30206, "y": -79.12967, "z": 182.912}, + "rotation": {"x": 300.8207, "y": 32.93826, "z": 141.4214}, + "item": { + "name": "Tape Recorder", + "itemType": "Decoration" + } + } + ] + } +} +``` + +The `name` and `itemType` can be anything you want. The `name` will be what's displayed to the player when they mouse over it ("Pick up X"), and `itemType` determines the kinds of item sockets that the item can be placed in. + +> Note: Outer Wilds is unfortunately very picky about the types of objects you can use as items. There must be a collider on the object itself which the game will use to check if the cursor is over it or not to allow you to pick it up. Colliders on child objects will have collision as normal but won't allow you to pick up the item when you mouse over them. By default, New Horizons will add a spherical collider to your detail to act as this mouse-over collider. If your object already has a working collider on it, you can disable the New Horizons spherical collider by setting `"colliderRadius": 0`. + +Here's a more complex example, with every property filled out: + +```json +{ + "Props": { + "details": [ + { + "path": "BrittleHollow_Body/Sector_BH/Sector_NorthHemisphere/Sector_NorthPole/Sector_HangingCity/Sector_HangingCity_BlackHoleForge/BlackHoleForgePivot/Props_BlackHoleForge/Prefab_NOM_VaseThick", + "position": {"x": -33.30206, "y": -79.12967, "z": 182.912}, + "rotation": {"x": 300.8207, "y": 32.93826, "z": 141.4214}, + "item": { + "name": "Nomai Vase", + "itemType": "Decoration", + "interactRange": 3, + "colliderRadius": 0, + + "droppable": true, + "dropOffset": {"x": 0, "y": 0, "z": 0}, + "dropNormal": {"x":0, "y": 1, "z": 0}, + + "holdOffset": {"x": 0, "y": -0.3, "z": 0}, + "holdRotation": {"x": 0, "y": 45, "z": 0}, + + "socketOffset": {"x": 0, "y": 0.2, "z": 0}, + "socketRotation": {"x": 0, "y": 45, "z": 0}, + + "pickupAudio": "ToolProbeRetrieve", + "dropAudio": "ToolProbeLaunch", + "socketAudio": "PlayerSuitLockOn", + "unsocketAudio": "PlayerSuitLockOff", + + "pickupCondition": "VASE_PICKED_UP", + "clearPickupConditionOnDrop": true, + "pickupFact": "EXAMPLES_VASE", + + "pathToInitialSocket": "Sector_TH/Strucutre_NOM_Shelf" + } + } + ] + } +} +``` + +To see the full list of item properties and descriptions of what each property does, check [the ItemInfo schema](/schemas/body-schema/defs/iteminfo/). + +### Item Sockets + +You can also designate a detail as an "item socket," which will allow certain items to be placed into it. For example, the Nomai whiteboards have a socket for scrolls, and the Vessel's warp core slot is also a socket. You do this by adding the `itemSocket` properties to your detail: + +```json +{ + "Props": { + "details": [ + { + "path": "QuantumIsland_Body/Sector_QuantumIsland/Sector_QuantumTowerInterior/Sector_QuantumTowerFinalRoom/Interactables_FinalRoom/FinalRoom_QProps/FinalRoom_Shelf/Q_Shelf/Prefab_NOM_Shelf/Strucutre_NOM_Shelf", + "position": {"x": -29.89541, "y": -79.87562, "z": 183.1785}, + "rotation": {"x": 314.8642, "y": 286.1038, "z": 235.4039}, + "itemSocket": { + "itemType": "Decoration", + "interactRange": 3, + "colliderRadius": 0.5, + "useGiveTakePrompts": true, + + "insertCondition": "VASE_INSERTED", + "clearInsertConditionOnRemoval": true, + "insertFact": "EXAMPLES_VASE_INSERTED", + + "removalCondition": "VASE_REMOVED", + "clearRemovalConditionOnInsert": true, + "removalFact": "EXAMPLES_VASE_REMOVED", + + "position": {"x": 0, "y": 0, "z": 0.5}, + "rotation": {"x": 0, "y": 0, "z": 0}, + "isRelativeToParent": true + } + } + ] + } +} +``` + +Item sockets will allow any item with a matching `itemType` to be placed into them; all other item types will show the "item does not fit" message. + +> Item sockets are also picky about colliders in the same way items are. The detail object must have a collider on it; colliders on child objects will not work for placing and removing items when the cursor is over them. New Horizons will add a spherical collider for you if you set `colliderRadius` to a non-zero value. + +The `position`, `rotation`, and `isRelativeToParent` properties on the `itemSocket` don't describe the location of the detail itself, but rather the point on the detail where items will be inserted. This will likely not be at the exact center of the detail, so you should use this properties to customize the location of the socket. If there is already an child object you want to use as a pivot point, you can put a relative path from the detail to the child object in the `socketPath` property to use instead of the generated socket point. + +To see the full list of item socket properties and descriptions of what each property does, check [the ItemSocketInfo schema](/schemas/body-schema/defs/itemsocketinfo/). + +### Making Puzzles with Items and Sockets + +You can use items and sockets to create simple puzzles purely with New Horizons configs! Consider this cut-down example. It describes a "Rusty Key" object, and a "Locked Door" object. The locked door will disappear when the key is inserted into it, allowing the player to move through the doorway. + +```json +{ + "Props": { + "details": [ + { + "path": "BlahBlahBlah", + "item": { + "name": "Rusty Key", + "itemType": "Key" + } + }, + { + "path": "BlahBlahBlah", + "rename": "Locked Door", + "deactivationCondition": "DOOR_UNLOCKED", + "itemSocket": { + "itemType": "Key", + "insertCondition": "DOOR_UNLOCKED" + } + } + ] + } +} +``` + +When the "Rusty Key" item (or any other item with `"itemType": "Key"`, for that matter) is inserted into the "Locked Door" item socket, a condition we've named `DOOR_UNLOCKED` is set to true. These conditions are mainly used for dialogue in Outer Wilds, but New Horizons also allows us to control objects with them. The locked door object has the `DOOR_UNLOCKED` condition as its `deactivationCondition`, which will cause it to disappear ("deactivate") when the condition is set. + +There are a handful of other properties that can be used like this: `activationCondition` and `deactivationCondition` on all details, `insertCondition` and `removalCondition` on item sockets, and `pickupCondition` on items. There are other properties that can further customize these behaviors. + + ## Use the schema To view additional options for detailing, check [the schema](/schemas/body-schema/defs/propmodule#details) diff --git a/docs/src/content/docs/guides/dialogue.md b/docs/src/content/docs/guides/dialogue.md index 77d8631d5..a50577728 100644 --- a/docs/src/content/docs/guides/dialogue.md +++ b/docs/src/content/docs/guides/dialogue.md @@ -27,6 +27,26 @@ A persistent condition is similar to a condition, except it _persists_ through l A remote trigger is used to have an NPC talk to you from a distance; ex: Slate stopping you for the umpteenth time to tell you information you already knew. +### ReuseDialogueOptionsListFrom + +This is a custom XML node introduced by New Horizons. Use it when adding new dialogue to existing characters, to repeat the dialogue options list from another node. + +For example, Slate's first dialogue with options is named `Scientist5`. To make a custom DialogueNode using these dialogue options (meaning new dialogue said by Slate, but reusing the possible player responses) you can write: + +```xml + + ... + + NEW DIALOGUE FOR SLATE HERE. + + + Scientist5 + + +``` + +Note: If you're loading dialogue in code, 2 frames must pass before entering the conversation in order for ReuseDialogueOptionsListFrom to take effect. + ## Example XML Here's an example dialogue XML: @@ -200,3 +220,9 @@ To use this additional dialogue you need to reference it in a planet config file } ] ``` + +## Dialogue FAQ + +### How do I easily position my dialogue relative to a speaking character + +Use `pathToAnimController` to specify the path to the speaking character (if they are a Nomai or Hearthian make sure this goes directly to whatever script controls their animations), then set `isRelativeToParent` to true (this is setting available on all NH props for easier positioning). Now when you set their `position`, it will be relative to the speaker. Since this position is normally where the character is standing, set the `y` position to match how tall the character is. Instead of `pathToAnimController` you can also use `parentPath`. diff --git a/docs/src/content/docs/guides/planet-generation.md b/docs/src/content/docs/guides/planet-generation.md index 7baad807d..4310b55af 100644 --- a/docs/src/content/docs/guides/planet-generation.md +++ b/docs/src/content/docs/guides/planet-generation.md @@ -35,12 +35,12 @@ There are also tools to help generate these images for you such as [Textures For The following modules support variable sizing, meaning they can change scale over the course of the loop. -- Water -- Lava -- Star -- Sand -- Funnel -- Ring +- Water +- Lava +- Star +- Sand +- Funnel +- Ring To do this, simply specify a `curve` property on the module diff --git a/docs/src/content/docs/guides/publishing.md b/docs/src/content/docs/guides/publishing.md index 65ad5f700..dc1dba399 100644 --- a/docs/src/content/docs/guides/publishing.md +++ b/docs/src/content/docs/guides/publishing.md @@ -10,10 +10,10 @@ This guide assumes you've created your addon by following [the addon creation gu Before you release anything, you'll want to make sure: -- Your mod has a descriptive `README.md`. (This will be shown on the website) -- Your repo has the description field (click the cog in the right column on the "Code" tab) set. (this will be shown in the manager) -- There's no `config.json` in your addon. (Not super important, but good practice) -- Your manifest has a valid name, author, and unique name. +- Your mod has a descriptive `README.md`. (This will be shown on the website) +- Your repo has the description field (click the cog in the right column on the "Code" tab) set. (this will be shown in the manager) +- There's no `config.json` in your addon. (Not super important, but good practice) +- Your manifest has a valid name, author, and unique name. ## Releasing diff --git a/docs/src/content/docs/guides/ship-log.md b/docs/src/content/docs/guides/ship-log.md index efcc2d428..55399d2b8 100644 --- a/docs/src/content/docs/guides/ship-log.md +++ b/docs/src/content/docs/guides/ship-log.md @@ -542,3 +542,28 @@ Adding an entry location is similar to adding a Reveal Volume: ``` ![entryLocationExample](@/assets/docs-images/ship_log/entry_position.webp) + +## Extending Base Game Entries + +You can add new facts and sub-entries to existing ship log entries by adding a dummy entry to your ship log XML file with the same ID as an existing entry. Any facts and sub-entries will be applied to the existing entry. For example, to extend the "Village" entry on Timber Hearth (which has the internal ID "TH_VILLAGE"): + +```xml title="ExampleShipLog.xml" + + TIMBER_HEARTH + + TH_VILLAGE + + EXAMPLES_VILLAGE + A lot of unfamiliar characters are hanging around the village now. + + + EXAMPLES_DREAM + Wetrock Dream + + EXAMPLES_DREAM_EXPLORED + I dreamed about Wetrock using a green campfire. + + + + +``` diff --git a/docs/src/content/docs/guides/translation.md b/docs/src/content/docs/guides/translation.md index 56a3dacbe..cd910f05d 100644 --- a/docs/src/content/docs/guides/translation.md +++ b/docs/src/content/docs/guides/translation.md @@ -35,8 +35,8 @@ Are you tired of manually translating JSON? Do you want an automatic translator? This tool has the following features: -- Extract text from XML files and create english.json as the translation source. -- Translate english.json to create a json file for another language. +- Extract text from XML files and create english.json as the translation source. +- Translate english.json to create a json file for another language. This section outlines how to install and use the nh-translation-helper. @@ -44,10 +44,10 @@ This section outlines how to install and use the nh-translation-helper. To get started, head over to the [repo for the tool](https://github.com/96-38/nh-translation-helper) and prepare the requirements: -- Install [Node.js](https://nodejs.org/) >= 12.0.0 - - Install the LTS version. -- Get [DeepL API](https://www.deepl.com/docs-api) Key (Free or Pro) - - Sign up [here](https://www.deepl.com/pro#developer) +- Install [Node.js](https://nodejs.org/) >= 12.0.0 + - Install the LTS version. +- Get [DeepL API](https://www.deepl.com/docs-api) Key (Free or Pro) + - Sign up [here](https://www.deepl.com/pro#developer) When you are ready, execute the following command in a terminal or command prompt: @@ -81,20 +81,20 @@ Please enter the DeepL API key for the first time only. The API key will be save ### Note -- Not supported extracting UIDictionary and AchievementTranslations +- Not supported extracting UIDictionary and AchievementTranslations - - It is difficult to parse these automatically, and the number of words is small that it would be better to add them by MOD developers manually for better results. - - Translating UIDictionary and AchievementTranslations is supported. + - It is difficult to parse these automatically, and the number of words is small that it would be better to add them by MOD developers manually for better results. + - Translating UIDictionary and AchievementTranslations is supported. -- Not supported translation into Korean +- Not supported translation into Korean - - Translation is provided by the DeepL API, so it is not possible to translate into languages that are not supported by DeepL. + - Translation is provided by the DeepL API, so it is not possible to translate into languages that are not supported by DeepL. -- The generated translations are "**not**" perfect +- The generated translations are "**not**" perfect - - It is a machine translation though DeepL. The translations on DeepL are known to be too casual or to abbreviate some sentences. - - It will need to be manually corrected to make it a good translation. However, this tool allows you to prototype and is more efficient than starting from scratch. Also, the CDATA tag has been removed from the translated text and must be added manually. + - It is a machine translation though DeepL. The translations on DeepL are known to be too casual or to abbreviate some sentences. + - It will need to be manually corrected to make it a good translation. However, this tool allows you to prototype and is more efficient than starting from scratch. Also, the CDATA tag has been removed from the translated text and must be added manually. -- Parsing errors may occur when trying to translate manually created JSON files - - In many cases, this is due to a specific comment in the JSON. Please remove the comments and try again. - - Most comments are processed normally, but errors may occur if the comment contains special symbols or if the comment is located at the end of a JSON object. +- Parsing errors may occur when trying to translate manually created JSON files + - In many cases, this is due to a specific comment in the JSON. Please remove the comments and try again. + - Most comments are processed normally, but errors may occur if the comment contains special symbols or if the comment is located at the end of a JSON object. diff --git a/docs/src/content/docs/guides/troubleshooting.md b/docs/src/content/docs/guides/troubleshooting.md index 77ca1796f..d4650d40e 100644 --- a/docs/src/content/docs/guides/troubleshooting.md +++ b/docs/src/content/docs/guides/troubleshooting.md @@ -11,9 +11,13 @@ an image you'll need to clear the cache located in the `SlideReelsCache` folder ## My planet is flying away at light speed and also I have anglerfish -Be sure to disable `hasFluidDetector` (previous had to enable `invulnerableToSun`). The anglerfish have fluid volumes in their mouths for killing you +Be sure to disable `hasFluidDetector` (previous had to enable `invulnerableToSun`). The anglerfish have fluid volumes in their mouths for killing you which interact poorly with the fluid detector and can mess up the movement of the planet. ## My Nomai text isn't updating -Either clear the .nhcache files or enable Debug mode to always regenerate the text cache. \ No newline at end of file +Either clear the .nhcache files or enable Debug mode to always regenerate the text cache. + +## Prop placer is gone! +This is not a bug, actually. We removed prop placer because it was inconsistent and buggy, and no one in years cared enough to fix it. +Use the debug raycast button and Unity Explorer to place your props, or otherwise work in unity editor. diff --git a/docs/src/content/docs/guides/updating-planets.md b/docs/src/content/docs/guides/updating-planets.md index ad9784d4d..55dc08d5a 100644 --- a/docs/src/content/docs/guides/updating-planets.md +++ b/docs/src/content/docs/guides/updating-planets.md @@ -3,31 +3,31 @@ title: Update Existing Planets description: A guide for updating base-game planets in New Horizons --- -Similar to above, make a config where "Name" is the name of the planet. The name should be able to just match their in-game english names, however if you encounter any issues with that here are the in-code names for planets that are guaranteed to work: - -- `SUN` -- `CAVE_TWIN` (Ember Twin) -- `TOWER_TWIN` (Ash Twin) -- `TIMBER_HEARTH` -- `BRITTLE_HOLLOW` -- `GIANTS_DEEP` -- `DARK_BRAMBLE` -- `COMET` (Interloper) -- `WHITE_HOLE` -- `WHITE_HOLE_TARGET` (The Whitehole Station) -- `QUANTUM_MOON` -- `ORBITAL_PROBE_CANNON` -- `TIMBER_MOON` (Attlerock) -- `VOLCANIC_MOON` (Hollow's Lantern) -- `DREAMWORLD` -- `MapSatellite` -- `RINGWORLD` (The Stranger) +Similar to above, make a config where "Name" is the name of the planet. The name should be able to just match their in-game english names, however if you encounter any issues with that here are the in-code names for planets that are guaranteed to work (case sensitive!): + +- `SUN` +- `CAVE_TWIN` (Ember Twin) +- `TOWER_TWIN` (Ash Twin) +- `TIMBER_HEARTH` +- `BRITTLE_HOLLOW` +- `GIANTS_DEEP` +- `DARK_BRAMBLE` +- `COMET` (Interloper) +- `WHITE_HOLE` +- `WhiteholeStation` +- `QUANTUM_MOON` +- `ORBITAL_PROBE_CANNON` +- `TIMBER_MOON` (Attlerock) +- `VOLCANIC_MOON` (Hollow's Lantern) +- `DREAMWORLD` +- `MapSatellite` +- `RINGWORLD` (The Stranger) Some features will not work if you try to add them to a base planet config. These include: -- FocalPoints (just makes no sense really, a focal point is meant to be a intangible point between two binary bodies). -- Gravity (including the strength, fall-off, and the size of the gravitational sphere of influence) -- Reference frames (the volume used for targetting a planet with your ships navigation systems) +- FocalPoints (just makes no sense really, a focal point is meant to be a intangible point between two binary bodies). +- Gravity (including the strength, fall-off, and the size of the gravitational sphere of influence) +- Reference frames (the volume used for targetting a planet with your ships navigation systems) You can also delete parts of an existing planet. Here's part of an example config which would delete the rising sand from Ember Twin: diff --git a/docs/src/content/docs/reference/audio-enum.md b/docs/src/content/docs/reference/audio-enum.md index 6cbd79193..199825b78 100644 --- a/docs/src/content/docs/reference/audio-enum.md +++ b/docs/src/content/docs/reference/audio-enum.md @@ -769,1164 +769,1164 @@ Ignore the numbers, just take the name. This is a list of AudioClips that will also work, there's a lot of overlap with the AudioType list. Many old addons with signals use values from this list. -- Hotel Oneshot - Heavy Thud 4 -- Tool_Put_Away_01 -- OW Quantum Lightning 091118 AP 07 -- OW_GD_ElectricBarrier_Idle_Loop -- Nomai_Stone_Door_End_V2_11 -- General Destruction 1 -- Dream Rule 02 backdrop loop 072321_2 AP -- amb_observatory -- Dream World Water Ambience - Creek 3 -- Pickup_Rock_01 -- gasp_traumatic4_lessmale -- Ship_Impact_Light_Damage_V3_06 -- BlackHole_02 -- OW_GD_WavesAgainstRock -- OW_TH_AmbienceInCanyons -- OW_PR_FootstepsBushRustle_03 -- OW_PR_ActivateProbeMode -- Ghost Walk Footstep Wood_v2 6 -- rockingchair4 -- Water Spray Impact 4 -- OW Secret Library 040821_2 AP -- Real World Dam Break Alex Composite 2 -- Ghost Run Footstep Wood_v2 4 -- UI_Enter_Dialog_V6-002_highpass_2 -- Spark_10 -- Mournful Prisoner 3 -- OW_PR_FootstepsLeaves_06 -- FootstepsWoodCreak_02 -- OW Dreamworld Ruins 072021 AP 02c -- OW_PR_HitWallUnderwater1 -- OW_TH_RiverWaterFlow_loop -- OW ReelBeat 01c 021021 AP -- FootstepsWoodCreak_07 -- Ignite_Marshmallow_03 -- Marshmallow_Replace_02 -- Ship_FuelLeak -- Raft Heavy Impact 5 -- elevatorloop -- Real World Alarm Bell Oneshot 3 -- BigBang_EndFlash -- OW_FinalEndTimes_DB_loop -- fogsphere_pulse4 -- Ringworld Ambience 3 -- Destruction Impact 4 -- Artifact Unconceal -- OW_NM_DoorStart_06 -- OW_PR_SignalscopeZoomOut -- Nomai_Stone_Door_End_Big_V2_03 -- Player Gravel Footstep 3 -- General Destruction 5 -- OW Dream Fire Room 121820_4 AP LP -- OW_PR_DeactivateProbeMode -- OW_PR_LandInWater4 -- OW_PR_FootstepsJumpNomai_04 -- OW_PR_FootstepsJumpMetal_03 -- WarpCore_Remove_V3_01 -- Probe_SnapShot_03 -- Ghost Idle Search 4 -- Solanum_Foley_IconExit -- Dream Fire Room Ambience Test 1 -- Lantern Extinguish 4 -- OW_PR_OxygenLeakingFromSuit_loop_louder -- Wood Door Open Stop -- OW_PR_FootstepsJumpGrass_01 -- OW_SP_ThrustAfterburn -- OW_PR_FootstepsGrass_01 -- Real World Alarm Bell Oneshot 4 -- OW_PR_FootstepsNomai_04 -- Hotel Oneshot - Heavy Thud 2 -- Light Sensor Fade In 4 -- AnglerFish_OpenMouth_v2_01 -- Footstep_Run4 -- Ghost Walk Footstep Forest 6 -- OW_PR_FootstepsGrass_06 -- OW_GD_AmbienceRain -- RotationalThruster04 -- OW New Raft Music 082321_4 AP theme -- Spark_01 -- OW Muted End Times 040821 AP -- Nomai_WhiteHoleStationActivation -- Tool_Take_Out_02 -- OW_PR_FootstepsJumpDirt_05 -- mallowpuff2 -- Dreamworld Tower Fall Part 2 -- Jump_Into_Fogsphere_04 -- FootstepsWoodCreak_05 -- OW_SP_MetalCreak_14 -- OW_NM_DoorStart_03 -- drowning_firsthalf2 -- Forest Oneshot - Tree Creak 4 -- shiplog_misc1 -- FootstepsWoodCreak_04 -- Real World Dam Crack -- OW_NM_DoorStart_09 -- OW_SP_LandingPadHard4 -- OW_PR_FootstepsSand_06 -- BH_Ambience_Surface -- Ghost Grunt 3 -- glass_crack_02 -- House Destruction 3 -- OW_QuantumMoon -- Orb_Roll_Energy_Loop_v2_01 -- OW Eye Of The Universe 082018_2 AP -- Footstep3 -- OW_NM_DoorStart_Big_01 -- OW Dreamworld Ruins Story Beats 071621 AP 1d -- Dream World Tidal Wave Loop -- Nomai_Stone_Door_End_Big_V2_15 -- OW_SP_ActivateComputer 1 -- OW_PR_FootstepsIce_07 -- Raft Light Impact V2 3 -- UI_Pause_v2_08 -- signalscope_static -- OW_SP_LandingCamActivated 1 -- Footstep4 -- OW_PR_FootstepsSand_03 -- Prisoner Pick Up Vision Torch -- OW_SP_MetalCreak_16 -- OW_SP_Touchdown_04 -- Platform_Break_V2_03 -- OW Nomai Time Loop Device 081818 AP -- RockPile_Fall_02 -- Ship_Impact_No_Damage_V3_02 -- Destruction Impact 7 -- Ghost Grab Player 2 -- Forest Oneshot - Tree Creak 5 -- OW_PR_FootstepsMetal_01 -- OW NM Flashback 082818_3 AP base -- Projector Totem Light 2 -- Slot_Linking_Stone_Loop_02 -- breathing_suit3 -- OW_PR_FootstepsWood_07 -- OW_SP_HeadlightsOff_v2 -- Nomai_Stone_Door_End_V2_06 -- Fix_Puncture_03 -- OW Dream Rule LP 032421 AP glitch -- Real World Tidal Wave Loop Louder -- OW Dreamworld Ruins 072021 AP 02loop -- gasp_normal11_lessmale -- OW ReelBeat 01a 021021 AP -- OW_TH_ModelRocketThrustRotational_01 -- OW_PR_FootstepsBushRustle_05 -- OW NomaiRuinsRegular 081918 AP motif3c v2 -- OW Final End Times 022519_2 AP LOOP1 -- OW_PR_FootstepsSand_01 -- Anglerfish_Awake4 -- OW_PR_FootstepsJumpIce_04 -- Fix_Puncture_01 -- Raft Light Impact V2 1 -- Warp_Loop_01_v2 -- Ghost Start Hunt Grunt 1 -- Destruction Debris 4 -- Solanum_IconAppear_V3 -- OW_SP_ActivateComputer_OneShot -- Destruction Impact 8 -- OW_SP_ShipGroan1_v2 -- OW ReelBackdrop 02a 021021 AP -- OW_NM_ComputerRing1 -- OW_PR_FootstepsJumpGlass_04 -- Forest Oneshot - Tree Creak 6 -- OW_GD_HeatLightning_01 -- Raft Heavy Impacts V2 3 -- Solanum_Foley_RockFormStart -- Raft Light Impact V2 5 -- Ghost Grunt 4 -- OW_PR_FootstepsJumpDirt_06 -- OW_PR_FootstepsJumpGrass_03 -- OW_TravelerTheme_whistling -- Raft Heavy Impact 2 -- Nature Oneshot - Distant Deep Creature 1 -- OW_SP_CloseHatch_v2 -- linkingstone_in -- OW_PR_FootstepsSnow_03 -- OW_NM_OrbDeSelect_Energy_02 -- Impact_Light_02 -- Nomai_Stone_Door_End_V2_10 -- Fix_Puncture_07 -- OW_NM_HoleEnterExit -- OW NM Nomai Ruins 081718 AP -- OW_PR_OxygenRefill -- GhostMatter_Splash_v4_05 -- glass_crack_01 -- Ignite_Marshmallow_02 -- Ship_Impact_Medium_Damage_V3_03 -- Forest Oneshot - Animal 4 -- OW_PR_FootstepsIce_02 -- OW_GD_RainOnHelmet -- Spaceship_RattleLoop -- BigBang_WhooshLeadToExplo -- OW_TH_Campfire_loop_01 -- bigbang_cosmicinflation_v2 -- Hotel Oneshot - Heavy Creak 4 -- OW_PR_FootstepsJumpGrass_02 -- Tronworld Ambience 1 -- AnglerFish_Target_v2_07 -- Eye_of_Universe_Ambience_v2_01 -- OW_PR_FootstepsJumpLeaves_04 -- OW_PR_FootstepsJumpSnow_03 -- OW_PR_FootstepsJumpGlass_01 -- OW Traveler Theme 091118 AP FINAL TIME NO PIANO EDIT -- OW ReelBeat 02f 082521 AP -- Metal Door Close Stop -- medkit -- OW_NM_BlackHole_Lp -- Ghost Blow Out Lantern -- OW_PR_MarshmallowEatBurnt_shorter -- Solanum_Foley_IconEnter -- OW_PR_SignalscopeSwitchFrequencies -- Prisoner Pick Up Artifact -- OW_PR_BanjoStrum_3b -- Water Spray Impact 5 -- UI_Advance_Dialog_V6-002_highpass -- Destruction Debris 8 -- OW_PR_FootstepsDirt_06 -- Vision Torch - Step In -- OW_NM_DoorStart_Big_04 -- OW_PR_FootstepsBushRustle_06 -- Hotel Oneshot - Creak 5 -- OW_PR_FootstepsJumpLeaves_01 -- OW_SP_ShipGroan4_v2 -- Jump_Into_Fogsphere_03 -- Dreamworld Forest Ambience 2 -- OW_PR_FootstepsJumpRock_02 -- CrushedByElevator -- Player Gravel Footstep 1 -- House Destruction 4 -- Ghost Begin Stalk Grunt 1 -- flashlightOff -- OW ReelBeat 04b_2 040921 AP -- OW_PR_FootstepsRock_02 -- AshTwinCore_Open_01 -- OW_SP_HeadlightsOn_v2 -- Tower Fall Part 2 -- OW_NM_DoorStart_Big_02 -- Meteor_Impact_01_b -- OW_SP_LandingCamStatic -- OW_PR_FootstepsWood_01 -- gasp_light5 -- OW_PR_FootstepsGrass_03 -- Spark_03 -- Loading Tunnel - Loop -- FootstepsJumpWoodCreak_02 -- OW_Main_Menu -- Lantern Put Down -- OW Secret Library Whispers LP 040821 AP REF MIX -- OW_DB_Ambience -- Vision Torch Light Rays - On -- Hotel Oneshot - Creak 1 -- Dreamworld Nature Ambience 4 -- OW_PR_ThrustRotationalUnderwater_04 -- OW_PR_FootstepsJumpGrass_06 -- Nomai_Stone_Door_End_Big_V2_09 -- Ship_Impact_No_Damage_V3_01 -- Raft Movement Stop 3 -- Destruction Impact 9 -- Recorder_Start_Button -- AnglerFish_Target_v2_14 -- Ghost Begin Chase Grunt 2 -- Hotel Oneshot - Creak 6 -- Fragment_Break -- Tronworld Exit 2 -- Ghost Walk Footstep Forest 2 -- Incinerate_v3_01 -- Light Sensor Fade Out 3 -- OW_TravelerTheme_flute -- OW_PR_FootstepsLeaves_02 -- OW_PR_FootstepsLeaves_01 -- Fix_Puncture_05 -- Ghost Walk Footstep Wood_v2 3 -- OW_PR_FootstepsJumpSand_01 -- Sarcophagus Strain 2 -- OW_PR_HitWallUnderwater4 -- OW_PR_FootstepsRock_03 -- Loading Tunnel - Unload -- OW_PR_FootstepsJumpNomai_03 -- OW_PR_FootstepsDirt_07 -- OW_PR_FootstepsSnow_04 -- Wood Door Close Stop -- OW_PR_FootstepsJumpIce_02 -- OW ReelBeat 04a 031521 AP -- Raft Light Impact V2 2 -- Meteor_Impact_02_b -- JellyFish_Shock_02 -- Metal Door Open Start -- OW_GD_UnderwaterCurrent -- OW_GD_HeatLightning_06 -- nomai_textbranchout_noenergy2 -- asphyxiation_nosuit_secondhalf_version3 -- Artifact Focus -- Ice_Cave_Amb_loop_v3_01 -- Forest Oneshot - Tree Creak 3 -- OW NomaiRuinsRegular 081918 AP motif4c -- Dreamworld Lights Out Ambience 4 -- Projector Next Slide 2 -- BeaconIdea4 -- Destruction Impact 1 -- OW_PR_FootstepsNomai_06 -- OW_NM_FlickeryGravityCrystalAmbience -- OW Demonic Vocal Sting 082321 AP -- OW Quantum Lightning 091118 AP 08 -- OW_NM_SadTheme_older -- Nature Oneshot - Distant Creature 2 - less reverb -- FootstepsJumpWoodCreak_03 -- OW_PR_FootstepsJumpSand_02 -- Player Gravel Footstep 8 -- OW_PR_FootstepsSnow_06 -- gasp_traumatic3_lessmale -- Real World Dam Break Water Oneshot -- Repair_Loop -- OW_TH_FlagFlapping_loop.\_01 -- Ship_Impact_Light_Damage_V3_02 -- Raft Socket -- Jump_Into_TinyGalaxy_v2_01 -- OW NomaiRuinsRegular 081918 AP motif7c -- gasp_normal13_lessmale -- Sandfall_Inside_Loop_01 -- Solanum_RocksForm -- Fix_Puncture_06 -- OW Dreamworld Ruins Story Beats 071621 AP 1h -- Sarcophagus Open 2 -- fogsphere_pulse2 -- Elevator Rattle Loop 3 -- IllusoryWall_Alex -- OW_GD_HeatLightning_04 -- Nomai_Stone_Door_End_Big_V2_14 -- OW_PR_FootstepsJumpMetal_01 -- Vine_Crash_V3_03_LowPassDelay -- OW_PR_BanjoStrum_2b -- OW_PR_FootstepsGlass_05 -- OW_PR_FootstepsLeaves_07 -- OW_NM_DoorStart_01 -- OW_PR_FootstepsGrass_05 -- OW_PR_FootstepsJumpIce_01 -- OW_PR_ThrustRotationalUnderwater_01 -- Anglerfish_Chase_Breathing -- OW_PR_FootstepsRock_04 -- Metal Door Close Start -- Gear Rotate 1 -- Airlock Loop -- Solanum_Foley_RockFormEnd -- mallowpuff3 -- OW_PR_FootstepsSand_05 -- OW_PR_FootstepsJumpRock_01 -- Artifact Unfocus -- OW Eye Of The Universe 082818_2 AP -- OW_PR_FootstepsJumpRock_03 -- galaxy_zoomout2 -- OW_GD_IslandFalling_v2_loop -- Projector Previous Slide 2 -- Ignite_CampFire_04 -- SpaceshipAlarm2_3Iterations -- Ghost Individual Death 3 -- OW_PR_FootstepsJumpNomai_01 -- OW_PR_FootstepsJumpSnow_01 -- Forest Oneshot - Animal 2 -- OW_PR_FootstepsJumpDirt_01 -- Dreamworld Tower Fall Part 1 -- Ship_Impact_Medium_Damage_V3_05 -- OW_NM_ComputerRing3 -- OW_PR_SuitOn -- Airlock Pressurize -- OW_PR_FootstepsBushRustle_01 -- OW_PR_FootstepsNomai_02 -- Ship_Impact_Medium_Damage_V3_04 -- OW_NM_VesselDiscovery -- PlayerSubmerge -- Player Gravel Footstep 5 -- OW_EndTimes -- HGT_SandColumn_Ship -- OW ReelBeat 02c 021021 AP -- Spark_09 -- OW_PR_FootstepsSand_02 -- Damage_Light_05 -- OW_NM_ComputerRingFall2 -- gasp_traumatic7_lessmale -- Ghost Investigation Grunt -- Dream World Alarm Bell Oneshot 2 -- rockingchair2 -- OW_PR_FootstepsJumpDirt_04 -- Projector Next Slide -- OW_PR_FootstepsSand_08 -- OW_NM_WHAmbience2_v2 -- drowning_secondhalf2 -- Ghost Walk Footstep Forest 1 -- Prisoner Cloth Foley 3 -- OW_PR_FootstepsGlass_03 -- Vision Torch Scanning - Loop -- Raft Medium Impact V2 2 -- Hotel Oneshot - Heavy Thud 3 -- Destruction Impact - Large 4 -- OW_PR_FootstepsJumpLeaves_03 -- OW_PR_FootstepsJumpSand_03 -- OW Dreamworld Ruins SILENCE 02 -- OW_PR_FootstepsWood_06 -- ModelRocket_LightImpact -- shiplog_scanningloop -- OW Ghost Ambiences v2 011221 AP low LP -- OW NomaiRuinsRegular 081918 AP motif2c -- glass_crack_03 -- Fix_Puncture_08 -- OW_PR_FootstepsSnow_01 -- OW_PR_FootstepsDirt_01 -- asphyxiation_nosuit_firsthalf1 -- OW_NM_DoorSlide_Big_LP_01 -- OW_SUN_SupernovaWall -- OW_NM_DoorAirLockAirPourOut_03 -- OW_PR_ThrustUnderwater -- Solar Sail Stop -- OW_TH_Waterwheel_loop -- Forest Oneshot - Tree Creak 1 -- OW ReelBackdrop 03a 050321 LOOP -- Platform_Break_V2_04 -- FireBall_01 -- OW ReelBackdrop 01a 022521 AP -- Dreamworld Lights Out Ambience 1 -- Nomai_Stone_Door_End_Big_V2_11 -- Spark_07 -- OW_SP_ThrustTranslationalUnderwater -- Dream World Water Ambience - Creek 1 -- Ghost Begin Stalk Grunt 2 -- Comet_Purr -- JellyFish_Shock_04 -- OW_PR_FootstepsWood_08 -- Raft Reeling Loop -- shiplog_switchmode_forward -- Station Light Flicker - Dreamworld -- Lantern Wake Up Light 3 -- flashlightOn -- Dreamworld Base Ambience 1 -- Ship_Impact_Heavy_Damage_V3_09 -- Crushed_To_Death_V2_01 -- ow_kazoo_theme -- JetPack_NotificationBeep -- Ghost Run Footstep Wood_v2 1 -- OW_PR_FootstepsJumpNomai_05 -- OW_NM_DataStream_v2 -- UI_Tab_v2_02 -- OW_PR_ProbeTakePicture -- OW_NM_GravityCannonAmbience -- OW NM Flashback 082818 AP loop -- OW_SP_LandingPadSoft4 -- OW_PR_FootstepsGlass_07 -- WarpCore_Insert_V3_01 -- OW_NM_TractorBeamLP -- ShipRepair_Finish -- Ghost Begin Chase Grunt 1 -- Destruction Impact 2 -- OW_PR_FootstepsLeaves_08 -- Recorder_Stop_Button -- OW_PR_FootstepsLeaves_04 -- OW_PR_Jump1 -- Jump_Into_TinyGalaxy_v2_04 -- OW_GD_Tornado_v2_04 -- OW_PR_FootstepsJumpDirt_02 -- OW_SP_ConsoleReadoutStart -- OW_NM_EscapePodHatch -- OW_PR_FootstepsJumpNomai_02 -- Light Sensor Fade In 1 -- Light Sensor Fade In 2 -- Hotel Oneshot - Creak 9 -- CampfireTune_All_Reverb -- Recording_Loop_03 -- PartyHouseWhistle_Confident -- mallowpuff4 -- OW_NM_WhiteHoleAmbienceL -- Station Shudder -- drowning_firsthalf1 -- UI_Exit_Dialog_V6-002_highpass -- Dream World Dam Break -- Dreamfire Extinguish 1 -- MediumSplash -- Vision Torch - First Slide Appears -- Footstep1 -- OW_TravelerTheme_drums -- Artifact Conceal -- HGT_Ambience_Cave_Small -- HGT_Ambience_Cave_Big -- OW_TH_Waterfall_loop_01 -- OW Discovery 083021_2 AP darker shorter -- Secret Passageway Open Loop 2 -- Hotel Oneshot - Creak 4 -- supernova_explosion_deepnuclear2 -- Ghost Shout 7 -- OW NM Flashback 081718 AP slam -- Airlock Close -- OW_TH_FlagFlapping_loop.\_02 -- OW_SP_RefuelJetpack_v2_short -- Ship_Impact_No_Damage_V3_03 -- Raft Medium Impact V2 4 -- Anglerfish_Awake3 -- Wood Door Open Start -- OW_TH_FlagFlapping_loop -- Slide Reel Pickup 2 -- Tronworld Ambience 2 Alex Hack -- Ghost Run Footstep Wood_v2 5 -- Ignite_CampFire_03 -- Single Ghost Scream 14 -- Raft Start Reeling -- OW_PR_FootstepsGrass_08 -- Tronworld Enter 2 -- OW_PR_ProbeUnderwaterLaunch -- OW_GD_IslandCrashingInWater_v2 -- Grapple Totem Zoom In -- OW ReelBeat 02a 021021 AP -- Nomai_Stone_Door_End_V2_08 -- OW_PR_FootstepsJumpGlass_02 -- OW_NM_DoorStart_02 -- Destruction Impact - Large 3 -- OW_SP_SignalscopeSlideV2 -- OW NomaiRuinsRegular 081918 AP motif6c -- Wood Door Close Start 3 Alex -- Destruction Impact - Large 2 -- Nomai_Stone_Door_End_Big_V2_01 -- OW_NM_ComputerAmbienceLP -- Anglerfish_Awake2 -- OW_TH_Insects_loop_03 -- OW_PR_SignalscopeActivate -- OW_NM_ComputerRingFall1 -- OW_PR_FootstepsDirt_02 -- OW_NM_ShuttleLight -- Single Ghost Scream 1 -- Ghost Identify Fail -- OW_SP_ShipGroan5_v2 -- Cloaking Field Exit -- OW_PR_FootstepsNomai_01 -- OW Dreamworld Ruins 072021 AP 02e -- Forest Oneshot - Tree Creak 2 -- fogsphere_pulse1 -- OW_PR_PullOutStick -- OW_PR_LockOn -- Nomai_Stone_Door_End_Big_V2_07 -- OW_PR_FootstepsJumpSand_06 -- InstantDeath2_Long_Ringing -- Light Sensor Door Stop 2 -- Light Sensor Door Loop 2 -- OW_TH_GeyserEnd_02 -- pickaxe_01 -- OW_PR_FootstepsWaterWade_03 -- RockPile_Fall_03 -- OW_PR_ThrustAfterburn_v2_01 -- Light Sensor Fade Out 2 -- Light Sensor Fade In 3 -- OW Finally Set Free 072021_2 AP -- Ghost Blow Out Lantern Charge -- Wood Door Loop -- BigBang_Explo -- TH_Geyser_Loop_v3 -- Water Spray Impact 8 -- OW_TH_FlagFlapping_loop.\_03 -- OW_PR_FootstepsJumpLeaves_02 -- OW_PR_FootstepsIceSlide_Lp_01 -- Dreamworld Lights Out Ambience 3 -- knife_scrape_01 -- OW OBSERVATORY 011317 AP -- Footstep_Run5 -- Light Sensor Door Open 2 -- Jetpack_O2_loop_01 -- OW_PR_FootstepsJumpWood_04 -- OW_SP_BuckleUp -- Probe_SnapShot_02 -- Pickup_Ceramic_01 -- OW_PR_FootstepsWood_03 -- Destruction Debris 3 -- OW_PR_SignalscopeDeactivate -- OW_PR_OxygenLeakingFromSuit_loop -- Probe_SnapShot_01 -- Dreamworld Ghost Hotel Ambience 2 -- Slide Reel Put Down 2 -- Nomai_Stone_Door_End_V2_07 -- OW_SP_ProbeLauncherRotation_v2 -- OW_PR_MarshmallowEatUnburnt_noMmm_v3 -- SystemBackOnline -- Ghost Idle Search 1 -- Ship_Impact_Light_Damage_V3_03 -- OW Dreamworld Ruins Story Beats 071621 AP 1i -- OW_PR_FootstepsGrass_02 -- OW_NM_DoorSlide_LP_02 -- Ringworld Cave Ambience -- Fix_Puncture_02 -- OW_PR_FootstepsWaterWade_08 -- OW_TH_GeyserStart_01 -- OW_TH_Insects_loop_01 -- OW ReelBeat 04d_2 040921 AP -- OW_TH_ProjectorStop -- Prisoner Cloth Foley 6 -- Dream World Alarm Bell Oneshot 3 -- shiplog_selectplanet2 -- Nature Oneshot - Distant Creature 1 - less reverb -- OW_PR_FootstepsDirt_08 -- Spark_04 -- OW_GD_HeatLightning_02 -- OW Secret Loop 090121 AP muted -- Creature Voice Test 1 Short -- General Destruction 4 -- House Destruction 1 -- OW_PR_FootstepsSnow_02 -- Huge Splash 2 -- Player Gravel Footstep 4 -- Ghost Grab Player 1 -- shiplog_switchmode_back -- OW_PR_FootstepsJumpWood_03 -- OW_PR_FootstepsJumpMetal_05 -- OW_SP_AutopilotEngaged 1 -- OW_NM_DoorAirlockOpen_03 -- OW Dreamworld Ruins 072021 AP 02b -- Ghost Investiagation Grunt 2 -- Wood Door Close Start 2 -- Real World Alarm Bell Oneshot 2 -- OW Fabric SFX 102119 AP screen shatter SHORT -- OW_NM_Ruins_ambience_scary_loop -- Raft Heavy Impact 1 -- OW Whispers 041321_2 AP LP -- Ghost Run Footstep Forest 4 -- Vine_Crash_V3_01_LowPassDelay -- Solanum_Foley_HandLower -- OW_PR_FootstepsSand_07 -- Grapple Totem Zoom Out Louder -- Ship_Impact_Heavy_Damage_V3_07 -- OW_PR_FootstepsIce_01 -- OW Ghost Ambiences v2 011221 AP pad LP -- Raft Movement Stop -- OW_TH_Museum -- gasp_normal12_lessmale -- OW_PR_FootstepsJumpRock_05 -- OW_SP_ThrustRotationalUnderwater_02 -- Pool_Exit_v3 -- Flashlight_Malfunction_02 -- OW NomaiRuinsRegular 081918 AP motif1c -- Nomai_Stone_Door_End_V2_05 -- OW_PR_FootstepsLeaves_05 -- Nomai_Stone_Door_End_V2_09 -- asphyxiation_suit_secondhalf1 -- Spark_08 -- OW Aquatic Exploration 050318 AP LOOP -- OW_TH_GeyserEnd_01 -- UI_Navigate_03 -- OW ReelBeat 02b 021021 AP -- Player_Impact_Damage_Light_02 -- OW_PR_FootstepsWood_02 -- Jump_Into_TinyGalaxy_v2_02 -- OW_PR_ThrustRotationalUnderwater_05 -- Atmosphere_High_Suit -- OW_SP_MetalCreak_04 -- OW Prisoner Reveal 063021 AP -- Ghost Grunt 1 -- OW_PR_FootstepsJumpDirt_03 -- OW Reelbeat 03c 061721 AP -- Nomai_Stone_Door_End_Big_V2_10 -- Damage_Light_01 -- PutDown_Rock_01 -- OW_TH_ModelRocketCrashing -- OW ReelBeat 03b 032521 AP -- OW END OF GAME 021818 AP -- Raft Movement Start 3 -- Impact_Light_03 -- OW_NM_Tech_Advanced -- Ghost Walk Footstep Wood_v2 4 -- OW_PR_FootstepsJumpWood_05 -- OW_PR_FootstepsMetal_02 -- FootstepsJumpWoodCreak_01 -- OW Timber Hearth 032719 AP v2 -- Hotel Oneshot - Heavy Creak 3 -- shiplog_highlight -- OW_GD_Tornado_v2_03 -- RotationalThruster02 -- OW Quantum Lightning 091118 AP 06 -- JetPack_NotificationBeep_Fast -- SmallSplash -- Ghost Run Footstep Forest 3 -- Nomai_Stone_Door_End_Big_V2_04 -- OW Prisoner Elevator 061121_5 AP loop -- Tower Fall Part 1 -- OW_PR_FootstepsMetal_03 -- OW_PR_FootstepsRock_01 -- Ignite_Marshmallow_01 -- Ignite_CampFire_02 -- Ghost Walk Footstep Wood_v2 5 -- OW_GD_AmbienceCave -- Ship_Impact_Heavy_Damage_V3_11 -- Raft Release -- elevatorstop -- Hotel Oneshot - Creak 2 -- Station Light Flicker -- Forest Oneshot - Tree Creak 7 -- OW_GD_HeatLightning_03 -- Nomai_Stone_Door_End_Big_V2_08 -- OW_TH_AmbienceHighAltitude -- Water Spray Impact 3 -- Ghost Grunt 2_SmoothFade -- linkingstone_out -- Ghost Shout 6 -- Ghost Individual Death 4 -- shiplog_highlight2 -- OW_PR_FootstepsMetal_04 -- OW Morning Cello 101718_2 -- Spark_11 -- fogsphere_jump2_delayed -- Nomai_Stone_Door_End_V2_04 -- OW_SP_ElectricalDamageLP -- OW_PR_FootstepsGlass_02 -- Ghost Run Footstep Forest 6 -- OW_NM_CenterClampsRemoving -- OW_SP_ThrustRotationalUnderwater_03 -- OW_NM_InsertScroll -- GhostMatter_Splash_v4_02 -- Airlock Open -- OW_PR_TranslatorTranslateNew -- Ship_Impact_Heavy_Damage_V3_10 -- House Destruction 2 -- shiplog_newentry3_softer -- OW_TravelerTheme_piano -- Stilts Destruction 3 -- OW_PR_LockOff -- OW_TH_ModelRocketThrustTranslational_01 -- Hotel Oneshot - Creak 8 -- Dreamworld Candle Lighting Test Variation 6 -- Stilts Destruction 4 -- OW_SUN_BurnPlanet -- Real World Dam Crack Water Loop -- OW Final End Times 022519_2 AP LOOP2 -- OxygenRefill_Short -- OW ReelBeat 03a 031521 AP -- OW NomaiRuinsRegular 081918 AP motif5c v2 -- StoryReel5Short 063021_3 AP -- OW_GD_AmbienceOcean -- OW_TH_BridgeCreaking_loop -- OW Traveler Theme 021821 AP FINAL TIME NO PIANO ADD PRISONER -- OW_SP_ShipAmbiance_01 -- Prisoner Grunt 2 -- OW_NM_ComputerRingFall3 -- OW_NM_DoorStart_04 -- Ghost Neck Snap -- Nomai_Warp_01 -- General Destruction 2 -- pickaxe_02 -- OW_PR_FootstepsSnow_07 -- Lava_Splash_02 -- OW_PR_FootstepsGlass_06 -- Anglerfish_Awake -- OW_PR_ProbeRetrieval -- OW_PR_FootstepsJumpSnow_04 -- Lantern Wake Up Light 2 -- Secret Passageway Open Stop 2 -- Lantern Shorting Out 2 -- OW_PR_BanjoStrum_1b -- OW_PR_FootstepsSnow_08 -- Air Rushing Out Into Space -- OW_PR_FootstepsJumpGlass_03 -- OW_PR_ProbeInAirSound -- shiplog_movebetweenplanets -- OW_PR_BanjoStrum_4b -- Raft Stop Reeling -- OW Traveler Theme 091118 AP FINAL TIME WITH PIANO EDIT -- OW_PR_FootstepsMetal_08 -- OW ReelBeat 04a_2 040921 AP -- OW_SP_ShipExploding -- OW_PR_FootstepsJumpMetal_02 -- OW_TH_ModelRocketThrustRotational_04 -- JellyFish_Shock_03 -- OW No-Eye Ruins 121120_2 AP LP -- OW_GD_HeatLightning_05 -- OW_NM_GravityCrystalAmbience_Louder -- OW_GD_HeatLightning_07 -- Solar Sail Loop 2 -- OW_PR_FootstepsBushRustle_02 -- CityLights_Off_01 -- RotationalThruster01 -- OW_NM_BHEnterItem_v2 -- OW_PR_FootstepsBushRustle_09 -- Vision Torch - Vision Dissolves -- OW_PR_FootstepsJumpMetal_04 -- Lantern Remove 2 -- Player_Impact_Damage_Light_01 -- StoryReel5Full 062821_4 AP -- OW_PR_FootstepsWaterWade_07 -- OW_NM_SkypeLP -- OW_SP_ShipGroan2_v2 -- Volcano_Ambience_Loop_V2 -- AnglerFish_Chomp_Loop_v2 -- Destruction Debris 2 -- OW_PR_LandInWater2 -- OW_PR_FootstepsIce_05 -- Footstep_Run1 -- Anglerfish_ChompBite_01 -- Destruction Debris 1 -- Ghost Run Footstep Forest 1 -- AnglerFish_Target_v2_02 -- Signalscope_Zoom_Loop -- BH_Ambience_Below_Crust -- fogsphere_pulse3 -- OW_GD_HeatLightning_08 -- AshTwinCore_Close_01 -- Airlock Depressurize -- OW_TH_ModelRocketThrustRotational_03 -- OW_NM_ComputerRing2 -- RockPile_Fall_05 -- Vision Torch Fire - Loop -- OW Farewell 061721 AP -- Hologram_Enter_v2_01 -- OW_PR_ThrustRotationalUnderwater_03 -- Forest Oneshot - Tree Creak 8 -- OW_PR_LandInWater3 -- Hotel Oneshot - Creak 3 -- Hotel Oneshot - Heavy Thud 1 -- Distant Ghost Cacophony 1 -- Footstep_Run2 -- OW_TH_ProjectorRun_loop -- OW_PR_FootstepsJumpGrass_04 -- Destruction Impact - Large 5 -- FootstepsWoodCreak_03 -- OW_PR_FootstepsIce_03 -- Solanum_Foley_HandRaise -- OW_NM_DoorStart_Big_03 -- Candle Extinguishing Test Variation 6 -- Ignite_CampFire_01 -- Nature Oneshot - Distant Creature 3 - less reverb -- Real World Water Ambience - Slow River -- Ghost Grunt 5 -- IceMelt_v2_LowPass -- OW_NM_GravityCannonDeactivated -- OW Ghost Sequence 011121 AP LOW SUSPENSE LP -- Anglerfish_Sleeping -- Real World Water Ambience - Slow River 2 -- OW_PR_FootstepsWaterWade_02 -- Ghost Walk Footstep Forest 3 -- Spark_05 -- OW No-Eye Ruins 082121 AP stinger -- Nature Oneshot - Distant Deep Creature 3 -- OW_NM_SunStation -- Projector Totem Extinguish 1 -- Dreamfire Crackling Loop 3 -- OW Ghost Ambiences 012921_2 AP slam -- Dreamfire Explosion -- Dream World Water Ambience - Creek 8 -- OW_PR_FootstepsSnow_05 -- OW_PR_FootstepsIce_04 -- Dream World Water Ambience - Creek 5 -- Ghost Run Footstep Forest 2 -- OW_NM_DoorStart_08 -- Outer Wilds Party House v8 050321_2 AP traveler drone -- Hotel Oneshot - Heavy Creak 1 -- Secret Passageway Open Start 2 -- FootstepsWoodCreak_01 -- Ghost Grunt 8 -- OW_PR_FootstepsMetal_06 -- Probe_Attach_v3_02 -- OW_PR_LandInWater1 -- FootstepsWoodCreak_06 -- OW_PR_FootstepsBushRustle_04 -- Projector Totem Blow -- OW_PR_FootstepsWaterWade_01 -- Raft Movement Loop -- OW_SP_ThrustRotationalUnderwater_01 -- OW_PR_FallingIntoLavaBeep_loop -- Ship_Impact_Light_Damage_V3_01 -- Ship_Impact_Medium_Damage_V3_02 -- Ghost Walk Footstep Wood_v2 1 -- Nomai_Stone_Door_End_Big_V2_02 -- OW ReelBeat 04c_2 040921 AP -- Raft Push -- OW_PR_FootstepsJumpIce_03 -- Nomai_Stone_Door_End_Big_V2_05 -- Destruction Impact 5 -- HGT_SandFallSmall_Inside -- OW Quantum Lightning 091118 AP 01 -- OW_PR_OxygenLeakingFromSuit_in -- OW_PR_HelmetOn -- OW_SP_AutopilotDisengaged 1 -- PutDown_Ceramic_01 -- OW_PR_FootstepsMetal_07 -- Water Spray Impact 7 -- Dream World Alarm Bell Oneshot 4 -- CityLights_On_01 -- rockingchair3 -- fogsphere_pulse5 -- Nomai_ShipPowerOn_V2_01 -- OW_GD_IslandSuckedInTornado -- OW_NM_DoorStart_05 -- Probe_Attach_v3_01 -- OW_PR_ThrustRotationalUnderwater_02 -- Outer Wilds Party House v8 050321_3 AP traveler -- Artifact Put Down -- OW ReelBeat 01b 021021 AP -- stoppedasphyxiating_suit2 -- FootstepsJumpWoodCreak_04 -- Destruction Debris 6 -- Nomai_Warp_03_Shorter -- mallowpuff1 -- OW ReelBeat 02d 021021 AP -- OW_TravelerTheme_harmonica -- shiplog_misc4 -- Projector Totem Extinguish 3 -- OW ReelBackdrop 02b 021021 AP -- OW_PR_FootstepsDirt_03 -- Lava_Splash_01 -- Engine_Start_V2 -- Solar Sail Start -- OW_PR_ThrustTranslational_v2_01 -- Light Sensor Fade Out 1 -- Prisoner Cloth Foley 4 -- OW Quantum Lightning 091118 AP 02 -- OW_NM_RemoveScroll -- asphyxiation_suit_firsthalf2 -- OW_TH_AmbienceNightInCanyons -- Footstep2 -- OW ReelBackdrop 03b LOOP 031521 AP -- OW_SP_ThrustRotationalUnderwater_04 -- OW_PR_FootstepsNomai_08 -- OW_PR_FootstepsNomai_03 -- OW ReelBeat 03d 061121 AP -- OW_PR_FootstepsJumpSand_04 -- RotationalThruster03 -- Stilts Destruction 5 -- Raft Run Aground -- OW Space Station 081420_2 AP -- OW_PR_FootstepsWaterWade_06 -- Spark_02 -- Cloaking Field Entry -- OW_NM_DataWormhole -- OW_QuantumSignal -- General Destruction 3 -- OW New Raft Music 082321_4 AP quiet -- OW_SP_Unbuckle -- Real World Water Ambience - Calm 2 -- Prisoner Grunt 3 -- OW_NM_OrbMoveGlass_lp_01 -- Prisoner Cloth Foley 7 -- OW_PR_FootstepsRock_05 -- OW Traveler Theme 021821 AP FINAL TIME WITH PIANO ADD PRISONER -- OW Quantum Lightning 091118 AP 03 -- OW_TH_ModelRocketThrustRotational_02 -- OW_PR_HitWallUnderwater3 -- Flashlight_Malfunction_03 -- OW NM Flashback 082818 loop overlay AP -- supernova_corecollapse_10sec_fadeOut -- OW_PR_FootstepsWood_05 -- rockingchair1 -- Power_Failure_v2_02 -- OW_PR_FootstepsMetal_05 -- Stilts Destruction 2 -- Dreamworld Tower Tilt -- OW New Texture 082921 AP loop -- Lantern Insert 3 -- OW_PR_FootstepsNomai_07 -- OW_PR_FootstepsJumpWood_06 -- Pool_Enter_v3_Fade -- Raft Movement Start -- OW_PR_FootstepsNomai_05 -- OW_PR_HardSplash -- Destruction Debris 5 -- Dreamworld Candle Lighting Test Variation 2 -- OW NM Flashback 082818_2 AP stinger delayed -- Ghost Shout 4 -- Nomai_Stone_Door_End_Big_V2_06 -- Tower Tilt -- OW_NM_DoorStart_Big_06 -- OW_PR_FootstepsLeaves_03 -- Ghost Run Footstep Wood_v2 3 -- OW_NM_BHExitItem_v2 -- Ghost Idle Search 5 -- Forest Oneshot - Animal 1 -- OW Dreamworld Ruins 072021 AP 02d -- OW_PR_FootstepsJumpSnow_02 -- Platform_Break_V2_01 -- OW Party House 092820 AP short loop -- OW_PR_FootstepsRock_06 -- OW_SP_ThrustTranslational -- Footstep6 -- OW_PR_FootstepsWaterWade_05 -- Ghost Start Hunt Grunt 2 -- OW Dreamworld Ruins 072021 AP 02f -- Nomai_Stone_Door_End_Big_V2_12 -- Jump_Into_TinyGalaxy_v2_03 -- Footstep_Run3 -- Negative1 -- OW_TravelerTheme_banjo -- SandColumnEnd_v2 -- OW_PR_FootstepsJumpSand_05 -- Dreamworld Lights Out Ambience 2 -- OW Blair Witch Project 082921_3 AP darker mix loop -- Fig_Backer_Sat_Audio_V3 -- OW_PR_FootstepsGlass_01 -- Light Sensor Fade Out 4 -- Projector Totem Light 1 -- Player Gravel Footstep 6 -- OW_TH_GeyserStart_03 -- Slide Reel Remove 3 -- Ship_Impact_Medium_Damage_V3_06 -- OW Quantum Lightning 091118 AP 05 -- OW_GD_Tornado_v2_01 -- OW_SP_ActivateComputerLP -- Footstep_Run6 -- Spark_13 -- Vine_Crash_V3_02_LowPassDelay -- OW Slideshow BURNT LOOP small 031521_2 AP -- Raft Heavy Impact 4 -- Light Sensor Door Loop - Door Sensor Sliding -- Sarcophagus Strain 3 -- Loading Tunnel - Load -- elevatorstart -- Nomai_Stone_Door_End_V2_02 -- OW_GD_Tornado_v2_02 -- OW_NM_DoorAirLockAirPourOut_01 -- OW_TravelerTheme_newtraveler 061021 AP -- OW ReelBackdrop 04a_3 041321 AP LP -- OW_PR_FootstepsJumpRock_04 -- Damage_Heavy_04 -- Raft Movement Stop 2 -- OW_SP_AnalogClick2_v2 -- Nomai_Stone_Door_End_V2_01 -- OW_PR_FootstepsRock_07 -- Raft Light Impact V2 4 -- Marshmallow_Replace_01 -- Footstep5 -- Destruction Impact 3 -- Helmet_Glass_Crack_08 -- Ghost Run Footstep Wood_v2 6 -- OW End Credits 022019_3 AP -- Raft Heavy Impacts V2 2 -- Nomai_Stone_Door_End_Big_V2_13 -- OW_NM_GravityCannonActivated -- Outer Wilds Party House v8 050321_2 AP Bass -- Ringworld Muffled Indoor Ambience -- Ghost Run Footstep Wood_v2 2 -- OW_GD_AmbienceUndewater -- Forge_Loop_V3_03 -- OW_PR_CampfireAmbience -- OW_PR_FootstepsRock_08 -- Platform_Break_V2_02 -- OW_PR_FootstepsJumpWood_02 -- OW Eye Temple 121820_2 AP LP -- OW_GD_WavesAgainstBeach -- OW_PR_ThrowProbe -- OW_NM_DoorStart_07 -- OW_PR_FootstepsSand_04 -- Lantern Pickup -- Real World Water Ambience - Rapids 2 -- OW_PR_FootstepsWood_04 -- OW_NM_TractorBeamPowerUp -- OW New Stinger 082921 AP -- OW_PR_FootstepsGrass_07 -- Hotel Oneshot - Creak 7 -- Player_On_Fire_Loop -- OW_TH_UnderwaterRushing -- GhostMatter_Splash_v4_01 -- OW_SP_ThrustRotationalUnderwater_06 -- OW Fabric SFX 102119 AP rip FADE OUT -- OW Dreamworld Ruins 072021 AP 02a -- Spark_06 -- OW_SP_SignalscopeChunkV2 -- Player Gravel Footstep 2 -- OW_PR_FootstepsBushRustle_07 -- Hologram_Exit_v2_01 -- Metal Door Open Stop -- OW_PR_FootstepsJumpWood_01 -- OW_PR_FootstepsWaterWade_04 -- Nature Oneshot - Distant Deep Creature 2 -- Stilts Destruction 1 -- OW NM Flashback 082818 AP overlay1 -- drowning_secondhalf1 -- Gear Rotate Locked_Short -- Prisoner Cloth Foley 5 -- shiplog_deselectplanet -- Orb_End_v3_01 -- Atmosphere_High_Ship -- Solar Sail Start 2 -- knife_scrape_02 -- OW_TH_GeyserEnd_03 -- Meteor_Impact_03_b -- Destruction Impact 6 -- JellyFish_Shock_01 -- Light Sensor Loop -- Candle Extinguishing Test Variation 4 -- Vision Torch Light Rays - Off -- OW_NM_DoorSlide_Big_LP_05 -- OW_PR_FootstepsDirt_05 -- Sand_Column_Start_v2_03 -- Water Spray Impact 6 -- OW_NM_DoorStart_Big_07 -- OW_SP_ShipGroan3_v2 -- Heat_Damage_Loop_01 -- OW_SP_LandingCamDeactivated 1 -- breathing_lowO2_6 -- OW_PR_OxygenLeakingFromSuit_out -- LogUpdated_001 -- Vine_Crash_V3_04_LowPassDelay -- Destruction Debris 7 -- Hotel Oneshot - Heavy Creak 2 -- OW_PR_HelmetOff -- OW_PR_FootstepsGrass_04 -- Forest Oneshot - Animal 3 -- OW Discovery 083021_2 AP shorter -- Slide Reel Insert 3 -- OW_NM_BHEnterExitPlayer_v2 -- Ship_Impact_Light_Damage_V3_05 -- OW_SP_OpenHatch_NoBeep -- OW_SP_ThrustRotationalUnderwater_05 -- ShipSubmerge -- Artifact Fire Loop -- OW_DarkBramble_loop -- OW_PR_FootstepsBushRustle_08 -- OW NM Nomai City 081718 AP LOOP -- Solar Sail Stop 2 -- Destruction Impact - Large 1 -- OW Dream Rule LP 032421 AP normal -- Solar Sail Loop -- OW_TH_GeyserStart_02 -- Ship_Impact_No_Damage_V3_05 -- OW_PR_FootstepsIce_06 -- Outer Wilds Party House v8 050321_2 AP vocals -- asphyxiation_suit_secondhalf2 -- Affirmative1 -- Spark_12 -- OW_SP_ConsoleReadoutLP -- OW ReelBackdrop 03c 042621 AP LP -- gasp_light9 -- Nomai_Stone_Door_End_V2_03 -- OW_PR_FootstepsJumpNomai_06 -- OW_PR_FootstepsGlass_04 -- OW_PR_FootstepsDirt_04 -- Destruction Debris 9 -- OW_PR_FootstepsIce_08 -- OW_PR_SuitOff -- Artifact Pickup -- OW_SUN_Ambience_v4 -- JellyFish_Shock_05 -- OW_TH_Underwater -- Station Shudder - Dreamworld -- Ghost Walk Footstep Forest 5 -- OW_TH_ProjectorActivate -- asphyxiation_suit_firsthalf1 -- OW_PR_SignalscopeZoomIn -- HGT_Ambience_Surface -- FootstepsWoodCreak_08 -- GhostMatter_Splash_v4_03 -- UI_Tab_v2_05 -- Raft Medium Impact V2 3 -- OW_NM_TractorBeamPowerDown -- OW_Travel_Theme_Remaster -- Big_Galaxy_Burn_v2_01 -- OW_TH_Insects_loop_02 -- Raft Heavy Impact 3 -- Raft Movement Start 2 -- OW Quantum Lightning 091118 AP 04 -- OW_TH_FlagFlapping_loop.\_04 -- OW_TH_ModelRocketThrustTranslational_02 -- knife_scrape_03 -- Incinerate_v3_02 -- Light Sensor Rotate -- OW_NM_EscapePodDistressSignal -- MapZoomOut_Tone -- OW_NM_DoorStart_Big_05 -- Player Gravel Footstep 7 -- Ghost Walk Footstep Wood_v2 2 -- Ghost Run Footstep Forest 5 -- Ghost Walk Footstep Forest 4 -- OW_PR_HitWallUnderwater2 -- OW NM Flashback 082818_2 AP stinger -- OW_PR_FootstepsJumpGrass_05 -- Fix_Puncture_04 -- Ghost Idle Search 3 +- Hotel Oneshot - Heavy Thud 4 +- Tool_Put_Away_01 +- OW Quantum Lightning 091118 AP 07 +- OW_GD_ElectricBarrier_Idle_Loop +- Nomai_Stone_Door_End_V2_11 +- General Destruction 1 +- Dream Rule 02 backdrop loop 072321_2 AP +- amb_observatory +- Dream World Water Ambience - Creek 3 +- Pickup_Rock_01 +- gasp_traumatic4_lessmale +- Ship_Impact_Light_Damage_V3_06 +- BlackHole_02 +- OW_GD_WavesAgainstRock +- OW_TH_AmbienceInCanyons +- OW_PR_FootstepsBushRustle_03 +- OW_PR_ActivateProbeMode +- Ghost Walk Footstep Wood_v2 6 +- rockingchair4 +- Water Spray Impact 4 +- OW Secret Library 040821_2 AP +- Real World Dam Break Alex Composite 2 +- Ghost Run Footstep Wood_v2 4 +- UI_Enter_Dialog_V6-002_highpass_2 +- Spark_10 +- Mournful Prisoner 3 +- OW_PR_FootstepsLeaves_06 +- FootstepsWoodCreak_02 +- OW Dreamworld Ruins 072021 AP 02c +- OW_PR_HitWallUnderwater1 +- OW_TH_RiverWaterFlow_loop +- OW ReelBeat 01c 021021 AP +- FootstepsWoodCreak_07 +- Ignite_Marshmallow_03 +- Marshmallow_Replace_02 +- Ship_FuelLeak +- Raft Heavy Impact 5 +- elevatorloop +- Real World Alarm Bell Oneshot 3 +- BigBang_EndFlash +- OW_FinalEndTimes_DB_loop +- fogsphere_pulse4 +- Ringworld Ambience 3 +- Destruction Impact 4 +- Artifact Unconceal +- OW_NM_DoorStart_06 +- OW_PR_SignalscopeZoomOut +- Nomai_Stone_Door_End_Big_V2_03 +- Player Gravel Footstep 3 +- General Destruction 5 +- OW Dream Fire Room 121820_4 AP LP +- OW_PR_DeactivateProbeMode +- OW_PR_LandInWater4 +- OW_PR_FootstepsJumpNomai_04 +- OW_PR_FootstepsJumpMetal_03 +- WarpCore_Remove_V3_01 +- Probe_SnapShot_03 +- Ghost Idle Search 4 +- Solanum_Foley_IconExit +- Dream Fire Room Ambience Test 1 +- Lantern Extinguish 4 +- OW_PR_OxygenLeakingFromSuit_loop_louder +- Wood Door Open Stop +- OW_PR_FootstepsJumpGrass_01 +- OW_SP_ThrustAfterburn +- OW_PR_FootstepsGrass_01 +- Real World Alarm Bell Oneshot 4 +- OW_PR_FootstepsNomai_04 +- Hotel Oneshot - Heavy Thud 2 +- Light Sensor Fade In 4 +- AnglerFish_OpenMouth_v2_01 +- Footstep_Run4 +- Ghost Walk Footstep Forest 6 +- OW_PR_FootstepsGrass_06 +- OW_GD_AmbienceRain +- RotationalThruster04 +- OW New Raft Music 082321_4 AP theme +- Spark_01 +- OW Muted End Times 040821 AP +- Nomai_WhiteHoleStationActivation +- Tool_Take_Out_02 +- OW_PR_FootstepsJumpDirt_05 +- mallowpuff2 +- Dreamworld Tower Fall Part 2 +- Jump_Into_Fogsphere_04 +- FootstepsWoodCreak_05 +- OW_SP_MetalCreak_14 +- OW_NM_DoorStart_03 +- drowning_firsthalf2 +- Forest Oneshot - Tree Creak 4 +- shiplog_misc1 +- FootstepsWoodCreak_04 +- Real World Dam Crack +- OW_NM_DoorStart_09 +- OW_SP_LandingPadHard4 +- OW_PR_FootstepsSand_06 +- BH_Ambience_Surface +- Ghost Grunt 3 +- glass_crack_02 +- House Destruction 3 +- OW_QuantumMoon +- Orb_Roll_Energy_Loop_v2_01 +- OW Eye Of The Universe 082018_2 AP +- Footstep3 +- OW_NM_DoorStart_Big_01 +- OW Dreamworld Ruins Story Beats 071621 AP 1d +- Dream World Tidal Wave Loop +- Nomai_Stone_Door_End_Big_V2_15 +- OW_SP_ActivateComputer 1 +- OW_PR_FootstepsIce_07 +- Raft Light Impact V2 3 +- UI_Pause_v2_08 +- signalscope_static +- OW_SP_LandingCamActivated 1 +- Footstep4 +- OW_PR_FootstepsSand_03 +- Prisoner Pick Up Vision Torch +- OW_SP_MetalCreak_16 +- OW_SP_Touchdown_04 +- Platform_Break_V2_03 +- OW Nomai Time Loop Device 081818 AP +- RockPile_Fall_02 +- Ship_Impact_No_Damage_V3_02 +- Destruction Impact 7 +- Ghost Grab Player 2 +- Forest Oneshot - Tree Creak 5 +- OW_PR_FootstepsMetal_01 +- OW NM Flashback 082818_3 AP base +- Projector Totem Light 2 +- Slot_Linking_Stone_Loop_02 +- breathing_suit3 +- OW_PR_FootstepsWood_07 +- OW_SP_HeadlightsOff_v2 +- Nomai_Stone_Door_End_V2_06 +- Fix_Puncture_03 +- OW Dream Rule LP 032421 AP glitch +- Real World Tidal Wave Loop Louder +- OW Dreamworld Ruins 072021 AP 02loop +- gasp_normal11_lessmale +- OW ReelBeat 01a 021021 AP +- OW_TH_ModelRocketThrustRotational_01 +- OW_PR_FootstepsBushRustle_05 +- OW NomaiRuinsRegular 081918 AP motif3c v2 +- OW Final End Times 022519_2 AP LOOP1 +- OW_PR_FootstepsSand_01 +- Anglerfish_Awake4 +- OW_PR_FootstepsJumpIce_04 +- Fix_Puncture_01 +- Raft Light Impact V2 1 +- Warp_Loop_01_v2 +- Ghost Start Hunt Grunt 1 +- Destruction Debris 4 +- Solanum_IconAppear_V3 +- OW_SP_ActivateComputer_OneShot +- Destruction Impact 8 +- OW_SP_ShipGroan1_v2 +- OW ReelBackdrop 02a 021021 AP +- OW_NM_ComputerRing1 +- OW_PR_FootstepsJumpGlass_04 +- Forest Oneshot - Tree Creak 6 +- OW_GD_HeatLightning_01 +- Raft Heavy Impacts V2 3 +- Solanum_Foley_RockFormStart +- Raft Light Impact V2 5 +- Ghost Grunt 4 +- OW_PR_FootstepsJumpDirt_06 +- OW_PR_FootstepsJumpGrass_03 +- OW_TravelerTheme_whistling +- Raft Heavy Impact 2 +- Nature Oneshot - Distant Deep Creature 1 +- OW_SP_CloseHatch_v2 +- linkingstone_in +- OW_PR_FootstepsSnow_03 +- OW_NM_OrbDeSelect_Energy_02 +- Impact_Light_02 +- Nomai_Stone_Door_End_V2_10 +- Fix_Puncture_07 +- OW_NM_HoleEnterExit +- OW NM Nomai Ruins 081718 AP +- OW_PR_OxygenRefill +- GhostMatter_Splash_v4_05 +- glass_crack_01 +- Ignite_Marshmallow_02 +- Ship_Impact_Medium_Damage_V3_03 +- Forest Oneshot - Animal 4 +- OW_PR_FootstepsIce_02 +- OW_GD_RainOnHelmet +- Spaceship_RattleLoop +- BigBang_WhooshLeadToExplo +- OW_TH_Campfire_loop_01 +- bigbang_cosmicinflation_v2 +- Hotel Oneshot - Heavy Creak 4 +- OW_PR_FootstepsJumpGrass_02 +- Tronworld Ambience 1 +- AnglerFish_Target_v2_07 +- Eye_of_Universe_Ambience_v2_01 +- OW_PR_FootstepsJumpLeaves_04 +- OW_PR_FootstepsJumpSnow_03 +- OW_PR_FootstepsJumpGlass_01 +- OW Traveler Theme 091118 AP FINAL TIME NO PIANO EDIT +- OW ReelBeat 02f 082521 AP +- Metal Door Close Stop +- medkit +- OW_NM_BlackHole_Lp +- Ghost Blow Out Lantern +- OW_PR_MarshmallowEatBurnt_shorter +- Solanum_Foley_IconEnter +- OW_PR_SignalscopeSwitchFrequencies +- Prisoner Pick Up Artifact +- OW_PR_BanjoStrum_3b +- Water Spray Impact 5 +- UI_Advance_Dialog_V6-002_highpass +- Destruction Debris 8 +- OW_PR_FootstepsDirt_06 +- Vision Torch - Step In +- OW_NM_DoorStart_Big_04 +- OW_PR_FootstepsBushRustle_06 +- Hotel Oneshot - Creak 5 +- OW_PR_FootstepsJumpLeaves_01 +- OW_SP_ShipGroan4_v2 +- Jump_Into_Fogsphere_03 +- Dreamworld Forest Ambience 2 +- OW_PR_FootstepsJumpRock_02 +- CrushedByElevator +- Player Gravel Footstep 1 +- House Destruction 4 +- Ghost Begin Stalk Grunt 1 +- flashlightOff +- OW ReelBeat 04b_2 040921 AP +- OW_PR_FootstepsRock_02 +- AshTwinCore_Open_01 +- OW_SP_HeadlightsOn_v2 +- Tower Fall Part 2 +- OW_NM_DoorStart_Big_02 +- Meteor_Impact_01_b +- OW_SP_LandingCamStatic +- OW_PR_FootstepsWood_01 +- gasp_light5 +- OW_PR_FootstepsGrass_03 +- Spark_03 +- Loading Tunnel - Loop +- FootstepsJumpWoodCreak_02 +- OW_Main_Menu +- Lantern Put Down +- OW Secret Library Whispers LP 040821 AP REF MIX +- OW_DB_Ambience +- Vision Torch Light Rays - On +- Hotel Oneshot - Creak 1 +- Dreamworld Nature Ambience 4 +- OW_PR_ThrustRotationalUnderwater_04 +- OW_PR_FootstepsJumpGrass_06 +- Nomai_Stone_Door_End_Big_V2_09 +- Ship_Impact_No_Damage_V3_01 +- Raft Movement Stop 3 +- Destruction Impact 9 +- Recorder_Start_Button +- AnglerFish_Target_v2_14 +- Ghost Begin Chase Grunt 2 +- Hotel Oneshot - Creak 6 +- Fragment_Break +- Tronworld Exit 2 +- Ghost Walk Footstep Forest 2 +- Incinerate_v3_01 +- Light Sensor Fade Out 3 +- OW_TravelerTheme_flute +- OW_PR_FootstepsLeaves_02 +- OW_PR_FootstepsLeaves_01 +- Fix_Puncture_05 +- Ghost Walk Footstep Wood_v2 3 +- OW_PR_FootstepsJumpSand_01 +- Sarcophagus Strain 2 +- OW_PR_HitWallUnderwater4 +- OW_PR_FootstepsRock_03 +- Loading Tunnel - Unload +- OW_PR_FootstepsJumpNomai_03 +- OW_PR_FootstepsDirt_07 +- OW_PR_FootstepsSnow_04 +- Wood Door Close Stop +- OW_PR_FootstepsJumpIce_02 +- OW ReelBeat 04a 031521 AP +- Raft Light Impact V2 2 +- Meteor_Impact_02_b +- JellyFish_Shock_02 +- Metal Door Open Start +- OW_GD_UnderwaterCurrent +- OW_GD_HeatLightning_06 +- nomai_textbranchout_noenergy2 +- asphyxiation_nosuit_secondhalf_version3 +- Artifact Focus +- Ice_Cave_Amb_loop_v3_01 +- Forest Oneshot - Tree Creak 3 +- OW NomaiRuinsRegular 081918 AP motif4c +- Dreamworld Lights Out Ambience 4 +- Projector Next Slide 2 +- BeaconIdea4 +- Destruction Impact 1 +- OW_PR_FootstepsNomai_06 +- OW_NM_FlickeryGravityCrystalAmbience +- OW Demonic Vocal Sting 082321 AP +- OW Quantum Lightning 091118 AP 08 +- OW_NM_SadTheme_older +- Nature Oneshot - Distant Creature 2 - less reverb +- FootstepsJumpWoodCreak_03 +- OW_PR_FootstepsJumpSand_02 +- Player Gravel Footstep 8 +- OW_PR_FootstepsSnow_06 +- gasp_traumatic3_lessmale +- Real World Dam Break Water Oneshot +- Repair_Loop +- OW_TH_FlagFlapping_loop.\_01 +- Ship_Impact_Light_Damage_V3_02 +- Raft Socket +- Jump_Into_TinyGalaxy_v2_01 +- OW NomaiRuinsRegular 081918 AP motif7c +- gasp_normal13_lessmale +- Sandfall_Inside_Loop_01 +- Solanum_RocksForm +- Fix_Puncture_06 +- OW Dreamworld Ruins Story Beats 071621 AP 1h +- Sarcophagus Open 2 +- fogsphere_pulse2 +- Elevator Rattle Loop 3 +- IllusoryWall_Alex +- OW_GD_HeatLightning_04 +- Nomai_Stone_Door_End_Big_V2_14 +- OW_PR_FootstepsJumpMetal_01 +- Vine_Crash_V3_03_LowPassDelay +- OW_PR_BanjoStrum_2b +- OW_PR_FootstepsGlass_05 +- OW_PR_FootstepsLeaves_07 +- OW_NM_DoorStart_01 +- OW_PR_FootstepsGrass_05 +- OW_PR_FootstepsJumpIce_01 +- OW_PR_ThrustRotationalUnderwater_01 +- Anglerfish_Chase_Breathing +- OW_PR_FootstepsRock_04 +- Metal Door Close Start +- Gear Rotate 1 +- Airlock Loop +- Solanum_Foley_RockFormEnd +- mallowpuff3 +- OW_PR_FootstepsSand_05 +- OW_PR_FootstepsJumpRock_01 +- Artifact Unfocus +- OW Eye Of The Universe 082818_2 AP +- OW_PR_FootstepsJumpRock_03 +- galaxy_zoomout2 +- OW_GD_IslandFalling_v2_loop +- Projector Previous Slide 2 +- Ignite_CampFire_04 +- SpaceshipAlarm2_3Iterations +- Ghost Individual Death 3 +- OW_PR_FootstepsJumpNomai_01 +- OW_PR_FootstepsJumpSnow_01 +- Forest Oneshot - Animal 2 +- OW_PR_FootstepsJumpDirt_01 +- Dreamworld Tower Fall Part 1 +- Ship_Impact_Medium_Damage_V3_05 +- OW_NM_ComputerRing3 +- OW_PR_SuitOn +- Airlock Pressurize +- OW_PR_FootstepsBushRustle_01 +- OW_PR_FootstepsNomai_02 +- Ship_Impact_Medium_Damage_V3_04 +- OW_NM_VesselDiscovery +- PlayerSubmerge +- Player Gravel Footstep 5 +- OW_EndTimes +- HGT_SandColumn_Ship +- OW ReelBeat 02c 021021 AP +- Spark_09 +- OW_PR_FootstepsSand_02 +- Damage_Light_05 +- OW_NM_ComputerRingFall2 +- gasp_traumatic7_lessmale +- Ghost Investigation Grunt +- Dream World Alarm Bell Oneshot 2 +- rockingchair2 +- OW_PR_FootstepsJumpDirt_04 +- Projector Next Slide +- OW_PR_FootstepsSand_08 +- OW_NM_WHAmbience2_v2 +- drowning_secondhalf2 +- Ghost Walk Footstep Forest 1 +- Prisoner Cloth Foley 3 +- OW_PR_FootstepsGlass_03 +- Vision Torch Scanning - Loop +- Raft Medium Impact V2 2 +- Hotel Oneshot - Heavy Thud 3 +- Destruction Impact - Large 4 +- OW_PR_FootstepsJumpLeaves_03 +- OW_PR_FootstepsJumpSand_03 +- OW Dreamworld Ruins SILENCE 02 +- OW_PR_FootstepsWood_06 +- ModelRocket_LightImpact +- shiplog_scanningloop +- OW Ghost Ambiences v2 011221 AP low LP +- OW NomaiRuinsRegular 081918 AP motif2c +- glass_crack_03 +- Fix_Puncture_08 +- OW_PR_FootstepsSnow_01 +- OW_PR_FootstepsDirt_01 +- asphyxiation_nosuit_firsthalf1 +- OW_NM_DoorSlide_Big_LP_01 +- OW_SUN_SupernovaWall +- OW_NM_DoorAirLockAirPourOut_03 +- OW_PR_ThrustUnderwater +- Solar Sail Stop +- OW_TH_Waterwheel_loop +- Forest Oneshot - Tree Creak 1 +- OW ReelBackdrop 03a 050321 LOOP +- Platform_Break_V2_04 +- FireBall_01 +- OW ReelBackdrop 01a 022521 AP +- Dreamworld Lights Out Ambience 1 +- Nomai_Stone_Door_End_Big_V2_11 +- Spark_07 +- OW_SP_ThrustTranslationalUnderwater +- Dream World Water Ambience - Creek 1 +- Ghost Begin Stalk Grunt 2 +- Comet_Purr +- JellyFish_Shock_04 +- OW_PR_FootstepsWood_08 +- Raft Reeling Loop +- shiplog_switchmode_forward +- Station Light Flicker - Dreamworld +- Lantern Wake Up Light 3 +- flashlightOn +- Dreamworld Base Ambience 1 +- Ship_Impact_Heavy_Damage_V3_09 +- Crushed_To_Death_V2_01 +- ow_kazoo_theme +- JetPack_NotificationBeep +- Ghost Run Footstep Wood_v2 1 +- OW_PR_FootstepsJumpNomai_05 +- OW_NM_DataStream_v2 +- UI_Tab_v2_02 +- OW_PR_ProbeTakePicture +- OW_NM_GravityCannonAmbience +- OW NM Flashback 082818 AP loop +- OW_SP_LandingPadSoft4 +- OW_PR_FootstepsGlass_07 +- WarpCore_Insert_V3_01 +- OW_NM_TractorBeamLP +- ShipRepair_Finish +- Ghost Begin Chase Grunt 1 +- Destruction Impact 2 +- OW_PR_FootstepsLeaves_08 +- Recorder_Stop_Button +- OW_PR_FootstepsLeaves_04 +- OW_PR_Jump1 +- Jump_Into_TinyGalaxy_v2_04 +- OW_GD_Tornado_v2_04 +- OW_PR_FootstepsJumpDirt_02 +- OW_SP_ConsoleReadoutStart +- OW_NM_EscapePodHatch +- OW_PR_FootstepsJumpNomai_02 +- Light Sensor Fade In 1 +- Light Sensor Fade In 2 +- Hotel Oneshot - Creak 9 +- CampfireTune_All_Reverb +- Recording_Loop_03 +- PartyHouseWhistle_Confident +- mallowpuff4 +- OW_NM_WhiteHoleAmbienceL +- Station Shudder +- drowning_firsthalf1 +- UI_Exit_Dialog_V6-002_highpass +- Dream World Dam Break +- Dreamfire Extinguish 1 +- MediumSplash +- Vision Torch - First Slide Appears +- Footstep1 +- OW_TravelerTheme_drums +- Artifact Conceal +- HGT_Ambience_Cave_Small +- HGT_Ambience_Cave_Big +- OW_TH_Waterfall_loop_01 +- OW Discovery 083021_2 AP darker shorter +- Secret Passageway Open Loop 2 +- Hotel Oneshot - Creak 4 +- supernova_explosion_deepnuclear2 +- Ghost Shout 7 +- OW NM Flashback 081718 AP slam +- Airlock Close +- OW_TH_FlagFlapping_loop.\_02 +- OW_SP_RefuelJetpack_v2_short +- Ship_Impact_No_Damage_V3_03 +- Raft Medium Impact V2 4 +- Anglerfish_Awake3 +- Wood Door Open Start +- OW_TH_FlagFlapping_loop +- Slide Reel Pickup 2 +- Tronworld Ambience 2 Alex Hack +- Ghost Run Footstep Wood_v2 5 +- Ignite_CampFire_03 +- Single Ghost Scream 14 +- Raft Start Reeling +- OW_PR_FootstepsGrass_08 +- Tronworld Enter 2 +- OW_PR_ProbeUnderwaterLaunch +- OW_GD_IslandCrashingInWater_v2 +- Grapple Totem Zoom In +- OW ReelBeat 02a 021021 AP +- Nomai_Stone_Door_End_V2_08 +- OW_PR_FootstepsJumpGlass_02 +- OW_NM_DoorStart_02 +- Destruction Impact - Large 3 +- OW_SP_SignalscopeSlideV2 +- OW NomaiRuinsRegular 081918 AP motif6c +- Wood Door Close Start 3 Alex +- Destruction Impact - Large 2 +- Nomai_Stone_Door_End_Big_V2_01 +- OW_NM_ComputerAmbienceLP +- Anglerfish_Awake2 +- OW_TH_Insects_loop_03 +- OW_PR_SignalscopeActivate +- OW_NM_ComputerRingFall1 +- OW_PR_FootstepsDirt_02 +- OW_NM_ShuttleLight +- Single Ghost Scream 1 +- Ghost Identify Fail +- OW_SP_ShipGroan5_v2 +- Cloaking Field Exit +- OW_PR_FootstepsNomai_01 +- OW Dreamworld Ruins 072021 AP 02e +- Forest Oneshot - Tree Creak 2 +- fogsphere_pulse1 +- OW_PR_PullOutStick +- OW_PR_LockOn +- Nomai_Stone_Door_End_Big_V2_07 +- OW_PR_FootstepsJumpSand_06 +- InstantDeath2_Long_Ringing +- Light Sensor Door Stop 2 +- Light Sensor Door Loop 2 +- OW_TH_GeyserEnd_02 +- pickaxe_01 +- OW_PR_FootstepsWaterWade_03 +- RockPile_Fall_03 +- OW_PR_ThrustAfterburn_v2_01 +- Light Sensor Fade Out 2 +- Light Sensor Fade In 3 +- OW Finally Set Free 072021_2 AP +- Ghost Blow Out Lantern Charge +- Wood Door Loop +- BigBang_Explo +- TH_Geyser_Loop_v3 +- Water Spray Impact 8 +- OW_TH_FlagFlapping_loop.\_03 +- OW_PR_FootstepsJumpLeaves_02 +- OW_PR_FootstepsIceSlide_Lp_01 +- Dreamworld Lights Out Ambience 3 +- knife_scrape_01 +- OW OBSERVATORY 011317 AP +- Footstep_Run5 +- Light Sensor Door Open 2 +- Jetpack_O2_loop_01 +- OW_PR_FootstepsJumpWood_04 +- OW_SP_BuckleUp +- Probe_SnapShot_02 +- Pickup_Ceramic_01 +- OW_PR_FootstepsWood_03 +- Destruction Debris 3 +- OW_PR_SignalscopeDeactivate +- OW_PR_OxygenLeakingFromSuit_loop +- Probe_SnapShot_01 +- Dreamworld Ghost Hotel Ambience 2 +- Slide Reel Put Down 2 +- Nomai_Stone_Door_End_V2_07 +- OW_SP_ProbeLauncherRotation_v2 +- OW_PR_MarshmallowEatUnburnt_noMmm_v3 +- SystemBackOnline +- Ghost Idle Search 1 +- Ship_Impact_Light_Damage_V3_03 +- OW Dreamworld Ruins Story Beats 071621 AP 1i +- OW_PR_FootstepsGrass_02 +- OW_NM_DoorSlide_LP_02 +- Ringworld Cave Ambience +- Fix_Puncture_02 +- OW_PR_FootstepsWaterWade_08 +- OW_TH_GeyserStart_01 +- OW_TH_Insects_loop_01 +- OW ReelBeat 04d_2 040921 AP +- OW_TH_ProjectorStop +- Prisoner Cloth Foley 6 +- Dream World Alarm Bell Oneshot 3 +- shiplog_selectplanet2 +- Nature Oneshot - Distant Creature 1 - less reverb +- OW_PR_FootstepsDirt_08 +- Spark_04 +- OW_GD_HeatLightning_02 +- OW Secret Loop 090121 AP muted +- Creature Voice Test 1 Short +- General Destruction 4 +- House Destruction 1 +- OW_PR_FootstepsSnow_02 +- Huge Splash 2 +- Player Gravel Footstep 4 +- Ghost Grab Player 1 +- shiplog_switchmode_back +- OW_PR_FootstepsJumpWood_03 +- OW_PR_FootstepsJumpMetal_05 +- OW_SP_AutopilotEngaged 1 +- OW_NM_DoorAirlockOpen_03 +- OW Dreamworld Ruins 072021 AP 02b +- Ghost Investiagation Grunt 2 +- Wood Door Close Start 2 +- Real World Alarm Bell Oneshot 2 +- OW Fabric SFX 102119 AP screen shatter SHORT +- OW_NM_Ruins_ambience_scary_loop +- Raft Heavy Impact 1 +- OW Whispers 041321_2 AP LP +- Ghost Run Footstep Forest 4 +- Vine_Crash_V3_01_LowPassDelay +- Solanum_Foley_HandLower +- OW_PR_FootstepsSand_07 +- Grapple Totem Zoom Out Louder +- Ship_Impact_Heavy_Damage_V3_07 +- OW_PR_FootstepsIce_01 +- OW Ghost Ambiences v2 011221 AP pad LP +- Raft Movement Stop +- OW_TH_Museum +- gasp_normal12_lessmale +- OW_PR_FootstepsJumpRock_05 +- OW_SP_ThrustRotationalUnderwater_02 +- Pool_Exit_v3 +- Flashlight_Malfunction_02 +- OW NomaiRuinsRegular 081918 AP motif1c +- Nomai_Stone_Door_End_V2_05 +- OW_PR_FootstepsLeaves_05 +- Nomai_Stone_Door_End_V2_09 +- asphyxiation_suit_secondhalf1 +- Spark_08 +- OW Aquatic Exploration 050318 AP LOOP +- OW_TH_GeyserEnd_01 +- UI_Navigate_03 +- OW ReelBeat 02b 021021 AP +- Player_Impact_Damage_Light_02 +- OW_PR_FootstepsWood_02 +- Jump_Into_TinyGalaxy_v2_02 +- OW_PR_ThrustRotationalUnderwater_05 +- Atmosphere_High_Suit +- OW_SP_MetalCreak_04 +- OW Prisoner Reveal 063021 AP +- Ghost Grunt 1 +- OW_PR_FootstepsJumpDirt_03 +- OW Reelbeat 03c 061721 AP +- Nomai_Stone_Door_End_Big_V2_10 +- Damage_Light_01 +- PutDown_Rock_01 +- OW_TH_ModelRocketCrashing +- OW ReelBeat 03b 032521 AP +- OW END OF GAME 021818 AP +- Raft Movement Start 3 +- Impact_Light_03 +- OW_NM_Tech_Advanced +- Ghost Walk Footstep Wood_v2 4 +- OW_PR_FootstepsJumpWood_05 +- OW_PR_FootstepsMetal_02 +- FootstepsJumpWoodCreak_01 +- OW Timber Hearth 032719 AP v2 +- Hotel Oneshot - Heavy Creak 3 +- shiplog_highlight +- OW_GD_Tornado_v2_03 +- RotationalThruster02 +- OW Quantum Lightning 091118 AP 06 +- JetPack_NotificationBeep_Fast +- SmallSplash +- Ghost Run Footstep Forest 3 +- Nomai_Stone_Door_End_Big_V2_04 +- OW Prisoner Elevator 061121_5 AP loop +- Tower Fall Part 1 +- OW_PR_FootstepsMetal_03 +- OW_PR_FootstepsRock_01 +- Ignite_Marshmallow_01 +- Ignite_CampFire_02 +- Ghost Walk Footstep Wood_v2 5 +- OW_GD_AmbienceCave +- Ship_Impact_Heavy_Damage_V3_11 +- Raft Release +- elevatorstop +- Hotel Oneshot - Creak 2 +- Station Light Flicker +- Forest Oneshot - Tree Creak 7 +- OW_GD_HeatLightning_03 +- Nomai_Stone_Door_End_Big_V2_08 +- OW_TH_AmbienceHighAltitude +- Water Spray Impact 3 +- Ghost Grunt 2_SmoothFade +- linkingstone_out +- Ghost Shout 6 +- Ghost Individual Death 4 +- shiplog_highlight2 +- OW_PR_FootstepsMetal_04 +- OW Morning Cello 101718_2 +- Spark_11 +- fogsphere_jump2_delayed +- Nomai_Stone_Door_End_V2_04 +- OW_SP_ElectricalDamageLP +- OW_PR_FootstepsGlass_02 +- Ghost Run Footstep Forest 6 +- OW_NM_CenterClampsRemoving +- OW_SP_ThrustRotationalUnderwater_03 +- OW_NM_InsertScroll +- GhostMatter_Splash_v4_02 +- Airlock Open +- OW_PR_TranslatorTranslateNew +- Ship_Impact_Heavy_Damage_V3_10 +- House Destruction 2 +- shiplog_newentry3_softer +- OW_TravelerTheme_piano +- Stilts Destruction 3 +- OW_PR_LockOff +- OW_TH_ModelRocketThrustTranslational_01 +- Hotel Oneshot - Creak 8 +- Dreamworld Candle Lighting Test Variation 6 +- Stilts Destruction 4 +- OW_SUN_BurnPlanet +- Real World Dam Crack Water Loop +- OW Final End Times 022519_2 AP LOOP2 +- OxygenRefill_Short +- OW ReelBeat 03a 031521 AP +- OW NomaiRuinsRegular 081918 AP motif5c v2 +- StoryReel5Short 063021_3 AP +- OW_GD_AmbienceOcean +- OW_TH_BridgeCreaking_loop +- OW Traveler Theme 021821 AP FINAL TIME NO PIANO ADD PRISONER +- OW_SP_ShipAmbiance_01 +- Prisoner Grunt 2 +- OW_NM_ComputerRingFall3 +- OW_NM_DoorStart_04 +- Ghost Neck Snap +- Nomai_Warp_01 +- General Destruction 2 +- pickaxe_02 +- OW_PR_FootstepsSnow_07 +- Lava_Splash_02 +- OW_PR_FootstepsGlass_06 +- Anglerfish_Awake +- OW_PR_ProbeRetrieval +- OW_PR_FootstepsJumpSnow_04 +- Lantern Wake Up Light 2 +- Secret Passageway Open Stop 2 +- Lantern Shorting Out 2 +- OW_PR_BanjoStrum_1b +- OW_PR_FootstepsSnow_08 +- Air Rushing Out Into Space +- OW_PR_FootstepsJumpGlass_03 +- OW_PR_ProbeInAirSound +- shiplog_movebetweenplanets +- OW_PR_BanjoStrum_4b +- Raft Stop Reeling +- OW Traveler Theme 091118 AP FINAL TIME WITH PIANO EDIT +- OW_PR_FootstepsMetal_08 +- OW ReelBeat 04a_2 040921 AP +- OW_SP_ShipExploding +- OW_PR_FootstepsJumpMetal_02 +- OW_TH_ModelRocketThrustRotational_04 +- JellyFish_Shock_03 +- OW No-Eye Ruins 121120_2 AP LP +- OW_GD_HeatLightning_05 +- OW_NM_GravityCrystalAmbience_Louder +- OW_GD_HeatLightning_07 +- Solar Sail Loop 2 +- OW_PR_FootstepsBushRustle_02 +- CityLights_Off_01 +- RotationalThruster01 +- OW_NM_BHEnterItem_v2 +- OW_PR_FootstepsBushRustle_09 +- Vision Torch - Vision Dissolves +- OW_PR_FootstepsJumpMetal_04 +- Lantern Remove 2 +- Player_Impact_Damage_Light_01 +- StoryReel5Full 062821_4 AP +- OW_PR_FootstepsWaterWade_07 +- OW_NM_SkypeLP +- OW_SP_ShipGroan2_v2 +- Volcano_Ambience_Loop_V2 +- AnglerFish_Chomp_Loop_v2 +- Destruction Debris 2 +- OW_PR_LandInWater2 +- OW_PR_FootstepsIce_05 +- Footstep_Run1 +- Anglerfish_ChompBite_01 +- Destruction Debris 1 +- Ghost Run Footstep Forest 1 +- AnglerFish_Target_v2_02 +- Signalscope_Zoom_Loop +- BH_Ambience_Below_Crust +- fogsphere_pulse3 +- OW_GD_HeatLightning_08 +- AshTwinCore_Close_01 +- Airlock Depressurize +- OW_TH_ModelRocketThrustRotational_03 +- OW_NM_ComputerRing2 +- RockPile_Fall_05 +- Vision Torch Fire - Loop +- OW Farewell 061721 AP +- Hologram_Enter_v2_01 +- OW_PR_ThrustRotationalUnderwater_03 +- Forest Oneshot - Tree Creak 8 +- OW_PR_LandInWater3 +- Hotel Oneshot - Creak 3 +- Hotel Oneshot - Heavy Thud 1 +- Distant Ghost Cacophony 1 +- Footstep_Run2 +- OW_TH_ProjectorRun_loop +- OW_PR_FootstepsJumpGrass_04 +- Destruction Impact - Large 5 +- FootstepsWoodCreak_03 +- OW_PR_FootstepsIce_03 +- Solanum_Foley_HandRaise +- OW_NM_DoorStart_Big_03 +- Candle Extinguishing Test Variation 6 +- Ignite_CampFire_01 +- Nature Oneshot - Distant Creature 3 - less reverb +- Real World Water Ambience - Slow River +- Ghost Grunt 5 +- IceMelt_v2_LowPass +- OW_NM_GravityCannonDeactivated +- OW Ghost Sequence 011121 AP LOW SUSPENSE LP +- Anglerfish_Sleeping +- Real World Water Ambience - Slow River 2 +- OW_PR_FootstepsWaterWade_02 +- Ghost Walk Footstep Forest 3 +- Spark_05 +- OW No-Eye Ruins 082121 AP stinger +- Nature Oneshot - Distant Deep Creature 3 +- OW_NM_SunStation +- Projector Totem Extinguish 1 +- Dreamfire Crackling Loop 3 +- OW Ghost Ambiences 012921_2 AP slam +- Dreamfire Explosion +- Dream World Water Ambience - Creek 8 +- OW_PR_FootstepsSnow_05 +- OW_PR_FootstepsIce_04 +- Dream World Water Ambience - Creek 5 +- Ghost Run Footstep Forest 2 +- OW_NM_DoorStart_08 +- Outer Wilds Party House v8 050321_2 AP traveler drone +- Hotel Oneshot - Heavy Creak 1 +- Secret Passageway Open Start 2 +- FootstepsWoodCreak_01 +- Ghost Grunt 8 +- OW_PR_FootstepsMetal_06 +- Probe_Attach_v3_02 +- OW_PR_LandInWater1 +- FootstepsWoodCreak_06 +- OW_PR_FootstepsBushRustle_04 +- Projector Totem Blow +- OW_PR_FootstepsWaterWade_01 +- Raft Movement Loop +- OW_SP_ThrustRotationalUnderwater_01 +- OW_PR_FallingIntoLavaBeep_loop +- Ship_Impact_Light_Damage_V3_01 +- Ship_Impact_Medium_Damage_V3_02 +- Ghost Walk Footstep Wood_v2 1 +- Nomai_Stone_Door_End_Big_V2_02 +- OW ReelBeat 04c_2 040921 AP +- Raft Push +- OW_PR_FootstepsJumpIce_03 +- Nomai_Stone_Door_End_Big_V2_05 +- Destruction Impact 5 +- HGT_SandFallSmall_Inside +- OW Quantum Lightning 091118 AP 01 +- OW_PR_OxygenLeakingFromSuit_in +- OW_PR_HelmetOn +- OW_SP_AutopilotDisengaged 1 +- PutDown_Ceramic_01 +- OW_PR_FootstepsMetal_07 +- Water Spray Impact 7 +- Dream World Alarm Bell Oneshot 4 +- CityLights_On_01 +- rockingchair3 +- fogsphere_pulse5 +- Nomai_ShipPowerOn_V2_01 +- OW_GD_IslandSuckedInTornado +- OW_NM_DoorStart_05 +- Probe_Attach_v3_01 +- OW_PR_ThrustRotationalUnderwater_02 +- Outer Wilds Party House v8 050321_3 AP traveler +- Artifact Put Down +- OW ReelBeat 01b 021021 AP +- stoppedasphyxiating_suit2 +- FootstepsJumpWoodCreak_04 +- Destruction Debris 6 +- Nomai_Warp_03_Shorter +- mallowpuff1 +- OW ReelBeat 02d 021021 AP +- OW_TravelerTheme_harmonica +- shiplog_misc4 +- Projector Totem Extinguish 3 +- OW ReelBackdrop 02b 021021 AP +- OW_PR_FootstepsDirt_03 +- Lava_Splash_01 +- Engine_Start_V2 +- Solar Sail Start +- OW_PR_ThrustTranslational_v2_01 +- Light Sensor Fade Out 1 +- Prisoner Cloth Foley 4 +- OW Quantum Lightning 091118 AP 02 +- OW_NM_RemoveScroll +- asphyxiation_suit_firsthalf2 +- OW_TH_AmbienceNightInCanyons +- Footstep2 +- OW ReelBackdrop 03b LOOP 031521 AP +- OW_SP_ThrustRotationalUnderwater_04 +- OW_PR_FootstepsNomai_08 +- OW_PR_FootstepsNomai_03 +- OW ReelBeat 03d 061121 AP +- OW_PR_FootstepsJumpSand_04 +- RotationalThruster03 +- Stilts Destruction 5 +- Raft Run Aground +- OW Space Station 081420_2 AP +- OW_PR_FootstepsWaterWade_06 +- Spark_02 +- Cloaking Field Entry +- OW_NM_DataWormhole +- OW_QuantumSignal +- General Destruction 3 +- OW New Raft Music 082321_4 AP quiet +- OW_SP_Unbuckle +- Real World Water Ambience - Calm 2 +- Prisoner Grunt 3 +- OW_NM_OrbMoveGlass_lp_01 +- Prisoner Cloth Foley 7 +- OW_PR_FootstepsRock_05 +- OW Traveler Theme 021821 AP FINAL TIME WITH PIANO ADD PRISONER +- OW Quantum Lightning 091118 AP 03 +- OW_TH_ModelRocketThrustRotational_02 +- OW_PR_HitWallUnderwater3 +- Flashlight_Malfunction_03 +- OW NM Flashback 082818 loop overlay AP +- supernova_corecollapse_10sec_fadeOut +- OW_PR_FootstepsWood_05 +- rockingchair1 +- Power_Failure_v2_02 +- OW_PR_FootstepsMetal_05 +- Stilts Destruction 2 +- Dreamworld Tower Tilt +- OW New Texture 082921 AP loop +- Lantern Insert 3 +- OW_PR_FootstepsNomai_07 +- OW_PR_FootstepsJumpWood_06 +- Pool_Enter_v3_Fade +- Raft Movement Start +- OW_PR_FootstepsNomai_05 +- OW_PR_HardSplash +- Destruction Debris 5 +- Dreamworld Candle Lighting Test Variation 2 +- OW NM Flashback 082818_2 AP stinger delayed +- Ghost Shout 4 +- Nomai_Stone_Door_End_Big_V2_06 +- Tower Tilt +- OW_NM_DoorStart_Big_06 +- OW_PR_FootstepsLeaves_03 +- Ghost Run Footstep Wood_v2 3 +- OW_NM_BHExitItem_v2 +- Ghost Idle Search 5 +- Forest Oneshot - Animal 1 +- OW Dreamworld Ruins 072021 AP 02d +- OW_PR_FootstepsJumpSnow_02 +- Platform_Break_V2_01 +- OW Party House 092820 AP short loop +- OW_PR_FootstepsRock_06 +- OW_SP_ThrustTranslational +- Footstep6 +- OW_PR_FootstepsWaterWade_05 +- Ghost Start Hunt Grunt 2 +- OW Dreamworld Ruins 072021 AP 02f +- Nomai_Stone_Door_End_Big_V2_12 +- Jump_Into_TinyGalaxy_v2_03 +- Footstep_Run3 +- Negative1 +- OW_TravelerTheme_banjo +- SandColumnEnd_v2 +- OW_PR_FootstepsJumpSand_05 +- Dreamworld Lights Out Ambience 2 +- OW Blair Witch Project 082921_3 AP darker mix loop +- Fig_Backer_Sat_Audio_V3 +- OW_PR_FootstepsGlass_01 +- Light Sensor Fade Out 4 +- Projector Totem Light 1 +- Player Gravel Footstep 6 +- OW_TH_GeyserStart_03 +- Slide Reel Remove 3 +- Ship_Impact_Medium_Damage_V3_06 +- OW Quantum Lightning 091118 AP 05 +- OW_GD_Tornado_v2_01 +- OW_SP_ActivateComputerLP +- Footstep_Run6 +- Spark_13 +- Vine_Crash_V3_02_LowPassDelay +- OW Slideshow BURNT LOOP small 031521_2 AP +- Raft Heavy Impact 4 +- Light Sensor Door Loop - Door Sensor Sliding +- Sarcophagus Strain 3 +- Loading Tunnel - Load +- elevatorstart +- Nomai_Stone_Door_End_V2_02 +- OW_GD_Tornado_v2_02 +- OW_NM_DoorAirLockAirPourOut_01 +- OW_TravelerTheme_newtraveler 061021 AP +- OW ReelBackdrop 04a_3 041321 AP LP +- OW_PR_FootstepsJumpRock_04 +- Damage_Heavy_04 +- Raft Movement Stop 2 +- OW_SP_AnalogClick2_v2 +- Nomai_Stone_Door_End_V2_01 +- OW_PR_FootstepsRock_07 +- Raft Light Impact V2 4 +- Marshmallow_Replace_01 +- Footstep5 +- Destruction Impact 3 +- Helmet_Glass_Crack_08 +- Ghost Run Footstep Wood_v2 6 +- OW End Credits 022019_3 AP +- Raft Heavy Impacts V2 2 +- Nomai_Stone_Door_End_Big_V2_13 +- OW_NM_GravityCannonActivated +- Outer Wilds Party House v8 050321_2 AP Bass +- Ringworld Muffled Indoor Ambience +- Ghost Run Footstep Wood_v2 2 +- OW_GD_AmbienceUndewater +- Forge_Loop_V3_03 +- OW_PR_CampfireAmbience +- OW_PR_FootstepsRock_08 +- Platform_Break_V2_02 +- OW_PR_FootstepsJumpWood_02 +- OW Eye Temple 121820_2 AP LP +- OW_GD_WavesAgainstBeach +- OW_PR_ThrowProbe +- OW_NM_DoorStart_07 +- OW_PR_FootstepsSand_04 +- Lantern Pickup +- Real World Water Ambience - Rapids 2 +- OW_PR_FootstepsWood_04 +- OW_NM_TractorBeamPowerUp +- OW New Stinger 082921 AP +- OW_PR_FootstepsGrass_07 +- Hotel Oneshot - Creak 7 +- Player_On_Fire_Loop +- OW_TH_UnderwaterRushing +- GhostMatter_Splash_v4_01 +- OW_SP_ThrustRotationalUnderwater_06 +- OW Fabric SFX 102119 AP rip FADE OUT +- OW Dreamworld Ruins 072021 AP 02a +- Spark_06 +- OW_SP_SignalscopeChunkV2 +- Player Gravel Footstep 2 +- OW_PR_FootstepsBushRustle_07 +- Hologram_Exit_v2_01 +- Metal Door Open Stop +- OW_PR_FootstepsJumpWood_01 +- OW_PR_FootstepsWaterWade_04 +- Nature Oneshot - Distant Deep Creature 2 +- Stilts Destruction 1 +- OW NM Flashback 082818 AP overlay1 +- drowning_secondhalf1 +- Gear Rotate Locked_Short +- Prisoner Cloth Foley 5 +- shiplog_deselectplanet +- Orb_End_v3_01 +- Atmosphere_High_Ship +- Solar Sail Start 2 +- knife_scrape_02 +- OW_TH_GeyserEnd_03 +- Meteor_Impact_03_b +- Destruction Impact 6 +- JellyFish_Shock_01 +- Light Sensor Loop +- Candle Extinguishing Test Variation 4 +- Vision Torch Light Rays - Off +- OW_NM_DoorSlide_Big_LP_05 +- OW_PR_FootstepsDirt_05 +- Sand_Column_Start_v2_03 +- Water Spray Impact 6 +- OW_NM_DoorStart_Big_07 +- OW_SP_ShipGroan3_v2 +- Heat_Damage_Loop_01 +- OW_SP_LandingCamDeactivated 1 +- breathing_lowO2_6 +- OW_PR_OxygenLeakingFromSuit_out +- LogUpdated_001 +- Vine_Crash_V3_04_LowPassDelay +- Destruction Debris 7 +- Hotel Oneshot - Heavy Creak 2 +- OW_PR_HelmetOff +- OW_PR_FootstepsGrass_04 +- Forest Oneshot - Animal 3 +- OW Discovery 083021_2 AP shorter +- Slide Reel Insert 3 +- OW_NM_BHEnterExitPlayer_v2 +- Ship_Impact_Light_Damage_V3_05 +- OW_SP_OpenHatch_NoBeep +- OW_SP_ThrustRotationalUnderwater_05 +- ShipSubmerge +- Artifact Fire Loop +- OW_DarkBramble_loop +- OW_PR_FootstepsBushRustle_08 +- OW NM Nomai City 081718 AP LOOP +- Solar Sail Stop 2 +- Destruction Impact - Large 1 +- OW Dream Rule LP 032421 AP normal +- Solar Sail Loop +- OW_TH_GeyserStart_02 +- Ship_Impact_No_Damage_V3_05 +- OW_PR_FootstepsIce_06 +- Outer Wilds Party House v8 050321_2 AP vocals +- asphyxiation_suit_secondhalf2 +- Affirmative1 +- Spark_12 +- OW_SP_ConsoleReadoutLP +- OW ReelBackdrop 03c 042621 AP LP +- gasp_light9 +- Nomai_Stone_Door_End_V2_03 +- OW_PR_FootstepsJumpNomai_06 +- OW_PR_FootstepsGlass_04 +- OW_PR_FootstepsDirt_04 +- Destruction Debris 9 +- OW_PR_FootstepsIce_08 +- OW_PR_SuitOff +- Artifact Pickup +- OW_SUN_Ambience_v4 +- JellyFish_Shock_05 +- OW_TH_Underwater +- Station Shudder - Dreamworld +- Ghost Walk Footstep Forest 5 +- OW_TH_ProjectorActivate +- asphyxiation_suit_firsthalf1 +- OW_PR_SignalscopeZoomIn +- HGT_Ambience_Surface +- FootstepsWoodCreak_08 +- GhostMatter_Splash_v4_03 +- UI_Tab_v2_05 +- Raft Medium Impact V2 3 +- OW_NM_TractorBeamPowerDown +- OW_Travel_Theme_Remaster +- Big_Galaxy_Burn_v2_01 +- OW_TH_Insects_loop_02 +- Raft Heavy Impact 3 +- Raft Movement Start 2 +- OW Quantum Lightning 091118 AP 04 +- OW_TH_FlagFlapping_loop.\_04 +- OW_TH_ModelRocketThrustTranslational_02 +- knife_scrape_03 +- Incinerate_v3_02 +- Light Sensor Rotate +- OW_NM_EscapePodDistressSignal +- MapZoomOut_Tone +- OW_NM_DoorStart_Big_05 +- Player Gravel Footstep 7 +- Ghost Walk Footstep Wood_v2 2 +- Ghost Run Footstep Forest 5 +- Ghost Walk Footstep Forest 4 +- OW_PR_HitWallUnderwater2 +- OW NM Flashback 082818_2 AP stinger +- OW_PR_FootstepsJumpGrass_05 +- Fix_Puncture_04 +- Ghost Idle Search 3 diff --git a/docs/src/content/docs/schemas/body-schema/index.mdx b/docs/src/content/docs/schemas/body-schema/index.mdx index f64c364c6..852b892c6 100644 --- a/docs/src/content/docs/schemas/body-schema/index.mdx +++ b/docs/src/content/docs/schemas/body-schema/index.mdx @@ -1,8 +1,8 @@ --- -title: Celestial Body Schema -description: Describes a celestial body to generate +title: "Celestial Body Schema" +description: "Describes a celestial body to generate" editUrl: false -schemaFile: body_schema.json +schemaFile: "body_schema.json" --- import Schema from "/src/components/Schemas/Schema.astro"; diff --git a/docs/src/content/docs/start-here/getting-started.md b/docs/src/content/docs/start-here/getting-started.md index c37163bb2..1b94c8be1 100644 --- a/docs/src/content/docs/start-here/getting-started.md +++ b/docs/src/content/docs/start-here/getting-started.md @@ -35,8 +35,7 @@ Once in VSCode, paste this code into the file: "Base": { "groundSize": 100, "surfaceSize": 101, - "surfaceGravity": 12, - "hasMapMarker": true + "surfaceGravity": 12 }, "Orbit": { "semiMajorAxis": 1300, @@ -55,6 +54,9 @@ Once in VSCode, paste this code into the file: "fogSize": 150, "fogDensity": 0.2, "hasRain": true + }, + "MapMarker": { + "enabled": true } } ``` @@ -64,34 +66,35 @@ It has an object called Base, which has a groundSize of 100, and a surfaceSize o Alright so now that we understand how the file is structures, let's look into what each value actually does: -- `name` simply sets the name of the planet -- `$schema` we'll get to in a second -- `starSystem` specifies what star system this planet is located in, in this case we're using the base game star system, so we put "SolarSystem" -- Then it has an object called `Base` - - Base has a `groundSize` of 100, this generates a perfect sphere that is 100 units in radius as the ground of our planet - - It also has a `surfaceSize` of 101, surface size is used in many calculations, it's generally good to set it to a bit bigger than ground size. - - `surfaceGravity` describes the strength of gravity on this planet, in this case it's 12 which is the same as Timber Hearth - - `hasMapMarker` tells new horizons that we want this planet to have a marker on the map screen -- Next it has another object called `Orbit` - - `semiMajorAxis` specifies the radius of the orbit (how far away the body is from its parent) - - `primaryBody` is set to `TIMBER_HEARTH``, this makes our planet orbit timber hearth - - `isMoon` simply tells the game how close you have to be to the planet in map mode before its name appears - - `isTidallyLocked` makes sure that one side of our planet is always facing timber hearth (the primary body) -- Finally, we have `Atmosphere` - - Its `size` is 150, this simply sets how far away from the planet our atmosphere stretches - - Its `fogTint` is set to a color which is an object with r, g, b, and a properties (properties is another word for keys) - - `fogSize` determines how far away the fog stretches from the planet - - `fogDensity` is simply how dense the fog is - - `hasRain` makes rainfall on the planet +- `name` simply sets the name of the planet +- `$schema` we'll get to in a second +- `starSystem` specifies what star system this planet is located in, in this case we're using the base game star system, so we put "SolarSystem" +- Then it has an object called `Base` + - Base has a `groundSize` of 100, this generates a perfect sphere that is 100 units in radius as the ground of our planet + - It also has a `surfaceSize` of 101, surface size is used in many calculations, it's generally good to set it to a bit bigger than ground size. + - `surfaceGravity` describes the strength of gravity on this planet, in this case it's 12 which is the same as Timber Hearth +- Next it has another object called `Orbit` + - `semiMajorAxis` specifies the radius of the orbit (how far away the body is from its parent) + - `primaryBody` is set to `TIMBER_HEARTH``, this makes our planet orbit timber hearth + - `isMoon` simply tells the game how close you have to be to the planet in map mode before its name appears + - `isTidallyLocked` makes sure that one side of our planet is always facing timber hearth (the primary body) +- Next, we have `Atmosphere` + - Its `size` is 150, this simply sets how far away from the planet our atmosphere stretches + - Its `fogTint` is set to a color which is an object with r, g, b, and a properties (properties is another word for keys) + - `fogSize` determines how far away the fog stretches from the planet + - `fogDensity` is simply how dense the fog is + - `hasRain` makes rainfall on the planet +- Finally, we have `MapMarker` + - `enabled` tells New Horizons that we want this planet to have a marker on the map screen #### What's a Schema? That `$schema` property is a bit special, it instructs VSCode to use a pre-made schema to provide a better editing experience. With the schema you get: -- Automatic descriptions for properties when hovering over keys -- Automatic error detection for incorrect data types or values -- Autocomplete, also called IntelliSense +- Automatic descriptions for properties when hovering over keys +- Automatic error detection for incorrect data types or values +- Autocomplete, also called IntelliSense The schema we're using here is the [Celestial Body Schema](/schemas/body-schema), but there are many others available in the Schemas section of the left sidebar. @@ -101,18 +104,18 @@ With the new planet created (_and saved!_), launch the game through the mod mana If you run into issues please make sure: -- You placed the JSON file in a folder called `planets` in the New Horizons mod folder -- There are no red or yellow squiggly lines in your file +- You placed the JSON file in a folder called `planets` in the New Horizons mod folder +- There are no red or yellow squiggly lines in your file ## Creating An Addon ### Making a GitHub Repository -To get started, you'll need to fork the [the New Horizons addon template](https://github.com/xen-42/ow-new-horizons-config-template) +To get started, you'll need to click the green "Use This Template" button on [the New Horizons addon template](https://github.com/xen-42/ow-new-horizons-config-template) GitHub repository. -- Set the Name to your username followed by a dot (`.`), followed by your mod's name in PascalCase (no spaces, new words have capital letters). So for example if my username was "Test" and my mod's name was "Really Cool Addon", I would name the repo `Test.ReallyCoolAddon`. -- The description is what will appear in the mod manager under the mod's name, you can always edit this later -- You can set the visibility to what you want; But when you go to publish your mod, it will need to be public +- Set the Name to your username followed by a dot (`.`), followed by your mod's name in PascalCase (no spaces, new words have capital letters). So for example if my username was "Test" and my mod's name was "Really Cool Addon", I would name the repo `Test.ReallyCoolAddon`. +- The description is what will appear in the mod manager under the mod's name, you can always edit this later +- You can set the visibility to what you want; But when you go to publish your mod, it will need to be public ### Open The Project @@ -120,16 +123,16 @@ Now clone the repository to your local computer and open it in your favorite edi ### Project Layout -- .github: This folder contains special files for use on GitHub, they aren't useful right now but will be when we go to publish the mod -- planets: This folder contains a single example config file that destroys the Quantum Moon, we'll keep it for now so we can test our addon later. -- .gitattributes: This is another file that will be useful when publishing -- default-config.json: This file is used in C#-based mods to allow a custom options menu, New Horizons doesn't support a custom options menu, but we still need the file here in order for the addon to work. -- manifest.json: This is the first file we're going to edit, we need to fill it out with information about our mod - - First you're going to set `author` to your author name, this should be the same name that you used when creating the GitHub repo. - - Next, set `name` to the name you want to appear in the mod manager and website. - - Now set `uniqueName` to the name of your GitHub Repo. - - You can leave `version`, `owmlVersion`, and `dependencies` alone -- NewHorizonsConfig.dll: This is the heart of your addon, make sure to never move or rename it. +- .github: This folder contains special files for use on GitHub, they aren't useful right now but will be when we go to publish the mod +- planets: This folder contains a single example config file that destroys the Quantum Moon, we'll keep it for now so we can test our addon later. +- .gitattributes: This is another file that will be useful when publishing +- default-config.json: This file is used in C#-based mods to allow a custom options menu, New Horizons doesn't support a custom options menu, but we still need the file here in order for the addon to work. +- manifest.json: This is the first file we're going to edit, we need to fill it out with information about our mod + - First you're going to set `author` to your author name, this should be the same name that you used when creating the GitHub repo. + - Next, set `name` to the name you want to appear in the mod manager and website. + - Now set `uniqueName` to the name of your GitHub Repo. + - You can leave `version`, `owmlVersion`, and `dependencies` alone +- NewHorizonsConfig.dll: This is the heart of your addon, make sure to never move or rename it. ### Testing The Addon diff --git a/docs/src/content/docs/start-here/helpful-resources.md b/docs/src/content/docs/start-here/helpful-resources.md index a2642049e..0ca13791a 100644 --- a/docs/src/content/docs/start-here/helpful-resources.md +++ b/docs/src/content/docs/start-here/helpful-resources.md @@ -51,18 +51,18 @@ rectangular-to-polar coordinate transformation, useful for fixing abnormalities These mods are useful when developing your addon -- [Unity Explorer](https://outerwildsmods.com/mods/unityexplorer) - Used to find the paths of game objects for copying and can be used to manually position props, ship log entries, and more. -- [Collider Visualizer](https://outerwildsmods.com/mods/collidervisualizer) - Useful when creating dialogue triggers or reveal volumes. -- [Save Editor](https://outerwildsmods.com/mods/saveeditor) - Useful when creating a custom [ship log](/ship-log), can be used to reveal all custom facts so you can see them in the ship's computer. -- [Time Saver](https://outerwildsmods.com/mods/timesaver/) - Lets you skip some repeated cutscenes and get into the game faster. -- [The Examples Mod](https://github.com/Outer-Wilds-New-Horizons/nh-examples) - A mod that contains examples of how to use New Horizons features. +- [Unity Explorer](https://outerwildsmods.com/mods/unityexplorer) - Used to find the paths of game objects for copying and can be used to manually position props, ship log entries, and more. +- [Collider Visualizer](https://outerwildsmods.com/mods/collidervisualizer) - Useful when creating dialogue triggers or reveal volumes. +- [Save Editor](https://outerwildsmods.com/mods/saveeditor) - Useful when creating a custom [ship log](/ship-log), can be used to reveal all custom facts so you can see them in the ship's computer. +- [Time Saver](https://outerwildsmods.com/mods/timesaver/) - Lets you skip some repeated cutscenes and get into the game faster. +- [The Examples Mod](https://github.com/Outer-Wilds-New-Horizons/nh-examples) - A mod that contains examples of how to use New Horizons features. ## Helpful Tools These tools/references are highly recommended -- [VSCode](https://code.visualstudio.com/) -- [VSCode XML Addon](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-xml) -- [XML Basics Tutorial](https://www.w3schools.com/xml/xml_whatis.asp) -- [JSON Basics Tutorial](https://www.tutorialspoint.com/json/index.htm) -- [OWML Docs](https://owml.outerwildsmods.com/) +- [VSCode](https://code.visualstudio.com/) +- [VSCode XML Addon](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-xml) +- [XML Basics Tutorial](https://www.w3schools.com/xml/xml_whatis.asp) +- [JSON Basics Tutorial](https://www.tutorialspoint.com/json/index.htm) +- [OWML Docs](https://owml.outerwildsmods.com/) diff --git a/docs/src/util/schema_generator.ts b/docs/src/util/schema_generator.ts index 18a2290f8..38b761571 100644 --- a/docs/src/util/schema_generator.ts +++ b/docs/src/util/schema_generator.ts @@ -5,7 +5,9 @@ const addFrontmatter = ( content: string, frontmatter: Record ) => { - const entries = Object.entries(frontmatter).map(([key, value]) => `${key}: ${value}`); + const entries = Object.entries(frontmatter).map( + ([key, value]) => `${key}: ${JSON.stringify(value)}` + ); if (entries.length === 0) { return content;