return {
    -- No auto-scheduler on purpose: a drop only happens when a crew runs the full relay intrusion
    -- (breach -> calldrop) or an admin forces one via /deaddrop_start.

    -- Drop intel visibility. false (default) = PRIVATE: only the triggering crew and snitch buyers
    -- get the search-circle map mark. true = everyone is marked the moment a drop is called. The
    -- plane, descent and containers stay world-visible either way; this gates only the map blip.
    PublicDropIntel = false,

    -- Containers per drop, randomised Min..Max (no player scaling).
    Containers = {
        Min = 2,
        Max = 3,
        -- Minimum metres between any two container landing spots. The picker prefers curated
        -- DropZones at least this far apart; if the pool can't satisfy it, the farthest-spread
        -- spot is used instead (best effort, logged). 0 = off: the anchor's nearest spots (compact drop).
        MinDistance = 500,
    },

    -- Breach pacing. One base-game synced scene (Tuners train robbery): the ped saws the lock off
    -- and the doors swing open. Single-person - parallelism comes from multiple containers.
    Breach = {
        BreachTime = 10000, -- ms for the breach scene; matches the clip length (DON'T TOUCH unless you change the anim)

        -- Tool required to breach, checked client-side AND re-checked server-side (so calling the
        -- callbacks directly can't skip it). false/nil = no tool required.
        RequiredItem = 'powersaw',

        -- Label in the "you don't have a ___ on you" refusal; nil/blank falls back to the item's
        -- ox_inventory label, then the raw item name.
        RequiredItemLabel = 'Power Saw',

        NameRequiredItem = false, -- true = the refusal names the item; false = generic "nothing to break the lock with"

        -- What happens to RequiredItem after a successful breach. Pick exactly ONE Mode:
        --   'off' = untouched, 'durability' = docks Durability points off metadata.durability
        --   (0..100, shown as the icon's wear bar), 'remove' = always consumed, 'chance' =
        --   BreakChance odds it's consumed.
        Wear = {
            Mode = 'durability',
            Durability = 10, -- 'durability' mode: points docked per breach
            BreakChance = 0.33, -- 'chance' mode: 0..1 odds the tool breaks on a successful breach
            -- 'durability' mode only: true = remove the tool the moment it hits 0 (with a "broke"
            -- notification); false = it stays at 0% and is refused as broken.
            RemoveAtZero = false,
        },
    },

    -- Phase pacing: seconds the event sits in each lead-in phase before auto-advancing.
    -- /deaddrop_advance bypasses these for instant manual stepping.
    Phases = {
        LeadSeconds = 200, -- SCHEDULED: signal out -> plane launches
        FlightSeconds = 120, -- INBOUND: corridor flight to the drop point
        DropSeconds = 110, -- DROPPING: package glide time (fall speed follows from World.Drop.Altitude)
        SettleSeconds = 15, -- ON_GROUND dwell before the ContestSeconds clock arms (breaching/looting is already allowed)
        ResolveSeconds = 8, -- RESOLVING dwell: how long the finished site still stands before the cleanup broadcast wipes it
    },

    -- Timers (seconds unless noted).
    ContestSeconds = 20 * 60, -- max CONTESTED lifetime before the event abandons and cleans up
    CooldownSeconds = 5 * 60, -- COOLDOWN dwell: how long the finished event RECORD lingers before IDLE/teardown (the physical site + rivals are already cleared at resolve)
    CooldownMinutes = 30, -- global drop lockout (minutes) after a resolve; relays show "high security" until it elapses
    ContainerCleanupSeconds = 180, -- delay before a fully-looted (EMPTY) box is deleted

    -- Entity time-to-live watchdog: anything older than this is nuked even if the state machine
    -- wedged. Keep comfortably above ContestSeconds.
    EntityTTLSeconds = 40 * 60,
}
