"""HYPOTHESIS: FUN_1800f7c40 references BOTH FUT::SeasonsManagerOfflineHelper and
FUT::SeasonsManagerOnlineHelper (and the Competition pair), so it is the place that
CHOOSES online vs offline behaviour -- i.e. it contains the client's own notion of
"am I online for FUT". FUN_1800b2680 owns the GOTO_ONLINE_SEASON / GOTO_OFFLINE_SEASON
navigation names and should gate them on the same predicate.

CONTROL: FUN_18006cc60 was already proven (query 2) to be a name-publisher whose values
come from model vtable slots. If FUN_1800b2680 turns out to publish names the same way,
the shape is the proven one, not an assumed one. I also print FUN_1800a6680
(IS_MODE_ONLINE) whose online/offline split is known from its literals, as a second
same-shape reference point.

Full source printed, length reported, never truncated.
"""
import traceback

try:
    TARGETS = [
        ("helper factory FUN_1800f7c40", 0x1800f7c40),
        ("nav names FUN_1800b2680", 0x1800b2680),
        ("draft hub FUN_1800a6680", 0x1800a6680),
        ("seasons offline helper FUN_1801012c0", 0x1801012c0),
        ("seasons online helper FUN_1801014c0", 0x1801014c0),
    ]
    for label, a in TARGETS:
        src = dec(a)
        f = func(a)
        print("\n" + "=" * 78)
        print("### %s entry=%#x len(src)=%d" % (
            label, int(f.getEntryPoint().getOffset()) if f else 0, len(src)))
        print("=" * 78)
        print(src)
except Exception:
    traceback.print_exc()
