# generated by datamodel-codegen:
#   filename:  definitions.json

from __future__ import annotations
from architect_py.common_types import OrderDir
from datetime import datetime, timezone

from datetime import date, datetime, time
from decimal import Decimal
from enum import Enum
from typing import Annotated, Any, Dict, List, Literal, Optional, Union

from msgspec import Meta, Struct

Model = Any


AccountIdOrName = str


class AccountPosition(Struct, omit_defaults=True):
    quantity: Decimal
    break_even_price: Optional[Decimal] = None
    cost_basis: Optional[
        Annotated[
            Optional[Decimal], Meta(description="Cost basis of the position, if known.")
        ]
    ] = None
    """
    Cost basis of the position, if known.
    """
    liquidation_price: Optional[Decimal] = None
    trade_time: Optional[
        Annotated[
            Optional[datetime],
            Meta(description="NB: the meaning of this field varies by reporting venue"),
        ]
    ] = None
    """
    NB: the meaning of this field varies by reporting venue
    """
    unrealized_pnl: Optional[
        Annotated[
            Optional[Decimal],
            Meta(description="Unrealized PNL of the position, if known."),
        ]
    ] = None
    """
    Unrealized PNL of the position, if known.
    """

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        quantity: Decimal,
        break_even_price: Optional[Decimal] = None,
        cost_basis: Optional[Decimal] = None,
        liquidation_price: Optional[Decimal] = None,
        trade_time: Optional[datetime] = None,
        unrealized_pnl: Optional[Decimal] = None,
    ):
        return cls(
            quantity,
            break_even_price,
            cost_basis,
            liquidation_price,
            trade_time,
            unrealized_pnl,
        )

    def __str__(self) -> str:
        return f"AccountPosition(quantity={self.quantity},break_even_price={self.break_even_price},cost_basis={self.cost_basis},liquidation_price={self.liquidation_price},trade_time={self.trade_time},unrealized_pnl={self.unrealized_pnl})"


class AccountStatistics(Struct, omit_defaults=True):
    cash_excess: Optional[
        Annotated[Optional[Decimal], Meta(description="Cash available to withdraw.")]
    ] = None
    """
    Cash available to withdraw.
    """
    equity: Optional[
        Annotated[
            Optional[Decimal],
            Meta(description="Total account equity; net liquidation value."),
        ]
    ] = None
    """
    Total account equity; net liquidation value.
    """
    position_margin: Optional[
        Annotated[
            Optional[Decimal],
            Meta(description="Margin requirement based on current positions only."),
        ]
    ] = None
    """
    Margin requirement based on current positions only.
    """
    purchasing_power: Optional[
        Annotated[
            Optional[Decimal],
            Meta(
                description="Total purchasing power; post-multiplied. (e.g. for cash margin account could be 2x available cash)"
            ),
        ]
    ] = None
    """
    Total purchasing power; post-multiplied. (e.g. for cash margin account could be 2x available cash)
    """
    realized_pnl: Optional[Decimal] = None
    total_margin: Optional[
        Annotated[
            Optional[Decimal],
            Meta(
                description="Margin requirement calculated for worst-case based on open positions and working orders."
            ),
        ]
    ] = None
    """
    Margin requirement calculated for worst-case based on open positions and working orders.
    """
    unrealized_pnl: Optional[Decimal] = None
    yesterday_equity: Optional[
        Annotated[
            Optional[Decimal], Meta(description="Yesterday total account equity.")
        ]
    ] = None
    """
    Yesterday total account equity.
    """

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        cash_excess: Optional[Decimal] = None,
        equity: Optional[Decimal] = None,
        position_margin: Optional[Decimal] = None,
        purchasing_power: Optional[Decimal] = None,
        realized_pnl: Optional[Decimal] = None,
        total_margin: Optional[Decimal] = None,
        unrealized_pnl: Optional[Decimal] = None,
        yesterday_equity: Optional[Decimal] = None,
    ):
        return cls(
            cash_excess,
            equity,
            position_margin,
            purchasing_power,
            realized_pnl,
            total_margin,
            unrealized_pnl,
            yesterday_equity,
        )

    def __str__(self) -> str:
        return f"AccountStatistics(cash_excess={self.cash_excess},equity={self.equity},position_margin={self.position_margin},purchasing_power={self.purchasing_power},realized_pnl={self.realized_pnl},total_margin={self.total_margin},unrealized_pnl={self.unrealized_pnl},yesterday_equity={self.yesterday_equity})"


class AlgoState(str, Enum):
    Pending = "Pending"
    Running = "Running"
    Stopped = "Stopped"


class CancelStatus(str, Enum):
    Pending = "Pending"
    Acked = "Acked"
    Rejected = "Rejected"
    Out = "Out"


class CandleWidth(str, Enum):
    OneSecond = "OneSecond"
    FiveSecond = "FiveSecond"
    OneMinute = "OneMinute"
    FifteenMinute = "FifteenMinute"
    OneHour = "OneHour"
    OneDay = "OneDay"


class CptyLogoutRequest(Struct, omit_defaults=True):
    pass

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
    ):
        return cls()

    def __str__(self) -> str:
        return f"CptyLogoutRequest()"


DateTimeOrUtc = datetime


class HealthMetric(Struct, omit_defaults=True):
    timestamp: int
    value: float
    should_be_greater_than: Optional[float] = None
    should_be_greater_than_or_equal_to: Optional[float] = None
    should_be_less_than: Optional[float] = None
    should_be_less_than_or_equal_to: Optional[float] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        timestamp: int,
        value: float,
        should_be_greater_than: Optional[float] = None,
        should_be_greater_than_or_equal_to: Optional[float] = None,
        should_be_less_than: Optional[float] = None,
        should_be_less_than_or_equal_to: Optional[float] = None,
    ):
        return cls(
            timestamp,
            value,
            should_be_greater_than,
            should_be_greater_than_or_equal_to,
            should_be_less_than,
            should_be_less_than_or_equal_to,
        )

    def __str__(self) -> str:
        return f"HealthMetric(timestamp={self.timestamp},value={self.value},should_be_greater_than={self.should_be_greater_than},should_be_greater_than_or_equal_to={self.should_be_greater_than_or_equal_to},should_be_less_than={self.should_be_less_than},should_be_less_than_or_equal_to={self.should_be_less_than_or_equal_to})"


class HealthStatus(str, Enum):
    UNKNOWN = "UNKNOWN"
    SERVING = "SERVING"
    NOT_SERVING = "NOT_SERVING"
    SERVICE_UNKNOWN = "SERVICE_UNKNOWN"


Ask = List[Decimal]


Bid = List[Decimal]


class L2BookDiff(Struct, omit_defaults=True):
    """
    Unique sequence id and number.
    """

    a: Annotated[
        List[Ask],
        Meta(
            description="Set of (price, level) updates. If zero, the price level has been removed from the book.",
            title="asks",
        ),
    ]
    """
    Set of (price, level) updates. If zero, the price level has been removed from the book.
    """
    b: Annotated[
        List[Bid],
        Meta(
            description="Set of (price, level) updates. If zero, the price level has been removed from the book.",
            title="bids",
        ),
    ]
    """
    Set of (price, level) updates. If zero, the price level has been removed from the book.
    """
    sid: Annotated[int, Meta(ge=0, title="sequence_id")]
    sn: Annotated[int, Meta(ge=0, title="sequence_number")]
    tn: Annotated[int, Meta(ge=0, title="timestamp_ns")]
    ts: Annotated[int, Meta(title="timestamp")]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        asks: List[Ask],
        bids: List[Bid],
        sequence_id: int,
        sequence_number: int,
        timestamp_ns: int,
        timestamp: int,
    ):
        return cls(
            asks,
            bids,
            sequence_id,
            sequence_number,
            timestamp_ns,
            timestamp,
        )

    def __str__(self) -> str:
        return f"L2BookDiff(asks={self.a},bids={self.b},sequence_id={self.sid},sequence_number={self.sn},timestamp_ns={self.tn},timestamp={self.ts})"

    @property
    def asks(self) -> List[Ask]:
        return self.a

    @asks.setter
    def asks(self, value: List[Ask]) -> None:
        self.a = value

    @property
    def bids(self) -> List[Bid]:
        return self.b

    @bids.setter
    def bids(self, value: List[Bid]) -> None:
        self.b = value

    @property
    def sequence_id(self) -> int:
        return self.sid

    @sequence_id.setter
    def sequence_id(self, value: int) -> None:
        self.sid = value

    @property
    def sequence_number(self) -> int:
        return self.sn

    @sequence_number.setter
    def sequence_number(self, value: int) -> None:
        self.sn = value

    @property
    def timestamp_ns(self) -> int:
        return self.tn

    @timestamp_ns.setter
    def timestamp_ns(self, value: int) -> None:
        self.tn = value

    @property
    def timestamp(self) -> int:
        return self.ts

    @timestamp.setter
    def timestamp(self, value: int) -> None:
        self.ts = value

    @property
    def datetime(self) -> datetime:
        return datetime.fromtimestamp(self.ts, tz=timezone.utc)

    @property
    def datetime_local(self) -> datetime:
        return datetime.fromtimestamp(self.ts)


class OrderId(Struct, omit_defaults=True):
    """
    System-unique, persistent order identifiers
    """

    seqid: str
    seqno: Annotated[int, Meta(ge=0)]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        seqid: str,
        seqno: int,
    ):
        return cls(
            seqid,
            seqno,
        )

    def __str__(self) -> str:
        return f"OrderId(seqid={self.seqid},seqno={self.seqno})"


class OrderOut(Struct, omit_defaults=True):
    id: OrderId

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        id: OrderId,
    ):
        return cls(
            id,
        )

    def __str__(self) -> str:
        return f"OrderOut(id={self.id})"


class OrderRejectReason(str, Enum):
    DuplicateOrderId = "DuplicateOrderId"
    NotAuthorized = "NotAuthorized"
    NoExecutionVenue = "NoExecutionVenue"
    NoAccount = "NoAccount"
    NoCpty = "NoCpty"
    UnsupportedOrderType = "UnsupportedOrderType"
    UnsupportedExecutionVenue = "UnsupportedExecutionVenue"
    InsufficientCash = "InsufficientCash"
    InsufficientMargin = "InsufficientMargin"
    NotEasyToBorrow = "NotEasyToBorrow"
    Unknown = "Unknown"


class OrderSource(str, Enum):
    API = "API"
    GUI = "GUI"
    Algo = "Algo"
    Reconciled = "Reconciled"
    CLI = "CLI"
    Telegram = "Telegram"
    Other = "Other"


class OrderStale(Struct, omit_defaults=True):
    id: OrderId

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        id: OrderId,
    ):
        return cls(
            id,
        )

    def __str__(self) -> str:
        return f"OrderStale(id={self.id})"


class OrderStatus(str, Enum):
    Pending = "Pending"
    Open = "Open"
    Rejected = "Rejected"
    Out = "Out"
    Canceling = "Canceling"
    Canceled = "Canceled"
    ReconciledOut = "ReconciledOut"
    Stale = "Stale"
    Unknown = "Unknown"


class ProductCatalogInfo(Struct, omit_defaults=True):
    """
    Loosely normalized information about exchange products; used to seed symbology loaders and populate extended product info;

    Symbology loaders will use catalog fields to augment and/or cross-check any other load source.
    """

    exchange: str
    exchange_product: Annotated[str, Meta(description="Could be anything really")]
    """
    Could be anything really
    """
    category: Optional[str] = None
    cqg_contract_symbol: Optional[str] = None
    info_url: Optional[
        Annotated[Optional[str], Meta(description="URL to more product info")]
    ] = None
    """
    URL to more product info
    """
    long_description: Optional[str] = None
    multiplier: Optional[
        Annotated[
            Optional[Decimal],
            Meta(description="For derivatives contracts, the multiplier"),
        ]
    ] = None
    """
    For derivatives contracts, the multiplier
    """
    price_display_format: Optional[str] = None
    quote_currency: Optional[str] = None
    schedule_description: Optional[str] = None
    settle_method: Optional[str] = None
    short_description: Optional[
        Annotated[
            Optional[str],
            Meta(
                description="Short description of the product, suitable for display in a bubble, for example"
            ),
        ]
    ] = None
    """
    Short description of the product, suitable for display in a bubble, for example
    """
    sub_category: Optional[str] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        exchange: str,
        exchange_product: str,
        category: Optional[str] = None,
        cqg_contract_symbol: Optional[str] = None,
        info_url: Optional[str] = None,
        long_description: Optional[str] = None,
        multiplier: Optional[Decimal] = None,
        price_display_format: Optional[str] = None,
        quote_currency: Optional[str] = None,
        schedule_description: Optional[str] = None,
        settle_method: Optional[str] = None,
        short_description: Optional[str] = None,
        sub_category: Optional[str] = None,
    ):
        return cls(
            exchange,
            exchange_product,
            category,
            cqg_contract_symbol,
            info_url,
            long_description,
            multiplier,
            price_display_format,
            quote_currency,
            schedule_description,
            settle_method,
            short_description,
            sub_category,
        )

    def __str__(self) -> str:
        return f"ProductCatalogInfo(exchange={self.exchange},exchange_product={self.exchange_product},category={self.category},cqg_contract_symbol={self.cqg_contract_symbol},info_url={self.info_url},long_description={self.long_description},multiplier={self.multiplier},price_display_format={self.price_display_format},quote_currency={self.quote_currency},schedule_description={self.schedule_description},settle_method={self.settle_method},short_description={self.short_description},sub_category={self.sub_category})"


class SortTickersBy(str, Enum):
    VOLUME_DESC = "VOLUME_DESC"
    CHANGE_ASC = "CHANGE_ASC"
    CHANGE_DESC = "CHANGE_DESC"
    ABS_CHANGE_DESC = "ABS_CHANGE_DESC"


class GoodTilDate(Struct, omit_defaults=True):
    GTD: datetime

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        GTD: datetime,
    ):
        return cls(
            GTD,
        )

    def __str__(self) -> str:
        return f"GoodTilDate(GTD={self.GTD})"


class TimeInForceEnum(str, Enum):
    GTC = "GTC"
    DAY = "DAY"
    IOC = "IOC"
    FOK = "FOK"
    ATO = "ATO"
    ATC = "ATC"


TimeInForce = Union[GoodTilDate, TimeInForceEnum]


TraderIdOrEmail = str


class TwapStatus(Struct, omit_defaults=True):
    quantity_filled: Decimal
    realized_twap: Optional[Decimal] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        quantity_filled: Decimal,
        realized_twap: Optional[Decimal] = None,
    ):
        return cls(
            quantity_filled,
            realized_twap,
        )

    def __str__(self) -> str:
        return f"TwapStatus(quantity_filled={self.quantity_filled},realized_twap={self.realized_twap})"


UserId = str


class AccountPermissions(Struct, omit_defaults=True):
    """
    Set of flags for account permissions
    """

    list: bool
    reduce_or_close: bool
    set_limits: bool
    trade: bool
    view: bool

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        list: bool,
        reduce_or_close: bool,
        set_limits: bool,
        trade: bool,
        view: bool,
    ):
        return cls(
            list,
            reduce_or_close,
            set_limits,
            trade,
            view,
        )

    def __str__(self) -> str:
        return f"AccountPermissions(list={self.list},reduce_or_close={self.reduce_or_close},set_limits={self.set_limits},trade={self.trade},view={self.view})"


class AliasKind(str, Enum):
    CME_GLOBEX = "CME_GLOBEX"
    CFE = "CFE"


class DerivativeKind(str, Enum):
    Linear = "Linear"
    Inverse = "Inverse"
    Quanto = "Quanto"


class FillKind(str, Enum):
    Normal = "Normal"
    Reversal = "Reversal"
    Correction = "Correction"


HumanDuration = str


class Unit(str, Enum):
    base = "base"
    quote = "quote"


class MinOrderQuantityUnit(Struct, omit_defaults=True):
    unit: Unit

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        unit: Unit,
    ):
        return cls(
            unit,
        )

    def __str__(self) -> str:
        return f"MinOrderQuantityUnit(unit={self.unit})"


class OptionsExerciseType(str, Enum):
    american = "american"
    european = "european"
    unknown = "unknown"


PriceDisplayFormat = str


class Fiat(Struct, omit_defaults=True):
    product_type: Literal["Fiat"]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        product_type: Literal["Fiat"],
    ):
        return cls(
            product_type,
        )

    def __str__(self) -> str:
        return f"Fiat(product_type={self.product_type})"


class Commodity(Struct, omit_defaults=True):
    product_type: Literal["Commodity"]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        product_type: Literal["Commodity"],
    ):
        return cls(
            product_type,
        )

    def __str__(self) -> str:
        return f"Commodity(product_type={self.product_type})"


class Crypto(Struct, omit_defaults=True):
    product_type: Literal["Crypto"]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        product_type: Literal["Crypto"],
    ):
        return cls(
            product_type,
        )

    def __str__(self) -> str:
        return f"Crypto(product_type={self.product_type})"


class Equity(Struct, omit_defaults=True):
    product_type: Literal["Equity"]
    easy_to_borrow: Optional[bool] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        product_type: Literal["Equity"],
        easy_to_borrow: Optional[bool] = None,
    ):
        return cls(
            product_type,
            easy_to_borrow,
        )

    def __str__(self) -> str:
        return f"Equity(product_type={self.product_type},easy_to_borrow={self.easy_to_borrow})"


class Index(Struct, omit_defaults=True):
    product_type: Literal["Index"]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        product_type: Literal["Index"],
    ):
        return cls(
            product_type,
        )

    def __str__(self) -> str:
        return f"Index(product_type={self.product_type})"


class Future(Struct, omit_defaults=True):
    derivative_kind: DerivativeKind
    expiration: datetime
    multiplier: Decimal
    product_type: Literal["Future"]
    first_notice_date: Optional[date] = None
    series: Optional[str] = None
    underlying: Optional[str] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        derivative_kind: DerivativeKind,
        expiration: datetime,
        multiplier: Decimal,
        product_type: Literal["Future"],
        first_notice_date: Optional[date] = None,
        series: Optional[str] = None,
        underlying: Optional[str] = None,
    ):
        return cls(
            derivative_kind,
            expiration,
            multiplier,
            product_type,
            first_notice_date,
            series,
            underlying,
        )

    def __str__(self) -> str:
        return f"Future(derivative_kind={self.derivative_kind},expiration={self.expiration},multiplier={self.multiplier},product_type={self.product_type},first_notice_date={self.first_notice_date},series={self.series},underlying={self.underlying})"


class Perpetual(Struct, omit_defaults=True):
    derivative_kind: DerivativeKind
    multiplier: Decimal
    product_type: Literal["Perpetual"]
    underlying: Optional[str] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        derivative_kind: DerivativeKind,
        multiplier: Decimal,
        product_type: Literal["Perpetual"],
        underlying: Optional[str] = None,
    ):
        return cls(
            derivative_kind,
            multiplier,
            product_type,
            underlying,
        )

    def __str__(self) -> str:
        return f"Perpetual(derivative_kind={self.derivative_kind},multiplier={self.multiplier},product_type={self.product_type},underlying={self.underlying})"


class Unknown(Struct, omit_defaults=True):
    product_type: Literal["Unknown"]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        product_type: Literal["Unknown"],
    ):
        return cls(
            product_type,
        )

    def __str__(self) -> str:
        return f"Unknown(product_type={self.product_type})"


class SnapshotOrUpdateForStringAndProductCatalogInfo1(Struct, omit_defaults=True):
    snapshot: Dict[str, ProductCatalogInfo]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        snapshot: Dict[str, ProductCatalogInfo],
    ):
        return cls(
            snapshot,
        )

    def __str__(self) -> str:
        return (
            f"SnapshotOrUpdateForStringAndProductCatalogInfo1(snapshot={self.snapshot})"
        )


Update6 = List[Union[str, Optional[ProductCatalogInfo]]]


class SnapshotOrUpdateForStringAndProductCatalogInfo2(Struct, omit_defaults=True):
    updates: List[Update6]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        updates: List[Update6],
    ):
        return cls(
            updates,
        )

    def __str__(self) -> str:
        return (
            f"SnapshotOrUpdateForStringAndProductCatalogInfo2(updates={self.updates})"
        )


SnapshotOrUpdateForStringAndProductCatalogInfo = Union[
    SnapshotOrUpdateForStringAndProductCatalogInfo1,
    SnapshotOrUpdateForStringAndProductCatalogInfo2,
]


class SnapshotOrUpdateForStringAndString1(Struct, omit_defaults=True):
    snapshot: Dict[str, str]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        snapshot: Dict[str, str],
    ):
        return cls(
            snapshot,
        )

    def __str__(self) -> str:
        return f"SnapshotOrUpdateForStringAndString1(snapshot={self.snapshot})"


Update7 = List[Union[str, Optional[str]]]


class SnapshotOrUpdateForStringAndString2(Struct, omit_defaults=True):
    updates: List[Update7]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        updates: List[Update7],
    ):
        return cls(
            updates,
        )

    def __str__(self) -> str:
        return f"SnapshotOrUpdateForStringAndString2(updates={self.updates})"


SnapshotOrUpdateForStringAndString = Union[
    SnapshotOrUpdateForStringAndString1, SnapshotOrUpdateForStringAndString2
]


class SimpleDecimal(Struct, omit_defaults=True):
    simple: Decimal

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        simple: Decimal,
    ):
        return cls(
            simple,
        )

    def __str__(self) -> str:
        return f"SimpleDecimal(simple={self.simple})"


Threshold = List[Decimal]


class Varying1(Struct, omit_defaults=True):
    thresholds: List[Threshold]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        thresholds: List[Threshold],
    ):
        return cls(
            thresholds,
        )

    def __str__(self) -> str:
        return f"Varying1(thresholds={self.thresholds})"


class Varying(Struct, omit_defaults=True):
    """
    List of (threshold, tick_size) pairs.  For price greater than or equal to each threshold, the tick size is the corresponding value.
    """

    varying: Varying1

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        varying: Varying1,
    ):
        return cls(
            varying,
        )

    def __str__(self) -> str:
        return f"Varying(varying={self.varying})"


TickSize = Union[SimpleDecimal, Varying]


class TimeZone(str, Enum):
    Africa_Abidjan = "Africa/Abidjan"
    Africa_Accra = "Africa/Accra"
    Africa_Addis_Ababa = "Africa/Addis_Ababa"
    Africa_Algiers = "Africa/Algiers"
    Africa_Asmara = "Africa/Asmara"
    Africa_Asmera = "Africa/Asmera"
    Africa_Bamako = "Africa/Bamako"
    Africa_Bangui = "Africa/Bangui"
    Africa_Banjul = "Africa/Banjul"
    Africa_Bissau = "Africa/Bissau"
    Africa_Blantyre = "Africa/Blantyre"
    Africa_Brazzaville = "Africa/Brazzaville"
    Africa_Bujumbura = "Africa/Bujumbura"
    Africa_Cairo = "Africa/Cairo"
    Africa_Casablanca = "Africa/Casablanca"
    Africa_Ceuta = "Africa/Ceuta"
    Africa_Conakry = "Africa/Conakry"
    Africa_Dakar = "Africa/Dakar"
    Africa_Dar_es_Salaam = "Africa/Dar_es_Salaam"
    Africa_Djibouti = "Africa/Djibouti"
    Africa_Douala = "Africa/Douala"
    Africa_El_Aaiun = "Africa/El_Aaiun"
    Africa_Freetown = "Africa/Freetown"
    Africa_Gaborone = "Africa/Gaborone"
    Africa_Harare = "Africa/Harare"
    Africa_Johannesburg = "Africa/Johannesburg"
    Africa_Juba = "Africa/Juba"
    Africa_Kampala = "Africa/Kampala"
    Africa_Khartoum = "Africa/Khartoum"
    Africa_Kigali = "Africa/Kigali"
    Africa_Kinshasa = "Africa/Kinshasa"
    Africa_Lagos = "Africa/Lagos"
    Africa_Libreville = "Africa/Libreville"
    Africa_Lome = "Africa/Lome"
    Africa_Luanda = "Africa/Luanda"
    Africa_Lubumbashi = "Africa/Lubumbashi"
    Africa_Lusaka = "Africa/Lusaka"
    Africa_Malabo = "Africa/Malabo"
    Africa_Maputo = "Africa/Maputo"
    Africa_Maseru = "Africa/Maseru"
    Africa_Mbabane = "Africa/Mbabane"
    Africa_Mogadishu = "Africa/Mogadishu"
    Africa_Monrovia = "Africa/Monrovia"
    Africa_Nairobi = "Africa/Nairobi"
    Africa_Ndjamena = "Africa/Ndjamena"
    Africa_Niamey = "Africa/Niamey"
    Africa_Nouakchott = "Africa/Nouakchott"
    Africa_Ouagadougou = "Africa/Ouagadougou"
    Africa_Porto_Novo = "Africa/Porto-Novo"
    Africa_Sao_Tome = "Africa/Sao_Tome"
    Africa_Timbuktu = "Africa/Timbuktu"
    Africa_Tripoli = "Africa/Tripoli"
    Africa_Tunis = "Africa/Tunis"
    Africa_Windhoek = "Africa/Windhoek"
    America_Adak = "America/Adak"
    America_Anchorage = "America/Anchorage"
    America_Anguilla = "America/Anguilla"
    America_Antigua = "America/Antigua"
    America_Araguaina = "America/Araguaina"
    America_Argentina_Buenos_Aires = "America/Argentina/Buenos_Aires"
    America_Argentina_Catamarca = "America/Argentina/Catamarca"
    America_Argentina_ComodRivadavia = "America/Argentina/ComodRivadavia"
    America_Argentina_Cordoba = "America/Argentina/Cordoba"
    America_Argentina_Jujuy = "America/Argentina/Jujuy"
    America_Argentina_La_Rioja = "America/Argentina/La_Rioja"
    America_Argentina_Mendoza = "America/Argentina/Mendoza"
    America_Argentina_Rio_Gallegos = "America/Argentina/Rio_Gallegos"
    America_Argentina_Salta = "America/Argentina/Salta"
    America_Argentina_San_Juan = "America/Argentina/San_Juan"
    America_Argentina_San_Luis = "America/Argentina/San_Luis"
    America_Argentina_Tucuman = "America/Argentina/Tucuman"
    America_Argentina_Ushuaia = "America/Argentina/Ushuaia"
    America_Aruba = "America/Aruba"
    America_Asuncion = "America/Asuncion"
    America_Atikokan = "America/Atikokan"
    America_Atka = "America/Atka"
    America_Bahia = "America/Bahia"
    America_Bahia_Banderas = "America/Bahia_Banderas"
    America_Barbados = "America/Barbados"
    America_Belem = "America/Belem"
    America_Belize = "America/Belize"
    America_Blanc_Sablon = "America/Blanc-Sablon"
    America_Boa_Vista = "America/Boa_Vista"
    America_Bogota = "America/Bogota"
    America_Boise = "America/Boise"
    America_Buenos_Aires = "America/Buenos_Aires"
    America_Cambridge_Bay = "America/Cambridge_Bay"
    America_Campo_Grande = "America/Campo_Grande"
    America_Cancun = "America/Cancun"
    America_Caracas = "America/Caracas"
    America_Catamarca = "America/Catamarca"
    America_Cayenne = "America/Cayenne"
    America_Cayman = "America/Cayman"
    America_Chicago = "America/Chicago"
    America_Chihuahua = "America/Chihuahua"
    America_Ciudad_Juarez = "America/Ciudad_Juarez"
    America_Coral_Harbour = "America/Coral_Harbour"
    America_Cordoba = "America/Cordoba"
    America_Costa_Rica = "America/Costa_Rica"
    America_Coyhaique = "America/Coyhaique"
    America_Creston = "America/Creston"
    America_Cuiaba = "America/Cuiaba"
    America_Curacao = "America/Curacao"
    America_Danmarkshavn = "America/Danmarkshavn"
    America_Dawson = "America/Dawson"
    America_Dawson_Creek = "America/Dawson_Creek"
    America_Denver = "America/Denver"
    America_Detroit = "America/Detroit"
    America_Dominica = "America/Dominica"
    America_Edmonton = "America/Edmonton"
    America_Eirunepe = "America/Eirunepe"
    America_El_Salvador = "America/El_Salvador"
    America_Ensenada = "America/Ensenada"
    America_Fort_Nelson = "America/Fort_Nelson"
    America_Fort_Wayne = "America/Fort_Wayne"
    America_Fortaleza = "America/Fortaleza"
    America_Glace_Bay = "America/Glace_Bay"
    America_Godthab = "America/Godthab"
    America_Goose_Bay = "America/Goose_Bay"
    America_Grand_Turk = "America/Grand_Turk"
    America_Grenada = "America/Grenada"
    America_Guadeloupe = "America/Guadeloupe"
    America_Guatemala = "America/Guatemala"
    America_Guayaquil = "America/Guayaquil"
    America_Guyana = "America/Guyana"
    America_Halifax = "America/Halifax"
    America_Havana = "America/Havana"
    America_Hermosillo = "America/Hermosillo"
    America_Indiana_Indianapolis = "America/Indiana/Indianapolis"
    America_Indiana_Knox = "America/Indiana/Knox"
    America_Indiana_Marengo = "America/Indiana/Marengo"
    America_Indiana_Petersburg = "America/Indiana/Petersburg"
    America_Indiana_Tell_City = "America/Indiana/Tell_City"
    America_Indiana_Vevay = "America/Indiana/Vevay"
    America_Indiana_Vincennes = "America/Indiana/Vincennes"
    America_Indiana_Winamac = "America/Indiana/Winamac"
    America_Indianapolis = "America/Indianapolis"
    America_Inuvik = "America/Inuvik"
    America_Iqaluit = "America/Iqaluit"
    America_Jamaica = "America/Jamaica"
    America_Jujuy = "America/Jujuy"
    America_Juneau = "America/Juneau"
    America_Kentucky_Louisville = "America/Kentucky/Louisville"
    America_Kentucky_Monticello = "America/Kentucky/Monticello"
    America_Knox_IN = "America/Knox_IN"
    America_Kralendijk = "America/Kralendijk"
    America_La_Paz = "America/La_Paz"
    America_Lima = "America/Lima"
    America_Los_Angeles = "America/Los_Angeles"
    America_Louisville = "America/Louisville"
    America_Lower_Princes = "America/Lower_Princes"
    America_Maceio = "America/Maceio"
    America_Managua = "America/Managua"
    America_Manaus = "America/Manaus"
    America_Marigot = "America/Marigot"
    America_Martinique = "America/Martinique"
    America_Matamoros = "America/Matamoros"
    America_Mazatlan = "America/Mazatlan"
    America_Mendoza = "America/Mendoza"
    America_Menominee = "America/Menominee"
    America_Merida = "America/Merida"
    America_Metlakatla = "America/Metlakatla"
    America_Mexico_City = "America/Mexico_City"
    America_Miquelon = "America/Miquelon"
    America_Moncton = "America/Moncton"
    America_Monterrey = "America/Monterrey"
    America_Montevideo = "America/Montevideo"
    America_Montreal = "America/Montreal"
    America_Montserrat = "America/Montserrat"
    America_Nassau = "America/Nassau"
    America_New_York = "America/New_York"
    America_Nipigon = "America/Nipigon"
    America_Nome = "America/Nome"
    America_Noronha = "America/Noronha"
    America_North_Dakota_Beulah = "America/North_Dakota/Beulah"
    America_North_Dakota_Center = "America/North_Dakota/Center"
    America_North_Dakota_New_Salem = "America/North_Dakota/New_Salem"
    America_Nuuk = "America/Nuuk"
    America_Ojinaga = "America/Ojinaga"
    America_Panama = "America/Panama"
    America_Pangnirtung = "America/Pangnirtung"
    America_Paramaribo = "America/Paramaribo"
    America_Phoenix = "America/Phoenix"
    America_Port_au_Prince = "America/Port-au-Prince"
    America_Port_of_Spain = "America/Port_of_Spain"
    America_Porto_Acre = "America/Porto_Acre"
    America_Porto_Velho = "America/Porto_Velho"
    America_Puerto_Rico = "America/Puerto_Rico"
    America_Punta_Arenas = "America/Punta_Arenas"
    America_Rainy_River = "America/Rainy_River"
    America_Rankin_Inlet = "America/Rankin_Inlet"
    America_Recife = "America/Recife"
    America_Regina = "America/Regina"
    America_Resolute = "America/Resolute"
    America_Rio_Branco = "America/Rio_Branco"
    America_Rosario = "America/Rosario"
    America_Santa_Isabel = "America/Santa_Isabel"
    America_Santarem = "America/Santarem"
    America_Santiago = "America/Santiago"
    America_Santo_Domingo = "America/Santo_Domingo"
    America_Sao_Paulo = "America/Sao_Paulo"
    America_Scoresbysund = "America/Scoresbysund"
    America_Shiprock = "America/Shiprock"
    America_Sitka = "America/Sitka"
    America_St_Barthelemy = "America/St_Barthelemy"
    America_St_Johns = "America/St_Johns"
    America_St_Kitts = "America/St_Kitts"
    America_St_Lucia = "America/St_Lucia"
    America_St_Thomas = "America/St_Thomas"
    America_St_Vincent = "America/St_Vincent"
    America_Swift_Current = "America/Swift_Current"
    America_Tegucigalpa = "America/Tegucigalpa"
    America_Thule = "America/Thule"
    America_Thunder_Bay = "America/Thunder_Bay"
    America_Tijuana = "America/Tijuana"
    America_Toronto = "America/Toronto"
    America_Tortola = "America/Tortola"
    America_Vancouver = "America/Vancouver"
    America_Virgin = "America/Virgin"
    America_Whitehorse = "America/Whitehorse"
    America_Winnipeg = "America/Winnipeg"
    America_Yakutat = "America/Yakutat"
    America_Yellowknife = "America/Yellowknife"
    Antarctica_Casey = "Antarctica/Casey"
    Antarctica_Davis = "Antarctica/Davis"
    Antarctica_DumontDUrville = "Antarctica/DumontDUrville"
    Antarctica_Macquarie = "Antarctica/Macquarie"
    Antarctica_Mawson = "Antarctica/Mawson"
    Antarctica_McMurdo = "Antarctica/McMurdo"
    Antarctica_Palmer = "Antarctica/Palmer"
    Antarctica_Rothera = "Antarctica/Rothera"
    Antarctica_South_Pole = "Antarctica/South_Pole"
    Antarctica_Syowa = "Antarctica/Syowa"
    Antarctica_Troll = "Antarctica/Troll"
    Antarctica_Vostok = "Antarctica/Vostok"
    Arctic_Longyearbyen = "Arctic/Longyearbyen"
    Asia_Aden = "Asia/Aden"
    Asia_Almaty = "Asia/Almaty"
    Asia_Amman = "Asia/Amman"
    Asia_Anadyr = "Asia/Anadyr"
    Asia_Aqtau = "Asia/Aqtau"
    Asia_Aqtobe = "Asia/Aqtobe"
    Asia_Ashgabat = "Asia/Ashgabat"
    Asia_Ashkhabad = "Asia/Ashkhabad"
    Asia_Atyrau = "Asia/Atyrau"
    Asia_Baghdad = "Asia/Baghdad"
    Asia_Bahrain = "Asia/Bahrain"
    Asia_Baku = "Asia/Baku"
    Asia_Bangkok = "Asia/Bangkok"
    Asia_Barnaul = "Asia/Barnaul"
    Asia_Beirut = "Asia/Beirut"
    Asia_Bishkek = "Asia/Bishkek"
    Asia_Brunei = "Asia/Brunei"
    Asia_Calcutta = "Asia/Calcutta"
    Asia_Chita = "Asia/Chita"
    Asia_Choibalsan = "Asia/Choibalsan"
    Asia_Chongqing = "Asia/Chongqing"
    Asia_Chungking = "Asia/Chungking"
    Asia_Colombo = "Asia/Colombo"
    Asia_Dacca = "Asia/Dacca"
    Asia_Damascus = "Asia/Damascus"
    Asia_Dhaka = "Asia/Dhaka"
    Asia_Dili = "Asia/Dili"
    Asia_Dubai = "Asia/Dubai"
    Asia_Dushanbe = "Asia/Dushanbe"
    Asia_Famagusta = "Asia/Famagusta"
    Asia_Gaza = "Asia/Gaza"
    Asia_Harbin = "Asia/Harbin"
    Asia_Hebron = "Asia/Hebron"
    Asia_Ho_Chi_Minh = "Asia/Ho_Chi_Minh"
    Asia_Hong_Kong = "Asia/Hong_Kong"
    Asia_Hovd = "Asia/Hovd"
    Asia_Irkutsk = "Asia/Irkutsk"
    Asia_Istanbul = "Asia/Istanbul"
    Asia_Jakarta = "Asia/Jakarta"
    Asia_Jayapura = "Asia/Jayapura"
    Asia_Jerusalem = "Asia/Jerusalem"
    Asia_Kabul = "Asia/Kabul"
    Asia_Kamchatka = "Asia/Kamchatka"
    Asia_Karachi = "Asia/Karachi"
    Asia_Kashgar = "Asia/Kashgar"
    Asia_Kathmandu = "Asia/Kathmandu"
    Asia_Katmandu = "Asia/Katmandu"
    Asia_Khandyga = "Asia/Khandyga"
    Asia_Kolkata = "Asia/Kolkata"
    Asia_Krasnoyarsk = "Asia/Krasnoyarsk"
    Asia_Kuala_Lumpur = "Asia/Kuala_Lumpur"
    Asia_Kuching = "Asia/Kuching"
    Asia_Kuwait = "Asia/Kuwait"
    Asia_Macao = "Asia/Macao"
    Asia_Macau = "Asia/Macau"
    Asia_Magadan = "Asia/Magadan"
    Asia_Makassar = "Asia/Makassar"
    Asia_Manila = "Asia/Manila"
    Asia_Muscat = "Asia/Muscat"
    Asia_Nicosia = "Asia/Nicosia"
    Asia_Novokuznetsk = "Asia/Novokuznetsk"
    Asia_Novosibirsk = "Asia/Novosibirsk"
    Asia_Omsk = "Asia/Omsk"
    Asia_Oral = "Asia/Oral"
    Asia_Phnom_Penh = "Asia/Phnom_Penh"
    Asia_Pontianak = "Asia/Pontianak"
    Asia_Pyongyang = "Asia/Pyongyang"
    Asia_Qatar = "Asia/Qatar"
    Asia_Qostanay = "Asia/Qostanay"
    Asia_Qyzylorda = "Asia/Qyzylorda"
    Asia_Rangoon = "Asia/Rangoon"
    Asia_Riyadh = "Asia/Riyadh"
    Asia_Saigon = "Asia/Saigon"
    Asia_Sakhalin = "Asia/Sakhalin"
    Asia_Samarkand = "Asia/Samarkand"
    Asia_Seoul = "Asia/Seoul"
    Asia_Shanghai = "Asia/Shanghai"
    Asia_Singapore = "Asia/Singapore"
    Asia_Srednekolymsk = "Asia/Srednekolymsk"
    Asia_Taipei = "Asia/Taipei"
    Asia_Tashkent = "Asia/Tashkent"
    Asia_Tbilisi = "Asia/Tbilisi"
    Asia_Tehran = "Asia/Tehran"
    Asia_Tel_Aviv = "Asia/Tel_Aviv"
    Asia_Thimbu = "Asia/Thimbu"
    Asia_Thimphu = "Asia/Thimphu"
    Asia_Tokyo = "Asia/Tokyo"
    Asia_Tomsk = "Asia/Tomsk"
    Asia_Ujung_Pandang = "Asia/Ujung_Pandang"
    Asia_Ulaanbaatar = "Asia/Ulaanbaatar"
    Asia_Ulan_Bator = "Asia/Ulan_Bator"
    Asia_Urumqi = "Asia/Urumqi"
    Asia_Ust_Nera = "Asia/Ust-Nera"
    Asia_Vientiane = "Asia/Vientiane"
    Asia_Vladivostok = "Asia/Vladivostok"
    Asia_Yakutsk = "Asia/Yakutsk"
    Asia_Yangon = "Asia/Yangon"
    Asia_Yekaterinburg = "Asia/Yekaterinburg"
    Asia_Yerevan = "Asia/Yerevan"
    Atlantic_Azores = "Atlantic/Azores"
    Atlantic_Bermuda = "Atlantic/Bermuda"
    Atlantic_Canary = "Atlantic/Canary"
    Atlantic_Cape_Verde = "Atlantic/Cape_Verde"
    Atlantic_Faeroe = "Atlantic/Faeroe"
    Atlantic_Faroe = "Atlantic/Faroe"
    Atlantic_Jan_Mayen = "Atlantic/Jan_Mayen"
    Atlantic_Madeira = "Atlantic/Madeira"
    Atlantic_Reykjavik = "Atlantic/Reykjavik"
    Atlantic_South_Georgia = "Atlantic/South_Georgia"
    Atlantic_St_Helena = "Atlantic/St_Helena"
    Atlantic_Stanley = "Atlantic/Stanley"
    Australia_ACT = "Australia/ACT"
    Australia_Adelaide = "Australia/Adelaide"
    Australia_Brisbane = "Australia/Brisbane"
    Australia_Broken_Hill = "Australia/Broken_Hill"
    Australia_Canberra = "Australia/Canberra"
    Australia_Currie = "Australia/Currie"
    Australia_Darwin = "Australia/Darwin"
    Australia_Eucla = "Australia/Eucla"
    Australia_Hobart = "Australia/Hobart"
    Australia_LHI = "Australia/LHI"
    Australia_Lindeman = "Australia/Lindeman"
    Australia_Lord_Howe = "Australia/Lord_Howe"
    Australia_Melbourne = "Australia/Melbourne"
    Australia_NSW = "Australia/NSW"
    Australia_North = "Australia/North"
    Australia_Perth = "Australia/Perth"
    Australia_Queensland = "Australia/Queensland"
    Australia_South = "Australia/South"
    Australia_Sydney = "Australia/Sydney"
    Australia_Tasmania = "Australia/Tasmania"
    Australia_Victoria = "Australia/Victoria"
    Australia_West = "Australia/West"
    Australia_Yancowinna = "Australia/Yancowinna"
    Brazil_Acre = "Brazil/Acre"
    Brazil_DeNoronha = "Brazil/DeNoronha"
    Brazil_East = "Brazil/East"
    Brazil_West = "Brazil/West"
    CET = "CET"
    CST6CDT = "CST6CDT"
    Canada_Atlantic = "Canada/Atlantic"
    Canada_Central = "Canada/Central"
    Canada_Eastern = "Canada/Eastern"
    Canada_Mountain = "Canada/Mountain"
    Canada_Newfoundland = "Canada/Newfoundland"
    Canada_Pacific = "Canada/Pacific"
    Canada_Saskatchewan = "Canada/Saskatchewan"
    Canada_Yukon = "Canada/Yukon"
    Chile_Continental = "Chile/Continental"
    Chile_EasterIsland = "Chile/EasterIsland"
    Cuba = "Cuba"
    EET = "EET"
    EST = "EST"
    EST5EDT = "EST5EDT"
    Egypt = "Egypt"
    Eire = "Eire"
    Etc_GMT = "Etc/GMT"
    Etc_GMT_0 = "Etc/GMT+0"
    Etc_GMT_1 = "Etc/GMT+1"
    Etc_GMT_10 = "Etc/GMT+10"
    Etc_GMT_11 = "Etc/GMT+11"
    Etc_GMT_12 = "Etc/GMT+12"
    Etc_GMT_2 = "Etc/GMT+2"
    Etc_GMT_3 = "Etc/GMT+3"
    Etc_GMT_4 = "Etc/GMT+4"
    Etc_GMT_5 = "Etc/GMT+5"
    Etc_GMT_6 = "Etc/GMT+6"
    Etc_GMT_7 = "Etc/GMT+7"
    Etc_GMT_8 = "Etc/GMT+8"
    Etc_GMT_9 = "Etc/GMT+9"
    Etc_GMT_0_1 = "Etc/GMT-0"
    Etc_GMT_1_1 = "Etc/GMT-1"
    Etc_GMT_10_1 = "Etc/GMT-10"
    Etc_GMT_11_1 = "Etc/GMT-11"
    Etc_GMT_12_1 = "Etc/GMT-12"
    Etc_GMT_13 = "Etc/GMT-13"
    Etc_GMT_14 = "Etc/GMT-14"
    Etc_GMT_2_1 = "Etc/GMT-2"
    Etc_GMT_3_1 = "Etc/GMT-3"
    Etc_GMT_4_1 = "Etc/GMT-4"
    Etc_GMT_5_1 = "Etc/GMT-5"
    Etc_GMT_6_1 = "Etc/GMT-6"
    Etc_GMT_7_1 = "Etc/GMT-7"
    Etc_GMT_8_1 = "Etc/GMT-8"
    Etc_GMT_9_1 = "Etc/GMT-9"
    Etc_GMT0 = "Etc/GMT0"
    Etc_Greenwich = "Etc/Greenwich"
    Etc_UCT = "Etc/UCT"
    Etc_UTC = "Etc/UTC"
    Etc_Universal = "Etc/Universal"
    Etc_Zulu = "Etc/Zulu"
    Europe_Amsterdam = "Europe/Amsterdam"
    Europe_Andorra = "Europe/Andorra"
    Europe_Astrakhan = "Europe/Astrakhan"
    Europe_Athens = "Europe/Athens"
    Europe_Belfast = "Europe/Belfast"
    Europe_Belgrade = "Europe/Belgrade"
    Europe_Berlin = "Europe/Berlin"
    Europe_Bratislava = "Europe/Bratislava"
    Europe_Brussels = "Europe/Brussels"
    Europe_Bucharest = "Europe/Bucharest"
    Europe_Budapest = "Europe/Budapest"
    Europe_Busingen = "Europe/Busingen"
    Europe_Chisinau = "Europe/Chisinau"
    Europe_Copenhagen = "Europe/Copenhagen"
    Europe_Dublin = "Europe/Dublin"
    Europe_Gibraltar = "Europe/Gibraltar"
    Europe_Guernsey = "Europe/Guernsey"
    Europe_Helsinki = "Europe/Helsinki"
    Europe_Isle_of_Man = "Europe/Isle_of_Man"
    Europe_Istanbul = "Europe/Istanbul"
    Europe_Jersey = "Europe/Jersey"
    Europe_Kaliningrad = "Europe/Kaliningrad"
    Europe_Kiev = "Europe/Kiev"
    Europe_Kirov = "Europe/Kirov"
    Europe_Kyiv = "Europe/Kyiv"
    Europe_Lisbon = "Europe/Lisbon"
    Europe_Ljubljana = "Europe/Ljubljana"
    Europe_London = "Europe/London"
    Europe_Luxembourg = "Europe/Luxembourg"
    Europe_Madrid = "Europe/Madrid"
    Europe_Malta = "Europe/Malta"
    Europe_Mariehamn = "Europe/Mariehamn"
    Europe_Minsk = "Europe/Minsk"
    Europe_Monaco = "Europe/Monaco"
    Europe_Moscow = "Europe/Moscow"
    Europe_Nicosia = "Europe/Nicosia"
    Europe_Oslo = "Europe/Oslo"
    Europe_Paris = "Europe/Paris"
    Europe_Podgorica = "Europe/Podgorica"
    Europe_Prague = "Europe/Prague"
    Europe_Riga = "Europe/Riga"
    Europe_Rome = "Europe/Rome"
    Europe_Samara = "Europe/Samara"
    Europe_San_Marino = "Europe/San_Marino"
    Europe_Sarajevo = "Europe/Sarajevo"
    Europe_Saratov = "Europe/Saratov"
    Europe_Simferopol = "Europe/Simferopol"
    Europe_Skopje = "Europe/Skopje"
    Europe_Sofia = "Europe/Sofia"
    Europe_Stockholm = "Europe/Stockholm"
    Europe_Tallinn = "Europe/Tallinn"
    Europe_Tirane = "Europe/Tirane"
    Europe_Tiraspol = "Europe/Tiraspol"
    Europe_Ulyanovsk = "Europe/Ulyanovsk"
    Europe_Uzhgorod = "Europe/Uzhgorod"
    Europe_Vaduz = "Europe/Vaduz"
    Europe_Vatican = "Europe/Vatican"
    Europe_Vienna = "Europe/Vienna"
    Europe_Vilnius = "Europe/Vilnius"
    Europe_Volgograd = "Europe/Volgograd"
    Europe_Warsaw = "Europe/Warsaw"
    Europe_Zagreb = "Europe/Zagreb"
    Europe_Zaporozhye = "Europe/Zaporozhye"
    Europe_Zurich = "Europe/Zurich"
    GB = "GB"
    GB_Eire = "GB-Eire"
    GMT = "GMT"
    GMT_0 = "GMT+0"
    GMT_0_1 = "GMT-0"
    GMT0 = "GMT0"
    Greenwich = "Greenwich"
    HST = "HST"
    Hongkong = "Hongkong"
    Iceland = "Iceland"
    Indian_Antananarivo = "Indian/Antananarivo"
    Indian_Chagos = "Indian/Chagos"
    Indian_Christmas = "Indian/Christmas"
    Indian_Cocos = "Indian/Cocos"
    Indian_Comoro = "Indian/Comoro"
    Indian_Kerguelen = "Indian/Kerguelen"
    Indian_Mahe = "Indian/Mahe"
    Indian_Maldives = "Indian/Maldives"
    Indian_Mauritius = "Indian/Mauritius"
    Indian_Mayotte = "Indian/Mayotte"
    Indian_Reunion = "Indian/Reunion"
    Iran = "Iran"
    Israel = "Israel"
    Jamaica = "Jamaica"
    Japan = "Japan"
    Kwajalein = "Kwajalein"
    Libya = "Libya"
    MET = "MET"
    MST = "MST"
    MST7MDT = "MST7MDT"
    Mexico_BajaNorte = "Mexico/BajaNorte"
    Mexico_BajaSur = "Mexico/BajaSur"
    Mexico_General = "Mexico/General"
    NZ = "NZ"
    NZ_CHAT = "NZ-CHAT"
    Navajo = "Navajo"
    PRC = "PRC"
    PST8PDT = "PST8PDT"
    Pacific_Apia = "Pacific/Apia"
    Pacific_Auckland = "Pacific/Auckland"
    Pacific_Bougainville = "Pacific/Bougainville"
    Pacific_Chatham = "Pacific/Chatham"
    Pacific_Chuuk = "Pacific/Chuuk"
    Pacific_Easter = "Pacific/Easter"
    Pacific_Efate = "Pacific/Efate"
    Pacific_Enderbury = "Pacific/Enderbury"
    Pacific_Fakaofo = "Pacific/Fakaofo"
    Pacific_Fiji = "Pacific/Fiji"
    Pacific_Funafuti = "Pacific/Funafuti"
    Pacific_Galapagos = "Pacific/Galapagos"
    Pacific_Gambier = "Pacific/Gambier"
    Pacific_Guadalcanal = "Pacific/Guadalcanal"
    Pacific_Guam = "Pacific/Guam"
    Pacific_Honolulu = "Pacific/Honolulu"
    Pacific_Johnston = "Pacific/Johnston"
    Pacific_Kanton = "Pacific/Kanton"
    Pacific_Kiritimati = "Pacific/Kiritimati"
    Pacific_Kosrae = "Pacific/Kosrae"
    Pacific_Kwajalein = "Pacific/Kwajalein"
    Pacific_Majuro = "Pacific/Majuro"
    Pacific_Marquesas = "Pacific/Marquesas"
    Pacific_Midway = "Pacific/Midway"
    Pacific_Nauru = "Pacific/Nauru"
    Pacific_Niue = "Pacific/Niue"
    Pacific_Norfolk = "Pacific/Norfolk"
    Pacific_Noumea = "Pacific/Noumea"
    Pacific_Pago_Pago = "Pacific/Pago_Pago"
    Pacific_Palau = "Pacific/Palau"
    Pacific_Pitcairn = "Pacific/Pitcairn"
    Pacific_Pohnpei = "Pacific/Pohnpei"
    Pacific_Ponape = "Pacific/Ponape"
    Pacific_Port_Moresby = "Pacific/Port_Moresby"
    Pacific_Rarotonga = "Pacific/Rarotonga"
    Pacific_Saipan = "Pacific/Saipan"
    Pacific_Samoa = "Pacific/Samoa"
    Pacific_Tahiti = "Pacific/Tahiti"
    Pacific_Tarawa = "Pacific/Tarawa"
    Pacific_Tongatapu = "Pacific/Tongatapu"
    Pacific_Truk = "Pacific/Truk"
    Pacific_Wake = "Pacific/Wake"
    Pacific_Wallis = "Pacific/Wallis"
    Pacific_Yap = "Pacific/Yap"
    Poland = "Poland"
    Portugal = "Portugal"
    ROC = "ROC"
    ROK = "ROK"
    Singapore = "Singapore"
    Turkey = "Turkey"
    UCT = "UCT"
    US_Alaska = "US/Alaska"
    US_Aleutian = "US/Aleutian"
    US_Arizona = "US/Arizona"
    US_Central = "US/Central"
    US_East_Indiana = "US/East-Indiana"
    US_Eastern = "US/Eastern"
    US_Hawaii = "US/Hawaii"
    US_Indiana_Starke = "US/Indiana-Starke"
    US_Michigan = "US/Michigan"
    US_Mountain = "US/Mountain"
    US_Pacific = "US/Pacific"
    US_Samoa = "US/Samoa"
    UTC = "UTC"
    Universal = "Universal"
    W_SU = "W-SU"
    WET = "WET"
    Zulu = "Zulu"


AccountName = str


class OptionLike(Struct, omit_defaults=True):
    strike: Decimal
    expiration: Optional[datetime] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        strike: Decimal,
        expiration: Optional[datetime] = None,
    ):
        return cls(
            strike,
            expiration,
        )

    def __str__(self) -> str:
        return f"OptionLike(strike={self.strike},expiration={self.expiration})"


class EventContractSeriesInstance2(Struct, omit_defaults=True):
    OptionLike: OptionLike

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        OptionLike: OptionLike,
    ):
        return cls(
            OptionLike,
        )

    def __str__(self) -> str:
        return f"EventContractSeriesInstance2(OptionLike={self.OptionLike})"


class SpreadLeg(Struct, omit_defaults=True):
    product: str
    quantity: Annotated[
        Decimal,
        Meta(
            description="Some spreads have different ratios for their legs, like buy 1 A, sell 2 B, buy 1 C; We would represent that with quantities in the legs: 1, -2, 1"
        ),
    ]
    """
    Some spreads have different ratios for their legs, like buy 1 A, sell 2 B, buy 1 C; We would represent that with quantities in the legs: 1, -2, 1
    """

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        product: str,
        quantity: Decimal,
    ):
        return cls(
            product,
            quantity,
        )

    def __str__(self) -> str:
        return f"SpreadLeg(product={self.product},quantity={self.quantity})"


class Outcome(Struct, omit_defaults=True):
    name: str

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        name: str,
    ):
        return cls(
            name,
        )

    def __str__(self) -> str:
        return f"Outcome(name={self.name})"


class PutOrCall(str, Enum):
    P = "P"
    C = "C"


class AberrantFill(Struct, omit_defaults=True):
    """
    Fills which we received but couldn't parse fully, return details best effort
    """

    id: Annotated[str, Meta(title="fill_id")]
    x: Annotated[str, Meta(title="execution_venue")]
    a: Optional[Annotated[Optional[str], Meta(title="account")]] = None
    atn: Optional[Annotated[Optional[int], Meta(title="recv_time_ns")]] = None
    ats: Optional[Annotated[Optional[int], Meta(title="recv_time")]] = None
    d: Optional[Annotated[Optional[OrderDir], Meta(title="direction")]] = None
    f: Optional[Annotated[Optional[Decimal], Meta(title="fee")]] = None
    fu: Optional[Annotated[Optional[str], Meta(title="fee_currency")]] = None
    k: Optional[Annotated[Optional[FillKind], Meta(title="fill_kind")]] = None
    oid: Optional[Annotated[Optional[OrderId], Meta(title="order_id")]] = None
    p: Optional[Annotated[Optional[Decimal], Meta(title="price")]] = None
    q: Optional[Annotated[Optional[Decimal], Meta(title="quantity")]] = None
    s: Optional[Annotated[Optional[str], Meta(title="symbol")]] = None
    tn: Optional[Annotated[Optional[int], Meta(title="trade_time_ns")]] = None
    ts: Optional[Annotated[Optional[int], Meta(title="trade_time")]] = None
    u: Optional[Annotated[Optional[UserId], Meta(title="trader")]] = None
    xid: Optional[Annotated[Optional[str], Meta(title="exchange_fill_id")]] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        fill_id: str,
        execution_venue: str,
        account: Optional[str] = None,
        recv_time_ns: Optional[int] = None,
        recv_time: Optional[int] = None,
        direction: Optional[OrderDir] = None,
        fee: Optional[Decimal] = None,
        fee_currency: Optional[str] = None,
        fill_kind: Optional[FillKind] = None,
        order_id: Optional[OrderId] = None,
        price: Optional[Decimal] = None,
        quantity: Optional[Decimal] = None,
        symbol: Optional[str] = None,
        trade_time_ns: Optional[int] = None,
        trade_time: Optional[int] = None,
        trader: Optional[UserId] = None,
        exchange_fill_id: Optional[str] = None,
    ):
        return cls(
            fill_id,
            execution_venue,
            account,
            recv_time_ns,
            recv_time,
            direction,
            fee,
            fee_currency,
            fill_kind,
            order_id,
            price,
            quantity,
            symbol,
            trade_time_ns,
            trade_time,
            trader,
            exchange_fill_id,
        )

    def __str__(self) -> str:
        return f"AberrantFill(fill_id={self.id},execution_venue={self.x},account={self.a},recv_time_ns={self.atn},recv_time={self.ats},direction={self.d},fee={self.f},fee_currency={self.fu},fill_kind={self.k},order_id={self.oid},price={self.p},quantity={self.q},symbol={self.s},trade_time_ns={self.tn},trade_time={self.ts},trader={self.u},exchange_fill_id={self.xid})"

    @property
    def fill_id(self) -> str:
        return self.id

    @fill_id.setter
    def fill_id(self, value: str) -> None:
        self.id = value

    @property
    def execution_venue(self) -> str:
        return self.x

    @execution_venue.setter
    def execution_venue(self, value: str) -> None:
        self.x = value

    @property
    def account(self) -> Optional[str]:
        return self.a

    @account.setter
    def account(self, value: Optional[str]) -> None:
        self.a = value

    @property
    def recv_time_ns(self) -> Optional[int]:
        return self.atn

    @recv_time_ns.setter
    def recv_time_ns(self, value: Optional[int]) -> None:
        self.atn = value

    @property
    def recv_time(self) -> Optional[int]:
        return self.ats

    @recv_time.setter
    def recv_time(self, value: Optional[int]) -> None:
        self.ats = value

    @property
    def direction(self) -> Optional[OrderDir]:
        return self.d

    @direction.setter
    def direction(self, value: Optional[OrderDir]) -> None:
        self.d = value

    @property
    def fee(self) -> Optional[Decimal]:
        return self.f

    @fee.setter
    def fee(self, value: Optional[Decimal]) -> None:
        self.f = value

    @property
    def fee_currency(self) -> Optional[str]:
        return self.fu

    @fee_currency.setter
    def fee_currency(self, value: Optional[str]) -> None:
        self.fu = value

    @property
    def fill_kind(self) -> Optional[FillKind]:
        return self.k

    @fill_kind.setter
    def fill_kind(self, value: Optional[FillKind]) -> None:
        self.k = value

    @property
    def order_id(self) -> Optional[OrderId]:
        return self.oid

    @order_id.setter
    def order_id(self, value: Optional[OrderId]) -> None:
        self.oid = value

    @property
    def price(self) -> Optional[Decimal]:
        return self.p

    @price.setter
    def price(self, value: Optional[Decimal]) -> None:
        self.p = value

    @property
    def quantity(self) -> Optional[Decimal]:
        return self.q

    @quantity.setter
    def quantity(self, value: Optional[Decimal]) -> None:
        self.q = value

    @property
    def symbol(self) -> Optional[str]:
        return self.s

    @symbol.setter
    def symbol(self, value: Optional[str]) -> None:
        self.s = value

    @property
    def trade_time_ns(self) -> Optional[int]:
        return self.tn

    @trade_time_ns.setter
    def trade_time_ns(self, value: Optional[int]) -> None:
        self.tn = value

    @property
    def trade_time(self) -> Optional[int]:
        return self.ts

    @trade_time.setter
    def trade_time(self, value: Optional[int]) -> None:
        self.ts = value

    @property
    def trader(self) -> Optional[UserId]:
        return self.u

    @trader.setter
    def trader(self, value: Optional[UserId]) -> None:
        self.u = value

    @property
    def exchange_fill_id(self) -> Optional[str]:
        return self.xid

    @exchange_fill_id.setter
    def exchange_fill_id(self, value: Optional[str]) -> None:
        self.xid = value


class CancelReject(Struct, omit_defaults=True):
    id: OrderId
    xid: str
    rm: Optional[str] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        id: OrderId,
        xid: str,
        rm: Optional[str] = None,
    ):
        return cls(
            id,
            xid,
            rm,
        )

    def __str__(self) -> str:
        return f"CancelReject(id={self.id},xid={self.xid},rm={self.rm})"


class CptyLoginRequest(Struct, omit_defaults=True):
    account: str
    trader: UserId

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        account: str,
        trader: UserId,
    ):
        return cls(
            account,
            trader,
        )

    def __str__(self) -> str:
        return f"CptyLoginRequest(account={self.account},trader={self.trader})"


class ExecutionInfo(Struct, omit_defaults=True):
    """
    Information about a symbol related to its execution route.
    """

    execution_venue: str
    is_delisted: bool
    min_order_quantity: Decimal
    min_order_quantity_unit: MinOrderQuantityUnit
    step_size: Decimal
    tick_size: TickSize
    exchange_symbol: Optional[
        Annotated[
            Optional[str],
            Meta(
                description="If the execution venue has stable symbology, this may be populated"
            ),
        ]
    ] = None
    """
    If the execution venue has stable symbology, this may be populated
    """
    initial_margin: Optional[Decimal] = None
    maintenance_margin: Optional[Decimal] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        execution_venue: str,
        is_delisted: bool,
        min_order_quantity: Decimal,
        min_order_quantity_unit: MinOrderQuantityUnit,
        step_size: Decimal,
        tick_size: TickSize,
        exchange_symbol: Optional[str] = None,
        initial_margin: Optional[Decimal] = None,
        maintenance_margin: Optional[Decimal] = None,
    ):
        return cls(
            execution_venue,
            is_delisted,
            min_order_quantity,
            min_order_quantity_unit,
            step_size,
            tick_size,
            exchange_symbol,
            initial_margin,
            maintenance_margin,
        )

    def __str__(self) -> str:
        return f"ExecutionInfo(execution_venue={self.execution_venue},is_delisted={self.is_delisted},min_order_quantity={self.min_order_quantity},min_order_quantity_unit={self.min_order_quantity_unit},step_size={self.step_size},tick_size={self.tick_size},exchange_symbol={self.exchange_symbol},initial_margin={self.initial_margin},maintenance_margin={self.maintenance_margin})"


class Fill(Struct, omit_defaults=True):
    d: Annotated[OrderDir, Meta(title="direction")]
    id: Annotated[str, Meta(title="fill_id")]
    k: Annotated[FillKind, Meta(title="fill_kind")]
    p: Annotated[Decimal, Meta(title="price")]
    q: Annotated[Decimal, Meta(title="quantity")]
    s: Annotated[str, Meta(title="symbol")]
    tn: Annotated[int, Meta(ge=0, title="trade_time_ns")]
    ts: Annotated[
        int,
        Meta(description="When the cpty claims the trade happened", title="trade_time"),
    ]
    """
    When the cpty claims the trade happened
    """
    x: Annotated[str, Meta(title="execution_venue")]
    a: Optional[Annotated[Optional[str], Meta(title="account")]] = None
    agg: Optional[Annotated[int, Meta(title="is_taker")]] = None
    atn: Optional[Annotated[Optional[int], Meta(title="recv_time_ns")]] = None
    ats: Optional[
        Annotated[
            Optional[int],
            Meta(
                description="When Architect received the fill, if realtime",
                title="recv_time",
            ),
        ]
    ] = None
    """
    When Architect received the fill, if realtime
    """
    f: Optional[Annotated[Optional[Decimal], Meta(title="fee")]] = None
    fu: Optional[
        Annotated[
            Optional[str],
            Meta(
                description="Fee currency, if different from the price currency",
                title="fee_currency",
            ),
        ]
    ] = None
    """
    Fee currency, if different from the price currency
    """
    oid: Optional[Annotated[Optional[OrderId], Meta(title="order_id")]] = None
    u: Optional[Annotated[Optional[UserId], Meta(title="trader")]] = None
    xid: Optional[Annotated[Optional[str], Meta(title="exchange_fill_id")]] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        direction: OrderDir,
        fill_id: str,
        fill_kind: FillKind,
        price: Decimal,
        quantity: Decimal,
        symbol: str,
        trade_time_ns: int,
        trade_time: int,
        execution_venue: str,
        account: Optional[str] = None,
        is_taker: Optional[int] = None,
        recv_time_ns: Optional[int] = None,
        recv_time: Optional[int] = None,
        fee: Optional[Decimal] = None,
        fee_currency: Optional[str] = None,
        order_id: Optional[OrderId] = None,
        trader: Optional[UserId] = None,
        exchange_fill_id: Optional[str] = None,
    ):
        return cls(
            direction,
            fill_id,
            fill_kind,
            price,
            quantity,
            symbol,
            trade_time_ns,
            trade_time,
            execution_venue,
            account,
            is_taker,
            recv_time_ns,
            recv_time,
            fee,
            fee_currency,
            order_id,
            trader,
            exchange_fill_id,
        )

    def __str__(self) -> str:
        return f"Fill(direction={self.d},fill_id={self.id},fill_kind={self.k},price={self.p},quantity={self.q},symbol={self.s},trade_time_ns={self.tn},trade_time={self.ts},execution_venue={self.x},account={self.a},is_taker={self.agg},recv_time_ns={self.atn},recv_time={self.ats},fee={self.f},fee_currency={self.fu},order_id={self.oid},trader={self.u},exchange_fill_id={self.xid})"

    @property
    def direction(self) -> OrderDir:
        return self.d

    @direction.setter
    def direction(self, value: OrderDir) -> None:
        self.d = value

    @property
    def fill_id(self) -> str:
        return self.id

    @fill_id.setter
    def fill_id(self, value: str) -> None:
        self.id = value

    @property
    def fill_kind(self) -> FillKind:
        return self.k

    @fill_kind.setter
    def fill_kind(self, value: FillKind) -> None:
        self.k = value

    @property
    def price(self) -> Decimal:
        return self.p

    @price.setter
    def price(self, value: Decimal) -> None:
        self.p = value

    @property
    def quantity(self) -> Decimal:
        return self.q

    @quantity.setter
    def quantity(self, value: Decimal) -> None:
        self.q = value

    @property
    def symbol(self) -> str:
        return self.s

    @symbol.setter
    def symbol(self, value: str) -> None:
        self.s = value

    @property
    def trade_time_ns(self) -> int:
        return self.tn

    @trade_time_ns.setter
    def trade_time_ns(self, value: int) -> None:
        self.tn = value

    @property
    def trade_time(self) -> int:
        return self.ts

    @trade_time.setter
    def trade_time(self, value: int) -> None:
        self.ts = value

    @property
    def execution_venue(self) -> str:
        return self.x

    @execution_venue.setter
    def execution_venue(self, value: str) -> None:
        self.x = value

    @property
    def account(self) -> Optional[str]:
        return self.a

    @account.setter
    def account(self, value: Optional[str]) -> None:
        self.a = value

    @property
    def is_taker(self) -> Optional[int]:
        return self.agg

    @is_taker.setter
    def is_taker(self, value: Optional[int]) -> None:
        self.agg = value

    @property
    def recv_time_ns(self) -> Optional[int]:
        return self.atn

    @recv_time_ns.setter
    def recv_time_ns(self, value: Optional[int]) -> None:
        self.atn = value

    @property
    def recv_time(self) -> Optional[int]:
        return self.ats

    @recv_time.setter
    def recv_time(self, value: Optional[int]) -> None:
        self.ats = value

    @property
    def fee(self) -> Optional[Decimal]:
        return self.f

    @fee.setter
    def fee(self, value: Optional[Decimal]) -> None:
        self.f = value

    @property
    def fee_currency(self) -> Optional[str]:
        return self.fu

    @fee_currency.setter
    def fee_currency(self, value: Optional[str]) -> None:
        self.fu = value

    @property
    def order_id(self) -> Optional[OrderId]:
        return self.oid

    @order_id.setter
    def order_id(self, value: Optional[OrderId]) -> None:
        self.oid = value

    @property
    def trader(self) -> Optional[UserId]:
        return self.u

    @trader.setter
    def trader(self, value: Optional[UserId]) -> None:
        self.u = value

    @property
    def exchange_fill_id(self) -> Optional[str]:
        return self.xid

    @exchange_fill_id.setter
    def exchange_fill_id(self, value: Optional[str]) -> None:
        self.xid = value


class OptionsSeriesInfo(Struct, omit_defaults=True):
    derivative_kind: DerivativeKind
    exercise_type: OptionsExerciseType
    expiration_time_of_day: time
    expiration_time_zone: TimeZone
    is_cash_settled: bool
    multiplier: Decimal
    options_series: str
    quote_symbol: str
    strikes_by_expiration: Dict[str, List[Decimal]]
    underlying: str
    venue_discriminant: Optional[str] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        derivative_kind: DerivativeKind,
        exercise_type: OptionsExerciseType,
        expiration_time_of_day: time,
        expiration_time_zone: TimeZone,
        is_cash_settled: bool,
        multiplier: Decimal,
        options_series: str,
        quote_symbol: str,
        strikes_by_expiration: Dict[str, List[Decimal]],
        underlying: str,
        venue_discriminant: Optional[str] = None,
    ):
        return cls(
            derivative_kind,
            exercise_type,
            expiration_time_of_day,
            expiration_time_zone,
            is_cash_settled,
            multiplier,
            options_series,
            quote_symbol,
            strikes_by_expiration,
            underlying,
            venue_discriminant,
        )

    def __str__(self) -> str:
        return f"OptionsSeriesInfo(derivative_kind={self.derivative_kind},exercise_type={self.exercise_type},expiration_time_of_day={self.expiration_time_of_day},expiration_time_zone={self.expiration_time_zone},is_cash_settled={self.is_cash_settled},multiplier={self.multiplier},options_series={self.options_series},quote_symbol={self.quote_symbol},strikes_by_expiration={self.strikes_by_expiration},underlying={self.underlying},venue_discriminant={self.venue_discriminant})"


class OrderAck(Struct, omit_defaults=True):
    id: Annotated[OrderId, Meta(title="order_id")]
    eid: Optional[Annotated[Optional[str], Meta(title="exchange_order_id")]] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        order_id: OrderId,
        exchange_order_id: Optional[str] = None,
    ):
        return cls(
            order_id,
            exchange_order_id,
        )

    def __str__(self) -> str:
        return f"OrderAck(order_id={self.id},exchange_order_id={self.eid})"

    @property
    def order_id(self) -> OrderId:
        return self.id

    @order_id.setter
    def order_id(self, value: OrderId) -> None:
        self.id = value

    @property
    def exchange_order_id(self) -> Optional[str]:
        return self.eid

    @exchange_order_id.setter
    def exchange_order_id(self, value: Optional[str]) -> None:
        self.eid = value


class OrderCanceled(Struct, omit_defaults=True):
    id: OrderId
    xid: Optional[str] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        id: OrderId,
        xid: Optional[str] = None,
    ):
        return cls(
            id,
            xid,
        )

    def __str__(self) -> str:
        return f"OrderCanceled(id={self.id},xid={self.xid})"


class OrderCanceling(Struct, omit_defaults=True):
    id: OrderId
    xid: Optional[str] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        id: OrderId,
        xid: Optional[str] = None,
    ):
        return cls(
            id,
            xid,
        )

    def __str__(self) -> str:
        return f"OrderCanceling(id={self.id},xid={self.xid})"


class OrderReject(Struct, omit_defaults=True):
    id: OrderId
    r: OrderRejectReason
    rm: Optional[str] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        id: OrderId,
        r: OrderRejectReason,
        rm: Optional[str] = None,
    ):
        return cls(
            id,
            r,
            rm,
        )

    def __str__(self) -> str:
        return f"OrderReject(id={self.id},r={self.r},rm={self.rm})"


class SnapshotOrUpdateForAliasKindAndSnapshotOrUpdateForStringAndString1(
    Struct, omit_defaults=True
):
    snapshot: Dict[str, SnapshotOrUpdateForStringAndString]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        snapshot: Dict[str, SnapshotOrUpdateForStringAndString],
    ):
        return cls(
            snapshot,
        )

    def __str__(self) -> str:
        return f"SnapshotOrUpdateForAliasKindAndSnapshotOrUpdateForStringAndString1(snapshot={self.snapshot})"


Update = List[Union[AliasKind, Optional[SnapshotOrUpdateForStringAndString]]]


class SnapshotOrUpdateForAliasKindAndSnapshotOrUpdateForStringAndString2(
    Struct, omit_defaults=True
):
    updates: List[Update]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        updates: List[Update],
    ):
        return cls(
            updates,
        )

    def __str__(self) -> str:
        return f"SnapshotOrUpdateForAliasKindAndSnapshotOrUpdateForStringAndString2(updates={self.updates})"


SnapshotOrUpdateForAliasKindAndSnapshotOrUpdateForStringAndString = Union[
    SnapshotOrUpdateForAliasKindAndSnapshotOrUpdateForStringAndString1,
    SnapshotOrUpdateForAliasKindAndSnapshotOrUpdateForStringAndString2,
]


class SnapshotOrUpdateForStringAndOptionsSeriesInfo1(Struct, omit_defaults=True):
    snapshot: Dict[str, OptionsSeriesInfo]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        snapshot: Dict[str, OptionsSeriesInfo],
    ):
        return cls(
            snapshot,
        )

    def __str__(self) -> str:
        return (
            f"SnapshotOrUpdateForStringAndOptionsSeriesInfo1(snapshot={self.snapshot})"
        )


Update1 = List[Union[str, Optional[OptionsSeriesInfo]]]


class SnapshotOrUpdateForStringAndOptionsSeriesInfo2(Struct, omit_defaults=True):
    updates: List[Update1]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        updates: List[Update1],
    ):
        return cls(
            updates,
        )

    def __str__(self) -> str:
        return f"SnapshotOrUpdateForStringAndOptionsSeriesInfo2(updates={self.updates})"


SnapshotOrUpdateForStringAndOptionsSeriesInfo = Union[
    SnapshotOrUpdateForStringAndOptionsSeriesInfo1,
    SnapshotOrUpdateForStringAndOptionsSeriesInfo2,
]


class SnapshotOrUpdateForStringAndSnapshotOrUpdateForStringAndProductCatalogInfo1(
    Struct
):
    snapshot: Dict[str, SnapshotOrUpdateForStringAndProductCatalogInfo]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        snapshot: Dict[str, SnapshotOrUpdateForStringAndProductCatalogInfo],
    ):
        return cls(
            snapshot,
        )

    def __str__(self) -> str:
        return f"SnapshotOrUpdateForStringAndSnapshotOrUpdateForStringAndProductCatalogInfo1(snapshot={self.snapshot})"


Update4 = List[Union[str, Optional[SnapshotOrUpdateForStringAndProductCatalogInfo]]]


class SnapshotOrUpdateForStringAndSnapshotOrUpdateForStringAndProductCatalogInfo2(
    Struct
):
    updates: List[Update4]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        updates: List[Update4],
    ):
        return cls(
            updates,
        )

    def __str__(self) -> str:
        return f"SnapshotOrUpdateForStringAndSnapshotOrUpdateForStringAndProductCatalogInfo2(updates={self.updates})"


SnapshotOrUpdateForStringAndSnapshotOrUpdateForStringAndProductCatalogInfo = Union[
    SnapshotOrUpdateForStringAndSnapshotOrUpdateForStringAndProductCatalogInfo1,
    SnapshotOrUpdateForStringAndSnapshotOrUpdateForStringAndProductCatalogInfo2,
]


class TwapParams(Struct, omit_defaults=True):
    dir: OrderDir
    end_time: datetime
    execution_venue: str
    interval: HumanDuration
    quantity: Decimal
    reject_lockout: HumanDuration
    symbol: str
    take_through_frac: Optional[Decimal] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        dir: OrderDir,
        end_time: datetime,
        execution_venue: str,
        interval: HumanDuration,
        quantity: Decimal,
        reject_lockout: HumanDuration,
        symbol: str,
        take_through_frac: Optional[Decimal] = None,
    ):
        return cls(
            dir,
            end_time,
            execution_venue,
            interval,
            quantity,
            reject_lockout,
            symbol,
            take_through_frac,
        )

    def __str__(self) -> str:
        return f"TwapParams(dir={self.dir},end_time={self.end_time},execution_venue={self.execution_venue},interval={self.interval},quantity={self.quantity},reject_lockout={self.reject_lockout},symbol={self.symbol},take_through_frac={self.take_through_frac})"


class Account(Struct, omit_defaults=True):
    id: str
    name: AccountName

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        id: str,
        name: AccountName,
    ):
        return cls(
            id,
            name,
        )

    def __str__(self) -> str:
        return f"Account(id={self.id},name={self.name})"


class FutureSpread(Struct, omit_defaults=True):
    legs: List[SpreadLeg]
    product_type: Literal["FutureSpread"]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        legs: List[SpreadLeg],
        product_type: Literal["FutureSpread"],
    ):
        return cls(
            legs,
            product_type,
        )

    def __str__(self) -> str:
        return f"FutureSpread(legs={self.legs},product_type={self.product_type})"


class SnapshotOrUpdateForStringAndExecutionInfo1(Struct, omit_defaults=True):
    snapshot: Dict[str, ExecutionInfo]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        snapshot: Dict[str, ExecutionInfo],
    ):
        return cls(
            snapshot,
        )

    def __str__(self) -> str:
        return f"SnapshotOrUpdateForStringAndExecutionInfo1(snapshot={self.snapshot})"


Update5 = List[Union[str, Optional[ExecutionInfo]]]


class SnapshotOrUpdateForStringAndExecutionInfo2(Struct, omit_defaults=True):
    updates: List[Update5]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        updates: List[Update5],
    ):
        return cls(
            updates,
        )

    def __str__(self) -> str:
        return f"SnapshotOrUpdateForStringAndExecutionInfo2(updates={self.updates})"


SnapshotOrUpdateForStringAndExecutionInfo = Union[
    SnapshotOrUpdateForStringAndExecutionInfo1,
    SnapshotOrUpdateForStringAndExecutionInfo2,
]


class Enumerated(Struct, omit_defaults=True):
    outcome: Outcome

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        outcome: Outcome,
    ):
        return cls(
            outcome,
        )

    def __str__(self) -> str:
        return f"Enumerated(outcome={self.outcome})"


class EventContractSeriesInstance1(Struct, omit_defaults=True):
    Enumerated: Enumerated

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        Enumerated: Enumerated,
    ):
        return cls(
            Enumerated,
        )

    def __str__(self) -> str:
        return f"EventContractSeriesInstance1(Enumerated={self.Enumerated})"


EventContractSeriesInstance = Union[
    EventContractSeriesInstance1, EventContractSeriesInstance2
]


class OptionsSeriesInstance(Struct, omit_defaults=True):
    """
    A specific option from a series.
    """

    expiration: datetime
    put_or_call: PutOrCall
    strike: Decimal

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        expiration: datetime,
        put_or_call: PutOrCall,
        strike: Decimal,
    ):
        return cls(
            expiration,
            put_or_call,
            strike,
        )

    def __str__(self) -> str:
        return f"OptionsSeriesInstance(expiration={self.expiration},put_or_call={self.put_or_call},strike={self.strike})"


class AccountWithPermissions(Struct, omit_defaults=True):
    account: Account
    permissions: AccountPermissions
    trader: UserId

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        account: Account,
        permissions: AccountPermissions,
        trader: UserId,
    ):
        return cls(
            account,
            permissions,
            trader,
        )

    def __str__(self) -> str:
        return f"AccountWithPermissions(account={self.account},permissions={self.permissions},trader={self.trader})"


class SnapshotOrUpdateForStringAndSnapshotOrUpdateForStringAndExecutionInfo1(
    Struct, omit_defaults=True
):
    snapshot: Dict[str, SnapshotOrUpdateForStringAndExecutionInfo]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        snapshot: Dict[str, SnapshotOrUpdateForStringAndExecutionInfo],
    ):
        return cls(
            snapshot,
        )

    def __str__(self) -> str:
        return f"SnapshotOrUpdateForStringAndSnapshotOrUpdateForStringAndExecutionInfo1(snapshot={self.snapshot})"


Update3 = List[Union[str, Optional[SnapshotOrUpdateForStringAndExecutionInfo]]]


class SnapshotOrUpdateForStringAndSnapshotOrUpdateForStringAndExecutionInfo2(
    Struct, omit_defaults=True
):
    updates: List[Update3]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        updates: List[Update3],
    ):
        return cls(
            updates,
        )

    def __str__(self) -> str:
        return f"SnapshotOrUpdateForStringAndSnapshotOrUpdateForStringAndExecutionInfo2(updates={self.updates})"


SnapshotOrUpdateForStringAndSnapshotOrUpdateForStringAndExecutionInfo = Union[
    SnapshotOrUpdateForStringAndSnapshotOrUpdateForStringAndExecutionInfo1,
    SnapshotOrUpdateForStringAndSnapshotOrUpdateForStringAndExecutionInfo2,
]


class Option(Struct, omit_defaults=True):
    instance: OptionsSeriesInstance
    product_type: Literal["Option"]
    series: str

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        instance: OptionsSeriesInstance,
        product_type: Literal["Option"],
        series: str,
    ):
        return cls(
            instance,
            product_type,
            series,
        )

    def __str__(self) -> str:
        return f"Option(instance={self.instance},product_type={self.product_type},series={self.series})"


class EventContract(Struct, omit_defaults=True):
    instance: EventContractSeriesInstance
    product_type: Literal["EventContract"]
    series: str

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        instance: EventContractSeriesInstance,
        product_type: Literal["EventContract"],
        series: str,
    ):
        return cls(
            instance,
            product_type,
            series,
        )

    def __str__(self) -> str:
        return f"EventContract(instance={self.instance},product_type={self.product_type},series={self.series})"


ProductType = Union[
    Fiat,
    Commodity,
    Crypto,
    Equity,
    Index,
    Future,
    FutureSpread,
    Perpetual,
    Option,
    EventContract,
    Unknown,
]


class ProductInfo(Struct, omit_defaults=True):
    product_type: ProductType
    price_display_format: Optional[PriceDisplayFormat] = None
    primary_venue: Optional[str] = None

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        product_type: ProductType,
        price_display_format: Optional[PriceDisplayFormat] = None,
        primary_venue: Optional[str] = None,
    ):
        return cls(
            product_type,
            price_display_format,
            primary_venue,
        )

    def __str__(self) -> str:
        return f"ProductInfo(product_type={self.product_type},price_display_format={self.price_display_format},primary_venue={self.primary_venue})"


class SnapshotOrUpdateForStringAndProductInfo1(Struct, omit_defaults=True):
    snapshot: Dict[str, ProductInfo]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        snapshot: Dict[str, ProductInfo],
    ):
        return cls(
            snapshot,
        )

    def __str__(self) -> str:
        return f"SnapshotOrUpdateForStringAndProductInfo1(snapshot={self.snapshot})"


Update2 = List[Union[str, Optional[ProductInfo]]]


class SnapshotOrUpdateForStringAndProductInfo2(Struct, omit_defaults=True):
    updates: List[Update2]

    # Constructor that takes all field titles as arguments for convenience
    @classmethod
    def new(
        cls,
        updates: List[Update2],
    ):
        return cls(
            updates,
        )

    def __str__(self) -> str:
        return f"SnapshotOrUpdateForStringAndProductInfo2(updates={self.updates})"


SnapshotOrUpdateForStringAndProductInfo = Union[
    SnapshotOrUpdateForStringAndProductInfo1, SnapshotOrUpdateForStringAndProductInfo2
]
