~starkingdoms/starkingdoms

be75d71e7c4cecff17ed7b798195aede26ed8ead — core 7 days ago 98e54c6
Revert "feat: removed replicon + clientbound messages implemented, but untested"

This reverts commit 5ccd4fb282fe3858f302b284a4d985d590ac79a4.
M Cargo.lock => Cargo.lock +85 -60
@@ 113,6 113,23 @@ dependencies = [
]

[[package]]
name = "aeronet_replicon"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3660e988e020e887f8e623e99eb8f0945e772ae0e35c4032026b5f73a40f0a3"
dependencies = [
 "aeronet_io",
 "aeronet_transport",
 "bevy_app",
 "bevy_ecs",
 "bevy_platform",
 "bevy_reflect",
 "bevy_replicon",
 "bevy_state",
 "log",
]

[[package]]
name = "aeronet_transport"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 399,15 416,6 @@ dependencies = [
]

[[package]]
name = "atomic-polyfill"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4"
dependencies = [
 "critical-section",
]

[[package]]
name = "atomic-waker"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 1245,7 1253,7 @@ dependencies = [
 "portable-atomic",
 "portable-atomic-util",
 "serde",
 "spin 0.10.0",
 "spin",
 "wasm-bindgen",
 "wasm-bindgen-futures",
 "web-time 1.1.0",


@@ 1392,6 1400,27 @@ dependencies = [
]

[[package]]
name = "bevy_replicon"
version = "0.39.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a0d6f7d37938f1f6797950774a41adc189a459d73cffb1941804a5d9d8fd059"
dependencies = [
 "bevy",
 "bitflags 2.11.1",
 "bumpalo",
 "bytes",
 "deterministic-hash",
 "log",
 "petgraph",
 "postcard",
 "serde",
 "smallbitvec",
 "typeid",
 "variadics_please",
 "xxhash-rust",
]

[[package]]
name = "bevy_scene"
version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 1529,7 1558,7 @@ dependencies = [
 "crossbeam-queue",
 "derive_more",
 "futures-lite",
 "heapless 0.9.2",
 "heapless",
 "pin-project",
]



@@ 2520,6 2549,12 @@ dependencies = [
]

[[package]]
name = "deterministic-hash"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11277822c27bde750de02c5dc5159b91e88bf2661a2c1d98106f2fb1c5c6f590"

[[package]]
name = "digest"
version = "0.10.7"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 2699,18 2734,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"

[[package]]
name = "embedded-io"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced"

[[package]]
name = "embedded-io"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d"

[[package]]
name = "ena"
version = "0.14.4"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 3365,15 3388,6 @@ dependencies = [

[[package]]
name = "hash32"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67"
dependencies = [
 "byteorder",
]

[[package]]
name = "hash32"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606"


@@ 3411,25 3425,11 @@ checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51"

[[package]]
name = "heapless"
version = "0.7.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f"
dependencies = [
 "atomic-polyfill",
 "hash32 0.2.1",
 "rustc_version",
 "serde",
 "spin 0.9.8",
 "stable_deref_trait",
]

[[package]]
name = "heapless"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2af2455f757db2b292a9b1768c4b70186d443bcb3b316252d6b540aec1cd89ed"
dependencies = [
 "hash32 0.3.1",
 "hash32",
 "portable-atomic",
 "stable_deref_trait",
]


@@ 4610,6 4610,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"

[[package]]
name = "petgraph"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455"
dependencies = [
 "fixedbitset",
 "hashbrown 0.15.5",
 "indexmap",
 "serde",
]

[[package]]
name = "pico-args"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 4741,13 4753,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24"
dependencies = [
 "cobs",
 "embedded-io 0.4.0",
 "embedded-io 0.6.1",
 "heapless 0.7.17",
 "postcard-derive",
 "serde",
]

[[package]]
name = "postcard-derive"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0232bd009a197ceec9cc881ba46f727fcd8060a2d8d6a9dde7a69030a6fe2bb"
dependencies = [
 "proc-macro2",
 "quote",
 "syn 2.0.117",
]

[[package]]
name = "powerfmt"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 5527,6 5548,12 @@ dependencies = [
]

[[package]]
name = "smallbitvec"
version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b0e903ee191d8f7a8fbf0d712c3a1699d19e04ceba5ad1eb673053c7d938a09"

[[package]]
name = "smallvec"
version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 5594,15 5621,6 @@ dependencies = [

[[package]]
name = "spin"
version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
dependencies = [
 "lock_api",
]

[[package]]
name = "spin"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591"


@@ 5639,18 5657,19 @@ name = "starkingdoms"
version = "0.1.0"
dependencies = [
 "aeronet",
 "aeronet_replicon",
 "aeronet_transport",
 "aeronet_websocket",
 "avian2d",
 "bevy",
 "bevy_common_assets",
 "bevy_replicon",
 "console_error_panic_hook",
 "ctrlc",
 "getrandom 0.4.2",
 "good_lp",
 "leafwing-input-manager",
 "pico-args",
 "postcard",
 "rand 0.10.1",
 "serde",
 "tracing-subscriber",


@@ 7448,6 7467,12 @@ dependencies = [
]

[[package]]
name = "xxhash-rust"
version = "0.8.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3"

[[package]]
name = "yasna"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"

M Cargo.toml => Cargo.toml +1 -2
@@ 67,7 67,6 @@ aeronet_websocket = { version = "0.20" }
aeronet_transport = { version = "0.20" }
aeronet_replicon = { version = "0.20" }
bevy_replicon = { version = "0.39"}
postcard = { version = "1.1.3", features = ["alloc"] }

[profile.dev]
opt-level = 1


@@ 81,4 80,4 @@ lto = "thin"
[profile.wasm-release]
inherits = "release"
opt-level = "s"
strip = "debuginfo"
strip = "debuginfo"
\ No newline at end of file

M crates/unified/Cargo.toml => crates/unified/Cargo.toml +6 -1
@@ 19,17 19,20 @@ good_lp = { workspace = true }
web-time = { workspace = true }
aeronet = { workspace = true }
aeronet_transport = { workspace = true }
postcard = { workspace = true }

[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
ctrlc = { workspace = true, optional = true }
aeronet_websocket = { workspace = true, features = ["client", "server"] }
aeronet_replicon = { workspace = true, features = ["client", "server"] }
bevy_replicon = { workspace = true, features = ["client", "server"] }

[target.'cfg(target_arch = "wasm32")'.dependencies]
wasm-bindgen = { workspace = true }
tracing-web = { workspace = true }
console_error_panic_hook = { workspace = true }
aeronet_websocket = { workspace = true, features = ["client"] }
aeronet_replicon = { workspace = true, features = ["client"] }
bevy_replicon = { workspace = true, features = ["client"] }

[features]
native_dev = [


@@ 37,6 40,8 @@ native_dev = [
    "bevy/hotpatching",
    "bevy/dynamic_linking",
    "native",
    "aeronet_replicon/server",
    "bevy_replicon/server"
]
native = [
    "bevy/x11",

M crates/unified/src/client/mod.rs => crates/unified/src/client/mod.rs +2 -2
@@ 1,6 1,6 @@
use aeronet::io::{Session, SessionEndpoint};
use aeronet::io::connection::{DisconnectReason, Disconnected};
//use aeronet_replicon::client::AeronetRepliconClient;
use aeronet_replicon::client::AeronetRepliconClient;
use aeronet_transport::{Transport, TransportConfig};
use aeronet_websocket::client::{ClientConfig, WebSocketClient};
use crate::client::crafting::ui::crafting_ui_plugin;


@@ 75,7 75,7 @@ impl Plugin for ClientPlugin {
            #[cfg(not(target_arch = "wasm32"))]
            let config = ClientConfig::builder().with_no_cert_validation();
            let Some(server) = server.as_ref() else { return };
            commands.spawn((Name::new("default-session"), TransportConfig { max_memory_usage: 536_870_912, ..default() }, /*AeronetRepliconClient*/))
            commands.spawn((Name::new("default-session"), TransportConfig { max_memory_usage: 536_870_912, ..default() }, AeronetRepliconClient))
                .queue(
                    WebSocketClient::connect(config, server.clone()));
        });

M crates/unified/src/client/plugins.rs => crates/unified/src/client/plugins.rs +4 -3
@@ 1,3 1,4 @@
use aeronet_replicon::client::AeronetRepliconClientPlugin;
use aeronet_websocket::client::WebSocketClientPlugin;
use bevy::a11y::AccessibilityPlugin;
use crate::client::ClientPlugin;


@@ 33,9 34,9 @@ impl PluginGroup for ClientPluginGroup {
            .add(InputDispatchPlugin)
            .add(InputManagerPlugin::<crate::client::input::ClientAction>::default())
            .add(WebSocketClientPlugin)
            //.add(bevy_replicon::client::ClientPlugin)
            //.add(bevy_replicon::client::message::ClientMessagePlugin)
            //.add(AeronetRepliconClientPlugin)
            .add(bevy_replicon::client::ClientPlugin)
            .add(bevy_replicon::client::message::ClientMessagePlugin)
            .add(AeronetRepliconClientPlugin)
    }
}


M crates/unified/src/server/mod.rs => crates/unified/src/server/mod.rs +8 -8
@@ 17,12 17,12 @@ use std::net::SocketAddr;
use aeronet::io::connection::{DisconnectReason, Disconnected, LocalAddr};
use aeronet::io::server::Server;
use aeronet::io::Session;
//use aeronet_replicon::server::AeronetRepliconServer;
use aeronet_replicon::server::AeronetRepliconServer;
use aeronet_transport::lane::LaneKind;
use aeronet_transport::Transport;
use aeronet_websocket::server::{ServerConfig, WebSocketServer};
//use bevy_replicon::prelude::Replicated;
//use bevy_replicon::server::AuthorizedClient;
use bevy_replicon::prelude::Replicated;
use bevy_replicon::server::AuthorizedClient;
use crate::server::craft::craft_plugin;
use crate::server::damping::damping_plugin;
use crate::server::drill::drill_plugin;


@@ 62,12 62,12 @@ impl Plugin for ServerPlugin {
            .add_observer(on_connected)
            .add_observer(on_disconnected)
            .add_systems(Startup, move |mut commands: Commands| {
                commands.spawn((Name::new("websocket-server"), /*AeronetRepliconServer*/))
                commands.spawn((Name::new("websocket-server"), AeronetRepliconServer))
                    .queue(WebSocketServer::open(ServerConfig::builder()
                        .with_bind_address(bind)
                        .with_no_encryption()));
            });
            //.add_systems(Update, handle_authorized);
            })
            .add_systems(Update, handle_authorized);
    }
}



@@ 100,7 100,7 @@ fn on_connected(
    info!(?client, ?server, "client connected");
}

/*fn handle_authorized(
fn handle_authorized(
    newly_authorized_clients: Query<Entity, Added<AuthorizedClient>>,
    mut commands: Commands
) {


@@ 118,7 118,7 @@ fn on_connected(
            },
        ));
    }
}*/
}
fn on_disconnected(
    trigger: On<Disconnected>,
    clients: Query<&ChildOf>,

M crates/unified/src/server/planets.rs => crates/unified/src/server/planets.rs +2 -2
@@ 1,6 1,6 @@
use crate::server::components::PlanetSensor;
use bevy::{asset::Handle, math::DVec3};
//use bevy_replicon::prelude::Replicated;
use bevy_replicon::prelude::Replicated;
use crate::prelude::*;
use crate::shared::config::planet::{PlanetSpring, PlanetSpringJoint};
use crate::shared::config::planet::{Planet, PlanetBundle, PlanetConfigCollection};


@@ 91,7 91,7 @@ pub fn update_planets(
                                },
                                Transform::from_translation(planet.default_position),
                                RigidBody::Kinematic,
                                //Replicated,
                                Replicated,
                            )).id();
                            commands.spawn((
                                PlanetSpringJoint {

M crates/unified/src/server/player/join.rs => crates/unified/src/server/player/join.rs +3 -2
@@ 1,3 1,4 @@
use bevy_replicon::prelude::{ClientId, SendMode, ToClients};
use crate::client::components::Me;
use crate::shared::config::planet::Planet;
use crate::shared::config::world::GlobalWorldConfig;


@@ 5,7 6,7 @@ use crate::shared::ecs::{Player, PlayerStorage};
use crate::prelude::*;
use crate::server::ConnectedGameEntity;
use crate::server::part::SpawnPartRequest;
use crate::shared::net::{ClientId, Hi, SendTargets, ToClients};
use crate::shared::net::Hi;
use crate::shared::world_config::WorldConfigResource;

const SPAWN_ORBIT_OFFSET: f64 = 150.0;


@@ 82,7 83,7 @@ pub fn handle_new_players(
    for joined_player in &q_new_clients {
        debug!(?joined_player, "new player!");
        welcome_messages.write(ToClients {
            targets: SendTargets::Single(ClientId::Client(joined_player.1.network_entity)),
            mode: SendMode::Direct(ClientId::Client(joined_player.1.network_entity)),
            message: Hi {
                you_are: joined_player.0,
                time_offset: time.elapsed_secs_f64(),

M crates/unified/src/server/plugins.rs => crates/unified/src/server/plugins.rs +4 -0
@@ 1,4 1,5 @@
use std::time::Duration;
use aeronet_replicon::server::AeronetRepliconServerPlugin;
use aeronet_transport::AeronetTransportPlugin;
use aeronet_websocket::server::WebSocketServerPlugin;
use bevy::app::{PluginGroup, PluginGroupBuilder, ScheduleRunnerPlugin};


@@ 11,5 12,8 @@ impl PluginGroup for ServerPluginGroup {
        PluginGroupBuilder::start::<Self>()
            .add(ScheduleRunnerPlugin::run_loop(Duration::from_secs_f64(1.0 / TICK_RATE)))
            .add(WebSocketServerPlugin)
            .add(bevy_replicon::server::ServerPlugin::default())
            .add(bevy_replicon::server::message::ServerMessagePlugin)
            .add(AeronetRepliconServerPlugin)
    }
}

M crates/unified/src/server/visibility.rs => crates/unified/src/server/visibility.rs +1 -1
@@ 1,3 1,3 @@
//use bevy_replicon::prelude::VisibilityFilter;
use bevy_replicon::prelude::VisibilityFilter;
use crate::prelude::*;


M crates/unified/src/shared/config/planet.rs => crates/unified/src/shared/config/planet.rs +2 -2
@@ 2,12 2,12 @@ use bevy::asset::Asset;
use bevy::color::Color;
use crate::prelude::*;
use serde::{Deserialize, Serialize};
//use bevy_replicon::prelude::Replicated;
use bevy_replicon::prelude::Replicated;

#[derive(Deserialize, Asset, TypePath, Component, Serialize, Clone, Debug)]
#[require(
    RigidBody::Dynamic,
    //Replicated
    Replicated
)]
pub struct Planet {
    pub name: String,

M crates/unified/src/shared/ecs.rs => crates/unified/src/shared/ecs.rs +2 -2
@@ 7,7 7,7 @@ use crate::prelude::*;
use avian2d::prelude::*;
use std::collections::HashMap;
use std::sync::LazyLock;
//use bevy_replicon::prelude::Replicated;
use bevy_replicon::prelude::Replicated;

#[derive(States, Debug, Clone, PartialEq, Eq, Hash)]
pub enum GameplayState {


@@ 28,7 28,7 @@ pub const ORBIT_LAYER: RenderLayers = RenderLayers::layer(2);
    LinearVelocity,
    AngularVelocity,
    ConstantForce,
    //Replicated
    Replicated
)]
pub struct Part {
    pub config: PartConfig,

M crates/unified/src/shared/net.rs => crates/unified/src/shared/net.rs +3 -131
@@ 1,26 1,15 @@
use std::collections::HashMap;
use std::sync::OnceLock;
use std::sync::atomic::{AtomicU32, AtomicUsize, Ordering};
use std::time::Instant;

use aeronet_transport::Transport;
use aeronet_transport::lane::LaneIndex;
use aeronet_websocket::tungstenite::Bytes;
use avian2d::prelude::{AngularInertia, AngularVelocity, Collider, LinearVelocity, Mass, Position, Rotation};
use bevy::ecs::entity::MapEntities;
use bevy::ecs::system::SystemState;
use bevy::prelude::*;
use postcard::{from_bytes, to_allocvec, to_slice, to_vec};
use crate::prelude::{App, Message};
//use bevy_replicon::prelude::*;
use bevy_replicon::prelude::*;
use serde::{Deserialize, Serialize};
use crate::shared::attachment::{Joint, JointOf, PartInShip, Peer, Ship, SnapOf, SnapOfJoint};
use crate::shared::config::planet::{Planet, PlanetSpring, PlanetSpringJoint};
use crate::shared::ecs::{CanCraft, Drill, Part, Player, PlayerStorage, SingleStorage, Temperature};
use crate::shared::ecs::thruster::{Thruster, ThrusterOfPart};


/*pub fn register_replication(app: &mut App) {
pub fn register_replication(app: &mut App) {
    app
        .add_mapped_server_message::<Hi>(Channel::Ordered)



@@ 56,128 45,11 @@ use crate::shared::ecs::thruster::{Thruster, ThrusterOfPart};
        .replicate::<SingleStorage>()
        .replicate::<PlanetSpring>()
        .replicate::<PlanetSpringJoint>();
}*/

pub fn register_net(app: &mut App) {
    /*app
        .add_message::<ToClients<Hi>>()
        .add_message::<Hi>()
        .add_systems(Update, send_hi_to_client);*/
}
pub fn setup_net(app: &mut App) {
    app.insert_resource(MessageRegistry::default());
    app.add_systems(PostUpdate, recv_from_server);
}

#[derive(Message, Deserialize, Serialize, TypePath, MapEntities)]
#[derive(Message, Deserialize, Serialize, MapEntities)]
pub struct Hi {
    #[entities]
    pub you_are: Entity,
    pub time_offset: f64,
}

#[derive(Message, Deref, Deserialize, Serialize)]
pub struct ToClients<T: Message + TypePath> {
    #[deref]
    pub message: T,
    pub targets: SendTargets,
}

#[derive(Deserialize, Serialize)]
pub enum SendTargets {
    All,
    Single(ClientId),
}

#[derive(Deserialize, Serialize)]
pub enum ClientId {
    Server,
    Client(Entity),
}

#[derive(Resource, Default)]
pub struct MessageRegistry {
    forward: HashMap<String, LaneIndex>,
    reverse: HashMap<LaneIndex, fn(Vec<u8>, &mut World)>,
}

static COUNTER: AtomicU32 = AtomicU32::new(0);
fn get_lane_index() -> LaneIndex {
    LaneIndex::new(COUNTER.fetch_add(1, Ordering::Relaxed))
}

pub trait NetAppExt {
    fn add_server_message<T: Clone + Message + TypePath + Serialize + for<'a> Deserialize<'a>>(&mut self) -> &mut Self;
}
impl NetAppExt for App {
    fn add_server_message<T: Clone + Message + TypePath + Serialize + for<'a> Deserialize<'a>>(&mut self) -> &mut Self {
        self
            .add_message::<ToClients<T>>()
            .add_message::<T>()
            .add_systems(Startup, register_message::<T>)
            .add_systems(Update, send_to_client::<T>)
    }
}
fn register_message<T: Message + TypePath + for<'a> Deserialize<'a>>(mut registry: ResMut<MessageRegistry>) {
    registry.forward.insert(T::type_path().to_string(), get_lane_index());
    registry.reverse.insert(get_lane_index(), |payload: Vec<u8>, world: &mut World| {
        let message = from_bytes::<T>(&payload).expect(&format!("Failed to deserialize message of type {}", T::type_path()));
        world.write_message(message).expect("Could not send message to game");
    });
}

fn send_to_client<M: Clone + Message + TypePath + Serialize>(
    mut messages: MessageReader<ToClients<M>>,
    mut clients: Query<(Entity, &mut Transport), With<ChildOf>>,
    message_registry: Res<MessageRegistry>,
) {
    for message in messages.read() {
        match &message.targets {
            SendTargets::All => {
                for (client_entity, mut transport) in &mut clients {
                    transport.send.push(
                        *message_registry.forward.get(M::type_path())
                            .expect("Failed to get message lane; the message likely isn't serialized yet"),
                        to_allocvec(&message).expect("Failed to serialize message").into(),
                        Instant::now(),
                    ).expect("Failed to send message");
                }
            }
            SendTargets::Single(client) => {
                for (client_entity, mut transport) in &mut clients {
                    if let ClientId::Client(client) = client && client_entity == *client {
                        transport.send.push(
                            *message_registry.forward.get(M::type_path())
                                .expect("Failed to get message lane; the message likely isn't serialized yet"),
                            to_allocvec(&message).expect("Failed to serialize message").into(),
                            Instant::now(),
                        ).expect("Failed to send message");
                    }
                }
            }
        }
    }
}
fn recv_from_server(
    world: &mut World
) {
    let mut system_state: SystemState<(
        Query<&mut Transport, Without<ChildOf>>,
        Res<MessageRegistry>,
    )> = SystemState::new(world);
    let (mut sessions, message_registry) = system_state.get_mut(world);
    let mut messages = Vec::new();
    for mut transport in sessions.iter_mut() {
        for message in transport.recv.msgs.drain() {
            let payload = message.payload;
            let message_fn = message_registry.reverse.get(&message.lane).expect("Packet was sent across a lane that didn't have a message assigned to it yet");
            messages.push((*message_fn, payload));
        }
        for _ in transport.recv.acks.drain() {

        }
    }
    for (message_fn, payload) in messages {
        message_fn(payload, world);
    }
}

M crates/unified/src/shared/plugins.rs => crates/unified/src/shared/plugins.rs +4 -5
@@ 1,17 1,17 @@
use aeronet_transport::AeronetTransportPlugin;
use crate::shared::ecs::{CraftPartRequest, DragRequestEvent, TimeOffset, ToggleDrillEvent};
use crate::shared::net::register_net;
use crate::shared::thrust::ThrustSolution;
use bevy::app::{App, PluginGroup, PluginGroupBuilder};
use bevy::diagnostic::DiagnosticsPlugin;
use bevy::state::app::StatesPlugin;
use bevy_common_assets::toml::TomlAssetPlugin;
use bevy_replicon::RepliconPlugins;
use crate::prelude::*;
use crate::shared::config::part::PartConfig;
use crate::shared::config::planet::PlanetConfigCollection;
use crate::shared::config::recipe::RecipesConfig;
use crate::shared::config::world::GlobalWorldConfig;
//use crate::shared::net::register_replication;
use crate::shared::net::register_replication;
use crate::shared::world_config::world_config_plugin;

pub const TICK_RATE: f64 = 20.0;


@@ 24,12 24,12 @@ impl PluginGroup for SharedPluginGroup {
        PluginGroupBuilder::start::<Self>()
            .add(AssetPlugin::default())
            .add(StatesPlugin)
            .add(bevy_replicon::shared::RepliconSharedPlugin::default())
            .add(TransformPlugin)
            .add(DiagnosticsPlugin)
            .add(AeronetTransportPlugin)
            .add(|app: &mut App| {
                app.insert_resource(Time::from_hz(TICK_RATE));
                app.insert_resource(Time::<Physics>::default().with_relative_speed(1.0));
                app.insert_resource(TimeOffset::default());
            })
            .add_group(


@@ 40,9 40,8 @@ impl PluginGroup for SharedPluginGroup {
                    .disable::<IslandPlugin>()
            )
            .add(physics_setup_plugin)
            //.add(register_replication)
            .add(register_replication)
            .add(register_everything)
            .add(register_net)
            .add(world_config_plugin)

            /* Assets */

D web/package-lock.json => web/package-lock.json +0 -1744
@@ 1,1744 0,0 @@
{
	"name": "web",
	"version": "0.0.1",
	"lockfileVersion": 3,
	"requires": true,
	"packages": {
		"": {
			"name": "web",
			"version": "0.0.1",
			"devDependencies": {
				"@sveltejs/adapter-auto": "^7.0.1",
				"@sveltejs/kit": "^2.57.0",
				"@sveltejs/vite-plugin-svelte": "^7.0.0",
				"@tailwindcss/vite": "^4.2.2",
				"svelte": "^5.55.2",
				"svelte-check": "^4.4.6",
				"tailwindcss": "^4.2.2",
				"typescript": "^6.0.2",
				"vite": "^8.0.7"
			}
		},
		"node_modules/@emnapi/core": {
			"version": "1.10.0",
			"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
			"integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
			"dev": true,
			"license": "MIT",
			"optional": true,
			"dependencies": {
				"@emnapi/wasi-threads": "1.2.1",
				"tslib": "^2.4.0"
			}
		},
		"node_modules/@emnapi/runtime": {
			"version": "1.10.0",
			"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
			"integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
			"dev": true,
			"license": "MIT",
			"optional": true,
			"dependencies": {
				"tslib": "^2.4.0"
			}
		},
		"node_modules/@emnapi/wasi-threads": {
			"version": "1.2.1",
			"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
			"integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
			"dev": true,
			"license": "MIT",
			"optional": true,
			"dependencies": {
				"tslib": "^2.4.0"
			}
		},
		"node_modules/@jridgewell/gen-mapping": {
			"version": "0.3.13",
			"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
			"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"@jridgewell/sourcemap-codec": "^1.5.0",
				"@jridgewell/trace-mapping": "^0.3.24"
			}
		},
		"node_modules/@jridgewell/remapping": {
			"version": "2.3.5",
			"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
			"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"@jridgewell/gen-mapping": "^0.3.5",
				"@jridgewell/trace-mapping": "^0.3.24"
			}
		},
		"node_modules/@jridgewell/resolve-uri": {
			"version": "3.1.2",
			"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
			"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
			"dev": true,
			"license": "MIT",
			"engines": {
				"node": ">=6.0.0"
			}
		},
		"node_modules/@jridgewell/sourcemap-codec": {
			"version": "1.5.5",
			"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
			"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
			"dev": true,
			"license": "MIT"
		},
		"node_modules/@jridgewell/trace-mapping": {
			"version": "0.3.31",
			"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
			"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"@jridgewell/resolve-uri": "^3.1.0",
				"@jridgewell/sourcemap-codec": "^1.4.14"
			}
		},
		"node_modules/@napi-rs/wasm-runtime": {
			"version": "1.1.4",
			"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz",
			"integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==",
			"dev": true,
			"license": "MIT",
			"optional": true,
			"dependencies": {
				"@tybys/wasm-util": "^0.10.1"
			},
			"funding": {
				"type": "github",
				"url": "https://github.com/sponsors/Brooooooklyn"
			},
			"peerDependencies": {
				"@emnapi/core": "^1.7.1",
				"@emnapi/runtime": "^1.7.1"
			}
		},
		"node_modules/@oxc-project/types": {
			"version": "0.127.0",
			"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz",
			"integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==",
			"dev": true,
			"license": "MIT",
			"funding": {
				"url": "https://github.com/sponsors/Boshen"
			}
		},
		"node_modules/@polka/url": {
			"version": "1.0.0-next.29",
			"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
			"integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==",
			"dev": true,
			"license": "MIT"
		},
		"node_modules/@rolldown/binding-android-arm64": {
			"version": "1.0.0-rc.17",
			"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz",
			"integrity": "sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==",
			"cpu": [
				"arm64"
			],
			"dev": true,
			"license": "MIT",
			"optional": true,
			"os": [
				"android"
			],
			"engines": {
				"node": "^20.19.0 || >=22.12.0"
			}
		},
		"node_modules/@rolldown/binding-darwin-arm64": {
			"version": "1.0.0-rc.17",
			"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.17.tgz",
			"integrity": "sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==",
			"cpu": [
				"arm64"
			],
			"dev": true,
			"license": "MIT",
			"optional": true,
			"os": [
				"darwin"
			],
			"engines": {
				"node": "^20.19.0 || >=22.12.0"
			}
		},
		"node_modules/@rolldown/binding-darwin-x64": {
			"version": "1.0.0-rc.17",
			"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.17.tgz",
			"integrity": "sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==",
			"cpu": [
				"x64"
			],
			"dev": true,
			"license": "MIT",
			"optional": true,
			"os": [
				"darwin"
			],
			"engines": {
				"node": "^20.19.0 || >=22.12.0"
			}
		},
		"node_modules/@rolldown/binding-freebsd-x64": {
			"version": "1.0.0-rc.17",
			"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.17.tgz",
			"integrity": "sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==",
			"cpu": [
				"x64"
			],
			"dev": true,
			"license": "MIT",
			"optional": true,
			"os": [
				"freebsd"
			],
			"engines": {
				"node": "^20.19.0 || >=22.12.0"
			}
		},
		"node_modules/@rolldown/binding-linux-arm-gnueabihf": {
			"version": "1.0.0-rc.17",
			"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.17.tgz",
			"integrity": "sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==",
			"cpu": [
				"arm"
			],
			"dev": true,
			"license": "MIT",
			"optional": true,
			"os": [
				"linux"
			],
			"engines": {
				"node": "^20.19.0 || >=22.12.0"
			}
		},
		"node_modules/@rolldown/binding-linux-arm64-gnu": {
			"version": "1.0.0-rc.17",
			"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.17.tgz",
			"integrity": "sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==",
			"cpu": [
				"arm64"
			],
			"dev": true,
			"libc": [
				"glibc"
			],
			"license": "MIT",
			"optional": true,
			"os": [
				"linux"
			],
			"engines": {
				"node": "^20.19.0 || >=22.12.0"
			}
		},
		"node_modules/@rolldown/binding-linux-arm64-musl": {
			"version": "1.0.0-rc.17",
			"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.17.tgz",
			"integrity": "sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==",
			"cpu": [
				"arm64"
			],
			"dev": true,
			"libc": [
				"musl"
			],
			"license": "MIT",
			"optional": true,
			"os": [
				"linux"
			],
			"engines": {
				"node": "^20.19.0 || >=22.12.0"
			}
		},
		"node_modules/@rolldown/binding-linux-ppc64-gnu": {
			"version": "1.0.0-rc.17",
			"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.17.tgz",
			"integrity": "sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==",
			"cpu": [
				"ppc64"
			],
			"dev": true,
			"libc": [
				"glibc"
			],
			"license": "MIT",
			"optional": true,
			"os": [
				"linux"
			],
			"engines": {
				"node": "^20.19.0 || >=22.12.0"
			}
		},
		"node_modules/@rolldown/binding-linux-s390x-gnu": {
			"version": "1.0.0-rc.17",
			"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.17.tgz",
			"integrity": "sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==",
			"cpu": [
				"s390x"
			],
			"dev": true,
			"libc": [
				"glibc"
			],
			"license": "MIT",
			"optional": true,
			"os": [
				"linux"
			],
			"engines": {
				"node": "^20.19.0 || >=22.12.0"
			}
		},
		"node_modules/@rolldown/binding-linux-x64-gnu": {
			"version": "1.0.0-rc.17",
			"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.17.tgz",
			"integrity": "sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==",
			"cpu": [
				"x64"
			],
			"dev": true,
			"libc": [
				"glibc"
			],
			"license": "MIT",
			"optional": true,
			"os": [
				"linux"
			],
			"engines": {
				"node": "^20.19.0 || >=22.12.0"
			}
		},
		"node_modules/@rolldown/binding-linux-x64-musl": {
			"version": "1.0.0-rc.17",
			"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.17.tgz",
			"integrity": "sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==",
			"cpu": [
				"x64"
			],
			"dev": true,
			"libc": [
				"musl"
			],
			"license": "MIT",
			"optional": true,
			"os": [
				"linux"
			],
			"engines": {
				"node": "^20.19.0 || >=22.12.0"
			}
		},
		"node_modules/@rolldown/binding-openharmony-arm64": {
			"version": "1.0.0-rc.17",
			"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.17.tgz",
			"integrity": "sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==",
			"cpu": [
				"arm64"
			],
			"dev": true,
			"license": "MIT",
			"optional": true,
			"os": [
				"openharmony"
			],
			"engines": {
				"node": "^20.19.0 || >=22.12.0"
			}
		},
		"node_modules/@rolldown/binding-wasm32-wasi": {
			"version": "1.0.0-rc.17",
			"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.17.tgz",
			"integrity": "sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==",
			"cpu": [
				"wasm32"
			],
			"dev": true,
			"license": "MIT",
			"optional": true,
			"dependencies": {
				"@emnapi/core": "1.10.0",
				"@emnapi/runtime": "1.10.0",
				"@napi-rs/wasm-runtime": "^1.1.4"
			},
			"engines": {
				"node": "^20.19.0 || >=22.12.0"
			}
		},
		"node_modules/@rolldown/binding-win32-arm64-msvc": {
			"version": "1.0.0-rc.17",
			"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.17.tgz",
			"integrity": "sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==",
			"cpu": [
				"arm64"
			],
			"dev": true,
			"license": "MIT",
			"optional": true,
			"os": [
				"win32"
			],
			"engines": {
				"node": "^20.19.0 || >=22.12.0"
			}
		},
		"node_modules/@rolldown/binding-win32-x64-msvc": {
			"version": "1.0.0-rc.17",
			"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.17.tgz",
			"integrity": "sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==",
			"cpu": [
				"x64"
			],
			"dev": true,
			"license": "MIT",
			"optional": true,
			"os": [
				"win32"
			],
			"engines": {
				"node": "^20.19.0 || >=22.12.0"
			}
		},
		"node_modules/@rolldown/pluginutils": {
			"version": "1.0.0-rc.17",
			"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.17.tgz",
			"integrity": "sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==",
			"dev": true,
			"license": "MIT"
		},
		"node_modules/@standard-schema/spec": {
			"version": "1.1.0",
			"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
			"integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
			"dev": true,
			"license": "MIT"
		},
		"node_modules/@sveltejs/acorn-typescript": {
			"version": "1.0.9",
			"resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz",
			"integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==",
			"dev": true,
			"license": "MIT",
			"peerDependencies": {
				"acorn": "^8.9.0"
			}
		},
		"node_modules/@sveltejs/adapter-auto": {
			"version": "7.0.1",
			"resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-7.0.1.tgz",
			"integrity": "sha512-dvuPm1E7M9NI/+canIQ6KKQDU2AkEefEZ2Dp7cY6uKoPq9Z/PhOXABe526UdW2mN986gjVkuSLkOYIBnS/M2LQ==",
			"dev": true,
			"license": "MIT",
			"peerDependencies": {
				"@sveltejs/kit": "^2.0.0"
			}
		},
		"node_modules/@sveltejs/kit": {
			"version": "2.58.0",
			"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.58.0.tgz",
			"integrity": "sha512-kT9GCN8yJTkCK1W+Gi/bvGooWAM7y7WXP+yd+rf6QOIjyoK1ERPrMwSufXJUNu2pMWIqruhFvmz+LbOqsEmKmA==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"@standard-schema/spec": "^1.0.0",
				"@sveltejs/acorn-typescript": "^1.0.5",
				"@types/cookie": "^0.6.0",
				"acorn": "^8.14.1",
				"cookie": "^0.6.0",
				"devalue": "^5.6.4",
				"esm-env": "^1.2.2",
				"kleur": "^4.1.5",
				"magic-string": "^0.30.5",
				"mrmime": "^2.0.0",
				"set-cookie-parser": "^3.0.0",
				"sirv": "^3.0.0"
			},
			"bin": {
				"svelte-kit": "svelte-kit.js"
			},
			"engines": {
				"node": ">=18.13"
			},
			"peerDependencies": {
				"@opentelemetry/api": "^1.0.0",
				"@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0",
				"svelte": "^4.0.0 || ^5.0.0-next.0",
				"typescript": "^5.3.3 || ^6.0.0",
				"vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0"
			},
			"peerDependenciesMeta": {
				"@opentelemetry/api": {
					"optional": true
				},
				"typescript": {
					"optional": true
				}
			}
		},
		"node_modules/@sveltejs/vite-plugin-svelte": {
			"version": "7.0.0",
			"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-7.0.0.tgz",
			"integrity": "sha512-ILXmxC7HAsnkK2eslgPetrqqW1BKSL7LktsFgqzNj83MaivMGZzluWq32m25j2mDOjmSKX7GGWahePhuEs7P/g==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"deepmerge": "^4.3.1",
				"magic-string": "^0.30.21",
				"obug": "^2.1.0",
				"vitefu": "^1.1.2"
			},
			"engines": {
				"node": "^20.19 || ^22.12 || >=24"
			},
			"peerDependencies": {
				"svelte": "^5.46.4",
				"vite": "^8.0.0-beta.7 || ^8.0.0"
			}
		},
		"node_modules/@tailwindcss/node": {
			"version": "4.2.4",
			"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz",
			"integrity": "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"@jridgewell/remapping": "^2.3.5",
				"enhanced-resolve": "^5.19.0",
				"jiti": "^2.6.1",
				"lightningcss": "1.32.0",
				"magic-string": "^0.30.21",
				"source-map-js": "^1.2.1",
				"tailwindcss": "4.2.4"
			}
		},
		"node_modules/@tailwindcss/oxide": {
			"version": "4.2.4",
			"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.4.tgz",
			"integrity": "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==",
			"dev": true,
			"license": "MIT",
			"engines": {
				"node": ">= 20"
			},
			"optionalDependencies": {
				"@tailwindcss/oxide-android-arm64": "4.2.4",
				"@tailwindcss/oxide-darwin-arm64": "4.2.4",
				"@tailwindcss/oxide-darwin-x64": "4.2.4",
				"@tailwindcss/oxide-freebsd-x64": "4.2.4",
				"@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4",
				"@tailwindcss/oxide-linux-arm64-gnu": "4.2.4",
				"@tailwindcss/oxide-linux-arm64-musl": "4.2.4",
				"@tailwindcss/oxide-linux-x64-gnu": "4.2.4",
				"@tailwindcss/oxide-linux-x64-musl": "4.2.4",
				"@tailwindcss/oxide-wasm32-wasi": "4.2.4",
				"@tailwindcss/oxide-win32-arm64-msvc": "4.2.4",
				"@tailwindcss/oxide-win32-x64-msvc": "4.2.4"
			}
		},
		"node_modules/@tailwindcss/oxide-android-arm64": {
			"version": "4.2.4",
			"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.4.tgz",
			"integrity": "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==",
			"cpu": [
				"arm64"
			],
			"dev": true,
			"license": "MIT",
			"optional": true,
			"os": [
				"android"
			],
			"engines": {
				"node": ">= 20"
			}
		},
		"node_modules/@tailwindcss/oxide-darwin-arm64": {
			"version": "4.2.4",
			"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.4.tgz",
			"integrity": "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==",
			"cpu": [
				"arm64"
			],
			"dev": true,
			"license": "MIT",
			"optional": true,
			"os": [
				"darwin"
			],
			"engines": {
				"node": ">= 20"
			}
		},
		"node_modules/@tailwindcss/oxide-darwin-x64": {
			"version": "4.2.4",
			"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.4.tgz",
			"integrity": "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==",
			"cpu": [
				"x64"
			],
			"dev": true,
			"license": "MIT",
			"optional": true,
			"os": [
				"darwin"
			],
			"engines": {
				"node": ">= 20"
			}
		},
		"node_modules/@tailwindcss/oxide-freebsd-x64": {
			"version": "4.2.4",
			"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.4.tgz",
			"integrity": "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==",
			"cpu": [
				"x64"
			],
			"dev": true,
			"license": "MIT",
			"optional": true,
			"os": [
				"freebsd"
			],
			"engines": {
				"node": ">= 20"
			}
		},
		"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
			"version": "4.2.4",
			"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.4.tgz",
			"integrity": "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==",
			"cpu": [
				"arm"
			],
			"dev": true,
			"license": "MIT",
			"optional": true,
			"os": [
				"linux"
			],
			"engines": {
				"node": ">= 20"
			}
		},
		"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
			"version": "4.2.4",
			"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.4.tgz",
			"integrity": "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==",
			"cpu": [
				"arm64"
			],
			"dev": true,
			"libc": [
				"glibc"
			],
			"license": "MIT",
			"optional": true,
			"os": [
				"linux"
			],
			"engines": {
				"node": ">= 20"
			}
		},
		"node_modules/@tailwindcss/oxide-linux-arm64-musl": {
			"version": "4.2.4",
			"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.4.tgz",
			"integrity": "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==",
			"cpu": [
				"arm64"
			],
			"dev": true,
			"libc": [
				"musl"
			],
			"license": "MIT",
			"optional": true,
			"os": [
				"linux"
			],
			"engines": {
				"node": ">= 20"
			}
		},
		"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
			"version": "4.2.4",
			"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.4.tgz",
			"integrity": "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==",
			"cpu": [
				"x64"
			],
			"dev": true,
			"libc": [
				"glibc"
			],
			"license": "MIT",
			"optional": true,
			"os": [
				"linux"
			],
			"engines": {
				"node": ">= 20"
			}
		},
		"node_modules/@tailwindcss/oxide-linux-x64-musl": {
			"version": "4.2.4",
			"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.4.tgz",
			"integrity": "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==",
			"cpu": [
				"x64"
			],
			"dev": true,
			"libc": [
				"musl"
			],
			"license": "MIT",
			"optional": true,
			"os": [
				"linux"
			],
			"engines": {
				"node": ">= 20"
			}
		},
		"node_modules/@tailwindcss/oxide-wasm32-wasi": {
			"version": "4.2.4",
			"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.4.tgz",
			"integrity": "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==",
			"bundleDependencies": [
				"@napi-rs/wasm-runtime",
				"@emnapi/core",
				"@emnapi/runtime",
				"@tybys/wasm-util",
				"@emnapi/wasi-threads",
				"tslib"
			],
			"cpu": [
				"wasm32"
			],
			"dev": true,
			"license": "MIT",
			"optional": true,
			"dependencies": {
				"@emnapi/core": "^1.8.1",
				"@emnapi/runtime": "^1.8.1",
				"@emnapi/wasi-threads": "^1.1.0",
				"@napi-rs/wasm-runtime": "^1.1.1",
				"@tybys/wasm-util": "^0.10.1",
				"tslib": "^2.8.1"
			},
			"engines": {
				"node": ">=14.0.0"
			}
		},
		"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
			"version": "4.2.4",
			"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz",
			"integrity": "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==",
			"cpu": [
				"arm64"
			],
			"dev": true,
			"license": "MIT",
			"optional": true,
			"os": [
				"win32"
			],
			"engines": {
				"node": ">= 20"
			}
		},
		"node_modules/@tailwindcss/oxide-win32-x64-msvc": {
			"version": "4.2.4",
			"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.4.tgz",
			"integrity": "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==",
			"cpu": [
				"x64"
			],
			"dev": true,
			"license": "MIT",
			"optional": true,
			"os": [
				"win32"
			],
			"engines": {
				"node": ">= 20"
			}
		},
		"node_modules/@tailwindcss/vite": {
			"version": "4.2.4",
			"resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.4.tgz",
			"integrity": "sha512-pCvohwOCspk3ZFn6eJzrrX3g4n2JY73H6MmYC87XfGPyTty4YsCjYTMArRZm/zOI8dIt3+EcrLHAFPe5A4bgtw==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"@tailwindcss/node": "4.2.4",
				"@tailwindcss/oxide": "4.2.4",
				"tailwindcss": "4.2.4"
			},
			"peerDependencies": {
				"vite": "^5.2.0 || ^6 || ^7 || ^8"
			}
		},
		"node_modules/@tybys/wasm-util": {
			"version": "0.10.1",
			"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
			"integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
			"dev": true,
			"license": "MIT",
			"optional": true,
			"dependencies": {
				"tslib": "^2.4.0"
			}
		},
		"node_modules/@types/cookie": {
			"version": "0.6.0",
			"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
			"integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==",
			"dev": true,
			"license": "MIT"
		},
		"node_modules/@types/estree": {
			"version": "1.0.8",
			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
			"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
			"dev": true,
			"license": "MIT"
		},
		"node_modules/@types/trusted-types": {
			"version": "2.0.7",
			"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
			"integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
			"dev": true,
			"license": "MIT"
		},
		"node_modules/acorn": {
			"version": "8.16.0",
			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
			"integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
			"dev": true,
			"license": "MIT",
			"bin": {
				"acorn": "bin/acorn"
			},
			"engines": {
				"node": ">=0.4.0"
			}
		},
		"node_modules/aria-query": {
			"version": "5.3.1",
			"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz",
			"integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==",
			"dev": true,
			"license": "Apache-2.0",
			"engines": {
				"node": ">= 0.4"
			}
		},
		"node_modules/axobject-query": {
			"version": "4.1.0",
			"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
			"integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
			"dev": true,
			"license": "Apache-2.0",
			"engines": {
				"node": ">= 0.4"
			}
		},
		"node_modules/chokidar": {
			"version": "4.0.3",
			"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
			"integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"readdirp": "^4.0.1"
			},
			"engines": {
				"node": ">= 14.16.0"
			},
			"funding": {
				"url": "https://paulmillr.com/funding/"
			}
		},
		"node_modules/clsx": {
			"version": "2.1.1",
			"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
			"integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
			"dev": true,
			"license": "MIT",
			"engines": {
				"node": ">=6"
			}
		},
		"node_modules/cookie": {
			"version": "0.6.0",
			"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
			"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
			"dev": true,
			"license": "MIT",
			"engines": {
				"node": ">= 0.6"
			}
		},
		"node_modules/deepmerge": {
			"version": "4.3.1",
			"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
			"integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
			"dev": true,
			"license": "MIT",
			"engines": {
				"node": ">=0.10.0"
			}
		},
		"node_modules/detect-libc": {
			"version": "2.1.2",
			"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
			"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
			"dev": true,
			"license": "Apache-2.0",
			"engines": {
				"node": ">=8"
			}
		},
		"node_modules/devalue": {
			"version": "5.7.1",
			"resolved": "https://registry.npmjs.org/devalue/-/devalue-5.7.1.tgz",
			"integrity": "sha512-MUbZ586EgQqdRnC4yDrlod3BEdyvE4TapGYHMW2CiaW+KkkFmWEFqBUaLltEZCGi0iFXCEjRF0OjF0DV2QHjOA==",
			"dev": true,
			"license": "MIT"
		},
		"node_modules/enhanced-resolve": {
			"version": "5.21.0",
			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz",
			"integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"graceful-fs": "^4.2.4",
				"tapable": "^2.3.3"
			},
			"engines": {
				"node": ">=10.13.0"
			}
		},
		"node_modules/esm-env": {
			"version": "1.2.2",
			"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz",
			"integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==",
			"dev": true,
			"license": "MIT"
		},
		"node_modules/esrap": {
			"version": "2.2.5",
			"resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.5.tgz",
			"integrity": "sha512-/yLB1538mag+dn0wsePTe8C0rDIjUOaJpMs2McodSzmM2msWcZsBSdRtg6HOBt0A/r82BN+Md3pgwSc/uWt2Ig==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"@jridgewell/sourcemap-codec": "^1.4.15"
			},
			"peerDependencies": {
				"@typescript-eslint/types": "^8.2.0"
			},
			"peerDependenciesMeta": {
				"@typescript-eslint/types": {
					"optional": true
				}
			}
		},
		"node_modules/fdir": {
			"version": "6.5.0",
			"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
			"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
			"dev": true,
			"license": "MIT",
			"engines": {
				"node": ">=12.0.0"
			},
			"peerDependencies": {
				"picomatch": "^3 || ^4"
			},
			"peerDependenciesMeta": {
				"picomatch": {
					"optional": true
				}
			}
		},
		"node_modules/fsevents": {
			"version": "2.3.3",
			"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
			"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
			"dev": true,
			"hasInstallScript": true,
			"license": "MIT",
			"optional": true,
			"os": [
				"darwin"
			],
			"engines": {
				"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
			}
		},
		"node_modules/graceful-fs": {
			"version": "4.2.11",
			"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
			"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
			"dev": true,
			"license": "ISC"
		},
		"node_modules/is-reference": {
			"version": "3.0.3",
			"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz",
			"integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"@types/estree": "^1.0.6"
			}
		},
		"node_modules/jiti": {
			"version": "2.6.1",
			"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
			"integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
			"dev": true,
			"license": "MIT",
			"bin": {
				"jiti": "lib/jiti-cli.mjs"
			}
		},
		"node_modules/kleur": {
			"version": "4.1.5",
			"resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
			"integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
			"dev": true,
			"license": "MIT",
			"engines": {
				"node": ">=6"
			}
		},
		"node_modules/lightningcss": {
			"version": "1.32.0",
			"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
			"integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
			"dev": true,
			"license": "MPL-2.0",
			"dependencies": {
				"detect-libc": "^2.0.3"
			},
			"engines": {
				"node": ">= 12.0.0"
			},
			"funding": {
				"type": "opencollective",
				"url": "https://opencollective.com/parcel"
			},
			"optionalDependencies": {
				"lightningcss-android-arm64": "1.32.0",
				"lightningcss-darwin-arm64": "1.32.0",
				"lightningcss-darwin-x64": "1.32.0",
				"lightningcss-freebsd-x64": "1.32.0",
				"lightningcss-linux-arm-gnueabihf": "1.32.0",
				"lightningcss-linux-arm64-gnu": "1.32.0",
				"lightningcss-linux-arm64-musl": "1.32.0",
				"lightningcss-linux-x64-gnu": "1.32.0",
				"lightningcss-linux-x64-musl": "1.32.0",
				"lightningcss-win32-arm64-msvc": "1.32.0",
				"lightningcss-win32-x64-msvc": "1.32.0"
			}
		},
		"node_modules/lightningcss-android-arm64": {
			"version": "1.32.0",
			"resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
			"integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
			"cpu": [
				"arm64"
			],
			"dev": true,
			"license": "MPL-2.0",
			"optional": true,
			"os": [
				"android"
			],
			"engines": {
				"node": ">= 12.0.0"
			},
			"funding": {
				"type": "opencollective",
				"url": "https://opencollective.com/parcel"
			}
		},
		"node_modules/lightningcss-darwin-arm64": {
			"version": "1.32.0",
			"resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
			"integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
			"cpu": [
				"arm64"
			],
			"dev": true,
			"license": "MPL-2.0",
			"optional": true,
			"os": [
				"darwin"
			],
			"engines": {
				"node": ">= 12.0.0"
			},
			"funding": {
				"type": "opencollective",
				"url": "https://opencollective.com/parcel"
			}
		},
		"node_modules/lightningcss-darwin-x64": {
			"version": "1.32.0",
			"resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
			"integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
			"cpu": [
				"x64"
			],
			"dev": true,
			"license": "MPL-2.0",
			"optional": true,
			"os": [
				"darwin"
			],
			"engines": {
				"node": ">= 12.0.0"
			},
			"funding": {
				"type": "opencollective",
				"url": "https://opencollective.com/parcel"
			}
		},
		"node_modules/lightningcss-freebsd-x64": {
			"version": "1.32.0",
			"resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
			"integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
			"cpu": [
				"x64"
			],
			"dev": true,
			"license": "MPL-2.0",
			"optional": true,
			"os": [
				"freebsd"
			],
			"engines": {
				"node": ">= 12.0.0"
			},
			"funding": {
				"type": "opencollective",
				"url": "https://opencollective.com/parcel"
			}
		},
		"node_modules/lightningcss-linux-arm-gnueabihf": {
			"version": "1.32.0",
			"resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
			"integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
			"cpu": [
				"arm"
			],
			"dev": true,
			"license": "MPL-2.0",
			"optional": true,
			"os": [
				"linux"
			],
			"engines": {
				"node": ">= 12.0.0"
			},
			"funding": {
				"type": "opencollective",
				"url": "https://opencollective.com/parcel"
			}
		},
		"node_modules/lightningcss-linux-arm64-gnu": {
			"version": "1.32.0",
			"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
			"integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
			"cpu": [
				"arm64"
			],
			"dev": true,
			"libc": [
				"glibc"
			],
			"license": "MPL-2.0",
			"optional": true,
			"os": [
				"linux"
			],
			"engines": {
				"node": ">= 12.0.0"
			},
			"funding": {
				"type": "opencollective",
				"url": "https://opencollective.com/parcel"
			}
		},
		"node_modules/lightningcss-linux-arm64-musl": {
			"version": "1.32.0",
			"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
			"integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
			"cpu": [
				"arm64"
			],
			"dev": true,
			"libc": [
				"musl"
			],
			"license": "MPL-2.0",
			"optional": true,
			"os": [
				"linux"
			],
			"engines": {
				"node": ">= 12.0.0"
			},
			"funding": {
				"type": "opencollective",
				"url": "https://opencollective.com/parcel"
			}
		},
		"node_modules/lightningcss-linux-x64-gnu": {
			"version": "1.32.0",
			"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
			"integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
			"cpu": [
				"x64"
			],
			"dev": true,
			"libc": [
				"glibc"
			],
			"license": "MPL-2.0",
			"optional": true,
			"os": [
				"linux"
			],
			"engines": {
				"node": ">= 12.0.0"
			},
			"funding": {
				"type": "opencollective",
				"url": "https://opencollective.com/parcel"
			}
		},
		"node_modules/lightningcss-linux-x64-musl": {
			"version": "1.32.0",
			"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
			"integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
			"cpu": [
				"x64"
			],
			"dev": true,
			"libc": [
				"musl"
			],
			"license": "MPL-2.0",
			"optional": true,
			"os": [
				"linux"
			],
			"engines": {
				"node": ">= 12.0.0"
			},
			"funding": {
				"type": "opencollective",
				"url": "https://opencollective.com/parcel"
			}
		},
		"node_modules/lightningcss-win32-arm64-msvc": {
			"version": "1.32.0",
			"resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
			"integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
			"cpu": [
				"arm64"
			],
			"dev": true,
			"license": "MPL-2.0",
			"optional": true,
			"os": [
				"win32"
			],
			"engines": {
				"node": ">= 12.0.0"
			},
			"funding": {
				"type": "opencollective",
				"url": "https://opencollective.com/parcel"
			}
		},
		"node_modules/lightningcss-win32-x64-msvc": {
			"version": "1.32.0",
			"resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
			"integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
			"cpu": [
				"x64"
			],
			"dev": true,
			"license": "MPL-2.0",
			"optional": true,
			"os": [
				"win32"
			],
			"engines": {
				"node": ">= 12.0.0"
			},
			"funding": {
				"type": "opencollective",
				"url": "https://opencollective.com/parcel"
			}
		},
		"node_modules/locate-character": {
			"version": "3.0.0",
			"resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
			"integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
			"dev": true,
			"license": "MIT"
		},
		"node_modules/magic-string": {
			"version": "0.30.21",
			"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
			"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"@jridgewell/sourcemap-codec": "^1.5.5"
			}
		},
		"node_modules/mri": {
			"version": "1.2.0",
			"resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
			"integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
			"dev": true,
			"license": "MIT",
			"engines": {
				"node": ">=4"
			}
		},
		"node_modules/mrmime": {
			"version": "2.0.1",
			"resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
			"integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
			"dev": true,
			"license": "MIT",
			"engines": {
				"node": ">=10"
			}
		},
		"node_modules/nanoid": {
			"version": "3.3.11",
			"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
			"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
			"dev": true,
			"funding": [
				{
					"type": "github",
					"url": "https://github.com/sponsors/ai"
				}
			],
			"license": "MIT",
			"bin": {
				"nanoid": "bin/nanoid.cjs"
			},
			"engines": {
				"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
			}
		},
		"node_modules/obug": {
			"version": "2.1.1",
			"resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz",
			"integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==",
			"dev": true,
			"funding": [
				"https://github.com/sponsors/sxzz",
				"https://opencollective.com/debug"
			],
			"license": "MIT"
		},
		"node_modules/picocolors": {
			"version": "1.1.1",
			"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
			"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
			"dev": true,
			"license": "ISC"
		},
		"node_modules/picomatch": {
			"version": "4.0.4",
			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
			"integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
			"dev": true,
			"license": "MIT",
			"engines": {
				"node": ">=12"
			},
			"funding": {
				"url": "https://github.com/sponsors/jonschlinkert"
			}
		},
		"node_modules/postcss": {
			"version": "8.5.12",
			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz",
			"integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==",
			"dev": true,
			"funding": [
				{
					"type": "opencollective",
					"url": "https://opencollective.com/postcss/"
				},
				{
					"type": "tidelift",
					"url": "https://tidelift.com/funding/github/npm/postcss"
				},
				{
					"type": "github",
					"url": "https://github.com/sponsors/ai"
				}
			],
			"license": "MIT",
			"dependencies": {
				"nanoid": "^3.3.11",
				"picocolors": "^1.1.1",
				"source-map-js": "^1.2.1"
			},
			"engines": {
				"node": "^10 || ^12 || >=14"
			}
		},
		"node_modules/readdirp": {
			"version": "4.1.2",
			"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
			"integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
			"dev": true,
			"license": "MIT",
			"engines": {
				"node": ">= 14.18.0"
			},
			"funding": {
				"type": "individual",
				"url": "https://paulmillr.com/funding/"
			}
		},
		"node_modules/rolldown": {
			"version": "1.0.0-rc.17",
			"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.17.tgz",
			"integrity": "sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"@oxc-project/types": "=0.127.0",
				"@rolldown/pluginutils": "1.0.0-rc.17"
			},
			"bin": {
				"rolldown": "bin/cli.mjs"
			},
			"engines": {
				"node": "^20.19.0 || >=22.12.0"
			},
			"optionalDependencies": {
				"@rolldown/binding-android-arm64": "1.0.0-rc.17",
				"@rolldown/binding-darwin-arm64": "1.0.0-rc.17",
				"@rolldown/binding-darwin-x64": "1.0.0-rc.17",
				"@rolldown/binding-freebsd-x64": "1.0.0-rc.17",
				"@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.17",
				"@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.17",
				"@rolldown/binding-linux-arm64-musl": "1.0.0-rc.17",
				"@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.17",
				"@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.17",
				"@rolldown/binding-linux-x64-gnu": "1.0.0-rc.17",
				"@rolldown/binding-linux-x64-musl": "1.0.0-rc.17",
				"@rolldown/binding-openharmony-arm64": "1.0.0-rc.17",
				"@rolldown/binding-wasm32-wasi": "1.0.0-rc.17",
				"@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.17",
				"@rolldown/binding-win32-x64-msvc": "1.0.0-rc.17"
			}
		},
		"node_modules/sade": {
			"version": "1.8.1",
			"resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
			"integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"mri": "^1.1.0"
			},
			"engines": {
				"node": ">=6"
			}
		},
		"node_modules/set-cookie-parser": {
			"version": "3.1.0",
			"resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.0.tgz",
			"integrity": "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==",
			"dev": true,
			"license": "MIT"
		},
		"node_modules/sirv": {
			"version": "3.0.2",
			"resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz",
			"integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"@polka/url": "^1.0.0-next.24",
				"mrmime": "^2.0.0",
				"totalist": "^3.0.0"
			},
			"engines": {
				"node": ">=18"
			}
		},
		"node_modules/source-map-js": {
			"version": "1.2.1",
			"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
			"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
			"dev": true,
			"license": "BSD-3-Clause",
			"engines": {
				"node": ">=0.10.0"
			}
		},
		"node_modules/svelte": {
			"version": "5.55.5",
			"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.55.5.tgz",
			"integrity": "sha512-2uCs/LZ9us+AktdzYJM8OcxQ8qnPS1kpaO7syGT/MgO+6Qr1Ybl+TqPq+97u7PHqmmMlye5ZkoyXONy5mjjAbw==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"@jridgewell/remapping": "^2.3.4",
				"@jridgewell/sourcemap-codec": "^1.5.0",
				"@sveltejs/acorn-typescript": "^1.0.5",
				"@types/estree": "^1.0.5",
				"@types/trusted-types": "^2.0.7",
				"acorn": "^8.12.1",
				"aria-query": "5.3.1",
				"axobject-query": "^4.1.0",
				"clsx": "^2.1.1",
				"devalue": "^5.6.4",
				"esm-env": "^1.2.1",
				"esrap": "^2.2.4",
				"is-reference": "^3.0.3",
				"locate-character": "^3.0.0",
				"magic-string": "^0.30.11",
				"zimmerframe": "^1.1.2"
			},
			"engines": {
				"node": ">=18"
			}
		},
		"node_modules/svelte-check": {
			"version": "4.4.6",
			"resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.4.6.tgz",
			"integrity": "sha512-kP1zG81EWaFe9ZyTv4ZXv44Csi6Pkdpb7S3oj6m+K2ec/IcDg/a8LsFsnVLqm2nxtkSwsd5xPj/qFkTBgXHXjg==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"@jridgewell/trace-mapping": "^0.3.25",
				"chokidar": "^4.0.1",
				"fdir": "^6.2.0",
				"picocolors": "^1.0.0",
				"sade": "^1.7.4"
			},
			"bin": {
				"svelte-check": "bin/svelte-check"
			},
			"engines": {
				"node": ">= 18.0.0"
			},
			"peerDependencies": {
				"svelte": "^4.0.0 || ^5.0.0-next.0",
				"typescript": ">=5.0.0"
			}
		},
		"node_modules/tailwindcss": {
			"version": "4.2.4",
			"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz",
			"integrity": "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==",
			"dev": true,
			"license": "MIT"
		},
		"node_modules/tapable": {
			"version": "2.3.3",
			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
			"integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
			"dev": true,
			"license": "MIT",
			"engines": {
				"node": ">=6"
			},
			"funding": {
				"type": "opencollective",
				"url": "https://opencollective.com/webpack"
			}
		},
		"node_modules/tinyglobby": {
			"version": "0.2.16",
			"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
			"integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"fdir": "^6.5.0",
				"picomatch": "^4.0.4"
			},
			"engines": {
				"node": ">=12.0.0"
			},
			"funding": {
				"url": "https://github.com/sponsors/SuperchupuDev"
			}
		},
		"node_modules/totalist": {
			"version": "3.0.1",
			"resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
			"integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
			"dev": true,
			"license": "MIT",
			"engines": {
				"node": ">=6"
			}
		},
		"node_modules/tslib": {
			"version": "2.8.1",
			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
			"dev": true,
			"license": "0BSD",
			"optional": true
		},
		"node_modules/typescript": {
			"version": "6.0.3",
			"resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz",
			"integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
			"dev": true,
			"license": "Apache-2.0",
			"bin": {
				"tsc": "bin/tsc",
				"tsserver": "bin/tsserver"
			},
			"engines": {
				"node": ">=14.17"
			}
		},
		"node_modules/vite": {
			"version": "8.0.10",
			"resolved": "https://registry.npmjs.org/vite/-/vite-8.0.10.tgz",
			"integrity": "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==",
			"dev": true,
			"license": "MIT",
			"dependencies": {
				"lightningcss": "^1.32.0",
				"picomatch": "^4.0.4",
				"postcss": "^8.5.10",
				"rolldown": "1.0.0-rc.17",
				"tinyglobby": "^0.2.16"
			},
			"bin": {
				"vite": "bin/vite.js"
			},
			"engines": {
				"node": "^20.19.0 || >=22.12.0"
			},
			"funding": {
				"url": "https://github.com/vitejs/vite?sponsor=1"
			},
			"optionalDependencies": {
				"fsevents": "~2.3.3"
			},
			"peerDependencies": {
				"@types/node": "^20.19.0 || >=22.12.0",
				"@vitejs/devtools": "^0.1.0",
				"esbuild": "^0.27.0 || ^0.28.0",
				"jiti": ">=1.21.0",
				"less": "^4.0.0",
				"sass": "^1.70.0",
				"sass-embedded": "^1.70.0",
				"stylus": ">=0.54.8",
				"sugarss": "^5.0.0",
				"terser": "^5.16.0",
				"tsx": "^4.8.1",
				"yaml": "^2.4.2"
			},
			"peerDependenciesMeta": {
				"@types/node": {
					"optional": true
				},
				"@vitejs/devtools": {
					"optional": true
				},
				"esbuild": {
					"optional": true
				},
				"jiti": {
					"optional": true
				},
				"less": {
					"optional": true
				},
				"sass": {
					"optional": true
				},
				"sass-embedded": {
					"optional": true
				},
				"stylus": {
					"optional": true
				},
				"sugarss": {
					"optional": true
				},
				"terser": {
					"optional": true
				},
				"tsx": {
					"optional": true
				},
				"yaml": {
					"optional": true
				}
			}
		},
		"node_modules/vitefu": {
			"version": "1.1.3",
			"resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz",
			"integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==",
			"dev": true,
			"license": "MIT",
			"workspaces": [
				"tests/deps/*",
				"tests/projects/*",
				"tests/projects/workspace/packages/*"
			],
			"peerDependencies": {
				"vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
			},
			"peerDependenciesMeta": {
				"vite": {
					"optional": true
				}
			}
		},
		"node_modules/zimmerframe": {
			"version": "1.1.4",
			"resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz",
			"integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==",
			"dev": true,
			"license": "MIT"
		}
	}
}