"""HYPOTHESIS (Q3): the market refusal and the Seasons refusal are both taken BEFORE any request is built, so the gate must sit in a caller of the request builder. Walking up from the route literal "/transfermarket?..." and from the seasons route literals should expose the predicate, and if the two chains share a callee that predicate is the shared term. CONTROL: the SAME walk is run for routes we KNOW the client does issue this session (/item, /squad/). If the walk produces a plausible-looking "gate" for a route that demonstrably fires, the walk proves nothing and I say so. Form-independent: Ghidra refs AND a raw rip-relative disp32 scan over all of .text. """ import struct, traceback try: ts = te = None for b in mem.getBlocks(): if str(b.getName()) == ".text": ts, te = int(b.getStart().getOffset()), int(b.getEnd().getOffset()) text = b"" a = ts while a <= te: n = min(1 << 20, te - a + 1) text += read_bytes(a, n) a += n print("len(.text)=%d base=%#x" % (len(text), ts)) def rip_refs(va): out = [] for i in range(0, len(text) - 4): d = struct.unpack_from("