From 0caf343d1eb5aa47797fcbf52537cbdc22f2b651 Mon Sep 17 00:00:00 2001 From: Ishan Date: Thu, 28 May 2026 19:49:27 +0530 Subject: [PATCH 01/10] ENH: mission architecture implementation on rocketpy - ENH: added code architecture a new class called body - ENH: added code architecture a new class called mission aimed at deployable and stage implementation - ENH: added code architecture for flight branch class for multistage integration class to simulation --- rocketpy/body/__init__.py | 7 +++ rocketpy/body/body_like.py | 23 ++++++++++ rocketpy/body/flying_body.py | 16 +++++++ rocketpy/body/rocket_adapter.py | 34 +++++++++++++++ rocketpy/mission/__initi__.py | 28 ++++++++++++ rocketpy/mission/attached_item.py | 0 rocketpy/mission/attachment.py | 0 rocketpy/mission/deployable.py | 48 +++++++++++++++++++++ rocketpy/mission/mission.py | 0 rocketpy/mission/mission_executor.py | 0 rocketpy/mission/parent_update.py | 14 ++++++ rocketpy/mission/separation_model.py | 18 ++++++++ rocketpy/mission/stage.py | 64 ++++++++++++++++++++++++++++ rocketpy/mission/stage_state.py | 33 ++++++++++++++ rocketpy/simulation/flight_branch.py | 45 +++++++++++++++++++ 15 files changed, 330 insertions(+) create mode 100644 rocketpy/body/__init__.py create mode 100644 rocketpy/body/body_like.py create mode 100644 rocketpy/body/flying_body.py create mode 100644 rocketpy/body/rocket_adapter.py create mode 100644 rocketpy/mission/__initi__.py create mode 100644 rocketpy/mission/attached_item.py create mode 100644 rocketpy/mission/attachment.py create mode 100644 rocketpy/mission/deployable.py create mode 100644 rocketpy/mission/mission.py create mode 100644 rocketpy/mission/mission_executor.py create mode 100644 rocketpy/mission/parent_update.py create mode 100644 rocketpy/mission/separation_model.py create mode 100644 rocketpy/mission/stage.py create mode 100644 rocketpy/mission/stage_state.py create mode 100644 rocketpy/simulation/flight_branch.py diff --git a/rocketpy/body/__init__.py b/rocketpy/body/__init__.py new file mode 100644 index 000000000..3c6f22892 --- /dev/null +++ b/rocketpy/body/__init__.py @@ -0,0 +1,7 @@ +"""rocketpy.body – body abstraction layer for multistage simulation.""" + +from rocketpy.body.body_like import BodyLike +from rocketpy.body.flying_body import FlightBody +from rocketpy.body.rocket_adapter import RocketAdapter + +__all__ = ["BodyLike", "FlyingBody", "RocketAdapter"] \ No newline at end of file diff --git a/rocketpy/body/body_like.py b/rocketpy/body/body_like.py new file mode 100644 index 000000000..e982d46bd --- /dev/null +++ b/rocketpy/body/body_like.py @@ -0,0 +1,23 @@ +"""BodyLike protocol for the multistage mission architecture. + +This module defines a structural typing contract so bodies can satisfy the +interface without inheriting from a shared base class. +""" + +from typing import Protocol, runtime_checkable +@runtime_checkable +class BodyLike(Protocol): + """Structural interface that every flight-ready body must satisfy. + + Any object that can be integrated by the Flight simulation engine + must implement this interface. Both the native :class:`FlightBody` + and the :class:`RocketAdapter` (which wraps a legacy :class:`Rocket`) + satisfy it, so that the simulation layer can treat them uniformly. + This uses structural typing, so concrete bodies do not need to inherit + from :class:`BodyLike` to be accepted by the simulation layer. + + Attributes + ---------- + name : str + Human-readable identifier for the body. + """ \ No newline at end of file diff --git a/rocketpy/body/flying_body.py b/rocketpy/body/flying_body.py new file mode 100644 index 000000000..88896891a --- /dev/null +++ b/rocketpy/body/flying_body.py @@ -0,0 +1,16 @@ +"""FlyingBody – a first-class, fully configurable flight body.""" + +from copy import deepcopy + + +class FlyingBody: + """A fully configurable flight body composed of interchangeable models. + + Unlike :class:`~rocketpy.rocket.Rocket`, which is a rich user-facing + builder object, :class:`FlyingBody` is designed as a clean value object + that holds just enough information for the simulation engine to integrate + the equations of motion. Users who need the full Rocket builder + experience can convert a :class:`~rocketpy.rocket.Rocket` to a + :class:`FlyingBody` via :class:`RocketAdapter`. It satisfies the + :class:`~rocketpy.body.BodyLike` protocol. + """ \ No newline at end of file diff --git a/rocketpy/body/rocket_adapter.py b/rocketpy/body/rocket_adapter.py new file mode 100644 index 000000000..f01775881 --- /dev/null +++ b/rocketpy/body/rocket_adapter.py @@ -0,0 +1,34 @@ +"""RocketAdapter – wraps a legacy :class:`Rocket` as a :class:`BodyLike`. + +This module provides a minimal adapter to allow legacy ``Rocket`` +instances to be consumed by code expecting a ``BodyLike`` interface. +""" + +from copy import deepcopy + + +class RocketAdapter: + """Adapts a legacy :class:`~rocketpy.rocket.Rocket` to the + :class:`BodyLike` interface. + + This allows the existing :class:`~rocketpy.rocket.Rocket` builder to be + consumed by the new multistage simulation infrastructure without any + changes to the ``Rocket`` class itself. + + Parameters + ---------- + rocket : :class:`~rocketpy.rocket.Rocket` + The rocket instance to adapt. + + Attributes + ---------- + rocket : :class:`~rocketpy.rocket.Rocket` + The wrapped rocket instance. + """ + + def __init__(self, rocket): + # store a deep copy to avoid accidental mutation of the original + self.rocket = deepcopy(rocket) + + def __repr__(self): + return f"\n" diff --git a/rocketpy/mission/__initi__.py b/rocketpy/mission/__initi__.py new file mode 100644 index 000000000..66cc24a5a --- /dev/null +++ b/rocketpy/mission/__initi__.py @@ -0,0 +1,28 @@ +"""rocketpy.mission – mission architecture for multistage rockets.""" + +from rocketpy.mission.attached_item import AttachedItem +from rocketpy.mission.attachment import Attachment +from rocketpy.mission.deployable import Deployable +from rocketpy.mission.mission import Mission +from rocketpy.mission.mission_executor import MissionExecutionResult, MissionExecutor +from rocketpy.mission.parent_update import NoOpParentUpdate, ParentUpdate +from rocketpy.mission.separation_model import InstantaneousSeparation, SeparationModel +from rocketpy.mission.stage import Stage +from rocketpy.mission.stage_state import StageState + +__all__ = [ + "AttachedItem", + "Attachment", + "Deployable", + "InstantaneousSeparation", + "Mission", + "MissionExecutionResult", + "MissionExecutor", + "NoOpParentUpdate", + "ParentUpdate", + "RecoveryEvent", + "SeparationModel", + "Stage", + "StageSeparationEvent", + "StageState", +] diff --git a/rocketpy/mission/attached_item.py b/rocketpy/mission/attached_item.py new file mode 100644 index 000000000..e69de29bb diff --git a/rocketpy/mission/attachment.py b/rocketpy/mission/attachment.py new file mode 100644 index 000000000..e69de29bb diff --git a/rocketpy/mission/deployable.py b/rocketpy/mission/deployable.py new file mode 100644 index 000000000..2b60f7784 --- /dev/null +++ b/rocketpy/mission/deployable.py @@ -0,0 +1,48 @@ +"""Deployable – a mission item that can be released during flight.""" + +from rocketpy.mission.attached_item import AttachedItem +from rocketpy.mission.parent_update import NoOpParentUpdate +from rocketpy.mission.separation_model import InstantaneousSeparation + + +class Deployable(AttachedItem): + """A body that can be deployed (released) from its parent during flight. + A :class:`Deployable` is the mission-layer wrapper around a physical + body that should be released at some point in flight (e.g. a nose + cone, a payload bay, or a secondary vehicle). It is *not* the physical + body itself – that is held in :attr:`body`. + Parameters + ---------- + name : str + Human-readable identifier (e.g. ``"nose_cone_payload"``). + body : :class:`~rocketpy.body.BodyLike` + The physical body of the deployable. + attachment : :class:`~rocketpy.mission.Attachment` + Mechanical link to the parent body. + deployment_event : :class:`~rocketpy.mission.DeploymentEvent` + The event that triggers this deployable's release. + separation : :class:`~rocketpy.mission.SeparationModel`, optional + Model for the separation dynamics. Defaults to + :class:`~rocketpy.mission.InstantaneousSeparation`. + parent_update : :class:`~rocketpy.mission.ParentUpdate`, optional + Callback that modifies the parent body after separation. Defaults + to :class:`~rocketpy.mission.NoOpParentUpdate`. + events : list[:class:`~rocketpy.mission.Event`], optional + Additional events besides *deployment_event*. + Attributes + ---------- + deployment_event : DeploymentEvent + separation : SeparationModel + parent_update : ParentUpdate + """ + + def __init__( + self, + name, + body, + attachment, + deployment_event, + separation=None, + parent_update=None, + events=None, + ): \ No newline at end of file diff --git a/rocketpy/mission/mission.py b/rocketpy/mission/mission.py new file mode 100644 index 000000000..e69de29bb diff --git a/rocketpy/mission/mission_executor.py b/rocketpy/mission/mission_executor.py new file mode 100644 index 000000000..e69de29bb diff --git a/rocketpy/mission/parent_update.py b/rocketpy/mission/parent_update.py new file mode 100644 index 000000000..1390f67ea --- /dev/null +++ b/rocketpy/mission/parent_update.py @@ -0,0 +1,14 @@ +"""ParentUpdate – interface for modifying a parent body after separation.""" + +from abc import ABC, abstractmethod + + +class ParentUpdate(ABC): + """Interface for updating a parent body when a child separates. + + When a :class:`~rocketpy.mission.Deployable` or + :class:`~rocketpy.mission.Stage` separates from its parent, the + parent body may need to be updated to account for the mass and + inertia change caused by the separation. Concrete implementations + of this interface perform that update in place. + """ \ No newline at end of file diff --git a/rocketpy/mission/separation_model.py b/rocketpy/mission/separation_model.py new file mode 100644 index 000000000..a73bca34d --- /dev/null +++ b/rocketpy/mission/separation_model.py @@ -0,0 +1,18 @@ +"""SeparationModel – interface for child/parent separation dynamics.""" + +from abc import ABC, abstractmethod + + +class SeparationModel(ABC): + """Interface for modelling the separation impulse between two bodies. + + When a :class:`~rocketpy.mission.Deployable` or + :class:`~rocketpy.mission.Stage` separates from its parent, a + :class:`SeparationModel` is responsible for computing any + velocity/orientation perturbations applied to both the parent and + child bodies at the instant of separation. + + Implementors should override :meth:`apply` and may store any physical + parameters (e.g. spring constant, separation charge energy) as + instance attributes. + """ \ No newline at end of file diff --git a/rocketpy/mission/stage.py b/rocketpy/mission/stage.py new file mode 100644 index 000000000..e76643c6f --- /dev/null +++ b/rocketpy/mission/stage.py @@ -0,0 +1,64 @@ +"""Stage – a mission item representing a rocket stage.""" + +from rocketpy.mission.attached_item import AttachedItem +from rocketpy.mission.parent_update import NoOpParentUpdate +from rocketpy.mission.separation_model import InstantaneousSeparation +from rocketpy.mission.stage_state import StageState + + +class Stage(AttachedItem): + """A rocket stage that can ignite and/or separate from its parent. + + A :class:`Stage` is the mission-layer wrapper around the physical + body of a rocket stage. It tracks the stage lifecycle via + :class:`~rocketpy.mission.StageState` and holds references to the + events that govern separation and ignition. + + Separation and ignition are kept as independent concerns: a stage may + separate without igniting (e.g. a fairing) or may ignite before + separating (hot staging). + + Parameters + ---------- + name : str + Human-readable identifier (e.g. ``"second_stage"``). + body : :class:`~rocketpy.body.BodyLike` + Physical body of the stage. + attachment : :class:`~rocketpy.mission.Attachment` + Mechanical link to the parent body. + separation_event : :class:`~rocketpy.mission.StageSeparationEvent`, optional + Event that triggers mechanical separation. ``None`` if the stage + never separates during the simulated mission. + ignition_event : :class:`~rocketpy.mission.IgnitionEvent`, optional + Event that triggers motor ignition. ``None`` if the stage is + already burning when the simulation starts (i.e. it is the + first stage). + separation : :class:`~rocketpy.mission.SeparationModel`, optional + Separation dynamics model. Defaults to + :class:`~rocketpy.mission.InstantaneousSeparation`. + parent_update : :class:`~rocketpy.mission.ParentUpdate`, optional + Updates applied to the parent body after separation. Defaults + to :class:`~rocketpy.mission.NoOpParentUpdate`. + events : list[:class:`~rocketpy.mission.Event`], optional + Additional events besides *separation_event* and *ignition_event*. + + Attributes + ---------- + separation_event : StageSeparationEvent or None + ignition_event : IgnitionEvent or None + separation : SeparationModel + parent_update : ParentUpdate + state : StageState + """ + + def __init__( + self, + name, + body, + attachment, + separation_event=None, + ignition_event=None, + separation=None, + parent_update=None, + events=None, + ): \ No newline at end of file diff --git a/rocketpy/mission/stage_state.py b/rocketpy/mission/stage_state.py new file mode 100644 index 000000000..06e695871 --- /dev/null +++ b/rocketpy/mission/stage_state.py @@ -0,0 +1,33 @@ +"""StageState – lifecycle states for a Stage.""" + +from enum import Enum, auto + + +class StageState(Enum): + """Enumeration of the lifecycle states a :class:`Stage` can occupy. + + Typical lifecycle progressions are: + + - Powered stage: ``ATTACHED → IGNITED → SEPARATED → SPENT`` + - Unpowered drop stage (e.g. fairing): ``ATTACHED → SEPARATED`` + - Sustainer (never physically separated): ``ATTACHED → IGNITED → SPENT`` + + Attributes + ---------- + ATTACHED : + The stage is attached to the parent body and has not yet ignited. + IGNITED : + The stage motor has ignited but the stage is still mechanically + coupled to the parent. + SEPARATED : + The stage has mechanically separated from the parent and is flying + independently. + SPENT : + The stage motor has burned out. The stage may still be attached + (e.g. coast phase) or may have separated already. + """ + + ATTACHED = auto() + IGNITED = auto() + SEPARATED = auto() + SPENT = auto() diff --git a/rocketpy/simulation/flight_branch.py b/rocketpy/simulation/flight_branch.py new file mode 100644 index 000000000..18e93b957 --- /dev/null +++ b/rocketpy/simulation/flight_branch.py @@ -0,0 +1,45 @@ +"""FlightBranch – a single contiguous integration arc in a multistage flight.""" + + +class FlightBranch: + """Represents one contiguous integration arc in a branching flight tree. + When a :class:`~rocketpy.mission.Stage` separates or a + :class:`~rocketpy.mission.Deployable` is released, the simulation engine + creates one or more new :class:`FlightBranch` objects. Each branch tracks + its own body, initial state, and list of pending events. + The branches together form a directed acyclic graph (DAG) rooted at the + first-stage branch. A :class:`~rocketpy.simulation.Flight` object holds + the root branch and drives the full simulation. + Parameters + ---------- + body : :class:`~rocketpy.body.BodyLike` + The flight-ready body for this branch. A simulation-safe deep copy + should be provided (see + :meth:`~rocketpy.body.BodyLike.to_branch_ready_copy`). + start_state : object + Initial state vector (position, velocity, attitude, …) at the + start of this branch. + start_time : float + Simulation time, in seconds, at which this branch begins. + parent : :class:`FlightBranch` or None, optional + The branch from which this one was spawned. ``None`` for the root. + events : list[:class:`~rocketpy.mission.Event`], optional + Events that are pending on this branch. + Attributes + ---------- + body : BodyLike + parent : FlightBranch or None + children : list[FlightBranch] + start_state : object + start_time : float + events : list[Event] + """ + + def __init__( + self, + body, + start_state=None, + start_time: float = 0.0, + parent=None, + events=None, + ): \ No newline at end of file From 0099ac29b16e8d83dab5bafc06379291f7e40dbb Mon Sep 17 00:00:00 2001 From: Ishan Date: Fri, 14 Aug 2026 14:02:50 +0530 Subject: [PATCH 02/10] MNT: remove broken mission architecture scaffold rocketpy/body/, rocketpy/mission/, and rocketpy/simulation/ flight_branch.py (added in 0caf343d) never actually worked: rocketpy/mission/__initi__.py is misspelled so the package init never ran, four files were empty, and three others had function signatures with no body (IndentationError). None of it was imported by rocketpy/__init__.py or referenced anywhere else in the repo. Clearing the way for a simpler multistage/mission design (SeparableBody/Stage/Deployable/MultiStageRocket + Mission orchestrator) to be built incrementally. --- rocketpy/body/__init__.py | 7 --- rocketpy/body/body_like.py | 23 ---------- rocketpy/body/flying_body.py | 16 ------- rocketpy/body/rocket_adapter.py | 34 --------------- rocketpy/mission/__initi__.py | 28 ------------ rocketpy/mission/attached_item.py | 0 rocketpy/mission/attachment.py | 0 rocketpy/mission/deployable.py | 48 --------------------- rocketpy/mission/mission.py | 0 rocketpy/mission/mission_executor.py | 0 rocketpy/mission/parent_update.py | 14 ------ rocketpy/mission/separation_model.py | 18 -------- rocketpy/mission/stage.py | 64 ---------------------------- rocketpy/mission/stage_state.py | 33 -------------- rocketpy/simulation/flight_branch.py | 45 ------------------- 15 files changed, 330 deletions(-) delete mode 100644 rocketpy/body/__init__.py delete mode 100644 rocketpy/body/body_like.py delete mode 100644 rocketpy/body/flying_body.py delete mode 100644 rocketpy/body/rocket_adapter.py delete mode 100644 rocketpy/mission/__initi__.py delete mode 100644 rocketpy/mission/attached_item.py delete mode 100644 rocketpy/mission/attachment.py delete mode 100644 rocketpy/mission/deployable.py delete mode 100644 rocketpy/mission/mission.py delete mode 100644 rocketpy/mission/mission_executor.py delete mode 100644 rocketpy/mission/parent_update.py delete mode 100644 rocketpy/mission/separation_model.py delete mode 100644 rocketpy/mission/stage.py delete mode 100644 rocketpy/mission/stage_state.py delete mode 100644 rocketpy/simulation/flight_branch.py diff --git a/rocketpy/body/__init__.py b/rocketpy/body/__init__.py deleted file mode 100644 index 3c6f22892..000000000 --- a/rocketpy/body/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -"""rocketpy.body – body abstraction layer for multistage simulation.""" - -from rocketpy.body.body_like import BodyLike -from rocketpy.body.flying_body import FlightBody -from rocketpy.body.rocket_adapter import RocketAdapter - -__all__ = ["BodyLike", "FlyingBody", "RocketAdapter"] \ No newline at end of file diff --git a/rocketpy/body/body_like.py b/rocketpy/body/body_like.py deleted file mode 100644 index e982d46bd..000000000 --- a/rocketpy/body/body_like.py +++ /dev/null @@ -1,23 +0,0 @@ -"""BodyLike protocol for the multistage mission architecture. - -This module defines a structural typing contract so bodies can satisfy the -interface without inheriting from a shared base class. -""" - -from typing import Protocol, runtime_checkable -@runtime_checkable -class BodyLike(Protocol): - """Structural interface that every flight-ready body must satisfy. - - Any object that can be integrated by the Flight simulation engine - must implement this interface. Both the native :class:`FlightBody` - and the :class:`RocketAdapter` (which wraps a legacy :class:`Rocket`) - satisfy it, so that the simulation layer can treat them uniformly. - This uses structural typing, so concrete bodies do not need to inherit - from :class:`BodyLike` to be accepted by the simulation layer. - - Attributes - ---------- - name : str - Human-readable identifier for the body. - """ \ No newline at end of file diff --git a/rocketpy/body/flying_body.py b/rocketpy/body/flying_body.py deleted file mode 100644 index 88896891a..000000000 --- a/rocketpy/body/flying_body.py +++ /dev/null @@ -1,16 +0,0 @@ -"""FlyingBody – a first-class, fully configurable flight body.""" - -from copy import deepcopy - - -class FlyingBody: - """A fully configurable flight body composed of interchangeable models. - - Unlike :class:`~rocketpy.rocket.Rocket`, which is a rich user-facing - builder object, :class:`FlyingBody` is designed as a clean value object - that holds just enough information for the simulation engine to integrate - the equations of motion. Users who need the full Rocket builder - experience can convert a :class:`~rocketpy.rocket.Rocket` to a - :class:`FlyingBody` via :class:`RocketAdapter`. It satisfies the - :class:`~rocketpy.body.BodyLike` protocol. - """ \ No newline at end of file diff --git a/rocketpy/body/rocket_adapter.py b/rocketpy/body/rocket_adapter.py deleted file mode 100644 index f01775881..000000000 --- a/rocketpy/body/rocket_adapter.py +++ /dev/null @@ -1,34 +0,0 @@ -"""RocketAdapter – wraps a legacy :class:`Rocket` as a :class:`BodyLike`. - -This module provides a minimal adapter to allow legacy ``Rocket`` -instances to be consumed by code expecting a ``BodyLike`` interface. -""" - -from copy import deepcopy - - -class RocketAdapter: - """Adapts a legacy :class:`~rocketpy.rocket.Rocket` to the - :class:`BodyLike` interface. - - This allows the existing :class:`~rocketpy.rocket.Rocket` builder to be - consumed by the new multistage simulation infrastructure without any - changes to the ``Rocket`` class itself. - - Parameters - ---------- - rocket : :class:`~rocketpy.rocket.Rocket` - The rocket instance to adapt. - - Attributes - ---------- - rocket : :class:`~rocketpy.rocket.Rocket` - The wrapped rocket instance. - """ - - def __init__(self, rocket): - # store a deep copy to avoid accidental mutation of the original - self.rocket = deepcopy(rocket) - - def __repr__(self): - return f"\n" diff --git a/rocketpy/mission/__initi__.py b/rocketpy/mission/__initi__.py deleted file mode 100644 index 66cc24a5a..000000000 --- a/rocketpy/mission/__initi__.py +++ /dev/null @@ -1,28 +0,0 @@ -"""rocketpy.mission – mission architecture for multistage rockets.""" - -from rocketpy.mission.attached_item import AttachedItem -from rocketpy.mission.attachment import Attachment -from rocketpy.mission.deployable import Deployable -from rocketpy.mission.mission import Mission -from rocketpy.mission.mission_executor import MissionExecutionResult, MissionExecutor -from rocketpy.mission.parent_update import NoOpParentUpdate, ParentUpdate -from rocketpy.mission.separation_model import InstantaneousSeparation, SeparationModel -from rocketpy.mission.stage import Stage -from rocketpy.mission.stage_state import StageState - -__all__ = [ - "AttachedItem", - "Attachment", - "Deployable", - "InstantaneousSeparation", - "Mission", - "MissionExecutionResult", - "MissionExecutor", - "NoOpParentUpdate", - "ParentUpdate", - "RecoveryEvent", - "SeparationModel", - "Stage", - "StageSeparationEvent", - "StageState", -] diff --git a/rocketpy/mission/attached_item.py b/rocketpy/mission/attached_item.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/rocketpy/mission/attachment.py b/rocketpy/mission/attachment.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/rocketpy/mission/deployable.py b/rocketpy/mission/deployable.py deleted file mode 100644 index 2b60f7784..000000000 --- a/rocketpy/mission/deployable.py +++ /dev/null @@ -1,48 +0,0 @@ -"""Deployable – a mission item that can be released during flight.""" - -from rocketpy.mission.attached_item import AttachedItem -from rocketpy.mission.parent_update import NoOpParentUpdate -from rocketpy.mission.separation_model import InstantaneousSeparation - - -class Deployable(AttachedItem): - """A body that can be deployed (released) from its parent during flight. - A :class:`Deployable` is the mission-layer wrapper around a physical - body that should be released at some point in flight (e.g. a nose - cone, a payload bay, or a secondary vehicle). It is *not* the physical - body itself – that is held in :attr:`body`. - Parameters - ---------- - name : str - Human-readable identifier (e.g. ``"nose_cone_payload"``). - body : :class:`~rocketpy.body.BodyLike` - The physical body of the deployable. - attachment : :class:`~rocketpy.mission.Attachment` - Mechanical link to the parent body. - deployment_event : :class:`~rocketpy.mission.DeploymentEvent` - The event that triggers this deployable's release. - separation : :class:`~rocketpy.mission.SeparationModel`, optional - Model for the separation dynamics. Defaults to - :class:`~rocketpy.mission.InstantaneousSeparation`. - parent_update : :class:`~rocketpy.mission.ParentUpdate`, optional - Callback that modifies the parent body after separation. Defaults - to :class:`~rocketpy.mission.NoOpParentUpdate`. - events : list[:class:`~rocketpy.mission.Event`], optional - Additional events besides *deployment_event*. - Attributes - ---------- - deployment_event : DeploymentEvent - separation : SeparationModel - parent_update : ParentUpdate - """ - - def __init__( - self, - name, - body, - attachment, - deployment_event, - separation=None, - parent_update=None, - events=None, - ): \ No newline at end of file diff --git a/rocketpy/mission/mission.py b/rocketpy/mission/mission.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/rocketpy/mission/mission_executor.py b/rocketpy/mission/mission_executor.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/rocketpy/mission/parent_update.py b/rocketpy/mission/parent_update.py deleted file mode 100644 index 1390f67ea..000000000 --- a/rocketpy/mission/parent_update.py +++ /dev/null @@ -1,14 +0,0 @@ -"""ParentUpdate – interface for modifying a parent body after separation.""" - -from abc import ABC, abstractmethod - - -class ParentUpdate(ABC): - """Interface for updating a parent body when a child separates. - - When a :class:`~rocketpy.mission.Deployable` or - :class:`~rocketpy.mission.Stage` separates from its parent, the - parent body may need to be updated to account for the mass and - inertia change caused by the separation. Concrete implementations - of this interface perform that update in place. - """ \ No newline at end of file diff --git a/rocketpy/mission/separation_model.py b/rocketpy/mission/separation_model.py deleted file mode 100644 index a73bca34d..000000000 --- a/rocketpy/mission/separation_model.py +++ /dev/null @@ -1,18 +0,0 @@ -"""SeparationModel – interface for child/parent separation dynamics.""" - -from abc import ABC, abstractmethod - - -class SeparationModel(ABC): - """Interface for modelling the separation impulse between two bodies. - - When a :class:`~rocketpy.mission.Deployable` or - :class:`~rocketpy.mission.Stage` separates from its parent, a - :class:`SeparationModel` is responsible for computing any - velocity/orientation perturbations applied to both the parent and - child bodies at the instant of separation. - - Implementors should override :meth:`apply` and may store any physical - parameters (e.g. spring constant, separation charge energy) as - instance attributes. - """ \ No newline at end of file diff --git a/rocketpy/mission/stage.py b/rocketpy/mission/stage.py deleted file mode 100644 index e76643c6f..000000000 --- a/rocketpy/mission/stage.py +++ /dev/null @@ -1,64 +0,0 @@ -"""Stage – a mission item representing a rocket stage.""" - -from rocketpy.mission.attached_item import AttachedItem -from rocketpy.mission.parent_update import NoOpParentUpdate -from rocketpy.mission.separation_model import InstantaneousSeparation -from rocketpy.mission.stage_state import StageState - - -class Stage(AttachedItem): - """A rocket stage that can ignite and/or separate from its parent. - - A :class:`Stage` is the mission-layer wrapper around the physical - body of a rocket stage. It tracks the stage lifecycle via - :class:`~rocketpy.mission.StageState` and holds references to the - events that govern separation and ignition. - - Separation and ignition are kept as independent concerns: a stage may - separate without igniting (e.g. a fairing) or may ignite before - separating (hot staging). - - Parameters - ---------- - name : str - Human-readable identifier (e.g. ``"second_stage"``). - body : :class:`~rocketpy.body.BodyLike` - Physical body of the stage. - attachment : :class:`~rocketpy.mission.Attachment` - Mechanical link to the parent body. - separation_event : :class:`~rocketpy.mission.StageSeparationEvent`, optional - Event that triggers mechanical separation. ``None`` if the stage - never separates during the simulated mission. - ignition_event : :class:`~rocketpy.mission.IgnitionEvent`, optional - Event that triggers motor ignition. ``None`` if the stage is - already burning when the simulation starts (i.e. it is the - first stage). - separation : :class:`~rocketpy.mission.SeparationModel`, optional - Separation dynamics model. Defaults to - :class:`~rocketpy.mission.InstantaneousSeparation`. - parent_update : :class:`~rocketpy.mission.ParentUpdate`, optional - Updates applied to the parent body after separation. Defaults - to :class:`~rocketpy.mission.NoOpParentUpdate`. - events : list[:class:`~rocketpy.mission.Event`], optional - Additional events besides *separation_event* and *ignition_event*. - - Attributes - ---------- - separation_event : StageSeparationEvent or None - ignition_event : IgnitionEvent or None - separation : SeparationModel - parent_update : ParentUpdate - state : StageState - """ - - def __init__( - self, - name, - body, - attachment, - separation_event=None, - ignition_event=None, - separation=None, - parent_update=None, - events=None, - ): \ No newline at end of file diff --git a/rocketpy/mission/stage_state.py b/rocketpy/mission/stage_state.py deleted file mode 100644 index 06e695871..000000000 --- a/rocketpy/mission/stage_state.py +++ /dev/null @@ -1,33 +0,0 @@ -"""StageState – lifecycle states for a Stage.""" - -from enum import Enum, auto - - -class StageState(Enum): - """Enumeration of the lifecycle states a :class:`Stage` can occupy. - - Typical lifecycle progressions are: - - - Powered stage: ``ATTACHED → IGNITED → SEPARATED → SPENT`` - - Unpowered drop stage (e.g. fairing): ``ATTACHED → SEPARATED`` - - Sustainer (never physically separated): ``ATTACHED → IGNITED → SPENT`` - - Attributes - ---------- - ATTACHED : - The stage is attached to the parent body and has not yet ignited. - IGNITED : - The stage motor has ignited but the stage is still mechanically - coupled to the parent. - SEPARATED : - The stage has mechanically separated from the parent and is flying - independently. - SPENT : - The stage motor has burned out. The stage may still be attached - (e.g. coast phase) or may have separated already. - """ - - ATTACHED = auto() - IGNITED = auto() - SEPARATED = auto() - SPENT = auto() diff --git a/rocketpy/simulation/flight_branch.py b/rocketpy/simulation/flight_branch.py deleted file mode 100644 index 18e93b957..000000000 --- a/rocketpy/simulation/flight_branch.py +++ /dev/null @@ -1,45 +0,0 @@ -"""FlightBranch – a single contiguous integration arc in a multistage flight.""" - - -class FlightBranch: - """Represents one contiguous integration arc in a branching flight tree. - When a :class:`~rocketpy.mission.Stage` separates or a - :class:`~rocketpy.mission.Deployable` is released, the simulation engine - creates one or more new :class:`FlightBranch` objects. Each branch tracks - its own body, initial state, and list of pending events. - The branches together form a directed acyclic graph (DAG) rooted at the - first-stage branch. A :class:`~rocketpy.simulation.Flight` object holds - the root branch and drives the full simulation. - Parameters - ---------- - body : :class:`~rocketpy.body.BodyLike` - The flight-ready body for this branch. A simulation-safe deep copy - should be provided (see - :meth:`~rocketpy.body.BodyLike.to_branch_ready_copy`). - start_state : object - Initial state vector (position, velocity, attitude, …) at the - start of this branch. - start_time : float - Simulation time, in seconds, at which this branch begins. - parent : :class:`FlightBranch` or None, optional - The branch from which this one was spawned. ``None`` for the root. - events : list[:class:`~rocketpy.mission.Event`], optional - Events that are pending on this branch. - Attributes - ---------- - body : BodyLike - parent : FlightBranch or None - children : list[FlightBranch] - start_state : object - start_time : float - events : list[Event] - """ - - def __init__( - self, - body, - start_state=None, - start_time: float = 0.0, - parent=None, - events=None, - ): \ No newline at end of file From aff0a2b11660aa02a32da4c57e74c05286c93e59 Mon Sep 17 00:00:00 2001 From: Ishan Date: Fri, 14 Aug 2026 14:07:48 +0530 Subject: [PATCH 03/10] ENH: add SeparableBody and Stage to rocketpy.rocket.multistage First slice of the new multistage/mission architecture (see mission_multistage_design.md). SeparableBody is the shared base for anything that starts attached to a vehicle and becomes a free body at separation; Stage wraps a fully built Rocket representing one stage flying on its own. For now Stage is a thin wrapper: dry_mass and burn_out_time just forward to the wrapped Rocket's own already-computed attributes. Composition into a full multistage vehicle (MultiStageRocket) and orchestration (Mission) land in later commits. --- rocketpy/rocket/multistage.py | 74 ++++++++++++++++++++++++++++ tests/unit/rocket/test_multistage.py | 13 +++++ 2 files changed, 87 insertions(+) create mode 100644 rocketpy/rocket/multistage.py create mode 100644 tests/unit/rocket/test_multistage.py diff --git a/rocketpy/rocket/multistage.py b/rocketpy/rocket/multistage.py new file mode 100644 index 000000000..e30a60d71 --- /dev/null +++ b/rocketpy/rocket/multistage.py @@ -0,0 +1,74 @@ +"""Vehicle composition layer for multistage rockets and deployable payloads.""" + + +class SeparableBody: + """A body that starts attached to the vehicle and becomes a free body + when its separation event fires. Base class for Stage and Deployable. + + Parameters + ---------- + name : str + Unique body name within the vehicle; used to group Mission + results (e.g. ``mission.flights["booster"]``). + separation : Event, optional + Event that releases this body. If None, never separates. + separation_delta_v : float, optional + Relative separation speed along the stack's longitudinal axis, + in m/s, split by momentum conservation. Default 0. + """ + + def __init__(self, name, separation=None, separation_delta_v=0.0): + self.name = name + self.separation = separation + self.separation_delta_v = separation_delta_v + + +class Stage(SeparableBody): + """One stage of a multistage rocket. + + Wraps a fully built single-stage ``Rocket`` describing this stage flying + by itself: structure, motor, aerodynamic surfaces and parachutes. + + Parameters + ---------- + name : str + Stage name, e.g. "booster", "sustainer". + rocket : Rocket + This stage flying by itself, motor attached. + separation : Event, optional + When this stage (and everything below it) is jettisoned from the + stages above. Top stage: None. + separation_delta_v : float, optional + See SeparableBody. + ignition : Event, optional + Event that ignites this stage's motor. Default None. + ignition_delay : float, optional + Time between the separation of the stage below and this stage's + motor ignition, in seconds. Default 0. + """ + + def __init__( + self, + name, + rocket, + separation=None, + separation_delta_v=0.0, + ignition=None, + ignition_delay=0.0, + ): + super().__init__( + name=name, separation=separation, separation_delta_v=separation_delta_v + ) + self.rocket = rocket + self.ignition = ignition + self.ignition_delay = ignition_delay + + @property + def burn_out_time(self): + """Burn out time of this stage's motor in the motor's own time.""" + return self.rocket.motor.burn_out_time + + @property + def dry_mass(self): + """Stage dry mass (structure + motor dry mass), in kg.""" + return self.rocket.dry_mass diff --git a/tests/unit/rocket/test_multistage.py b/tests/unit/rocket/test_multistage.py new file mode 100644 index 000000000..8126f8738 --- /dev/null +++ b/tests/unit/rocket/test_multistage.py @@ -0,0 +1,13 @@ +from rocketpy.rocket.multistage import Stage + + +def test_stage_dry_mass_matches_wrapped_rocket(calisto): + stage = Stage(name="stage_1", rocket=calisto) + + assert stage.dry_mass == calisto.dry_mass + + +def test_stage_burn_out_time_matches_wrapped_rocket_motor(calisto): + stage = Stage(name="stage_1", rocket=calisto) + + assert stage.burn_out_time == calisto.motor.burn_out_time From f3bfe428805cdfc86df0163952722d10bb29f39f Mon Sep 17 00:00:00 2001 From: Ishan Date: Fri, 14 Aug 2026 14:13:58 +0530 Subject: [PATCH 04/10] ENH: add Deployable to rocketpy.rocket.multistage Second slice of the multistage/mission architecture. Deployable is the mission-layer wrapper for an inert carried body (payload, nose cone, etc.) that gets ejected during flight: mass/inertia/position while attached, plus either a fully built free_rocket or surfaces added via add_surface() for its free-flight aerodynamics - mutually exclusive, matching mission_multistage_design.md. Also revises SeparableBody from the previous commit: it no longer holds a shared "separation" attribute. Stage's release event is named separation, Deployable's is named ejection - forcing both through one base attribute name was misleading, so each subclass now owns its own. --- rocketpy/rocket/multistage.py | 96 ++++++++++++++++++++++++++-- tests/unit/rocket/test_multistage.py | 63 +++++++++++++++++- 2 files changed, 151 insertions(+), 8 deletions(-) diff --git a/rocketpy/rocket/multistage.py b/rocketpy/rocket/multistage.py index e30a60d71..22712ccc3 100644 --- a/rocketpy/rocket/multistage.py +++ b/rocketpy/rocket/multistage.py @@ -10,16 +10,20 @@ class SeparableBody: name : str Unique body name within the vehicle; used to group Mission results (e.g. ``mission.flights["booster"]``). - separation : Event, optional - Event that releases this body. If None, never separates. separation_delta_v : float, optional Relative separation speed along the stack's longitudinal axis, in m/s, split by momentum conservation. Default 0. + + Notes + ----- + Subclasses each hold their own release-event attribute under its own + name (``Stage.separation``, ``Deployable.ejection``) rather than a + shared base attribute, since the two events are conceptually similar + but not interchangeable. """ - def __init__(self, name, separation=None, separation_delta_v=0.0): + def __init__(self, name, separation_delta_v=0.0): self.name = name - self.separation = separation self.separation_delta_v = separation_delta_v @@ -56,10 +60,9 @@ def __init__( ignition=None, ignition_delay=0.0, ): - super().__init__( - name=name, separation=separation, separation_delta_v=separation_delta_v - ) + super().__init__(name=name, separation_delta_v=separation_delta_v) self.rocket = rocket + self.separation = separation self.ignition = ignition self.ignition_delay = ignition_delay @@ -72,3 +75,82 @@ def burn_out_time(self): def dry_mass(self): """Stage dry mass (structure + motor dry mass), in kg.""" return self.rocket.dry_mass + + +class Deployable(SeparableBody): + """An inert body carried by the vehicle and ejected in flight. + + No aerodynamic identity while attached: contributes only mass and + inertia at a position inside the carrying stage. + + Free-flight aerodynamics come from one of two sources, mutually + exclusive: + - ``free_rocket``: a fully built Rocket or PointMassRocket (full + control); + - surfaces added with ``add_surface()``: Mission assembles the + free-flight Rocket from the deployable's mass, inertia, radius and + the added surfaces. + + Parameters + ---------- + name : str + Unique body name; used to group Mission results. + mass : float + Carried mass in kg. + inertia : tuple of float + Inertia (I11, I22, I33) about the deployable's own center of + mass, in kg*m^2. + position : float + Position of the deployable's center of mass in the carrying + stage's rocket coordinate system, in meters. + radius : float, optional + The deployable's largest radius in meters. Required only when + defining its free-flight aerodynamics via add_surface(). + free_rocket : Rocket, PointMassRocket, optional + Free-flight configuration after ejection. Mutually exclusive + with add_surface(). + ejection : Event, optional + When the deployable is released, e.g. Event(trigger="apogee"). + separation_delta_v : float, optional + See SeparableBody. + """ + + def __init__( + self, + name, + mass, + inertia, + position, + radius=None, + free_rocket=None, + ejection=None, + separation_delta_v=0.0, + ): + super().__init__(name=name, separation_delta_v=separation_delta_v) + self.mass = mass + self.inertia = inertia + self.position = position + self.radius = radius + self.free_rocket = free_rocket + self.ejection = ejection + self.surfaces = [] + + def add_surface(self, surface, position): + """Add an aerodynamic surface to the deployable's free flight. + + Takes effect only after ejection; while attached the deployable + still contributes only mass and inertia. ``position`` is in the + deployable's own coordinate system, in meters. Requires + ``radius`` to be set and is mutually exclusive with + ``free_rocket``. + """ + if self.free_rocket is not None: + raise ValueError( + "add_surface is mutually exclusive with free_rocket; " + "a free_rocket was already provided for this deployable." + ) + if self.radius is None: + raise ValueError( + "add_surface requires radius to be set on the deployable." + ) + self.surfaces.append((surface, position)) diff --git a/tests/unit/rocket/test_multistage.py b/tests/unit/rocket/test_multistage.py index 8126f8738..3f7787fae 100644 --- a/tests/unit/rocket/test_multistage.py +++ b/tests/unit/rocket/test_multistage.py @@ -1,4 +1,6 @@ -from rocketpy.rocket.multistage import Stage +import pytest + +from rocketpy.rocket.multistage import Deployable, Stage def test_stage_dry_mass_matches_wrapped_rocket(calisto): @@ -11,3 +13,62 @@ def test_stage_burn_out_time_matches_wrapped_rocket_motor(calisto): stage = Stage(name="stage_1", rocket=calisto) assert stage.burn_out_time == calisto.motor.burn_out_time + + +def test_deployable_stores_constructor_arguments(): + deployable = Deployable( + name="payload", + mass=4.5, + inertia=(0.1, 0.1, 0.001), + position=1.10, + radius=0.05, + ) + + assert deployable.name == "payload" + assert deployable.mass == 4.5 + assert deployable.inertia == (0.1, 0.1, 0.001) + assert deployable.position == 1.10 + assert deployable.radius == 0.05 + assert deployable.free_rocket is None + assert deployable.ejection is None + assert not deployable.surfaces + + +def test_add_surface_raises_when_free_rocket_already_set(calisto_nose_cone): + deployable = Deployable( + name="payload", + mass=4.5, + inertia=(0.1, 0.1, 0.001), + position=1.10, + radius=0.05, + free_rocket=object(), + ) + + with pytest.raises(ValueError): + deployable.add_surface(calisto_nose_cone, position=0.5) + + +def test_add_surface_raises_when_radius_not_set(calisto_nose_cone): + deployable = Deployable( + name="payload", + mass=4.5, + inertia=(0.1, 0.1, 0.001), + position=1.10, + ) + + with pytest.raises(ValueError): + deployable.add_surface(calisto_nose_cone, position=0.5) + + +def test_add_surface_appends_surface_and_position(calisto_nose_cone): + deployable = Deployable( + name="payload", + mass=4.5, + inertia=(0.1, 0.1, 0.001), + position=1.10, + radius=0.05, + ) + + deployable.add_surface(calisto_nose_cone, position=0.5) + + assert deployable.surfaces == [(calisto_nose_cone, 0.5)] From 44a0a3bdf9a2abe1e52e56f6ac229cd078f2aa38 Mon Sep 17 00:00:00 2001 From: Ishan Date: Fri, 14 Aug 2026 14:25:31 +0530 Subject: [PATCH 05/10] ENH: add MultiStageRocket to rocketpy.rocket.multistage Third slice of the multistage/mission architecture. MultiStageRocket composes a Stage plus any Deployables aboard into one flight-ready Rocket via flight_rocket(): mass, inertia and center of mass are combined with the parallel axis theorem (reusing tools.parallel_axis_theorem_from_com, the same helper Rocket itself uses for structure+motor composition), then the stage's motor and aerodynamic surfaces are attached to the result. Only a single active stage is supported for now; flight_rocket() raises NotImplementedError otherwise. Multi-stage composition (booster + sustainer together, surfaces repositioned into stack coordinates) is a later commit, matching the roadmap in mission_multistage_design.md. Also adds docs/notebooks/multistage_mission.ipynb, a runnable demo of everything landed so far (Stage, Deployable, MultiStageRocket.flight_rocket single-stage case). Executed end-to-end to confirm it runs, outputs then cleared to match this repo's existing notebook convention (see docs/notebooks/ utilities_usage.ipynb). --- docs/notebooks/multistage_mission.ipynb | 286 ++++++++++++++++++++++++ rocketpy/rocket/multistage.py | 163 ++++++++++++++ tests/unit/rocket/test_multistage.py | 41 +++- 3 files changed, 489 insertions(+), 1 deletion(-) create mode 100644 docs/notebooks/multistage_mission.ipynb diff --git a/docs/notebooks/multistage_mission.ipynb b/docs/notebooks/multistage_mission.ipynb new file mode 100644 index 000000000..0a089f075 --- /dev/null +++ b/docs/notebooks/multistage_mission.ipynb @@ -0,0 +1,286 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Multistage & Mission Architecture\n", + "\n", + "Demonstrates the multistage/mission architecture as it is built up commit by commit (see `mission_multistage_design.md`). Each section below corresponds to one landed commit and is added to as the next commit lands.\n", + "\n", + "**Landed so far:**\n", + "1. `Stage` — wraps a single-stage `Rocket`\n", + "2. `Deployable` — a carried payload released mid-flight\n", + "3. `MultiStageRocket` — composes a stage + its deployables into one flight-ready `Rocket` (single active stage only, for now)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T08:52:32.634504Z", + "iopub.status.busy": "2026-08-14T08:52:32.634292Z", + "iopub.status.idle": "2026-08-14T08:52:33.989471Z", + "shell.execute_reply": "2026-08-14T08:52:33.988977Z" + } + }, + "outputs": [], + "source": [ + "from rocketpy import NoseCone, Rocket, SolidMotor\n", + "from rocketpy.rocket.multistage import Deployable, MultiStageRocket, Stage" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Building a base rocket\n", + "\n", + "`Stage` and `MultiStageRocket` wrap ordinary `Rocket` objects — nothing new is needed to build one. This is the same Calisto rocket used throughout the RocketPy docs." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T08:52:33.991773Z", + "iopub.status.busy": "2026-08-14T08:52:33.991508Z", + "iopub.status.idle": "2026-08-14T08:52:34.015411Z", + "shell.execute_reply": "2026-08-14T08:52:34.015108Z" + } + }, + "outputs": [], + "source": [ + "Pro75M1670 = SolidMotor(\n", + " thrust_source=\"../../data/motors/cesaroni/Cesaroni_M1670.eng\",\n", + " dry_mass=1.815,\n", + " dry_inertia=(0.125, 0.125, 0.002),\n", + " nozzle_radius=33 / 1000,\n", + " grain_number=5,\n", + " grain_density=1815,\n", + " grain_outer_radius=33 / 1000,\n", + " grain_initial_inner_radius=15 / 1000,\n", + " grain_initial_height=120 / 1000,\n", + " grain_separation=5 / 1000,\n", + " grains_center_of_mass_position=0.397,\n", + " center_of_dry_mass_position=0.317,\n", + " nozzle_position=0,\n", + " burn_time=3.9,\n", + " throat_radius=11 / 1000,\n", + " coordinate_system_orientation=\"nozzle_to_combustion_chamber\",\n", + ")\n", + "\n", + "calisto = Rocket(\n", + " radius=127 / 2000,\n", + " mass=14.426,\n", + " inertia=(6.321, 6.321, 0.034),\n", + " power_off_drag=\"../../data/rockets/calisto/powerOffDragCurve.csv\",\n", + " power_on_drag=\"../../data/rockets/calisto/powerOnDragCurve.csv\",\n", + " center_of_mass_without_motor=0,\n", + " coordinate_system_orientation=\"tail_to_nose\",\n", + ")\n", + "calisto.add_motor(Pro75M1670, position=-1.255)\n", + "\n", + "print(f\"calisto.dry_mass = {calisto.dry_mass:.4f} kg\")\n", + "print(f\"calisto.motor.burn_out_time = {calisto.motor.burn_out_time} s\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## `Stage`: wrapping a rocket as one stage of a vehicle\n", + "\n", + "For now `Stage` is a thin wrapper: `dry_mass` and `burn_out_time` just forward to the wrapped `Rocket`'s own already-computed attributes. It becomes meaningful once `MultiStageRocket` composes several stages together (a later commit)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T08:52:34.043634Z", + "iopub.status.busy": "2026-08-14T08:52:34.043428Z", + "iopub.status.idle": "2026-08-14T08:52:34.046144Z", + "shell.execute_reply": "2026-08-14T08:52:34.045821Z" + } + }, + "outputs": [], + "source": [ + "booster = Stage(name=\"booster\", rocket=calisto)\n", + "\n", + "print(f\"booster.dry_mass = {booster.dry_mass:.4f} kg\")\n", + "print(f\"booster.burn_out_time = {booster.burn_out_time} s\")\n", + "\n", + "assert booster.dry_mass == calisto.dry_mass\n", + "assert booster.burn_out_time == calisto.motor.burn_out_time" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## `Deployable`: a payload carried and ejected mid-flight\n", + "\n", + "A `Deployable` contributes only mass and inertia while attached. Its free-flight aerodynamics come from either a fully built `free_rocket`, or surfaces added one at a time with `add_surface()` — the two are mutually exclusive, and `add_surface()` requires `radius` to be set." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T08:52:34.047635Z", + "iopub.status.busy": "2026-08-14T08:52:34.047511Z", + "iopub.status.idle": "2026-08-14T08:52:34.049736Z", + "shell.execute_reply": "2026-08-14T08:52:34.049445Z" + } + }, + "outputs": [], + "source": [ + "payload = Deployable(\n", + " name=\"payload\",\n", + " mass=4.5,\n", + " inertia=(0.1, 0.1, 0.001),\n", + " position=1.10,\n", + " radius=0.05,\n", + ")\n", + "\n", + "print(f\"payload.mass = {payload.mass} kg\")\n", + "print(f\"payload.position = {payload.position} m\")\n", + "print(f\"payload.surfaces (before add_surface) = {payload.surfaces}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T08:52:34.051054Z", + "iopub.status.busy": "2026-08-14T08:52:34.050931Z", + "iopub.status.idle": "2026-08-14T08:52:34.054057Z", + "shell.execute_reply": "2026-08-14T08:52:34.053793Z" + } + }, + "outputs": [], + "source": [ + "# add_surface requires radius to be set\n", + "no_radius_payload = Deployable(\n", + " name=\"no_radius_payload\", mass=1.0, inertia=(0, 0, 0), position=0.5\n", + ")\n", + "nose = NoseCone(length=0.2, kind=\"vonKarman\", base_radius=0.05, rocket_radius=0.05)\n", + "try:\n", + " no_radius_payload.add_surface(nose, position=0.1)\n", + "except ValueError as error:\n", + " print(f\"Raised as expected: {error}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T08:52:34.055368Z", + "iopub.status.busy": "2026-08-14T08:52:34.055256Z", + "iopub.status.idle": "2026-08-14T08:52:34.057211Z", + "shell.execute_reply": "2026-08-14T08:52:34.056893Z" + } + }, + "outputs": [], + "source": [ + "# add_surface and free_rocket are mutually exclusive\n", + "payload.add_surface(nose, position=0.1)\n", + "print(f\"payload.surfaces (after add_surface) = {payload.surfaces}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## `MultiStageRocket`: composing a stage + deployable into one flight-ready `Rocket`\n", + "\n", + "`flight_rocket()` composes the wrapped stage's mass/inertia/CoM with every deployable still aboard (parallel axis theorem), attaches the stage's motor, and reuses its aerodynamic surfaces and drag curve. Only a single active stage is supported so far — multi-stage composition (booster + sustainer together) is a later commit." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T08:52:34.058606Z", + "iopub.status.busy": "2026-08-14T08:52:34.058510Z", + "iopub.status.idle": "2026-08-14T08:52:34.066016Z", + "shell.execute_reply": "2026-08-14T08:52:34.065749Z" + } + }, + "outputs": [], + "source": [ + "vehicle = MultiStageRocket(stages=[booster])\n", + "deployable = vehicle.add_deployable(\n", + " name=\"payload\", mass=4.5, inertia=(0.1, 0.1, 0.001), position=1.10\n", + ")\n", + "\n", + "flight_rocket = vehicle.flight_rocket(\n", + " active_stages=(booster,), carried_deployables=(deployable,)\n", + ")\n", + "\n", + "# Hand-computed weighted average, independent of flight_rocket's own\n", + "# code path — same check used in tests/unit/rocket/test_multistage.py\n", + "expected_mass = calisto.mass + 4.5\n", + "expected_center_of_mass = (\n", + " calisto.mass * calisto.center_of_mass_without_motor + 4.5 * 1.10\n", + ") / expected_mass\n", + "\n", + "print(f\"flight_rocket.mass = {flight_rocket.mass:.4f} kg (expected {expected_mass:.4f})\")\n", + "print(\n", + " f\"flight_rocket.center_of_mass_without_motor = {flight_rocket.center_of_mass_without_motor:.4f} m \"\n", + " f\"(expected {expected_center_of_mass:.4f})\"\n", + ")\n", + "\n", + "assert abs(flight_rocket.mass - expected_mass) < 1e-9\n", + "assert abs(\n", + " flight_rocket.center_of_mass_without_motor - expected_center_of_mass\n", + ") < 1e-9" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Not built yet\n", + "\n", + "Deliberately out of scope for the commits so far (see the roadmap in `mission_multistage_design.md`):\n", + "\n", + "- `flight_rocket()` for more than one active stage (booster + sustainer composed together, surfaces repositioned into stack coordinates)\n", + "- `Mission` — the orchestrator that runs one `Flight` per vehicle configuration with state handoff between them\n", + "- Deterministic time-based separation (motor burnout + delay) and apogee-triggered deployable ejection\n", + "- `StochasticMission`\n", + "\n", + "Each lands as its own commit with its own tests; this notebook grows alongside them." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/rocketpy/rocket/multistage.py b/rocketpy/rocket/multistage.py index 22712ccc3..2fc02ee26 100644 --- a/rocketpy/rocket/multistage.py +++ b/rocketpy/rocket/multistage.py @@ -1,5 +1,8 @@ """Vehicle composition layer for multistage rockets and deployable payloads.""" +from rocketpy.rocket.rocket import Rocket +from rocketpy.tools import parallel_axis_theorem_from_com + class SeparableBody: """A body that starts attached to the vehicle and becomes a free body @@ -154,3 +157,163 @@ def add_surface(self, surface, position): "add_surface requires radius to be set on the deployable." ) self.surfaces.append((surface, position)) + + +class MultiStageRocket: + """A launch vehicle composed of stacked stages and carried deployables. + + Owns the derivation problem: given the stages and deployables, produce + the single-body ``Rocket`` configuration flown during each part of the + mission. Mass, inertia and center of mass are composed automatically. + + Parameters + ---------- + stages : list of Stage or Rocket, optional + Ordered bottom to top: stages[0] burns first (booster), stages[-1] + is the final, surviving stage (sustainer). A plain Rocket is + wrapped in a Stage with defaults (single-stage vehicle). + stack_power_off_drag, stack_power_on_drag : optional + Drag overrides for the full stack, accepting the same inputs as + ``Rocket`` drag (constant, callable, CSV, ...). When None and there + is a single active stage, that stage's own drag curve is reused. + interstage_lengths : list of float, optional + Axial adapter/overlap length between consecutive stages, in + meters, len(stages) - 1 entries. Default zeros. + name : str + """ + + def __init__( + self, + stages=None, + stack_power_off_drag=None, + stack_power_on_drag=None, + interstage_lengths=None, + name="MultiStageRocket", + ): + self.stages = [ + stage + if isinstance(stage, Stage) + else Stage(name=f"stage_{index + 1}", rocket=stage) + for index, stage in enumerate(stages or []) + ] + self.deployables = [] + self.stack_power_off_drag = stack_power_off_drag + self.stack_power_on_drag = stack_power_on_drag + self.interstage_lengths = interstage_lengths + self.name = name + + def add_deployable( + self, + name, + mass, + inertia, + position, + radius=None, + stage=None, + free_rocket=None, + ejection=None, + separation_delta_v=0.0, + ): + """Add a carried body that is ejected during flight. Returns the + Deployable. + + Parameters + ---------- + stage : str, Stage, optional + Which stage carries it. Default: the top stage. + (remaining parameters match Deployable's constructor) + """ + deployable = Deployable( + name=name, + mass=mass, + inertia=inertia, + position=position, + radius=radius, + free_rocket=free_rocket, + ejection=ejection, + separation_delta_v=separation_delta_v, + ) + deployable.stage = stage if stage is not None else self.stages[-1] + self.deployables.append(deployable) + return deployable + + def flight_rocket(self, active_stages, carried_deployables=()): + """Build the single-body Rocket for one part of the mission. + + Composes mass, inertia and CoM of the listed stage and deployables + (parallel axis theorem), attaches its motor, and reuses its + aerodynamic surfaces and drag curve (or the stack override, if + set). + + Parameters + ---------- + active_stages : tuple of Stage + Stages still attached, bottom to top. Only a single active + stage is supported for now; multi-stage composition lands in + a later commit. + carried_deployables : tuple of Deployable + Deployables still aboard. + + Returns + ------- + Rocket + """ + if len(active_stages) != 1: + raise NotImplementedError( + "flight_rocket currently only supports a single active " + "stage; multi-stage composition is not yet implemented." + ) + stage_rocket = active_stages[0].rocket + + total_mass = stage_rocket.mass + sum(d.mass for d in carried_deployables) + center_of_mass = ( + stage_rocket.mass * stage_rocket.center_of_mass_without_motor + + sum(d.mass * d.position for d in carried_deployables) + ) / total_mass + + stage_distance = center_of_mass - stage_rocket.center_of_mass_without_motor + inertia_11 = parallel_axis_theorem_from_com( + stage_rocket.I_11_without_motor, stage_rocket.mass, stage_distance + ) + inertia_22 = parallel_axis_theorem_from_com( + stage_rocket.I_22_without_motor, stage_rocket.mass, stage_distance + ) + inertia_33 = stage_rocket.I_33_without_motor + for deployable in carried_deployables: + distance = center_of_mass - deployable.position + inertia_11 += parallel_axis_theorem_from_com( + deployable.inertia[0], deployable.mass, distance + ) + inertia_22 += parallel_axis_theorem_from_com( + deployable.inertia[1], deployable.mass, distance + ) + inertia_33 += deployable.inertia[2] + + power_off_drag = ( + self.stack_power_off_drag + if self.stack_power_off_drag is not None + else stage_rocket.power_off_drag + ) + power_on_drag = ( + self.stack_power_on_drag + if self.stack_power_on_drag is not None + else stage_rocket.power_on_drag + ) + + composed_rocket = Rocket( + radius=stage_rocket.radius, + mass=total_mass, + inertia=(inertia_11, inertia_22, inertia_33), + power_off_drag=power_off_drag, + power_on_drag=power_on_drag, + center_of_mass_without_motor=center_of_mass, + coordinate_system_orientation=stage_rocket.coordinate_system_orientation, + ) + composed_rocket.add_motor(stage_rocket.motor, stage_rocket.motor_position) + for surface, position in stage_rocket.aerodynamic_surfaces: + composed_rocket.aerodynamic_surfaces.add(surface, position) + composed_rocket.evaluate_center_of_pressure() + composed_rocket.evaluate_stability_margin() + composed_rocket.evaluate_static_margin() + + return composed_rocket diff --git a/tests/unit/rocket/test_multistage.py b/tests/unit/rocket/test_multistage.py index 3f7787fae..b4a19b79b 100644 --- a/tests/unit/rocket/test_multistage.py +++ b/tests/unit/rocket/test_multistage.py @@ -1,6 +1,6 @@ import pytest -from rocketpy.rocket.multistage import Deployable, Stage +from rocketpy.rocket.multistage import Deployable, MultiStageRocket, Stage def test_stage_dry_mass_matches_wrapped_rocket(calisto): @@ -72,3 +72,42 @@ def test_add_surface_appends_surface_and_position(calisto_nose_cone): deployable.add_surface(calisto_nose_cone, position=0.5) assert deployable.surfaces == [(calisto_nose_cone, 0.5)] + + +def test_flight_rocket_mass_with_no_deployables_matches_the_stage(calisto): + stage = Stage(name="stage_1", rocket=calisto) + vehicle = MultiStageRocket(stages=[stage]) + + flight_rocket = vehicle.flight_rocket(active_stages=(stage,)) + + assert flight_rocket.mass == pytest.approx(calisto.mass) + assert flight_rocket.center_of_mass_without_motor == pytest.approx( + calisto.center_of_mass_without_motor + ) + + +def test_flight_rocket_composes_mass_and_center_of_mass_with_a_deployable(calisto): + stage = Stage(name="stage_1", rocket=calisto) + vehicle = MultiStageRocket(stages=[stage]) + deployable = vehicle.add_deployable( + name="payload", + mass=4.5, + inertia=(0.1, 0.1, 0.001), + position=1.10, + ) + + flight_rocket = vehicle.flight_rocket( + active_stages=(stage,), carried_deployables=(deployable,) + ) + + # Hand-computed weighted average of calisto's own mass/CoM and the + # deployable's - independent of flight_rocket's own code path. + expected_mass = calisto.mass + 4.5 + expected_center_of_mass = ( + calisto.mass * calisto.center_of_mass_without_motor + 4.5 * 1.10 + ) / expected_mass + + assert flight_rocket.mass == pytest.approx(expected_mass) + assert flight_rocket.center_of_mass_without_motor == pytest.approx( + expected_center_of_mass + ) From faf2132efd85ce36dd26e559bf1e04156175d989 Mon Sep 17 00:00:00 2001 From: Ishan Date: Fri, 14 Aug 2026 14:39:04 +0530 Subject: [PATCH 06/10] ENH: extend flight_rocket to multiple active stages Fourth slice of the multistage/mission architecture. flight_rocket() now composes any number of active stages, not just one: active_stages[0] is the currently firing stage (its motor becomes the composed Rocket's own motor); every stage above it is inert cargo, contributing its full current mass/inertia/CoM (structure + motor + unburned propellant, evaluated at that stage's own t=0) since its own motor clock hasn't started yet. Default stack drag (no stack_power_off_drag/on_drag override) is now an area-weighted sum of each active stage's own drag curve - the approach mission_multistage_design.md itself leans toward for _derive_stack_drag. This subsumes the single-stage case from the previous commit, so that code path is unchanged in behavior. Split flight_rocket() into _compose_mass_and_center_of_mass and _compose_inertia to keep it under pylint's statement-count limit, mirroring how Rocket itself splits mass/inertia composition into separate evaluate_* methods. Deviation from the design doc: _stack_position_of() (deriving each stage's axial position from interstage_lengths + physical extent) is not implemented. Every active stage's Rocket coordinate system is assumed to already share one common stack frame; positions are used as-is. Flagged in the notebook's "Not built yet" section as remaining work. Also updates docs/notebooks/multistage_mission.ipynb with a two-stage (booster + inert sustainer) demo, executed end-to-end and verified against the same hand-computed values used in test_multistage.py. --- docs/notebooks/multistage_mission.ipynb | 151 +++++++++++++++++++----- rocketpy/rocket/multistage.py | 142 +++++++++++++++------- tests/unit/rocket/test_multistage.py | 107 +++++++++++++++++ 3 files changed, 329 insertions(+), 71 deletions(-) diff --git a/docs/notebooks/multistage_mission.ipynb b/docs/notebooks/multistage_mission.ipynb index 0a089f075..4ddfee736 100644 --- a/docs/notebooks/multistage_mission.ipynb +++ b/docs/notebooks/multistage_mission.ipynb @@ -11,7 +11,8 @@ "**Landed so far:**\n", "1. `Stage` — wraps a single-stage `Rocket`\n", "2. `Deployable` — a carried payload released mid-flight\n", - "3. `MultiStageRocket` — composes a stage + its deployables into one flight-ready `Rocket` (single active stage only, for now)\n" + "3. `MultiStageRocket` — composes a stage + its deployables into one flight-ready `Rocket`\n", + "4. `MultiStageRocket.flight_rocket` for more than one active stage (a booster with an inert sustainer riding on top)\n" ] }, { @@ -19,10 +20,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T08:52:32.634504Z", - "iopub.status.busy": "2026-08-14T08:52:32.634292Z", - "iopub.status.idle": "2026-08-14T08:52:33.989471Z", - "shell.execute_reply": "2026-08-14T08:52:33.988977Z" + "iopub.execute_input": "2026-08-14T09:07:27.168733Z", + "iopub.status.busy": "2026-08-14T09:07:27.168494Z", + "iopub.status.idle": "2026-08-14T09:07:28.612708Z", + "shell.execute_reply": "2026-08-14T09:07:28.612298Z" } }, "outputs": [], @@ -45,10 +46,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T08:52:33.991773Z", - "iopub.status.busy": "2026-08-14T08:52:33.991508Z", - "iopub.status.idle": "2026-08-14T08:52:34.015411Z", - "shell.execute_reply": "2026-08-14T08:52:34.015108Z" + "iopub.execute_input": "2026-08-14T09:07:28.615144Z", + "iopub.status.busy": "2026-08-14T09:07:28.614900Z", + "iopub.status.idle": "2026-08-14T09:07:28.639194Z", + "shell.execute_reply": "2026-08-14T09:07:28.638875Z" } }, "outputs": [], @@ -101,10 +102,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T08:52:34.043634Z", - "iopub.status.busy": "2026-08-14T08:52:34.043428Z", - "iopub.status.idle": "2026-08-14T08:52:34.046144Z", - "shell.execute_reply": "2026-08-14T08:52:34.045821Z" + "iopub.execute_input": "2026-08-14T09:07:28.666448Z", + "iopub.status.busy": "2026-08-14T09:07:28.666250Z", + "iopub.status.idle": "2026-08-14T09:07:28.668832Z", + "shell.execute_reply": "2026-08-14T09:07:28.668508Z" } }, "outputs": [], @@ -132,10 +133,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T08:52:34.047635Z", - "iopub.status.busy": "2026-08-14T08:52:34.047511Z", - "iopub.status.idle": "2026-08-14T08:52:34.049736Z", - "shell.execute_reply": "2026-08-14T08:52:34.049445Z" + "iopub.execute_input": "2026-08-14T09:07:28.670308Z", + "iopub.status.busy": "2026-08-14T09:07:28.670180Z", + "iopub.status.idle": "2026-08-14T09:07:28.672458Z", + "shell.execute_reply": "2026-08-14T09:07:28.672176Z" } }, "outputs": [], @@ -158,10 +159,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T08:52:34.051054Z", - "iopub.status.busy": "2026-08-14T08:52:34.050931Z", - "iopub.status.idle": "2026-08-14T08:52:34.054057Z", - "shell.execute_reply": "2026-08-14T08:52:34.053793Z" + "iopub.execute_input": "2026-08-14T09:07:28.673894Z", + "iopub.status.busy": "2026-08-14T09:07:28.673778Z", + "iopub.status.idle": "2026-08-14T09:07:28.676873Z", + "shell.execute_reply": "2026-08-14T09:07:28.676536Z" } }, "outputs": [], @@ -182,10 +183,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T08:52:34.055368Z", - "iopub.status.busy": "2026-08-14T08:52:34.055256Z", - "iopub.status.idle": "2026-08-14T08:52:34.057211Z", - "shell.execute_reply": "2026-08-14T08:52:34.056893Z" + "iopub.execute_input": "2026-08-14T09:07:28.678288Z", + "iopub.status.busy": "2026-08-14T09:07:28.678173Z", + "iopub.status.idle": "2026-08-14T09:07:28.680214Z", + "shell.execute_reply": "2026-08-14T09:07:28.679876Z" } }, "outputs": [], @@ -209,10 +210,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T08:52:34.058606Z", - "iopub.status.busy": "2026-08-14T08:52:34.058510Z", - "iopub.status.idle": "2026-08-14T08:52:34.066016Z", - "shell.execute_reply": "2026-08-14T08:52:34.065749Z" + "iopub.execute_input": "2026-08-14T09:07:28.681606Z", + "iopub.status.busy": "2026-08-14T09:07:28.681507Z", + "iopub.status.idle": "2026-08-14T09:07:28.689190Z", + "shell.execute_reply": "2026-08-14T09:07:28.688895Z" } }, "outputs": [], @@ -245,6 +246,96 @@ ") < 1e-9" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Multiple active stages: a booster carrying an inert sustainer\n", + "\n", + "When more than one stage is still attached, `flight_rocket()` treats `active_stages[0]` as the currently firing stage (its motor becomes the composed `Rocket`'s own motor) and every other active stage as inert cargo riding along - contributing its *full* current mass (structure + motor + unburned propellant), since its own motor clock hasn't started yet.\n", + "\n", + "Each stage's own `Rocket` coordinate system is assumed to already be expressed in a shared stack frame - positions are used as-is. Deriving stack positions automatically from `interstage_lengths` and each stage's physical extent isn't implemented yet." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T09:07:28.690554Z", + "iopub.status.busy": "2026-08-14T09:07:28.690454Z", + "iopub.status.idle": "2026-08-14T09:07:28.708806Z", + "shell.execute_reply": "2026-08-14T09:07:28.708458Z" + } + }, + "outputs": [], + "source": [ + "from rocketpy.motors.point_mass_motor import PointMassMotor\n", + "\n", + "booster_rocket = Rocket(\n", + " radius=0.1,\n", + " mass=10.0,\n", + " inertia=(1.0, 1.0, 0.01),\n", + " power_off_drag=0.5,\n", + " power_on_drag=0.6,\n", + " center_of_mass_without_motor=0.0,\n", + ")\n", + "booster_rocket.add_motor(\n", + " PointMassMotor(\n", + " thrust_source=100, dry_mass=1.0, propellant_initial_mass=2.0, burn_time=1.0\n", + " ),\n", + " position=0.0,\n", + ")\n", + "two_stage_booster = Stage(name=\"booster\", rocket=booster_rocket)\n", + "\n", + "sustainer_rocket = Rocket(\n", + " radius=0.08,\n", + " mass=5.0,\n", + " inertia=(0.5, 0.5, 0.005),\n", + " power_off_drag=0.3,\n", + " power_on_drag=0.4,\n", + " center_of_mass_without_motor=2.0,\n", + ")\n", + "sustainer_rocket.add_motor(\n", + " PointMassMotor(\n", + " thrust_source=50, dry_mass=0.5, propellant_initial_mass=1.0, burn_time=1.0\n", + " ),\n", + " position=2.0,\n", + ")\n", + "sustainer = Stage(name=\"sustainer\", rocket=sustainer_rocket)\n", + "\n", + "two_stage_vehicle = MultiStageRocket(stages=[two_stage_booster, sustainer])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T09:07:28.710231Z", + "iopub.status.busy": "2026-08-14T09:07:28.710113Z", + "iopub.status.idle": "2026-08-14T09:07:28.725482Z", + "shell.execute_reply": "2026-08-14T09:07:28.725174Z" + } + }, + "outputs": [], + "source": [ + "stacked = two_stage_vehicle.flight_rocket(\n", + " active_stages=(two_stage_booster, sustainer)\n", + ")\n", + "print(f\"stacked.mass = {stacked.mass} kg (booster structure + full inert sustainer)\")\n", + "print(f\"stacked.center_of_mass_without_motor = {stacked.center_of_mass_without_motor:.4f} m\")\n", + "print(f\"stacked.motor is booster_rocket.motor -> {stacked.motor is booster_rocket.motor}\")\n", + "\n", + "after_separation = two_stage_vehicle.flight_rocket(active_stages=(sustainer,))\n", + "print(f\"\\nafter_separation.mass = {after_separation.mass} kg (sustainer structure only)\")\n", + "print(f\"after_separation.motor is sustainer_rocket.motor -> \"\n", + " f\"{after_separation.motor is sustainer_rocket.motor}\")\n", + "\n", + "assert stacked.mass == 10.0 + (5.0 + 0.5 + 1.0)\n", + "assert after_separation.mass == 5.0" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -253,7 +344,7 @@ "\n", "Deliberately out of scope for the commits so far (see the roadmap in `mission_multistage_design.md`):\n", "\n", - "- `flight_rocket()` for more than one active stage (booster + sustainer composed together, surfaces repositioned into stack coordinates)\n", + "- Deriving stack positions from `interstage_lengths` and each stage's physical extent (stages are currently assumed to already share one coordinate frame)\n", "- `Mission` — the orchestrator that runs one `Flight` per vehicle configuration with state handoff between them\n", "- Deterministic time-based separation (motor burnout + delay) and apogee-triggered deployable ejection\n", "- `StochasticMission`\n", diff --git a/rocketpy/rocket/multistage.py b/rocketpy/rocket/multistage.py index 2fc02ee26..ada5708f9 100644 --- a/rocketpy/rocket/multistage.py +++ b/rocketpy/rocket/multistage.py @@ -1,5 +1,7 @@ """Vehicle composition layer for multistage rockets and deployable payloads.""" +import numpy as np + from rocketpy.rocket.rocket import Rocket from rocketpy.tools import parallel_axis_theorem_from_com @@ -240,17 +242,28 @@ def add_deployable( def flight_rocket(self, active_stages, carried_deployables=()): """Build the single-body Rocket for one part of the mission. - Composes mass, inertia and CoM of the listed stage and deployables - (parallel axis theorem), attaches its motor, and reuses its - aerodynamic surfaces and drag curve (or the stack override, if - set). + Composes mass, inertia and CoM of the listed stages and + deployables (parallel axis theorem), attaches the bottom + (first) active stage's motor, and combines the aerodynamic + surfaces and drag curves of every active stage. + + The bottom stage contributes its structure-only mass/inertia + (its motor becomes the composed Rocket's own motor). Every + other active stage is riding along inert - not yet ignited - + so it contributes its *full* current mass/inertia/CoM (structure + + motor + full propellant, evaluated at that stage's own t=0) + as fixed cargo. + + Every active stage's Rocket coordinate system is assumed to + already be expressed in a shared/stack frame (positions are + used as-is); deriving stack positions from interstage_lengths + and each stage's physical extent is not implemented yet. Parameters ---------- active_stages : tuple of Stage - Stages still attached, bottom to top. Only a single active - stage is supported for now; multi-stage composition lands in - a later commit. + Stages still attached, bottom to top. active_stages[0] is + the currently firing stage. carried_deployables : tuple of Deployable Deployables still aboard. @@ -258,62 +271,109 @@ def flight_rocket(self, active_stages, carried_deployables=()): ------- Rocket """ - if len(active_stages) != 1: - raise NotImplementedError( - "flight_rocket currently only supports a single active " - "stage; multi-stage composition is not yet implemented." - ) - stage_rocket = active_stages[0].rocket - - total_mass = stage_rocket.mass + sum(d.mass for d in carried_deployables) - center_of_mass = ( - stage_rocket.mass * stage_rocket.center_of_mass_without_motor - + sum(d.mass * d.position for d in carried_deployables) - ) / total_mass + bottom_rocket = active_stages[0].rocket + upper_stages = active_stages[1:] - stage_distance = center_of_mass - stage_rocket.center_of_mass_without_motor - inertia_11 = parallel_axis_theorem_from_com( - stage_rocket.I_11_without_motor, stage_rocket.mass, stage_distance + total_mass, center_of_mass = self._compose_mass_and_center_of_mass( + bottom_rocket, upper_stages, carried_deployables ) - inertia_22 = parallel_axis_theorem_from_com( - stage_rocket.I_22_without_motor, stage_rocket.mass, stage_distance + inertia_11, inertia_22, inertia_33 = self._compose_inertia( + bottom_rocket, upper_stages, carried_deployables, center_of_mass ) - inertia_33 = stage_rocket.I_33_without_motor - for deployable in carried_deployables: - distance = center_of_mass - deployable.position - inertia_11 += parallel_axis_theorem_from_com( - deployable.inertia[0], deployable.mass, distance - ) - inertia_22 += parallel_axis_theorem_from_com( - deployable.inertia[1], deployable.mass, distance - ) - inertia_33 += deployable.inertia[2] + radius = max(stage.rocket.radius for stage in active_stages) power_off_drag = ( self.stack_power_off_drag if self.stack_power_off_drag is not None - else stage_rocket.power_off_drag + else self._derive_stack_drag(active_stages, "power_off_drag", radius) ) power_on_drag = ( self.stack_power_on_drag if self.stack_power_on_drag is not None - else stage_rocket.power_on_drag + else self._derive_stack_drag(active_stages, "power_on_drag", radius) ) composed_rocket = Rocket( - radius=stage_rocket.radius, + radius=radius, mass=total_mass, inertia=(inertia_11, inertia_22, inertia_33), power_off_drag=power_off_drag, power_on_drag=power_on_drag, center_of_mass_without_motor=center_of_mass, - coordinate_system_orientation=stage_rocket.coordinate_system_orientation, + coordinate_system_orientation=bottom_rocket.coordinate_system_orientation, ) - composed_rocket.add_motor(stage_rocket.motor, stage_rocket.motor_position) - for surface, position in stage_rocket.aerodynamic_surfaces: - composed_rocket.aerodynamic_surfaces.add(surface, position) + composed_rocket.add_motor(bottom_rocket.motor, bottom_rocket.motor_position) + for stage in active_stages: + for surface, position in stage.rocket.aerodynamic_surfaces: + composed_rocket.aerodynamic_surfaces.add(surface, position) composed_rocket.evaluate_center_of_pressure() composed_rocket.evaluate_stability_margin() composed_rocket.evaluate_static_margin() return composed_rocket + + @staticmethod + def _compose_mass_and_center_of_mass(bottom_rocket, upper_stages, deployables): + """Total structural mass and its center, without the bottom + stage's motor (attached separately by the caller). + """ + total_mass = bottom_rocket.mass + weighted_com = bottom_rocket.mass * bottom_rocket.center_of_mass_without_motor + for stage in upper_stages: + stage_mass = stage.rocket.total_mass(0) + total_mass += stage_mass + weighted_com += stage_mass * stage.rocket.center_of_mass(0) + for deployable in deployables: + total_mass += deployable.mass + weighted_com += deployable.mass * deployable.position + return total_mass, weighted_com / total_mass + + @staticmethod + def _compose_inertia(bottom_rocket, upper_stages, deployables, center_of_mass): + """I_11/I_22/I_33 about ``center_of_mass``, via the parallel axis + theorem, matching the mass composition in + ``_compose_mass_and_center_of_mass``. + """ + bottom_distance = center_of_mass - bottom_rocket.center_of_mass_without_motor + inertia_11 = parallel_axis_theorem_from_com( + bottom_rocket.I_11_without_motor, bottom_rocket.mass, bottom_distance + ) + inertia_22 = parallel_axis_theorem_from_com( + bottom_rocket.I_22_without_motor, bottom_rocket.mass, bottom_distance + ) + inertia_33 = bottom_rocket.I_33_without_motor + for stage in upper_stages: + stage_mass = stage.rocket.total_mass(0) + distance = center_of_mass - stage.rocket.center_of_mass(0) + inertia_11 += parallel_axis_theorem_from_com( + stage.rocket.I_11(0), stage_mass, distance + ) + inertia_22 += parallel_axis_theorem_from_com( + stage.rocket.I_22(0), stage_mass, distance + ) + inertia_33 += stage.rocket.I_33(0) + for deployable in deployables: + distance = center_of_mass - deployable.position + inertia_11 += parallel_axis_theorem_from_com( + deployable.inertia[0], deployable.mass, distance + ) + inertia_22 += parallel_axis_theorem_from_com( + deployable.inertia[1], deployable.mass, distance + ) + inertia_33 += deployable.inertia[2] + return inertia_11, inertia_22, inertia_33 + + def _derive_stack_drag(self, active_stages, attr_name, stack_radius): + """Default stack drag curve: each stage's own curve, rescaled by + its own reference area and summed, referenced to the stack area. + Documented approximation: ignores interstage interference. + """ + stack_area = np.pi * stack_radius**2 + combined = None + for stage in active_stages: + stage_rocket = stage.rocket + scaled = getattr(stage_rocket, attr_name) * ( + stage_rocket.area / stack_area + ) + combined = scaled if combined is None else combined + scaled + return combined diff --git a/tests/unit/rocket/test_multistage.py b/tests/unit/rocket/test_multistage.py index b4a19b79b..51c6ddb67 100644 --- a/tests/unit/rocket/test_multistage.py +++ b/tests/unit/rocket/test_multistage.py @@ -1,6 +1,57 @@ import pytest +from rocketpy.motors.point_mass_motor import PointMassMotor from rocketpy.rocket.multistage import Deployable, MultiStageRocket, Stage +from rocketpy.rocket.rocket import Rocket + + +def _two_stage_vehicle(): + """Booster (bottom, firing) + sustainer (upper, inert) test rig. + + Each stage's motor is placed exactly at that stage's own + center_of_mass_without_motor, and PointMassMotor has zero internal + inertia and zero CoM offset from its own attachment point. That + makes each rocket's overall center_of_mass and I_11/I_22/I_33 + time-invariant and exactly equal to the structure-only values given + at construction - so expected values can be hand-computed directly + from the constructor arguments below, without depending on + flight_rocket's own code path. + """ + booster_rocket = Rocket( + radius=0.1, + mass=10.0, + inertia=(1.0, 1.0, 0.01), + power_off_drag=0.5, + power_on_drag=0.6, + center_of_mass_without_motor=0.0, + ) + booster_rocket.add_motor( + PointMassMotor( + thrust_source=100, dry_mass=1.0, propellant_initial_mass=2.0, + burn_time=1.0, + ), + position=0.0, + ) + booster = Stage(name="booster", rocket=booster_rocket) + + sustainer_rocket = Rocket( + radius=0.08, + mass=5.0, + inertia=(0.5, 0.5, 0.005), + power_off_drag=0.3, + power_on_drag=0.4, + center_of_mass_without_motor=2.0, + ) + sustainer_rocket.add_motor( + PointMassMotor( + thrust_source=50, dry_mass=0.5, propellant_initial_mass=1.0, + burn_time=1.0, + ), + position=2.0, + ) + sustainer = Stage(name="sustainer", rocket=sustainer_rocket) + + return booster, sustainer def test_stage_dry_mass_matches_wrapped_rocket(calisto): @@ -111,3 +162,59 @@ def test_flight_rocket_composes_mass_and_center_of_mass_with_a_deployable(calist assert flight_rocket.center_of_mass_without_motor == pytest.approx( expected_center_of_mass ) + + +def test_two_stage_flight_rocket_composes_bottom_stage_plus_inert_upper_stage(): + booster, sustainer = _two_stage_vehicle() + vehicle = MultiStageRocket(stages=[booster, sustainer]) + + flight_rocket = vehicle.flight_rocket(active_stages=(booster, sustainer)) + + # Hand-computed: booster contributes its structure-only mass/CoM (its + # motor becomes flight_rocket's own motor); the inert sustainer + # contributes its FULL mass (structure + dry motor + full propellant, + # since its own motor clock hasn't started) at its own, time-invariant + # center of mass. See _two_stage_vehicle for why these are exact. + sustainer_full_mass = 5.0 + 0.5 + 1.0 # structure + motor dry + propellant + expected_mass = 10.0 + sustainer_full_mass + expected_center_of_mass = (10.0 * 0.0 + sustainer_full_mass * 2.0) / expected_mass + + booster_distance = expected_center_of_mass - 0.0 + sustainer_distance = expected_center_of_mass - 2.0 + expected_inertia_11 = (1.0 + 10.0 * booster_distance**2) + ( + 0.5 + sustainer_full_mass * sustainer_distance**2 + ) + expected_inertia_33 = 0.01 + 0.005 # I_33 unaffected by axial offset + + assert flight_rocket.mass == pytest.approx(expected_mass) + assert flight_rocket.center_of_mass_without_motor == pytest.approx( + expected_center_of_mass + ) + assert flight_rocket.I_11_without_motor == pytest.approx(expected_inertia_11) + assert flight_rocket.I_33_without_motor == pytest.approx(expected_inertia_33) + assert flight_rocket.motor is booster.rocket.motor + + +def test_flight_rocket_after_separation_uses_only_the_remaining_stage(): + booster, sustainer = _two_stage_vehicle() + vehicle = MultiStageRocket(stages=[booster, sustainer]) + + flight_rocket = vehicle.flight_rocket(active_stages=(sustainer,)) + + assert flight_rocket.mass == pytest.approx(sustainer.rocket.mass) + assert flight_rocket.center_of_mass_without_motor == pytest.approx( + sustainer.rocket.center_of_mass_without_motor + ) + assert flight_rocket.motor is sustainer.rocket.motor + + +def test_flight_rocket_combines_surfaces_of_every_active_stage(calisto_nose_cone): + booster, sustainer = _two_stage_vehicle() + sustainer.rocket.add_surfaces(calisto_nose_cone, 0.5) + vehicle = MultiStageRocket(stages=[booster, sustainer]) + + two_stage_rocket = vehicle.flight_rocket(active_stages=(booster, sustainer)) + sustainer_alone_rocket = vehicle.flight_rocket(active_stages=(sustainer,)) + + assert len(two_stage_rocket.aerodynamic_surfaces) == 1 + assert len(sustainer_alone_rocket.aerodynamic_surfaces) == 1 From 5329b291a220da0a6afc959b60762ae16e3b73f7 Mon Sep 17 00:00:00 2001 From: Ishan Date: Fri, 14 Aug 2026 14:45:43 +0530 Subject: [PATCH 07/10] ENH: add Mission orchestrator, degenerate single-flight case Fifth slice of the multistage/mission architecture. Mission is the orchestrator that will eventually walk a vehicle's separation/ ejection events and run one Flight per configuration with state handoff between them (see mission_multistage_design.md). This commit implements only the base case the doc itself calls out as an invariant: "a single-stage vehicle with no deployables degenerates to a thin wrapper around one Flight." A plain Rocket is accepted directly (wrapped internally as a single-stage MultiStageRocket, matching flight_rocket's own auto-wrap behavior). Anything with more than one stage or any deployables raises NotImplementedError for now - multi-stage orchestration and deployable ejection are separate, later commits. mission.timeline records (time, event_name) pairs - ignition, liftoff, rail_departure, impact - sorted by time. Also updates docs/notebooks/multistage_mission.ipynb with a live Mission run against Calisto, executed end-to-end. --- docs/notebooks/multistage_mission.ipynb | 120 ++++++++++++++++-------- rocketpy/simulation/mission.py | 116 +++++++++++++++++++++++ tests/unit/simulation/test_mission.py | 53 +++++++++++ 3 files changed, 251 insertions(+), 38 deletions(-) create mode 100644 rocketpy/simulation/mission.py create mode 100644 tests/unit/simulation/test_mission.py diff --git a/docs/notebooks/multistage_mission.ipynb b/docs/notebooks/multistage_mission.ipynb index 4ddfee736..f591403bf 100644 --- a/docs/notebooks/multistage_mission.ipynb +++ b/docs/notebooks/multistage_mission.ipynb @@ -12,7 +12,8 @@ "1. `Stage` — wraps a single-stage `Rocket`\n", "2. `Deployable` — a carried payload released mid-flight\n", "3. `MultiStageRocket` — composes a stage + its deployables into one flight-ready `Rocket`\n", - "4. `MultiStageRocket.flight_rocket` for more than one active stage (a booster with an inert sustainer riding on top)\n" + "4. `MultiStageRocket.flight_rocket` for more than one active stage (a booster with an inert sustainer riding on top)\n", + "5. `Mission` — orchestrates one `Flight` per vehicle configuration (currently only the degenerate single-stage, no-deployables case: one vehicle, one `Flight`)\n" ] }, { @@ -20,10 +21,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:07:27.168733Z", - "iopub.status.busy": "2026-08-14T09:07:27.168494Z", - "iopub.status.idle": "2026-08-14T09:07:28.612708Z", - "shell.execute_reply": "2026-08-14T09:07:28.612298Z" + "iopub.execute_input": "2026-08-14T09:14:13.695767Z", + "iopub.status.busy": "2026-08-14T09:14:13.695461Z", + "iopub.status.idle": "2026-08-14T09:14:15.115898Z", + "shell.execute_reply": "2026-08-14T09:14:15.115438Z" } }, "outputs": [], @@ -46,10 +47,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:07:28.615144Z", - "iopub.status.busy": "2026-08-14T09:07:28.614900Z", - "iopub.status.idle": "2026-08-14T09:07:28.639194Z", - "shell.execute_reply": "2026-08-14T09:07:28.638875Z" + "iopub.execute_input": "2026-08-14T09:14:15.118313Z", + "iopub.status.busy": "2026-08-14T09:14:15.118055Z", + "iopub.status.idle": "2026-08-14T09:14:15.142164Z", + "shell.execute_reply": "2026-08-14T09:14:15.141816Z" } }, "outputs": [], @@ -102,10 +103,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:07:28.666448Z", - "iopub.status.busy": "2026-08-14T09:07:28.666250Z", - "iopub.status.idle": "2026-08-14T09:07:28.668832Z", - "shell.execute_reply": "2026-08-14T09:07:28.668508Z" + "iopub.execute_input": "2026-08-14T09:14:15.170500Z", + "iopub.status.busy": "2026-08-14T09:14:15.170304Z", + "iopub.status.idle": "2026-08-14T09:14:15.173035Z", + "shell.execute_reply": "2026-08-14T09:14:15.172701Z" } }, "outputs": [], @@ -133,10 +134,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:07:28.670308Z", - "iopub.status.busy": "2026-08-14T09:07:28.670180Z", - "iopub.status.idle": "2026-08-14T09:07:28.672458Z", - "shell.execute_reply": "2026-08-14T09:07:28.672176Z" + "iopub.execute_input": "2026-08-14T09:14:15.174556Z", + "iopub.status.busy": "2026-08-14T09:14:15.174409Z", + "iopub.status.idle": "2026-08-14T09:14:15.176844Z", + "shell.execute_reply": "2026-08-14T09:14:15.176509Z" } }, "outputs": [], @@ -159,10 +160,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:07:28.673894Z", - "iopub.status.busy": "2026-08-14T09:07:28.673778Z", - "iopub.status.idle": "2026-08-14T09:07:28.676873Z", - "shell.execute_reply": "2026-08-14T09:07:28.676536Z" + "iopub.execute_input": "2026-08-14T09:14:15.178186Z", + "iopub.status.busy": "2026-08-14T09:14:15.178070Z", + "iopub.status.idle": "2026-08-14T09:14:15.181087Z", + "shell.execute_reply": "2026-08-14T09:14:15.180771Z" } }, "outputs": [], @@ -183,10 +184,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:07:28.678288Z", - "iopub.status.busy": "2026-08-14T09:07:28.678173Z", - "iopub.status.idle": "2026-08-14T09:07:28.680214Z", - "shell.execute_reply": "2026-08-14T09:07:28.679876Z" + "iopub.execute_input": "2026-08-14T09:14:15.182384Z", + "iopub.status.busy": "2026-08-14T09:14:15.182283Z", + "iopub.status.idle": "2026-08-14T09:14:15.184190Z", + "shell.execute_reply": "2026-08-14T09:14:15.183898Z" } }, "outputs": [], @@ -210,10 +211,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:07:28.681606Z", - "iopub.status.busy": "2026-08-14T09:07:28.681507Z", - "iopub.status.idle": "2026-08-14T09:07:28.689190Z", - "shell.execute_reply": "2026-08-14T09:07:28.688895Z" + "iopub.execute_input": "2026-08-14T09:14:15.185595Z", + "iopub.status.busy": "2026-08-14T09:14:15.185490Z", + "iopub.status.idle": "2026-08-14T09:14:15.193370Z", + "shell.execute_reply": "2026-08-14T09:14:15.193085Z" } }, "outputs": [], @@ -262,10 +263,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:07:28.690554Z", - "iopub.status.busy": "2026-08-14T09:07:28.690454Z", - "iopub.status.idle": "2026-08-14T09:07:28.708806Z", - "shell.execute_reply": "2026-08-14T09:07:28.708458Z" + "iopub.execute_input": "2026-08-14T09:14:15.194759Z", + "iopub.status.busy": "2026-08-14T09:14:15.194664Z", + "iopub.status.idle": "2026-08-14T09:14:15.212474Z", + "shell.execute_reply": "2026-08-14T09:14:15.212187Z" } }, "outputs": [], @@ -312,10 +313,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:07:28.710231Z", - "iopub.status.busy": "2026-08-14T09:07:28.710113Z", - "iopub.status.idle": "2026-08-14T09:07:28.725482Z", - "shell.execute_reply": "2026-08-14T09:07:28.725174Z" + "iopub.execute_input": "2026-08-14T09:14:15.213789Z", + "iopub.status.busy": "2026-08-14T09:14:15.213693Z", + "iopub.status.idle": "2026-08-14T09:14:15.228796Z", + "shell.execute_reply": "2026-08-14T09:14:15.228517Z" } }, "outputs": [], @@ -336,6 +337,48 @@ "assert after_separation.mass == 5.0" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## `Mission`: the degenerate single-flight case\n", + "\n", + "`Mission` is the orchestrator that will eventually walk a vehicle's separation/ejection events and run one `Flight` per configuration with state handoff between them. Right now only the simplest case is implemented: a single-stage vehicle with no deployables degenerates to a thin wrapper around one `Flight` - confirming the invariant stated in `mission_multistage_design.md`. Anything else raises `NotImplementedError` for now.\n", + "\n", + "A plain `Rocket` is sugar for a single-stage `MultiStageRocket` with nothing separable, so `Mission` accepts either directly." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T09:14:15.230304Z", + "iopub.status.busy": "2026-08-14T09:14:15.230175Z", + "iopub.status.idle": "2026-08-14T09:14:15.293164Z", + "shell.execute_reply": "2026-08-14T09:14:15.292806Z" + } + }, + "outputs": [], + "source": [ + "from rocketpy import Environment\n", + "from rocketpy.simulation.mission import Mission\n", + "\n", + "mission = Mission(\n", + " vehicle=calisto,\n", + " environment=Environment(),\n", + " rail_length=5.2,\n", + " inclination=85,\n", + " heading=0,\n", + ")\n", + "\n", + "print(f\"bodies flown: {list(mission.flights.keys())}\")\n", + "print(f\"flights for 'stage_1': {mission.flights['stage_1']}\")\n", + "print(\"\\ntimeline:\")\n", + "for time, event in mission.timeline:\n", + " print(f\" t={time:8.3f}s {event}\")" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -345,7 +388,8 @@ "Deliberately out of scope for the commits so far (see the roadmap in `mission_multistage_design.md`):\n", "\n", "- Deriving stack positions from `interstage_lengths` and each stage's physical extent (stages are currently assumed to already share one coordinate frame)\n", - "- `Mission` — the orchestrator that runs one `Flight` per vehicle configuration with state handoff between them\n", + "- `Mission` for more than one stage or any deployables: separation timing, ignition delays, and state handoff between Flights\n", + "- `Mission` deployable ejection (apogee-triggered, via `terminate_on_apogee`)\n", "- Deterministic time-based separation (motor burnout + delay) and apogee-triggered deployable ejection\n", "- `StochasticMission`\n", "\n", diff --git a/rocketpy/simulation/mission.py b/rocketpy/simulation/mission.py new file mode 100644 index 000000000..f9b3d3089 --- /dev/null +++ b/rocketpy/simulation/mission.py @@ -0,0 +1,116 @@ +"""Mission – orchestrates one Flight per vehicle configuration.""" + +from rocketpy.rocket.multistage import MultiStageRocket +from rocketpy.simulation.flight import Flight + + +class Mission: + """Simulate a complete mission: a vehicle that splits into multiple + bodies, each simulated to impact (or until max_time). + + Walks the vehicle's separation/ejection events, runs one Flight per + vehicle configuration with correct state handoff between them, and + groups the resulting Flight objects per physical body along with a + global event timeline. + + A single-stage vehicle with no deployables degenerates to a thin + wrapper around one Flight - the only case implemented so far. + Multi-stage orchestration (separation, ignition delays, state + handoff) and deployable ejection are later commits. + + Parameters + ---------- + vehicle : MultiStageRocket or Rocket + The vehicle to fly. A plain Rocket is sugar for a single-stage + MultiStageRocket with nothing separable (one Flight). + environment : Environment + rail_length, inclination, heading : same vocabulary as Flight. + max_time : float + Mission-wide limit in seconds; every body's flight ends by then. + (remaining solver parameters are passed through to each Flight) + + Attributes + ---------- + flights : dict + Body name -> list of Flight, in time order. Currently always + exactly one body with exactly one Flight. + timeline : list of (float, str) + (time, event_name) tuples sorted by time. Canonical names so + far: "ignition:", "liftoff", "impact:". + """ + + def __init__( + self, + vehicle, + environment, + rail_length, + inclination=80.0, + heading=90.0, + name="Mission", + max_time=600, + rtol=1e-6, + atol=None, + time_overshoot=True, + ode_solver="LSODA", + verbose=False, + ): + self.vehicle = ( + vehicle + if isinstance(vehicle, MultiStageRocket) + else MultiStageRocket(stages=[vehicle]) + ) + self.environment = environment + self.rail_length = rail_length + self.inclination = inclination + self.heading = heading + self.name = name + self.max_time = max_time + self.rtol = rtol + self.atol = atol + self.time_overshoot = time_overshoot + self.ode_solver = ode_solver + self.verbose = verbose + + self.flights = {} + self.timeline = [] + self._simulate() + + def _simulate(self): + """Run the mission. + + Only the degenerate case is implemented so far: a single stage, + no deployables aboard, flown once from the rail to impact (or + max_time). Anything else raises NotImplementedError until + multi-stage orchestration lands. + """ + if len(self.vehicle.stages) != 1 or self.vehicle.deployables: + raise NotImplementedError( + "Mission currently only supports a single-stage vehicle " + "with no deployables; multi-stage orchestration is not " + "yet implemented." + ) + stage = self.vehicle.stages[0] + rocket = self.vehicle.flight_rocket(active_stages=(stage,)) + + self.timeline.append((0.0, f"ignition:{stage.name}")) + self.timeline.append((0.0, "liftoff")) + + flight = Flight( + rocket=rocket, + environment=self.environment, + rail_length=self.rail_length, + inclination=self.inclination, + heading=self.heading, + max_time=self.max_time, + rtol=self.rtol, + atol=self.atol, + time_overshoot=self.time_overshoot, + ode_solver=self.ode_solver, + verbose=self.verbose, + ) + + self.timeline.append((flight.out_of_rail_time, "rail_departure")) + self.timeline.append((flight.t_final, f"impact:{stage.name}")) + self.timeline.sort(key=lambda entry: entry[0]) + + self.flights[stage.name] = [flight] diff --git a/tests/unit/simulation/test_mission.py b/tests/unit/simulation/test_mission.py new file mode 100644 index 000000000..8d3820d77 --- /dev/null +++ b/tests/unit/simulation/test_mission.py @@ -0,0 +1,53 @@ +from rocketpy import Flight +from rocketpy.rocket.multistage import MultiStageRocket, Stage +from rocketpy.simulation.mission import Mission + + +def test_mission_degenerates_to_a_single_flight_for_a_plain_rocket( + calisto, example_plain_env +): + mission = Mission( + vehicle=calisto, + environment=example_plain_env, + rail_length=5.2, + inclination=85, + heading=0, + ) + + assert list(mission.flights.keys()) == ["stage_1"] + assert len(mission.flights["stage_1"]) == 1 + assert isinstance(mission.flights["stage_1"][0], Flight) + + +def test_mission_timeline_has_ignition_liftoff_and_impact_only( + calisto, example_plain_env +): + mission = Mission( + vehicle=calisto, + environment=example_plain_env, + rail_length=5.2, + inclination=85, + heading=0, + ) + + event_names = [name for _, name in mission.timeline] + + assert "liftoff" in event_names + assert any(name.startswith("ignition:") for name in event_names) + assert any(name.startswith("impact:") for name in event_names) + assert not any("separation" in name or "ejection" in name for name in event_names) + + +def test_mission_uses_the_stage_name_as_the_flights_key(calisto, example_plain_env): + stage = Stage(name="first_stage", rocket=calisto) + vehicle = MultiStageRocket(stages=[stage]) + + mission = Mission( + vehicle=vehicle, + environment=example_plain_env, + rail_length=5.2, + inclination=85, + heading=0, + ) + + assert list(mission.flights.keys()) == ["first_stage"] From caebcb92f28747cf18620a1c56a7d21d2fe24ea2 Mon Sep 17 00:00:00 2001 From: Ishan Date: Fri, 14 Aug 2026 15:04:36 +0530 Subject: [PATCH 08/10] ENH: add two-stage separation and state handoff to Mission Sixth slice of the multistage/mission architecture, and the most physics-heavy one so far. Mission now runs a real two-stage sequence: full stack (booster firing) -> spent booster falling away on its own -> sustainer continuing on its own, with correct state handoff at each split. Separation and sustainer ignition are deterministic, computed from booster.burn_out_time + booster.separation and sustainer.ignition_delay - there is still no generic mid-flight event/trigger solver in RocketPy, only Flight's max_time and terminate_on_apogee, so Stage.separation is a plain float (delay in seconds after burnout), not an Event. Event-triggered ignition (Stage.ignition) raises NotImplementedError for now. _handoff_state implements mission_multistage_design.md's formula: r_C = r_P + R(q) d, v_C = v_P + R(q)(omega x d) + this child's share of separation_delta_v, using Matrix.transformation for R(q) and the body-frame offset between parent/child center-of-dry-mass for d. separation_delta_v is split between the two children by momentum conservation (_split_separation_delta_v): the booster is spent (dry_mass) and the sustainer hasn't ignited yet (full total_mass at its own t=0). _shift_motor_ignition re-anchors the sustainer's motor so it ignites at its actual mission time rather than its own local t=0 - necessary because Mission runs every Flight in one absolute clock (mission_multistage_design.md's stated design commitment) and Flight has no built-in way to offset a motor's own time origin. Caught two real bugs via the notebook's end-to-end run rather than just unit tests: a test rig with insufficient thrust-to-weight ratio that never left the pad (crashed Flight's impact-detection code with an IndexError), and a notebook max_time too short to reach a genuine impact (mislabeled a mid-flight cutoff as "impact:sustainer"). flight_rocket() is called multiple times per Mission run (once for the stack, again for each child, again inside _shift_motor_ignition) - some redundant Rocket construction, acceptable for a first correct implementation. Also updates docs/notebooks/multistage_mission.ipynb with a full two-stage mission run, executed end-to-end. --- docs/notebooks/multistage_mission.ipynb | 183 +++++++++++++---- rocketpy/simulation/mission.py | 258 +++++++++++++++++++++--- tests/unit/simulation/test_mission.py | 175 ++++++++++++++++ 3 files changed, 548 insertions(+), 68 deletions(-) diff --git a/docs/notebooks/multistage_mission.ipynb b/docs/notebooks/multistage_mission.ipynb index f591403bf..473f30421 100644 --- a/docs/notebooks/multistage_mission.ipynb +++ b/docs/notebooks/multistage_mission.ipynb @@ -13,7 +13,7 @@ "2. `Deployable` — a carried payload released mid-flight\n", "3. `MultiStageRocket` — composes a stage + its deployables into one flight-ready `Rocket`\n", "4. `MultiStageRocket.flight_rocket` for more than one active stage (a booster with an inert sustainer riding on top)\n", - "5. `Mission` — orchestrates one `Flight` per vehicle configuration (currently only the degenerate single-stage, no-deployables case: one vehicle, one `Flight`)\n" + "5. `Mission` — orchestrates one `Flight` per vehicle configuration (single-stage degenerate case, and now a full two-stage mission: deterministic burnout+delay separation, state handoff, and sustainer ignition timing)\n" ] }, { @@ -21,10 +21,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:14:13.695767Z", - "iopub.status.busy": "2026-08-14T09:14:13.695461Z", - "iopub.status.idle": "2026-08-14T09:14:15.115898Z", - "shell.execute_reply": "2026-08-14T09:14:15.115438Z" + "iopub.execute_input": "2026-08-14T09:32:53.749600Z", + "iopub.status.busy": "2026-08-14T09:32:53.749365Z", + "iopub.status.idle": "2026-08-14T09:32:55.135838Z", + "shell.execute_reply": "2026-08-14T09:32:55.135430Z" } }, "outputs": [], @@ -47,10 +47,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:14:15.118313Z", - "iopub.status.busy": "2026-08-14T09:14:15.118055Z", - "iopub.status.idle": "2026-08-14T09:14:15.142164Z", - "shell.execute_reply": "2026-08-14T09:14:15.141816Z" + "iopub.execute_input": "2026-08-14T09:32:55.138191Z", + "iopub.status.busy": "2026-08-14T09:32:55.137935Z", + "iopub.status.idle": "2026-08-14T09:32:55.162940Z", + "shell.execute_reply": "2026-08-14T09:32:55.162606Z" } }, "outputs": [], @@ -103,10 +103,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:14:15.170500Z", - "iopub.status.busy": "2026-08-14T09:14:15.170304Z", - "iopub.status.idle": "2026-08-14T09:14:15.173035Z", - "shell.execute_reply": "2026-08-14T09:14:15.172701Z" + "iopub.execute_input": "2026-08-14T09:32:55.190343Z", + "iopub.status.busy": "2026-08-14T09:32:55.190147Z", + "iopub.status.idle": "2026-08-14T09:32:55.193022Z", + "shell.execute_reply": "2026-08-14T09:32:55.192688Z" } }, "outputs": [], @@ -134,10 +134,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:14:15.174556Z", - "iopub.status.busy": "2026-08-14T09:14:15.174409Z", - "iopub.status.idle": "2026-08-14T09:14:15.176844Z", - "shell.execute_reply": "2026-08-14T09:14:15.176509Z" + "iopub.execute_input": "2026-08-14T09:32:55.194536Z", + "iopub.status.busy": "2026-08-14T09:32:55.194412Z", + "iopub.status.idle": "2026-08-14T09:32:55.196728Z", + "shell.execute_reply": "2026-08-14T09:32:55.196474Z" } }, "outputs": [], @@ -160,10 +160,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:14:15.178186Z", - "iopub.status.busy": "2026-08-14T09:14:15.178070Z", - "iopub.status.idle": "2026-08-14T09:14:15.181087Z", - "shell.execute_reply": "2026-08-14T09:14:15.180771Z" + "iopub.execute_input": "2026-08-14T09:32:55.198195Z", + "iopub.status.busy": "2026-08-14T09:32:55.198072Z", + "iopub.status.idle": "2026-08-14T09:32:55.201107Z", + "shell.execute_reply": "2026-08-14T09:32:55.200801Z" } }, "outputs": [], @@ -184,10 +184,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:14:15.182384Z", - "iopub.status.busy": "2026-08-14T09:14:15.182283Z", - "iopub.status.idle": "2026-08-14T09:14:15.184190Z", - "shell.execute_reply": "2026-08-14T09:14:15.183898Z" + "iopub.execute_input": "2026-08-14T09:32:55.202470Z", + "iopub.status.busy": "2026-08-14T09:32:55.202372Z", + "iopub.status.idle": "2026-08-14T09:32:55.204229Z", + "shell.execute_reply": "2026-08-14T09:32:55.203950Z" } }, "outputs": [], @@ -211,10 +211,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:14:15.185595Z", - "iopub.status.busy": "2026-08-14T09:14:15.185490Z", - "iopub.status.idle": "2026-08-14T09:14:15.193370Z", - "shell.execute_reply": "2026-08-14T09:14:15.193085Z" + "iopub.execute_input": "2026-08-14T09:32:55.205694Z", + "iopub.status.busy": "2026-08-14T09:32:55.205590Z", + "iopub.status.idle": "2026-08-14T09:32:55.214233Z", + "shell.execute_reply": "2026-08-14T09:32:55.213919Z" } }, "outputs": [], @@ -263,10 +263,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:14:15.194759Z", - "iopub.status.busy": "2026-08-14T09:14:15.194664Z", - "iopub.status.idle": "2026-08-14T09:14:15.212474Z", - "shell.execute_reply": "2026-08-14T09:14:15.212187Z" + "iopub.execute_input": "2026-08-14T09:32:55.215684Z", + "iopub.status.busy": "2026-08-14T09:32:55.215576Z", + "iopub.status.idle": "2026-08-14T09:32:55.233550Z", + "shell.execute_reply": "2026-08-14T09:32:55.233244Z" } }, "outputs": [], @@ -313,10 +313,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:14:15.213789Z", - "iopub.status.busy": "2026-08-14T09:14:15.213693Z", - "iopub.status.idle": "2026-08-14T09:14:15.228796Z", - "shell.execute_reply": "2026-08-14T09:14:15.228517Z" + "iopub.execute_input": "2026-08-14T09:32:55.234958Z", + "iopub.status.busy": "2026-08-14T09:32:55.234836Z", + "iopub.status.idle": "2026-08-14T09:32:55.250443Z", + "shell.execute_reply": "2026-08-14T09:32:55.250148Z" } }, "outputs": [], @@ -353,10 +353,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:14:15.230304Z", - "iopub.status.busy": "2026-08-14T09:14:15.230175Z", - "iopub.status.idle": "2026-08-14T09:14:15.293164Z", - "shell.execute_reply": "2026-08-14T09:14:15.292806Z" + "iopub.execute_input": "2026-08-14T09:32:55.251978Z", + "iopub.status.busy": "2026-08-14T09:32:55.251876Z", + "iopub.status.idle": "2026-08-14T09:32:55.314671Z", + "shell.execute_reply": "2026-08-14T09:32:55.314335Z" } }, "outputs": [], @@ -379,6 +379,105 @@ " print(f\" t={time:8.3f}s {event}\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## `Mission`: a real two-stage flight\n", + "\n", + "With two stages, `Mission` runs three `Flight`s: the full stack (booster firing), then the spent booster falling away on its own, and the sustainer continuing on its own. Separation and ignition timing are deterministic - computed ahead of time from `booster.burn_out_time + booster.separation` and `sustainer.ignition_delay` - there's no generic mid-flight event solver in RocketPy today, only `Flight`'s `max_time` and `terminate_on_apogee`.\n", + "\n", + "The handoff between stack and children follows `mission_multistage_design.md`'s `_handoff_state`: the parent's ending position/velocity is transformed by the body-frame offset between the parent and child center-of-dry-mass, rotated into the inertial frame, plus (for the child) its momentum-conserving share of `separation_delta_v`. The sustainer's own motor is additionally re-anchored in time so it ignites at its actual mission time, not its own local t=0 (`_shift_motor_ignition`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T09:32:55.316243Z", + "iopub.status.busy": "2026-08-14T09:32:55.316120Z", + "iopub.status.idle": "2026-08-14T09:32:55.334402Z", + "shell.execute_reply": "2026-08-14T09:32:55.334090Z" + } + }, + "outputs": [], + "source": [ + "from rocketpy.motors.point_mass_motor import PointMassMotor\n", + "\n", + "ts_booster_rocket = Rocket(\n", + " radius=0.1,\n", + " mass=10.0,\n", + " inertia=(1.0, 1.0, 0.01),\n", + " power_off_drag=0.5,\n", + " power_on_drag=0.6,\n", + " center_of_mass_without_motor=0.0,\n", + ")\n", + "ts_booster_rocket.add_motor(\n", + " PointMassMotor(\n", + " thrust_source=400, dry_mass=1.0, propellant_initial_mass=2.0, burn_time=1.0\n", + " ),\n", + " position=0.0,\n", + ")\n", + "# separation: burns out at t=1.0s, jettisoned 0.5s later\n", + "ts_booster = Stage(name=\"booster\", rocket=ts_booster_rocket, separation=0.5)\n", + "\n", + "ts_sustainer_rocket = Rocket(\n", + " radius=0.08,\n", + " mass=5.0,\n", + " inertia=(0.5, 0.5, 0.005),\n", + " power_off_drag=0.3,\n", + " power_on_drag=0.4,\n", + " center_of_mass_without_motor=2.0,\n", + ")\n", + "ts_sustainer_rocket.add_motor(\n", + " PointMassMotor(\n", + " thrust_source=200, dry_mass=0.5, propellant_initial_mass=1.0, burn_time=1.0\n", + " ),\n", + " position=2.0,\n", + ")\n", + "# ignites immediately on separation\n", + "ts_sustainer = Stage(name=\"sustainer\", rocket=ts_sustainer_rocket, ignition_delay=0.0)\n", + "\n", + "two_stage_vehicle = MultiStageRocket(stages=[ts_booster, ts_sustainer])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T09:32:55.335889Z", + "iopub.status.busy": "2026-08-14T09:32:55.335782Z", + "iopub.status.idle": "2026-08-14T09:32:55.377981Z", + "shell.execute_reply": "2026-08-14T09:32:55.377662Z" + } + }, + "outputs": [], + "source": [ + "two_stage_mission = Mission(\n", + " vehicle=two_stage_vehicle,\n", + " environment=Environment(),\n", + " rail_length=1.0,\n", + " inclination=90,\n", + " heading=0,\n", + " max_time=30,\n", + ")\n", + "\n", + "print(f\"bodies flown: {list(two_stage_mission.flights.keys())}\")\n", + "print(\n", + " \"'booster' flights (stack, then booster alone): \"\n", + " f\"{len(two_stage_mission.flights['booster'])}\"\n", + ")\n", + "print(\n", + " \"'sustainer' flights (stack, then sustainer alone): \"\n", + " f\"{len(two_stage_mission.flights['sustainer'])}\"\n", + ")\n", + "print(\"\\ntimeline:\")\n", + "for time, event in two_stage_mission.timeline:\n", + " print(f\" t={time:8.3f}s {event}\")" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -388,7 +487,7 @@ "Deliberately out of scope for the commits so far (see the roadmap in `mission_multistage_design.md`):\n", "\n", "- Deriving stack positions from `interstage_lengths` and each stage's physical extent (stages are currently assumed to already share one coordinate frame)\n", - "- `Mission` for more than one stage or any deployables: separation timing, ignition delays, and state handoff between Flights\n", + "- `Mission` for more than two stages\n", "- `Mission` deployable ejection (apogee-triggered, via `terminate_on_apogee`)\n", "- Deterministic time-based separation (motor burnout + delay) and apogee-triggered deployable ejection\n", "- `StochasticMission`\n", diff --git a/rocketpy/simulation/mission.py b/rocketpy/simulation/mission.py index f9b3d3089..76d7f7493 100644 --- a/rocketpy/simulation/mission.py +++ b/rocketpy/simulation/mission.py @@ -1,22 +1,62 @@ """Mission – orchestrates one Flight per vehicle configuration.""" -from rocketpy.rocket.multistage import MultiStageRocket +from copy import deepcopy + +from rocketpy.mathutils.function import Function +from rocketpy.mathutils.vector_matrix import Matrix, Vector +from rocketpy.rocket.multistage import MultiStageRocket, Stage from rocketpy.simulation.flight import Flight +# Motor attributes that are Functions of the motor's own local time and +# must be re-anchored when a stage ignites later than its own local t=0. +# Constants (nozzle_position, dry inertia, center_of_dry_mass_position, +# ...) don't vary with time and are left untouched. +_MOTOR_TIME_FUNCTIONS = ( + "thrust", + "vacuum_thrust", + "exhaust_velocity", + "total_mass", + "propellant_mass", + "total_mass_flow_rate", + "center_of_mass", + "center_of_propellant_mass", + "I_11", + "I_22", + "I_33", + "I_12", + "I_13", + "I_23", + "propellant_I_11", + "propellant_I_22", + "propellant_I_33", + "propellant_I_12", + "propellant_I_13", + "propellant_I_23", +) + class Mission: """Simulate a complete mission: a vehicle that splits into multiple bodies, each simulated to impact (or until max_time). - Walks the vehicle's separation/ejection events, runs one Flight per + Walks the vehicle's separation/ignition timing, runs one Flight per vehicle configuration with correct state handoff between them, and groups the resulting Flight objects per physical body along with a global event timeline. - A single-stage vehicle with no deployables degenerates to a thin - wrapper around one Flight - the only case implemented so far. - Multi-stage orchestration (separation, ignition delays, state - handoff) and deployable ejection are later commits. + Implemented so far: a single-stage vehicle with no deployables + (degenerates to one Flight), and a two-stage vehicle with no + deployables. Deployable ejection and more than two stages are later + commits. + + Separation and ignition timing are deterministic, computed ahead of + time from motor burn_time and the delays given on each Stage - there + is no generic mid-flight trigger/event solver (Flight only exposes + max_time and terminate_on_apogee for early termination). A Stage's + ``separation`` is therefore a plain float: the delay, in seconds, + after that stage's own motor burns out. ``ignition`` (an + event-triggered alternative to ``ignition_delay``) is not supported + yet. Parameters ---------- @@ -32,11 +72,12 @@ class Mission: Attributes ---------- flights : dict - Body name -> list of Flight, in time order. Currently always - exactly one body with exactly one Flight. + Body name -> list of Flight, in time order. The full stack's + flight appears under every body that was aboard it. timeline : list of (float, str) (time, event_name) tuples sorted by time. Canonical names so - far: "ignition:", "liftoff", "impact:". + far: "ignition:", "liftoff", "rail_departure", + "separation:", "impact:". """ def __init__( @@ -76,32 +117,121 @@ def __init__( self._simulate() def _simulate(self): - """Run the mission. - - Only the degenerate case is implemented so far: a single stage, - no deployables aboard, flown once from the rail to impact (or - max_time). Anything else raises NotImplementedError until - multi-stage orchestration lands. - """ - if len(self.vehicle.stages) != 1 or self.vehicle.deployables: + if self.vehicle.deployables: + raise NotImplementedError( + "Mission does not support deployables yet." + ) + if len(self.vehicle.stages) == 1: + self._simulate_single_stage() + elif len(self.vehicle.stages) == 2: + self._simulate_two_stage() + else: raise NotImplementedError( - "Mission currently only supports a single-stage vehicle " - "with no deployables; multi-stage orchestration is not " - "yet implemented." + "Mission currently supports at most two stages." ) + self.timeline.sort(key=lambda entry: entry[0]) + + def _simulate_single_stage(self): stage = self.vehicle.stages[0] rocket = self.vehicle.flight_rocket(active_stages=(stage,)) self.timeline.append((0.0, f"ignition:{stage.name}")) self.timeline.append((0.0, "liftoff")) - flight = Flight( + flight = self._run_flight(rocket) + + self.timeline.append((flight.out_of_rail_time, "rail_departure")) + self.timeline.append((flight.t_final, f"impact:{stage.name}")) + + self.flights[stage.name] = [flight] + + def _simulate_two_stage(self): + booster, sustainer = self.vehicle.stages + if booster.separation is None: + raise ValueError( + "booster.separation must be set (delay in seconds after " + "burnout) for a two-stage Mission." + ) + if sustainer.ignition is not None: + raise NotImplementedError( + "Event-triggered ignition is not supported yet; use " + "ignition_delay (a deterministic float delay) instead." + ) + + stack_rocket, stack_flight, separation_time = self._run_stack_phase( + booster, sustainer + ) + self.flights[booster.name] = [stack_flight] + self.flights[sustainer.name] = [stack_flight] + + ending_state = stack_flight.solution[-1] + booster_delta_v, sustainer_delta_v = self._split_separation_delta_v( + booster, sustainer + ) + self._run_booster_phase( + booster, stack_rocket, ending_state, booster_delta_v + ) + self._run_sustainer_phase( + sustainer, stack_rocket, ending_state, sustainer_delta_v, separation_time + ) + + def _run_stack_phase(self, booster, sustainer): + """Full stack, booster firing, from the rail to separation.""" + stack_rocket = self.vehicle.flight_rocket(active_stages=(booster, sustainer)) + separation_time = booster.burn_out_time + booster.separation + + self.timeline.append((0.0, f"ignition:{booster.name}")) + self.timeline.append((0.0, "liftoff")) + + stack_flight = self._run_flight(stack_rocket, max_time=separation_time) + self.timeline.append((stack_flight.out_of_rail_time, "rail_departure")) + self.timeline.append((separation_time, f"separation:{booster.name}")) + + return stack_rocket, stack_flight, separation_time + + def _run_booster_phase(self, booster, stack_rocket, ending_state, delta_v): + """Spent booster, falling away on its own from the separation + state onward. + """ + booster_rocket = self.vehicle.flight_rocket(active_stages=(booster,)) + initial_solution = self._handoff_state( + ending_state, stack_rocket, booster_rocket, delta_v + ) + booster_flight = self._run_flight( + booster_rocket, initial_solution=initial_solution + ) + self.timeline.append((booster_flight.t_final, f"impact:{booster.name}")) + self.flights[booster.name].append(booster_flight) + + def _run_sustainer_phase( + self, sustainer, stack_rocket, ending_state, delta_v, separation_time + ): + """Sustainer, igniting after ignition_delay and continuing on its + own from the separation state onward. + """ + ignition_time = separation_time + sustainer.ignition_delay + self.timeline.append((ignition_time, f"ignition:{sustainer.name}")) + + sustainer_rocket = self._shift_motor_ignition(sustainer, ignition_time) + initial_solution = self._handoff_state( + ending_state, stack_rocket, sustainer_rocket, delta_v + ) + sustainer_flight = self._run_flight( + sustainer_rocket, initial_solution=initial_solution + ) + self.timeline.append((sustainer_flight.t_final, f"impact:{sustainer.name}")) + self.flights[sustainer.name].append(sustainer_flight) + + def _run_flight(self, rocket, initial_solution=None, max_time=None): + """Run one Flight in absolute mission time.""" + return Flight( rocket=rocket, environment=self.environment, rail_length=self.rail_length, inclination=self.inclination, heading=self.heading, - max_time=self.max_time, + initial_solution=initial_solution, + max_time=max_time if max_time is not None else self.max_time, rtol=self.rtol, atol=self.atol, time_overshoot=self.time_overshoot, @@ -109,8 +239,84 @@ def _simulate(self): verbose=self.verbose, ) - self.timeline.append((flight.out_of_rail_time, "rail_departure")) - self.timeline.append((flight.t_final, f"impact:{stage.name}")) - self.timeline.sort(key=lambda entry: entry[0]) + @staticmethod + def _split_separation_delta_v(booster, sustainer): + """Momentum-conserving split of booster.separation_delta_v between + the two children at the separation instant: the booster is spent + (dry_mass), the sustainer hasn't ignited yet (full total_mass at + its own t=0). + """ + booster_mass_after = booster.rocket.dry_mass + sustainer_mass_after = sustainer.rocket.total_mass(0) + total_mass_after = booster_mass_after + sustainer_mass_after + delta_v = booster.separation_delta_v + booster_delta_v = -(sustainer_mass_after / total_mass_after) * delta_v + sustainer_delta_v = (booster_mass_after / total_mass_after) * delta_v + return booster_delta_v, sustainer_delta_v - self.flights[stage.name] = [flight] + @staticmethod + def _handoff_state(state, parent_rocket, child_rocket, delta_v): + """Transform a flight's ending state into a child's + initial_solution. + + Flight's state vector tracks the CDM of its own rocket + configuration, so this converts between parent and child CDM: + position gets the body-frame offset rotated into the inertial + frame; velocity additionally picks up omega x offset and this + child's share of separation_delta_v (both along the stack axis, + in the body frame). Quaternion, angular velocity and time are + unchanged - same body frame, same instant, absolute mission time. + """ + t, x, y, z, vx, vy, vz, e0, e1, e2, e3, w1, w2, w3 = state + position = Vector([x, y, z]) + velocity = Vector([vx, vy, vz]) + omega = Vector([w1, w2, w3]) + rotation = Matrix.transformation((e0, e1, e2, e3)) + + offset = ( + child_rocket.center_of_dry_mass_position + - parent_rocket.center_of_dry_mass_position + ) + d = Vector([0, 0, offset]) + + child_position = position + rotation @ d + body_frame_velocity_delta = omega.cross(d) + Vector([0, 0, delta_v]) + child_velocity = velocity + rotation @ body_frame_velocity_delta + + return [ + t, + *child_position, + *child_velocity, + e0, + e1, + e2, + e3, + w1, + w2, + w3, + ] + + def _shift_motor_ignition(self, stage, ignition_time): + """Rocket for ``stage`` flying alone, with its motor's own time + origin shifted so it ignites at ``ignition_time`` (absolute + mission time) instead of its own local t=0. + """ + motor = deepcopy(stage.rocket.motor) + for attr_name in _MOTOR_TIME_FUNCTIONS: + original = getattr(motor, attr_name) + setattr(motor, attr_name, Function(self._shifted(original, ignition_time))) + motor.burn_time = ( + motor.burn_time[0] + ignition_time, + motor.burn_time[1] + ignition_time, + ) + motor.burn_start_time += ignition_time + motor.burn_out_time += ignition_time + + shifted_rocket = deepcopy(stage.rocket) + shifted_rocket.add_motor(motor, stage.rocket.motor_position) + shifted_stage = Stage(name=stage.name, rocket=shifted_rocket) + return self.vehicle.flight_rocket(active_stages=(shifted_stage,)) + + @staticmethod + def _shifted(function, offset): + return lambda t: function(t - offset) diff --git a/tests/unit/simulation/test_mission.py b/tests/unit/simulation/test_mission.py index 8d3820d77..0f641b987 100644 --- a/tests/unit/simulation/test_mission.py +++ b/tests/unit/simulation/test_mission.py @@ -1,8 +1,67 @@ +import pytest + from rocketpy import Flight +from rocketpy.mathutils.vector_matrix import Matrix, Vector +from rocketpy.motors.point_mass_motor import PointMassMotor from rocketpy.rocket.multistage import MultiStageRocket, Stage +from rocketpy.rocket.rocket import Rocket from rocketpy.simulation.mission import Mission +def _two_stage_vehicle( + booster_separation=0.5, + sustainer_ignition_delay=0.0, + booster_separation_delta_v=0.0, +): + """Same lightweight two-stage rig as test_multistage.py's + _two_stage_vehicle, plus separation/ignition timing so Mission can + orchestrate a full two-stage flight. + """ + booster_rocket = Rocket( + radius=0.1, + mass=10.0, + inertia=(1.0, 1.0, 0.01), + power_off_drag=0.5, + power_on_drag=0.6, + center_of_mass_without_motor=0.0, + ) + booster_rocket.add_motor( + PointMassMotor( + thrust_source=400, dry_mass=1.0, propellant_initial_mass=2.0, + burn_time=1.0, + ), + position=0.0, + ) + booster = Stage( + name="booster", + rocket=booster_rocket, + separation=booster_separation, + separation_delta_v=booster_separation_delta_v, + ) + + sustainer_rocket = Rocket( + radius=0.08, + mass=5.0, + inertia=(0.5, 0.5, 0.005), + power_off_drag=0.3, + power_on_drag=0.4, + center_of_mass_without_motor=2.0, + ) + sustainer_rocket.add_motor( + PointMassMotor( + thrust_source=200, dry_mass=0.5, propellant_initial_mass=1.0, + burn_time=1.0, + ), + position=2.0, + ) + sustainer = Stage( + name="sustainer", rocket=sustainer_rocket, + ignition_delay=sustainer_ignition_delay, + ) + + return booster, sustainer + + def test_mission_degenerates_to_a_single_flight_for_a_plain_rocket( calisto, example_plain_env ): @@ -51,3 +110,119 @@ def test_mission_uses_the_stage_name_as_the_flights_key(calisto, example_plain_e ) assert list(mission.flights.keys()) == ["first_stage"] + + +def test_two_stage_mission_separates_at_burnout_plus_delay(example_plain_env): + booster, sustainer = _two_stage_vehicle(booster_separation=0.5) + vehicle = MultiStageRocket(stages=[booster, sustainer]) + + mission = Mission( + vehicle=vehicle, + environment=example_plain_env, + rail_length=1.0, + inclination=90, + heading=0, + max_time=5, + ) + + assert "booster" in mission.flights + assert "sustainer" in mission.flights + # The full stack's flight appears under every body aboard it. + assert mission.flights["sustainer"][0] is mission.flights["booster"][0] + assert len(mission.flights["booster"]) == 2 # stack, then booster alone + assert len(mission.flights["sustainer"]) == 2 # stack, then sustainer alone + + event_times = dict((name, t) for t, name in mission.timeline) + assert event_times["separation:booster"] == pytest.approx(1.5) + assert event_times["ignition:sustainer"] == pytest.approx(1.5) + + +def test_two_stage_mission_handoff_matches_hand_computed_kinematics( + example_plain_env, +): + booster, sustainer = _two_stage_vehicle( + booster_separation=0.5, booster_separation_delta_v=0.0 + ) + vehicle = MultiStageRocket(stages=[booster, sustainer]) + + mission = Mission( + vehicle=vehicle, + environment=example_plain_env, + rail_length=1.0, + inclination=90, + heading=0, + max_time=5, + ) + + stack_flight = mission.flights["booster"][0] + sustainer_flight = mission.flights["sustainer"][-1] + ending_t, x, y, z, vx, vy, vz, e0, e1, e2, e3, w1, w2, w3 = ( + stack_flight.solution[-1] + ) + + # Independent re-derivation of the handoff formula from + # mission_multistage_design.md's _handoff_state, using the actual + # ending state and the actual Rocket objects Mission built - not a + # call into Mission's own code path. + stack_rocket = vehicle.flight_rocket(active_stages=(booster, sustainer)) + offset = ( + sustainer_flight.rocket.center_of_dry_mass_position + - stack_rocket.center_of_dry_mass_position + ) + rotation = Matrix.transformation((e0, e1, e2, e3)) + d = Vector([0, 0, offset]) + omega = Vector([w1, w2, w3]) + + expected_position = Vector([x, y, z]) + rotation @ d + expected_velocity = Vector([vx, vy, vz]) + rotation @ omega.cross(d) + + handoff_state = sustainer_flight.solution[0] + assert handoff_state[0] == pytest.approx(ending_t) + assert handoff_state[1:4] == pytest.approx(list(expected_position)) + assert handoff_state[4:7] == pytest.approx(list(expected_velocity)) + assert handoff_state[7:11] == pytest.approx([e0, e1, e2, e3]) + assert handoff_state[11:14] == pytest.approx([w1, w2, w3]) + + +def test_two_stage_mission_splits_separation_delta_v_by_momentum_conservation( + example_plain_env, +): + delta_v = 2.0 + booster, sustainer = _two_stage_vehicle( + booster_separation=0.5, booster_separation_delta_v=delta_v + ) + vehicle = MultiStageRocket(stages=[booster, sustainer]) + + mission = Mission( + vehicle=vehicle, + environment=example_plain_env, + rail_length=1.0, + inclination=90, + heading=0, + max_time=5, + ) + + # Hand-computed momentum-conserving split, independent of Mission's + # own code path: booster is spent (dry_mass) and sustainer is full + # (total_mass at its own t=0, not yet ignited) at the separation + # instant. + booster_mass_after = booster.rocket.dry_mass + sustainer_mass_after = sustainer.rocket.total_mass(0) + total_mass_after = booster_mass_after + sustainer_mass_after + expected_booster_delta_v = -(sustainer_mass_after / total_mass_after) * delta_v + expected_sustainer_delta_v = (booster_mass_after / total_mass_after) * delta_v + + stack_flight = mission.flights["booster"][0] + ending_vz = stack_flight.solution[-1][6] + + booster_flight = mission.flights["booster"][-1] + sustainer_flight = mission.flights["sustainer"][-1] + + # inclination=90, heading=0 -> identity rotation, so the body-frame + # axial delta_v maps directly onto the inertial vz component. + assert booster_flight.solution[0][6] == pytest.approx( + ending_vz + expected_booster_delta_v + ) + assert sustainer_flight.solution[0][6] == pytest.approx( + ending_vz + expected_sustainer_delta_v + ) From 3c62aa7e5bc396e953a33dd4878cfac875217eca Mon Sep 17 00:00:00 2001 From: Ishan Date: Fri, 14 Aug 2026 15:15:26 +0530 Subject: [PATCH 09/10] ENH: add deployable ejection at apogee to Mission Final slice of the multistage/mission architecture roadmap. A single-stage vehicle with exactly one deployable whose ejection is the string "apogee" now runs three Flights: the carrier stage with the deployable aboard up to apogee (reusing Flight's existing terminate_on_apogee flag - no new event machinery needed, matching the plan's stated approach), then two children from that apogee state onward - the carrier continuing without the deployable's mass, and the deployable flying its own free_rocket. Generalizes the two-stage commit's momentum split (_split_separation_delta_v) into _momentum_split(mass_a, mass_b, delta_v), reused as-is for the carrier/deployable split: same physics, same _handoff_state, just different masses (carrier's total_mass at apogee time vs. the deployable's free_rocket total mass at its own t=0). Deployables built from add_surface() instead of a fully-built free_rocket, and ejection triggers other than "apogee", raise NotImplementedError - out of scope, per the roadmap. Also updates docs/notebooks/multistage_mission.ipynb with the deployable-ejection demo, executed end-to-end, and finalizes the notebook's "Not built yet" section now that all 8 planned commits have landed. --- docs/notebooks/multistage_mission.ipynb | 210 +++++++++++++++++------- rocketpy/simulation/mission.py | 126 +++++++++++--- tests/unit/simulation/test_mission.py | 151 +++++++++++++++++ 3 files changed, 408 insertions(+), 79 deletions(-) diff --git a/docs/notebooks/multistage_mission.ipynb b/docs/notebooks/multistage_mission.ipynb index 473f30421..1ddbd4d83 100644 --- a/docs/notebooks/multistage_mission.ipynb +++ b/docs/notebooks/multistage_mission.ipynb @@ -6,14 +6,14 @@ "source": [ "# Multistage & Mission Architecture\n", "\n", - "Demonstrates the multistage/mission architecture as it is built up commit by commit (see `mission_multistage_design.md`). Each section below corresponds to one landed commit and is added to as the next commit lands.\n", + "Demonstrates the multistage/mission architecture as it is built up commit by commit (see `mission_multistage_design.md`). Each section below corresponds to one landed commit. This is the last item on the original roadmap - see \"Not built yet\" at the bottom for what's deliberately still out of scope.\n", "\n", "**Landed so far:**\n", "1. `Stage` — wraps a single-stage `Rocket`\n", "2. `Deployable` — a carried payload released mid-flight\n", "3. `MultiStageRocket` — composes a stage + its deployables into one flight-ready `Rocket`\n", "4. `MultiStageRocket.flight_rocket` for more than one active stage (a booster with an inert sustainer riding on top)\n", - "5. `Mission` — orchestrates one `Flight` per vehicle configuration (single-stage degenerate case, and now a full two-stage mission: deterministic burnout+delay separation, state handoff, and sustainer ignition timing)\n" + "5. `Mission` — orchestrates one `Flight` per vehicle configuration: the single-stage degenerate case, a full two-stage mission (deterministic burnout+delay separation, state handoff, ignition timing), and a deployable ejecting at apogee\n" ] }, { @@ -21,10 +21,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:32:53.749600Z", - "iopub.status.busy": "2026-08-14T09:32:53.749365Z", - "iopub.status.idle": "2026-08-14T09:32:55.135838Z", - "shell.execute_reply": "2026-08-14T09:32:55.135430Z" + "iopub.execute_input": "2026-08-14T09:43:41.487732Z", + "iopub.status.busy": "2026-08-14T09:43:41.487551Z", + "iopub.status.idle": "2026-08-14T09:43:42.862293Z", + "shell.execute_reply": "2026-08-14T09:43:42.861881Z" } }, "outputs": [], @@ -47,10 +47,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:32:55.138191Z", - "iopub.status.busy": "2026-08-14T09:32:55.137935Z", - "iopub.status.idle": "2026-08-14T09:32:55.162940Z", - "shell.execute_reply": "2026-08-14T09:32:55.162606Z" + "iopub.execute_input": "2026-08-14T09:43:42.864593Z", + "iopub.status.busy": "2026-08-14T09:43:42.864357Z", + "iopub.status.idle": "2026-08-14T09:43:42.889043Z", + "shell.execute_reply": "2026-08-14T09:43:42.888691Z" } }, "outputs": [], @@ -103,10 +103,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:32:55.190343Z", - "iopub.status.busy": "2026-08-14T09:32:55.190147Z", - "iopub.status.idle": "2026-08-14T09:32:55.193022Z", - "shell.execute_reply": "2026-08-14T09:32:55.192688Z" + "iopub.execute_input": "2026-08-14T09:43:42.917413Z", + "iopub.status.busy": "2026-08-14T09:43:42.917223Z", + "iopub.status.idle": "2026-08-14T09:43:42.919902Z", + "shell.execute_reply": "2026-08-14T09:43:42.919550Z" } }, "outputs": [], @@ -134,10 +134,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:32:55.194536Z", - "iopub.status.busy": "2026-08-14T09:32:55.194412Z", - "iopub.status.idle": "2026-08-14T09:32:55.196728Z", - "shell.execute_reply": "2026-08-14T09:32:55.196474Z" + "iopub.execute_input": "2026-08-14T09:43:42.921466Z", + "iopub.status.busy": "2026-08-14T09:43:42.921344Z", + "iopub.status.idle": "2026-08-14T09:43:42.923802Z", + "shell.execute_reply": "2026-08-14T09:43:42.923374Z" } }, "outputs": [], @@ -160,10 +160,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:32:55.198195Z", - "iopub.status.busy": "2026-08-14T09:32:55.198072Z", - "iopub.status.idle": "2026-08-14T09:32:55.201107Z", - "shell.execute_reply": "2026-08-14T09:32:55.200801Z" + "iopub.execute_input": "2026-08-14T09:43:42.925422Z", + "iopub.status.busy": "2026-08-14T09:43:42.925275Z", + "iopub.status.idle": "2026-08-14T09:43:42.928373Z", + "shell.execute_reply": "2026-08-14T09:43:42.928094Z" } }, "outputs": [], @@ -184,10 +184,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:32:55.202470Z", - "iopub.status.busy": "2026-08-14T09:32:55.202372Z", - "iopub.status.idle": "2026-08-14T09:32:55.204229Z", - "shell.execute_reply": "2026-08-14T09:32:55.203950Z" + "iopub.execute_input": "2026-08-14T09:43:42.929756Z", + "iopub.status.busy": "2026-08-14T09:43:42.929637Z", + "iopub.status.idle": "2026-08-14T09:43:42.931975Z", + "shell.execute_reply": "2026-08-14T09:43:42.931472Z" } }, "outputs": [], @@ -211,10 +211,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:32:55.205694Z", - "iopub.status.busy": "2026-08-14T09:32:55.205590Z", - "iopub.status.idle": "2026-08-14T09:32:55.214233Z", - "shell.execute_reply": "2026-08-14T09:32:55.213919Z" + "iopub.execute_input": "2026-08-14T09:43:42.933547Z", + "iopub.status.busy": "2026-08-14T09:43:42.933420Z", + "iopub.status.idle": "2026-08-14T09:43:42.941719Z", + "shell.execute_reply": "2026-08-14T09:43:42.941413Z" } }, "outputs": [], @@ -263,10 +263,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:32:55.215684Z", - "iopub.status.busy": "2026-08-14T09:32:55.215576Z", - "iopub.status.idle": "2026-08-14T09:32:55.233550Z", - "shell.execute_reply": "2026-08-14T09:32:55.233244Z" + "iopub.execute_input": "2026-08-14T09:43:42.943171Z", + "iopub.status.busy": "2026-08-14T09:43:42.943050Z", + "iopub.status.idle": "2026-08-14T09:43:42.961567Z", + "shell.execute_reply": "2026-08-14T09:43:42.961261Z" } }, "outputs": [], @@ -313,10 +313,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:32:55.234958Z", - "iopub.status.busy": "2026-08-14T09:32:55.234836Z", - "iopub.status.idle": "2026-08-14T09:32:55.250443Z", - "shell.execute_reply": "2026-08-14T09:32:55.250148Z" + "iopub.execute_input": "2026-08-14T09:43:42.963017Z", + "iopub.status.busy": "2026-08-14T09:43:42.962909Z", + "iopub.status.idle": "2026-08-14T09:43:42.978386Z", + "shell.execute_reply": "2026-08-14T09:43:42.978094Z" } }, "outputs": [], @@ -353,10 +353,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:32:55.251978Z", - "iopub.status.busy": "2026-08-14T09:32:55.251876Z", - "iopub.status.idle": "2026-08-14T09:32:55.314671Z", - "shell.execute_reply": "2026-08-14T09:32:55.314335Z" + "iopub.execute_input": "2026-08-14T09:43:42.979794Z", + "iopub.status.busy": "2026-08-14T09:43:42.979692Z", + "iopub.status.idle": "2026-08-14T09:43:43.042549Z", + "shell.execute_reply": "2026-08-14T09:43:43.042227Z" } }, "outputs": [], @@ -395,10 +395,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:32:55.316243Z", - "iopub.status.busy": "2026-08-14T09:32:55.316120Z", - "iopub.status.idle": "2026-08-14T09:32:55.334402Z", - "shell.execute_reply": "2026-08-14T09:32:55.334090Z" + "iopub.execute_input": "2026-08-14T09:43:43.044565Z", + "iopub.status.busy": "2026-08-14T09:43:43.044439Z", + "iopub.status.idle": "2026-08-14T09:43:43.062916Z", + "shell.execute_reply": "2026-08-14T09:43:43.062594Z" } }, "outputs": [], @@ -447,10 +447,10 @@ "execution_count": null, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:32:55.335889Z", - "iopub.status.busy": "2026-08-14T09:32:55.335782Z", - "iopub.status.idle": "2026-08-14T09:32:55.377981Z", - "shell.execute_reply": "2026-08-14T09:32:55.377662Z" + "iopub.execute_input": "2026-08-14T09:43:43.064399Z", + "iopub.status.busy": "2026-08-14T09:43:43.064295Z", + "iopub.status.idle": "2026-08-14T09:43:43.106120Z", + "shell.execute_reply": "2026-08-14T09:43:43.105806Z" } }, "outputs": [], @@ -478,21 +478,117 @@ " print(f\" t={time:8.3f}s {event}\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## `Mission`: a deployable ejecting at apogee\n", + "\n", + "A single-stage vehicle with exactly one deployable whose `ejection` is the string `\"apogee\"` runs a different three-`Flight` sequence: the carrier stage flying with the deployable aboard (using the existing `terminate_on_apogee` flag on `Flight` - no new event machinery needed), then two children from the apogee state onward - the carrier stage continuing without the deployable's mass, and the deployable flying its own `free_rocket`.\n", + "\n", + "Same `_handoff_state` transform as the two-stage case, and the same momentum-conserving delta_v split, just generalized: any two children of a split share `separation_delta_v` in inverse proportion to their post-split masses.\n", + "\n", + "`ejection` other than `\"apogee\"`, and deployables defined via `add_surface()` instead of `free_rocket`, aren't supported yet." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T09:43:43.107691Z", + "iopub.status.busy": "2026-08-14T09:43:43.107585Z", + "iopub.status.idle": "2026-08-14T09:43:43.123541Z", + "shell.execute_reply": "2026-08-14T09:43:43.123192Z" + } + }, + "outputs": [], + "source": [ + "carrier_rocket = Rocket(\n", + " radius=0.1,\n", + " mass=10.0,\n", + " inertia=(1.0, 1.0, 0.01),\n", + " power_off_drag=0.5,\n", + " power_on_drag=0.6,\n", + " center_of_mass_without_motor=0.0,\n", + ")\n", + "carrier_rocket.add_motor(\n", + " PointMassMotor(\n", + " thrust_source=400, dry_mass=1.0, propellant_initial_mass=2.0, burn_time=1.0\n", + " ),\n", + " position=0.0,\n", + ")\n", + "carrier = Stage(name=\"carrier\", rocket=carrier_rocket)\n", + "\n", + "payload_rocket = Rocket(\n", + " radius=0.02,\n", + " mass=1.0,\n", + " inertia=(0.001, 0.001, 0.0001),\n", + " power_off_drag=0.5,\n", + " power_on_drag=0.5,\n", + " center_of_mass_without_motor=0.0,\n", + ")\n", + "\n", + "deployable_vehicle = MultiStageRocket(stages=[carrier])\n", + "deployable_vehicle.add_deployable(\n", + " name=\"payload\",\n", + " mass=1.0,\n", + " inertia=(0.001, 0.001, 0.0001),\n", + " position=1.0,\n", + " free_rocket=payload_rocket,\n", + " ejection=\"apogee\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T09:43:43.124953Z", + "iopub.status.busy": "2026-08-14T09:43:43.124823Z", + "iopub.status.idle": "2026-08-14T09:43:43.148440Z", + "shell.execute_reply": "2026-08-14T09:43:43.148160Z" + } + }, + "outputs": [], + "source": [ + "deployable_mission = Mission(\n", + " vehicle=deployable_vehicle,\n", + " environment=Environment(),\n", + " rail_length=1.0,\n", + " inclination=90,\n", + " heading=0,\n", + " max_time=20,\n", + ")\n", + "\n", + "print(f\"bodies flown: {list(deployable_mission.flights.keys())}\")\n", + "print(\n", + " \"'carrier' flights (with payload, then alone): \"\n", + " f\"{len(deployable_mission.flights['carrier'])}\"\n", + ")\n", + "print(\n", + " \"'payload' flights (with carrier, then alone): \"\n", + " f\"{len(deployable_mission.flights['payload'])}\"\n", + ")\n", + "print(\"\\ntimeline:\")\n", + "for time, event in deployable_mission.timeline:\n", + " print(f\" t={time:8.3f}s {event}\")" + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Not built yet\n", "\n", - "Deliberately out of scope for the commits so far (see the roadmap in `mission_multistage_design.md`):\n", + "Deliberately out of scope, not part of the original roadmap's 8 commits (see `mission_multistage_design.md`):\n", "\n", + "- More than two stages, or a deployable combined with a multi-stage vehicle\n", "- Deriving stack positions from `interstage_lengths` and each stage's physical extent (stages are currently assumed to already share one coordinate frame)\n", - "- `Mission` for more than two stages\n", - "- `Mission` deployable ejection (apogee-triggered, via `terminate_on_apogee`)\n", - "- Deterministic time-based separation (motor burnout + delay) and apogee-triggered deployable ejection\n", - "- `StochasticMission`\n", - "\n", - "Each lands as its own commit with its own tests; this notebook grows alongside them." + "- Event-triggered separation/ignition/ejection beyond deterministic delays and `\"apogee\"` (no generic mid-flight trigger/event solver exists in Flight today)\n", + "- Deployables built from `add_surface()` instead of `free_rocket`\n", + "- `StochasticMission`, `to_dict`/`from_dict`, `draw()`/`info()`\n" ] } ], diff --git a/rocketpy/simulation/mission.py b/rocketpy/simulation/mission.py index 76d7f7493..8c9c4bcff 100644 --- a/rocketpy/simulation/mission.py +++ b/rocketpy/simulation/mission.py @@ -117,17 +117,24 @@ def __init__( self._simulate() def _simulate(self): - if self.vehicle.deployables: - raise NotImplementedError( - "Mission does not support deployables yet." - ) - if len(self.vehicle.stages) == 1: + single_stage = len(self.vehicle.stages) == 1 + no_deployables = not self.vehicle.deployables + one_apogee_deployable = len(self.vehicle.deployables) == 1 and ( + self.vehicle.deployables[0].ejection == "apogee" + ) + + if single_stage and no_deployables: self._simulate_single_stage() - elif len(self.vehicle.stages) == 2: + elif single_stage and one_apogee_deployable: + self._simulate_single_stage_with_deployable() + elif len(self.vehicle.stages) == 2 and no_deployables: self._simulate_two_stage() else: raise NotImplementedError( - "Mission currently supports at most two stages." + "Mission currently supports: a single stage alone, a " + "single stage with exactly one deployable ejecting at " + "apogee (ejection='apogee'), or two stages with no " + "deployables." ) self.timeline.sort(key=lambda entry: entry[0]) @@ -145,6 +152,79 @@ def _simulate_single_stage(self): self.flights[stage.name] = [flight] + def _simulate_single_stage_with_deployable(self): + stage = self.vehicle.stages[0] + deployable = self.vehicle.deployables[0] + if deployable.free_rocket is None: + raise NotImplementedError( + "Deployable ejection currently requires free_rocket; " + "building a free-flight Rocket from add_surface()-added " + "surfaces is not yet implemented." + ) + + carrier_rocket, carrier_flight = self._run_carrier_phase(stage, deployable) + self.flights[stage.name] = [carrier_flight] + self.flights[deployable.name] = [carrier_flight] + + ending_state = carrier_flight.solution[-1] + stage_delta_v, deployable_delta_v = self._momentum_split( + stage.rocket.total_mass(carrier_flight.apogee_time), + deployable.free_rocket.total_mass(0), + deployable.separation_delta_v, + ) + self._run_stage_after_ejection_phase( + stage, carrier_rocket, ending_state, stage_delta_v + ) + self._run_deployable_phase( + deployable, carrier_rocket, ending_state, deployable_delta_v + ) + + def _run_carrier_phase(self, stage, deployable): + """Stage carrying the deployable, from the rail to apogee.""" + carrier_rocket = self.vehicle.flight_rocket( + active_stages=(stage,), carried_deployables=(deployable,) + ) + + self.timeline.append((0.0, f"ignition:{stage.name}")) + self.timeline.append((0.0, "liftoff")) + + carrier_flight = self._run_flight(carrier_rocket, terminate_on_apogee=True) + self.timeline.append((carrier_flight.out_of_rail_time, "rail_departure")) + self.timeline.append( + (carrier_flight.apogee_time, f"ejection:{deployable.name}") + ) + + return carrier_rocket, carrier_flight + + def _run_stage_after_ejection_phase( + self, stage, carrier_rocket, ending_state, delta_v + ): + """Carrying stage, continuing on its own after the deployable + leaves. + """ + stage_rocket = self.vehicle.flight_rocket(active_stages=(stage,)) + initial_solution = self._handoff_state( + ending_state, carrier_rocket, stage_rocket, delta_v + ) + stage_flight = self._run_flight( + stage_rocket, initial_solution=initial_solution + ) + self.timeline.append((stage_flight.t_final, f"impact:{stage.name}")) + self.flights[stage.name].append(stage_flight) + + def _run_deployable_phase(self, deployable, carrier_rocket, ending_state, delta_v): + """Deployable, continuing on its own free_rocket after ejection.""" + initial_solution = self._handoff_state( + ending_state, carrier_rocket, deployable.free_rocket, delta_v + ) + deployable_flight = self._run_flight( + deployable.free_rocket, initial_solution=initial_solution + ) + self.timeline.append( + (deployable_flight.t_final, f"impact:{deployable.name}") + ) + self.flights[deployable.name].append(deployable_flight) + def _simulate_two_stage(self): booster, sustainer = self.vehicle.stages if booster.separation is None: @@ -165,8 +245,9 @@ def _simulate_two_stage(self): self.flights[sustainer.name] = [stack_flight] ending_state = stack_flight.solution[-1] - booster_delta_v, sustainer_delta_v = self._split_separation_delta_v( - booster, sustainer + booster_delta_v, sustainer_delta_v = self._momentum_split( + booster.rocket.dry_mass, sustainer.rocket.total_mass(0), + booster.separation_delta_v, ) self._run_booster_phase( booster, stack_rocket, ending_state, booster_delta_v @@ -222,7 +303,9 @@ def _run_sustainer_phase( self.timeline.append((sustainer_flight.t_final, f"impact:{sustainer.name}")) self.flights[sustainer.name].append(sustainer_flight) - def _run_flight(self, rocket, initial_solution=None, max_time=None): + def _run_flight( + self, rocket, initial_solution=None, max_time=None, terminate_on_apogee=False + ): """Run one Flight in absolute mission time.""" return Flight( rocket=rocket, @@ -231,6 +314,7 @@ def _run_flight(self, rocket, initial_solution=None, max_time=None): inclination=self.inclination, heading=self.heading, initial_solution=initial_solution, + terminate_on_apogee=terminate_on_apogee, max_time=max_time if max_time is not None else self.max_time, rtol=self.rtol, atol=self.atol, @@ -240,19 +324,17 @@ def _run_flight(self, rocket, initial_solution=None, max_time=None): ) @staticmethod - def _split_separation_delta_v(booster, sustainer): - """Momentum-conserving split of booster.separation_delta_v between - the two children at the separation instant: the booster is spent - (dry_mass), the sustainer hasn't ignited yet (full total_mass at - its own t=0). + def _momentum_split(mass_a, mass_b, delta_v): + """Momentum-conserving split of a relative separation_delta_v + between two children of masses mass_a and mass_b: returns + (delta_v_a, delta_v_b) such that delta_v_b - delta_v_a == delta_v + and mass_a * delta_v_a + mass_b * delta_v_b == 0 (momentum is + conserved about the common pre-separation velocity). """ - booster_mass_after = booster.rocket.dry_mass - sustainer_mass_after = sustainer.rocket.total_mass(0) - total_mass_after = booster_mass_after + sustainer_mass_after - delta_v = booster.separation_delta_v - booster_delta_v = -(sustainer_mass_after / total_mass_after) * delta_v - sustainer_delta_v = (booster_mass_after / total_mass_after) * delta_v - return booster_delta_v, sustainer_delta_v + total_mass = mass_a + mass_b + delta_v_a = -(mass_b / total_mass) * delta_v + delta_v_b = (mass_a / total_mass) * delta_v + return delta_v_a, delta_v_b @staticmethod def _handoff_state(state, parent_rocket, child_rocket, delta_v): diff --git a/tests/unit/simulation/test_mission.py b/tests/unit/simulation/test_mission.py index 0f641b987..514a25d9b 100644 --- a/tests/unit/simulation/test_mission.py +++ b/tests/unit/simulation/test_mission.py @@ -226,3 +226,154 @@ def test_two_stage_mission_splits_separation_delta_v_by_momentum_conservation( assert sustainer_flight.solution[0][6] == pytest.approx( ending_vz + expected_sustainer_delta_v ) + + +def _single_stage_with_deployable_vehicle(deployable_delta_v=0.0): + """A carrier stage with a payload that ejects at apogee, via a fully + built free_rocket (no add_surface() aerodynamics). + """ + stage_rocket = Rocket( + radius=0.1, + mass=10.0, + inertia=(1.0, 1.0, 0.01), + power_off_drag=0.5, + power_on_drag=0.6, + center_of_mass_without_motor=0.0, + ) + stage_rocket.add_motor( + PointMassMotor( + thrust_source=400, dry_mass=1.0, propellant_initial_mass=2.0, + burn_time=1.0, + ), + position=0.0, + ) + stage = Stage(name="carrier", rocket=stage_rocket) + + payload_rocket = Rocket( + radius=0.02, + mass=1.0, + inertia=(0.001, 0.001, 0.0001), + power_off_drag=0.5, + power_on_drag=0.5, + center_of_mass_without_motor=0.0, + ) + + vehicle = MultiStageRocket(stages=[stage]) + deployable = vehicle.add_deployable( + name="payload", + mass=1.0, + inertia=(0.001, 0.001, 0.0001), + position=1.0, + free_rocket=payload_rocket, + ejection="apogee", + separation_delta_v=deployable_delta_v, + ) + + return vehicle, stage, deployable + + +def test_deployable_ejects_at_apogee(example_plain_env): + vehicle, _, _ = _single_stage_with_deployable_vehicle() + + mission = Mission( + vehicle=vehicle, + environment=example_plain_env, + rail_length=1.0, + inclination=90, + heading=0, + max_time=20, + ) + + assert "carrier" in mission.flights + assert "payload" in mission.flights + # The carrier's flight while the payload is aboard appears under both. + assert mission.flights["payload"][0] is mission.flights["carrier"][0] + assert len(mission.flights["carrier"]) == 2 # carrier+payload, then carrier alone + assert len(mission.flights["payload"]) == 2 # carrier+payload, then payload alone + + carrier_flight = mission.flights["carrier"][0] + event_times = dict((name, t) for t, name in mission.timeline) + assert event_times["ejection:payload"] == pytest.approx(carrier_flight.apogee_time) + assert not any("separation" in name for _, name in mission.timeline) + + +def test_deployable_handoff_matches_hand_computed_kinematics(example_plain_env): + vehicle, stage, deployable = _single_stage_with_deployable_vehicle() + + mission = Mission( + vehicle=vehicle, + environment=example_plain_env, + rail_length=1.0, + inclination=90, + heading=0, + max_time=20, + ) + + carrier_flight = mission.flights["carrier"][0] + payload_flight = mission.flights["payload"][-1] + ending_t, x, y, z, vx, vy, vz, e0, e1, e2, e3, w1, w2, w3 = ( + carrier_flight.solution[-1] + ) + + # Independent re-derivation of the handoff formula, using the actual + # apogee state and the actual Rocket objects Mission built - not a + # call into Mission's own code path. + carrier_rocket = vehicle.flight_rocket( + active_stages=(stage,), carried_deployables=(deployable,) + ) + offset = ( + payload_flight.rocket.center_of_dry_mass_position + - carrier_rocket.center_of_dry_mass_position + ) + rotation = Matrix.transformation((e0, e1, e2, e3)) + d = Vector([0, 0, offset]) + omega = Vector([w1, w2, w3]) + + expected_position = Vector([x, y, z]) + rotation @ d + expected_velocity = Vector([vx, vy, vz]) + rotation @ omega.cross(d) + + handoff_state = payload_flight.solution[0] + assert handoff_state[0] == pytest.approx(ending_t) + assert handoff_state[1:4] == pytest.approx(list(expected_position)) + assert handoff_state[4:7] == pytest.approx(list(expected_velocity)) + + +def test_deployable_splits_separation_delta_v_by_momentum_conservation( + example_plain_env, +): + delta_v = 3.0 + vehicle, stage, deployable = _single_stage_with_deployable_vehicle( + deployable_delta_v=delta_v + ) + + mission = Mission( + vehicle=vehicle, + environment=example_plain_env, + rail_length=1.0, + inclination=90, + heading=0, + max_time=20, + ) + + carrier_flight = mission.flights["carrier"][0] + ending_vz = carrier_flight.solution[-1][6] + + # Hand-computed momentum-conserving split, independent of Mission's + # own code path. + stage_mass_after = stage.rocket.total_mass(carrier_flight.apogee_time) + payload_mass_after = deployable.free_rocket.total_mass(0) + total_mass_after = stage_mass_after + payload_mass_after + expected_stage_delta_v = -(payload_mass_after / total_mass_after) * delta_v + expected_payload_delta_v = (stage_mass_after / total_mass_after) * delta_v + + stage_flight = mission.flights["carrier"][-1] + payload_flight = mission.flights["payload"][-1] + + # inclination=90, heading=0 -> identity rotation, so the body-frame + # axial delta_v maps directly onto the inertial vz component. + assert stage_flight.solution[0][6] == pytest.approx( + ending_vz + expected_stage_delta_v + ) + assert payload_flight.solution[0][6] == pytest.approx( + ending_vz + expected_payload_delta_v + ) From 3711b30da0fa5936b701fcdc70eaacd2faad1a27 Mon Sep 17 00:00:00 2001 From: Ishan Date: Fri, 14 Aug 2026 16:05:20 +0530 Subject: [PATCH 10/10] BUG: populate surfaces_cp_to_cdm in flight_rocket() flight_rocket() copies aerodynamic surfaces directly onto the composed Rocket (bypassing add_surfaces() to avoid double- transforming fin leading-edge positions - see the comment at the copy site). That also skipped evaluate_surfaces_cp_to_cdm(), a step add_surfaces() normally triggers and that Flight.u_dot_generalized requires to apply aerodynamic forces during a real 6DOF simulation. Every existing test flew bare rockets with no surfaces, so this never got exercised - only surfaced when actually running a stage with real aerodynamic surfaces through Mission end-to-end (via the new visualization notebook work). KeyError on rocket.surfaces_cp_to_cdm[aero_surface] the moment such a Flight's ODE integration starts. ENH: add MultiStageRocket.draw() and Mission.all_flights Visualization support, reusing RocketPy's existing plotting entirely - no new drawing or comparison code: - MultiStageRocket.draw() composes every stage via flight_rocket() and hands the result to Rocket's own plots.draw() unchanged. A real multi-diameter stack renders correctly for free, since Rocket's tube-drawing already handles a radius change between surfaces. - Mission.all_flights collects every Flight Mission runs, in execution order, each exactly once (a Flight shared by several bodies, e.g. the full stack, isn't duplicated) - built specifically to feed CompareFlights directly, matching mission_multistage_design.md's stated design ("feeds CompareFlights"). - Every Flight Mission creates now gets a distinguishing name (e.g. "booster+sustainer", "booster", "sustainer") instead of Flight's own "Flight" default, so CompareFlights legends are actually readable with more than one flight in the comparison. Also updates docs/notebooks/multistage_mission.ipynb with draw() and trajectory-comparison demos, executed end-to-end. Departs from this notebook's earlier convention of clearing outputs: plot image outputs are now kept, matching docs/notebooks/getting_started.ipynb rather than the print-only utilities_usage.ipynb, since the whole point of these cells is the rendered image. --- docs/notebooks/multistage_mission.ipynb | 499 ++++++++++++++++++++---- rocketpy/rocket/multistage.py | 15 + rocketpy/simulation/mission.py | 55 ++- tests/unit/rocket/test_multistage.py | 39 ++ tests/unit/simulation/test_mission.py | 75 ++++ 5 files changed, 591 insertions(+), 92 deletions(-) diff --git a/docs/notebooks/multistage_mission.ipynb b/docs/notebooks/multistage_mission.ipynb index 1ddbd4d83..e20d63c4a 100644 --- a/docs/notebooks/multistage_mission.ipynb +++ b/docs/notebooks/multistage_mission.ipynb @@ -13,18 +13,19 @@ "2. `Deployable` — a carried payload released mid-flight\n", "3. `MultiStageRocket` — composes a stage + its deployables into one flight-ready `Rocket`\n", "4. `MultiStageRocket.flight_rocket` for more than one active stage (a booster with an inert sustainer riding on top)\n", - "5. `Mission` — orchestrates one `Flight` per vehicle configuration: the single-stage degenerate case, a full two-stage mission (deterministic burnout+delay separation, state handoff, ignition timing), and a deployable ejecting at apogee\n" + "5. `Mission` — orchestrates one `Flight` per vehicle configuration: the single-stage degenerate case, a full two-stage mission (deterministic burnout+delay separation, state handoff, ignition timing), and a deployable ejecting at apogee\n", + "6. `MultiStageRocket.draw()` and `Mission.all_flights` — visualizing the stacked vehicle and comparing trajectories across bodies, both by reusing RocketPy's existing plotting (`Rocket.plots`, `CompareFlights`) rather than building anything new\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:43:41.487732Z", - "iopub.status.busy": "2026-08-14T09:43:41.487551Z", - "iopub.status.idle": "2026-08-14T09:43:42.862293Z", - "shell.execute_reply": "2026-08-14T09:43:42.861881Z" + "iopub.execute_input": "2026-08-14T10:28:28.798591Z", + "iopub.status.busy": "2026-08-14T10:28:28.798381Z", + "iopub.status.idle": "2026-08-14T10:28:30.031390Z", + "shell.execute_reply": "2026-08-14T10:28:30.030979Z" } }, "outputs": [], @@ -44,16 +45,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:43:42.864593Z", - "iopub.status.busy": "2026-08-14T09:43:42.864357Z", - "iopub.status.idle": "2026-08-14T09:43:42.889043Z", - "shell.execute_reply": "2026-08-14T09:43:42.888691Z" + "iopub.execute_input": "2026-08-14T10:28:30.033820Z", + "iopub.status.busy": "2026-08-14T10:28:30.033567Z", + "iopub.status.idle": "2026-08-14T10:28:30.055827Z", + "shell.execute_reply": "2026-08-14T10:28:30.055516Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "calisto.dry_mass = 16.2410 kg\n", + "calisto.motor.burn_out_time = 3.9 s\n" + ] + } + ], "source": [ "Pro75M1670 = SolidMotor(\n", " thrust_source=\"../../data/motors/cesaroni/Cesaroni_M1670.eng\",\n", @@ -100,16 +110,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:43:42.917413Z", - "iopub.status.busy": "2026-08-14T09:43:42.917223Z", - "iopub.status.idle": "2026-08-14T09:43:42.919902Z", - "shell.execute_reply": "2026-08-14T09:43:42.919550Z" + "iopub.execute_input": "2026-08-14T10:28:30.083344Z", + "iopub.status.busy": "2026-08-14T10:28:30.083128Z", + "iopub.status.idle": "2026-08-14T10:28:30.085823Z", + "shell.execute_reply": "2026-08-14T10:28:30.085512Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "booster.dry_mass = 16.2410 kg\n", + "booster.burn_out_time = 3.9 s\n" + ] + } + ], "source": [ "booster = Stage(name=\"booster\", rocket=calisto)\n", "\n", @@ -131,16 +150,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:43:42.921466Z", - "iopub.status.busy": "2026-08-14T09:43:42.921344Z", - "iopub.status.idle": "2026-08-14T09:43:42.923802Z", - "shell.execute_reply": "2026-08-14T09:43:42.923374Z" + "iopub.execute_input": "2026-08-14T10:28:30.087539Z", + "iopub.status.busy": "2026-08-14T10:28:30.087409Z", + "iopub.status.idle": "2026-08-14T10:28:30.089746Z", + "shell.execute_reply": "2026-08-14T10:28:30.089386Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "payload.mass = 4.5 kg\n", + "payload.position = 1.1 m\n", + "payload.surfaces (before add_surface) = []\n" + ] + } + ], "source": [ "payload = Deployable(\n", " name=\"payload\",\n", @@ -157,16 +186,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:43:42.925422Z", - "iopub.status.busy": "2026-08-14T09:43:42.925275Z", - "iopub.status.idle": "2026-08-14T09:43:42.928373Z", - "shell.execute_reply": "2026-08-14T09:43:42.928094Z" + "iopub.execute_input": "2026-08-14T10:28:30.091166Z", + "iopub.status.busy": "2026-08-14T10:28:30.091045Z", + "iopub.status.idle": "2026-08-14T10:28:30.093960Z", + "shell.execute_reply": "2026-08-14T10:28:30.093696Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Raised as expected: add_surface requires radius to be set on the deployable.\n" + ] + } + ], "source": [ "# add_surface requires radius to be set\n", "no_radius_payload = Deployable(\n", @@ -181,16 +218,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:43:42.929756Z", - "iopub.status.busy": "2026-08-14T09:43:42.929637Z", - "iopub.status.idle": "2026-08-14T09:43:42.931975Z", - "shell.execute_reply": "2026-08-14T09:43:42.931472Z" + "iopub.execute_input": "2026-08-14T10:28:30.095286Z", + "iopub.status.busy": "2026-08-14T10:28:30.095171Z", + "iopub.status.idle": "2026-08-14T10:28:30.097043Z", + "shell.execute_reply": "2026-08-14T10:28:30.096784Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "payload.surfaces (after add_surface) = [(, 0.1)]\n" + ] + } + ], "source": [ "# add_surface and free_rocket are mutually exclusive\n", "payload.add_surface(nose, position=0.1)\n", @@ -208,16 +253,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:43:42.933547Z", - "iopub.status.busy": "2026-08-14T09:43:42.933420Z", - "iopub.status.idle": "2026-08-14T09:43:42.941719Z", - "shell.execute_reply": "2026-08-14T09:43:42.941413Z" + "iopub.execute_input": "2026-08-14T10:28:30.098452Z", + "iopub.status.busy": "2026-08-14T10:28:30.098339Z", + "iopub.status.idle": "2026-08-14T10:28:30.106143Z", + "shell.execute_reply": "2026-08-14T10:28:30.105866Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "flight_rocket.mass = 18.9260 kg (expected 18.9260)\n", + "flight_rocket.center_of_mass_without_motor = 0.2615 m (expected 0.2615)\n" + ] + } + ], "source": [ "vehicle = MultiStageRocket(stages=[booster])\n", "deployable = vehicle.add_deployable(\n", @@ -260,13 +314,13 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:43:42.943171Z", - "iopub.status.busy": "2026-08-14T09:43:42.943050Z", - "iopub.status.idle": "2026-08-14T09:43:42.961567Z", - "shell.execute_reply": "2026-08-14T09:43:42.961261Z" + "iopub.execute_input": "2026-08-14T10:28:30.107516Z", + "iopub.status.busy": "2026-08-14T10:28:30.107416Z", + "iopub.status.idle": "2026-08-14T10:28:30.125272Z", + "shell.execute_reply": "2026-08-14T10:28:30.124982Z" } }, "outputs": [], @@ -310,16 +364,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:43:42.963017Z", - "iopub.status.busy": "2026-08-14T09:43:42.962909Z", - "iopub.status.idle": "2026-08-14T09:43:42.978386Z", - "shell.execute_reply": "2026-08-14T09:43:42.978094Z" + "iopub.execute_input": "2026-08-14T10:28:30.126643Z", + "iopub.status.busy": "2026-08-14T10:28:30.126538Z", + "iopub.status.idle": "2026-08-14T10:28:30.142027Z", + "shell.execute_reply": "2026-08-14T10:28:30.141749Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "stacked.mass = 16.5 kg (booster structure + full inert sustainer)\n", + "stacked.center_of_mass_without_motor = 0.7879 m\n", + "stacked.motor is booster_rocket.motor -> True\n", + "\n", + "after_separation.mass = 5.0 kg (sustainer structure only)\n", + "after_separation.motor is sustainer_rocket.motor -> True\n" + ] + } + ], "source": [ "stacked = two_stage_vehicle.flight_rocket(\n", " active_stages=(two_stage_booster, sustainer)\n", @@ -337,6 +404,76 @@ "assert after_separation.mass == 5.0" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualizing the vehicle: `MultiStageRocket.draw()`\n", + "\n", + "`draw()` composes every stage exactly as `flight_rocket()` would for a flight with the whole stack attached, then hands the result to `Rocket`'s own `plots.draw()` unchanged - no new drawing code. This also means a real two-diameter stack (a wide booster under a narrower sustainer) renders correctly out of the box: `Rocket`'s tube-drawing already handles a radius change between surfaces, it just draws a step rather than a tapered adapter." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T10:28:30.143472Z", + "iopub.status.busy": "2026-08-14T10:28:30.143363Z", + "iopub.status.idle": "2026-08-14T10:28:30.290571Z", + "shell.execute_reply": "2026-08-14T10:28:30.290209Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAACvCAYAAABgk0iHAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAW0tJREFUeJztnQmcTeX/xx+NEhFlq5AtWkkl2UobSkgbSiEpypJSaaG9bGUp2rVHKpSSJEubKGnXKqJNMnbZ/V/vr/9zf2fu3Dtz79zZ7szn/Xqd18zdzj3ne5/znO/+FElNTd3thBBCCCGEECIB9krkw0IIIYQQQgghw0IIIYQQQgiRLShiIYQQQgghhEgYGRZCCCGEEEKIhJFhIYQQQgghhEgYGRZCCCGEEEKIhJFhIYQQQgghhEgYGRZCCCGEEEKIhJFhIYQQQgghhEgYGRZCFADGjx/vDjzwQPfFF1/k9aGIfMDy5cttPDAuhBBCiNxChoUQOaDg+618+fLu6KOPdr169XJ//vln0sh6xIgRbtq0aXEpsX4rW7asq1Gjhrvooovcp59+muPHmqz88MMPbsiQISa/rPLaa6+5Rx99NFuPSwghhMgqRbP8SSFEVG655RZXtWpVt2XLFrdw4UI3YcIEN3/+fPfxxx+7fffdN99LbuTIka5t27bunHPOifkzF1xwgWvevLnbuXOnW7JkiRs3bpw799xz3axZs9xRRx2Vo8ebjPz4449u2LBhrmnTpu7QQw/NsmHx/fffu6uvvjrN81WqVDFDdu+9986moxVCCCEyR4aFEDnAmWee6Y477jj7v3PnzubFHz16tJs+fbo777zzCqTM69at69q3bx963LBhQ3v89NNPuwceeCBXj2XTpk1uv/32c4WVIkWKJIUBK4QQomChVCghcoFGjRrZ32XLlqV5/oMPPnCtWrVylStXdtWqVXOdOnUyT3Y4eJ/79Oljnv+DDjrI1atXz/Xv399t27Yt6neuXbvWDBxSsX7++Wd7buvWrW7w4MHuhBNOsP0cc8wx7o477rDnPaQzoZgTZfHpTaRyZfWcly5dmub5devWWUSH7+YYOBaMrl27dqVLr3r44YfdI488YkbLIYcc4lq3bu0WL16cZn8cGx56vgdDBu9/jx497DX2SaoQx3LwwQe7ww8/3F133XUmmyDUphBxOeyww+x7kG/v3r3TvCfWfR177LGuY8eOFqFC/rwXI/Pll19OkzJ3+eWX2/9EhrycP/roI3vu7bffdh06dAj93scff7wbPny4RYM8bdq0ce+++65bsWJF6PN8d0Y1FrGMN9Kz+Oyvv/5qsuV9RN/4f/PmzZn+7kIIIQovilgIkQv4PPoyZcqEnps7d64pwihuN910k6VNPfnkk+7ss8+213x6zF9//WUpRijkRD9q165thsbUqVPdf//95/bZZ59037d69Wp3/vnnuzVr1ri33nrLVa9e3RTjSy65xC1YsCC0H9JoUJZJXXrxxRfts4899pi79tprTZnt0qWLPccxZsc5o5hiHHBOXbt2NQWXOoy7777b/f3332b0BJk4caLbuHGj6969u8nn8ccfd+3atTMFvEKFCqH37dixw1144YUWJWFfxYsXt+dR/DGQOG+Mjd9++8099dRT7ptvvrHoEalCq1atMqOiXLlydt6lS5c2Zf3NN99Mcyyx7MuDkcP5XXrppWZkvPTSS6aYo/gfeeSRrnHjxu6qq65yTzzxhLv++uvttwD/l+8h4kKKU8mSJc0gQDYbNmyw8wM+t379ehsL9913nz2XUZQm1vHm6datmz13++23u6+++sq98MILVjN05513xj0WhBBCFA5kWAiRA6DwodyjvH3++eeWS1+sWDHXokWL0HuIFBxwwAFuxowZ9heoaWjWrJl5jfHUwz333ONWrlzpZs6cGUqvgltvvdXt3r073XfzXtKt+G4KsPHm+3z8999/3wwNFHAPii5KKgbHSSedZMon0RAU0GBqU2Zg5HDOeNXxdg8cODDkkfdwTkRtUGRr1qxpz6GA45UnOoHyjbERVNA/++wziyLAGWecYUYWEQ6vTAMRF+o5UII9RAxQhlHeMTo81DRQWP7GG2/Y8xg2RB0mTZqURr633XZb3PvyECFC9j5qgzFUp04diyDweyJbXmN/p556qu0nCM974wiIbvAbkVbGcTGWTjvtNDO0OPZYfqdYx5uH4+U38WCkYnzKsBBCCBENpUIJkQOg2NeqVcuUMxTnEiVKmNe6UqVK9jreeTzdF198cUjJA9KWUDQxIoAoAwrqWWedlUbpDebSB8F7TYoMHnwMCG9UAMovHnGOCwPAbyeffLK97tNwsgrKKfs+4ogjLN3mp59+MiUahT94DBg1RDGCx4Byi0HyySefpNkn+/FG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9dVX3eTJk92iRYvswsaSwVvABX7aaae5Ll26uOOPPz7xsxD5jvzWQz2/ILlINhozup40z+RuvQl6xz777JOL3ypE4aZ48eJ23ZGGmNm1F1M1xtixY129evXc+PHjXbNmzdwLL7zgPvjgA/fZZ5+5GTNmuJtuusm+7IILLnAXXnihW7JkSXadi8gn6DeVXDRmdC1pntH8K4QofBSJobYirojFF1984d566y135JFHRnz9hBNOcJdeeqnbunWrGR+ffPKJq1mzZuxHLIQQQgghhEhq1G42GygM7WY3btzoSpYsmdeHke+QXCQbjRldT4VxnsmrdrOkYf/777+uatWqWvckjG7dupkeMmnSpFz7PQoymzdvdl27dnXvvfeelQNQwExnpMLIli1b3G+//WZ11dmSCpWfeOqpp9yxxx5rxcRnnnmm+/zzz6O+97nnnnOtWrVy1atXt+28885L9/5evXq5Aw88MM1GOpdIy59//imRREByiY5kI7nEi8aM5FKQ+fvvv911113njjjiCDMUK1Wq5E455RT32GOPmRKbKCNHjnTjxo1zOW3YPfDAA1ZPi0F50EEH2Tk8++yz1tgnu7j77rstGyYvef75591HH31kqf8rVqwwQzqSnkmHsjp16qR77bXXXrPXDjvsMFeYKJoVq+WJJ54wYeM1oENDkLlz57qcgsLxgQMHugcffNAGHBcjRsCnn37qypcvn+79H3/8sdV9NGjQwBUrVsyNHj3aHs+bN88Kzj1nnHGGGzNmTOgx7xVpob2fSI/kEh3JRnKJF40ZyaWg8uuvv1qNKh7ve+65xx1zzDGma3z77bfmMMXIaNOmTcTPorCjoGZGJMU3u40KnLVff/21u/POO13jxo3NuFiwYIEbMWKE1eKy5Sc45qwW+vObYQTyW2XEfvvtZx2TKANo1KhR6PlnnnnGHXrooa6wEXfEom/fvu7hhx92VapUcS1atHBnn312mi0neeSRR1znzp1dp06d7MdmINOV56WXXor4fgygK664wizJ2rVru4ceesgMIazPIFzcFStWDG2FNdSVEbFMaoURyUWy0ZjR9aR5RmRGnz59bAXj+fPnu4suushqVmvUqOHatm3rpk6d6lq3bp3mvoLjlCwLjIXBgwdbN6wrr7zS1apVy5UqVcodffTRptOEp0LhPA06Tfv16+duvvlmV6FCBVe5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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "from copy import deepcopy\n", + "\n", + "# Draw a self-contained copy - deepcopy so this doesn't affect calisto's\n", + "# use in the later Mission sections below.\n", + "draw_booster_rocket = deepcopy(calisto)\n", + "draw_booster_rocket.add_nose(length=0.55829, kind=\"vonKarman\", position=1.278)\n", + "draw_booster_rocket.add_trapezoidal_fins(\n", + " n=3,\n", + " root_chord=0.120,\n", + " tip_chord=0.040,\n", + " span=0.100,\n", + " position=-1.04956,\n", + ")\n", + "draw_booster_rocket.add_tail(\n", + " top_radius=0.0635, bottom_radius=0.0435, length=0.060, position=-1.194656\n", + ")\n", + "draw_booster = Stage(name=\"draw_booster\", rocket=draw_booster_rocket)\n", + "\n", + "# A second, narrower stage stacked on top - self-contained, its own\n", + "# rocket and nose cone, deliberately not reused anywhere else.\n", + "draw_sustainer_rocket = Rocket(\n", + " radius=0.045,\n", + " mass=3.0,\n", + " inertia=(0.2, 0.2, 0.005),\n", + " power_off_drag=0.5,\n", + " power_on_drag=0.5,\n", + " center_of_mass_without_motor=1.9,\n", + ")\n", + "# small interstage gap after the booster nose tip (x=1.278)\n", + "draw_sustainer_rocket.add_nose(length=0.3, kind=\"conical\", position=1.628)\n", + "draw_sustainer = Stage(name=\"draw_sustainer\", rocket=draw_sustainer_rocket)\n", + "\n", + "draw_vehicle = MultiStageRocket(stages=[draw_booster, draw_sustainer])\n", + "draw_vehicle.draw()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -350,16 +487,38 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:43:42.979794Z", - "iopub.status.busy": "2026-08-14T09:43:42.979692Z", - "iopub.status.idle": "2026-08-14T09:43:43.042549Z", - "shell.execute_reply": "2026-08-14T09:43:43.042227Z" + "iopub.execute_input": "2026-08-14T10:28:30.292264Z", + "iopub.status.busy": "2026-08-14T10:28:30.292131Z", + "iopub.status.idle": "2026-08-14T10:28:30.355561Z", + "shell.execute_reply": "2026-08-14T10:28:30.355263Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "bodies flown: ['stage_1']" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "flights for 'stage_1': [, environment= , rail_length= 5.2, inclination= 85, heading = 0,name= stage_1)>]\n", + "\n", + "timeline:\n", + " t= 0.000s ignition:stage_1\n", + " t= 0.000s liftoff\n", + " t= 0.415s rail_departure\n", + " t= 48.436s impact:stage_1\n" + ] + } + ], "source": [ "from rocketpy import Environment\n", "from rocketpy.simulation.mission import Mission\n", @@ -392,13 +551,13 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:43:43.044565Z", - "iopub.status.busy": "2026-08-14T09:43:43.044439Z", - "iopub.status.idle": "2026-08-14T09:43:43.062916Z", - "shell.execute_reply": "2026-08-14T09:43:43.062594Z" + "iopub.execute_input": "2026-08-14T10:28:30.357208Z", + "iopub.status.busy": "2026-08-14T10:28:30.357065Z", + "iopub.status.idle": "2026-08-14T10:28:30.374729Z", + "shell.execute_reply": "2026-08-14T10:28:30.374451Z" } }, "outputs": [], @@ -444,16 +603,46 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:43:43.064399Z", - "iopub.status.busy": "2026-08-14T09:43:43.064295Z", - "iopub.status.idle": "2026-08-14T09:43:43.106120Z", - "shell.execute_reply": "2026-08-14T09:43:43.105806Z" + "iopub.execute_input": "2026-08-14T10:28:30.376085Z", + "iopub.status.busy": "2026-08-14T10:28:30.375985Z", + "iopub.status.idle": "2026-08-14T10:28:30.416806Z", + "shell.execute_reply": "2026-08-14T10:28:30.416495Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Only one motor per rocket is currently supported. Overwriting previous motor.\n", + "bodies flown: ['booster', 'sustainer']\n", + "'booster' flights (stack, then booster alone): 2\n", + "'sustainer' flights (stack, then sustainer alone): 2\n", + "\n", + "timeline:\n", + " t= 0.000s ignition:booster\n", + " t= 0.000s liftoff\n", + " t= 0.426s rail_departure\n", + " t= 1.500s separation:booster\n", + " t= 1.500s ignition:sustainer\n", + " t= 3.774s impact:booster\n", + " t= 9.412s impact:sustainer\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dubeyishan371/Desktop/Rocketpy-main/RocketPy/rocketpy/simulation/flight.py:1555: UserWarning: A point-mass model was detected. Simulation mode should be '3 DOF'.\n", + " warnings.warn(\n", + "/Users/dubeyishan371/Desktop/Rocketpy-main/RocketPy/rocketpy/motors/motor.py:1165: UserWarning: Reference pressure not set. Returning thrust instead.\n", + " warnings.warn(\n" + ] + } + ], "source": [ "two_stage_mission = Mission(\n", " vehicle=two_stage_vehicle,\n", @@ -493,16 +682,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:43:43.107691Z", - "iopub.status.busy": "2026-08-14T09:43:43.107585Z", - "iopub.status.idle": "2026-08-14T09:43:43.123541Z", - "shell.execute_reply": "2026-08-14T09:43:43.123192Z" + "iopub.execute_input": "2026-08-14T10:28:30.418313Z", + "iopub.status.busy": "2026-08-14T10:28:30.418207Z", + "iopub.status.idle": "2026-08-14T10:28:30.430986Z", + "shell.execute_reply": "2026-08-14T10:28:30.430668Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "carrier_rocket = Rocket(\n", " radius=0.1,\n", @@ -542,16 +742,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": { "execution": { - "iopub.execute_input": "2026-08-14T09:43:43.124953Z", - "iopub.status.busy": "2026-08-14T09:43:43.124823Z", - "iopub.status.idle": "2026-08-14T09:43:43.148440Z", - "shell.execute_reply": "2026-08-14T09:43:43.148160Z" + "iopub.execute_input": "2026-08-14T10:28:30.432357Z", + "iopub.status.busy": "2026-08-14T10:28:30.432253Z", + "iopub.status.idle": "2026-08-14T10:28:30.455542Z", + "shell.execute_reply": "2026-08-14T10:28:30.455265Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "bodies flown: ['carrier', 'payload']\n", + "'carrier' flights (with payload, then alone): 2\n", + "'payload' flights (with carrier, then alone): 2\n", + "\n", + "timeline:\n", + " t= 0.000s ignition:carrier\n", + " t= 0.000s liftoff\n", + " t= 0.323s rail_departure\n", + " t= 3.114s ejection:payload\n", + " t= 5.661s impact:carrier\n", + " t= 5.667s impact:payload\n" + ] + } + ], "source": [ "deployable_mission = Mission(\n", " vehicle=deployable_vehicle,\n", @@ -576,6 +794,123 @@ " print(f\" t={time:8.3f}s {event}\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Visualizing trajectories: `Mission.all_flights`\n", + "\n", + "`all_flights` collects every `Flight` a `Mission` ran, in execution order, each appearing once even when several bodies shared it (the full stack's flight is one object, referenced by both `flights[\"booster\"]` and `flights[\"sustainer\"]`). It's built specifically to feed `CompareFlights` directly - no Mission-specific plotting code needed, the existing comparison plots already do everything asked for here." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T10:28:30.456971Z", + "iopub.status.busy": "2026-08-14T10:28:30.456867Z", + "iopub.status.idle": "2026-08-14T10:28:30.534175Z", + "shell.execute_reply": "2026-08-14T10:28:30.533819Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dubeyishan371/Desktop/Rocketpy-main/RocketPy/rocketpy/plots/compare/compare_flights.py:1218: UserWarning: Attempting to set identical low and high ylims makes transformation singular; automatically expanding.\n", + " ax1.set_ylim3d([min_xy, max_xy])\n", + "/Users/dubeyishan371/Desktop/Rocketpy-main/RocketPy/rocketpy/plots/compare/compare_flights.py:1219: UserWarning: Attempting to set identical low and high xlims makes transformation singular; automatically expanding.\n", + " ax1.set_xlim3d([min_xy, max_xy])\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAApEAAAKeCAYAAAD9fUAeAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAA619JREFUeJztnQeYJUW99hsUw3fNoJJRwrLknEEkXwQMIBhQUVFEASUpoiCgKOkqiIIYEFREhCvovSIgOSx5yZuAJS27hEXMV69hzvf86vI/1jbnzJw+p0N11ft7nt7ZmTkzc7q7uuqtf1yo0+l0MiGEEEIIIQqwcJEXCyGEEEIIIREphBBCCCGGQpZIIYQQQghRGIlIIYQQQghRGIlIIYQQQghRGIlIIYQQQghRGIlIIYQQQghRGIlIIYQQQghRGIlIIYQQQghRGIlIEQxveMMbsoUWWmjc45RTTum+/pFHHnFf4+f6/S5eUwYf/OAH3e87++yzS/l9g/69okdZ5+sz3nVOAe455889CZlbbrkl+/jHP56tttpq2ate9arsRS96Ufa6170u23LLLbNjjz02e+yxx5p+i63DnishRG9e2OfrQjTGZpttlq244oo9v7fqqqtmbRMgH/rQh7K99tqrkADdfPPNe379P//zP7M///nPfa/Ry172sixGbCFXl9bn8z//8z/ZRz7ykewnP/mJ+3zxxRd34+eVr3xl9swzz2S33nprdt1112Vf+tKXsp/+9KfZ29/+9prvnhAiViQiRXCwII5q9bnyyiuzv//979lSSy2VtfUacOS55pprnIgs4xoNCtdwxowZ2SKLLJKlyDve8Y5s4403dqIsNBjjO+ywQ3bDDTdkSyyxRHbGGWdkb33rWxd4zT/+8Y/soosuyj73uc9VYqmOGca9EKI/EpEiSlZYYYWm30I0IB4nT56cpQriMUQBCVgXEZC4r6dMmZK98Y1vfN5rXvjCF2a77757tuOOO2YPPPBAI++zraQ87oUYBMVEiigZLybyN7/5TfbJT34yW3bZZbMXv/jF2XLLLZcdeOCB2e9+97uBYh8ffvjh7P3vf79zG/LzCNYjjjgi+9///d/nvQdc2fCDH/xggdjFN7/5zZXFLf7zn//Mvva1r2XrrLOOc2/7MV3Tp0/PjjrqKOcOx8JI3Nyiiy6abbvtttn5558/4e/uxV/+8pfsq1/9qrPWIWZe8pKXZCuvvHL2mc98xl3rftx///3ZJz7xCffa//f//l/2ile8woUr8LX77rvPveboo49e4P1PFAN62WWXZTvvvLOLBeTcllxyyexd73pXdvvtt/d8D9wHfg8W3uuvvz7bZZddste+9rXZwgsv3B0DE8VEzps3Lzv44IOzVVZZxZ3Hy1/+8myDDTbIvvnNbzorYB7GyUknnZStt9567rW8T8YSP8M1e/bZZ7NB+OMf/5h9/etfd///whe+0FNA+jAWGBN5RrlmN998c7bTTju5McS5EH/JdTQuvfTSbJtttsle/epXu7+/3XbbZXfccce4Y4xrduKJJ7rYzpe+9KXZYostlu2xxx7ZzJkze74f3PVctw033NBdR87h9a9/vbuXV1xxRc+f8e8p15vnn+eY59l/NvvFRD7xxBPZpz71qWzSpEluvHPfl1lmGXeu//Ef/9H3fXIeXF+LV+U9Xn755T1f789Fg845QtROR4hAWG655ToMybPOOmug1z/88MPu9fxcv9/Fa3zmzZvXWWGFFdz3XvOa13R23XXXztvf/vbOq1/96s7KK6/s/t/rPey1117u65/61Kc6r3jFK9zv32OPPTrbbrtt56Uvfan7Hj/rc8ghh3Q222wz9z3+Jr/DjuOOO67Ua2TXYtlll+289a1v7bzoRS/qbLPNNp33vOc9nTXXXLP7ur333tu9bvLkyZ0ddtih8653vauzySabdBZeeGH39YMOOqjQdZ47d25njTXW6F5Prsc73vGO7vt8wxve0HnkkUee93M//vGPOy9+8Yu773m33XZzP7fWWmt1Flpooc5RRx3lXnfRRRd1rz2Hfw055s+f3/2dRxxxhHsNP89159zXXntt97UXvOAFnTPPPPN572PLLbd03//EJz7hrsGqq67aefe7393ZfvvtO+eee657Ddfa/naea6+91o0dO1euPdfVvsbv+dvf/tZ9/T//+U93X/ge42jHHXd075PrZtfszjvv7AzCL37xi+75PvPMM51hGOWaHXrooZ0XvvCFnXXWWceNI/s57uuUKVM63/zmN9013XTTTd2zMmnSJPf9l73sZZ0HHnig7xjjmVxkkUXcNeFeLL/88t2fu/HGG5/3frie/B3G4Vve8pbO7rvv3ll33XW7Y+aUU0553s/YPd1pp506b3zjG9394t7xs3vuuWf3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E4LxoYcecnGA/P/66693VQMIzGcDRCJAm/t5s3gjHLnX1GzkuSEZgXJJJAqRyY6X4IADDui2wiOGNHb0LPWHudSEIuINCz1VOMC+znNBJxxczSSuYem3zRiZ+szdzDtUDSC+EaFp1QPYqPEarJP9ni37OpZz1gss5MTNgwlI/2dj2/AlQUeIAfnnP//pPu6www6dhRZaqPPFL37RfT537tzOVltt1Tn66KO7rx0bG+uceeaZnZe+9KXdr6266qqdnXbaqfPoo4+6z//nf/6n88gjj3SWWmqpzmKLLeZ+53rrrdd56KGHOrfffnvnzW9+c/dv/O1vf+v84x//aP29Ou+88zovetGLOt///vc706ZN63z0ox/tvOpVr+o89dRTPV8/ZcqUzgte8ILOiSee2Jk+fXrniCOO6CyyyCKde++9133/d7/7XWfbbbft/PSnP+3MnDmzc9NNN3U23HBDdx1j5pJLLumcccYZnSeeeKLn9xl/jK2vfe1rnc0339xdw4033rhz3HHHuev4pz/9qfPnP/856OP3v/+9O8999tmns8QSS3Re/epXdz7wgQ90fv7zn7tnp98zevPNN3c++9nPdv7yl790YkbP0vj84he/6Gy99dadF77whW6O/eQnP9m54447ut9nvth9990722yzjZuPvvGNb3Q22WSTzr//+7+77z/88MNu7DEvr7vuup0dd9zRzdPvfve7O3/4wx/ca17zmtd052jG6+OPP77AWmHPIvCsnnPOOZ3LL7+89LEgmkMiUoyLTQA+999/f+eQQw7pzJkzp/u1d7zjHW4y+vvf/+4+v+WWWzpbbrllZ7fddnOfX3XVVZ2ll16685Of/GSB3ztv3jw3yV1zzTVuAvrOd77T+e1vf9v53ve+50TkhRdeGNUdQuDtt99+3c+ZbJdcckknbnqxxx57OOHts9FGG3U+9rGP9f0bt956K1v7rlhPHcYaY4tFks0O4w2RzeJ39913ByUoGfss/h/60Ic6r33ta92ivffee3cuvvjizv/+7/82fSmDQs9Sf84991y32XzrW9/qxGAv+PrZZ5+9wNf+4z/+o7Pwwgt3ZsyY4T5nPLLpYk658sornXBnQ8OzBGxWVlhhhc6KK67oDAYnn3xyiXdYtAG5s8W49HIv4CakNANZegYlG3Ch4hLBPUJSDfW/+DpQpgV3BskQz1nA3UdKt+DWoCsGtb9IFCD+8YYbbnClg3B946bDVU4m4HiY25zEA7/weSjgoqfmJtfIwK3E55S76AVf919vmY39Xg8U0Oa+kcEr/m8MM7asIw4uPLJMGWMk3ZD9TWs/sk+bcHlT2QB3NLG/PCN8JMaR7FdiPqnNSga64hz/hZ6l3tj4Zc4kDp0wl3xGsyU68nViHqdPn+4+Mg8T+sGcxHwNzCGrrLKKi4sn059QChJfrHbpkUce6fpiH3744S5e/sADD6zkGRHhIhEphg7Y9mExJpGGBZmMbmJfzj77bFdAFliwycizoGoTp3TLQBRZn2FgUuN3MFnRyQDxSIkh4mr6dfPwA8gpfMukSKxOSFgmYr4zEJ+TSdsLvl7k9QgS4uZoI+YHyYusO+6I9UVEskHhOpL8xXgjMYXF8ktf+pKrq1hl1yWSYSjDQ3ICZbJ4D2SnEuvJuGUxp4RRKL21Q0PPUm9sXmWjj5C0cmyU6fna177mNvHvfve73edAv2qEILGOCEfiFSnTxjhkriV2nQRHYtN5HfMK8dl77rmn+3kMBWxwGMeUkFKnsvTQDCUK0y/4mcWQwOx8lh1Ws2nTprk+3dZxhO8xgZFUwi7WB8HJ96kHiMAEdtWISTIGWej7vSdKnRDsTScO31KaAiTZ7LHHHu7aWza96A9jho0KHZc4sOBS+5TFFKsLSUpsYijOTYmdUYuSU7cS4cqCTJIZmwHqXPI1EqxCK3qeMk0+S7aZHiXJhHmWDTxjDYsjyVdYFEmGQUSSyAiUaWPzTw93xCFjlCRJaowiKLFkYmGkwgabUjboCMi8Vdzme43h9JCIFKXit8cycEX/9Kc/7VolqUuGhQXrD24pMryBn+HncfmygLOwGkxufuZ3r1IQZDH/6Ec/cvUC+Z354ub2N5qCnTqZ5vmsWT6ng0gv+Pogr7dFjxAASinJClkcsp1ZIDkYb2TBk9WKpcWs4og+NjGDVAxgzGHh4fdg2cGVjiV+1113dRsnngctusMR87NkcxReBSvOXQSb98i4pvIFY4xGEFRvsPFmr2FOZQ4mFIlQCsqsYam38Y+IxKuEF8gf8/n5V1nV6aKtryh3QPWwpjB5sXBabI656FiYsfBQc9ImdyyW7ISJkbSYPtwqWCCJw2FihLw4pLwLbkgWeUpZIEZ5DeWH7PX2M03FS7J7pyA0YsLgffI5YQC94Ov+6+Hyyy9f4PW26FGzjUWgV/sxUQzaC3JNCbfA5U1NRsYS9fKw6LCwUkaIDZEP45GyVhRjpgYqY56fxY1IgXRqr2KtJ/xDAnJ4YnmWehX5BjYsRx99dF/3sBUJ7/V9m+coRs8GnvmOOHPGm73eXsO5U1eU8A427nSCwiqPJZKwGCDMAgHJz4awGReB0XRmj0g7a/ZnP/tZZ+211+4su+yynfnz57uyLeuvv74rbWLcddddLvP70EMPfV75COP00093WYNke1tJIKA0xYEHHti57rrrOrfddtvzfo6yQb1+X1WQ3fjiF7/YZUWS9UgJDUr8PPnkk+7773//+13Go1/ih2xisibJmDzqqKMWKPHDeZKBSeY714kyGnYom7d8KJvzy1/+svPhD3+4s+iii3Ze97rXuezpH/3oRy4zlZIq3J911lmnc+yxx7p71qvCgRidWJ6lZ599tvt/xgol08jMt1I4E40fyoP1e3+UWVt55ZVdtQyfq6++unPRRRe5/zPvMt/6c64QgyIRKYLAatpROoI6lL/5zW+63zvrrLM6G2ywQeeyyy5zn+dFH5P8e9/73s4uu+yywPf5SNkJaqSx6PNx0qRJrj7jeDz99NOdr3zlK50bbrihUwWcI6KZepGUKaGun0FZpL322muB159//vnuffP61VZbzZV78ct0sBfsdbBQiOpAdLDQU24JMUKpk+OPP77z4IMPSjjWRNufpSOPPLKzzDLLuPOwje83v/lN9x6ZE/ttcKnJyCZljTXWcHUcKcHjY8KTjTOl0r7whS907rnnHiesEaj8zCc+8Ymev7vOTbVoPxKRolGY7PKTll9UnImVAstMlv0KLM+aNauz5pprdmuXmSDFUsFkecIJJ7hagNQKRIwefPDBnSuuuKKz6667usK5voXS6lzuvPPOTkiCJlUxEYwvWX5FUWgWcNpppzkhjMBj7tt33307b3vb28b9OcQvc9epp57amT179ri//z3veY+bB1/2spd13vnOd3Z+/etf93ytLOZiGNQ7WwRFr56uN998s4vRoWxPr+/TkouWicRNklBDoDgxU9tvv737SF9l4ivZNH3wgx90CTiUpCB2khp8BJUTG0VihcHrJk2a5BIgFP8jhKgSKljQypIYcZJ5iMUlLrLXfJfvYT0RzJ/UHbUavcP8DiH6ocQaERS9JkxqRCIg89+3IG8KMiMAySrka1Z+gvIVJNoQVG6Q3EDg+Fe+8hXXE5zgcRInKO3i/14SIuhVLAEphKgShCIJLtdee61L6CIr22rc+skwPkXEH/OnCUiEo82bEpCiDCQiRfD06yLil8Ig2xWLpH2NTjjUSmMCtcnyvvvuc1mXWBmtbAelQqihRkcTwIrJ7+C19hoV0BVCVIVtjKmzi8eEqhVk8Fv93DKz+JkLtTEWZSIRKYJnoklv8803d65sxKRx0kknOWFpHXKAItK4venk4FsmKevB74BFFlnEfaRWJTXSQKVYhBBVw/xFPV1qkyIiv/3tb7uwG0qeCREqEpGi9dALlnZc1DMzcA/hAvdd2UzOdB+hbqVN2lgs3/SmN7nalYhJBCu1/GhLRwcHIYSoA9zZeEaoTfm+973PxW5T/5Zi9+eee657jbwiIjTUsUa0HkThscce67osGF/96lcXeM3s2bOdi/rUU0/tfo0C5/SWPfnkkxd4LYk4FN7FaimEEFVi3V9o94qIXG211ZxYpHc6zRXoFmNF7eUVEaGh7GwRJb3aItILloQZS7w5++yznbuI1nQEtANClNgkesTSlSTfI1YIIcoGzwcdeOgcc9BBB+kCi9YgS6RIJo6Skj0+uLo/8IEPdAXkH//4x+zrX/+661crASmEqAuS+9jg4rruRb9SP0I0jSyRQjzHl7/8ZdcPec8998ze//73a+IWQgghxkFbG5EsfpA62dg/+clPsgMPPNAJSNDOvxxOO+00Z2XBwrvRRhtlt95667ivJ6GApCZeT4b8r371q76v3XfffZ3V+ZRTTinp3bYbXet2o8QZ0TYkIkWymEgkfpJEmvPPP991sRHlQckS4kuPOuqo7I477nCJAjvssEP29NNP93w9Bd7JtN97772zO++80xWL5yApKg+Z9XTj4N4JXesY0MZVtI6hmiUKIcQAbLjhhp399tuv+zl9yJdccsnOcccd1/P1e+yxR2ennXZa4GsbbbRR52Mf+9gCX6MP+lJLLdW57777Osstt1zn5JNPTv5+6FoLIepGlkghRCXQ/YcwgW233XYBSwuf0yu4F3zdfz1gufRfj8uPkINPf/rTrhyK0LUWQjSDRKQQohKeeeYZ16v39a9//QJf53P6lfeCr0/0+hNOOMEVh//kJz+pO6drLYRoEJX4EUK0BiyblGEivlI9gHWthRDNIkukEKIS6L7xghe8wHUG8uHzxRdfvOfP8PXxXk8JJpJyll12WWeN5Hj00UddXU8ywFNF11oI0QQSkUKISqDbD104rrzyygXiGfmc3ua94Ov+6+Hyyy/vvp5YyHvuuSe76667ugfZ2cRHXnbZZcneSV1rIUQTyJ0thKgMyvvstdde2frrr59tuOGGrp7jn//85+xDH/qQ+z4dg5ZaaqnsuOOOc59/6lOfyrbcckvX+3ynnXbKzjvvvOz222/PvvOd77jvL7roou7wWWSRRZylcuWVV076TupaCyHqRiJSCFEZ73rXu7L58+dnX/jCF1xyzNprr51deuml3eSZxx57bIHaeJtuuml27rnnZkcccUT2uc99LltppZWyn//859nqq6+uu6RrLYQIDLU9FEIIIYQQhVFMpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEKIxEpBBCCCGEyIry/wE8rAc5ocJRBAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from rocketpy import CompareFlights\n", + "\n", + "CompareFlights(two_stage_mission.all_flights).trajectories_3d()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T10:28:30.535788Z", + "iopub.status.busy": "2026-08-14T10:28:30.535667Z", + "iopub.status.idle": "2026-08-14T10:28:30.671095Z", + "shell.execute_reply": "2026-08-14T10:28:30.670751Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dubeyishan371/Desktop/Rocketpy-main/RocketPy/rocketpy/plots/plot_helpers.py:65: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown\n", + " fig.show()\n" + ] + }, + { + "data": { + "image/png": "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u076hUS7pMS/aMXtHOf6+tLH0mNQ6037mesxdCc0RGvrro50oC3D+njawqwty3f6pQnINBxAJnPlyhXH7t27zV/b1KtXz/H88887nn32WUdoaKgjV65cjkGDBjliY2PN8rNnzzqefPJJR44cORxZsmRxNGnSxLF///4E9/HVV185ypYt6wgICHAUKVLE8e6778YtW7lypXkMvV/dvmLFio45c+bELd+3b5+jVq1aZpm+ffz1119mvj5Gq1atHDlz5jTLSpcu7XjxxRfjyqX32bt371s+v/j3mVjPnj0dJUqUcAQFBTny5s1rnufp06fjls+fP99x9913m8dv0aKFY+rUqeb+1LVr1xzt2rVzREREOAIDAx3h4eHm/uIfA7pPw8LCzDbDhg0z82bNmuUoVqyYeczatWs7vv32W7N869atZvny5cvN7XPnzpnbM2bMMPs+Pi1X4rfamTNnOipXrmzKovv6/vvvd8ybN88s0+cf/zHgmr6G9fjWY0Hr55577nFMmDDBLIuOjnY899xzjty5czvy5cvnGDlypOORRx5xdO7c+baP86tXrzq6dOli6lePc73/AQMGOCpVqhS3nd6/Po6Tq+M+fjlUZGSko1evXuaY1NekHqMdOnRwHD582CzXYzH+Y3jj+xpwJ3z0H0+HaSA9Xb161bTqMSYjAG/B+xoyK7oWAAAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCFqlfv765VCsAACDIAkgFgjQAICOhRRZAuouOjmavAwDuGEEWsMz169elZ8+ekiNHDsmTJ48MGTJEHA6HWXbu3Dnp1KmT5MqVS0JCQqRZs2Zy4MCBBNt//fXXUq5cOQkKCpJixYrJ6NGjEyyfPHmylCxZUoKDgyV//vzy6KOPmvldunSRFStWyLhx48THx8dMBw8eNMt27txpHitbtmxmmyeffFJOnz6doCVXy6zdIrTMTZo0SYc9BQDwdgRZQGkQjL7smen/h9CU+vTTT8Xf3182bNhgQuWYMWPko48+igubmzZtkm+//VbWrl1rAu5DDz0kMTExZvnmzZvlsccek3bt2smOHTvktddeM0H4k08+Mct12xdeeEFef/112bdvnyxatEjuv/9+s0wfq3bt2tK9e3f5559/zBQRESHnz5+XBg0aSJUqVcz2us2JEyfM4yQud2BgoKxevVqmTJnCcQcAuGM+DmdTDpBJXL16Vf766y+56667TKujoYHyrXDPFGjQMZHArClaVVs2T548Kbt27TItomrAgAEmuH7zzTdyzz33mKBYp04ds+zMmTMmbGqIbNu2rXTo0EFOnTolixcvjrvPl19+Wb7//ntzn/PmzZOuXbvK33//LdmzZ3f5+JUrV5axY8fGzXvjjTdk5cqV8tNPP8XN0+31cTUMa5l0u8jISNmyZcsd7SoAqXhfAzIBWmQBy9SqVSsuxCptJdXuA7t37zYttTVr1oxbFhYWJqVKlZI9e/aY2/q3bt26Ce5Pb+v2N27ckEaNGknRokWlePHipnvAzJkzJSoqKtnybN++XZYvX266FTin0qVLm2V//PFH3HpVq1ZNs30AAIDyZzcAIhIQ8t+WUU89dgahrbDaavrLL7+YVtuhQ4ea7gcbN26UnDlzutzm0qVL8vDDD8uoUaNuWlawYMG4/2fNmrJWZwAAUoogCyht4Uzhz/uetn79+gS3161bZ07OKlu2rDkRTJfH71qgP+/rMlWmTBnT9SA+va0///v5+Znb2qrbsGFDMw0bNswE2GXLlknr1q1NH1dtuY3v3nvvNSeQ6Yljui0AAOmFrgWAZQ4fPix9+/Y1AfWLL76QCRMmSO/evU2YfeSRR8zJWKtWrTI/+Xfs2FEKFSpk5quXXnpJli5dKiNGjJD9+/ebvrMTJ06Ufv36meULFy6U8ePHy7Zt2+TQoUPy2WefSWxsrOmeoDSsalDW0Qp0VAJd1qNHDzl79qy0b9/etNxqdwLtL6t9bROHXgAA0hJBFrCMDq915coVqVGjhgmRGmKfeeYZs2zGjBmmL2qLFi1M31k9l/OHH36QgICAuNbTL7/8UmbPni3ly5c3XQd0hAId7UBp66ue8KWjEGjrrY4uoGFZh+tSGni15VZbePPmzWtCdXh4uGnV1dDauHFjqVChghlmS+/L15e3GACA+zBqATIdzu4F4G14X0NmRXMJAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgi0+LqzAC8Be9nyKwIssh0nENR3erSqwBgC+f7mfP9DcgsuAwPMh0dB1XHOD158qS5HRISIj56ZS8AsLAlVkOsvp/p+5rzCn1AZsE4ssi0b/7Hjx+X8+fPe7ooAHDHNMQWKFCAL+XIdAiyyNT0alQxMTGeLgYA3DbtTkBLLDIrgiwAAACsxMleAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoE2UxoyZIl0rVrV7nnnnskNDRUgoKCpGDBgtKoUSN5//335dSpU54uolUOHjwoPj4+UqxYMU8XJUNYs2aNNG7cWHLnzi2+vr5m33zyySd3fL/s55SrX7++2e+//PJLum5rgxkzZki1atUka9as5nnqpMfWndJjXO+rS5cuaVJOb6Hvi2m1jwFX/F3OhVc6ffq0tG/fXn7++ee4N5gHHnjAvKEfP37cBBBdNnToUPO3Zs2ani4yLHPs2DFp3ry5XLhwQe677z5zjGmYvfvuu1MUoFasWCHLly83/0fae+2112T48OEybNgw8//M5vvvv5ennnpKgoODpWHDhhIWFmbmZ8uW7ZbbahhTDofD7eVE6lE/mRdBNpNwBot9+/ZJ6dKlZerUqfKvf/0rwTrXrl2TTz/91HzI/fPPPx4rq20KFSoke/bskYCAAMnsFi9eLOfPn5cnnnhCZs6c6eniZFqfffaZREVFSZEiRdJ124xu7ty55u/48eOle/funi4OgDRAkM0kevXqZUKstpCtXr3a/OybmHYxeOaZZ+SRRx4xYQQpowFWvxxA5PDhw2Y3lCxZkt3hQXcSQr0xwDpxfAJeyAGv98cffzj8/Pz09zDHvHnzbvt+vvjiC0eDBg0cuXLlcgQGBjqKFCni6Nq1q2Pfvn0u1y9atKh5zL/++svxww8/OOrVq+cIDQ115MyZ09G8eXPHb7/9FrfuzJkzHbVq1XJky5bNkSNHDkerVq0cv//++033uXz5cnOfel+XL192DBw40FGiRAlHUFCQo2DBgo6nnnrK8ffff7ssz5IlSxw9e/Z0VKpUyREWFmaeQ6FChRyPPfaYY8OGDS63GTZsmHk8/Xvo0CFz/4ULF3b4+/s7OnfubNbR56fr6PNNbP/+/WYfFStWzDxe1qxZzX576KGHHB9//LHLx1y0aJHZP3nz5nUEBASY56Vl3Lhxo8v1dV/o4+u+2bp1q9l3zudXpkwZx3vvveeIjY11uLPOZ8yYYcrganK1X1zVaVKT3nfi/azP58MPP3Tce++9jpCQEHNcNWrUyLFmzZokHycqKsrsi5o1a5pjTI+Ze+65x9G/f3/H6dOnU7Vf7uQ4VHv27HF06dLF7E/dr7p/dT/PmTPH5fo3btwwz7dOnTqm7Hr86fFRsWJFc0zrvknqmHBKbh87j+WktnWKiYlxfPDBB47atWubfa7P9+6773b06tUryefrfAz11VdfOerWrevInj27qTd9Pt9//73jduh+HzlypKNKlSrmfSNLliyOsmXLOl599VXH2bNnE6yrzy8lzz2594CkJue+d74G9P4uXbrkGDBggDkmtH7z58/v6NSpU7LHxNGjRx19+vRxlC5d2jwXfU7VqlVzTJgwwez31EjJ+1Zq92F8umz48OGOqlWrmuMgODjYcddddznatm1r3uuT+hxIbMSIEWaZli3+54GaO3euo0mTJo48efKY98Hw8HBHhw4dHLt27bqt+oH3IshmAuPGjTMvaA2Q169fT/X2Ghr0TVjvQ98I9QO3Xbt2JgToPP1A+vHHH2/azvkGpm/oPj4+5gNMA5lzOy2PhlUNEs77ffTRRx0RERFmub5xJX4zdQYI/SDV4KuPraFQ30A1QOiyAgUKmACZmPNDRd+0//3vfztat25t3rSdz0s/ZBNzvkk+8cQTjty5c5v7btOmjdn2pZdeSjbI7tixw7zJ67JSpUqZbbScWnb90NBAndjgwYPN+s791b59e0flypXNPP0yMn369Ju2cQYP3c/O8Kr1o/OdX2B69+7tcGedr1y50nxA6nPS5fpXb+vk3E/JhTpdTz/sdVv98HJuq5Ped+L9rPP1w03LFf+Y0mC1bt06lyGhQoUKZh2tx4YNG5rA7zxG9YvGwYMHU7x/7uQ4XLhwofngdx4Xul/1eTjrSkNHYvrlQZfpdlp2PS50P5UsWdLMnz9/foL1XYXRpOpHp2nTpiW7rbp69ap5bGc5mjVr5nj88cfjXq8aODZv3nxT2Z2BYujQoXHHtW7nLIvOS+0X7DNnzsS9LvQ1pq9nfV1qGXSehqr4AUafX1LHWPzn7oru2/hBOP5+0+nUqVMJgmzLli3NFwx9f3v44YcdjzzyiCNfvnxxx+758+dveowVK1aYLzPOY1Gfj5bROa9x48aO6OjoFO+flLxvpXYfOm3bts00AOg6+qVKj3utT30taBDW4+dWQVafi/OY1jLo69NJQ7u+pp2vZ/2yo68r5/GijxH/vSel9QPvRZDNBJ588knzAtcPy9uhLTDODypt8YsfdpxvmPqmffLkSZdvYPpm9PPPP8fN1zCtb0y6rHz58qb1UN8c47cS6JuXLn/jjTeSbL3TliBtbXC6cuWKeSPWZRouEtM3PFetDDpfw5qWQ1vtkvq237FjR/NhnlhSQdb5Rp34OSh9HP3wik/fnJ0hYfHixQmWffTRR2aZhredO3cmWOYMHjpNmTIlwbKlS5eaoKAh6ciRIw5313n8lqDUSq4lMP5+du7r+K3CekxpAHR+6MenZdbwpMu6devmiIyMTPChqR/suuyBBx5IcVlv9zg8fvy4+fB3HhfxW8q1xd0ZXKZOnRo3X+/b2Wr1zz//3FSW3bt3J3j85PZlSuonqW1feeUVM1+/ECYOJbpfneHn2rVrCbZz7ic9XhJ/yXCWR7+IpIYGJ91OW9fjt6ZfvHjRBGxdpu8hKX1uKRG/ZdmV+L9KaAi9cOFC3DJ933GGxrfeeivBdlqn+t6jr9PJkyeb1ncnfW76vq3baQtoSqXkfet29qG2NDu/uOgXXV03Pg3p+stXckFW13F+IdLHSXwfgwYNiivXn3/+eVMrrb6X6evk3LlzqaofeC9qPRNo2rSpeYFry8/t0A8u3X78+PE3LdMPYm190OVvvvmmyzcwbXFNbMuWLXFvPJMmTbpp+ddff+0yXMQPEAsWLLhpuxMnTpjWMV2+evXqFD9HbeHSbRL/zOn8QNBWDVctKckFWW2p0Pn6XFPiwQcfNOv37dvX5fIWLVqY5d27d3f54aytLcnV/2effeZwd52nV5D99ttvb1qugcD5xSl+65XzC4IGCVc/0Wpw0C9Uuo62oqfE7R6Hzp9S9SdZV7Trgy7XllYn7fai87TFLKXSOshqONdfEZLa9/rl09naqd2E4nPuJ1fHkgYsZ7A/fPhwip6bhnZfX18T/LZv337Tcv353tninfg9ID2CrHYfOnbs2E3LZ8+e7bJBwfkFQbuIuKLPR7/AaleSlHYRutX71u3uw7Fjx8a9llL66178IKuP63yt/ec//7npPrSVWFtc9bGT6obx/PPPm+21y0V8BNnMi3Fkkay///5b/vjjD/P/zp07uxzyRMekVTpskisPPfTQTfPinwyU3HIdzsmVnDlzyr///e+b5ufLl0+aNm1q/u9qHEy9v2nTpslLL70kTz/9tBnzUaddu3aZ5XpCnCs6VE+OHDkkNWrUqGH+Pvfcc/LTTz/J1atXk1z3+vXr5iQ8ldQ4lN26dUt2Pz/88MMu55cpU8b8PXr0aLrVuTv5+/vH1XF8BQoUkFy5cpnRN86cOZNgyCXVpk0bs21iOjzY/fffb/6vQ9ClRmqPQ+f/Xe3X+HV84MCBuGNfTyTMnj27/PDDD/Lmm2/KX3/9Jelt06ZNcunSJXOSqKvjLCQkRNq1a5fq41NPMC1evHiqjs9ff/1VYmNjpUqVKlKxYkWXo4g0adIk2bK4k45Rq+Nyp/R16Dw+H3/8cZf3p89H3w91fG89LlIjqfet292HixYtijtO/fz8UlWWLVu2SK1atcx77dtvvy1Tpky56T70sa5cuSJ169Y1ZXDFOTRfal+r8F6MWpAJ5M2b1/w9efJkqrd1vunqeIt68QRXSpQokWDdlJwFHX/cRlfL9YNbJRX+nINsu3LXXXfFBbL4dPxMDQIxMTGSlMjIyCQfL7X69+8vq1atMmPyaqjR0Q0qVapkQpN+6FevXj1uXQ1ezufqLH9a7GflrLfkgnRa17k7aUhIaqgzLe+5c+cSPNc///zT/B0yZIiZkpPai4Gk9jh07q+k6liDsYbFs2fPmu3Cw8PNa0EH8dcvD4MHDzaT7gMNBXpc6VBnKRkH9U7cqtyeOD7vpCzulNrn6Tw+Ew+HmNTxqReySamk3rdudx8eOnTI/L2dUVo0qOsX9jfeeENeeeUVl+s498XSpUuTfF05ceEeOBFkM4GqVavK//3f/5lvxDdu3Ej1N+k7pS1ed7L8dsUfuHzevHlmAHj9wJ84caI0aNDAhIQsWbKYN8xBgwbJyJEjkxzsXNdLLW2l0quobdy40bRkaAuCTtq6NWbMGHn++edl0qRJklbctR8zmtQ+T215UjqOsvPDOSnlypWTtJYWA+hra7K2rn377beycuVK03o/f/58M+kFTPQ4q1ChgmRkHJ/JH5+PPvqouThNcpwXcEip23nfchf9FWL69Onm6pH6BUw/l5LaF3oBFW2VTQ5DHsKJIJsJtGjRQvr27WvGhtUPwlatWqV4W+fPO9piqK2VrlronN+ik/opyB2Su9yhc1nhwoXj5n355Zfmr7bI6li5iaX2J7vU0JZXZ+urtkgsWLBAOnXqJJMnTzYfXnp1Nf2A0p9Z9Wdx3Z+ufu5Lr/2cUev8dkVERJi/Oj5yv379PHoc6v7au3dv3P5zdeESbY11rhuf/kT85JNPmkkdOXLEjA/9zTffSM+ePc1V0dzFWZbkujWk9/GZ1D5Mz7Kk1fGp7z/aSqndEtLD7e5DbW3Wi7/oMaxfrFJDf0koW7as6dalDQnapUK/XLp6rZYqVSpNLmuNzCFzNOFkctoKpZemVfom4vygTIp2QXD2FdUPYWcrlqs3Fm1tcs7XQJZeNJR/9913Ln9ucvbjin+ZU+dzLlq0qMvnqy1a6UH7aGp4dfY/27ZtW9x855t6Um/gH3/8cbrsZ0/VeWBgYFzYT0vNmjWLu6pTWl9eNLXHofP/egW95OpY+0TeKoTph752l4l/HLlrH2vA0l8z9HWkX4YT036Ns2fPTpfjU7vmaOuuPuft27fftFyvSujc92lZFmd3Fncdn84v2+nhdvehs9+3Hqf6615qaYOKXlVS+1vre2Di990HH3zQHKPalzy1XeHcVT/I+AiymcSECRPMzzXaoqKBSftuJhYdHW3eoPQEAP3W7eRsxRoxYkSCNz0NBdrfSd8MtW9fel/yUUN5/P6H2prZo0cPuXz5sjnRKv5PU84TLfRNVJ9n/BYw/clL/6Y1bXF1dfLY8ePHTfeCxMFan4/64IMPTB+x+DQ4aoDQN+vevXuLu3mizp0tl84T79KKtsRqi/iGDRtMP1NXfeu0X62efHI7H4KpOQ51f2kLt3bzeeuttxIE661bt5p96+xfHX/+nDlzTFhMzBmiXX1BS8t9HBwcbJ6T8/k6+0oq7XOux6Qe19rnUr+ouZO2CrZt29bsu//85z8JTuzTfa6/uGg/1Dp16pgpox+fWtf6WtLuRqNHj07w/uSk79uff/55mj3m7e5DPUFW94Mek3os67rx6S84ek5AcnQ7fS76PPUEQP2Fyil//vzmVwa9X122Y8eOm7bX15e+F2qrcHrUDyzg6WETkH50SKD69evHDVOiYz7qYN069JQOCeMcXkcHx16/fn3cdjrki3MsWh1vVYeJ0m10MHfnANWJr+Zyqyu63Gq4lKSGtIo/EL2OM6hDHOmwVDqAtl5AQZfp4ON79+5NsJ2OR6jjWOpyHcxbx/nU4Yx06B/nlZhcDUuUkuGKkiqrcwBv3c86MLpelUbHONX95RyGJ/FwUPEviHDfffeZAc316lUpuSBCUkMK3c6QWLdb53cy/JZeKEC31Ys6aJ1qnej4pM7hf5K7gtqtjjkdcN05jqcOj6TjY+pwdDpkmc53XoxAh5lKids9DtV3330XN7SRXsVJ96vuX93POk/HH048zrFzn+t4uFpuvXCIsy50fyW+IElSx4SOY6vPX5fpfenVxXQfx7/KXHIXRHAOEadlcQ6Er1cn03k6FuqmTZtuer63GhbpdobE0nFPna8vfQ3rRQh0n+gQVc7XnKv3nTsZfqtfv35xYytrPet+08k5Bmv8K3u5ktzxq2NKOy9EoMeNvjfo+4UeU86h8PQ4S6mUvA5vdx/qcIJ6gQVdx3mVRj0O9DWV0gsiqG+++cYMlafH/eeffx43X98T9X1Pt9EhwvQCNvp+rY+hx6zz+E18zN+qfuC9CLKZkL4B6GDWOpC7hlcdo1DfmPQSnzpOoI7l58qsWbNMENY3L91GB8bWD0JXH9buDrL6ZqmDc+sYtfqG67wMpJYnqfEo9T71w0E/ePUNVO/72WefNR/uSb3x30mQ1WD23HPPmTdi/XDQMuqg9roPP/300ySv1KP1oyFBg4G+yWvd6AUk4n+5cHeQvd06v5PHUnqVJedlZ5O7RG1SkjvmNIjpBSN0bGLnvtXQoEG2R48ejp9++inF5byT49B5EQMNPHo86H7V/avl0rFGXY2P+/bbb5tjQh/DeUlevSqdlttVXSR3TPz6669mQHodVF6DQmovUauD9uuFHvQys/p8NWil9BK1rtxuuHReXlXrT/eJfjnQq9rpgPpJXV71ToKsfsl5+eWXzfumPu/kLlHryq2OX21oGDJkiDn+nftWjw8NiPp6SnwJ1+Sk9HV4O/tQ6dWy9Eu3Xi1Pg6UG2OLFi5uwqZfYTulrUi+Uo9vrcaiXYI5PvyjrF01teHC+RpxXLdT3JS17auoH3stH//F0qzCQUtp3Svts1atXz+U4sUB64DgEgIyBPrIAAACwEkEWAAAAViLIAgAAwEr0kQUAAICVaJEFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlf08XwBvExsbKsWPHJHv27OLj4+Pp4gAAAFjL4XDIxYsXJTw8XHx9k29zJcimAQ2xERERaXFXAAAAEJEjR45I4cKFk90XBNk0oC2xzh0eGhrq1oMvJiZGFi9eLI0bN5aAgAC3Phbci7r0LtSnd6E+vQd1aZ/IyEjTQOjMV8khyKYBZ3cCDbHpEWRDQkLM4xBk7UZdehfq07tQn96DurRXSrprcrIXAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADAStYF2UmTJkmxYsUkODhYatasKRs2bEh2/blz50rp0qXN+hUqVJAffvghyXWfffZZ8fHxkbFjx7qh5AAAAMi0QXbOnDnSt29fGTZsmGzZskUqVaokTZo0kZMnT7pcf82aNdK+fXvp1q2bbN26VVq2bGmmnTt33rTu/PnzZd26dRIeHp4OzwQAAAB3yl8sMmbMGOnevbt07drV3J4yZYp8//338vHHH8uAAQNuWn/cuHHStGlT6d+/v7k9YsQIWbJkiUycONFs63T06FHp1auX/PTTT9K8efNbluPatWtmcoqMjDR/Y2JizOROzvt39+PA/ahL70J9ehfq03tQl/ZJTcaxJshGR0fL5s2bZeDAgXHzfH19pWHDhrJ27VqX2+h8bcGNT1twFyxYEHc7NjZWnnzySRN2y5Url6KyjBw5UoYPH37T/MWLF0tISIikBw3k8A7UpXehPr0L9ek9qEt7REVFeV+QPX36tNy4cUPy58+fYL7e3rt3r8ttjh8/7nJ9ne80atQo8ff3lxdeeCHFZdEwHT8ga4tsRESENG7cWEJDQ8Xd31L0xdioUSMJCAhw62PBvahL70J9ehfq03tQl/Zx/tLtVUHWHbSFV7sfaH9bPckrpYKCgsyUmAbL9AqX6flYcC/q0rtQn96F+vQe1KU9UpNvrDnZK0+ePOLn5ycnTpxIMF9vFyhQwOU2Oj+59VeuXGlOFCtSpIhpldXp0KFD8tJLL5mREQAAAJBxWRNkAwMDpWrVqrJ06dIE/Vv1du3atV1uo/Pjr6/0Z3nn+to39rfffpNt27bFTTpqgfaX1RO/AAAAkHFZ1bVA+6V27txZqlWrJjVq1DDjvV6+fDluFINOnTpJoUKFzMlYqnfv3lKvXj0ZPXq0GY1g9uzZsmnTJpk6dapZHhYWZqbEzdnaYluqVCkPPEMAAAB4ZZB9/PHH5dSpUzJ06FBzwlblypVl0aJFcSd0HT582Ixk4FSnTh2ZNWuWDB48WAYNGiQlS5Y0IxaUL1/eg88CAAAAmS7Iqp49e5rJlV9++eWmeW3btjVTSh08ePCOygcAAID0YU0fWQAAACA+giwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwknVBdtKkSVKsWDEJDg6WmjVryoYNG5Jdf+7cuVK6dGmzfoUKFeSHH36IWxYTEyOvvPKKmZ81a1YJDw+XTp06ybFjx9LhmQAAACDTBNk5c+ZI3759ZdiwYbJlyxapVKmSNGnSRE6ePOly/TVr1kj79u2lW7dusnXrVmnZsqWZdu7caZZHRUWZ+xkyZIj5O2/ePNm3b5/8+9//TudnBgAAgNTyF4uMGTNGunfvLl27djW3p0yZIt9//718/PHHMmDAgJvWHzdunDRt2lT69+9vbo8YMUKWLFkiEydONNvmyJHD3I5Pl9WoUUMOHz4sRYoUcVmOa9eumckpMjIyroVXJ3dy3r+7HwfuR116F+rTu1Cf3oO6tE9qMo41QTY6Olo2b94sAwcOjJvn6+srDRs2lLVr17rcRudrC2582oK7YMGCJB/nwoUL4uPjIzlz5kxynZEjR8rw4cNvmr948WIJCQmR9JA4gMNe1KV3oT69C/XpPahLe+gv5l4XZE+fPi03btyQ/PnzJ5ivt/fu3etym+PHj7tcX+e7cvXqVdNnVrsjhIaGJlkWDdPxA7K2yEZEREjjxo2T3S6tvqXoi7FRo0YSEBDg1seCe1GX3oX69C7Up/egLu3j/KXbq4Jsehzojz32mDgcDvnggw+SXTcoKMhMiWmwTK9wmZ6PBfeiLr0L9eldqE/vQV3aIzX5xpogmydPHvHz85MTJ04kmK+3CxQo4HIbnZ+S9Z0h9tChQ7Js2TK3t6oCAAAgE41aEBgYKFWrVpWlS5fGzYuNjTW3a9eu7XIbnR9/faU/y8df3xliDxw4ID///LOEhYW58VkAAAAgrVjTIqu0X2rnzp2lWrVqZmSBsWPHyuXLl+NGMdAxYAsVKmROxlK9e/eWevXqyejRo6V58+Yye/Zs2bRpk0ydOjUuxD766KNm6K2FCxeaPrjO/rO5c+c24RkAAAAZk1VB9vHHH5dTp07J0KFDTeCsXLmyLFq0KO6ELh0yS0cycKpTp47MmjVLBg8eLIMGDZKSJUuaEQvKly9vlh89elS+/fZb83+9r/iWL18u9evXT9fnBwAAAC8Nsqpnz55mcuWXX365aV7btm3N5IpeIUxP7gIAAIB9rOkjCwAAAMRHkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCX/1Kx8/vx5mT9/vqxcuVIOHTokUVFRkjdvXqlSpYo0adJE6tSp476SAgAAAKltkT127Jg8/fTTUrBgQXnjjTfkypUrUrlyZXnwwQelcOHCsnz5cmnUqJGULVtW5syZk5K7BAAAANzfIqstrp07d5bNmzebsOqKhtsFCxbI2LFj5ciRI9KvX787KxkAAABwp0F29+7dEhYWluw6WbJkkfbt25vpzJkzKblbAAAAwL1dC24VYu90fQAAAMCtJ3vF7zO7atUqOXnypMTGxiZY9sILL9zOXQIAAADuDbKffPKJ/Oc//5HAwEDT8urj4xO3TP9PkAUAAECGDLJDhgyRoUOHysCBA8XXl2FoAQAA4BmpTqI6dmy7du0IsQAAALAryHbr1k3mzp3rntIAAAAA7upaMHLkSGnRooUsWrRIKlSoIAEBAQmWjxkzJrV3CQAAAKRPkP3pp5+kVKlS5nbik70AAACADNm1YPTo0fLxxx/Lnj175JdffjGXp3VOy5YtE3ebNGmSFCtWTIKDg6VmzZqyYcOGZNfXbhClS5c262sL8g8//JBgucPhMCev6eV39aIODRs2lAMHDrj5WQAAACDdW2SDgoKkbt264glz5syRvn37ypQpU0yI1cvhNmnSRPbt2yf58uW7af01a9aYK405u0PMmjVLWrZsKVu2bJHy5cubdd555x0ZP368fPrpp3LXXXeZURn0PvVqZhp+MxIN3VHR1+XaDTF/Axy0gKfJfo2NlatXz5r/Bwf4pdsvC9djYuTG9YtyJeq0xCTqooMMwj+L/tSUolWvX78u0Y5ouXL9isRIjNuLBveiPr0HdZm2svhnyVC/wPs4NB2lgobCf/75x4S/9KbhtXr16jJx4kRzWy/GEBERIb169ZIBAwbctP7jjz8uly9floULF8bNq1WrllSuXNmEYX3q4eHh8tJLL0m/fv3M8gsXLkj+/PnNeLk6OoMr165dM5NTZGSkKcfp06clNDRU3EXDa6UR7m/1zmyy+ESKf+m3PF0MAAAyvNWPrTZh1p00V+XJk8dkslvlqlS3yOpP+dqFQMNhuXLlbjrZa968eeIO0dHRsnnzZjN+rZOOY6tdAdauXetyG52vLbjxaWvrggULzP//+usvOX78uLkPpxw5cpjArNsmFWQ1zA8fPvym+YsXL5aQkBBxF22Jvc2LsQEAANwxPU8q0CdQ3EmHek2pVKeinDlzSuvWrSW9aWvnjRs3TGtpfHp77969LrfRkOpqfZ3vXO6cl9Q6rmiYjh+QnS2yjRs3dmuLrLYgN2hwzXyRaNCggQQEEGrTrmvBfeb/WdKxa0FMzHVZsWKF1KtXj7rMqAJCUty1ICYmJt5rk64itqM+vQd1mbaC/YLd/jmpuSqlUp2EZsyYIZmd9hPWKTH98HL3B1gOHx8J8hPJkTWYD8u0lD2reOLN1c8/u4TmKEBdeoEY/xjTShGaJZT69ALUp/egLu2TmixlzTVmta+En5+fnDhxIsF8vV2gQAGX2+j85NZ3/k3NfQIAACBjSFGQbdq0qaxbt+6W6128eFFGjRplhshKa4GBgVK1alVZunRp3Dw92Utv165d2+U2Oj/++mrJkiVx6+soBRpY46+jzdnr169P8j4BAACQMaSoa0Hbtm2lTZs25kSohx9+WKpVq2bO9tfhqc6dO2eGqlq1apUZo7V58+by7rvvuqWw2i+1c+fO5vFr1Khhht/SUQm6du1qlnfq1EkKFSpkTsZSvXv3Nv0PdexbLdfs2bNl06ZNMnXqVLNc+3i8+OKL8sYbb0jJkiXjht/S56bDdAEAAMDyINutWzfp2LGjubiAjuWqQVCHRHCGwbJly5rRADZu3ChlypRxW2F1OK1Tp06ZCxjoyVg6jJZeKtd5stbhw4fNSAZOderUMWPHDh48WAYNGmTCqo5Y4BxDVr388ssmDD/zzDNy/vx5ue+++8x9ZrQxZAEAAHCbJ3vpyU0aZnVSGmSvXLkiYWFh6XpiQ8+ePc3kil5pzFVrsk5J0SD++uuvmwkAAAD2uO3xm7SbgU4AAACAJ1gzagEAAAAQH0EWAAAAViLIAgAAwEoEWQAAAGSOILt8+fIkl3344Yd3Wh4AAADAPUFWr/LVv39/c514p9OnT5sLJQwYMCC1dwcAAACkX4vs/PnzpXr16uaKXt9//725wIBe2nXbtm23VwoAAADA3UFWr5algVXD67333iutWrWSPn36mIsRFC1aNLV3BwAAAKTfyV779++XTZs2SeHChcXf31/27dsnUVFRt1cCAAAAID2C7Ntvvy21a9eWRo0ayc6dO2XDhg2ydetWqVixoqxdu/Z2ygAAAAC4P8iOGzdOFixYIBMmTJDg4GDTxUDDbOvWraV+/fqpLwEAAABwG/xTu8GOHTskT548CeYFBATIu+++Ky1atLidMgAAAADub5FNHGLjq1evXupLAAAAANwGruwFAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFayJsiePXtWOnToIKGhoZIzZ07p1q2bXLp0Kdltrl69Kj169JCwsDDJli2btGnTRk6cOBG3fPv27dK+fXuJiIiQLFmySJkyZWTcuHHp8GwAAACQaYKshthdu3bJkiVLZOHChfLrr7/KM888k+w2ffr0ke+++07mzp0rK1askGPHjknr1q3jlm/evFny5csnn3/+ubnvV199VQYOHCgTJ05Mh2cEAACAO+EvFtizZ48sWrRINm7cKNWqVTPzJkyYIA899JC89957Eh4eftM2Fy5ckOnTp8usWbOkQYMGZt6MGTNMq+u6deukVq1a8tRTTyXYpnjx4rJ27VqZN2+e9OzZM8nyXLt2zUxOkZGR5m9MTIyZ3Ml5/+5+HLgfdeldqE/vQn16D+rSPqnJOFYEWQ2X2p3AGWJVw4YNxdfXV9avXy+tWrW6aRttbdUdoes5lS5dWooUKWLuT4OsKxqAc+fOnWx5Ro4cKcOHD79p/uLFiyUkJETSg7ZMwztQl96F+vQu1Kf3oC7tERUV5V1B9vjx46YLQHz+/v4mcOqypLYJDAw0ATi+/PnzJ7nNmjVrZM6cOfL9998nWx7tftC3b98ELbLaz7Zx48amD687aTjXF2OjRo0kICDArY8F96IuvQv16V2oT+9BXdrH+Ut3hg+yAwYMkFGjRt2yW0F62LlzpzzyyCMybNgwE0iTExQUZKbENFimV7hMz8eCe1GX3oX69C7Up/egLu2Rmnzj0SD70ksvSZcuXZJdR/utFihQQE6ePJlg/vXr181IBrrMFZ0fHR0t58+fT9Aqq6MWJN5m9+7d8uCDD5qTxwYPHnxHzwkAAADpw6NBNm/evGa6ldq1a5tAqv1eq1atauYtW7ZMYmNjpWbNmi630fU00S9dutQMu6X27dsnhw8fNvfnpKMV6MlgnTt3ljfffDPNnhsAAADcy4rht3SkgaZNm0r37t1lw4YNsnr1ajOqQLt27eJGLDh69Kg5mUuXqxw5cpixZrUv6/Lly00I7tq1qwmxzhO9tDvBAw88YLoS6Hrad1anU6dOefT5AgAAwEtO9lIzZ8404VW7AOhoBdrKOn78+ASdubXFNf6Zbu+//37cujpcVpMmTWTy5Mlxy7/66isTWnUcWZ2cihYtKgcPHkzHZwcAAACvDbI6QoGOCZuUYsWKicPhSDAvODhYJk2aZCZXXnvtNTMBAADAPlZ0LQAAAAASI8gCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAK1kTZM+ePSsdOnSQ0NBQyZkzp3Tr1k0uXbqU7DZXr16VHj16SFhYmGTLlk3atGkjJ06ccLnumTNnpHDhwuLj4yPnz59307MAAABApguyGmJ37dolS5YskYULF8qvv/4qzzzzTLLb9OnTR7777juZO3eurFixQo4dOyatW7d2ua4G44oVK7qp9AAAAEhr/mKBPXv2yKJFi2Tjxo1SrVo1M2/ChAny0EMPyXvvvSfh4eE3bXPhwgWZPn26zJo1Sxo0aGDmzZgxQ8qUKSPr1q2TWrVqxa37wQcfmFbYoUOHyo8//njL8ly7ds1MTpGRkeZvTEyMmdzJef/ufhy4H3XpXahP70J9eg/q0j6pyThWBNm1a9ea7gTOEKsaNmwovr6+sn79emnVqtVN22zevNnsCF3PqXTp0lKkSBFzf84gu3v3bnn99dfN/fz5558pKs/IkSNl+PDhN81fvHixhISESHrQlml4B+rSu1Cf3oX69B7UpT2ioqK8K8geP35c8uXLl2Cev7+/5M6d2yxLapvAwEATgOPLnz9/3Dbaqtq+fXt59913TcBNaZAdOHCg9O3bN0GLbEREhDRu3Nj04XUnDef6YmzUqJEEBAS49bHgXtSld6E+vQv16T2oS/s4f+nO8EF2wIABMmrUqFt2K3AXDaTa1aBjx46p2i4oKMhMiWmwTK9wmZ6PBfeiLr0L9eldqE/vQV3aIzX5xqNB9qWXXpIuXboku07x4sWlQIECcvLkyQTzr1+/bkYy0GWu6Pzo6GjT9zV+q6yOWuDcZtmyZbJjxw756quvzG2Hw2H+5smTR1599VWX3QcAAACQMXg0yObNm9dMt1K7dm0TSLXfa9WqVeNCaGxsrNSsWdPlNrqeJvqlS5eaYbfUvn375PDhw+b+1Ndffy1XrlyJ20ZPJnvqqadk5cqVUqJEiTR6lgAAAHAHK/rI6s//TZs2le7du8uUKVNMf5eePXtKu3bt4kYsOHr0qDz44IPy2WefSY0aNSRHjhxmSC3ty6p9abXvaq9evUyIdZ7olTisnj59Ou7xEvetBQAAQMZiRZBVM2fONOFVw6qOVqCtrOPHj49bruFWW1zjn+n2/vvvx62rJ3Y1adJEJk+e7KFnAAAAgEwZZLVVVceETUqxYsXi+rg6BQcHy6RJk8yUEvXr17/pPgAAAJAxWXNlLwAAACA+giwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACs5O/pAngDh8Nh/kZGRrr9sWJiYiQqKso8VkBAgNsfD+5DXXoX6tO7UJ/eg7q0jzNPOfNVcgiyaeDixYvmb0RERFrcHQAAQKZ38eJFyZEjR7L7wceRkriLZMXGxsqxY8cke/bs4uPj4/ZvKRqYjxw5IqGhodSMxahL70J9ehfq03tQl/bRaKohNjw8XHx9k+8FS4tsGtCdXLhwYUlPGmIJst6BuvQu1Kd3oT69B3Vpl1u1xDpxshcAAACsRJAFAACAlQiylgkKCpJhw4aZv7AbdeldqE/vQn16D+rSu3GyFwAAAKxEiywAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFmLTJo0SYoVKybBwcFSs2ZN2bBhg6eLhNswcuRIqV69urmkcb58+aRly5ayb98+9qUXePvtt81lql988UVPFwW36ejRo9KxY0cJCwuTLFmySIUKFWTTpk3sTwvduHFDhgwZInfddZepyxIlSsiIESPM5U/hPQiylpgzZ4707dvXjCG7ZcsWqVSpkjRp0kROnjzp6aIhlVasWCE9evSQdevWyZIlSyQmJkYaN24sly9fZl9abOPGjfLhhx9KxYoVPV0U3KZz585J3bp1JSAgQH788UfZvXu3jB49WnLlysU+tdCoUaPkgw8+kIkTJ8qePXvM7XfeeUcmTJjg6aIhDTGOrCW0BVZb8fQFqWJjYyUiIkJ69eolAwYM8HTxcAdOnTplWmY14N5///3sSwtdunRJ7r33Xpk8ebK88cYbUrlyZRk7dqyni4VU0vfS1atXy8qVK9l3XqBFixaSP39+mT59ety8Nm3amNbZzz//3KNlQ9qhRdYC0dHRsnnzZmnYsGHcPF9fX3N77dq1Hi0b7tyFCxfM39y5c7M7LaUt7M2bN0/wGoV9vv32W6lWrZq0bdvWfLmsUqWKTJs2zdPFwm2qU6eOLF26VPbv329ub9++XVatWiXNmjVjn3oRf08XALd2+vRp09dHv1nGp7f37t3LLrSYtqxrf0r9ObN8+fKeLg5uw+zZs013H+1aALv9+eef5qdo7cY1aNAgU6cvvPCCBAYGSufOnT1dPNxGC3tkZKSULl1a/Pz8zOfom2++KR06dGBfehGCLODhlrydO3eaVgLY58iRI9K7d2/T11lPwoT9Xyy1Rfatt94yt7VFVl+fU6ZMIcha6Msvv5SZM2fKrFmzpFy5crJt2zbTcBAeHk59ehGCrAXy5Mljvk2eOHEiwXy9XaBAAY+VC3emZ8+esnDhQvn111+lcOHC7E4LaZcfPeFS+8c6aauP1qn2Z7927Zp57cIOBQsWlLJlyyaYV6ZMGfn66689Vibcvv79+5tW2Xbt2pnbOgLFoUOHzMgxtLB7D/rIWkB/1qpatarp6xO/5UBv165d26NlQ+rp0C8aYufPny/Lli0zQ8PATg8++KDs2LHDtPQ4J23R058u9f+EWLtoF5/EQ+Fp/8qiRYt6rEy4fVFRUeZ8kvj0Namfn/AetMhaQvts6TdI/ZCsUaOGOSNah2vq2rWrp4uG2+hOoD91ffPNN2Ys2ePHj5v5OXLkMGfTwh5af4n7NmfNmtWMQUqfZ/v06dPHnCCkXQsee+wxM1b31KlTzQT7PPzww6ZPbJEiRUzXgq1bt8qYMWPkqaee8nTRkIYYfssi+lPlu+++a4KPDu8zfvx4MywX7KID5rsyY8YM6dKlS7qXB2mrfv36DL9lMe3uM3DgQDlw4ID5tUQbEbp37+7pYuE2XLx40VwQQX/90i5A2je2ffv2MnToUPNLJ7wDQRYAAABWoo8sAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAZHB6xbeWLVt67PGffPJJc9nWlGjXrp2MHj3a7WUCAMWVvQAgA16y2GnYsGHSp08fcTgckjNnTklv27dvlwYNGsihQ4ckW7Zst1x/586dcv/998tff/0lOXLkSJcyAsi8CLIA4EHHjx+P+/+cOXPMdeD37dsXN0/DY0oCpLs8/fTT4u/vL1OmTEnxNtWrVzetyD169HBr2QCArgUA4EEFChSIm7QFU1to48/TEJu4a0H9+vWlV69e8uKLL0quXLkkf/78Mm3aNLl8+bJ07dpVsmfPLnfffbf8+OOPN7WWNmvWzNynbqNdBk6fPp1k2W7cuCFfffWVPPzwwwnmT548WUqWLCnBwcHmfh599NEEy3X92bNnp9k+AoCkEGQBwEKffvqp5MmTRzZs2GBC7XPPPSdt27aVOnXqyJYtW6Rx48YmqEZFRZn1z58/b7oIVKlSRTZt2iSLFi2SEydOyGOPPZbkY/z2229y4cIFqVatWtw83faFF16Q119/3bQc6/1oV4L4atSoYcp17do1N+4BACDIAoCVKlWqJIMHDzYtowMHDjStoxpsu3fvbuZpF4UzZ86YMKomTpxoQqyetFW6dGnz/48//liWL18u+/fvd/kY2i/Wz89P8uXLFzfv8OHDkjVrVmnRooUULVrU3I8G2/jCw8MlOjo6QbcJAHAHWmQBwEIVK1aM+7+GzbCwMKlQoULcPP3JX508eTLupC0Nrc4+tzppoFV//PGHy8e4cuWKBAUFJTghrVGjRibAFi9e3LT4zpw5M67V1ylLlizmb+L5AJDWCLIAYKGAgIAEtzVsxp/nDJ+xsbHm76VLl0zf1W3btiWYDhw4cFPXACdt4dUwqq2rTtr/VrsufPHFF1KwYEHT8qutw9p1wens2bPmb968edP4WQNAQgRZAMgE7r33Xtm1a5cUK1bMnAgWf9KuAq5UrlzZ/N29e3eC+TqKQcOGDeWdd94xXRcOHjwoy5YtS3BSWeHChU0QBgB3IsgCQCagQ2FpS2n79u1l48aNpjvBTz/9ZEY50NEJXNEWVQ3Aq1atipu3cOFCGT9+vGnN1T60n332mWn1LVWqVNw6K1euNCebAYC7EWQBIBPQE7BWr15tQquGTO1Pq8N36UUWfH19kx1HVvvBOun68+bNMyMglClTxowvq90MypUrZ5ZfvXpVFixYYE46AwB344IIAIAk6Qlf2tqqF2uoXbv2LffUBx98IPPnz5fFixezVwG4HS2yAIAk6QgE2n0guQsnxKcnnE2YMIE9CiBd0CILAAAAK9EiCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwkr+nC+ANYmNj5dixY5I9e3bx8fHxdHEAAACs5XA45OLFixIeHi6+vsm3uRJk04CG2IiIiLS4KwAAAIjIkSNHpHDhwsnuC4JsGtCWWOcODw0NdevBFxMTI4sXL5bGjRtLQECAWx8L7kVdehfq07tQn96DurRPZGSkaSB05qvkEGTTgLM7gYbY9AiyISEh5nEIsnajLr0L9eldqE/vQV3aKyXdNTnZCwAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAK1kXZCdNmiTFihWT4OBgqVmzpmzYsCHZ9efOnSulS5c261eoUEF++OGHJNd99tlnxcfHR8aOHeuGkgMAACDTBtk5c+ZI3759ZdiwYbJlyxapVKmSNGnSRE6ePOly/TVr1kj79u2lW7dusnXrVmnZsqWZdu7cedO68+fPl3Xr1kl4eHg6PBMAAABkqiA7ZswY6d69u3Tt2lXKli0rU6ZMkZCQEPn4449drj9u3Dhp2rSp9O/fX8qUKSMjRoyQe++9VyZOnJhgvaNHj0qvXr1k5syZEhAQkE7PBgAAAHfCXywRHR0tmzdvloEDB8bN8/X1lYYNG8ratWtdbqPztQU3Pm3BXbBgQdzt2NhYefLJJ03YLVeuXIrKcu3aNTM5RUZGmr8xMTFmcifn/bv7ceB+1KV3oT69C/XpPahL+6Qm41gTZE+fPi03btyQ/PnzJ5ivt/fu3etym+PHj7tcX+c7jRo1Svz9/eWFF15IcVlGjhwpw4cPv2n+4sWLTQtxeliyZEm6PA7cj7r0LtSnd6E+vQd1aY+oqCjvC7LuoC282v1A+9vqSV4ppa3C8Vt6tUU2IiJCGjduLKGhoeLubyn6YmzUqBHdICxHXXoX6tO7UJ/eg7q0j/OXbq8Ksnny5BE/Pz85ceJEgvl6u0CBAi630fnJrb9y5UpzoliRIkXilmur70svvWRGLjh48KDL+w0KCjJTYtq/Nr362KbnY8G9qEvvQn16F+rTe1CX9khNvrHmZK/AwECpWrWqLF26NEH/Vr1du3Ztl9vo/PjrK23NdK6vfWN/++032bZtW9ykoxZof9mffvrJzc8IAAAAd8KaFlmlP+d37txZqlWrJjVq1DCtppcvXzajGKhOnTpJoUKFTB9W1bt3b6lXr56MHj1amjdvLrNnz5ZNmzbJ1KlTzfKwsDAzJf4WoC22pUqV8sAzBAAAgFcG2ccff1xOnTolQ4cONSdsVa5cWRYtWhR3Qtfhw4fNSAZOderUkVmzZsngwYNl0KBBUrJkSTNiQfny5T34LAAAAJDpgqzq2bOnmVz55ZdfbprXtm1bM6VUUv1iAQAAkLFY00cWAAAAiI8gCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxkXZCdNGmSFCtWTIKDg6VmzZqyYcOGZNefO3eulC5d2qxfoUIF+eGHH+KWxcTEyCuvvGLmZ82aVcLDw6VTp05y7NixdHgmAAAAyDRBds6cOdK3b18ZNmyYbNmyRSpVqiRNmjSRkydPulx/zZo10r59e+nWrZts3bpVWrZsaaadO3ea5VFRUeZ+hgwZYv7OmzdP9u3bJ//+97/T+ZkBAADAq4PsmDFjpHv37tK1a1cpW7asTJkyRUJCQuTjjz92uf64ceOkadOm0r9/fylTpoyMGDFC7r33Xpk4caJZniNHDlmyZIk89thjUqpUKalVq5ZZtnnzZjl8+HA6PzsAAACkhr9YIjo62gTMgQMHxs3z9fWVhg0bytq1a11uo/O1BTc+bcFdsGBBko9z4cIF8fHxkZw5cya5zrVr18zkFBkZGddVQSd3ct6/ux8H7kddehfq07tQn96DurRPajKONUH29OnTcuPGDcmfP3+C+Xp77969Lrc5fvy4y/V1vitXr141fWa1O0JoaGiSZRk5cqQMHz78pvmLFy82LcTpQVuS4R2oS+9CfXoX6tN7UJf20K6fXhdk0yP9axcDh8MhH3zwQbLraqtw/JZebZGNiIiQxo0bJxuA06qc+mJs1KiRBAQEuPWx4F7UpXehPr0L9ek9qEv7OH/p9qogmydPHvHz85MTJ04kmK+3CxQo4HIbnZ+S9Z0h9tChQ7Js2bJbhtGgoCAzJabBMr3CZXo+FtyLuvQu1Kd3oT69B3Vpj9TkG2tO9goMDJSqVavK0qVL4+bFxsaa27Vr13a5jc6Pv77S1sz46ztD7IEDB+Tnn3+WsLAwNz4LAAAApBVrWmSV/pzfuXNnqVatmtSoUUPGjh0rly9fNqMYKB0DtlChQqYPq+rdu7fUq1dPRo8eLc2bN5fZs2fLpk2bZOrUqXEh9tFHHzVDby1cuND0wXX2n82dO7cJzwAAAMiYrAqyjz/+uJw6dUqGDh1qAmflypVl0aJFcSd06ZBZOpKBU506dWTWrFkyePBgGTRokJQsWdKMWFC+fHmz/OjRo/Ltt9+a/+t9xbd8+XKpX79+uj4/AAAAeGmQVT179jSTK7/88stN89q2bWsmV/QKYXpyFwAAAOxjTR9ZAAAAID6CLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAK/mnZuXz58/L/PnzZeXKlXLo0CGJioqSvHnzSpUqVaRJkyZSp04d95UUAAAASG2L7LFjx+Tpp5+WggULyhtvvCFXrlyRypUry4MPPiiFCxeW5cuXS6NGjaRs2bIyZ86clNwlAAAA4P4WWW1x7dy5s2zevNmEVVc03C5YsEDGjh0rR44ckX79+t1ZyQAAAIA7DbK7d++WsLCwZNfJkiWLtG/f3kxnzpxJyd0CAAAA7u1acKsQe6frAwAAAG492St+n9lVq1bJyZMnJTY2NsGyF1544XbuEgAAAHBvkP3kk0/kP//5jwQGBpqWVx8fn7hl+n+CLAAAADJkkB0yZIgMHTpUBg4cKL6+DEMLAAAAz0h1EtWxY9u1a0eIBQAAgF1Btlu3bjJ37lz3lAYAAABwV9eCkSNHSosWLWTRokVSoUIFCQgISLB8zJgxqb1LAAAAIH2C7E8//SSlSpUytxOf7AUAAABkyK4Fo0ePlo8//lj27Nkjv/zyi7k8rXNatmyZuNukSZOkWLFiEhwcLDVr1pQNGzYku752gyhdurRZX1uQf/jhhwTLHQ6HOXlNL7+rF3Vo2LChHDhwwM3PAgAAAOkeZIOCgqRu3briCXPmzJG+ffvKsGHDZMuWLVKpUiVp0qSJGc/WlTVr1pgrjWm/3q1bt0rLli3NtHPnzrh13nnnHRk/frxMmTJF1q9fL1mzZjX3efXq1XR8ZgAAAHB714LevXvLhAkTTPhLb9r/tnv37tK1a1dzW8Pn999/b1qIBwwYcNP648aNk6ZNm0r//v3N7REjRsiSJUtk4sSJZlttjR07dqwMHjxYHnnkEbPOZ599Jvnz55cFCxaY0RkyEi1vVPR1uXZDzN8AB1050mS/xsbK1atnzf+DA/zSrYvM9ZgYuXH9olyJOi0xifqaI4Pwz6J9plK06vXr1yXaES1Xrl+RGIlxe9HgXtSn96Au01YW/ywZqiupj0PTUSq0atXKdCHQiyGUK1fuppO95s2bJ+4QHR0tISEh8tVXX5lWVafOnTvL+fPn5ZtvvrlpmyJFipgW3BdffDFunrbmakjdvn27/Pnnn1KiRAnTWlu5cuW4derVq2duaxB25dq1a2ZyioyMlIiICDl9+rSEhoaKu2h4rTTC/d03MpssPpHiX/otTxcDAIAMb/Vjq02YdSfNVXny5JELFy7cMlelukU2Z86c0rp1a0lvGhJv3LhhWkvj09t79+51uc3x48ddrq/zncud85JaJ6kT3oYPH37T/MWLF5uw7S7aEnubVxUGAAC4Y3rCf6BPoLiTXrMgpVKdimbMmCGZnV7VTFt6E7fINm7c2K0tstp43qDBNdMi3qBBAwkIINSmXdeC+8z/s6Rj14KYmOuyYsUK8wsAdZlBBYSkuGtBTExMvNcmXUVsR316D+oybQX7Bbv9c1JzVUpZk4S0idnPz09OnDiRYL7eLlCggMttdH5y6zv/6jwdtSD+OvG7Grg64U2nxPTDy90fYDl8fCTITyRH1mA+LNNS9qziiTdXP//sEpqjAHXpBWL8Y0wrRWiWUOrTC1Cf3oO6tE9qslSKRi3QE6bWrVt3y/UuXrwoo0aNMkNkpbXAwECpWrWqLF26NG5ebGysuV27dm2X2+j8+OsrPdnLuf5dd91lwmz8dfRbgI5ekNR9AgAAIGNIUYts27ZtpU2bNpIjRw55+OGHpVq1ahIeHm7GZj137pzs3r1bVq1aZcZobd68ubz77rtuKaz+nK8nd+nj16hRw4w4cPny5bhRDDp16iSFChUyfVidIyzoz7Y69q2Wa/bs2bJp0yaZOnWqWa5N43oi2BtvvCElS5Y0wXbIkCHmucU/oQwAAACWBlkdh7Vjx47m4gI6lqsGQT2TzBkGy5Yta8Ze3bhxo5QpU8ZthX388cfl1KlT5gIGejKW/vyvl8p1nqx1+PBh8fX9XyNznTp1ZNasWWZ4rUGDBpmwqiMWlC9fPm6dl19+2YThZ555xox+cN9995n71JAOAACAjCvFfWS1T6iGWZ2UBtkrV66YYbjS88SGnj17mskVvdKYq9ZknZKiQfz11183EwAAAOxx2yd7aTcDnQAAAAArLlELAAAAZAQEWQAAAFiJIAsAAAArEWQBAACQOYKsjuP666+/uqc0AAAAgLuCrA671bBhQzMm61tvvSVHjx5N7V0AAAAA6R9k9YICGl6fe+45c3GEYsWKSbNmzeSrr74y144HAAAAMmwf2bx585rLxW7fvl3Wr18vd999tzz55JPm0q59+vSRAwcOpH1JAQAAgLQ62euff/6RJUuWmMnPz08eeugh2bFjh7lk7fvvv38ndw0AAACkbZDV7gNff/21tGjRQooWLSpz586VF198UY4dOyaffvqp/Pzzz/Lll19yyVcAAABkrEvUFixYUGJjY6V9+/ayYcMGqVy58k3rPPDAA5IzZ860KiMAAABw50FWuwy0bdtWgoODk1xHQ+xff/2V2rsGAAAA3Bdk9aQuAAAAwNO4shcAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWMmaIHv27Fnp0KGDhIaGSs6cOaVbt25y6dKlZLe5evWq9OjRQ8LCwiRbtmzSpk0bOXHiRNzy7du3S/v27SUiIkKyZMkiZcqUkXHjxqXDswEAAECmCbIaYnft2iVLliyRhQsXyq+//irPPPNMstv06dNHvvvuO5k7d66sWLFCjh07Jq1bt45bvnnzZsmXL598/vnn5r5fffVVGThwoEycODEdnhEAAADuhL9YYM+ePbJo0SLZuHGjVKtWzcybMGGCPPTQQ/Lee+9JeHj4TdtcuHBBpk+fLrNmzZIGDRqYeTNmzDCtruvWrZNatWrJU089lWCb4sWLy9q1a2XevHnSs2fPdHp2AAAA8Nogq+FSuxM4Q6xq2LCh+Pr6yvr166VVq1Y3baOtrTExMWY9p9KlS0uRIkXM/WmQdUUDcO7cuZMtz7Vr18zkFBkZaf7q4+nkTs77d/fjwP2oS+9CfXoX6tN7UJf2SU3GsSLIHj9+3HQBiM/f398ETl2W1DaBgYEmAMeXP3/+JLdZs2aNzJkzR77//vtkyzNy5EgZPnz4TfMXL14sISEhkh60iwW8A3XpXahP70J9eg/q0h5RUVF2BNkBAwbIqFGjbtmtID3s3LlTHnnkERk2bJg0btw42XW1H23fvn0TtMjqCWO6nZ6M5u5vKfpibNSokQQEBLj1seBe1KV3oT69C/XpPahL+zh/6c7wQfall16SLl26JLuO9lstUKCAnDx5MsH869evm5EMdJkrOj86OlrOnz+foFVWRy1IvM3u3bvlwQcfNCePDR48+JblDgoKMlNiGizTK1ym52PBvahL70J9ehfq03tQl/ZITb7xaJDNmzevmW6ldu3aJpBqv9eqVauaecuWLZPY2FipWbOmy210Pd0RS5cuNcNuqX379snhw4fN/TnpaAV6Mljnzp3lzTffTLPnBgAAAPeyYvgtHWmgadOm0r17d9mwYYOsXr3ajCrQrl27uBELjh49ak7m0uUqR44cZqxZ7QKwfPlyE4K7du1qQqzzRC/tTvDAAw+YLgG6nvad1enUqVMefb4AAADwkpO91MyZM0141S4AOlqBtrKOHz8+QR8YbXGN30H4/fffj1tXRxlo0qSJTJ48OW75V199ZUKrjiOrk1PRokXl4MGD6fjsAAAA4LVBVkco0DFhk1KsWDFxOBwJ5gUHB8ukSZPM5Mprr71mJgAAANjHiq4FAAAAQGIEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAla4Ls2bNnpUOHDhIaGio5c+aUbt26yaVLl5Ld5urVq9KjRw8JCwuTbNmySZs2beTEiRMu1z1z5owULlxYfHx85Pz58256FgAAAMh0QVZD7K5du2TJkiWycOFC+fXXX+WZZ55Jdps+ffrId999J3PnzpUVK1bIsWPHpHXr1i7X1WBcsWJFN5UeAAAAmTLI7tmzRxYtWiQfffSR1KxZU+677z6ZMGGCzJ4924RTVy5cuCDTp0+XMWPGSIMGDaRq1aoyY8YMWbNmjaxbty7Buh988IFphe3Xr186PSMAAADcKX+xwNq1a013gmrVqsXNa9iwofj6+sr69eulVatWN22zefNmiYmJMes5lS5dWooUKWLur1atWmbe7t275fXXXzf38+eff6aoPNeuXTOTU2RkpPmrj6eTOznv392PA/ejLr0L9eldqE/vQV3aJzUZx4oge/z4ccmXL1+Cef7+/pI7d26zLKltAgMDTQCOL3/+/HHbaBht3769vPvuuybgpjTIjhw5UoYPH37T/MWLF0tISIikB+1iAe9AXXoX6tO7UJ/eg7q0R1RUlB1BdsCAATJq1Khbditwl4EDB0qZMmWkY8eOqd6ub9++CVpkIyIipHHjxuZkNHd/S9EXY6NGjSQgIMCtjwX3oi69C/XpXahP70Fd2sf5S3eGD7IvvfSSdOnSJdl1ihcvLgUKFJCTJ08mmH/9+nUzkoEuc0XnR0dHm76v8VtlddQC5zbLli2THTt2yFdffWVuOxwO8zdPnjzy6quvumx1VUFBQWZKTINleoXL9HwsuBd16V2oT+9CfXoP6tIeqck3Hg2yefPmNdOt1K5d2wRS7feqJ205Q2hsbKw5+csVXU93xNKlS82wW2rfvn1y+PBhc3/q66+/litXrsRts3HjRnnqqadk5cqVUqJEiTR6lgAAAHAHK/rI6s//TZs2le7du8uUKVPMzwQ9e/aUdu3aSXh4uFnn6NGj8uCDD8pnn30mNWrUkBw5cpghtbQLgPal1Z/8e/XqZUKs80SvxGH19OnTcY+XuG8tAAAAMhYrgqyaOXOmCa8aVnW0Am1lHT9+fNxyDbfa4hq/g/D7778ft66e2NWkSROZPHmyh54BAAAAMmWQ1VbVWbNmJbm8WLFicX1cnYKDg2XSpElmSon69evfdB8AAADImKy4IAIAAACQGEEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEr+ni6AN3A4HOZvZGSk2x8rJiZGoqKizGMFBAS4/fHgPtSld6E+vQv16T2oS/s485QzXyWHIJsGLl68aP5GRESkxd0BAABkehcvXpQcOXIkux98HCmJu0hWbGysHDt2TLJnzy4+Pj5u/5aigfnIkSMSGhpKzViMuvQu1Kd3oT69B3VpH42mGmLDw8PF1zf5XrC0yKYB3cmFCxeW9KQhliDrHahL70J9ehfq03tQl3a5VUusEyd7AQAAwEoEWQAAAFiJIGuZoKAgGTZsmPkLu1GX3oX69C7Up/egLr0bJ3sBAADASrTIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQtcikSZOkWLFiEhwcLDVr1pQNGzZ4uki4DSNHjpTq1aubSxrny5dPWrZsKfv27WNfeoG3337bXKb6xRdf9HRRcJuOHj0qHTt2lLCwMMmSJYtUqFBBNm3axP600I0bN2TIkCFy1113mbosUaKEjBgxwlz+FN6DIGuJOXPmSN++fc0Yslu2bJFKlSpJkyZN5OTJk54uGlJpxYoV0qNHD1m3bp0sWbJEYmJipHHjxnL58mX2pcU2btwoH374oVSsWNHTRcFtOnfunNStW1cCAgLkxx9/lN27d8vo0aMlV65c7FMLjRo1Sj744AOZOHGi7Nmzx9x+5513ZMKECZ4uGtIQ48haQltgtRVPX5AqNjZWIiIipFevXjJgwABPFw934NSpU6ZlVgPu/fffz7600KVLl+Tee++VyZMnyxtvvCGVK1eWsWPHerpYSCV9L129erWsXLmSfecFWrRoIfnz55fp06fHzWvTpo1pnf388889WjakHVpkLRAdHS2bN2+Whg0bxs3z9fU1t9euXevRsuHOXbhwwfzNnTs3u9NS2sLevHnzBK9R2Ofbb7+VatWqSdu2bc2XyypVqsi0adM8XSzcpjp16sjSpUtl//795vb27dtl1apV0qxZM/apF/H3dAFwa6dPnzZ9ffSbZXx6e+/evexCi2nLuvan1J8zy5cv7+ni4DbMnj3bdPfRrgWw259//ml+itZuXIMGDTJ1+sILL0hgYKB07tzZ08XDbbSwR0ZGSunSpcXPz898jr755pvSoUMH9qUXIcgCHm7J27lzp2klgH2OHDkivXv3Nn2d9SRM2P/FUltk33rrLXNbW2T19TllyhSCrIW+/PJLmTlzpsyaNUvKlSsn27ZtMw0H4eHh1KcXIchaIE+ePObb5IkTJxLM19sFChTwWLlwZ3r27CkLFy6UX3/9VQoXLszutJB2+dETLrV/rJO2+midan/2a9eumdcu7FCwYEEpW7ZsgnllypSRr7/+2mNlwu3r37+/aZVt166dua0jUBw6dMiMHEMLu/egj6wF9GetqlWrmr4+8VsO9Hbt2rU9Wjakng79oiF2/vz5smzZMjM0DOz04IMPyo4dO0xLj3PSFj396VL/T4i1i3bxSTwUnvavLFq0qMfKhNsXFRVlzieJT1+T+vkJ70GLrCW0z5Z+g9QPyRo1apgzonW4pq5du3q6aLiN7gT6U9c333xjxpI9fvy4mZ8jRw5zNi3sofWXuG9z1qxZzRik9Hm2T58+fcwJQtq14LHHHjNjdU+dOtVMsM/DDz9s+sQWKVLEdC3YunWrjBkzRp566ilPFw1piOG3LKI/Vb777rsm+OjwPuPHjzfDcsEuOmC+KzNmzJAuXbqke3mQturXr8/wWxbT7j4DBw6UAwcOmF9LtBGhe/funi4WbsPFixfNBRH01y/tAqR9Y9u3by9Dhw41v3TCOxBkAQAAYCX6yAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAkAGp1d8a9mypcce/8knnzSXbU2Jdu3ayejRo91eJgBQXNkLADLgJYudhg0bJn369BGHwyE5c+aU9LZ9+3Zp0KCBHDp0SLJly3bL9Xfu3Cn333+//PXXX5IjR450KSOAzIsgCwAedPz48bj/z5kzx1wHft++fXHzNDymJEC6y9NPPy3+/v4yZcqUFG9TvXp104rco0cPt5YNAOhaAAAeVKBAgbhJWzC1hTb+PA2xibsW1K9fX3r16iUvvvii5MqVS/Lnzy/Tpk2Ty5cvS9euXSV79uxy9913y48//nhTa2mzZs3Mfeo22mXg9OnTSZbtxo0b8tVXX8nDDz+cYP7kyZOlZMmSEhwcbO7n0UcfTbBc1589e3aa7SMASApBFgAs9Omnn0qePHlkw4YNJtQ+99xz0rZtW6lTp45s2bJFGjdubIJqVFSUWf/8+fOmi0CVKlVk06ZNsmjRIjlx4oQ89thjST7Gb7/9JhcuXJBq1arFzdNtX3jhBXn99ddNy7Hej3YliK9GjRqmXNeuXXPjHgAAgiwAWKlSpUoyePBg0zI6cOBA0zqqwbZ79+5mnnZROHPmjAmjauLEiSbE6klbpUuXNv//+OOPZfny5bJ//36Xj6H9Yv38/CRfvnxx8w4fPixZs2aVFi1aSNGiRc39aLCNLzw8XKKjoxN0mwAAd6BFFgAsVLFixbj/a9gMCwuTChUqxM3Tn/zVyZMn407a0tDq7HOrkwZa9ccff7h8jCtXrkhQUFCCE9IaNWpkAmzx4sVNi+/MmTPjWn2dsmTJYv4mng8AaY0gCwAWCggISHBbw2b8ec7wGRsba/5eunTJ9F3dtm1bgunAgQM3dQ1w0hZeDaPauuqk/W+168IXX3whBQsWNC2/2jqsXReczp49a/7mzZs3jZ81ACREkAWATODee++VXbt2SbFixcyJYPEn7SrgSuXKlc3f3bt3J5ivoxg0bNhQ3nnnHdN14eDBg7Js2bIEJ5UVLlzYBGEAcCeCLABkAjoUlraUtm/fXjZu3Gi6E/z0009mlAMdncAVbVHVALxq1aq4eQsXLpTx48eb1lztQ/vZZ5+ZVt9SpUrFrbNy5UpzshkAuBtBFgAyAT0Ba/Xq1Sa0asjU/rQ6fJdeZMHX1zfZcWS1H6yTrj9v3jwzAkKZMmXM+LLazaBcuXJm+dWrV2XBggXmpDMAcDcuiAAASJKe8KWtrXqxhtq1a99yT33wwQcyf/58Wbx4MXsVgNvRIgsASJKOQKDdB5K7cEJ8esLZhAkT2KMA0gUtsgAAALASLbIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWMnf0wXwBrGxsXLs2DHJnj27+Pj4eLo4AAAA1nI4HHLx4kUJDw8XX9/k21wJsmlAQ2xERERa3BUAAABE5MiRI1K4cOFk9wVBNg1oS6xzh4eGhrr14IuJiZHFixdL48aNJSAgwK2PBfeiLr0L9eldqE/vQV3aJzIy0jQQOvNVcgiyacDZnUBDbHoE2ZCQEPM4BFm7UZfehfr0LtSn96Au7ZWS7pqc7AUAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkLIgAAMtQ11s9cPSN/XfgrbjoYedD8jbwWKbmCc0meLHkkLEuYhAWHmb/mdnDY/+ZnCZMgvyBPPxUA6YAgCwBId9E3ouVw5OG4kBr398JBuRhzMcntdNnhi4dvef/ZA7MnCLeuwm6hrIUkZ3DONH5mANITQRYA4LbW1XPXzv2vZfXCQfkr8r9//770t8Q6Yl1u5+vjK4WyFZJiocXkrhx3SbEcxeSu0Lskd3BuOXv1rJy+elrOXDnz3+nqGTl95b+3zd+rZ+R67HW5GH3RTBqQk6KP0yCigTxR5gmplr9aii6HCSBjIcgCAO5ITGyMHLl45H9hNX53gOjIJLfLFpAtYVjNcZcJrEVCi0igX6DLbYpL8VuGZ33MpEKu87ZOJ6+clJ8P/2ymUrlKSYcyHaTZXc0k2D+YIwKwBEEWAJAi56+ej2tRNa2sztbVi3/Ldcd1l9v4iI+EZwuPa1U1ofX/h1f9mT+tW0H1/nIE5TDTrULvH+f/kFl7Zsl3f34n+87tk6FrhsqYzWPk0XselTYl2qRpuQC4B0EWAOCS/vT/3R/fybwD80xw1W4CScninyUuoMbvDlA0tGiGbeEskbOEDKk9RF649wWZf2C+fLH3Czl2+Zh8tOMjmbFzhpTxLyPhp8KlWkG6HQAZFUEWAHCT9f+sl/c2vSd7z+5NML9A1gL/a1n9/90BNMDmD8lvbR9Tbb3tUr6LPFn2SfnlyC8yc+9M2Xh8o+yM2SlPLXlKyoaVNd0OmhZrmmSXBwCeQZAFAMT58/yf5uf1FX+vMLezB2SXpyo8JXXD65rW1ZCAEK/dW36+fvJg0QfNtOvkLnl36buy88ZO2X1mt7y66lUZvWm0tL2nrTxW6jHJF5LP08UFQJAFACg9+emD7R/IV/u/khuOG+Lv428C27OVnjVjt2Y29+S6R1qFtJJ3Grwj3x78VmbvnS0nok7Ih799KNN3TJfGxRqbVtqKeSt6uqhApkaLLABkYlevX5XP93xu+oVejrls5umQVH2q9jFdBzI7DfFPV3haupTrIksPLzUnh205uUV++OsHM1XIU8EE2sZFG0uAX4CniwtkOgRZAMikJ3JpEBu/Zbz8c/kfM0/7gvar1k+qF6ju6eJlOP6+/tKkWBMzaVeDmXtmyo9//Sg7Tu+QASsHmP7E2oKtXQ90NAYA6YMgCwCZzKbjm0zw2nVmV9wJXL3v7S0P3fWQuUgAkqeB/8373pS+Vfuarhhz9s2RU1dOyeRtk2Xab9PMWLR6kYVyYeXYlYCbEWQBIJPQMV/f3/y+LDuyzNzOGpDV/GzesUzHDDtEVkaml7n9T6X/yFPlnzIXVdAuGr+d+k2+/eNbM1XOW9l0O9CTxwJ86XYAuINXf/UuVqyYGQ4m8dSjRw+z/OrVq+b/YWFhki1bNmnTpo2cOHHC08UGgDR17uo5Gbl+pLT6ppUJsX4+fvJ4qcfl+1bfmyBLiL0z2jdWW2FnPjRTZj00S1oUb2G6Imw7tU36/9pfmn7d1LTU6uV1AaQtrw6yGzdulH/++SduWrJkiZnftm1b87dPnz7y3Xffydy5c2XFihVy7Ngxad26tYdLDQBp49qNa/LJzk+k+bzmMmvvLHP1rXqF68m8f8+TwbUGmxZFpK0KeSvIyH+NlMVtFstzlZ6T3MG55WTUSRm/dbw0mttIhqwectPYvABun1d3LcibN2+C22+//baUKFFC6tWrJxcuXJDp06fLrFmzpEGDBmb5jBkzpEyZMrJu3TqpVauWh0oNAHfG4XDITwd/krFbxsrRS0fNvNK5S5sTuWoWrMnuTQd5Q/LK85WfNy3eWhfa7UBPElvw+wIzVc1f1XQ7eCDiAdN6C+D2ZJpXT3R0tHz++efSt29f071g8+bNEhMTIw0bNoxbp3Tp0lKkSBFZu3ZtskH22rVrZnKKjIw0f/X+dHIn5/27+3HgftSld8ko9bn91HYZvWW07Dyz09zOlyWf9KjUQ5rf1dycyOXp8mW2+vQRH2lapKk0iWgiv53+TWbvn22G8dp8YrOZCoQUkMfueUxalWhlrjAG731tIuVSU1c+Dv3qngl8+eWX8sQTT8jhw4clPDzctMR27do1QSBVNWrUkAceeEBGjRqV5H299tprMnz48Jvm632GhHjvVW8AZFxnbpyRxVcXy66Y/45EECiB8q/gf0ndoLoS6MNlVTOSyNhIWX9tvWyM3ihRjigzL0ACpFJgJakVVEsK+BXwdBEBj4qKijKZTX89Dw0NTXbdTNMiq90ImjVrZkLsnRo4cKBp2Y3fIhsRESGNGze+5Q5Pi28p2te3UaNGEhDAWbA2oy69i6fq88K1C/LRzo9kzoE5cj32uml1faT4I/JcxecYzzQD12c7aWf6MC86uEi+2PeF7D+/XzZFbzJT9fzVpX2p9vKv8H+Zy+bizvBeax/nL90pkSmC7KFDh+Tnn3+WefPmxc0rUKCA6W5w/vx5yZkzZ9x8HbVAlyUnKCjITInpm116fYCl52PBvahL75Je9RlzI0Zm75stU7ZPkcjo/77p1y1UV16q+pKUzFXS7Y+fWbizPvV+Hy39qLQp1cZcLUwvsqDdDjae2GimQtkKSfvS7aVVyVYSGujeRpLMgPdae6TmNZcpgqyexJUvXz5p3rx53LyqVauaHbV06VIz7Jbat2+f6XpQu3ZtD5YWAJKmvcF0zFIdD/bIxSNmngbXflX7SZ1Cddh1FtLzNvTkL53+ufSP+YLy9YGvzYl6euGKSdsmyb9L/FueKP2EFM9Z3NPFBTIUrw+ysbGxJsh27txZ/P3/93Rz5Mgh3bp1M10EcufObboE9OrVy4RYRiwAkBHpYPsabLae3Gpu66VQe1XpJY+UeISfoL1EwWwFpU/VPvJspWfl+z+/N620v5//3Vw9TKfaBWtLx7Id5b5C93EVNiAzBFntUqCtrE899dRNy95//33x9fU1LbJ60leTJk1k8uTJHiknACTl74t/y/gt4+XHgz+a21n8s0iXcl3MFBLACabeSOv40XselTYl28jG4xvN8F2/HPlF1v6z1kxFshcx3Q5a3t1SsgVm83RxAY/x+iCrJ2AlNTBDcHCwTJo0yUwAkNFo39ePfvvIhJiY2BgzlNMjdz8iPSv3lPxZ83u6eEinbgc1CtYwk36hmb13tsw7ME8OXzwsozaOkglbJ5gwq6G2WI5i1AkyHa8PsgBgGw2tX+770pzIdf7aeTNPL2SgFzTQCxsgcyqcvbD0q97PXGjhuz++k5l7Z8pfF/4yV23TSbsbdCzTUWqH16bbATINgiwAZBD669HyI8vNiVwHIw+aeSVylJC+1frKvwr9y7TOAdqd5PHSj8tjpR4z3Qxm7Zklv/79q6w6uspMZXKXkQkNJtBqj0yBIAsAGcCu07vMiVybTmwyt3MH55YelXtI65KtuYQpXNIvNnXC65jpcORh+WLvFzL/9/my5+we6fRjJ5naeKoUDS3K3oNX8/V0AQAgMzt++bgMXDlQ2n3fzoTYIL8g6V6hu3zf6nvT4ubvS3sDbq1IaBF5pcYrMu/f88yJYMcuH5POP3aWfWf3sfvg1QiyAOABl6Ivybgt46TF/Bay8M+FZt7DxR+Wha0Wygv3vsCZ6Lgt4dnC5dNmn5q+1GeunpGui7rGDdcGeCOCLACkI72M7Jy9c6T5/Oby0Y6PzGVKqxeoLnNazJG3/vWWFMia/JUFgVvR8YWnN5ku9+a7Vy7GXJRnFj8jK/9eyY6DVyLIAkA6ncilJ+S0+baNvLH+DTl79awUCy0m4x8YL9MbT5eyYWWpB6QZvaTtlEZTzEgGV29clReWvSA//vXfcYgBb0LnKwBws71n95oTudb/s97czhWUS56r/JwZ8D7AN+XXFAdSe1EF/aL06qpXzcU0Xvn1FbkYfdH0vQa8BUEWANzkxOUTZsD6b//4VhzikEDfQOlQtoM5mSt7YHb2O9wuwC9ARv5rpIQGhZpL3I5YN8JcaKNb+W4M5wavQJAFgDQWFRMlH+/8WD7d9an5WVc1u6uZ9L63txTKVoj9jXTl5+snr9Z81XQ3mLZjmjnJ8MK1C9K3al/CLKxHkAWANBLriDXjeH6w4wM5feW0macn3OgVuSrkrcB+hkfHnNXRMHIE5TDdXD7Z9YkJs0NrD2WIN1iNIAsAaUCvxDXp4iQ5seGEua1jefap2kceLPIgrV7IMDqX62xaZl9b+5r50qV9ZkfdP0oC/QI9XTTgtjBqAQDcoaOXjsqzS5+VE7EnJEdgDnml+iuy4JEF0rBoQ0IsMpxWJVvJ6HqjzYmGPx/+WXos7WG6wwA2IsgCwB04FXVKui/uLievnJR8vvnk6xZfS8eyHc1JNkBGpV+yJjecbEY2WPfPOnMMa1cDwDYEWQC4TeevnpdnljwjRy4ekcLZCkuXbF0kd3Bu9iesUKtgLfmo8Uem3+xvp3+TLou6yMmok54uFpAqBFkAuM1LzD7787Py+/nfJV+WfPJBgw8k1DeUfQmrVMxbUT5p8ok5hvVY7vRjJzkSecTTxQJSjCALAKl05foV6bmsp+w6s8tc3GBa42kMqwVr3Z3rbvm02acSkT3C9PfutKiT7Du7z9PFAlKEIAsAqRBzI0b6/NJHNp/YLNkDssuHjT6U4jmLsw9htcLZC8tnzT6Te3LdY4aO6/pTV9l2cpuniwXcEkEWAFLoeux1eWXlK7L66GpzksykhpOkTFgZ9h+8Qp4seeTjJh9L5byVzbBc2v9bj3UgIyPIAkAKL3bw2prXZMmhJWbYorEPjJUq+aqw7+BV9MQv/ZWhbnjduC40Px38ydPFApJEkAWAW3A4HDJqwyj55o9vxM/HT96t967UCa/DfoNXCgkIkQkNJkiTYk3MrxD9V/SXr/Z/5eliAZkzyB49elQ6duwoYWFhkiVLFqlQoYJs2rQpwQfU0KFDpWDBgmZ5w4YN5cCBAx4tM4CMZcLWCTJr7yzxER8ZUXeEuVoX4M10HORR/xolj97zqDjEIcPXDpfpO6Z7ulhA5gqy586dk7p160pAQID8+OOPsnv3bhk9erTkypUrbp133nlHxo8fL1OmTJH169dL1qxZpUmTJnL16lWPlh1AxqAf3tN2TDP/H1xrsDxc4mFPFwlIF36+fjK01lDpVr6buT12y1gZs3mMaQACMgp/8WKjRo2SiIgImTFjRty8u+66K+7/+mIcO3asDB48WB555BEz77PPPpP8+fPLggULpF27di7v99q1a2ZyioyMNH9jYmLM5E7O+3f348D9qMuM78v9X5oPb9W7cm9pVbxVkq896tO7UJ//06NiD8nmn03GbRsnM3bOkPNXzsug6oNM0LUBdWmf1GQcH4cXf7UqW7asaV39+++/ZcWKFVKoUCF5/vnnpXv37mb5n3/+KSVKlJCtW7dK5cqV47arV6+euT1u3DiX9/vaa6/J8OHDb5o/a9YsCQkJceMzApBetkZvla+jvjb/rx9UXxpmacjOR6a26dom+ebKN6arQfmA8vJoyKPi7+PV7WHwkKioKHniiSfkwoULEhoamnmDbHBwsPnbt29fadu2rWzcuFF69+5tuhF07txZ1qxZY7oeHDt2zPSRdXrsscfEx8dH5syZk+IWWW35PX369C13eFp8S1myZIk0atTIdJmAvajLjGvZkWXyyqpX5IbjhrS7p530r9rfvCckh/r0LtSnaz8f/lkGrRlkTgKrVaCWjL5/tBmKLiOjLu2juSpPnjwpCrJe/VUqNjZWqlWrJm+99Za5XaVKFdm5c2dckL1dQUFBZkpMg2V6hcv0fCy4F3WZsaw5ukYGrh5oQuwjJR6RgbUGiq9Pyk8noD69C/WZULMSzSRHlhzy4vIXZd3xdfL88udl0oOTzLBdGR11aY/U5BuvPtlLW1m1e0F8ZcqUkcOHD5v/FyhQwPw9ceJEgnX0tnMZgMxjy4kt0nt5b4mJjZFGRRvJa3VeS1WIBTIDHXpuaqOpEhoYKttPbTdXATsVdcrTxUIm5dXv0NptYN++hNeL3r9/vxQtWjTuxC8NrEuXLk3QnK2jF9SuXTvdywvAc3af2S09lvaQqzeuSt1Cdc3QQ/6+Xv2jFXDbKuerLDOazjBXAztw7oB0+rGTHLl4hD2KdOfVQbZPnz6ybt0607Xg999/NydjTZ06VXr06GGWa5+3F198Ud544w359ttvZceOHdKpUycJDw+Xli1berr4ANLJH+f/kP8s+Y9cirkkVfNXlffrv2/G0QSQtHty3SOfNftMCmcrLH9f+ls6/9jZhFogPXl1kK1evbrMnz9fvvjiCylfvryMGDHCDLfVoUOHuHVefvll6dWrlzzzzDNm/UuXLsmiRYviThQD4N20FemZxc/I+WvnpVxYOZnYYGKGP3kFyCgiskeYMHt3zrvl1JVT0mVRF9PdAEgvXh1kVYsWLUxLq17gYM+ePXFDbzlpq+zrr78ux48fN+v8/PPPcs8993isvADSz4nLJ6T74u5y8spJ80E8peEUyRaYjSoAUiFvSF75pOknUjFvRYmMjjSvqbXH1rIPkS68PsgCgCvnrp6TZ5Y8I0cvHTWtSnrySs7gnOws4DboqAXTGk2T2gVry5XrV0x/8yWHlrAv4XYEWQCZzsXoi6ZP7J8X/pT8IfllWuNpplUJwO0LCQiRiQ9ONCN+6Mgf/Vb0k/kH5rNL4VYEWQCZSlRMlGkt2nN2j+QOzm1CbKFshTxdLMArBPoFyrv3vyttSraRWEesDF0zVD7Z+YmniwUvRpAFkGlE34iWPr/0ka0nt0r2wOymO8FdOe7ydLEAr+Ln6yfDag+TruW7mtujN4+WcVvGiRdfSBQeRJAFkCnoJTVf/vVlWXNsjRmVYPKDk6VU7lKeLhbglfRE6r5V+8qL975obn+04yMZsW6E3Ii94emiwcsQZAF4PfMT5+qhsvTwUgn0DZTxDcabAd0BuFe3Ct1kaO2h4iM+Mnf/XBmwcoDE3IhhtyPNEGQBeDX9OfOt9W/Jd39+J34+fjK6/mipVbCWp4sFZBpt72kr79R7x1wpb9HBRfLC8hfMyAZAWiDIAvBq2jdvzr45pkXorfvekvoR9T1dJCDTaVqsqUxoMEGC/YJl1dFVZtQQHXMWuFMEWQBeS/vlTd853fxff958qPhDni4SkGndV+g+mdp4qjnRUk+4fGrRU3L6ymlPFwuWI8gC8Eqz9swyrbGqX7V+8ug9j3q6SECmVyVfFZnRZIaEBYfJvnP7pPOPnc1FSYDbRZAF4HW++f0bGblhpPn/c5Wek87lOnu6SAD+Px0t5LNmn5nxmw9fPCydfugkf5z/g/2D20KQBeBV9LKYOgi76limowmyADKWIqFF5NOmn0qJHCXk5JWT0nlRZ9lxaoeniwULEWQBeA09iUTHitXhtlqXbC0vV3/ZjGcJIOPJnzW/fNL0E6mQp4JcuHZBnl78tKz/Z72niwXLEGQBeIVNxzdJn+V9zIUPmhRrIkNrDSXEAhlczuCc8lHjj6RmwZoSdT1Knvv5OTPeM5BSBFkA1tt1epf0XNZTrt64KvcXvl9G3jfSXCYTQMYXEhBirrTXsEhDiYmNkb6/9JUFvy/wdLFgCYIsAKsdOHdA/vPzf+RyzGWpXqC6jK43WgL8AjxdLACpEOgXKO/We1da3t3SdA0asnqIfLbrM/YhbokgC8BahyMPyzNLnjH967SfnRlw3T/Y08UCcBv0yl+v13ldOpf97ygj7256VyZsnWCuzgckhSALwErHLx+X7ou7mwHVS+YqKR80/ECyBmT1dLEA3AE9OfOlai/JC1VeMLen/jZV3lz/pmmlBVwhyAKwzpkrZ0yIPXb5mBQNLSpTG02VHEE5PF0sAGkUZrtX7C6Daw42l5bWS0wPXDnQ9J8FEiPIArCKXp/92Z+flYORB6VA1gIyrdE0yZMlj6eLBSCNPV76cRl1/yjx9/GXH/76QV759RW6GSBzBdnXXnvNfLOLP5UuXTpu+dWrV6VHjx4SFhYm2bJlkzZt2siJEyc8WmYASYuKiZLnf35e9p7day5xqcP2FMxWkF0GeKlmdzWTcQ3GSYBvgLnYydz9cz1dJGQwXh1kVbly5eSff/6Jm1atWhW3rE+fPvLdd9/J3LlzZcWKFXLs2DFp3bq1R8sLwLVrN67JC8tfkO2ntktoYKh82OhD060AgHfTIfVevPdF8//3Nr0nhyIPebpIyEC8Psj6+/tLgQIF4qY8ef77E+SFCxdk+vTpMmbMGGnQoIFUrVpVZsyYIWvWrJF169Z5utgA4tG+cf1X9DdX/QnxDzEndun12gFkDh3LdpQaBWrIletXZNDKQebCJ4Dy9/bdcODAAQkPD5fg4GCpXbu2jBw5UooUKSKbN2+WmJgYadiwYdy62u1Al61du1Zq1aqV5H1eu3bNTE6RkZHmr96fTu7kvH93Pw7cj7pMGTOm5JohsvzIcgnyC5Kx9cZKmZxlMtxrgPr0LtRnxjOs5jB5/IfH5bfTv8nUbVOle4XuKdqOurRPat7ffRxePEDbjz/+KJcuXZJSpUqZbgXDhw+Xo0ePys6dO02Xgq5duyYIpKpGjRrywAMPyKhRo5Lte6v3ldisWbMkJCTELc8FyIz07enbK9/KxuiN4iu+0iFrBykVQEsskFlti94mX0V9Zd4P/pPtP1LIv5CniwQ3iIqKkieeeML8eh4aGpp5W2SbNWsW9/+KFStKzZo1pWjRovLll19KlixZbvt+Bw4cKH379k3QIhsRESGNGze+5Q5Pi28pS5YskUaNGklAAFcvshl1eesQO3bbWNm4Z6P4+vjKW3XeksZFG0tGRX16F+ozY2rmaCYXVl+QJYeXyI++P8rMxjMli3/yn+fUpX2cv3SnhFcH2cRy5swp99xzj/z+++8mCEZHR8v58+fNfCcdtUD70iYnKCjITIlpsEyvcJmejwX3oi5d+3D7h/J/e/7P/P+12q9J87ubW3EoUp/ehfrMeIbWHirbTm0zQ/BN+m2SDKw5MEXbUZf2SE2+8fqTveLTbgZ//PGHFCxY0JzcpTtq6dKlccv37dsnhw8fNn1pAXjO57s/l4nbJpr/v1z9ZWlVshXVAcDIGZxTRtQdYf4/a+8sWXN0DXsmE/PqINuvXz8zrNbBgwfNaAStWrUSPz8/ad++veTIkUO6detmuggsX77cnPylfWY1xCZ3ohcA95p/YL6M2vjfPuo9KveQJ8s+yS4HkEDdQnWlXal25v9DVg+RC9cusIcyKa8Osn///bcJrXqy12OPPWYufKBDa+XNm9csf//996VFixbmQgj333+/6VIwb948TxcbyLQWHVwkr619zfy/c9nO8p+K//F0kQBkUH2r9ZViocXk5JWTMmLdCK76lUl5dR/Z2bNnJ7tch+SaNGmSmQB41q9//yoDfx1ohttqU7KNvFTtJXM1PgBwRU/yGvmvkdLxh47y08Gf5IGIB6R5cTv60iPteHWLLAA7bDy+Ufr+0leuO66bS1IOqTWEEAvglsrnKS//qfTfX27eXPemHL98nL2WyRBkAXjUjlM7pOfSnuYStPUL15c373tT/Hz9qBUAKaIXRqiQp4JcjLkog1cNNr/qIPMgyALwmP3n9suzPz8rUdejpGaBmvJe/fckwJdh5QCknL+vv7x131umq8H64+tl5p6Z7L5MhCALwCMORR6SZxY/I5HRkVIxb0UZ32C8uQQtAKRWsRzFpF+1fub/YzePld/P/c5OzCQIsgDS3T+X/pHui7vLmatnpFSuUjL5wckSEsDlnQHcvrb3tJX7Ct0n0bHRMnDVQIm5EcPuzAQIsgDSlY73+MySZ+Sfy/+YoXM+bPSh5AjKQS0AuCM6ysnrdV6XnEE5Ze/ZvTJ5+2T2aCZAkAWQbhwOhwxePdhcWrJg1oIyrfE0CcsSRg0ASBN5Q/LKsNrDzP8/3vmxbDmxhT3r5QiyANLN53s+l1+O/GJO6Br3wDgpkLUAex9AmmpYtKH8u8S/zegFg1YNkssxl9nDXowgCyBd7Dy9U8ZsHmP+3796fykTVoY9D8AtBtQYIOFZw+XopaMyesto9rIXI8gCcDsdmaDfin5yPfa6NCraKO4a6QDgDtkDs8sb970hPuIjC/5YIHti9rCjvRRBFoDb+8UOWz3MtIwUylZIhtcZzlW7ALhd9QLVpXO5zub/C6IWyNmrZ9nrXoggC8Ctvtj7hfx8+GczaPnoeqNNSwkApIdeVXrJ3TnvlsuOyzJi/QjzxRrehSALwG12n9kt7216z/z/paovSbk85djbANJNoF+gvFH7DfETP1lxdIXM/30+e9/LEGQBuMWl6EumX2xMbIw8EPGAdCjTgT0NIN3dk+seaRjc0Pz/7Q1vy5HII9SCFyHIAnCLN9a/IUcuHjHjxY6oO4J+sQA8pm5QXbk3371y5foVMyTXjdgb1IaXIMgCSHML/1wo3//5vfj6+Mo797/DlbsAeJS+F71e63XJGpBVtp3aJjN2zaBGvARBFkCa+vvi3/LmujfN/5+t+KxUzleZPQzA48KzhcvAGgPN/ydtnSR7zjAklzfIcEF2z549MmzYMGnQoIGUKFFCChYsKBUrVpTOnTvLrFmz5Nq1a54uIoAk6DixA1cOlEsxl6Ry3srSvWJ39hWADEOv+NWwSEO57vjve9XV61c9XSR4S5DdsmWLNGzYUKpUqSKrVq2SmjVryosvvigjRoyQjh07miEzXn31VQkPD5dRo0YRaIEMaNpv08zPdtkCssnIf400Q24BQEbh4+MjQ2sPlbDgMPnjwh8ybss4TxcJdyjDfMq0adNG+vfvL1999ZXkzJkzyfXWrl0r48aNk9GjR8ugQYPStYwAkrbt5DaZ8tsU8/9Xa70qhbMXZncByHByBeeS1+u+Lj2W9pDP93wu9SLqSa2CtTxdLNjeIrt//355/vnnkw2xqnbt2jJ79mwTelPr7bffNt/GtKXX6erVq9KjRw8JCwuTbNmymUB94sSJ23oOQGYeamvAygES64iV5sWbS4viLTxdJABI0v2F75fH7nnM/H/wqsFy4doF9palMkyQDQgIcOv6GzdulA8//ND0t42vT58+8t1338ncuXNlxYoVcuzYMWndunWq7hvI7N5c/2bcJWhfrfmqp4sDALf0UrWXpEj2InIi6oS8tf4t9pilMkzXAlfBc/ny5XLy5EmJjY1NsGzMmDGpuq9Lly5Jhw4dZNq0afLGG2/Ezb9w4YJMnz7dnESmJ5epGTNmSJkyZWTdunVSqxY/NQC38sOfP5jhtnR4G+0XyyVoAdggJCDEvGd1+rGT/PDXD1I/or40u6uZp4sFbwiyb731lgwePFhKlSol+fPnTzCQevz/p5R2HWjevLk5mSx+kN28ebPExMSY+U6lS5eWIkWKmL64SQVZHTkh/ugJkZGR5q/el07u5Lx/dz8O3M8b6vJk1El5Y91/X1PdynWT8rnKW/18Mnt94n+oz8xRl2VylpGnyj0l03ZOkxFrR0jF3BUlX0g+D5QS8aXmfTRDBlk9mevjjz+WLl263PF9aX9aHRFBW3gTO378uAQGBt7UL1fDsy5LysiRI2X48OE3zV+8eLGEhIRIeliyZEm6PA7cz9a61JFEPrv8mVy8flEK+RWSwkcKyw9//yCZna31CdeoT++vy8KOwuY97GjMUemxsId0ztrZ/MIEz4mKirI7yPr6+krdunXv+H6OHDkivXv3NgdvcHCwpJWBAwdK3759E7TIRkRESOPGjSU0NFTc/S1Fn0+jRo1S3U8YGYvtdfnVga/kwMYDEuQXJOOajpPiOYpLZmZ7fSIh6jNz1WX5C+XliUVPyB/X/5BLd1+SdqXapXs5ITf90m1tkNUTsCZNmiRjx469o/vRrgPax/bee++Nm3fjxg359ddfZeLEifLTTz9JdHS0nD9/PkGrrI5aUKBAgSTvNygoyEyJ6QskvT7A0vOx4F421uXhyMPy/tb3zf9739tbSuUp5ekiZRg21ieSRn1mjrq8J8890rdqXxm5YaSM2zZO6hauK8VzZu4v556UmvfQDBlk+/XrZ/q06pW9ypYte9MTmjdvXoru58EHH5QdO3YkmNe1a1fTD/aVV14xrah630uXLjXDbql9+/bJ4cOHzTBfAG52I/aGDF49WK5cvyLVC1SXDmU6sJsAWK9d6Xay4u8VsubYGhm4aqB8/tDnEuDLl9KMLkMG2RdeeMGMWPDAAw+Y8V1v5wQvlT17dilfvnyCeVmzZjX36ZzfrVs3000gd+7cpltAr169TIhlxALAtU93fypbT26VrAFZZUTdEfQlA+AVtF/s63Vel9bftpbdZ3bLh9s/lJ5Venq6WLAxyH766afy9ddfm1ZZd3v//fdNn1xtkdWRCJo0aSKTJ092++MCNtp/br9M3DrR/P+V6q+YcWMBwFvkz5pfhtQeIv1X9JdpO6bJvwr/SyrlreTpYsG2IKuto9qtwB1++eWXBLf1JDDtj6sTgKTF3IiRQSsHSUxsjNQrXE9a3t2S3QXA6zQt1lR+OfKLfP/n9+Y9b+7Dc82Ys8iYMuT4Eq+99poMGzYsVcMvAHCvKb9NkX3n9knOoJzyWp3XbrvLDwBkdINqDpL8Ifnl8MXD8t6m9zxdHNjWIjt+/Hj5448/zHiuxYoVu+lkLx0XFkD60f5i03dMN/8fUmuI5MmSh90PwGuFBobKm/e9KU8vflrm7p9rrvp1f+H7PV0s2BJkW7bkJ0sgI3UpGLJ6iNxw3JAmxZpI42KNPV0kAHC7mgVrypNln5T/2/1/MnT1UJn3yDzJHZybPZ/BZMggq90KAGQMH+38yJzklSsolwysMdDTxQGAdKPjZK85ukb+uPCHDF8zXMY+MJZuVRmMb0a63CWAjEUD7NTfppr/D6w5UMKyhHm6SACQbvTKhSP/NVL8ff1l2ZFl8s0f37D3M5gME2TLlSsns2fPNlfaSs6BAwfkueeek7fffjvdygZkRtdjr5suBfr3gYgHzJm8AJDZlAkrIz0q9zD/f3vD2/L3xb89XSRkxK4FEyZMMFfbev755831kKtVqybh4eFmeKxz587J7t27ZdWqVbJr1y7p2bOnCbMA3OeTXZ+Yk7yyB2Y3J3gxSgGAzKprua7y69+/movBvLrqVfm4ycfi5+vn6WIhIwVZvZzspk2bTFidM2eOzJw5Uw4dOiRXrlyRPHnySJUqVaRTp07SoUMHyZUrl6eLC3i1P8//KR9s+yDuwgd5Q/J6ukgA4DEaWnUUg0e/fVS2nNxirnD4VPmnqJEMIMMEWaf77rvPTAA840bsDRmyZohEx0bLfYXuk3+X+DdVASDTi8geIQNqDJCha4bKhK0TpG54XSmVu1Sm3y+elmH6yALIGGbumSm/nfpNsgZklWG1h9GlAAD+P72ioY4pq+cODFg5QK7duMa+8TCCLIA4ehKDtjSoftX6SYGsBdg7APD/6bkCr9V+zYwn+/v532XClv++X8JzCLIA4obAe2PdG3L1xlWpXqC6tCnZhj0DAInoMIQaZtVnuz+Tjcc3so88iCALwPj+r+9l9bHVEugbSJcCAEjGA0UeMF/2HeIwoxhcjL7I/vIQgiwAOX/1vLyz4R2zJ56t9KwUDS3KXgGAZPSv3l8KZyss/1z+5/+1dx/gURVtG4CfbHoPIaRBQhAwhEAIvUmHQBSUT5pioYmCdCy/+UQRBFEQRCCAIFUFkWaBjxp6h9BbaIEAIaGl97L/NbMmEghIyWb3nH3u6zru2bNLMplxk3dn33lH1pclwzDKQLZ169YYM2bMA9dFPVnxGBGVrG8PfYuErARUcamC3oG92b1ERP9CLIj9qtlX0Jhp8OfFP7Hx8kb2mQEYZSC7bds2zJgxA507d0ZaWlrhdbHr1/bt2w3aNiK12X9jv9x20QxmMqXA0tzS0E0iIlKE2u610a9GP3k+dt9Y3Eq/ZegmmRyjDGSFzZs3Iy4uDo0aNcLly5cN3RwiVcrMzcTYvWPleQ//Hgh2DzZ0k4iIFGVgrYEIcA1AUlaSrMEtFs5S6THaQNbLy0vOvtasWRP169eXs7REVLLmHJ+DmJQYuNu5Y1idYexeIqInJD7FmtBsglwou/v6bvwW9Rv70NQD2YI93a2trbFkyRIMGzYMHTp0wMyZMw3dNCLVOJdwDgtOLpDn/234XzhYORi6SUREilTZpTJG1B1RuObgchI/STbpQPb+aflRo0bhl19+weTJkw3WJiK1bUM7Zu8Y5Gpz0ca3jTyIiOjp9QzoiYZeDWUt7rCdYcjJz2F3mmogGx0djXLlyhW51qVLF+zfvx/z5883WLuI1GLFuRWF29CGNQgzdHOIiBRPVC8Y13QcHK0ccfLOSfx4/EdDN8kkGGUgW7FixWL3dw8MDESvXr0e++vMmjULQUFBcHJykkfjxo2xbt26wsczMzMxaNAglC1bFg4ODjJYjo+PL7Gfg8gY3c64je8Pfy/Ph9YeCg97D0M3iYhIFcS23qMajpLnPxz/ASdunTB0k1TPKAPZklKhQgV8/fXXiIyMxKFDh2QN2ldeeQWnTp2Sj48YMQJ//fUXli9fLheWxcbG4tVXXzV0s4n0auLBiUjJSUFg2UBZqYCIiErOi8+9iFC/UORp8xC2KwzpOensXj2ygIp16tSpyP3x48fLWdp9+/bJIHfevHlyMVnBJgsLFixAQECAfFyU/XqYrKwseRRITk6Wtzk5OfLQp4Kvr+/vQ/pniLHcH7cf66LXyY/AwuqHIT8vXx707PjaVBeOp3oYYiw/rvsxIuMjcSX5Cr49+K38fUuP70nGykxrIgXP8vLy5MyrSE04cuSIrFHbpk0buVuYi4tLkbSG4cOHy9nah/niiy+K3XlMBMV2dnZ6+xmInoVY2DUjZQZu599GI6tG6GjXkR1KRKQnF3IuYGHaQnn+tv3beN7yefb1Y0pPT0fPnj2RlJQkU0NNdkZWOHHihMyNFfmwIg929erVqF69Oo4ePQorK6siQazg4eEhg9xHCQsLw8iRI4vMyPr4+CAkJORfO7wk3qVs2rQJ7dq1g6Uld2BSstIeyx9O/IDbJ27DzcYN33T8Ri5IoJLD16a6cDzVw5BjmXkoE7+e+xX/y/sfenfoDRfrojEHFa/gk+7HofpA1t/fXwatIqpfsWKFnJF91m1uRX1bcdxPvEBK60VSmt+LlD+Woqbh/FO6ih//1+D/4GrvqtfvZ8r42lQXjqd6GGIsR9Yfif3x+xGdFI0JhyZgcovJxS5mp6KeZJxUvdhLELOuVapUQd26dTFhwgTUqlUL33//PTw9PZGdnY3ExMQizxdVC8RjRGohsofG7Rsnaxo29W6K9n7tDd0kIiKTYGthiwkvTICFmQU2XdmENZfWGLpJqqP6QPZ++fn5cqGWCGxFxB8REVH4WFRUFGJiYmQqApFa/H7hd7nIy8bcBp82+pSzAUREpSjQLRADag2Q51/t/wo3Um+w/0uQqlMLRC5raGgofH19kZKSIhdjbdu2DRs2bICzszP69esnc11dXV1lbuuQIUNkEPuoigVESqsZK7ZLFN4Pfh8+jj6GbhIRkcnpV7MfdlzfITei+XT3p/gx5EdZPYaenap78ebNm3j77bdlnqyoUHDw4EEZxIqEb+G7775Dx44d5UYIzZs3lykFq1atMnSziUrM1we+RnJ2Mqq5VsNb1d9izxIRGYCFxkKmGIhUg4NxB/HT6Z84DiVE1TOyok7so9jY2CA8PFweRGoTEROBDZc3wNzMHGOajJG/SImIyDB8nXzxUf2PMHbvWLm7YhPvJqhapiqH4xmpekaWyFQlZSXhy71fyvM+Nfqgetnqhm4SEZHJ61q1K5pXaC4X34btDEN2XrbJ98mzYiBLpELj943Hncw7eM75ucJFBkREZFii9Jb4hKyMdRlEJUQh/Cg/EX5WDGSJVGZ99Hqsu7xOphSMf2E8rM0frHlMRESG4WbrhtGNR8vzBScX4FDcIQ7FM2AgS6QiN9NvYtz+cfK8f1B/1HCrYegmERHRfdpUbIPOVTpDCy3G7x+PvPw89tFTYiBLpKKND0bvGS3zYwNcA/Bu0LuGbhIRET3Eh/U+hKOlIy4kXsD6y+vZT0+JgSyRSqw4vwK7ru+ClcYKE5pNgKWGWxgTERkrZ2tnuRhXELmyYgEYPTkGskQqEJMcg0kHJ8nzoXWGorJLZUM3iYiI/sUbAW/A1cYVV1Ouyl0Y6ckxkCVSuJy8HHy842Nk5Gagnkc9bnxARKQQdpZ2hWlgs4/NRmZupqGbpDgMZIkUThTWPnXnlPyYSqQUcNtDIiLl6PZ8N3jae8rFusuilhm6OYrDQJZIwXZc24FFpxfJ8y+bfCl/GRIRkXJYmVvh/Vrvy/MfT/yI1OxUQzdJURjIEimUePc+ateowjyrVr6tDN0kIiJ6Cp0qd4Kfkx8SsxLx05mf2IdPgIEskQKJmoNie8OErARZamtk3ZGGbhIRET0lC40FBgUPkueLTi1CYmYi+/IxMZAlUiBRquVA3AHYWthiYvOJ8qMpIiJSrhC/EPiX8UdaThrmn5pv6OYoBgNZIoXZErMFc0/Mledim0M/Zz9DN4mIiJ6RWKgryicKS88slelj9O8YyBIpyOWky/h016eFebEvPfeSoZtEREQlpFn5ZgguF4zMvEzMOT6H/foYGMgSKUR6TjpGbBuB1JxU1HGvgw/qfWDoJhERUQkyMzMrnJVdeW6l3CiBHo2BLJECaLVajN4zWu7J7Wbrhm9bfMstaImIVKi+Z3008W6CXG2u3CSBHo2BLJECKhSIIHb95fWwMLPAlJZTUM6unKGbRUREejK0tm5W9q+Lf+FCwgX28yMwkCVSwPazqy+slgsBxjYdi9rutQ3dLCIi0qNAt0C09W0LLbSySg09HANZIiOVkZuBIVuHYOOVjTKNYEqLKbJoNhERqd/g2oNhBjNsjtmMk7dPGro5RkvVgeyECRNQv359ODo6wt3dHZ07d0ZUVFSR52RmZmLQoEEoW7YsHBwc0KVLF8THxxuszURCSnYKBmwagN3Xd8tasTPazECbim3YOUREJqKyS+XCyYvpR6YbujlGS9WB7Pbt22WQum/fPmzatAk5OTkICQlBWlpa4XNGjBiBv/76C8uXL5fPj42NxauvvmrQdpNpS8hMQL8N/XD45mE4Wjrih3Y/yMR/IiIyLQNqDZBrI/bE7sHBuIOGbo5RsoCKrV+/vsj9hQsXypnZyMhING/eHElJSZg3bx6WLFmC1q1by+csWLAAAQEBMvht1KhRsV83KytLHgWSk5PlrQiUxaFPBV9f39+H9K+4sRQFsAduGYjo5GiUsS6D8FbhqFamGsdbAfjaVBeOp3ooeSw9bTzxnyr/wfLzy/F95PeY326+LNGldjlPMFZmWlHXx0RcuHABVatWxYkTJ1CjRg1s2bIFbdq0QUJCAlxcXAqfV7FiRQwfPlzO1hbniy++wJgxYx64LgJiOzs7vf4MpF538+5iQdoCJOQnwMnMCX0c+qCcOasTEBGZsuT8ZExJnoJc5OIt+7fgb+kPtUtPT0fPnj3lhKOTk5PpzsjeKz8/XwanTZs2lUGsEBcXBysrqyJBrODh4SEfe5iwsDCMHDmyyIysj4+PTFv4tw4viXcpIk2iXbt2sLS01Ov3IpTaWMakxWDg1oEyiPVx8MGsNrPgbe/NIVAQvjbVheOpHmoYy7gjcVh8ZjEOWB3AsA7DZBUbNUv++5Pux2EygazIlT158iR27dr1zF/L2tpaHvcTL5DSepGU5vci/TqXfA6Dtw1GUlYSqpapijnt5shND0iZ+NpUF46neih5LPsH9cfKCysRlRCFrbFb0cGvA9TM8gnGSd0h/d8GDx6MNWvWYOvWrahQoULhdU9PT2RnZyMxMbHI80XVAvEYkb5dyrmE9yLek0FskFsQFrRfwCCWiIiKcLFxQa/AXvI8/Eg4cvNz2UOmEMiK9F8RxK5evVrmw1aqVKnI43Xr1pVRf0REROE1UZ4rJiYGjRs3NkCLyZTsvL4Ti9MWIz03HQ09G2JOyBw4WzsbullERGSE3q7+tlwEfDn5stzxi0wgkBXpBD///LNchCVqyYq8V3FkZGTIx52dndGvXz+Z7ypma0U1gz59+sgg9mEVC4hKwvro9fhgxwcyeb95+eYIbxsOe0t7di4RERVL/I3oV7OfPJ95bCay87LZU2oPZGfNmiVXvLVs2RJeXl6Fx7Jlywqf891336Fjx45yIwRRkkukFKxatcqg7SZ1W3Fuhdx2NlebiyDLIExqNgnW5g/mXBMREd2rh38PuNu5Iy4tDsvPLWfnmEJqQXFH7969C59jY2OD8PBw3L17V26UIIJY5seSviw6tQhj9o6R+2d3rdIVXe26yu1niYiI/o2NhY3cJEGYc3wO0nPSTb7TVB3IEhkL8QZKbDH47aFv5f2+NfoirH6Y6kuoEBFRyepcpTN8HH1wN/Mufjnzi8l3L/+KEulZvjYfXx/4Wr57FobVGYYRdUeYxO4sRERUssSneO8Hvy/PF5xcIKvemDIGskR6JEqkfL77cyw5u0Te/7Thp3in5jvscyIiemqhfqGo4lIFKTkpWHhqoUn3JANZIj0RK0rFoq4/Lv4BczNzfPXCV3it2mvsbyIieibmGnMMqT1Enov0gtsZt022RxnIEumBSMAfsmUINl3ZJD8GmtxyMjpV7sS+JiKiEtHKpxVqutVERm4Gfjzxo8n2KgNZohKWnJ2MAZsHYE/sHtha2CK8TTja+LZhPxMRUYkR6yyG1hkqz3+L+g2xqbEm2bsMZIlK0J2MO+i3oR+O3DwCRytHzGk3B429uUscERGVvEZejeTOkDn5OZh9bLZJdjEDWaISIgpU917fG2fvnoWrjSsWtF+AYPdg9i8REenNkDq6XFmxHiM6KdrkepqBLFEJiEmOQa91veQe2J72nljUYRH8Xf3Zt0REpFe1ytVCS5+WstRj+NFwk+ttBrJEz+hcwjm8ve5txKbFoqJTRSzusBh+zn7sVyIiKhWDgwfDDGbYcHkDztw5Y1K9zkCW6Bl261pzaY1MJ7iTeQfPl3keCzsshJeDF/uUiIhKjb+rP0IrhcpzsYukKWEgS/QUrqVcw8DNAxG2Mwwp2Snyo5357efDzdaN/UlERKVuUPAgWbN85/WdOBx/2GRGgIEs0RPWh51xZAY6/9EZu2N3w0pjJYtSi4VdztbO7EsiIjIIXydfdK7SWZ5POzJNfmpoChjIEj2GvPw8/HHhD7z8+8v44fgPyMrLQgPPBlj58kq8G/QuLM0t2Y9ERGRQA2oNkBMskfGR2Bu71yRGw8LQDSAyZmIVaERMhJyFvZR0SV4r71AeH9b7UG5yIApSExERGQNPe0/0qNYDP53+Cd8f+V7WMVf73ykGskTFEMWl10evx7wT83Ax6aK8JlIH+tXoh9ervQ4bCxv2GxERGZ13ar6DledW4vSd03Iipm3FtlAzBrJE97idcVv+Avjt3G+4mX5TXnOwdEDPgJ7oHdhb7tZVYrT5sMlJgNnVfUDyNSDhMpB0FchOBXIygdyMf25zs3Tn2jzA3AqwsNYd5n/fWtoBTt6Aiw/g7Pv3rQ/g6AlozDnGREQmwtXGFW9Vf0umwYkKBq18WsFcxX8HGMgSAdgTuwerzq+S715z83OL/DLo4d/j6QPYrFQg8YouSJXHP+cWiVfQPjcTOKnHIdBY6ALce4PbwltfwLmCLhAmIiLV6BXYC0vPLpUpcWuj1+Llyi9DrRjIEgFYcW4FNl3ZJPuipltNmT7Q3q89rMTs5+MSM6bXDgLRO4DLu4A754G0Ww99ushayocGZi4+MCvjB4hDBJfWToClDWBhe9+tDWCmAfKydTO08lbM2GbpZnGTrutmdBOvAkkxQHIsIILyxBjdcaWYRogZ3SptgIBOwPMdADtX/v9ARKRwjlaO6FezH76L/A4zj85EqF+oahclM5AlAtDt+W4oZ1tOli4JKBvweH2SlwvcOApEb9cFrzH7dIHl/WzL6ILUwmC1orzNcayAdXuOI/Sll2FpqYdfMPl5QMqNvwNbEeDG3BPo/n0r0hai/qc7zMyBSs10QW21jrq0BCIiUqTXq70uF31dT72OledX4rVqr0GNVB/I7tixA5MmTUJkZCRu3LiB1atXo3NnXZ01QdRZGz16NObOnYvExEQ0bdoUs2bNQtWqVQ3abipdYmWnOB4pPx+4dUYXtF7aDlzZDWQlF32OgwdQqbnu8KqlC1ptXYr/ejk50Jqdht6InCiROiAOFPOziRqD8aeAs2uAM38B8SeBS9t0x9oPAZ8GQMDLQEBHXQBORESKYWthi/eC3sP4/eNlvuwrVV6R19RG9YFsWloaatWqhb59++LVV1994PGJEydi2rRpWLRoESpVqoTPPvsM7du3x+nTp2Fjw5XppiAnLx+bTsdj8d7L+LxjIKp7O/3zoMhpvbhFF7yKI/120X9s4wz4NQMqtQCeawG4PQ8opdSJaKdnDd3R8hPgzsV/glqRInF1v+7Y+CngGfR3UNsJKOevnJ+RiMiEdanaBQtPLZSzsiJntm+NvlAb1QeyoaGh8iiOmI2dOnUqRo0ahVdeeUVeW7x4MTw8PPD777/jtdfUOQ1POjdTMvHrgatYsj8Gccm6lICf9l3GhNYuwMlVwKlVwI1jRbtLVAfwbawLWsWsqwjw1LIatGxloOkw3SHya8+uBU7/oZt5jjuuO7aOA8pW1QW04vCuzaCWiMhIWZpbYmCtgRi1e5QsJynS6Eq0+o4RUH0g+yjR0dGIi4tD27b/1FhzdnZGw4YNsXfv3ocGsllZWfIokJys+3g5JydHHvpU8PX1/X3USrx5ORyTiJ/3X8WG0/HIydNt4VfRLgthFc+i5a2pwNQD/zzfTANthQbQ+jWHtlJzaL3r6MpfFcjL1x1qG0vbckDt3roj/Q7Mzq2HJmoNzKK3w0wsYts1RR5ap/LI9+8IbbWXoK3QUD1BvdrGk54Yx1M9TH0s2/u0xzyneYhOjsaCEwswMGggjN2TjJWZ1lQ245WfpJoVyZHds2ePzImNjY2Fl5dX4fO6d+8un7ts2bJiv84XX3yBMWPGPHB9yZIlsLOz0+NPQE8rOw+IvG2GnXEaXE//52NxPwctmnnmY0jiV3BPPSOvaWGG2w7VcL1MQ9xwrodsy3tSDUycRV4GPJKPwSvxkLy1yP/nDV2WhSNuONfFDZd6uOVQHVpR+ouIiAzuVPYpLE1fCitY4QOnD2CvsYcxS09PR8+ePZGUlAQnp0f/DeZfmqcQFhaGkSNHFpmR9fHxQUhIyL92eEm8S9m0aRPatWunn5XuKnMjKRML91zBiuPXkZypqw9rbaFBpyAvvNnQB4F/58OaHbkF7cG5yK/ZDfmBXeHi5A2xRCtQj21T7lh2kf/V5mQgN3obNFFr5YytdWYi/O5sk4fW2gnaqiHI9+8EbeVWupQMlVPueFJxOJ7qwbEEQrWhOLrhKM7cPYOr3lcxss4/MYwxKvik+3GYdCDr6akrLxQfH19kRlbcDw4Ofui/s7a2lsf9xB+v0voDVprfS4nupGZh5raL+GnfFWTn6j7693W1w5uNfNG9ng9c7O6rD1uvN1C/L8zNzFDaH44rdixFmwNf1h15ObrauWKh2Nk1MEuNh9nJFdCcXKGrg1u1rW6xWNWQh1dxUAnFjicVi+OpHqY+lsPqDMOAzQPkzpW9avSCp73xllh8knEy6UBWVCkQwWxERERh4CreBezfvx8DBxp/Dgk9KCUzB3N3RmPezktIE/kEABpUcsXAFpXR4vly0GgestrehHM7S4QotC1mXsXx4re6qgdn/tQFtmJnM3ErDo2lbqFcrdeBGl24UIyIqJQ08W6Cuh51ERkfKctxjW48WhV9r/pANjU1FRcuXCiywOvo0aNwdXWFr68vhg8fjnHjxsm6sQXlt7y9vYvUmiXjl5mTJ8tniVnYxHRdknjN8s74qL0/mlV1kznPVEo0GsC3oe4IGQfEnfgnkBV1eC9s1h0H5gIvTgK8gjg0RER6ZmZmhqG1h6LX+l5YfX41+gT2ga+Tr+L7XfWB7KFDh9CqVavC+wW5rb169cLChQvx8ccfy1qz7777rtwQ4YUXXsD69etZQ1ZBNWB/O3QV0yLOIz5Zt/Cocjl7fBjijw41PBnAGpp4AyECVXG0/hS4fR44sQLYMx24ug+Y0wKo1w9o9V9uj0tEpGd1POqgWflm2Hl9J8KPhuOb5t8ovs9VH8i2bNlSllx61DuUsWPHyoOUIz9fi7+Ox2LKpnO4ciddXivvYothbavi1drlYWGuMXQTqThuVYFWYUDdXsDGzwCRQ3twrq5mb5vRQO23dDO6RESkF0NqD5GB7LrodXKDBH9Xf0X3NP9ikKKINyURZ+Lx4rSdGPbrURnEujlYYXSn6tjyYQu5kItBrAI4eQNd5wG91gDlAmStWvw1FPixDXAt0tCtIyJSrYCyAWjv1x5aaDHj6AwoHQNZUozIK3fRdfZe9Ft0CGfjUuBoY4EPQ57H9o9aoU/TSrC24IItxanUDBiwE2g/AbB2AmIP64LZP4cAafdtB0xERCXi/eD3oTHTYNvVbTh2674dLBWGgSwpYivZkcuOosusvYi8kgAbSw0GtKiMnR+3wuDWVWFvrfoMGfVXPGj8PjD4EFCrp9ySAocXA9Pr6BaE5enq/xIRUcl4zvk5vFz5ZXk+/fB0RXcrA1kyWnn5Wvy09zLaTN6OVUeuy3VDPer5YMdHrfBJaLUHa8GSsjl6AP+ZBfTdCHgGAZlJwP8+BOa0BGL2Gbp1RESqMrDWQFhoLLA/bj/23VDu71gGsmSUTscm49VZe/DZH6eQkpkrS2mtfr8pvukaBHcnG0M3j/RJlO16dxvw0mTAxgWIPwHMbw+seg9IiWPfExGVAG8Hb3R/vnvhrOyjFsYbMwayZFQysvPw9bqz6DRjF45dTYSjtQW+fCUQvw9qimAfde8IRfdtUFH/HWDIYaBub1FfBDj+KzC9HrBnhm4nMSIieib9g/rD1sIWx28fl/mySsRAlozG1qibCJm6HbO3X5RpBaE1PLH5gxZ4q7EfzB+2Ixepm31ZoNP3QP8IoHxdIDsF2PgpMPsF4NJ2Q7eOiEjR3Gzd8EbAG/J82pFpyNfqtnRXEgayZHAXb6XinUWH0GfBQVy9mwEvZxvMeasuZr1ZFx5MIyBBBLH9NgMvzwDsygK3zgKLXwaW9waSrrGPiIieUu/A3nC0dMSFxAuytqzSMJAlg7mdmoXPfj+JkO92YPOZeDnr2r9ZJWwe2QIhgZ4cGSpKbJRQ5y1gSCTQ4F3ATAOcWg3MqA/snAzk6nZ2IyKix+ds7Yw+NfrIc7HbV06+slK3GMiSQfJgw7deQMtJ2/DTvisyjaBNNXesH9YMn75UneW06NFsywAvTgLe2wH4NgZy0oGIscDMxsD5zew9IqInJNILXG1ccTXlKn6/8DuUhIEslRoRsK6IvIbWk7dh0oYopGbpqhEs7d8I83rXR1UPR44GPT7PmkCfdcCrcwEHD+DuReCXLsDSnkDCZfYkEdFjsrO0w7tB78rz2cdmIzM3E0rBQJb0Lj9ft61sp+m78OHyY7iRlInyLraY2iMYfwxqisaVy3IU6OmI4sJB3XWbKTQeDGgsgKi1QHhDYOsEICeDPUtE9Bi6Pd8NnvaeuJl+E8uilkEpGMiS3uTk5WNl5DV0+H6H3Fb29I1kua1sWGg1RHzQAp1rl4eG1QioJNg4Ae3HAwN2A5WaA2I2YfvXQHgD4OxaQKH1EYmISouVuZXcJEH48cSPSM1OVUTnM5ClEpeWlYt5u6LRYuJWfLD8GM7Fp8LB2gLvNX8O2z9qhfdaVIaNpTl7nkqeezXg7T+BbgsBp/JAYgzwa0/gl67AnYvscSKiRxDb1lZ0qojErET8dOYnKAEDWSrRKgRTNkahyddb8OWa04hNyoSbgzU+7uCP3Z+0RtiLAXC157aypGci3SDwP8Dgg0CzDwBzK+DCZmBmI2DHtyLXhUNARFQMsWXt4ODB8nzxqcVIzEyEsbMwdANI2XLz8rHj/C38dvAaIs7GIydP9xFuJTd7vNv8OfyndnnOvpJhWNkDbT4Hgt8A1v0fcGETsOVL4Noh4D+zAVvuFEdEdL8QvxCZWhCVEIX5p+ZjZN2RMGYMZOmpNzFYfugaVh2+hpsp/9TvFNvIihQCUQeWu3GRUShbGXhjOXDkZ2DtB8C5dcDcVkCPnwGPQEO3jojIqGjMNBhaZygGRQzC0jNL8WbAm3C3c4exYiBLj+1mSiY2n76JlYevIfJKQuH1svZWcuFWt3oVUM3TiT1KxpluIDZT8KwBLHsbuHsJ+LEt8PJ0oGZXQ7eOiMioNCvfDMHlgnH01lHMOT4HoxqNgrFiIEsPpdVqZaWBiDM3ZfmsY9eSCh8TxQZa+bujWz0ftK7mDisLpluTAnjXBt7dBqzsB1zaqrsVqQYhXwLmloZuHRGRUTAzM5Ozsn039MXKcyvRK7AXfBx9YIwYyNIDFQcORN+VW8ZuOXtT1ny9V1AFZ4TW8EKXOuXh7mTD3iPlsS8LvLkS2Dpet7Xt/lnAjWO6SgeOHoZuHRGRUajvWR9NvJtgT+weuUnC+BfGwxgxkP1beHg4Jk2ahLi4ONSqVQvTp09HgwYNoPadti7dSsWp2GScvJ6EQ1cS5G1u/j81N20sNXihSjm0DXBHq2ru8GDwSmqgMdctBCtfF1g9AIjZA/zQHOi+CPBtZOjWEREZhaG1h8pA9q+Lf6FPYB9UKVMFxoaBLIBly5Zh5MiRmD17Nho2bIipU6eiffv2iIqKgru78SY4P0mKwN20bFxLyMCZG8k4GZskg1dxnpnzYCkisetWS/9yaBPgjiaV3Vh1gNSr2ktA/63AsjeBW2eAhS8B7b8CGryry6slIjJhgW6BaOvbFptjNiP8aDi+a/UdjA0DWQBTpkxB//790adPH9kpIqBdu3Yt5s+fj08++QTGIjs3H0npOUjOBmLupiNXq0FGTh4ysvOQKW5z8pCckSPrt8YmZuBGUgZiE3XnWbnF1860szJHdS8nBHo7IaiCCxo+54oKZexK/WcjMhi3KsA7m4E/hwCnVgHrPgauRwIdpwJWfC0QkWkbFDwIETERMpg9efskarjVgDEx+UA2OzsbkZGRCAsLK+wUjUaDtm3bYu/evcV2WlZWljwKJCcny9ucnBx56IuoGPD+0qO6YYvc9cT/vpyDFaq6O6C6txOqezki0MsJFcvaPVAmS58/Az3Yz+xvI6CxBl75ARqv2tBEfAGz48ugjTuJ3Nd/AxweL2+W46kuHE/14Fg+m4oOFfGi34tYe3ktvo/8HjNbz4S+PcnfRZMPZG/fvo28vDx4eBT9YyXunz17tthOmzBhAsaMGfPA9Y0bN8LOTn8zOMfvioBTt7WrlUYLSw1gbQ55a/X3YW2uhYs1UMZKizLWgIsVUMZaK28tNLkA0oG8m8A14Kw49NZaelybNm1iZxmNiihb+f9Q7/IMpKXlYPf2/dCaPdmvSY6nunA81YNj+fT88/yxDutw7dY1rF67GtZm1tCn9PT0x36uyQeyT0PM3oqc2ntnZH18fBASEgInJ/3VUe2Qr8XQ7GxsjYhASEg7WFqyXJCSiXec4hdru3YcS+PyIpD8OpzMzBDq6PnY/4rjqS4cT/XgWJaMBgkNUNWlqizNpW8Fn3Q/DpMPZN3c3GBubo74+PgiHSPue3oW/0fM2tpaHvcTgaW+g0uNxkyuQSmN70Wlg2NphMr6PvU/5XiqC8dTPTiWzybQvfR2QnyS+Mbkq9hbWVmhbt26iIiIKOyU/Px8eb9x48Z6GiIiIiIielYmPyMriDSBXr16oV69erJ2rCi/lZaWVljFgIiIiIiMDwNZAD169MCtW7fw+eefyw0RgoODsX79+gcWgBERERGR8WAg+7fBgwfLg4iIiIiUweRzZImIiIhImRjIEhEREZEiMZAlIiIiIkViIEtEREREisTFXiVAq9U+8U4Uz7JDidi6TXwvboigbBxLdeF4qgvHUz04lspTEE8VxFePwkC2BKSkpMhbsU0tEREREZVMfOXs7PzI55hpHyfcpUcSO4HFxsbC0dFR73sQi3cpImC+evUqnJycODIKxrFUF46nunA81YNjqTwiNBVBrLe3NzSaR2fBcka2BIhOrlChAkqTCGIZyKoDx1JdOJ7qwvFUD46lsvzbTGwBLvYiIiIiIkViIEtEREREisRAVmGsra0xevRoeUvKxrFUF46nunA81YNjqW5c7EVEREREisQZWSIiIiJSJAayRERERKRIDGSJiIiISJEYyBIRERGRIjGQVZDw8HD4+fnBxsYGDRs2xIEDBwzdJHoKEyZMQP369eVOcO7u7ujcuTOioqLYlyrw9ddfy939hg8fbuim0FO6fv063nzzTZQtWxa2traoWbMmDh06xP5UoLy8PHz22WeoVKmSHMvKlSvjyy+/lLtGkXowkFWIZcuWYeTIkbL01uHDh1GrVi20b98eN2/eNHTT6Alt374dgwYNwr59+7Bp0ybk5OQgJCQEaWlp7EsFO3jwIH744QcEBQUZuin0lBISEtC0aVNYWlpi3bp1OH36NCZPnowyZcqwTxXom2++waxZszBjxgycOXNG3p84cSKmT59u6KZRCWL5LYUQM7BiFk+8IIX8/Hz4+PhgyJAh+OSTTwzdPHoGt27dkjOzIsBt3rw5+1KBUlNTUadOHcycORPjxo1DcHAwpk6dauhm0RMSv0t3796NnTt3su9UoGPHjvDw8MC8efMKr3Xp0kXOzv78888GbRuVHM7IKkB2djYiIyPRtm3bwmsajUbe37t3r0HbRs8uKSlJ3rq6urI7FUrMsL/00ktFXqOkPH/++Sfq1auHbt26yTeXtWvXxty5cw3dLHpKTZo0QUREBM6dOyfvHzt2DLt27UJoaCj7VEUsDN0A+ne3b9+WuT7ineW9xP2zZ8+yCxVMzKyLfErxcWaNGjUM3Rx6Cr/++qtM9xGpBaRsly5dkh9FizSu//73v3JMhw4dCisrK/Tq1cvQzaOnmGFPTk5GtWrVYG5uLv+Ojh8/Hm+88Qb7UkUYyBIZeCbv5MmTcpaAlOfq1asYNmyYzHUWizBJ+W8sxYzsV199Je+LGVnx+pw9ezYDWQX67bff8Msvv2DJkiUIDAzE0aNH5cSBt7c3x1NFGMgqgJubm3w3GR8fX+S6uO/p6WmwdtGzGTx4MNasWYMdO3agQoUK7E4FEik/YsGlyI8tIGZ9xJiKfPasrCz52iVl8PLyQvXq1YtcCwgIwMqVKw3WJnp6H330kZyVfe211+R9UYHiypUrsnIMZ9jVgzmyCiA+1qpbt67M9bl35kDcb9y4sUHbRk9OlH4RQezq1auxZcsWWRqGlKlNmzY4ceKEnOkpOMSMnvjoUpwziFUWkeJzfyk8kV9ZsWJFg7WJnl56erpcT3Iv8ZoUfz9JPTgjqxAiZ0u8gxR/JBs0aCBXRItyTX369DF00+gp0gnER11//PGHrCUbFxcnrzs7O8vVtKQcYvzuz222t7eXNUiZ86w8I0aMkAuERGpB9+7dZa3uOXPmyIOUp1OnTjIn1tfXV6YWHDlyBFOmTEHfvn0N3TQqQSy/pSDio8pJkybJwEeU95k2bZosy0XKIgrmF2fBggXo3bt3qbeHSlbLli1ZfkvBRLpPWFgYzp8/Lz8tEZMI/fv3N3Sz6CmkpKTIDRHEp18iBUjkxr7++uv4/PPP5SedpA4MZImIiIhIkZgjS0RERESKxECWiIiIiBSJgSwRERERKRIDWSIiIiJSJAayRERERKRIDGSJiIiISJEYyBIRERGRIjGQJSIiIiJFYiBLRGTkxI5vnTt3Ntj3f+utt+S2rY/jtddew+TJk/XeJiIigTt7EREZ4ZbFBUaPHo0RI0ZAq9XCxcUFpe3YsWNo3bo1rly5AgcHh399/smTJ9G8eXNER0fD2dm5VNpIRKaLgSwRkQHFxcUVni9btkzuAx8VFVV4TQSPjxNA6ss777wDCwsLzJ49+7H/Tf369eUs8qBBg/TaNiIiphYQERmQp6dn4SFmMMUM7b3XRBB7f2pBy5YtMWTIEAwfPhxlypSBh4cH5s6di7S0NPTp0weOjo6oUqUK1q1b98BsaWhoqPya4t+IlIHbt28/tG15eXlYsWIFOnXqVOT6zJkzUbVqVdjY2Miv07Vr1yKPi+f/+uuvJdZHREQPw0CWiEiBFi1aBDc3Nxw4cEAGtQMHDkS3bt3QpEkTHD58GCEhITJQTU9Pl89PTEyUKQK1a9fGoUOHsH79esTHx6N79+4P/R7Hjx9HUlIS6tWrV3hN/NuhQ4di7NixcuZYfB2RSnCvBg0ayHZlZWXpsQeIiBjIEhEpUq1atTBq1Cg5MxoWFiZnR0Vg279/f3lNpCjcuXNHBqPCjBkzZBArFm1Vq1ZNns+fPx9bt27FuXPniv0eIi/W3Nwc7u7uhddiYmJgb2+Pjh07omLFivLriMD2Xt7e3sjOzi6SNkFEpA+ckSUiUqCgoKDCcxFsli1bFjVr1iy8Jj7yF27evFm4aEsErQU5t+IQAa1w8eLFYr9HRkYGrK2tiyxIa9eunQxgn3vuOTnj+8svvxTO+hawtbWVt/dfJyIqaQxkiYgUyNLSssh9EWzee60g+MzPz5e3qampMnf16NGjRY7z588/kBpQQMzwimBUzK4WEPm3InVh6dKl8PLykjO/YnZYpC4UuHv3rrwtV65cCf/URERFMZAlIjIBderUwalTp+Dn5ycXgt17iFSB4gQHB8vb06dPF7kuqhi0bdsWEydOlKkLly9fxpYtW4osKqtQoYIMhImI9ImBLBGRCRClsMRM6euvv46DBw/KdIINGzbIKgeiOkFxxIyqCIB37dpVeG3NmjWYNm2anM0VObSLFy+Ws77+/v6Fz9m5c6dcbEZEpG8MZImITIBYgLV7924ZtIogU+TTivJdYpMFjUbzyDqyIg+2gHj+qlWrZAWEgIAAWV9WpBkEBgbKxzMzM/H777/LRWdERPrGDRGIiOihxIIvMdsqNmto3Ljxv/bUrFmzsHr1amzcuJG9SkR6xxlZIiJ6KFGBQKQPPGrjhHuJBWfTp09njxJRqeCMLBEREREpEmdkiYiIiEiRGMgSERERkSIxkCUiIiIiRWIgS0RERESKxECWiIiIiBSJgSwRERERKRIDWSIiIiJSJAayRERERKRIDGSJiIiICEr0/9bVuNcYxqPxAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "CompareFlights(two_stage_mission.all_flights).positions()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Same thing for the deployable mission - the carrier and the payload separate at apogee and fall along very similar paths, which is exactly what's expected given they split with zero `separation_delta_v`." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-14T10:28:30.672731Z", + "iopub.status.busy": "2026-08-14T10:28:30.672590Z", + "iopub.status.idle": "2026-08-14T10:28:30.747839Z", + "shell.execute_reply": "2026-08-14T10:28:30.747504Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqEAAAKeCAYAAACVjsImAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsnQe4VNX19vel2RuCDUV6U1GxImqMNaZorDHF6D8mRmOJwRJjrzFqrDHRdGOqmmjyRWOKXRQQEJFelS5F7CgI3O/5bbImm+PMvVNOWWdmvc9zmJnL3Dtr9tl77Xev2tTc3NzsDAaDwWAwGAyGFNEmzQ8zGAwGg8FgMBiAkVCDwWAwGAwGQ+owEmowGAwGg8FgSB1GQg0Gg8FgMBgMqcNIqMFgMBgMBoMhdRgJNRgMBoPBYDCkDiOhBoPBYDAYDIbUYSTUYDAYDAaDwZA6jIQaDAaDwWAwGFKHkVCDGnTr1s01NTW1eN1+++2F97/22mv+Z/xeqb/Fe+LAqaee6v/evffeG8vfK/fzKr3i+r4hWhrnRgD3nO/PPdGMkSNHujPPPNPttNNObvPNN3cdOnRwW221lfvEJz7hrrvuOjdnzpysRcwdZF0ZDIZk0C6hv2swVI0hQ4a4Xr16Ff2/AQMG5I7A/N///Z875ZRTKiKw+++/f9Gf//nPf3bvv/9+yTHaeOONXT1CiIB1Gf44li9f7r7+9a+7P/7xj/71Ntts4+fPZptt5pYuXepefPFF9+yzz7prr73W3X///e7zn/98ynfPYDAYisNIqEEd2FBrtTo98cQT7qOPPnJdunRxeR0DriiefvppT0LjGKNywRhOnjzZtW/f3jUijjnmGLfvvvt6UqcNzPEjjjjCDRs2zG277bbunnvucUcdddQ671m1apV7+OGH3SWXXJKIpbyewbw3GAzJwUiooS7Rs2fPrEWoG0A++/Xr5xoVkE+NBBRg3YSA4n5//vnnXffu3T/2nnbt2rkTTjjBHXnkkW769OmZyJlXNPK8NxjSgMWEGuoSLcWEvvHGG+7cc891Xbt2deutt57bcccd3XnnnefeeuutsmI/X331VXfyySd7tye/D+G97LLL3IoVKz4mA6548Jvf/Gad2M2DDjoosbjN1atXu1tvvdXtvvvu3j0fxrRNmjTJXXnlld6dj4WTuMEtt9zSHXrooe6BBx5o9W8XwwcffOBuueUWby2EDK2//vqub9++7qKLLvJjXQrTpk1z3/rWt/x7N9xwQ7fpppv6cAt+NmHCBP+eq666ah35W4uB/de//uU++9nP+lhIvtt2223nvvCFL7jRo0cXlYH7wN/Bwvzcc8+5z33uc65z586uTZs2hTnQWkzoggUL3NChQ13//v3999hkk03cXnvt5e666y5vhYyCeXLzzTe7PfbYw78XOZlL/A5jtmzZMlcO3n33XXfHHXf451dccUVRAhqCucCciKKWMRsxYoT7zGc+4+cQ34X4U8ZR8M9//tMdcsghbosttvCff9hhh7mXXnqpxTnGmN10000+tnWDDTZwnTp1cieeeKKbMmVKUXkIN2Dc9t57bz+OfIett97a38vHH3+86O+E95TxZv2zjlnP4dosFRO6cOFC9+1vf9v16dPHz3fu+w477OC/6w9/+MOScvI9GF+J10XG//znP0XfH+qicnWOwZA7NBsMSrDjjjs2MyV//etfl/X+V1991b+f3yv1t3hPiAULFjT37NnT/1/Hjh2bjz322ObPf/7zzVtssUVz3759/fNiMpxyyin+59/+9rebN910U//3TzzxxOZDDz20eYMNNvD/x++GOP/885uHDBni/4/P5G/IdcMNN8Q6RjIWXbt2bT7qqKOaO3To0HzIIYc0f/GLX2weOHBg4X2nnXaaf1+/fv2ajzjiiOYvfOELzYMHD25u06aN//l3vvOdisZ5/vz5zbvsskthPBmPY445piBnt27dml977bWP/d7vf//75vXWW68g83HHHed/b9ddd21uampqvvLKK/37Hn744cLYc4VjyLVkyZLC37zsssv8e/h9xp3vvttuu/mftW3btvmXv/zlx+T4xCc+4f//W9/6lh+DAQMGNJ900knNhx9+ePMf/vAH/x7GWj47imeeecbPHfmujD3jKj/j76xcubLw/tWrV/v7wv8xj4488kgvJ+MmYzZ27NjmcvC3v/2t8H2XLl3aXA1qGbMLLriguV27ds277767n0fye9zX559/vvmuu+7yY7rffvv5tdKnTx///xtvvHHz9OnTS84x1mT79u39mHAvevToUfi9F1544WPyMJ58DvPw05/+dPMJJ5zQPGjQoMKcuf322z/2O3JPP/OZzzR3797d3y/uHb/75S9/ufA++RshFi5c2LzddtsV5u7RRx/t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1A4lC5UYyde+9rXpMYQssVn0SCYj34xnEek1zz//fIoHp5LHwQcf7AWXxmBiktSSTsH3ZH3nopKseawLIUApYXL66aen+nwK0Or3AX/iiSdafbbzg4z+JuF3M/iQHMn9RUm5TlhAXmrLmDj1RWrAjBkzii233DLFkoLxV9XuA/74449TNiHFzj3zzDOtI2J7m4DfjYgMMopQaSy5yLznnntSUo/9kwenD3iIULL6m4rfTb1w4ytNQ3e8NJaov8dmjG5Ks2bNavVPlur3Ac/d9jQqoNf297///cZ8dX439aMp3dlEAke8NB7iCIk5nDBhQuOvxSD1ASeW95RTTknxp1QzQIR+/OMfb4wQ9bsRkUFHESoiA9kHnG5XVDHAgkoJmxNOOCGV2jrppJP6/bYbgd+NiIwWe8eLyED2s+8EgpR2ok3A70ZEBh0toSIykP3sO3HvvfcuImzrjN+NiAw8/c6MEpFqU9U+4LyfK664Ir0Gx8yZM4ullloqlZJqCn43IjLIKEJFZCD72SNCx48fXyy99NLFMsssk97X1Vdf3bhv0+9GRAYV23aKiIiISOkYEyoiIiIipaMIFREREZHSUYSKiIiISOkoQkVERESkdBShIiIiIlI6ilARERERKR1FqIiIiIiUjiJUREREREpHESoiIiIipaMIFREREZHSUYSKiIiISOkoQkVERESkdBShIiIiIlI6ilARERERKR1FqIiIiIiUjiJUREREREpHESoiIiIipaMIFREREZHSUYSKiIiISOkoQkVERESkdBShIiIiIlI6ilARERERKR1FqIiIiIiUjiJUREREREpHESoiIiIipaMIFREREZHSUYSKiIiISOkoQkVERESkdBShIiIiIlI6ilARERERKR1FqIiIiIiUjiJUREREREpHESoiIiIipaMIFREREZHSUYSKiIiISOkoQkVERESkdBShIiIiIlI6ilARERERKR1FqIiIiIiUjiJUREREREpHESoiIiIipaMIFREREZHSUYSKiIiISOkoQkVERESkdBShIiIiIlI6ilARERERKR1FqIiIiIiUjiJUREREREpHESoiIiIipaMIFREREZHSUYSKiIiISOkoQkVERESkdBShIiIiIlI6ilARERERKR1FqIiIiIiUjiJUREREREpHESoiIiIipaMIFREREZHSUYSKiIiISOkoQkVERESkdBShIiIiIlI6ilARERERKR1FqIiIiIiUjiJUREREREpHESoiIiIipaMIFREREZHSUYSKiIiISOkoQkVERESkdBShIiIiIlI6ilARERERKR1FqIiIiIiUjiJUREREREpHESoiIiIipaMIFREREZHSUYSKiIiISOkoQkVERESkdBShIiIiIjKubP4HUHALRevt+wcAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "CompareFlights(deployable_mission.all_flights).trajectories_3d()" + ] + }, { "cell_type": "markdown", "metadata": {}, diff --git a/rocketpy/rocket/multistage.py b/rocketpy/rocket/multistage.py index ada5708f9..6c5633316 100644 --- a/rocketpy/rocket/multistage.py +++ b/rocketpy/rocket/multistage.py @@ -309,6 +309,11 @@ def flight_rocket(self, active_stages, carried_deployables=()): composed_rocket.evaluate_center_of_pressure() composed_rocket.evaluate_stability_margin() composed_rocket.evaluate_static_margin() + # add_motor() already populated surfaces_cp_to_cdm, but from + # before these surfaces were copied in above (it was empty at + # that point) - Flight.u_dot_generalized needs this dict to + # apply aerodynamic forces during a real 6DOF simulation. + composed_rocket.evaluate_surfaces_cp_to_cdm() return composed_rocket @@ -377,3 +382,13 @@ def _derive_stack_drag(self, active_stages, attr_name, stack_radius): ) combined = scaled if combined is None else combined + scaled return combined + + def draw(self, vis_args=None, plane="xz", *, filename=None): + """Draw the stacked vehicle: every stage's aerodynamic surfaces, + combined exactly as flight_rocket() would compose them for a + flight with every stage attached. Reuses Rocket's own drawing + code unchanged - see :meth:`Rocket.plots.draw` for parameters + and the "at least one aerodynamic surface" requirement. + """ + stack = self.flight_rocket(active_stages=tuple(self.stages)) + stack.plots.draw(vis_args, plane, filename=filename) diff --git a/rocketpy/simulation/mission.py b/rocketpy/simulation/mission.py index 8c9c4bcff..03d4b2dc5 100644 --- a/rocketpy/simulation/mission.py +++ b/rocketpy/simulation/mission.py @@ -114,8 +114,18 @@ def __init__( self.flights = {} self.timeline = [] + self._all_flights = [] self._simulate() + @property + def all_flights(self): + """Every Flight object, in execution order, each appearing once + (a Flight shared by several bodies, e.g. the full stack, is not + repeated). Feeds CompareFlights directly, e.g. + ``CompareFlights(mission.all_flights).trajectories_3d()``. + """ + return list(self._all_flights) + def _simulate(self): single_stage = len(self.vehicle.stages) == 1 no_deployables = not self.vehicle.deployables @@ -145,7 +155,7 @@ def _simulate_single_stage(self): self.timeline.append((0.0, f"ignition:{stage.name}")) self.timeline.append((0.0, "liftoff")) - flight = self._run_flight(rocket) + flight = self._run_flight(rocket, name=stage.name) self.timeline.append((flight.out_of_rail_time, "rail_departure")) self.timeline.append((flight.t_final, f"impact:{stage.name}")) @@ -188,7 +198,11 @@ def _run_carrier_phase(self, stage, deployable): self.timeline.append((0.0, f"ignition:{stage.name}")) self.timeline.append((0.0, "liftoff")) - carrier_flight = self._run_flight(carrier_rocket, terminate_on_apogee=True) + carrier_flight = self._run_flight( + carrier_rocket, + name=f"{stage.name}+{deployable.name}", + terminate_on_apogee=True, + ) self.timeline.append((carrier_flight.out_of_rail_time, "rail_departure")) self.timeline.append( (carrier_flight.apogee_time, f"ejection:{deployable.name}") @@ -207,7 +221,7 @@ def _run_stage_after_ejection_phase( ending_state, carrier_rocket, stage_rocket, delta_v ) stage_flight = self._run_flight( - stage_rocket, initial_solution=initial_solution + stage_rocket, name=stage.name, initial_solution=initial_solution ) self.timeline.append((stage_flight.t_final, f"impact:{stage.name}")) self.flights[stage.name].append(stage_flight) @@ -218,7 +232,9 @@ def _run_deployable_phase(self, deployable, carrier_rocket, ending_state, delta_ ending_state, carrier_rocket, deployable.free_rocket, delta_v ) deployable_flight = self._run_flight( - deployable.free_rocket, initial_solution=initial_solution + deployable.free_rocket, + name=deployable.name, + initial_solution=initial_solution, ) self.timeline.append( (deployable_flight.t_final, f"impact:{deployable.name}") @@ -264,7 +280,11 @@ def _run_stack_phase(self, booster, sustainer): self.timeline.append((0.0, f"ignition:{booster.name}")) self.timeline.append((0.0, "liftoff")) - stack_flight = self._run_flight(stack_rocket, max_time=separation_time) + stack_flight = self._run_flight( + stack_rocket, + name=f"{booster.name}+{sustainer.name}", + max_time=separation_time, + ) self.timeline.append((stack_flight.out_of_rail_time, "rail_departure")) self.timeline.append((separation_time, f"separation:{booster.name}")) @@ -279,7 +299,7 @@ def _run_booster_phase(self, booster, stack_rocket, ending_state, delta_v): ending_state, stack_rocket, booster_rocket, delta_v ) booster_flight = self._run_flight( - booster_rocket, initial_solution=initial_solution + booster_rocket, name=booster.name, initial_solution=initial_solution ) self.timeline.append((booster_flight.t_final, f"impact:{booster.name}")) self.flights[booster.name].append(booster_flight) @@ -298,16 +318,28 @@ def _run_sustainer_phase( ending_state, stack_rocket, sustainer_rocket, delta_v ) sustainer_flight = self._run_flight( - sustainer_rocket, initial_solution=initial_solution + sustainer_rocket, name=sustainer.name, initial_solution=initial_solution ) self.timeline.append((sustainer_flight.t_final, f"impact:{sustainer.name}")) self.flights[sustainer.name].append(sustainer_flight) def _run_flight( - self, rocket, initial_solution=None, max_time=None, terminate_on_apogee=False + self, + rocket, + name, + initial_solution=None, + max_time=None, + terminate_on_apogee=False, ): - """Run one Flight in absolute mission time.""" - return Flight( + """Run one Flight in absolute mission time. + + The single choke point through which every Flight Mission creates + is constructed, so this is also where all_flights collects them, + in execution order, each exactly once. ``name`` distinguishes + each Flight in plots such as CompareFlights, which otherwise + labels every line "Flight" (Flight's own default). + """ + flight = Flight( rocket=rocket, environment=self.environment, rail_length=self.rail_length, @@ -321,7 +353,10 @@ def _run_flight( time_overshoot=self.time_overshoot, ode_solver=self.ode_solver, verbose=self.verbose, + name=name, ) + self._all_flights.append(flight) + return flight @staticmethod def _momentum_split(mass_a, mass_b, delta_v): diff --git a/tests/unit/rocket/test_multistage.py b/tests/unit/rocket/test_multistage.py index 51c6ddb67..e6d260937 100644 --- a/tests/unit/rocket/test_multistage.py +++ b/tests/unit/rocket/test_multistage.py @@ -218,3 +218,42 @@ def test_flight_rocket_combines_surfaces_of_every_active_stage(calisto_nose_cone assert len(two_stage_rocket.aerodynamic_surfaces) == 1 assert len(sustainer_alone_rocket.aerodynamic_surfaces) == 1 + + +def test_flight_rocket_populates_surfaces_cp_to_cdm(calisto, calisto_nose_cone): + # surfaces_cp_to_cdm is separate from center_of_pressure/stability - + # it's what Flight.u_dot_generalized looks up per surface to apply + # aerodynamic forces during a real 6DOF simulation. flight_rocket() + # copies surfaces directly (bypassing add_surfaces() to avoid + # double-transforming fin leading-edge positions), which must not + # skip populating this dict too. + stage = Stage(name="stage_1", rocket=calisto) + stage.rocket.add_surfaces(calisto_nose_cone, 1.0) + vehicle = MultiStageRocket(stages=[stage]) + + composed_rocket = vehicle.flight_rocket(active_stages=(stage,)) + + assert calisto_nose_cone in composed_rocket.surfaces_cp_to_cdm + + +def test_draw_runs_for_a_stage_with_aerodynamic_surfaces(calisto_robust): + stage = Stage(name="stage_1", rocket=calisto_robust) + vehicle = MultiStageRocket(stages=[stage]) + + assert vehicle.draw(filename=None) is None + + +def test_draw_combines_surfaces_of_every_stage(calisto_nose_cone): + booster, sustainer = _two_stage_vehicle() + booster.rocket.add_surfaces(calisto_nose_cone, 0.5) + vehicle = MultiStageRocket(stages=[booster, sustainer]) + + assert vehicle.draw(filename=None) is None + + +def test_draw_raises_when_no_stage_has_aerodynamic_surfaces(): + booster, sustainer = _two_stage_vehicle() + vehicle = MultiStageRocket(stages=[booster, sustainer]) + + with pytest.raises(ValueError): + vehicle.draw(filename=None) diff --git a/tests/unit/simulation/test_mission.py b/tests/unit/simulation/test_mission.py index 514a25d9b..5b11a0e84 100644 --- a/tests/unit/simulation/test_mission.py +++ b/tests/unit/simulation/test_mission.py @@ -3,6 +3,7 @@ from rocketpy import Flight from rocketpy.mathutils.vector_matrix import Matrix, Vector from rocketpy.motors.point_mass_motor import PointMassMotor +from rocketpy.plots.compare.compare_flights import CompareFlights from rocketpy.rocket.multistage import MultiStageRocket, Stage from rocketpy.rocket.rocket import Rocket from rocketpy.simulation.mission import Mission @@ -377,3 +378,77 @@ def test_deployable_splits_separation_delta_v_by_momentum_conservation( assert payload_flight.solution[0][6] == pytest.approx( ending_vz + expected_payload_delta_v ) + + +def test_all_flights_is_the_single_flight_for_the_degenerate_case( + calisto, example_plain_env +): + mission = Mission( + vehicle=calisto, + environment=example_plain_env, + rail_length=5.2, + inclination=85, + heading=0, + ) + + assert mission.all_flights == [mission.flights["stage_1"][0]] + + +def test_all_flights_has_no_duplicate_for_the_shared_stack_flight(example_plain_env): + booster, sustainer = _two_stage_vehicle(booster_separation=0.5) + vehicle = MultiStageRocket(stages=[booster, sustainer]) + + mission = Mission( + vehicle=vehicle, + environment=example_plain_env, + rail_length=1.0, + inclination=90, + heading=0, + max_time=5, + ) + + assert len(mission.all_flights) == 3 + assert len(set(id(flight) for flight in mission.all_flights)) == 3 + assert mission.all_flights == [ + mission.flights["booster"][0], + mission.flights["booster"][1], + mission.flights["sustainer"][1], + ] + + +def test_all_flights_feeds_compare_flights(example_plain_env): + booster, sustainer = _two_stage_vehicle(booster_separation=0.5) + vehicle = MultiStageRocket(stages=[booster, sustainer]) + + mission = Mission( + vehicle=vehicle, + environment=example_plain_env, + rail_length=1.0, + inclination=90, + heading=0, + max_time=5, + ) + + assert CompareFlights(mission.all_flights).trajectories_3d(filename=None) is None + + +def test_flight_names_distinguish_each_body_and_phase(example_plain_env): + # CompareFlights labels each line in a plot legend using flight.name; + # every Flight Mission creates must have a name that distinguishes it + # (Flight's own default "Flight" would make every legend entry + # identical and useless). + booster, sustainer = _two_stage_vehicle(booster_separation=0.5) + vehicle = MultiStageRocket(stages=[booster, sustainer]) + + mission = Mission( + vehicle=vehicle, + environment=example_plain_env, + rail_length=1.0, + inclination=90, + heading=0, + max_time=5, + ) + + names = [flight.name for flight in mission.all_flights] + assert len(names) == len(set(names)) + assert all(name != "Flight" for name in names)