868 lines · 150 KB
Raw Download
1
<?php
2
// AUTO-GENERATED at Sunday, July 19, 2026, 1:30:10 PM CDT
3
header("Cache-Control: public, max-age=300");
4
?>
5
<!DOCTYPE html>
6
<html lang="en">
7
<head>
8
<meta charset="UTF-8">
9
<meta name="viewport" content="width=device-width, initial-scale=1.0">
10
<meta name="description" content="Catch up on your local pro teams in seconds. See recent game results and upcoming games over the next two weeks—all in one place.">
11
<title>Casual Fan Sports Report</title>
12
<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96" />
13
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
14
<link rel="shortcut icon" href="/favicon.ico" />
15
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
16
<meta name="apple-mobile-web-app-title" content="Casual Fan Sports Report" />
17
<link rel="manifest" href="/site.webmanifest" />
18
<style>
19
    :root {
20
        color-scheme: dark light;
21
        --bg-color: #f8fafc;
22
        --card-bg: #ffffff;
23
        --text-primary: #0f172a;
24
        --text-secondary: #475569;
25
        --border: #e2e8f0;
26
        --radius: 8px;
27
        --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
28
        
29
        --upcoming-bg: #f0f9ff;
30
        --upcoming-border: #bae6fd;
31
        --win-bg: #f0fdf4;
32
        --win-border: #bbf7d0;
33
        --loss-bg: #fef2f2;
34
        --loss-border: #fecaca;
35
        --neutral-bg: #fefce8;
36
        --neutral-border: #fde68a;
37
    }
38
39
    @media (prefers-color-scheme: dark) {
40
        :root {
41
            --bg-color: #0f172a;
42
            --card-bg: #1e293b;
43
            --text-primary: #f8fafc;
44
            --text-secondary: #bccbe1;
45
            --border: #334155;
46
            --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.5);
47
            
48
            --upcoming-bg: #082f49;
49
            --upcoming-border: #0369a1;
50
            --win-bg: #14532d;
51
            --win-border: #166534;
52
            --loss-bg: #7f1d1d;
53
            --loss-border: #991b1b;
54
            --neutral-bg: #422006;
55
            --neutral-border: #a16207;
56
        }
57
    }
58
59
    body {
60
        font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
61
        background-color: var(--bg-color);
62
        color: var(--text-primary);
63
        line-height: 1.3;
64
        margin: 0;
65
        padding: 0.75rem 0.75rem 1.5rem;
66
        font-size: 15px;
67
    }
68
    .container { max-width: 650px; margin: 0 auto; }
69
    h1 { font-size: 1.25rem; font-weight: 800; letter-spacing: -0.025em; margin: 0 0 0.5rem 0; }
70
71
    .selector-wrapper {
72
        background: var(--card-bg); padding: 0.5rem 0.625rem; border-radius: var(--radius);
73
        border: 1px solid var(--border); box-shadow: var(--shadow);
74
        margin-bottom: 0.75rem; display: flex; flex-direction: row; align-items: center; gap: 0.5rem;
75
    }
76
    label { font-weight: 600; font-size: 0.7rem; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 0.05em; white-space: nowrap; }
77
    select {
78
        padding: 0.3rem 0.4rem; border-radius: 6px; border: 1px solid var(--border);
79
        background-color: var(--card-bg); font-size: 0.9rem; color: var(--text-primary);
80
        width: 100%; cursor: pointer;
81
    }
82
    .selector-wrapper select { flex: 1; width: auto; min-width: 0; }
83
    .selector-wrapper .toggle-editor-btn { flex-shrink: 0; }
84
85
    h2 {
86
        font-size: 0.7rem; color: var(--text-secondary); margin: 0.6rem 0 0.3rem 0;
87
        text-transform: uppercase; letter-spacing: 0.05em; border-bottom: 1px solid var(--border);
88
        padding-bottom: 0.15rem;
89
    }
90
    h2:first-child { margin-top: 0; }
91
    .game-card {
92
        background: var(--card-bg); padding: 0.35rem 0.6rem; border-radius: 6px;
93
        border: 1px solid var(--border); margin-bottom: 0.3rem;
94
        display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 0.4rem;
95
        font-size: 0.85rem;
96
    }
97
    
98
    .game-card.upcoming { background: var(--upcoming-bg); border-color: var(--upcoming-border); }
99
    .game-card.win { background: var(--win-bg); border-color: var(--win-border); }
100
    .game-card.loss { background: var(--loss-bg); border-color: var(--loss-border); }
101
    .game-card.tie,
102
    .game-card.postponed,
103
    .game-card.both-sides { background: var(--neutral-bg); border-color: var(--neutral-border); }
104
105
    /* Dates carry a "time ago" tooltip on hover; on touch, tap to reveal it */
106
    .game-date, .event-date-inner, #scores-updated-ts, #page-loaded-line {
107
        cursor: help; border-bottom: 1px dotted var(--border);
108
    }
109
    /* While a date is tapped-open showing its relative time */
110
    .game-date.rel-open, .event-date-inner.rel-open,
111
    #scores-updated-ts.rel-open, #page-loaded-line.rel-open {
112
        color: var(--text-primary); font-style: italic;
113
    }
114
    
115
    /* Live Game Styles */
116
    .game-card.live { background: #fff1f2; border-color: #fecdd3; border-left: 3px solid #e11d48; }
117
    @media (prefers-color-scheme: dark) {
118
        .game-card.live { background: #4c0519; border-color: #881337; border-left: 3px solid #f43f5e; }
119
    }
120
    .live-indicator { 
121
        color: #e11d48; font-weight: 700; font-size: 0.72rem; text-transform: uppercase; 
122
        letter-spacing: 0.05em; animation: pulse 2s infinite; display: inline-block; margin-right: 0.35rem;
123
    }
124
    @media (prefers-color-scheme: dark) { .live-indicator { color: #f43f5e; } }
125
    @keyframes pulse { 0% { opacity: 1; } 50% { opacity: 0.5; } 100% { opacity: 1; } }
126
    
127
    .game-card strong { color: var(--text-primary); font-weight: 600; }
128
    .game-details { color: var(--text-secondary); }
129
    .no-results { color: var(--text-secondary); font-style: italic; padding: 0.15rem 0; margin: 0 0 0.3rem 0; font-size: 0.85rem; }
130
    
131
    .timestamp-block {
132
        display: grid; grid-template-columns: auto auto; gap: 0.15rem 0.4rem;
133
        justify-content: center; margin-top: 1rem;
134
        font-size: 0.7rem; color: var(--text-secondary);
135
    }
136
    .timestamp-block .ts-label { text-align: right; }
137
    .timestamp-block .ts-value { text-align: left; }
138
    .update-schedule { font-size: 0.7rem; color: var(--text-secondary); text-align: center; margin-top: 0.5rem; }
139
140
    /* Major events (Super Bowl, Finals, World Cup, etc.) */
141
    .major-events { margin-top: 0.75rem; }
142
    .major-event-card {
143
        background: var(--card-bg); padding: 0.45rem 0.65rem; border-radius: 6px;
144
        border: 1px solid var(--border); margin-bottom: 0.3rem; font-size: 0.85rem;
145
        border-left: 3px solid #eab308;
146
    }
147
    .major-event-card .event-label {
148
        font-weight: 700; text-transform: uppercase; font-size: 0.65rem;
149
        letter-spacing: 0.05em; color: #b45309; display: block; margin-bottom: 0.15rem;
150
    }
151
    .major-event-card .matchup { color: var(--text-primary); font-weight: 600; }
152
    .major-event-card .matchup .winner { color: #15803d; }
153
    .major-event-card .event-date { color: var(--text-secondary); font-size: 0.75rem; margin-left: 0.35rem; }
154
155
    /* Customize panel */
156
    .customize-panel {
157
        background: var(--card-bg); padding: 0.6rem 0.65rem; border-radius: var(--radius);
158
        border: 1px solid var(--border); box-shadow: var(--shadow); margin-bottom: 0.75rem;
159
    }
160
    .toggle-editor-btn {
161
        padding: 0.3rem 0.55rem; border-radius: 6px; border: 1px solid var(--border);
162
        background-color: var(--bg-color); color: var(--text-primary); font-size: 0.72rem;
163
        cursor: pointer; white-space: nowrap; font-weight: 600;
164
    }
165
    .toggle-editor-btn:hover { background-color: var(--border); }
166
    .customize-panel .customize-row {
167
        display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem;
168
    }
169
    .customize-search {
170
        flex: 1; padding: 0.35rem 0.5rem; border-radius: 6px; border: 1px solid var(--border);
171
        background-color: var(--bg-color); color: var(--text-primary); font-size: 0.85rem;
172
    }
173
    .select-all-btn {
174
        padding: 0.35rem 0.6rem; border-radius: 6px; border: 1px solid var(--border);
175
        background-color: var(--bg-color); color: var(--text-primary); font-size: 0.75rem;
176
        cursor: pointer; white-space: nowrap; font-weight: 600;
177
    }
178
    .select-all-btn:hover { background-color: var(--border); }
179
    .team-checklist {
180
        max-height: 260px; overflow-y: auto; border: 1px solid var(--border);
181
        border-radius: 6px; padding: 0.35rem 0.5rem;
182
    }
183
    .league-group-header {
184
        position: sticky; top: 0; z-index: 1; background: var(--card-bg);
185
        font-weight: 700; font-size: 0.68rem; color: var(--text-secondary);
186
        text-transform: uppercase; letter-spacing: 0.06em; margin: 0 0 0.2rem 0;
187
        padding: 0.4rem 0 0.15rem 0; border-bottom: 1px solid var(--border);
188
    }
189
    .league-group-header:first-child { padding-top: 0.1rem; }
190
    .league-group-header.hidden { display: none; }
191
    .team-check-item {
192
        display: flex; align-items: center; gap: 0.4rem; padding: 0.2rem 0;
193
        font-size: 0.82rem;
194
    }
195
    .team-check-item input { cursor: pointer; }
196
    .team-check-item label { text-transform: none; font-weight: 400; font-size: 0.82rem; color: var(--text-primary); cursor: pointer; display: flex; align-items: baseline; gap: 0.35rem; }
197
    .team-check-item .team-city-tag {
198
        font-size: 0.68rem; color: var(--text-secondary); font-weight: 400;
199
    }
200
    .team-check-item.hidden { display: none; }
201
    .customize-empty-hint { font-size: 0.75rem; color: var(--text-secondary); font-style: italic; padding: 0.3rem 0; }
202
203
    .stale-banner {
204
        background: var(--neutral-bg); border: 1px solid var(--neutral-border);
205
        color: var(--text-primary); border-radius: var(--radius);
206
        padding: 0.5rem 0.7rem; margin-bottom: 0.75rem; font-size: 0.85rem;
207
    }
208
    .stale-banner a { color: var(--text-primary); font-weight: 600; }
209
    .stale-banner a:hover { text-decoration: none; }
210
211
    @media (max-width: 480px) {
212
        body { padding: 0.5rem 0.5rem 1rem; font-size: 14px; }
213
        h1 { font-size: 1.1rem; }
214
        .game-card { font-size: 0.8rem; padding: 0.3rem 0.5rem; }
215
        h3 { font-size: 0.65rem; }
216
    }
217
</style>
218
</head>
219
<body>
220
221
<main class="container">
222
    <h1>Casual Fan Sports Report</h1>
223
224
    <div id="stale-banner" class="stale-banner" hidden>
225
        New data is available. <a href="#" id="stale-refresh-link">Refresh to see the latest scores</a>.
226
    </div>
227
228
    <div class="selector-wrapper">
229
        <label for="city">City</label>
230
        <select id="city">
231
                <option value="newyork_newengland">New York &amp; New England</option>
232
                <option value="mid_atlantic">Mid-Atlantic</option>
233
                <option value="southeast">Southeast</option>
234
                <option value="florida">Florida</option>
235
                <option value="great_lakes">Great Lakes &amp; Ohio Valley</option>
236
                <option value="chicago_wisconsin" selected>Chicago &amp; Wisconsin</option>
237
                <option value="upper_midwest">Upper Midwest</option>
238
                <option value="midwest_central">Mid-Central Plains</option>
239
                <option value="texas_oklahoma">Texas &amp; Oklahoma</option>
240
                <option value="mountain_west">Mountain West &amp; Southwest</option>
241
                <option value="southern_california">Southern California</option>
242
                <option value="northern_california">Northern California</option>
243
                <option value="pacific_northwest">Pacific Northwest</option>
244
                <option value="western_canada">Western Canada</option>
245
                <option value="eastern_canada">Eastern Canada</option>
246
                <option value="all">All Cities</option>
247
                <option value="__custom__">Customize&hellip;</option>
248
249
        </select>
250
        <button type="button" id="toggle-customize-editor" class="toggle-editor-btn" hidden>Edit teams</button>
251
    </div>
252
253
    <div id="customize-panel" class="customize-panel" hidden>
254
        <div class="customize-row">
255
            <input type="text" id="team-search" class="customize-search" placeholder="Search teams, leagues, or cities (e.g. &quot;NBA&quot;, &quot;Bears&quot;, &quot;Chicago&quot;)">
256
            <button type="button" id="select-all-shown" class="select-all-btn">Select all shown</button>
257
        </div>
258
        <div id="team-checklist" class="team-checklist"></div>
259
    </div>
260
261
    <div id="results-container"></div>
262
263
    <div class="timestamp-block">
264
        <div class="ts-label">Scores last updated:</div>
265
        <div class="ts-value"><span id="scores-updated-ts">Sunday, July 19, 2026, 1:30:10 PM CDT</span></div>
266
        <div class="ts-label">Page loaded:</div>
267
        <div class="ts-value"><span id="page-loaded-line"></span></div>
268
    </div>
269
    <div class="update-schedule">Live scores updated every 30 minutes, Results updated every 2 hours.</div>
270
271
</main>
272
273
<script>
274
    const sportsData = {"newyork_newengland":{"label":"New York \u0026 New England","is_all":false,"leagues":{"WNBA":{"latest_timestamp":1784419200,"live":[],"games":[{"timestamp":1784419200,"team_name":"Liberty","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Indiana Fever","team_score":"88","opp_score":"108","date_str":"Yesterday","date_raw":"2026-07-19T00:00Z","game_id":"401857077"},{"timestamp":1784340000,"team_name":"Sun","label":"Basketball","outcome":"Won","vsAt":"@","opponent":"Phoenix Mercury","team_score":"96","opp_score":"83","date_str":"2 days ago","date_raw":"2026-07-18T02:00Z","game_id":"401857076"},{"timestamp":1784041200,"team_name":"Sun","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Portland Fire","team_score":"90","opp_score":"87","date_str":"Jul 14","date_raw":"2026-07-14T15:00Z","game_id":"401857066"},{"timestamp":1783882800,"team_name":"Liberty","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Toronto Tempo","team_score":"91","opp_score":"93","date_str":"Jul 12","date_raw":"2026-07-12T19:00Z","game_id":"401857060"}],"upcoming":[{"timestamp":1784502000,"team_name":"Sun","label":"Basketball","vsAt":"@","opponent":"Phoenix Mercury","date_str":"Today, 6:00 PM","date_raw":"2026-07-19T23:00Z","game_id":"401857082"},{"timestamp":1784592000,"team_name":"Liberty","label":"Basketball","vsAt":"@","opponent":"Dallas Wings","date_str":"Tomorrow, 7:00 PM","date_raw":"2026-07-21T00:00Z","game_id":"401892393"}]},"MLB":{"latest_timestamp":1784405400,"live":[{"timestamp":1784478900,"team_name":"Yankees","label":"MLB","outcome":"live","live_status":"Losing","team_score":1,"opp_score":3,"vsAt":"vs","opponent":"Los Angeles Dodgers","progress":"Top 7th","date_raw":"2026-07-19T16:35Z","game_id":"401897386"},{"timestamp":1784482500,"team_name":"Mets","label":"MLB","outcome":"live","live_status":"Winning","team_score":5,"opp_score":0,"vsAt":"@","opponent":"Philadelphia Phillies","progress":"Bottom 3rd","date_raw":"2026-07-19T17:35Z","game_id":"401816173"},{"timestamp":1784482500,"team_name":"Red Sox","label":"MLB","outcome":"live","live_status":"Tied","team_score":1,"opp_score":1,"vsAt":"vs","opponent":"Tampa Bay Rays","progress":"Top 3rd","date_raw":"2026-07-19T17:35Z","game_id":"401816175"}],"games":[{"timestamp":1784405400,"team_name":"Red Sox","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Tampa Bay Rays","team_score":"7","opp_score":"6","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816160"},{"timestamp":1784401500,"team_name":"Mets","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Philadelphia Phillies","team_score":"1","opp_score":"6","date_str":"Yesterday","date_raw":"2026-07-18T19:05Z","game_id":"401816158"},{"timestamp":1784329800,"team_name":"Red Sox","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Tampa Bay Rays","team_score":"5","opp_score":"3","date_str":"2 days ago","date_raw":"2026-07-17T23:10Z","game_id":"401816145"},{"timestamp":1784329500,"team_name":"Yankees","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Los Angeles Dodgers","team_score":"1","opp_score":"2","date_str":"2 days ago","date_raw":"2026-07-17T23:05Z","game_id":"401816142"},{"timestamp":1784239200,"team_name":"Mets","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Philadelphia Phillies","team_score":"4","opp_score":"1","date_str":"Jul 16","date_raw":"2026-07-16T22:00Z","game_id":"401816143"},{"timestamp":1783877700,"team_name":"Yankees","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Washington Nationals","team_score":"5","opp_score":"3","date_str":"Jul 12","date_raw":"2026-07-12T17:35Z","game_id":"401816131"}],"upcoming":[{"timestamp":1784589000,"team_name":"Red Sox","label":"Baseball","vsAt":"vs","opponent":"Baltimore Orioles","date_str":"Tomorrow, 6:10 PM","date_raw":"2026-07-20T23:10Z","game_id":"401816186"},{"timestamp":1784590800,"team_name":"Mets","label":"Baseball","vsAt":"@","opponent":"Milwaukee Brewers","date_str":"Tomorrow, 6:40 PM","date_raw":"2026-07-20T23:40Z","game_id":"401816195"}]},"FIFA":{"latest_timestamp":1783382400,"live":[],"games":[{"timestamp":1783382400,"team_name":"USA","label":"World Cup Round of 16","outcome":"Lost","vsAt":"vs","opponent":"Belgium","team_score":"1","opp_score":"4","date_str":"Jul 6","date_raw":"2026-07-07T00:00Z","game_id":"760507"},{"timestamp":1782950400,"team_name":"USA","label":"World Cup Round of 32","outcome":"Won","vsAt":"vs","opponent":"Bosnia-Herzegovina","team_score":"2","opp_score":"0","date_str":"Jul 1","date_raw":"2026-07-02T00:00Z","game_id":"760494"}],"upcoming":[]},"NFL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NBA":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NHL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAM":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAW":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]}}},"mid_atlantic":{"label":"Mid-Atlantic","is_all":false,"leagues":{"MLB":{"latest_timestamp":1784426700,"live":[{"timestamp":1784482500,"team_name":"Phillies","label":"MLB","outcome":"live","live_status":"Losing","team_score":0,"opp_score":5,"vsAt":"vs","opponent":"New York Mets","progress":"Bottom 3rd","date_raw":"2026-07-19T17:35Z","game_id":"401816173"},{"timestamp":1784482800,"team_name":"Pirates","label":"MLB","outcome":"live","live_status":"Tied","team_score":1,"opp_score":1,"vsAt":"@","opponent":"Cleveland Guardians","progress":"Bottom 3rd","date_raw":"2026-07-19T17:40Z","game_id":"401816174"},{"timestamp":1784484600,"team_name":"Orioles","label":"MLB","outcome":"live","live_status":"Tied","team_score":0,"opp_score":0,"vsAt":"@","opponent":"Houston Astros","progress":"Top 2nd","date_raw":"2026-07-19T18:10Z","game_id":"401816177"}],"games":[{"timestamp":1784426700,"team_name":"Nationals","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Athletics","team_score":"1","opp_score":"15","date_str":"Yesterday","date_raw":"2026-07-19T02:05Z","game_id":"401816170"},{"timestamp":1784416200,"team_name":"Pirates","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Cleveland Guardians","team_score":"3","opp_score":"5","date_str":"Yesterday","date_raw":"2026-07-18T23:10Z","game_id":"401816159"},{"timestamp":1784405400,"team_name":"Orioles","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Houston Astros","team_score":"4","opp_score":"2","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816162"},{"timestamp":1784401500,"team_name":"Phillies","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"New York Mets","team_score":"6","opp_score":"1","date_str":"Yesterday","date_raw":"2026-07-18T19:05Z","game_id":"401816158"},{"timestamp":1784394600,"team_name":"Pirates","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Cleveland Guardians","team_score":"7","opp_score":"1","date_str":"Yesterday","date_raw":"2026-07-18T17:10Z","game_id":"401896568"},{"timestamp":1784338800,"team_name":"Nationals","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Athletics","team_score":"23","opp_score":"4","date_str":"2 days ago","date_raw":"2026-07-18T01:40Z","game_id":"401816155"},{"timestamp":1784333400,"team_name":"Orioles","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Houston Astros","team_score":"3","opp_score":"2","date_str":"2 days ago","date_raw":"2026-07-18T00:10Z","game_id":"401816147"},{"timestamp":1784239200,"team_name":"Phillies","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"New York Mets","team_score":"1","opp_score":"4","date_str":"Jul 16","date_raw":"2026-07-16T22:00Z","game_id":"401816143"}],"upcoming":[{"timestamp":1784491500,"team_name":"Nationals","label":"Baseball","vsAt":"@","opponent":"Athletics","date_str":"Today, 3:05 PM","date_raw":"2026-07-19T20:05Z","game_id":"401816185"},{"timestamp":1784588400,"team_name":"Phillies","label":"Baseball","vsAt":"vs","opponent":"Los Angeles Dodgers","date_str":"Tomorrow, 6:00 PM","date_raw":"2026-07-20T23:00Z","game_id":"401816187"},{"timestamp":1784588700,"team_name":"Pirates","label":"Baseball","vsAt":"@","opponent":"New York Yankees","date_str":"Tomorrow, 6:05 PM","date_raw":"2026-07-20T23:05Z","game_id":"401816189"}]},"WNBA":{"latest_timestamp":1784421000,"live":[],"games":[{"timestamp":1784421000,"team_name":"Mystics","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Golden State Valkyries","team_score":"69","opp_score":"74","date_str":"Yesterday","date_raw":"2026-07-19T00:30Z","game_id":"401857079"},{"timestamp":1784242800,"team_name":"Mystics","label":"Basketball","outcome":"Lost","vsAt":"vs","opponent":"Portland Fire","team_score":"56","opp_score":"75","date_str":"Jul 16","date_raw":"2026-07-16T23:00Z","game_id":"401857071"}],"upcoming":[{"timestamp":1784599200,"team_name":"Mystics","label":"Basketball","vsAt":"@","opponent":"Golden State Valkyries","date_str":"Tomorrow, 9:00 PM","date_raw":"2026-07-21T02:00Z","game_id":"401857084"}]},"FIFA":{"latest_timestamp":1783382400,"live":[],"games":[{"timestamp":1783382400,"team_name":"USA","label":"World Cup Round of 16","outcome":"Lost","vsAt":"vs","opponent":"Belgium","team_score":"1","opp_score":"4","date_str":"Jul 6","date_raw":"2026-07-07T00:00Z","game_id":"760507"},{"timestamp":1782950400,"team_name":"USA","label":"World Cup Round of 32","outcome":"Won","vsAt":"vs","opponent":"Bosnia-Herzegovina","team_score":"2","opp_score":"0","date_str":"Jul 1","date_raw":"2026-07-02T00:00Z","game_id":"760494"}],"upcoming":[]},"NFL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NBA":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NHL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAM":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAW":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]}}},"southeast":{"label":"Southeast","is_all":false,"leagues":{"MLB":{"latest_timestamp":1784405400,"live":[{"timestamp":1784482500,"team_name":"Braves","label":"MLB","outcome":"live","live_status":"Winning","team_score":3,"opp_score":0,"vsAt":"vs","opponent":"Texas Rangers","progress":"Top 4th","date_raw":"2026-07-19T17:35Z","game_id":"401816176"}],"games":[{"timestamp":1784405400,"team_name":"Braves","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Texas Rangers","team_score":"6","opp_score":"7","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816161"},{"timestamp":1784330100,"team_name":"Braves","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Texas Rangers","team_score":"15","opp_score":"1","date_str":"2 days ago","date_raw":"2026-07-17T23:15Z","game_id":"401816146"}],"upcoming":[{"timestamp":1784589300,"team_name":"Braves","label":"Baseball","vsAt":"vs","opponent":"San Diego Padres","date_str":"Tomorrow, 6:15 PM","date_raw":"2026-07-20T23:15Z","game_id":"401816190"}]},"WNBA":{"latest_timestamp":1784331000,"live":[],"games":[{"timestamp":1784331000,"team_name":"Dream","label":"Basketball","outcome":"Won","vsAt":"@","opponent":"Toronto Tempo","team_score":"111","opp_score":"92","date_str":"2 days ago","date_raw":"2026-07-17T23:30Z","game_id":"401857074"},{"timestamp":1783983600,"team_name":"Dream","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Los Angeles Sparks","team_score":"101","opp_score":"92","date_str":"Jul 13","date_raw":"2026-07-13T23:00Z","game_id":"401857064"}],"upcoming":[{"timestamp":1784491200,"team_name":"Dream","label":"Basketball","vsAt":"vs","opponent":"Chicago Sky","date_str":"Today, 3:00 PM","date_raw":"2026-07-19T20:00Z","game_id":"401857081"}]},"FIFA":{"latest_timestamp":1783382400,"live":[],"games":[{"timestamp":1783382400,"team_name":"USA","label":"World Cup Round of 16","outcome":"Lost","vsAt":"vs","opponent":"Belgium","team_score":"1","opp_score":"4","date_str":"Jul 6","date_raw":"2026-07-07T00:00Z","game_id":"760507"},{"timestamp":1782950400,"team_name":"USA","label":"World Cup Round of 32","outcome":"Won","vsAt":"vs","opponent":"Bosnia-Herzegovina","team_score":"2","opp_score":"0","date_str":"Jul 1","date_raw":"2026-07-02T00:00Z","game_id":"760494"}],"upcoming":[]},"NFL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NBA":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NHL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAM":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAW":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]}}},"florida":{"label":"Florida","is_all":false,"leagues":{"MLB":{"latest_timestamp":1784405400,"live":[{"timestamp":1784482500,"team_name":"Rays","label":"MLB","outcome":"live","live_status":"Tied","team_score":1,"opp_score":1,"vsAt":"@","opponent":"Boston Red Sox","progress":"Top 3rd","date_raw":"2026-07-19T17:35Z","game_id":"401816175"},{"timestamp":1784484600,"team_name":"Marlins","label":"MLB","outcome":"live","live_status":"Tied","team_score":0,"opp_score":0,"vsAt":"@","opponent":"Milwaukee Brewers","progress":"Top 2nd","date_raw":"2026-07-19T18:10Z","game_id":"401816178"}],"games":[{"timestamp":1784405400,"team_name":"Marlins","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Milwaukee Brewers","team_score":"6","opp_score":"8","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816163"},{"timestamp":1784405400,"team_name":"Rays","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Boston Red Sox","team_score":"6","opp_score":"7","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816160"},{"timestamp":1784331600,"team_name":"Marlins","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Milwaukee Brewers","team_score":"1","opp_score":"2","date_str":"2 days ago","date_raw":"2026-07-17T23:40Z","game_id":"401816148"},{"timestamp":1784329800,"team_name":"Rays","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Boston Red Sox","team_score":"3","opp_score":"5","date_str":"2 days ago","date_raw":"2026-07-17T23:10Z","game_id":"401816145"}],"upcoming":[{"timestamp":1784588820,"team_name":"Rays","label":"Baseball","vsAt":"@","opponent":"Toronto Blue Jays","date_str":"Tomorrow, 6:07 PM","date_raw":"2026-07-20T23:07Z","game_id":"401816191"}]},"FIFA":{"latest_timestamp":1783382400,"live":[],"games":[{"timestamp":1783382400,"team_name":"USA","label":"World Cup Round of 16","outcome":"Lost","vsAt":"vs","opponent":"Belgium","team_score":"1","opp_score":"4","date_str":"Jul 6","date_raw":"2026-07-07T00:00Z","game_id":"760507"},{"timestamp":1782950400,"team_name":"USA","label":"World Cup Round of 32","outcome":"Won","vsAt":"vs","opponent":"Bosnia-Herzegovina","team_score":"2","opp_score":"0","date_str":"Jul 1","date_raw":"2026-07-02T00:00Z","game_id":"760494"}],"upcoming":[]},"NFL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NBA":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NHL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAM":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAW":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]}}},"great_lakes":{"label":"Great Lakes \u0026 Ohio Valley","is_all":false,"leagues":{"MLB":{"latest_timestamp":1784426820,"live":[{"timestamp":1784482800,"team_name":"Guardians","label":"MLB","outcome":"live","live_status":"Tied","team_score":1,"opp_score":1,"vsAt":"vs","opponent":"Pittsburgh Pirates","progress":"Bottom 3rd","date_raw":"2026-07-19T17:40Z","game_id":"401816174"}],"games":[{"timestamp":1784426820,"team_name":"Tigers","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Los Angeles Angels","team_score":"7","opp_score":"0","date_str":"Yesterday","date_raw":"2026-07-19T02:07Z","game_id":"401816167"},{"timestamp":1784416200,"team_name":"Guardians","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Pittsburgh Pirates","team_score":"5","opp_score":"3","date_str":"Yesterday","date_raw":"2026-07-18T23:10Z","game_id":"401816159"},{"timestamp":1784401800,"team_name":"Reds","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Colorado Rockies","team_score":"3","opp_score":"10","date_str":"Yesterday","date_raw":"2026-07-18T19:10Z","game_id":"401816166"},{"timestamp":1784394600,"team_name":"Guardians","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Pittsburgh Pirates","team_score":"1","opp_score":"7","date_str":"Yesterday","date_raw":"2026-07-18T17:10Z","game_id":"401896568"},{"timestamp":1784338680,"team_name":"Tigers","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Los Angeles Angels","team_score":"2","opp_score":"1","date_str":"2 days ago","date_raw":"2026-07-18T01:38Z","game_id":"401816152"},{"timestamp":1784335200,"team_name":"Reds","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Colorado Rockies","team_score":"7","opp_score":"2","date_str":"2 days ago","date_raw":"2026-07-18T00:40Z","game_id":"401816151"}],"upcoming":[{"timestamp":1784488200,"team_name":"Reds","label":"Baseball","vsAt":"@","opponent":"Colorado Rockies","date_str":"Today, 2:10 PM","date_raw":"2026-07-19T19:10Z","game_id":"401816181"},{"timestamp":1784491620,"team_name":"Tigers","label":"Baseball","vsAt":"@","opponent":"Los Angeles Angels","date_str":"Today, 3:07 PM","date_raw":"2026-07-19T20:07Z","game_id":"401816182"},{"timestamp":1784587200,"team_name":"Guardians","label":"Baseball","vsAt":"vs","opponent":"Minnesota Twins","date_str":"Tomorrow, 5:40 PM","date_raw":"2026-07-20T22:40Z","game_id":"401816188"}]},"WNBA":{"latest_timestamp":1784419200,"live":[],"games":[{"timestamp":1784419200,"team_name":"Fever","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"New York Liberty","team_score":"108","opp_score":"88","date_str":"Yesterday","date_raw":"2026-07-19T00:00Z","game_id":"401857077"},{"timestamp":1784331000,"team_name":"Fever","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Seattle Storm","team_score":"110","opp_score":"107","date_str":"2 days ago","date_raw":"2026-07-17T23:30Z","game_id":"401857073"}],"upcoming":[{"timestamp":1784764800,"team_name":"Fever","label":"Basketball","vsAt":"vs","opponent":"Connecticut Sun","date_str":"Jul 22, 7:00 PM","date_raw":"2026-07-23T00:00Z","game_id":"401857090"}]},"FIFA":{"latest_timestamp":1783382400,"live":[],"games":[{"timestamp":1783382400,"team_name":"USA","label":"World Cup Round of 16","outcome":"Lost","vsAt":"vs","opponent":"Belgium","team_score":"1","opp_score":"4","date_str":"Jul 6","date_raw":"2026-07-07T00:00Z","game_id":"760507"},{"timestamp":1782950400,"team_name":"USA","label":"World Cup Round of 32","outcome":"Won","vsAt":"vs","opponent":"Bosnia-Herzegovina","team_score":"2","opp_score":"0","date_str":"Jul 1","date_raw":"2026-07-02T00:00Z","game_id":"760494"}],"upcoming":[]},"NFL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NBA":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NHL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAM":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAW":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]}}},"chicago_wisconsin":{"label":"Chicago \u0026 Wisconsin","is_all":false,"leagues":{"MLB":{"latest_timestamp":1784405400,"live":[{"timestamp":1784477700,"team_name":"White Sox","label":"MLB","outcome":"live","live_status":"Winning","team_score":3,"opp_score":0,"vsAt":"@","opponent":"Toronto Blue Jays","progress":"Top 9th","date_raw":"2026-07-19T16:15Z","game_id":"401816171"},{"timestamp":1784484600,"team_name":"Brewers","label":"MLB","outcome":"live","live_status":"Tied","team_score":0,"opp_score":0,"vsAt":"vs","opponent":"Miami Marlins","progress":"Top 2nd","date_raw":"2026-07-19T18:10Z","game_id":"401816178"},{"timestamp":1784485200,"team_name":"Cubs","label":"MLB","outcome":"live","live_status":"Tied","team_score":0,"opp_score":0,"vsAt":"vs","opponent":"Minnesota Twins","progress":"Bottom 1st","date_raw":"2026-07-19T18:20Z","game_id":"401816179"}],"games":[{"timestamp":1784405400,"team_name":"Brewers","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Miami Marlins","team_score":"8","opp_score":"6","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816163"},{"timestamp":1784401620,"team_name":"White Sox","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Toronto Blue Jays","team_score":"0","opp_score":"1","date_str":"Yesterday","date_raw":"2026-07-18T19:07Z","game_id":"401816156"},{"timestamp":1784398800,"team_name":"Cubs","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Minnesota Twins","team_score":"6","opp_score":"2","date_str":"Yesterday","date_raw":"2026-07-18T18:20Z","game_id":"401816164"},{"timestamp":1784333100,"team_name":"Cubs","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Minnesota Twins","team_score":"2","opp_score":"5","date_str":"2 days ago","date_raw":"2026-07-18T00:05Z","game_id":"401816149"},{"timestamp":1784331600,"team_name":"Brewers","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Miami Marlins","team_score":"2","opp_score":"1","date_str":"2 days ago","date_raw":"2026-07-17T23:40Z","game_id":"401816148"},{"timestamp":1784330100,"team_name":"White Sox","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Toronto Blue Jays","team_score":"12","opp_score":"4","date_str":"2 days ago","date_raw":"2026-07-17T23:15Z","game_id":"401816141"}],"upcoming":[{"timestamp":1784592300,"team_name":"White Sox","label":"Baseball","vsAt":"@","opponent":"Texas Rangers","date_str":"Tomorrow, 7:05 PM","date_raw":"2026-07-21T00:05Z","game_id":"401816192"}]},"WNBA":{"latest_timestamp":1784331000,"live":[],"games":[{"timestamp":1784331000,"team_name":"Sky","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Los Angeles Sparks","team_score":"96","opp_score":"82","date_str":"2 days ago","date_raw":"2026-07-17T23:30Z","game_id":"401857075"},{"timestamp":1784131200,"team_name":"Sky","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Seattle Storm","team_score":"95","opp_score":"90","date_str":"Jul 15","date_raw":"2026-07-15T16:00Z","game_id":"401857068"}],"upcoming":[{"timestamp":1784491200,"team_name":"Sky","label":"Basketball","vsAt":"@","opponent":"Atlanta Dream","date_str":"Today, 3:00 PM","date_raw":"2026-07-19T20:00Z","game_id":"401857081"}]},"FIFA":{"latest_timestamp":1783382400,"live":[],"games":[{"timestamp":1783382400,"team_name":"USA","label":"World Cup Round of 16","outcome":"Lost","vsAt":"vs","opponent":"Belgium","team_score":"1","opp_score":"4","date_str":"Jul 6","date_raw":"2026-07-07T00:00Z","game_id":"760507"},{"timestamp":1782950400,"team_name":"USA","label":"World Cup Round of 32","outcome":"Won","vsAt":"vs","opponent":"Bosnia-Herzegovina","team_score":"2","opp_score":"0","date_str":"Jul 1","date_raw":"2026-07-02T00:00Z","game_id":"760494"}],"upcoming":[]},"NFL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NBA":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NHL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAM":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAW":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]}}},"upper_midwest":{"label":"Upper Midwest","is_all":false,"leagues":{"WNBA":{"latest_timestamp":1784419200,"live":[],"games":[{"timestamp":1784419200,"team_name":"Lynx","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Portland Fire","team_score":"101","opp_score":"93","date_str":"Yesterday","date_raw":"2026-07-19T00:00Z","game_id":"401857078"},{"timestamp":1784134800,"team_name":"Lynx","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Los Angeles Sparks","team_score":"96","opp_score":"87","date_str":"Jul 15","date_raw":"2026-07-15T17:00Z","game_id":"401857069"}],"upcoming":[{"timestamp":1784599200,"team_name":"Lynx","label":"Basketball","vsAt":"@","opponent":"Seattle Storm","date_str":"Tomorrow, 9:00 PM","date_raw":"2026-07-21T02:00Z","game_id":"401857085"}]},"MLB":{"latest_timestamp":1784398800,"live":[{"timestamp":1784485200,"team_name":"Twins","label":"MLB","outcome":"live","live_status":"Tied","team_score":0,"opp_score":0,"vsAt":"@","opponent":"Chicago Cubs","progress":"Bottom 1st","date_raw":"2026-07-19T18:20Z","game_id":"401816179"}],"games":[{"timestamp":1784398800,"team_name":"Twins","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Chicago Cubs","team_score":"2","opp_score":"6","date_str":"Yesterday","date_raw":"2026-07-18T18:20Z","game_id":"401816164"},{"timestamp":1784333100,"team_name":"Twins","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Chicago Cubs","team_score":"5","opp_score":"2","date_str":"2 days ago","date_raw":"2026-07-18T00:05Z","game_id":"401816149"}],"upcoming":[]},"FIFA":{"latest_timestamp":1783382400,"live":[],"games":[{"timestamp":1783382400,"team_name":"USA","label":"World Cup Round of 16","outcome":"Lost","vsAt":"vs","opponent":"Belgium","team_score":"1","opp_score":"4","date_str":"Jul 6","date_raw":"2026-07-07T00:00Z","game_id":"760507"},{"timestamp":1782950400,"team_name":"USA","label":"World Cup Round of 32","outcome":"Won","vsAt":"vs","opponent":"Bosnia-Herzegovina","team_score":"2","opp_score":"0","date_str":"Jul 1","date_raw":"2026-07-02T00:00Z","game_id":"760494"}],"upcoming":[]},"NFL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NBA":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NHL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAM":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAW":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]}}},"midwest_central":{"label":"Mid-Central Plains","is_all":false,"leagues":{"MLB":{"latest_timestamp":1784405400,"live":[{"timestamp":1784484600,"team_name":"Royals","label":"MLB","outcome":"live","live_status":"Winning","team_score":1,"opp_score":0,"vsAt":"vs","opponent":"San Diego Padres","progress":"End 1st","date_raw":"2026-07-19T18:10Z","game_id":"401816180"}],"games":[{"timestamp":1784405400,"team_name":"Royals","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"San Diego Padres","team_score":"6","opp_score":"1","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816165"},{"timestamp":1784405400,"team_name":"Cardinals","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Arizona Diamondbacks","team_score":"3","opp_score":"5","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816169"},{"timestamp":1784338800,"team_name":"Cardinals","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Arizona Diamondbacks","team_score":"5","opp_score":"4","date_str":"2 days ago","date_raw":"2026-07-18T01:40Z","game_id":"401816154"},{"timestamp":1784333400,"team_name":"Royals","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"San Diego Padres","team_score":"7","opp_score":"6","date_str":"2 days ago","date_raw":"2026-07-18T00:10Z","game_id":"401816150"}],"upcoming":[{"timestamp":1784491800,"team_name":"Cardinals","label":"Baseball","vsAt":"@","opponent":"Arizona Diamondbacks","date_str":"Today, 3:10 PM","date_raw":"2026-07-19T20:10Z","game_id":"401816184"}]},"FIFA":{"latest_timestamp":1783382400,"live":[],"games":[{"timestamp":1783382400,"team_name":"USA","label":"World Cup Round of 16","outcome":"Lost","vsAt":"vs","opponent":"Belgium","team_score":"1","opp_score":"4","date_str":"Jul 6","date_raw":"2026-07-07T00:00Z","game_id":"760507"},{"timestamp":1782950400,"team_name":"USA","label":"World Cup Round of 32","outcome":"Won","vsAt":"vs","opponent":"Bosnia-Herzegovina","team_score":"2","opp_score":"0","date_str":"Jul 1","date_raw":"2026-07-02T00:00Z","game_id":"760494"}],"upcoming":[]},"NFL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NBA":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NHL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAM":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAW":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]}}},"texas_oklahoma":{"label":"Texas \u0026 Oklahoma","is_all":false,"leagues":{"MLB":{"latest_timestamp":1784405400,"live":[{"timestamp":1784482500,"team_name":"Rangers","label":"MLB","outcome":"live","live_status":"Losing","team_score":0,"opp_score":3,"vsAt":"@","opponent":"Atlanta Braves","progress":"Top 4th","date_raw":"2026-07-19T17:35Z","game_id":"401816176"},{"timestamp":1784484600,"team_name":"Astros","label":"MLB","outcome":"live","live_status":"Tied","team_score":0,"opp_score":0,"vsAt":"vs","opponent":"Baltimore Orioles","progress":"Top 2nd","date_raw":"2026-07-19T18:10Z","game_id":"401816177"}],"games":[{"timestamp":1784405400,"team_name":"Rangers","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Atlanta Braves","team_score":"7","opp_score":"6","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816161"},{"timestamp":1784405400,"team_name":"Astros","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Baltimore Orioles","team_score":"2","opp_score":"4","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816162"},{"timestamp":1784333400,"team_name":"Astros","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Baltimore Orioles","team_score":"2","opp_score":"3","date_str":"2 days ago","date_raw":"2026-07-18T00:10Z","game_id":"401816147"},{"timestamp":1784330100,"team_name":"Rangers","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Atlanta Braves","team_score":"1","opp_score":"15","date_str":"2 days ago","date_raw":"2026-07-17T23:15Z","game_id":"401816146"}],"upcoming":[{"timestamp":1784592300,"team_name":"Rangers","label":"Baseball","vsAt":"vs","opponent":"Chicago White Sox","date_str":"Tomorrow, 7:05 PM","date_raw":"2026-07-21T00:05Z","game_id":"401816192"}]},"WNBA":{"latest_timestamp":1783897200,"live":[{"timestamp":1784480400,"team_name":"Wings","label":"WNBA","outcome":"live","live_status":"Winning","team_score":61,"opp_score":58,"vsAt":"vs","opponent":"Los Angeles Sparks","progress":"2:03 - 3rd Quarter","date_raw":"2026-07-19T17:00Z","game_id":"401857080"}],"games":[{"timestamp":1783897200,"team_name":"Wings","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Chicago Sky","team_score":"96","opp_score":"91","date_str":"Jul 12","date_raw":"2026-07-12T23:00Z","game_id":"401857062"},{"timestamp":1783726200,"team_name":"Wings","label":"Basketball","outcome":"Won","vsAt":"@","opponent":"Toronto Tempo","team_score":"108","opp_score":"95","date_str":"Jul 10","date_raw":"2026-07-10T23:30Z","game_id":"401857055"}],"upcoming":[{"timestamp":1784592000,"team_name":"Wings","label":"Basketball","vsAt":"vs","opponent":"New York Liberty","date_str":"Tomorrow, 7:00 PM","date_raw":"2026-07-21T00:00Z","game_id":"401892393"}]},"FIFA":{"latest_timestamp":1783382400,"live":[],"games":[{"timestamp":1783382400,"team_name":"USA","label":"World Cup Round of 16","outcome":"Lost","vsAt":"vs","opponent":"Belgium","team_score":"1","opp_score":"4","date_str":"Jul 6","date_raw":"2026-07-07T00:00Z","game_id":"760507"},{"timestamp":1782950400,"team_name":"USA","label":"World Cup Round of 32","outcome":"Won","vsAt":"vs","opponent":"Bosnia-Herzegovina","team_score":"2","opp_score":"0","date_str":"Jul 1","date_raw":"2026-07-02T00:00Z","game_id":"760494"}],"upcoming":[]},"NFL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NBA":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NHL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAM":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAW":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]}}},"mountain_west":{"label":"Mountain West \u0026 Southwest","is_all":false,"leagues":{"MLB":{"latest_timestamp":1784405400,"live":[],"games":[{"timestamp":1784405400,"team_name":"Diamondbacks","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"St. Louis Cardinals","team_score":"5","opp_score":"3","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816169"},{"timestamp":1784401800,"team_name":"Rockies","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Cincinnati Reds","team_score":"10","opp_score":"3","date_str":"Yesterday","date_raw":"2026-07-18T19:10Z","game_id":"401816166"},{"timestamp":1784338800,"team_name":"Diamondbacks","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"St. Louis Cardinals","team_score":"4","opp_score":"5","date_str":"2 days ago","date_raw":"2026-07-18T01:40Z","game_id":"401816154"},{"timestamp":1784335200,"team_name":"Rockies","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Cincinnati Reds","team_score":"2","opp_score":"7","date_str":"2 days ago","date_raw":"2026-07-18T00:40Z","game_id":"401816151"}],"upcoming":[{"timestamp":1784488200,"team_name":"Rockies","label":"Baseball","vsAt":"vs","opponent":"Cincinnati Reds","date_str":"Today, 2:10 PM","date_raw":"2026-07-19T19:10Z","game_id":"401816181"},{"timestamp":1784491800,"team_name":"Diamondbacks","label":"Baseball","vsAt":"vs","opponent":"St. Louis Cardinals","date_str":"Today, 3:10 PM","date_raw":"2026-07-19T20:10Z","game_id":"401816184"}]},"WNBA":{"latest_timestamp":1784340000,"live":[],"games":[{"timestamp":1784340000,"team_name":"Mercury","label":"Basketball","outcome":"Lost","vsAt":"vs","opponent":"Connecticut Sun","team_score":"83","opp_score":"96","date_str":"2 days ago","date_raw":"2026-07-18T02:00Z","game_id":"401857076"},{"timestamp":1783990800,"team_name":"Mercury","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Minnesota Lynx","team_score":"100","opp_score":"104","date_str":"Jul 13","date_raw":"2026-07-14T01:00Z","game_id":"401857065"},{"timestamp":1783904400,"team_name":"Aces","label":"Basketball","outcome":"Lost","vsAt":"vs","opponent":"Indiana Fever","team_score":"75","opp_score":"109","date_str":"Jul 12","date_raw":"2026-07-13T01:00Z","game_id":"401857063"},{"timestamp":1783807200,"team_name":"Aces","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Phoenix Mercury","team_score":"106","opp_score":"58","date_str":"Jul 11","date_raw":"2026-07-11T22:00Z","game_id":"401857058"}],"upcoming":[{"timestamp":1784502000,"team_name":"Mercury","label":"Basketball","vsAt":"vs","opponent":"Connecticut Sun","date_str":"Today, 6:00 PM","date_raw":"2026-07-19T23:00Z","game_id":"401857082"},{"timestamp":1784592000,"team_name":"Aces","label":"Basketball","vsAt":"@","opponent":"Toronto Tempo","date_str":"Tomorrow, 7:00 PM","date_raw":"2026-07-21T00:00Z","game_id":"401857083"}]},"FIFA":{"latest_timestamp":1783382400,"live":[],"games":[{"timestamp":1783382400,"team_name":"USA","label":"World Cup Round of 16","outcome":"Lost","vsAt":"vs","opponent":"Belgium","team_score":"1","opp_score":"4","date_str":"Jul 6","date_raw":"2026-07-07T00:00Z","game_id":"760507"},{"timestamp":1782950400,"team_name":"USA","label":"World Cup Round of 32","outcome":"Won","vsAt":"vs","opponent":"Bosnia-Herzegovina","team_score":"2","opp_score":"0","date_str":"Jul 1","date_raw":"2026-07-02T00:00Z","game_id":"760494"}],"upcoming":[]},"NFL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NBA":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NHL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAM":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAW":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]}}},"southern_california":{"label":"Southern California","is_all":false,"leagues":{"MLB":{"latest_timestamp":1784426820,"live":[{"timestamp":1784478900,"team_name":"Dodgers","label":"MLB","outcome":"live","live_status":"Winning","team_score":3,"opp_score":1,"vsAt":"@","opponent":"New York Yankees","progress":"Top 7th","date_raw":"2026-07-19T16:35Z","game_id":"401897386"},{"timestamp":1784484600,"team_name":"Padres","label":"MLB","outcome":"live","live_status":"Losing","team_score":0,"opp_score":1,"vsAt":"@","opponent":"Kansas City Royals","progress":"End 1st","date_raw":"2026-07-19T18:10Z","game_id":"401816180"}],"games":[{"timestamp":1784426820,"team_name":"Angels","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Detroit Tigers","team_score":"0","opp_score":"7","date_str":"Yesterday","date_raw":"2026-07-19T02:07Z","game_id":"401816167"},{"timestamp":1784405400,"team_name":"Padres","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Kansas City Royals","team_score":"1","opp_score":"6","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816165"},{"timestamp":1784338680,"team_name":"Angels","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Detroit Tigers","team_score":"1","opp_score":"2","date_str":"2 days ago","date_raw":"2026-07-18T01:38Z","game_id":"401816152"},{"timestamp":1784333400,"team_name":"Padres","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Kansas City Royals","team_score":"6","opp_score":"7","date_str":"2 days ago","date_raw":"2026-07-18T00:10Z","game_id":"401816150"},{"timestamp":1784329500,"team_name":"Dodgers","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"New York Yankees","team_score":"2","opp_score":"1","date_str":"2 days ago","date_raw":"2026-07-17T23:05Z","game_id":"401816142"},{"timestamp":1783887000,"team_name":"Dodgers","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Arizona Diamondbacks","team_score":"3","opp_score":"5","date_str":"Jul 12","date_raw":"2026-07-12T20:10Z","game_id":"401816138"}],"upcoming":[{"timestamp":1784491620,"team_name":"Angels","label":"Baseball","vsAt":"vs","opponent":"Detroit Tigers","date_str":"Today, 3:07 PM","date_raw":"2026-07-19T20:07Z","game_id":"401816182"}]},"WNBA":{"latest_timestamp":1784331000,"live":[{"timestamp":1784480400,"team_name":"Sparks","label":"WNBA","outcome":"live","live_status":"Losing","team_score":58,"opp_score":61,"vsAt":"@","opponent":"Dallas Wings","progress":"2:03 - 3rd Quarter","date_raw":"2026-07-19T17:00Z","game_id":"401857080"}],"games":[{"timestamp":1784331000,"team_name":"Sparks","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Chicago Sky","team_score":"82","opp_score":"96","date_str":"2 days ago","date_raw":"2026-07-17T23:30Z","game_id":"401857075"},{"timestamp":1784134800,"team_name":"Sparks","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Minnesota Lynx","team_score":"87","opp_score":"96","date_str":"Jul 15","date_raw":"2026-07-15T17:00Z","game_id":"401857069"}],"upcoming":[{"timestamp":1784746800,"team_name":"Sparks","label":"Basketball","vsAt":"vs","opponent":"Phoenix Mercury","date_str":"Jul 22, 2:00 PM","date_raw":"2026-07-22T19:00Z","game_id":"401857086"}]},"FIFA":{"latest_timestamp":1783382400,"live":[],"games":[{"timestamp":1783382400,"team_name":"USA","label":"World Cup Round of 16","outcome":"Lost","vsAt":"vs","opponent":"Belgium","team_score":"1","opp_score":"4","date_str":"Jul 6","date_raw":"2026-07-07T00:00Z","game_id":"760507"},{"timestamp":1782950400,"team_name":"USA","label":"World Cup Round of 32","outcome":"Won","vsAt":"vs","opponent":"Bosnia-Herzegovina","team_score":"2","opp_score":"0","date_str":"Jul 1","date_raw":"2026-07-02T00:00Z","game_id":"760494"}],"upcoming":[]},"NFL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NBA":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NHL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAM":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAW":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]}}},"northern_california":{"label":"Northern California","is_all":false,"leagues":{"MLB":{"latest_timestamp":1784426700,"live":[],"games":[{"timestamp":1784426700,"team_name":"Athletics","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Washington Nationals","team_score":"15","opp_score":"1","date_str":"Yesterday","date_raw":"2026-07-19T02:05Z","game_id":"401816170"},{"timestamp":1784419680,"team_name":"Giants","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Seattle Mariners","team_score":"3","opp_score":"4","date_str":"Yesterday","date_raw":"2026-07-19T00:08Z","game_id":"401816168"},{"timestamp":1784340600,"team_name":"Giants","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Seattle Mariners","team_score":"7","opp_score":"0","date_str":"2 days ago","date_raw":"2026-07-18T02:10Z","game_id":"401816153"},{"timestamp":1784338800,"team_name":"Athletics","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Washington Nationals","team_score":"4","opp_score":"23","date_str":"2 days ago","date_raw":"2026-07-18T01:40Z","game_id":"401816155"}],"upcoming":[{"timestamp":1784491500,"team_name":"Athletics","label":"Baseball","vsAt":"vs","opponent":"Washington Nationals","date_str":"Today, 3:05 PM","date_raw":"2026-07-19T20:05Z","game_id":"401816185"},{"timestamp":1784491800,"team_name":"Giants","label":"Baseball","vsAt":"@","opponent":"Seattle Mariners","date_str":"Today, 3:10 PM","date_raw":"2026-07-19T20:10Z","game_id":"401816183"}]},"WNBA":{"latest_timestamp":1784421000,"live":[],"games":[{"timestamp":1784421000,"team_name":"Valkyries","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Washington Mystics","team_score":"74","opp_score":"69","date_str":"Yesterday","date_raw":"2026-07-19T00:30Z","game_id":"401857079"},{"timestamp":1784160000,"team_name":"Valkyries","label":"Basketball","outcome":"Won","vsAt":"@","opponent":"Indiana Fever","team_score":"88","opp_score":"75","date_str":"Jul 15","date_raw":"2026-07-16T00:00Z","game_id":"401857070"}],"upcoming":[{"timestamp":1784599200,"team_name":"Valkyries","label":"Basketball","vsAt":"vs","opponent":"Washington Mystics","date_str":"Tomorrow, 9:00 PM","date_raw":"2026-07-21T02:00Z","game_id":"401857084"}]},"FIFA":{"latest_timestamp":1783382400,"live":[],"games":[{"timestamp":1783382400,"team_name":"USA","label":"World Cup Round of 16","outcome":"Lost","vsAt":"vs","opponent":"Belgium","team_score":"1","opp_score":"4","date_str":"Jul 6","date_raw":"2026-07-07T00:00Z","game_id":"760507"},{"timestamp":1782950400,"team_name":"USA","label":"World Cup Round of 32","outcome":"Won","vsAt":"vs","opponent":"Bosnia-Herzegovina","team_score":"2","opp_score":"0","date_str":"Jul 1","date_raw":"2026-07-02T00:00Z","game_id":"760494"}],"upcoming":[]},"NBA":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NFL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NHL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAM":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAW":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]}}},"pacific_northwest":{"label":"Pacific Northwest","is_all":false,"leagues":{"MLB":{"latest_timestamp":1784419680,"live":[],"games":[{"timestamp":1784419680,"team_name":"Mariners","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"San Francisco Giants","team_score":"4","opp_score":"3","date_str":"Yesterday","date_raw":"2026-07-19T00:08Z","game_id":"401816168"},{"timestamp":1784340600,"team_name":"Mariners","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"San Francisco Giants","team_score":"0","opp_score":"7","date_str":"2 days ago","date_raw":"2026-07-18T02:10Z","game_id":"401816153"}],"upcoming":[{"timestamp":1784491800,"team_name":"Mariners","label":"Baseball","vsAt":"vs","opponent":"San Francisco Giants","date_str":"Today, 3:10 PM","date_raw":"2026-07-19T20:10Z","game_id":"401816183"}]},"WNBA":{"latest_timestamp":1784419200,"live":[],"games":[{"timestamp":1784419200,"team_name":"Fire","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Minnesota Lynx","team_score":"93","opp_score":"101","date_str":"Yesterday","date_raw":"2026-07-19T00:00Z","game_id":"401857078"},{"timestamp":1784331000,"team_name":"Storm","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Indiana Fever","team_score":"107","opp_score":"110","date_str":"2 days ago","date_raw":"2026-07-17T23:30Z","game_id":"401857073"},{"timestamp":1784242800,"team_name":"Fire","label":"Basketball","outcome":"Won","vsAt":"@","opponent":"Washington Mystics","team_score":"75","opp_score":"56","date_str":"Jul 16","date_raw":"2026-07-16T23:00Z","game_id":"401857071"},{"timestamp":1784131200,"team_name":"Storm","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Chicago Sky","team_score":"90","opp_score":"95","date_str":"Jul 15","date_raw":"2026-07-15T16:00Z","game_id":"401857068"}],"upcoming":[{"timestamp":1784599200,"team_name":"Storm","label":"Basketball","vsAt":"vs","opponent":"Minnesota Lynx","date_str":"Tomorrow, 9:00 PM","date_raw":"2026-07-21T02:00Z","game_id":"401857085"},{"timestamp":1784772000,"team_name":"Fire","label":"Basketball","vsAt":"vs","opponent":"Dallas Wings","date_str":"Jul 22, 9:00 PM","date_raw":"2026-07-23T02:00Z","game_id":"401857091"}]},"FIFA":{"latest_timestamp":1783382400,"live":[],"games":[{"timestamp":1783382400,"team_name":"USA","label":"World Cup Round of 16","outcome":"Lost","vsAt":"vs","opponent":"Belgium","team_score":"1","opp_score":"4","date_str":"Jul 6","date_raw":"2026-07-07T00:00Z","game_id":"760507"},{"timestamp":1782950400,"team_name":"USA","label":"World Cup Round of 32","outcome":"Won","vsAt":"vs","opponent":"Bosnia-Herzegovina","team_score":"2","opp_score":"0","date_str":"Jul 1","date_raw":"2026-07-02T00:00Z","game_id":"760494"}],"upcoming":[]},"NBA":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NFL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NHL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAM":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAW":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]}}},"western_canada":{"label":"Western Canada","is_all":false,"leagues":{"FIFA":{"latest_timestamp":1783382400,"live":[],"games":[{"timestamp":1783382400,"team_name":"USA","label":"World Cup Round of 16","outcome":"Lost","vsAt":"vs","opponent":"Belgium","team_score":"1","opp_score":"4","date_str":"Jul 6","date_raw":"2026-07-07T00:00Z","game_id":"760507"},{"timestamp":1782950400,"team_name":"USA","label":"World Cup Round of 32","outcome":"Won","vsAt":"vs","opponent":"Bosnia-Herzegovina","team_score":"2","opp_score":"0","date_str":"Jul 1","date_raw":"2026-07-02T00:00Z","game_id":"760494"}],"upcoming":[]},"NHL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]}}},"eastern_canada":{"label":"Eastern Canada","is_all":false,"leagues":{"MLB":{"latest_timestamp":1784401620,"live":[{"timestamp":1784477700,"team_name":"Blue Jays","label":"MLB","outcome":"live","live_status":"Losing","team_score":0,"opp_score":3,"vsAt":"vs","opponent":"Chicago White Sox","progress":"Top 9th","date_raw":"2026-07-19T16:15Z","game_id":"401816171"}],"games":[{"timestamp":1784401620,"team_name":"Blue Jays","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Chicago White Sox","team_score":"1","opp_score":"0","date_str":"Yesterday","date_raw":"2026-07-18T19:07Z","game_id":"401816156"},{"timestamp":1784330100,"team_name":"Blue Jays","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Chicago White Sox","team_score":"4","opp_score":"12","date_str":"2 days ago","date_raw":"2026-07-17T23:15Z","game_id":"401816141"}],"upcoming":[{"timestamp":1784588820,"team_name":"Blue Jays","label":"Baseball","vsAt":"vs","opponent":"Tampa Bay Rays","date_str":"Tomorrow, 6:07 PM","date_raw":"2026-07-20T23:07Z","game_id":"401816191"}]},"WNBA":{"latest_timestamp":1784331000,"live":[],"games":[{"timestamp":1784331000,"team_name":"Tempo","label":"Basketball","outcome":"Lost","vsAt":"vs","opponent":"Atlanta Dream","team_score":"92","opp_score":"111","date_str":"2 days ago","date_raw":"2026-07-17T23:30Z","game_id":"401857074"},{"timestamp":1784070000,"team_name":"Tempo","label":"Basketball","outcome":"Lost","vsAt":"vs","opponent":"Washington Mystics","team_score":"62","opp_score":"79","date_str":"Jul 14","date_raw":"2026-07-14T23:00Z","game_id":"401857067"}],"upcoming":[{"timestamp":1784592000,"team_name":"Tempo","label":"Basketball","vsAt":"vs","opponent":"Las Vegas Aces","date_str":"Tomorrow, 7:00 PM","date_raw":"2026-07-21T00:00Z","game_id":"401857083"}]},"FIFA":{"latest_timestamp":1783382400,"live":[],"games":[{"timestamp":1783382400,"team_name":"USA","label":"World Cup Round of 16","outcome":"Lost","vsAt":"vs","opponent":"Belgium","team_score":"1","opp_score":"4","date_str":"Jul 6","date_raw":"2026-07-07T00:00Z","game_id":"760507"},{"timestamp":1782950400,"team_name":"USA","label":"World Cup Round of 32","outcome":"Won","vsAt":"vs","opponent":"Bosnia-Herzegovina","team_score":"2","opp_score":"0","date_str":"Jul 1","date_raw":"2026-07-02T00:00Z","game_id":"760494"}],"upcoming":[]},"NHL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NBA":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]}}},"all":{"label":"All Cities","is_all":true,"leagues":{"MLB":{"latest_timestamp":1784426820,"live":[{"timestamp":1784477700,"team_name":"Blue Jays","label":"MLB","outcome":"live","live_status":"Losing","team_score":0,"opp_score":3,"vsAt":"vs","opponent":"Chicago White Sox","progress":"Top 9th","date_raw":"2026-07-19T16:15Z","game_id":"401816171"},{"timestamp":1784477700,"team_name":"White Sox","label":"MLB","outcome":"live","live_status":"Winning","team_score":3,"opp_score":0,"vsAt":"@","opponent":"Toronto Blue Jays","progress":"Top 9th","date_raw":"2026-07-19T16:15Z","game_id":"401816171"},{"timestamp":1784478900,"team_name":"Yankees","label":"MLB","outcome":"live","live_status":"Losing","team_score":1,"opp_score":3,"vsAt":"vs","opponent":"Los Angeles Dodgers","progress":"Top 7th","date_raw":"2026-07-19T16:35Z","game_id":"401897386"},{"timestamp":1784478900,"team_name":"Dodgers","label":"MLB","outcome":"live","live_status":"Winning","team_score":3,"opp_score":1,"vsAt":"@","opponent":"New York Yankees","progress":"Top 7th","date_raw":"2026-07-19T16:35Z","game_id":"401897386"},{"timestamp":1784482500,"team_name":"Phillies","label":"MLB","outcome":"live","live_status":"Losing","team_score":0,"opp_score":5,"vsAt":"vs","opponent":"New York Mets","progress":"Bottom 3rd","date_raw":"2026-07-19T17:35Z","game_id":"401816173"},{"timestamp":1784482500,"team_name":"Mets","label":"MLB","outcome":"live","live_status":"Winning","team_score":5,"opp_score":0,"vsAt":"@","opponent":"Philadelphia Phillies","progress":"Bottom 3rd","date_raw":"2026-07-19T17:35Z","game_id":"401816173"},{"timestamp":1784482500,"team_name":"Red Sox","label":"MLB","outcome":"live","live_status":"Tied","team_score":1,"opp_score":1,"vsAt":"vs","opponent":"Tampa Bay Rays","progress":"Top 3rd","date_raw":"2026-07-19T17:35Z","game_id":"401816175"},{"timestamp":1784482500,"team_name":"Rays","label":"MLB","outcome":"live","live_status":"Tied","team_score":1,"opp_score":1,"vsAt":"@","opponent":"Boston Red Sox","progress":"Top 3rd","date_raw":"2026-07-19T17:35Z","game_id":"401816175"},{"timestamp":1784482500,"team_name":"Braves","label":"MLB","outcome":"live","live_status":"Winning","team_score":3,"opp_score":0,"vsAt":"vs","opponent":"Texas Rangers","progress":"Top 4th","date_raw":"2026-07-19T17:35Z","game_id":"401816176"},{"timestamp":1784482500,"team_name":"Rangers","label":"MLB","outcome":"live","live_status":"Losing","team_score":0,"opp_score":3,"vsAt":"@","opponent":"Atlanta Braves","progress":"Top 4th","date_raw":"2026-07-19T17:35Z","game_id":"401816176"},{"timestamp":1784482800,"team_name":"Guardians","label":"MLB","outcome":"live","live_status":"Tied","team_score":1,"opp_score":1,"vsAt":"vs","opponent":"Pittsburgh Pirates","progress":"Bottom 3rd","date_raw":"2026-07-19T17:40Z","game_id":"401816174"},{"timestamp":1784482800,"team_name":"Pirates","label":"MLB","outcome":"live","live_status":"Tied","team_score":1,"opp_score":1,"vsAt":"@","opponent":"Cleveland Guardians","progress":"Bottom 3rd","date_raw":"2026-07-19T17:40Z","game_id":"401816174"},{"timestamp":1784484600,"team_name":"Astros","label":"MLB","outcome":"live","live_status":"Tied","team_score":0,"opp_score":0,"vsAt":"vs","opponent":"Baltimore Orioles","progress":"Top 2nd","date_raw":"2026-07-19T18:10Z","game_id":"401816177"},{"timestamp":1784484600,"team_name":"Orioles","label":"MLB","outcome":"live","live_status":"Tied","team_score":0,"opp_score":0,"vsAt":"@","opponent":"Houston Astros","progress":"Top 2nd","date_raw":"2026-07-19T18:10Z","game_id":"401816177"},{"timestamp":1784484600,"team_name":"Brewers","label":"MLB","outcome":"live","live_status":"Tied","team_score":0,"opp_score":0,"vsAt":"vs","opponent":"Miami Marlins","progress":"Top 2nd","date_raw":"2026-07-19T18:10Z","game_id":"401816178"},{"timestamp":1784484600,"team_name":"Marlins","label":"MLB","outcome":"live","live_status":"Tied","team_score":0,"opp_score":0,"vsAt":"@","opponent":"Milwaukee Brewers","progress":"Top 2nd","date_raw":"2026-07-19T18:10Z","game_id":"401816178"},{"timestamp":1784484600,"team_name":"Royals","label":"MLB","outcome":"live","live_status":"Winning","team_score":1,"opp_score":0,"vsAt":"vs","opponent":"San Diego Padres","progress":"End 1st","date_raw":"2026-07-19T18:10Z","game_id":"401816180"},{"timestamp":1784484600,"team_name":"Padres","label":"MLB","outcome":"live","live_status":"Losing","team_score":0,"opp_score":1,"vsAt":"@","opponent":"Kansas City Royals","progress":"End 1st","date_raw":"2026-07-19T18:10Z","game_id":"401816180"},{"timestamp":1784485200,"team_name":"Cubs","label":"MLB","outcome":"live","live_status":"Tied","team_score":0,"opp_score":0,"vsAt":"vs","opponent":"Minnesota Twins","progress":"Bottom 1st","date_raw":"2026-07-19T18:20Z","game_id":"401816179"},{"timestamp":1784485200,"team_name":"Twins","label":"MLB","outcome":"live","live_status":"Tied","team_score":0,"opp_score":0,"vsAt":"@","opponent":"Chicago Cubs","progress":"Bottom 1st","date_raw":"2026-07-19T18:20Z","game_id":"401816179"}],"games":[{"timestamp":1784426820,"team_name":"Tigers","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Los Angeles Angels","team_score":"7","opp_score":"0","date_str":"Yesterday","date_raw":"2026-07-19T02:07Z","game_id":"401816167"},{"timestamp":1784426820,"team_name":"Angels","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Detroit Tigers","team_score":"0","opp_score":"7","date_str":"Yesterday","date_raw":"2026-07-19T02:07Z","game_id":"401816167"},{"timestamp":1784426700,"team_name":"Nationals","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Athletics","team_score":"1","opp_score":"15","date_str":"Yesterday","date_raw":"2026-07-19T02:05Z","game_id":"401816170"},{"timestamp":1784426700,"team_name":"Athletics","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Washington Nationals","team_score":"15","opp_score":"1","date_str":"Yesterday","date_raw":"2026-07-19T02:05Z","game_id":"401816170"},{"timestamp":1784419680,"team_name":"Giants","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Seattle Mariners","team_score":"3","opp_score":"4","date_str":"Yesterday","date_raw":"2026-07-19T00:08Z","game_id":"401816168"},{"timestamp":1784419680,"team_name":"Mariners","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"San Francisco Giants","team_score":"4","opp_score":"3","date_str":"Yesterday","date_raw":"2026-07-19T00:08Z","game_id":"401816168"},{"timestamp":1784416200,"team_name":"Pirates","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Cleveland Guardians","team_score":"3","opp_score":"5","date_str":"Yesterday","date_raw":"2026-07-18T23:10Z","game_id":"401816159"},{"timestamp":1784416200,"team_name":"Guardians","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Pittsburgh Pirates","team_score":"5","opp_score":"3","date_str":"Yesterday","date_raw":"2026-07-18T23:10Z","game_id":"401816159"},{"timestamp":1784405400,"team_name":"Red Sox","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Tampa Bay Rays","team_score":"7","opp_score":"6","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816160"},{"timestamp":1784405400,"team_name":"Orioles","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Houston Astros","team_score":"4","opp_score":"2","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816162"},{"timestamp":1784405400,"team_name":"Braves","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Texas Rangers","team_score":"6","opp_score":"7","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816161"},{"timestamp":1784405400,"team_name":"Marlins","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Milwaukee Brewers","team_score":"6","opp_score":"8","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816163"},{"timestamp":1784405400,"team_name":"Rays","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Boston Red Sox","team_score":"6","opp_score":"7","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816160"},{"timestamp":1784405400,"team_name":"Brewers","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Miami Marlins","team_score":"8","opp_score":"6","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816163"},{"timestamp":1784405400,"team_name":"Royals","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"San Diego Padres","team_score":"6","opp_score":"1","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816165"},{"timestamp":1784405400,"team_name":"Cardinals","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Arizona Diamondbacks","team_score":"3","opp_score":"5","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816169"},{"timestamp":1784405400,"team_name":"Rangers","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Atlanta Braves","team_score":"7","opp_score":"6","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816161"},{"timestamp":1784405400,"team_name":"Astros","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Baltimore Orioles","team_score":"2","opp_score":"4","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816162"},{"timestamp":1784405400,"team_name":"Diamondbacks","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"St. Louis Cardinals","team_score":"5","opp_score":"3","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816169"},{"timestamp":1784405400,"team_name":"Padres","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Kansas City Royals","team_score":"1","opp_score":"6","date_str":"Yesterday","date_raw":"2026-07-18T20:10Z","game_id":"401816165"},{"timestamp":1784401800,"team_name":"Reds","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Colorado Rockies","team_score":"3","opp_score":"10","date_str":"Yesterday","date_raw":"2026-07-18T19:10Z","game_id":"401816166"},{"timestamp":1784401800,"team_name":"Rockies","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Cincinnati Reds","team_score":"10","opp_score":"3","date_str":"Yesterday","date_raw":"2026-07-18T19:10Z","game_id":"401816166"},{"timestamp":1784401620,"team_name":"White Sox","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Toronto Blue Jays","team_score":"0","opp_score":"1","date_str":"Yesterday","date_raw":"2026-07-18T19:07Z","game_id":"401816156"},{"timestamp":1784401620,"team_name":"Blue Jays","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Chicago White Sox","team_score":"1","opp_score":"0","date_str":"Yesterday","date_raw":"2026-07-18T19:07Z","game_id":"401816156"},{"timestamp":1784401500,"team_name":"Mets","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Philadelphia Phillies","team_score":"1","opp_score":"6","date_str":"Yesterday","date_raw":"2026-07-18T19:05Z","game_id":"401816158"},{"timestamp":1784401500,"team_name":"Phillies","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"New York Mets","team_score":"6","opp_score":"1","date_str":"Yesterday","date_raw":"2026-07-18T19:05Z","game_id":"401816158"},{"timestamp":1784398800,"team_name":"Cubs","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Minnesota Twins","team_score":"6","opp_score":"2","date_str":"Yesterday","date_raw":"2026-07-18T18:20Z","game_id":"401816164"},{"timestamp":1784398800,"team_name":"Twins","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Chicago Cubs","team_score":"2","opp_score":"6","date_str":"Yesterday","date_raw":"2026-07-18T18:20Z","game_id":"401816164"},{"timestamp":1784394600,"team_name":"Pirates","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Cleveland Guardians","team_score":"7","opp_score":"1","date_str":"Yesterday","date_raw":"2026-07-18T17:10Z","game_id":"401896568"},{"timestamp":1784394600,"team_name":"Guardians","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Pittsburgh Pirates","team_score":"1","opp_score":"7","date_str":"Yesterday","date_raw":"2026-07-18T17:10Z","game_id":"401896568"},{"timestamp":1784340600,"team_name":"Giants","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Seattle Mariners","team_score":"7","opp_score":"0","date_str":"2 days ago","date_raw":"2026-07-18T02:10Z","game_id":"401816153"},{"timestamp":1784340600,"team_name":"Mariners","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"San Francisco Giants","team_score":"0","opp_score":"7","date_str":"2 days ago","date_raw":"2026-07-18T02:10Z","game_id":"401816153"},{"timestamp":1784338800,"team_name":"Nationals","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Athletics","team_score":"23","opp_score":"4","date_str":"2 days ago","date_raw":"2026-07-18T01:40Z","game_id":"401816155"},{"timestamp":1784338800,"team_name":"Cardinals","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Arizona Diamondbacks","team_score":"5","opp_score":"4","date_str":"2 days ago","date_raw":"2026-07-18T01:40Z","game_id":"401816154"},{"timestamp":1784338800,"team_name":"Diamondbacks","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"St. Louis Cardinals","team_score":"4","opp_score":"5","date_str":"2 days ago","date_raw":"2026-07-18T01:40Z","game_id":"401816154"},{"timestamp":1784338800,"team_name":"Athletics","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Washington Nationals","team_score":"4","opp_score":"23","date_str":"2 days ago","date_raw":"2026-07-18T01:40Z","game_id":"401816155"},{"timestamp":1784338680,"team_name":"Tigers","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Los Angeles Angels","team_score":"2","opp_score":"1","date_str":"2 days ago","date_raw":"2026-07-18T01:38Z","game_id":"401816152"},{"timestamp":1784338680,"team_name":"Angels","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Detroit Tigers","team_score":"1","opp_score":"2","date_str":"2 days ago","date_raw":"2026-07-18T01:38Z","game_id":"401816152"},{"timestamp":1784335200,"team_name":"Reds","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Colorado Rockies","team_score":"7","opp_score":"2","date_str":"2 days ago","date_raw":"2026-07-18T00:40Z","game_id":"401816151"},{"timestamp":1784335200,"team_name":"Rockies","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Cincinnati Reds","team_score":"2","opp_score":"7","date_str":"2 days ago","date_raw":"2026-07-18T00:40Z","game_id":"401816151"},{"timestamp":1784333400,"team_name":"Orioles","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Houston Astros","team_score":"3","opp_score":"2","date_str":"2 days ago","date_raw":"2026-07-18T00:10Z","game_id":"401816147"},{"timestamp":1784333400,"team_name":"Royals","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"San Diego Padres","team_score":"7","opp_score":"6","date_str":"2 days ago","date_raw":"2026-07-18T00:10Z","game_id":"401816150"},{"timestamp":1784333400,"team_name":"Astros","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Baltimore Orioles","team_score":"2","opp_score":"3","date_str":"2 days ago","date_raw":"2026-07-18T00:10Z","game_id":"401816147"},{"timestamp":1784333400,"team_name":"Padres","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Kansas City Royals","team_score":"6","opp_score":"7","date_str":"2 days ago","date_raw":"2026-07-18T00:10Z","game_id":"401816150"},{"timestamp":1784333100,"team_name":"Cubs","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Minnesota Twins","team_score":"2","opp_score":"5","date_str":"2 days ago","date_raw":"2026-07-18T00:05Z","game_id":"401816149"},{"timestamp":1784333100,"team_name":"Twins","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Chicago Cubs","team_score":"5","opp_score":"2","date_str":"2 days ago","date_raw":"2026-07-18T00:05Z","game_id":"401816149"},{"timestamp":1784331600,"team_name":"Marlins","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Milwaukee Brewers","team_score":"1","opp_score":"2","date_str":"2 days ago","date_raw":"2026-07-17T23:40Z","game_id":"401816148"},{"timestamp":1784331600,"team_name":"Brewers","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Miami Marlins","team_score":"2","opp_score":"1","date_str":"2 days ago","date_raw":"2026-07-17T23:40Z","game_id":"401816148"},{"timestamp":1784330100,"team_name":"Braves","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Texas Rangers","team_score":"15","opp_score":"1","date_str":"2 days ago","date_raw":"2026-07-17T23:15Z","game_id":"401816146"},{"timestamp":1784330100,"team_name":"White Sox","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Toronto Blue Jays","team_score":"12","opp_score":"4","date_str":"2 days ago","date_raw":"2026-07-17T23:15Z","game_id":"401816141"},{"timestamp":1784330100,"team_name":"Rangers","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Atlanta Braves","team_score":"1","opp_score":"15","date_str":"2 days ago","date_raw":"2026-07-17T23:15Z","game_id":"401816146"},{"timestamp":1784330100,"team_name":"Blue Jays","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Chicago White Sox","team_score":"4","opp_score":"12","date_str":"2 days ago","date_raw":"2026-07-17T23:15Z","game_id":"401816141"},{"timestamp":1784329800,"team_name":"Red Sox","label":"Baseball","outcome":"Won","vsAt":"vs","opponent":"Tampa Bay Rays","team_score":"5","opp_score":"3","date_str":"2 days ago","date_raw":"2026-07-17T23:10Z","game_id":"401816145"},{"timestamp":1784329800,"team_name":"Rays","label":"Baseball","outcome":"Lost","vsAt":"@","opponent":"Boston Red Sox","team_score":"3","opp_score":"5","date_str":"2 days ago","date_raw":"2026-07-17T23:10Z","game_id":"401816145"},{"timestamp":1784329500,"team_name":"Yankees","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Los Angeles Dodgers","team_score":"1","opp_score":"2","date_str":"2 days ago","date_raw":"2026-07-17T23:05Z","game_id":"401816142"},{"timestamp":1784329500,"team_name":"Dodgers","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"New York Yankees","team_score":"2","opp_score":"1","date_str":"2 days ago","date_raw":"2026-07-17T23:05Z","game_id":"401816142"},{"timestamp":1784239200,"team_name":"Mets","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Philadelphia Phillies","team_score":"4","opp_score":"1","date_str":"Jul 16","date_raw":"2026-07-16T22:00Z","game_id":"401816143"},{"timestamp":1784239200,"team_name":"Phillies","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"New York Mets","team_score":"1","opp_score":"4","date_str":"Jul 16","date_raw":"2026-07-16T22:00Z","game_id":"401816143"},{"timestamp":1783887000,"team_name":"Dodgers","label":"Baseball","outcome":"Lost","vsAt":"vs","opponent":"Arizona Diamondbacks","team_score":"3","opp_score":"5","date_str":"Jul 12","date_raw":"2026-07-12T20:10Z","game_id":"401816138"},{"timestamp":1783877700,"team_name":"Yankees","label":"Baseball","outcome":"Won","vsAt":"@","opponent":"Washington Nationals","team_score":"5","opp_score":"3","date_str":"Jul 12","date_raw":"2026-07-12T17:35Z","game_id":"401816131"}],"upcoming":[{"timestamp":1784488200,"team_name":"Reds","label":"Baseball","vsAt":"@","opponent":"Colorado Rockies","date_str":"Today, 2:10 PM","date_raw":"2026-07-19T19:10Z","game_id":"401816181"},{"timestamp":1784488200,"team_name":"Rockies","label":"Baseball","vsAt":"vs","opponent":"Cincinnati Reds","date_str":"Today, 2:10 PM","date_raw":"2026-07-19T19:10Z","game_id":"401816181"},{"timestamp":1784491500,"team_name":"Nationals","label":"Baseball","vsAt":"@","opponent":"Athletics","date_str":"Today, 3:05 PM","date_raw":"2026-07-19T20:05Z","game_id":"401816185"},{"timestamp":1784491500,"team_name":"Athletics","label":"Baseball","vsAt":"vs","opponent":"Washington Nationals","date_str":"Today, 3:05 PM","date_raw":"2026-07-19T20:05Z","game_id":"401816185"},{"timestamp":1784491620,"team_name":"Tigers","label":"Baseball","vsAt":"@","opponent":"Los Angeles Angels","date_str":"Today, 3:07 PM","date_raw":"2026-07-19T20:07Z","game_id":"401816182"},{"timestamp":1784491620,"team_name":"Angels","label":"Baseball","vsAt":"vs","opponent":"Detroit Tigers","date_str":"Today, 3:07 PM","date_raw":"2026-07-19T20:07Z","game_id":"401816182"},{"timestamp":1784491800,"team_name":"Cardinals","label":"Baseball","vsAt":"@","opponent":"Arizona Diamondbacks","date_str":"Today, 3:10 PM","date_raw":"2026-07-19T20:10Z","game_id":"401816184"},{"timestamp":1784491800,"team_name":"Diamondbacks","label":"Baseball","vsAt":"vs","opponent":"St. Louis Cardinals","date_str":"Today, 3:10 PM","date_raw":"2026-07-19T20:10Z","game_id":"401816184"},{"timestamp":1784491800,"team_name":"Giants","label":"Baseball","vsAt":"@","opponent":"Seattle Mariners","date_str":"Today, 3:10 PM","date_raw":"2026-07-19T20:10Z","game_id":"401816183"},{"timestamp":1784491800,"team_name":"Mariners","label":"Baseball","vsAt":"vs","opponent":"San Francisco Giants","date_str":"Today, 3:10 PM","date_raw":"2026-07-19T20:10Z","game_id":"401816183"}]},"WNBA":{"latest_timestamp":1784421000,"live":[{"timestamp":1784480400,"team_name":"Wings","label":"WNBA","outcome":"live","live_status":"Winning","team_score":61,"opp_score":58,"vsAt":"vs","opponent":"Los Angeles Sparks","progress":"2:03 - 3rd Quarter","date_raw":"2026-07-19T17:00Z","game_id":"401857080"},{"timestamp":1784480400,"team_name":"Sparks","label":"WNBA","outcome":"live","live_status":"Losing","team_score":58,"opp_score":61,"vsAt":"@","opponent":"Dallas Wings","progress":"2:03 - 3rd Quarter","date_raw":"2026-07-19T17:00Z","game_id":"401857080"}],"games":[{"timestamp":1784421000,"team_name":"Mystics","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Golden State Valkyries","team_score":"69","opp_score":"74","date_str":"Yesterday","date_raw":"2026-07-19T00:30Z","game_id":"401857079"},{"timestamp":1784421000,"team_name":"Valkyries","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Washington Mystics","team_score":"74","opp_score":"69","date_str":"Yesterday","date_raw":"2026-07-19T00:30Z","game_id":"401857079"},{"timestamp":1784419200,"team_name":"Liberty","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Indiana Fever","team_score":"88","opp_score":"108","date_str":"Yesterday","date_raw":"2026-07-19T00:00Z","game_id":"401857077"},{"timestamp":1784419200,"team_name":"Fever","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"New York Liberty","team_score":"108","opp_score":"88","date_str":"Yesterday","date_raw":"2026-07-19T00:00Z","game_id":"401857077"},{"timestamp":1784419200,"team_name":"Lynx","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Portland Fire","team_score":"101","opp_score":"93","date_str":"Yesterday","date_raw":"2026-07-19T00:00Z","game_id":"401857078"},{"timestamp":1784419200,"team_name":"Fire","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Minnesota Lynx","team_score":"93","opp_score":"101","date_str":"Yesterday","date_raw":"2026-07-19T00:00Z","game_id":"401857078"},{"timestamp":1784340000,"team_name":"Sun","label":"Basketball","outcome":"Won","vsAt":"@","opponent":"Phoenix Mercury","team_score":"96","opp_score":"83","date_str":"2 days ago","date_raw":"2026-07-18T02:00Z","game_id":"401857076"},{"timestamp":1784340000,"team_name":"Mercury","label":"Basketball","outcome":"Lost","vsAt":"vs","opponent":"Connecticut Sun","team_score":"83","opp_score":"96","date_str":"2 days ago","date_raw":"2026-07-18T02:00Z","game_id":"401857076"},{"timestamp":1784331000,"team_name":"Dream","label":"Basketball","outcome":"Won","vsAt":"@","opponent":"Toronto Tempo","team_score":"111","opp_score":"92","date_str":"2 days ago","date_raw":"2026-07-17T23:30Z","game_id":"401857074"},{"timestamp":1784331000,"team_name":"Fever","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Seattle Storm","team_score":"110","opp_score":"107","date_str":"2 days ago","date_raw":"2026-07-17T23:30Z","game_id":"401857073"},{"timestamp":1784331000,"team_name":"Sky","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Los Angeles Sparks","team_score":"96","opp_score":"82","date_str":"2 days ago","date_raw":"2026-07-17T23:30Z","game_id":"401857075"},{"timestamp":1784331000,"team_name":"Sparks","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Chicago Sky","team_score":"82","opp_score":"96","date_str":"2 days ago","date_raw":"2026-07-17T23:30Z","game_id":"401857075"},{"timestamp":1784331000,"team_name":"Storm","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Indiana Fever","team_score":"107","opp_score":"110","date_str":"2 days ago","date_raw":"2026-07-17T23:30Z","game_id":"401857073"},{"timestamp":1784331000,"team_name":"Tempo","label":"Basketball","outcome":"Lost","vsAt":"vs","opponent":"Atlanta Dream","team_score":"92","opp_score":"111","date_str":"2 days ago","date_raw":"2026-07-17T23:30Z","game_id":"401857074"},{"timestamp":1784242800,"team_name":"Mystics","label":"Basketball","outcome":"Lost","vsAt":"vs","opponent":"Portland Fire","team_score":"56","opp_score":"75","date_str":"Jul 16","date_raw":"2026-07-16T23:00Z","game_id":"401857071"},{"timestamp":1784242800,"team_name":"Fire","label":"Basketball","outcome":"Won","vsAt":"@","opponent":"Washington Mystics","team_score":"75","opp_score":"56","date_str":"Jul 16","date_raw":"2026-07-16T23:00Z","game_id":"401857071"},{"timestamp":1784160000,"team_name":"Valkyries","label":"Basketball","outcome":"Won","vsAt":"@","opponent":"Indiana Fever","team_score":"88","opp_score":"75","date_str":"Jul 15","date_raw":"2026-07-16T00:00Z","game_id":"401857070"},{"timestamp":1784134800,"team_name":"Lynx","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Los Angeles Sparks","team_score":"96","opp_score":"87","date_str":"Jul 15","date_raw":"2026-07-15T17:00Z","game_id":"401857069"},{"timestamp":1784134800,"team_name":"Sparks","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Minnesota Lynx","team_score":"87","opp_score":"96","date_str":"Jul 15","date_raw":"2026-07-15T17:00Z","game_id":"401857069"},{"timestamp":1784131200,"team_name":"Sky","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Seattle Storm","team_score":"95","opp_score":"90","date_str":"Jul 15","date_raw":"2026-07-15T16:00Z","game_id":"401857068"},{"timestamp":1784131200,"team_name":"Storm","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Chicago Sky","team_score":"90","opp_score":"95","date_str":"Jul 15","date_raw":"2026-07-15T16:00Z","game_id":"401857068"},{"timestamp":1784070000,"team_name":"Tempo","label":"Basketball","outcome":"Lost","vsAt":"vs","opponent":"Washington Mystics","team_score":"62","opp_score":"79","date_str":"Jul 14","date_raw":"2026-07-14T23:00Z","game_id":"401857067"},{"timestamp":1784041200,"team_name":"Sun","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Portland Fire","team_score":"90","opp_score":"87","date_str":"Jul 14","date_raw":"2026-07-14T15:00Z","game_id":"401857066"},{"timestamp":1783990800,"team_name":"Mercury","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Minnesota Lynx","team_score":"100","opp_score":"104","date_str":"Jul 13","date_raw":"2026-07-14T01:00Z","game_id":"401857065"},{"timestamp":1783983600,"team_name":"Dream","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Los Angeles Sparks","team_score":"101","opp_score":"92","date_str":"Jul 13","date_raw":"2026-07-13T23:00Z","game_id":"401857064"},{"timestamp":1783904400,"team_name":"Aces","label":"Basketball","outcome":"Lost","vsAt":"vs","opponent":"Indiana Fever","team_score":"75","opp_score":"109","date_str":"Jul 12","date_raw":"2026-07-13T01:00Z","game_id":"401857063"},{"timestamp":1783897200,"team_name":"Wings","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Chicago Sky","team_score":"96","opp_score":"91","date_str":"Jul 12","date_raw":"2026-07-12T23:00Z","game_id":"401857062"},{"timestamp":1783882800,"team_name":"Liberty","label":"Basketball","outcome":"Lost","vsAt":"@","opponent":"Toronto Tempo","team_score":"91","opp_score":"93","date_str":"Jul 12","date_raw":"2026-07-12T19:00Z","game_id":"401857060"},{"timestamp":1783807200,"team_name":"Aces","label":"Basketball","outcome":"Won","vsAt":"vs","opponent":"Phoenix Mercury","team_score":"106","opp_score":"58","date_str":"Jul 11","date_raw":"2026-07-11T22:00Z","game_id":"401857058"},{"timestamp":1783726200,"team_name":"Wings","label":"Basketball","outcome":"Won","vsAt":"@","opponent":"Toronto Tempo","team_score":"108","opp_score":"95","date_str":"Jul 10","date_raw":"2026-07-10T23:30Z","game_id":"401857055"}],"upcoming":[{"timestamp":1784491200,"team_name":"Dream","label":"Basketball","vsAt":"vs","opponent":"Chicago Sky","date_str":"Today, 3:00 PM","date_raw":"2026-07-19T20:00Z","game_id":"401857081"},{"timestamp":1784491200,"team_name":"Sky","label":"Basketball","vsAt":"@","opponent":"Atlanta Dream","date_str":"Today, 3:00 PM","date_raw":"2026-07-19T20:00Z","game_id":"401857081"},{"timestamp":1784502000,"team_name":"Sun","label":"Basketball","vsAt":"@","opponent":"Phoenix Mercury","date_str":"Today, 6:00 PM","date_raw":"2026-07-19T23:00Z","game_id":"401857082"},{"timestamp":1784502000,"team_name":"Mercury","label":"Basketball","vsAt":"vs","opponent":"Connecticut Sun","date_str":"Today, 6:00 PM","date_raw":"2026-07-19T23:00Z","game_id":"401857082"},{"timestamp":1784592000,"team_name":"Wings","label":"Basketball","vsAt":"vs","opponent":"New York Liberty","date_str":"Tomorrow, 7:00 PM","date_raw":"2026-07-21T00:00Z","game_id":"401892393"},{"timestamp":1784592000,"team_name":"Aces","label":"Basketball","vsAt":"@","opponent":"Toronto Tempo","date_str":"Tomorrow, 7:00 PM","date_raw":"2026-07-21T00:00Z","game_id":"401857083"},{"timestamp":1784592000,"team_name":"Tempo","label":"Basketball","vsAt":"vs","opponent":"Las Vegas Aces","date_str":"Tomorrow, 7:00 PM","date_raw":"2026-07-21T00:00Z","game_id":"401857083"},{"timestamp":1784599200,"team_name":"Mystics","label":"Basketball","vsAt":"@","opponent":"Golden State Valkyries","date_str":"Tomorrow, 9:00 PM","date_raw":"2026-07-21T02:00Z","game_id":"401857084"},{"timestamp":1784599200,"team_name":"Lynx","label":"Basketball","vsAt":"@","opponent":"Seattle Storm","date_str":"Tomorrow, 9:00 PM","date_raw":"2026-07-21T02:00Z","game_id":"401857085"},{"timestamp":1784599200,"team_name":"Valkyries","label":"Basketball","vsAt":"vs","opponent":"Washington Mystics","date_str":"Tomorrow, 9:00 PM","date_raw":"2026-07-21T02:00Z","game_id":"401857084"},{"timestamp":1784599200,"team_name":"Storm","label":"Basketball","vsAt":"vs","opponent":"Minnesota Lynx","date_str":"Tomorrow, 9:00 PM","date_raw":"2026-07-21T02:00Z","game_id":"401857085"},{"timestamp":1784746800,"team_name":"Sparks","label":"Basketball","vsAt":"vs","opponent":"Phoenix Mercury","date_str":"Jul 22, 2:00 PM","date_raw":"2026-07-22T19:00Z","game_id":"401857086"},{"timestamp":1784764800,"team_name":"Fever","label":"Basketball","vsAt":"vs","opponent":"Connecticut Sun","date_str":"Jul 22, 7:00 PM","date_raw":"2026-07-23T00:00Z","game_id":"401857090"}]},"FIFA":{"latest_timestamp":1783382400,"live":[],"games":[{"timestamp":1783382400,"team_name":"USA","label":"World Cup Round of 16","outcome":"Lost","vsAt":"vs","opponent":"Belgium","team_score":"1","opp_score":"4","date_str":"Jul 6","date_raw":"2026-07-07T00:00Z","game_id":"760507"},{"timestamp":1782950400,"team_name":"USA","label":"World Cup Round of 32","outcome":"Won","vsAt":"vs","opponent":"Bosnia-Herzegovina","team_score":"2","opp_score":"0","date_str":"Jul 1","date_raw":"2026-07-02T00:00Z","game_id":"760494"}],"upcoming":[]},"NFL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NBA":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NHL":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAM":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]},"NCAAW":{"latest_timestamp":0,"live":[],"games":[],"upcoming":[]}}},"_major_events":[],"_all_teams":[{"name":"Patriots","league":"NFL","abbr":"ne","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"New England","state":"Massachusetts","search":"Foxborough Boston","mascot":""},{"name":"Celtics","league":"NBA","abbr":"bos","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"Boston","state":"Massachusetts","search":"","mascot":""},{"name":"Red Sox","league":"MLB","abbr":"bos","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"Boston","state":"Massachusetts","search":"","mascot":""},{"name":"Bruins","league":"NHL","abbr":"bos","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"Boston","state":"Massachusetts","search":"","mascot":""},{"name":"Bills","league":"NFL","abbr":"buf","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"Buffalo","state":"New York","search":"","mascot":""},{"name":"Sabres","league":"NHL","abbr":"buf","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"Buffalo","state":"New York","search":"","mascot":""},{"name":"Giants","league":"NFL","abbr":"nyg","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"New York","state":"New York","search":"New Jersey East Rutherford","mascot":""},{"name":"Jets","league":"NFL","abbr":"nyj","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"New York","state":"New York","search":"New Jersey East Rutherford","mascot":""},{"name":"Knicks","league":"NBA","abbr":"ny","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"New York","state":"New York","search":"","mascot":""},{"name":"Nets","league":"NBA","abbr":"bkn","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"Brooklyn","state":"New York","search":"New York","mascot":""},{"name":"Yankees","league":"MLB","abbr":"nyy","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"New York","state":"New York","search":"Bronx","mascot":""},{"name":"Mets","league":"MLB","abbr":"nym","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"New York","state":"New York","search":"Queens","mascot":""},{"name":"Rangers","league":"NHL","abbr":"nyr","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"New York","state":"New York","search":"","mascot":""},{"name":"Islanders","league":"NHL","abbr":"nyi","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"New York","state":"New York","search":"Long Island Elmont","mascot":""},{"name":"Devils","league":"NHL","abbr":"nj","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"New Jersey","state":"New Jersey","search":"Newark New York","mascot":""},{"name":"Liberty","league":"WNBA","abbr":"ny","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"New York","state":"New York","search":"Brooklyn","mascot":""},{"name":"Sun","league":"WNBA","abbr":"con","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"Connecticut","state":"Connecticut","search":"Uncasville","mascot":""},{"name":"UConn","league":"NCAAM","abbr":"conn","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"","state":"Connecticut","search":"Storrs","mascot":"Huskies"},{"name":"UConn","league":"NCAAW","abbr":"conn","city_key":"newyork_newengland","city_label":"New York \u0026 New England","city":"","state":"Connecticut","search":"Storrs","mascot":"Huskies"},{"name":"Ravens","league":"NFL","abbr":"bal","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"Baltimore","state":"Maryland","search":"","mascot":""},{"name":"Orioles","league":"MLB","abbr":"bal","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"Baltimore","state":"Maryland","search":"","mascot":""},{"name":"Eagles","league":"NFL","abbr":"phi","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"Philadelphia","state":"Pennsylvania","search":"","mascot":""},{"name":"76ers","league":"NBA","abbr":"phi","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"Philadelphia","state":"Pennsylvania","search":"","mascot":""},{"name":"Phillies","league":"MLB","abbr":"phi","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"Philadelphia","state":"Pennsylvania","search":"","mascot":""},{"name":"Flyers","league":"NHL","abbr":"phi","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"Philadelphia","state":"Pennsylvania","search":"","mascot":""},{"name":"Steelers","league":"NFL","abbr":"pit","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"Pittsburgh","state":"Pennsylvania","search":"","mascot":""},{"name":"Pirates","league":"MLB","abbr":"pit","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"Pittsburgh","state":"Pennsylvania","search":"","mascot":""},{"name":"Penguins","league":"NHL","abbr":"pit","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"Pittsburgh","state":"Pennsylvania","search":"","mascot":""},{"name":"Commanders","league":"NFL","abbr":"wsh","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"Washington","state":"D.C.","search":"DC Landover Maryland","mascot":""},{"name":"Wizards","league":"NBA","abbr":"wsh","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"Washington","state":"D.C.","search":"DC","mascot":""},{"name":"Nationals","league":"MLB","abbr":"wsh","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"Washington","state":"D.C.","search":"DC","mascot":""},{"name":"Capitals","league":"NHL","abbr":"wsh","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"Washington","state":"D.C.","search":"DC","mascot":""},{"name":"Mystics","league":"WNBA","abbr":"wsh","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"Washington","state":"D.C.","search":"DC","mascot":""},{"name":"Villanova","league":"NCAAM","abbr":"vill","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"","state":"Pennsylvania","search":"Philadelphia","mascot":"Wildcats"},{"name":"Villanova","league":"NCAAW","abbr":"vill","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"","state":"Pennsylvania","search":"Philadelphia","mascot":"Wildcats"},{"name":"Georgetown","league":"NCAAM","abbr":"gtwn","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"","state":"D.C.","search":"Washington DC","mascot":"Hoyas"},{"name":"Georgetown","league":"NCAAW","abbr":"gtwn","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"","state":"D.C.","search":"Washington DC","mascot":"Hoyas"},{"name":"Maryland","league":"NCAAM","abbr":"md","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"","state":"Maryland","search":"College Park","mascot":"Terrapins"},{"name":"Maryland","league":"NCAAW","abbr":"md","city_key":"mid_atlantic","city_label":"Mid-Atlantic","city":"","state":"Maryland","search":"College Park","mascot":"Terrapins"},{"name":"Falcons","league":"NFL","abbr":"atl","city_key":"southeast","city_label":"Southeast","city":"Atlanta","state":"Georgia","search":"","mascot":""},{"name":"Hawks","league":"NBA","abbr":"atl","city_key":"southeast","city_label":"Southeast","city":"Atlanta","state":"Georgia","search":"","mascot":""},{"name":"Braves","league":"MLB","abbr":"atl","city_key":"southeast","city_label":"Southeast","city":"Atlanta","state":"Georgia","search":"","mascot":""},{"name":"Panthers","league":"NFL","abbr":"car","city_key":"southeast","city_label":"Southeast","city":"Carolina","state":"North Carolina","search":"Charlotte","mascot":""},{"name":"Hornets","league":"NBA","abbr":"cha","city_key":"southeast","city_label":"Southeast","city":"Charlotte","state":"North Carolina","search":"","mascot":""},{"name":"Hurricanes","league":"NHL","abbr":"car","city_key":"southeast","city_label":"Southeast","city":"Carolina","state":"North Carolina","search":"Raleigh","mascot":""},{"name":"Titans","league":"NFL","abbr":"ten","city_key":"southeast","city_label":"Southeast","city":"Tennessee","state":"Tennessee","search":"Nashville","mascot":""},{"name":"Predators","league":"NHL","abbr":"nsh","city_key":"southeast","city_label":"Southeast","city":"Nashville","state":"Tennessee","search":"","mascot":""},{"name":"Dream","league":"WNBA","abbr":"atl","city_key":"southeast","city_label":"Southeast","city":"Atlanta","state":"Georgia","search":"","mascot":""},{"name":"Duke","league":"NCAAM","abbr":"duke","city_key":"southeast","city_label":"Southeast","city":"","state":"North Carolina","search":"Durham","mascot":"Blue Devils"},{"name":"Duke","league":"NCAAW","abbr":"duke","city_key":"southeast","city_label":"Southeast","city":"","state":"North Carolina","search":"Durham","mascot":"Blue Devils"},{"name":"North Carolina","league":"NCAAM","abbr":"unc","city_key":"southeast","city_label":"Southeast","city":"","state":"North Carolina","search":"Chapel Hill","mascot":"Tar Heels"},{"name":"North Carolina","league":"NCAAW","abbr":"unc","city_key":"southeast","city_label":"Southeast","city":"","state":"North Carolina","search":"Chapel Hill","mascot":"Tar Heels"},{"name":"Tennessee","league":"NCAAM","abbr":"tenn","city_key":"southeast","city_label":"Southeast","city":"","state":"Tennessee","search":"Knoxville","mascot":"Volunteers"},{"name":"Tennessee","league":"NCAAW","abbr":"tenn","city_key":"southeast","city_label":"Southeast","city":"","state":"Tennessee","search":"Knoxville","mascot":"Lady Volunteers"},{"name":"South Carolina","league":"NCAAM","abbr":"sc","city_key":"southeast","city_label":"Southeast","city":"","state":"South Carolina","search":"Columbia","mascot":"Gamecocks"},{"name":"South Carolina","league":"NCAAW","abbr":"sc","city_key":"southeast","city_label":"Southeast","city":"","state":"South Carolina","search":"Columbia","mascot":"Gamecocks"},{"name":"Dolphins","league":"NFL","abbr":"mia","city_key":"florida","city_label":"Florida","city":"Miami","state":"Florida","search":"","mascot":""},{"name":"Heat","league":"NBA","abbr":"mia","city_key":"florida","city_label":"Florida","city":"Miami","state":"Florida","search":"","mascot":""},{"name":"Marlins","league":"MLB","abbr":"mia","city_key":"florida","city_label":"Florida","city":"Miami","state":"Florida","search":"","mascot":""},{"name":"Panthers","league":"NHL","abbr":"fla","city_key":"florida","city_label":"Florida","city":"Florida","state":"Florida","search":"Sunrise Miami","mascot":""},{"name":"Jaguars","league":"NFL","abbr":"jax","city_key":"florida","city_label":"Florida","city":"Jacksonville","state":"Florida","search":"","mascot":""},{"name":"Magic","league":"NBA","abbr":"orl","city_key":"florida","city_label":"Florida","city":"Orlando","state":"Florida","search":"","mascot":""},{"name":"Buccaneers","league":"NFL","abbr":"tb","city_key":"florida","city_label":"Florida","city":"Tampa Bay","state":"Florida","search":"Tampa","mascot":""},{"name":"Rays","league":"MLB","abbr":"tb","city_key":"florida","city_label":"Florida","city":"Tampa Bay","state":"Florida","search":"Tampa St. Petersburg","mascot":""},{"name":"Lightning","league":"NHL","abbr":"tb","city_key":"florida","city_label":"Florida","city":"Tampa Bay","state":"Florida","search":"Tampa","mascot":""},{"name":"Florida","league":"NCAAM","abbr":"fla","city_key":"florida","city_label":"Florida","city":"","state":"Florida","search":"Gainesville","mascot":"Gators"},{"name":"Florida","league":"NCAAW","abbr":"fla","city_key":"florida","city_label":"Florida","city":"","state":"Florida","search":"Gainesville","mascot":"Gators"},{"name":"Miami","league":"NCAAM","abbr":"mia","city_key":"florida","city_label":"Florida","city":"","state":"Florida","search":"Coral Gables","mascot":"Hurricanes"},{"name":"Miami","league":"NCAAW","abbr":"mia","city_key":"florida","city_label":"Florida","city":"","state":"Florida","search":"Coral Gables","mascot":"Hurricanes"},{"name":"Bengals","league":"NFL","abbr":"cin","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"Cincinnati","state":"Ohio","search":"","mascot":""},{"name":"Reds","league":"MLB","abbr":"cin","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"Cincinnati","state":"Ohio","search":"","mascot":""},{"name":"Browns","league":"NFL","abbr":"cle","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"Cleveland","state":"Ohio","search":"","mascot":""},{"name":"Cavaliers","league":"NBA","abbr":"cle","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"Cleveland","state":"Ohio","search":"","mascot":""},{"name":"Guardians","league":"MLB","abbr":"cle","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"Cleveland","state":"Ohio","search":"","mascot":""},{"name":"Blue Jackets","league":"NHL","abbr":"cbj","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"Columbus","state":"Ohio","search":"","mascot":""},{"name":"Lions","league":"NFL","abbr":"det","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"Detroit","state":"Michigan","search":"","mascot":""},{"name":"Pistons","league":"NBA","abbr":"det","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"Detroit","state":"Michigan","search":"","mascot":""},{"name":"Tigers","league":"MLB","abbr":"det","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"Detroit","state":"Michigan","search":"","mascot":""},{"name":"Red Wings","league":"NHL","abbr":"det","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"Detroit","state":"Michigan","search":"","mascot":""},{"name":"Colts","league":"NFL","abbr":"ind","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"Indianapolis","state":"Indiana","search":"","mascot":""},{"name":"Pacers","league":"NBA","abbr":"ind","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"Indianapolis","state":"Indiana","search":"","mascot":""},{"name":"Fever","league":"WNBA","abbr":"ind","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"Indianapolis","state":"Indiana","search":"","mascot":""},{"name":"Indiana","league":"NCAAM","abbr":"iu","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"","state":"Indiana","search":"Bloomington","mascot":"Hoosiers"},{"name":"Indiana","league":"NCAAW","abbr":"iu","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"","state":"Indiana","search":"Bloomington","mascot":"Hoosiers"},{"name":"Ohio State","league":"NCAAM","abbr":"osu","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"","state":"Ohio","search":"Columbus","mascot":"Buckeyes"},{"name":"Ohio State","league":"NCAAW","abbr":"osu","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"","state":"Ohio","search":"Columbus","mascot":"Buckeyes"},{"name":"Michigan St","league":"NCAAM","abbr":"msu","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"","state":"Michigan","search":"East Lansing","mascot":"Spartans"},{"name":"Michigan St","league":"NCAAW","abbr":"msu","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"","state":"Michigan","search":"East Lansing","mascot":"Spartans"},{"name":"Michigan","league":"NCAAM","abbr":"mich","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"","state":"Michigan","search":"Ann Arbor","mascot":"Wolverines"},{"name":"Michigan","league":"NCAAW","abbr":"mich","city_key":"great_lakes","city_label":"Great Lakes \u0026 Ohio Valley","city":"","state":"Michigan","search":"Ann Arbor","mascot":"Wolverines"},{"name":"Bears","league":"NFL","abbr":"chi","city_key":"chicago_wisconsin","city_label":"Chicago \u0026 Wisconsin","city":"Chicago","state":"Illinois","search":"","mascot":""},{"name":"Bulls","league":"NBA","abbr":"chi","city_key":"chicago_wisconsin","city_label":"Chicago \u0026 Wisconsin","city":"Chicago","state":"Illinois","search":"","mascot":""},{"name":"Cubs","league":"MLB","abbr":"chc","city_key":"chicago_wisconsin","city_label":"Chicago \u0026 Wisconsin","city":"Chicago","state":"Illinois","search":"","mascot":""},{"name":"White Sox","league":"MLB","abbr":"chw","city_key":"chicago_wisconsin","city_label":"Chicago \u0026 Wisconsin","city":"Chicago","state":"Illinois","search":"","mascot":""},{"name":"Blackhawks","league":"NHL","abbr":"chi","city_key":"chicago_wisconsin","city_label":"Chicago \u0026 Wisconsin","city":"Chicago","state":"Illinois","search":"","mascot":""},{"name":"Packers","league":"NFL","abbr":"gb","city_key":"chicago_wisconsin","city_label":"Chicago \u0026 Wisconsin","city":"Green Bay","state":"Wisconsin","search":"","mascot":""},{"name":"Bucks","league":"NBA","abbr":"mil","city_key":"chicago_wisconsin","city_label":"Chicago \u0026 Wisconsin","city":"Milwaukee","state":"Wisconsin","search":"","mascot":""},{"name":"Brewers","league":"MLB","abbr":"mil","city_key":"chicago_wisconsin","city_label":"Chicago \u0026 Wisconsin","city":"Milwaukee","state":"Wisconsin","search":"","mascot":""},{"name":"Sky","league":"WNBA","abbr":"chi","city_key":"chicago_wisconsin","city_label":"Chicago \u0026 Wisconsin","city":"Chicago","state":"Illinois","search":"","mascot":""},{"name":"Illinois","league":"NCAAM","abbr":"ill","city_key":"chicago_wisconsin","city_label":"Chicago \u0026 Wisconsin","city":"","state":"Illinois","search":"Champaign Urbana","mascot":"Fighting Illini"},{"name":"Illinois","league":"NCAAW","abbr":"ill","city_key":"chicago_wisconsin","city_label":"Chicago \u0026 Wisconsin","city":"","state":"Illinois","search":"Champaign Urbana","mascot":"Fighting Illini"},{"name":"Wisconsin","league":"NCAAM","abbr":"wis","city_key":"chicago_wisconsin","city_label":"Chicago \u0026 Wisconsin","city":"","state":"Wisconsin","search":"Madison","mascot":"Badgers"},{"name":"Wisconsin","league":"NCAAW","abbr":"wis","city_key":"chicago_wisconsin","city_label":"Chicago \u0026 Wisconsin","city":"","state":"Wisconsin","search":"Madison","mascot":"Badgers"},{"name":"Marquette","league":"NCAAM","abbr":"marq","city_key":"chicago_wisconsin","city_label":"Chicago \u0026 Wisconsin","city":"","state":"Wisconsin","search":"Milwaukee","mascot":"Golden Eagles"},{"name":"Marquette","league":"NCAAW","abbr":"marq","city_key":"chicago_wisconsin","city_label":"Chicago \u0026 Wisconsin","city":"","state":"Wisconsin","search":"Milwaukee","mascot":"Golden Eagles"},{"name":"Vikings","league":"NFL","abbr":"min","city_key":"upper_midwest","city_label":"Upper Midwest","city":"Minnesota","state":"Minnesota","search":"Minneapolis","mascot":""},{"name":"Timberwolves","league":"NBA","abbr":"min","city_key":"upper_midwest","city_label":"Upper Midwest","city":"Minnesota","state":"Minnesota","search":"Minneapolis","mascot":""},{"name":"Twins","league":"MLB","abbr":"min","city_key":"upper_midwest","city_label":"Upper Midwest","city":"Minnesota","state":"Minnesota","search":"Minneapolis","mascot":""},{"name":"Wild","league":"NHL","abbr":"min","city_key":"upper_midwest","city_label":"Upper Midwest","city":"Minnesota","state":"Minnesota","search":"Saint Paul","mascot":""},{"name":"Jets","league":"NHL","abbr":"wpg","city_key":"upper_midwest","city_label":"Upper Midwest","city":"Winnipeg","state":"Manitoba","search":"Canada","mascot":""},{"name":"Lynx","league":"WNBA","abbr":"min","city_key":"upper_midwest","city_label":"Upper Midwest","city":"Minnesota","state":"Minnesota","search":"Minneapolis","mascot":""},{"name":"Minnesota","league":"NCAAM","abbr":"minn","city_key":"upper_midwest","city_label":"Upper Midwest","city":"","state":"Minnesota","search":"Minneapolis","mascot":"Golden Gophers"},{"name":"Minnesota","league":"NCAAW","abbr":"minn","city_key":"upper_midwest","city_label":"Upper Midwest","city":"","state":"Minnesota","search":"Minneapolis","mascot":"Golden Gophers"},{"name":"Chiefs","league":"NFL","abbr":"kc","city_key":"midwest_central","city_label":"Mid-Central Plains","city":"Kansas City","state":"Missouri","search":"","mascot":""},{"name":"Royals","league":"MLB","abbr":"kc","city_key":"midwest_central","city_label":"Mid-Central Plains","city":"Kansas City","state":"Missouri","search":"","mascot":""},{"name":"Grizzlies","league":"NBA","abbr":"mem","city_key":"midwest_central","city_label":"Mid-Central Plains","city":"Memphis","state":"Tennessee","search":"","mascot":""},{"name":"Saints","league":"NFL","abbr":"no","city_key":"midwest_central","city_label":"Mid-Central Plains","city":"New Orleans","state":"Louisiana","search":"","mascot":""},{"name":"Pelicans","league":"NBA","abbr":"no","city_key":"midwest_central","city_label":"Mid-Central Plains","city":"New Orleans","state":"Louisiana","search":"","mascot":""},{"name":"Cardinals","league":"MLB","abbr":"stl","city_key":"midwest_central","city_label":"Mid-Central Plains","city":"St. Louis","state":"Missouri","search":"Saint Louis","mascot":""},{"name":"Blues","league":"NHL","abbr":"stl","city_key":"midwest_central","city_label":"Mid-Central Plains","city":"St. Louis","state":"Missouri","search":"Saint Louis","mascot":""},{"name":"Kansas","league":"NCAAM","abbr":"ku","city_key":"midwest_central","city_label":"Mid-Central Plains","city":"","state":"Kansas","search":"Lawrence","mascot":"Jayhawks"},{"name":"Kansas","league":"NCAAW","abbr":"ku","city_key":"midwest_central","city_label":"Mid-Central Plains","city":"","state":"Kansas","search":"Lawrence","mascot":"Jayhawks"},{"name":"Memphis","league":"NCAAM","abbr":"mem","city_key":"midwest_central","city_label":"Mid-Central Plains","city":"","state":"Tennessee","search":"Memphis","mascot":"Tigers"},{"name":"Memphis","league":"NCAAW","abbr":"mem","city_key":"midwest_central","city_label":"Mid-Central Plains","city":"","state":"Tennessee","search":"Memphis","mascot":"Tigers"},{"name":"Cowboys","league":"NFL","abbr":"dal","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"Dallas","state":"Texas","search":"Arlington","mascot":""},{"name":"Mavericks","league":"NBA","abbr":"dal","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"Dallas","state":"Texas","search":"","mascot":""},{"name":"Rangers","league":"MLB","abbr":"tex","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"Texas","state":"Texas","search":"Arlington Dallas","mascot":""},{"name":"Stars","league":"NHL","abbr":"dal","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"Dallas","state":"Texas","search":"","mascot":""},{"name":"Texans","league":"NFL","abbr":"hou","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"Houston","state":"Texas","search":"","mascot":""},{"name":"Rockets","league":"NBA","abbr":"hou","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"Houston","state":"Texas","search":"","mascot":""},{"name":"Astros","league":"MLB","abbr":"hou","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"Houston","state":"Texas","search":"","mascot":""},{"name":"Thunder","league":"NBA","abbr":"okc","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"Oklahoma City","state":"Oklahoma","search":"","mascot":""},{"name":"Spurs","league":"NBA","abbr":"sa","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"San Antonio","state":"Texas","search":"","mascot":""},{"name":"Wings","league":"WNBA","abbr":"dal","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"Dallas","state":"Texas","search":"Arlington","mascot":""},{"name":"Houston","league":"NCAAM","abbr":"hou","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"","state":"Texas","search":"Houston","mascot":"Cougars"},{"name":"Houston","league":"NCAAW","abbr":"hou","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"","state":"Texas","search":"Houston","mascot":"Cougars"},{"name":"Baylor","league":"NCAAM","abbr":"bay","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"","state":"Texas","search":"Waco","mascot":"Bears"},{"name":"Baylor","league":"NCAAW","abbr":"bay","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"","state":"Texas","search":"Waco","mascot":"Lady Bears"},{"name":"Texas","league":"NCAAM","abbr":"tex","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"","state":"Texas","search":"Austin","mascot":"Longhorns"},{"name":"Texas","league":"NCAAW","abbr":"tex","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"","state":"Texas","search":"Austin","mascot":"Longhorns"},{"name":"Oklahoma","league":"NCAAM","abbr":"ou","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"","state":"Oklahoma","search":"Norman","mascot":"Sooners"},{"name":"Oklahoma","league":"NCAAW","abbr":"ou","city_key":"texas_oklahoma","city_label":"Texas \u0026 Oklahoma","city":"","state":"Oklahoma","search":"Norman","mascot":"Sooners"},{"name":"Cardinals","league":"NFL","abbr":"ari","city_key":"mountain_west","city_label":"Mountain West \u0026 Southwest","city":"Arizona","state":"Arizona","search":"Glendale Phoenix","mascot":""},{"name":"Suns","league":"NBA","abbr":"phx","city_key":"mountain_west","city_label":"Mountain West \u0026 Southwest","city":"Phoenix","state":"Arizona","search":"","mascot":""},{"name":"Diamondbacks","league":"MLB","abbr":"ari","city_key":"mountain_west","city_label":"Mountain West \u0026 Southwest","city":"Arizona","state":"Arizona","search":"Phoenix","mascot":""},{"name":"Broncos","league":"NFL","abbr":"den","city_key":"mountain_west","city_label":"Mountain West \u0026 Southwest","city":"Denver","state":"Colorado","search":"","mascot":""},{"name":"Nuggets","league":"NBA","abbr":"den","city_key":"mountain_west","city_label":"Mountain West \u0026 Southwest","city":"Denver","state":"Colorado","search":"","mascot":""},{"name":"Rockies","league":"MLB","abbr":"col","city_key":"mountain_west","city_label":"Mountain West \u0026 Southwest","city":"Colorado","state":"Colorado","search":"Denver","mascot":""},{"name":"Avalanche","league":"NHL","abbr":"col","city_key":"mountain_west","city_label":"Mountain West \u0026 Southwest","city":"Colorado","state":"Colorado","search":"Denver","mascot":""},{"name":"Raiders","league":"NFL","abbr":"lv","city_key":"mountain_west","city_label":"Mountain West \u0026 Southwest","city":"Las Vegas","state":"Nevada","search":"","mascot":""},{"name":"Golden Knights","league":"NHL","abbr":"vgk","city_key":"mountain_west","city_label":"Mountain West \u0026 Southwest","city":"Vegas","state":"Nevada","search":"Las Vegas","mascot":""},{"name":"Jazz","league":"NBA","abbr":"utah","city_key":"mountain_west","city_label":"Mountain West \u0026 Southwest","city":"Utah","state":"Utah","search":"Salt Lake City","mascot":""},{"name":"Mammoth","league":"NHL","abbr":"utah","city_key":"mountain_west","city_label":"Mountain West \u0026 Southwest","city":"Utah","state":"Utah","search":"Salt Lake City","mascot":""},{"name":"Aces","league":"WNBA","abbr":"lv","city_key":"mountain_west","city_label":"Mountain West \u0026 Southwest","city":"Las Vegas","state":"Nevada","search":"","mascot":""},{"name":"Mercury","league":"WNBA","abbr":"phx","city_key":"mountain_west","city_label":"Mountain West \u0026 Southwest","city":"Phoenix","state":"Arizona","search":"","mascot":""},{"name":"Arizona","league":"NCAAM","abbr":"ariz","city_key":"mountain_west","city_label":"Mountain West \u0026 Southwest","city":"","state":"Arizona","search":"Tucson","mascot":"Wildcats"},{"name":"Arizona","league":"NCAAW","abbr":"ariz","city_key":"mountain_west","city_label":"Mountain West \u0026 Southwest","city":"","state":"Arizona","search":"Tucson","mascot":"Wildcats"},{"name":"Rams","league":"NFL","abbr":"lar","city_key":"southern_california","city_label":"Southern California","city":"Los Angeles","state":"California","search":"Inglewood","mascot":""},{"name":"Chargers","league":"NFL","abbr":"lac","city_key":"southern_california","city_label":"Southern California","city":"Los Angeles","state":"California","search":"Inglewood","mascot":""},{"name":"Lakers","league":"NBA","abbr":"lal","city_key":"southern_california","city_label":"Southern California","city":"Los Angeles","state":"California","search":"","mascot":""},{"name":"Clippers","league":"NBA","abbr":"lac","city_key":"southern_california","city_label":"Southern California","city":"Los Angeles","state":"California","search":"Inglewood","mascot":""},{"name":"Dodgers","league":"MLB","abbr":"lad","city_key":"southern_california","city_label":"Southern California","city":"Los Angeles","state":"California","search":"","mascot":""},{"name":"Angels","league":"MLB","abbr":"laa","city_key":"southern_california","city_label":"Southern California","city":"Los Angeles","state":"California","search":"Anaheim","mascot":""},{"name":"Kings","league":"NHL","abbr":"la","city_key":"southern_california","city_label":"Southern California","city":"Los Angeles","state":"California","search":"","mascot":""},{"name":"Padres","league":"MLB","abbr":"sd","city_key":"southern_california","city_label":"Southern California","city":"San Diego","state":"California","search":"","mascot":""},{"name":"Ducks","league":"NHL","abbr":"ana","city_key":"southern_california","city_label":"Southern California","city":"Anaheim","state":"California","search":"Los Angeles","mascot":""},{"name":"Sparks","league":"WNBA","abbr":"la","city_key":"southern_california","city_label":"Southern California","city":"Los Angeles","state":"California","search":"","mascot":""},{"name":"UCLA","league":"NCAAM","abbr":"ucla","city_key":"southern_california","city_label":"Southern California","city":"","state":"California","search":"Los Angeles Westwood","mascot":"Bruins"},{"name":"UCLA","league":"NCAAW","abbr":"ucla","city_key":"southern_california","city_label":"Southern California","city":"","state":"California","search":"Los Angeles Westwood","mascot":"Bruins"},{"name":"USC","league":"NCAAM","abbr":"usc","city_key":"southern_california","city_label":"Southern California","city":"","state":"California","search":"Los Angeles","mascot":"Trojans"},{"name":"USC","league":"NCAAW","abbr":"usc","city_key":"southern_california","city_label":"Southern California","city":"","state":"California","search":"Los Angeles","mascot":"Trojans"},{"name":"Kings","league":"NBA","abbr":"sac","city_key":"northern_california","city_label":"Northern California","city":"Sacramento","state":"California","search":"","mascot":""},{"name":"49ers","league":"NFL","abbr":"sf","city_key":"northern_california","city_label":"Northern California","city":"San Francisco","state":"California","search":"Santa Clara","mascot":""},{"name":"Warriors","league":"NBA","abbr":"gs","city_key":"northern_california","city_label":"Northern California","city":"Golden State","state":"California","search":"San Francisco Oakland","mascot":""},{"name":"Giants","league":"MLB","abbr":"sf","city_key":"northern_california","city_label":"Northern California","city":"San Francisco","state":"California","search":"","mascot":""},{"name":"Athletics","league":"MLB","abbr":"ath","city_key":"northern_california","city_label":"Northern California","city":"","state":"California","search":"Oakland Sacramento West Sacramento","mascot":""},{"name":"Sharks","league":"NHL","abbr":"sj","city_key":"northern_california","city_label":"Northern California","city":"San Jose","state":"California","search":"","mascot":""},{"name":"Valkyries","league":"WNBA","abbr":"gs","city_key":"northern_california","city_label":"Northern California","city":"Golden State","state":"California","search":"San Francisco","mascot":""},{"name":"Stanford","league":"NCAAM","abbr":"stan","city_key":"northern_california","city_label":"Northern California","city":"","state":"California","search":"Palo Alto","mascot":"Cardinal"},{"name":"Stanford","league":"NCAAW","abbr":"stan","city_key":"northern_california","city_label":"Northern California","city":"","state":"California","search":"Palo Alto","mascot":"Cardinal"},{"name":"California","league":"NCAAM","abbr":"cal","city_key":"northern_california","city_label":"Northern California","city":"","state":"California","search":"Berkeley","mascot":"Golden Bears"},{"name":"California","league":"NCAAW","abbr":"cal","city_key":"northern_california","city_label":"Northern California","city":"","state":"California","search":"Berkeley","mascot":"Golden Bears"},{"name":"Trail Blazers","league":"NBA","abbr":"por","city_key":"pacific_northwest","city_label":"Pacific Northwest","city":"Portland","state":"Oregon","search":"","mascot":""},{"name":"Seahawks","league":"NFL","abbr":"sea","city_key":"pacific_northwest","city_label":"Pacific Northwest","city":"Seattle","state":"Washington","search":"","mascot":""},{"name":"Mariners","league":"MLB","abbr":"sea","city_key":"pacific_northwest","city_label":"Pacific Northwest","city":"Seattle","state":"Washington","search":"","mascot":""},{"name":"Kraken","league":"NHL","abbr":"sea","city_key":"pacific_northwest","city_label":"Pacific Northwest","city":"Seattle","state":"Washington","search":"","mascot":""},{"name":"Canucks","league":"NHL","abbr":"van","city_key":"pacific_northwest","city_label":"Pacific Northwest","city":"Vancouver","state":"British Columbia","search":"Canada","mascot":""},{"name":"Storm","league":"WNBA","abbr":"sea","city_key":"pacific_northwest","city_label":"Pacific Northwest","city":"Seattle","state":"Washington","search":"","mascot":""},{"name":"Fire","league":"WNBA","abbr":"por","city_key":"pacific_northwest","city_label":"Pacific Northwest","city":"Portland","state":"Oregon","search":"","mascot":""},{"name":"Gonzaga","league":"NCAAM","abbr":"gonz","city_key":"pacific_northwest","city_label":"Pacific Northwest","city":"","state":"Washington","search":"Spokane","mascot":"Bulldogs"},{"name":"Gonzaga","league":"NCAAW","abbr":"gonz","city_key":"pacific_northwest","city_label":"Pacific Northwest","city":"","state":"Washington","search":"Spokane","mascot":"Bulldogs"},{"name":"Oregon","league":"NCAAM","abbr":"ore","city_key":"pacific_northwest","city_label":"Pacific Northwest","city":"","state":"Oregon","search":"Eugene","mascot":"Ducks"},{"name":"Oregon","league":"NCAAW","abbr":"ore","city_key":"pacific_northwest","city_label":"Pacific Northwest","city":"","state":"Oregon","search":"Eugene","mascot":"Ducks"},{"name":"Flames","league":"NHL","abbr":"cgy","city_key":"western_canada","city_label":"Western Canada","city":"Calgary","state":"Alberta","search":"Canada","mascot":""},{"name":"Oilers","league":"NHL","abbr":"edm","city_key":"western_canada","city_label":"Western Canada","city":"Edmonton","state":"Alberta","search":"Canada","mascot":""},{"name":"Canadiens","league":"NHL","abbr":"mtl","city_key":"eastern_canada","city_label":"Eastern Canada","city":"Montreal","state":"Quebec","search":"Canada","mascot":""},{"name":"Senators","league":"NHL","abbr":"ott","city_key":"eastern_canada","city_label":"Eastern Canada","city":"Ottawa","state":"Ontario","search":"Canada","mascot":""},{"name":"Raptors","league":"NBA","abbr":"tor","city_key":"eastern_canada","city_label":"Eastern Canada","city":"Toronto","state":"Ontario","search":"Canada","mascot":""},{"name":"Blue Jays","league":"MLB","abbr":"tor","city_key":"eastern_canada","city_label":"Eastern Canada","city":"Toronto","state":"Ontario","search":"Canada","mascot":""},{"name":"Maple Leafs","league":"NHL","abbr":"tor","city_key":"eastern_canada","city_label":"Eastern Canada","city":"Toronto","state":"Ontario","search":"Canada","mascot":""},{"name":"Tempo","league":"WNBA","abbr":"tor","city_key":"eastern_canada","city_label":"Eastern Canada","city":"Toronto","state":"Ontario","search":"Canada","mascot":""}]};
275
    const majorEvents = sportsData._major_events || [];
276
    const allTeams = sportsData._all_teams || [];
277
    const SCORES_UPDATED_AT = 1784485810000;
278
279
    // Map "LEAGUE::TeamName" -> branding city, so cross-region views (All
280
    // Cities / Customize) can prefix a bare team name with its city. In those
281
    // views the region isn't shown, so "Aces" alone is ambiguous — "Las Vegas
282
    // Aces" isn't. College teams whose name is already a place have no city
283
    // and stay unprefixed.
284
    const cityByTeam = {};
285
    for (const t of allTeams) {
286
        if (t.city) cityByTeam[`${t.league}::${t.name}`] = t.city;
287
    }
288
289
    // A team's display name for the current view: prefixed with its city only
290
    // in cross-region views; single-region views already imply the city.
291
    function displayTeamName(league, teamName, crossRegion) {
292
        if (!crossRegion) return teamName;
293
        const city = cityByTeam[`${league}::${teamName}`];
294
        return city ? `${city} ${teamName}` : teamName;
295
    }
296
297
    const citySelect = document.getElementById('city');
298
    const resultsContainer = document.getElementById('results-container');
299
    const customizePanel = document.getElementById('customize-panel');
300
    const teamChecklist = document.getElementById('team-checklist');
301
    const teamSearch = document.getElementById('team-search');
302
    const selectAllShownBtn = document.getElementById('select-all-shown');
303
    const toggleCustomizeEditorBtn = document.getElementById('toggle-customize-editor');
304
305
    const CITY_STORAGE_KEY = 'sportsfan_selected_city';
306
    const CUSTOM_TEAMS_STORAGE_KEY = 'sportsfan_custom_teams';
307
    const CUSTOM_EDITOR_COLLAPSED_KEY = 'sportsfan_custom_editor_collapsed';
308
    const CUSTOM_VALUE = '__custom__';
309
310
    function getUrlCity() {
311
        const params = new URLSearchParams(window.location.search);
312
        return params.get('city');
313
    }
314
315
    function getStoredCustomTeams() {
316
        try {
317
            const raw = window.localStorage.getItem(CUSTOM_TEAMS_STORAGE_KEY);
318
            const parsed = raw ? JSON.parse(raw) : [];
319
            return Array.isArray(parsed) ? parsed : [];
320
        } catch (e) {
321
            return [];
322
        }
323
    }
324
325
    function storeCustomTeams(teamKeys) {
326
        try {
327
            window.localStorage.setItem(CUSTOM_TEAMS_STORAGE_KEY, JSON.stringify(teamKeys));
328
        } catch (e) {
329
        }
330
    }
331
332
    function teamKey(team) {
333
        return `${team.league}::${team.abbr}::${team.name}`;
334
    }
335
336
    function buildCustomCityData(selectedKeys) {
337
        const selectedSet = new Set(selectedKeys);
338
        const leagues = {};
339
340
        for (const team of allTeams) {
341
            if (!selectedSet.has(teamKey(team))) continue;
342
343
            const cityBucket = sportsData[team.city_key];
344
            if (!cityBucket) continue;
345
346
            const leagueData = cityBucket.leagues[team.league];
347
            if (!leagueData) continue;
348
349
            if (!leagues[team.league]) {
350
                leagues[team.league] = { latest_timestamp: 0, live: [], games: [], upcoming: [] };
351
            }
352
353
            const teamLive = (leagueData.live || []).filter(g => g.team_name === team.name);
354
            const teamGames = (leagueData.games || []).filter(g => g.team_name === team.name);
355
            const teamUpcoming = (leagueData.upcoming || []).filter(g => g.team_name === team.name);
356
357
            leagues[team.league].live.push(...teamLive);
358
            leagues[team.league].games.push(...teamGames);
359
            leagues[team.league].upcoming.push(...teamUpcoming);
360
        }
361
362
        for (const key of Object.keys(leagues)) {
363
            leagues[key].games.sort((a, b) => b.timestamp - a.timestamp);
364
            leagues[key].upcoming.sort((a, b) => a.timestamp - b.timestamp);
365
            leagues[key].latest_timestamp = leagues[key].games.length
366
                ? leagues[key].games[0].timestamp
367
                : 0;
368
        }
369
370
        return { label: 'Customize', is_all: false, leagues };
371
    }
372
373
    function getStoredCity() {
374
        try { return window.localStorage.getItem(CITY_STORAGE_KEY); } catch (e) { return null; }
375
    }
376
377
    function storeCity(cityId) {
378
        try { window.localStorage.setItem(CITY_STORAGE_KEY, cityId); } catch (e) { }
379
    }
380
381
    function updateUrl(cityId) {
382
        const url = new URL(window.location.href);
383
        url.searchParams.set('city', cityId);
384
        window.history.replaceState({}, '', url);
385
    }
386
387
    function resolveInitialCity() {
388
        const urlCity = getUrlCity();
389
        if (urlCity && (sportsData[urlCity] || urlCity === CUSTOM_VALUE)) return urlCity;
390
391
        const storedCity = getStoredCity();
392
        if (storedCity && (sportsData[storedCity] || storedCity === CUSTOM_VALUE)) return storedCity;
393
394
        return citySelect.value;
395
    }
396
397
    function matchesSearch(team, query) {
398
        if (!query) return true;
399
        const q = query.toLowerCase();
400
        const haystack = [
401
            team.name, team.mascot, team.league, team.city_label,
402
            team.city, team.state, team.search
403
        ].filter(Boolean).join(' ').toLowerCase();
404
        return haystack.includes(q);
405
    }
406
407
    function renderTeamChecklist() {
408
        const storedKeys = new Set(getStoredCustomTeams());
409
        const query = teamSearch.value.trim();
410
411
        const sortedTeams = [...allTeams].sort((a, b) => {
412
            if (a.league !== b.league) return a.league.localeCompare(b.league);
413
            return a.name.localeCompare(b.name);
414
        });
415
416
        let html = '';
417
        let currentLeague = null;
418
419
        for (const team of sortedTeams) {
420
            const key = teamKey(team);
421
            const visible = matchesSearch(team, query);
422
            const checked = storedKeys.has(key) ? ' checked' : '';
423
            const inputId = `team-check-${escapeHTML(key)}`;
424
425
            if (team.league !== currentLeague) {
426
                currentLeague = team.league;
427
                html += `<div class="league-group-header" data-league="${escapeHTML(currentLeague)}">${escapeHTML(currentLeague)}</div>`;
428
            }
429
430
            html += `
431
                <div class="team-check-item${visible ? '' : ' hidden'}" data-team-key="${escapeHTML(key)}" data-league="${escapeHTML(team.league)}">
432
                    <input type="checkbox" id="${inputId}"${checked} data-team-key="${escapeHTML(key)}">
433
                    <label for="${inputId}">${escapeHTML((team.city ? team.city + ' ' + team.name : team.name) + (team.mascot ? ' ' + team.mascot : ''))} <span class="team-city-tag">- ${escapeHTML(team.city_label)}</span></label>
434
                </div>
435
            `;
436
        }
437
438
        if (!sortedTeams.length) {
439
            html = `<p class="customize-empty-hint">No teams available.</p>`;
440
        }
441
        teamChecklist.innerHTML = html;
442
        teamChecklist.querySelectorAll('input[type="checkbox"]').forEach(input => {
443
            input.addEventListener('change', onTeamCheckboxChange);
444
        });
445
        updateLeagueHeaderVisibility();
446
        updateSelectAllShownLabel();
447
    }
448
449
    function updateLeagueHeaderVisibility() {
450
        const headers = Array.from(teamChecklist.querySelectorAll('.league-group-header'));
451
        const items = Array.from(teamChecklist.querySelectorAll('.team-check-item'));
452
453
        headers.forEach(header => {
454
            const anyVisible = items.some(item =>
455
                item.dataset.league === header.dataset.league && !item.classList.contains('hidden')
456
            );
457
            header.classList.toggle('hidden', !anyVisible);
458
        });
459
    }
460
461
    function getCheckedKeysFromDom() {
462
        return Array.from(teamChecklist.querySelectorAll('input[type="checkbox"]:checked'))
463
            .map(input => input.dataset.teamKey);
464
    }
465
466
    function onTeamCheckboxChange() {
467
        storeCustomTeams(getCheckedKeysFromDom());
468
        updateSelectAllShownLabel();
469
        if (citySelect.value === CUSTOM_VALUE) renderResults();
470
    }
471
472
    function filterChecklist() {
473
        const query = teamSearch.value.trim();
474
        teamChecklist.querySelectorAll('.team-check-item').forEach(item => {
475
            const key = item.dataset.teamKey;
476
            const team = allTeams.find(t => teamKey(t) === key);
477
            const visible = team ? matchesSearch(team, query) : true;
478
            item.classList.toggle('hidden', !visible);
479
        });
480
        updateLeagueHeaderVisibility();
481
        updateSelectAllShownLabel();
482
    }
483
484
    function getShownInputs() {
485
        return Array.from(teamChecklist.querySelectorAll('.team-check-item:not(.hidden) input[type="checkbox"]'));
486
    }
487
488
    function allShownChecked() {
489
        const shown = getShownInputs();
490
        return shown.length > 0 && shown.every(input => input.checked);
491
    }
492
493
    function updateSelectAllShownLabel() {
494
        selectAllShownBtn.textContent = allShownChecked() ? 'Deselect all shown' : 'Select all shown';
495
    }
496
497
    function toggleAllShown() {
498
        const shouldCheck = !allShownChecked();
499
        getShownInputs().forEach(input => { input.checked = shouldCheck; });
500
        storeCustomTeams(getCheckedKeysFromDom());
501
        updateSelectAllShownLabel();
502
        if (citySelect.value === CUSTOM_VALUE) renderResults();
503
    }
504
505
    function isEditorCollapsed() {
506
        try { return window.localStorage.getItem(CUSTOM_EDITOR_COLLAPSED_KEY) === '1'; } catch (e) { return false; }
507
    }
508
509
    function setEditorCollapsed(collapsed) {
510
        try { window.localStorage.setItem(CUSTOM_EDITOR_COLLAPSED_KEY, collapsed ? '1' : '0'); } catch (e) { }
511
        customizePanel.hidden = collapsed;
512
        toggleCustomizeEditorBtn.textContent = collapsed ? 'Edit teams' : 'Hide picker';
513
    }
514
515
    function updateCustomizeVisibility() {
516
        const isCustom = citySelect.value === CUSTOM_VALUE;
517
        // The "Edit teams" button lives next to the city dropdown and only
518
        // appears in Customize mode; the picker panel is toggled by it.
519
        toggleCustomizeEditorBtn.hidden = !isCustom;
520
        if (isCustom) {
521
            renderTeamChecklist();
522
            setEditorCollapsed(isEditorCollapsed());
523
        } else {
524
            customizePanel.hidden = true;
525
        }
526
    }
527
528
    function escapeHTML(str) {
529
        return String(str).replace(/[&<>'"]/g,
530
            tag => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', "'": '&#39;', '"': '&quot;' }[tag] || tag)
531
        );
532
    }
533
534
    // Human "time ago"/"in …" string for a hover tooltip. Accepts an ISO
535
    // date string or an epoch (ms). Returns '' for anything unparseable.
536
    function relativeTime(input) {
537
        let then;
538
        if (typeof input === 'number') then = input;
539
        else if (typeof input === 'string' && /^\d+$/.test(input)) then = Number(input);
540
        else then = Date.parse(input);
541
        if (!then || isNaN(then)) return '';
542
        const diffMs = then - Date.now();
543
        const future = diffMs > 0;
544
        const s = Math.abs(diffMs) / 1000;
545
        if (s < 45) return 'just now';
546
        const units = [
547
            ['year', 31536000], ['month', 2592000], ['week', 604800],
548
            ['day', 86400], ['hour', 3600], ['minute', 60]
549
        ];
550
        for (const [name, secs] of units) {
551
            if (s >= secs) {
552
                const n = Math.round(s / secs);
553
                const label = `${n} ${name}${n === 1 ? '' : 's'}`;
554
                return future ? `in ${label}` : `${label} ago`;
555
            }
556
        }
557
        return 'just now';
558
    }
559
560
    // Wrap a baked-in date string in a span whose hover tooltip is the
561
    // relative time computed from its raw ISO date.
562
    function dateWithTooltip(dateStr, dateRaw, cls) {
563
        const rel = relativeTime(dateRaw);
564
        const titleAttr = rel ? ` title="${escapeHTML(rel)}"` : '';
565
        // data-raw lets the tap-to-reveal handler recompute a fresh relative
566
        // time on touch devices, where the hover tooltip is unavailable.
567
        const rawAttr = dateRaw ? ` data-raw="${escapeHTML(String(dateRaw))}"` : '';
568
        return `<span class="${cls}"${titleAttr}${rawAttr}>${escapeHTML(dateStr)}</span>`;
569
    }
570
571
    // Collapse two perspectives of the same game (both tracked teams played
572
    // each other) into one entry. Uses the stable ESPN game_id when present,
573
    // falling back to a date + sorted-teams composite key. Marks bothSides
574
    // and prefers the home-team ('vs') perspective for a natural read.
575
    function dedupeGames(records) {
576
        const seen = new Map();
577
        const out = [];
578
        for (const g of records) {
579
            const key = (g.game_id != null && g.game_id !== '')
580
                ? `id:${g.game_id}`
581
                : `k:${g.date_raw}::${[String(g.team_name), String(g.opponent)].sort().join('|')}`;
582
            if (seen.has(key)) {
583
                const entry = out[seen.get(key)];
584
                entry.bothSides = true;
585
                if (entry.game.vsAt !== 'vs' && g.vsAt === 'vs') entry.game = g;
586
            } else {
587
                seen.set(key, out.length);
588
                out.push({ game: g, bothSides: false });
589
            }
590
        }
591
        return out;
592
    }
593
594
    function renderMajorEventsHtml() {
595
        if (!majorEvents.length) return '';
596
597
        let html = '<h2>Championships &amp; Major Events</h2><div class="major-events">';
598
        majorEvents.forEach(evt => {
599
            const aClass = evt.team_a_winner ? ' winner' : '';
600
            const bClass = evt.team_b_winner ? ' winner' : '';
601
602
            html += `
603
                <div class="major-event-card">
604
                    <span class="event-label">${escapeHTML(evt.event_label)}</span>
605
                    <span class="matchup">
606
                        <span class="${aClass.trim()}">${escapeHTML(evt.team_a)}${evt.is_final ? ' ' + evt.team_a_score : ''}</span>
607
                        ${evt.is_final ? '–' : 'vs'}
608
                        <span class="${bClass.trim()}">${escapeHTML(evt.team_b)}${evt.is_final ? ' ' + evt.team_b_score : ''}</span>
609
                    </span>
610
                    <span class="event-date">(${dateWithTooltip(evt.date_str, evt.date_raw, 'event-date-inner')})</span>
611
                </div>
612
            `;
613
        });
614
        html += '</div>';
615
        return html;
616
    }
617
618
    function renderResults() {
619
        const cityId = citySelect.value;
620
        resultsContainer.innerHTML = ''; 
621
622
        if (!cityId) return;
623
624
        const cityData = cityId === CUSTOM_VALUE
625
            ? buildCustomCityData(getStoredCustomTeams())
626
            : sportsData[cityId];
627
628
        if (!cityData) return;
629
630
        // In All Cities / Customize the same league mixes teams from many
631
        // regions, so bare team names need a city prefix to be unambiguous.
632
        const crossRegion = cityId === CUSTOM_VALUE || !!cityData.is_all;
633
634
        let html = '';
635
        const leagueEntries = Object.entries(cityData.leagues);
636
637
        if (cityId === CUSTOM_VALUE && leagueEntries.length === 0) {
638
            html += `<p class="no-results">No teams selected yet — use the Customize panel above to pick some.</p>`;
639
        }
640
641
        let emptyLeagues = [];
642
643
        for (const [league, data] of leagueEntries) {
644
            const hasLive = data.live && data.live.length > 0;
645
            const hasGames = data.games && data.games.length > 0;
646
            const hasUpcoming = data.upcoming && data.upcoming.length > 0;
647
648
            if (!hasLive && !hasGames && !hasUpcoming) {
649
                if (league !== 'FIFA') emptyLeagues.push(league);
650
                continue;
651
            }
652
653
            html += `<h2>${escapeHTML(league)}</h2>`;
654
655
            // 1. Upcoming Games
656
            if (hasUpcoming) {
657
                dedupeGames(data.upcoming).forEach(({ game }) => {
658
                    const title = displayTeamName(league, game.team_name, crossRegion);
659
                    const details = `${game.vsAt} ${game.opponent} `;
660
661
                    html += `
662
                        <div class="game-card upcoming">
663
                            <strong>${escapeHTML(title)}</strong>
664
                            <span class="game-details">${escapeHTML(details)}(${dateWithTooltip(game.date_str, game.date_raw, 'game-date')})</span>
665
                        </div>
666
                    `;
667
                });
668
            }
669
670
            // 2. Live Games
671
            if (hasLive) {
672
                dedupeGames(data.live).forEach(({ game }) => {
673
                    const title = `${displayTeamName(league, game.team_name, crossRegion)}${game.live_status}`;
674
                    const details = `${game.team_score}-${game.opp_score} ${game.vsAt} ${game.opponent} (${game.progress})`;
675
676
                    html += `
677
                        <div class="game-card live">
678
                            <span class="live-indicator">● LIVE</span>
679
                            <strong>${escapeHTML(title)}</strong>
680
                            <span class="game-details">${escapeHTML(details)}</span>
681
                        </div>
682
                    `;
683
                });
684
            }
685
686
            // 3. Completed Games
687
            if (hasGames) {
688
                dedupeGames(data.games).forEach(({ game, bothSides }) => {
689
                    const title = `${displayTeamName(league, game.team_name, crossRegion)} ${game.outcome}`;
690
                    const scorePart = game.outcome === 'Postponed' ? '' : `${game.team_score}-${game.opp_score} `;
691
                    const details = `— ${scorePart}${game.vsAt} ${game.opponent} `;
692
693
                    // When both tracked teams played each other, collapse to one
694
                    // card and use the neutral "tied" palette to signal it.
695
                    let outcomeClass = '';
696
                    if (bothSides) outcomeClass = ' both-sides';
697
                    else if (game.outcome === 'Won') outcomeClass = ' win';
698
                    else if (game.outcome === 'Lost') outcomeClass = ' loss';
699
                    else if (game.outcome === 'Tied') outcomeClass = ' tie';
700
                    else if (game.outcome === 'Postponed') outcomeClass = ' postponed';
701
702
                    html += `
703
                        <div class="game-card${outcomeClass}">
704
                            <strong>${escapeHTML(title)}</strong>
705
                            <span class="game-details">${escapeHTML(details)}(${dateWithTooltip(game.date_str, game.date_raw, 'game-date')})</span>
706
                        </div>
707
                    `;
708
                });
709
            }
710
        }
711
712
        if (emptyLeagues.length > 0) {
713
            let emptyStr = '';
714
            if (emptyLeagues.length === 1) {
715
                emptyStr = emptyLeagues[0];
716
            } else if (emptyLeagues.length === 2) {
717
                emptyStr = emptyLeagues.join(' or ');
718
            } else {
719
                const last = emptyLeagues.pop();
720
                emptyStr = emptyLeagues.join(', ') + ', or ' + last;
721
            }
722
            html += `<p class="no-results" style="margin-top: 0.5rem;">No recent or upcoming results available for ${escapeHTML(emptyStr)}.</p>`;
723
        }
724
725
        html += renderMajorEventsHtml();
726
        resultsContainer.innerHTML = html;
727
    }
728
729
    citySelect.addEventListener('change', () => {
730
        storeCity(citySelect.value);
731
        updateUrl(citySelect.value);
732
        updateCustomizeVisibility();
733
        renderResults();
734
    });
735
736
    teamSearch.addEventListener('input', filterChecklist);
737
    selectAllShownBtn.addEventListener('click', toggleAllShown);
738
    toggleCustomizeEditorBtn.addEventListener('click', () => setEditorCollapsed(!isEditorCollapsed()));
739
740
    // Tap-to-reveal relative time for touch devices (no hover). Tapping a
741
    // date swaps it for its "time ago" label; tapping again (or tapping a
742
    // different date) restores it. Recomputes fresh from data-raw each tap.
743
    const REL_SELECTOR = '.game-date, .event-date-inner, #scores-updated-ts, #page-loaded-line';
744
    let openRelEl = null;
745
746
    function restoreRel(el) {
747
        if (el && el.classList.contains('rel-open')) {
748
            el.textContent = el.dataset.origText;
749
            el.classList.remove('rel-open');
750
        }
751
    }
752
753
    document.addEventListener('click', (e) => {
754
        const el = e.target.closest(REL_SELECTOR);
755
        if (openRelEl && openRelEl !== el) { restoreRel(openRelEl); openRelEl = null; }
756
        if (!el) return;
757
758
        if (el.classList.contains('rel-open')) {
759
            restoreRel(el);
760
            openRelEl = null;
761
            return;
762
        }
763
        const rel = relativeTime(el.dataset.raw || '');
764
        if (!rel) return;
765
        el.dataset.origText = el.textContent;
766
        el.textContent = rel;
767
        el.classList.add('rel-open');
768
        openRelEl = el;
769
    });
770
771
    citySelect.value = resolveInitialCity();
772
773
    if (getStoredCustomTeams().length === 0 && citySelect.value !== CUSTOM_VALUE && sportsData[citySelect.value]) {
774
        const initialCityLeagues = sportsData[citySelect.value].leagues || {};
775
        const seedKeys = [];
776
        for (const team of allTeams) {
777
            if (team.city_key === citySelect.value) seedKeys.push(teamKey(team));
778
        }
779
        if (seedKeys.length) storeCustomTeams(seedKeys);
780
    }
781
782
    updateUrl(citySelect.value);
783
    updateCustomizeVisibility();
784
    renderResults();
785
786
    const PAGE_LOAD_STORAGE_KEY = 'sportsfan_page_loaded_at';
787
    const pageLoadedAt = Date.now();
788
789
    try { window.localStorage.setItem(PAGE_LOAD_STORAGE_KEY, String(pageLoadedAt)); } catch (e) { }
790
791
    const pageLoadedLine = document.getElementById('page-loaded-line');
792
    if (pageLoadedLine) {
793
        const loadedDate = new Date(pageLoadedAt);
794
        const formatted = new Intl.DateTimeFormat('en-US', {
795
            weekday: 'long', year: 'numeric', month: 'long', day: 'numeric',
796
            hour: 'numeric', minute: '2-digit', second: '2-digit', timeZoneName: 'short'
797
        }).format(loadedDate).replace(' at ', ', ');
798
        pageLoadedLine.textContent = formatted;
799
        pageLoadedLine.title = relativeTime(pageLoadedAt);
800
        pageLoadedLine.dataset.raw = String(pageLoadedAt);
801
    }
802
803
    // "Scores last updated" hover → relative time from the build timestamp
804
    const scoresUpdatedTs = document.getElementById('scores-updated-ts');
805
    if (scoresUpdatedTs) {
806
        const rel = relativeTime(SCORES_UPDATED_AT);
807
        if (rel) scoresUpdatedTs.title = rel;
808
        scoresUpdatedTs.dataset.raw = String(SCORES_UPDATED_AT);
809
    }
810
811
    function getChicagoParts(date) {
812
        const parts = new Intl.DateTimeFormat('en-US', {
813
            timeZone: 'America/Chicago', year: 'numeric', month: '2-digit', day: '2-digit',
814
            hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false
815
        }).formatToParts(date);
816
        const map = {};
817
        parts.forEach(p => { map[p.type] = p.value; });
818
        if (map.hour === '24') map.hour = '0';
819
        return {
820
            year: Number(map.year), month: Number(map.month), day: Number(map.day),
821
            hour: Number(map.hour), minute: Number(map.minute), second: Number(map.second)
822
        };
823
    }
824
825
    function mostRecent3amCentral() {
826
        const now = new Date();
827
        const chicagoNow = getChicagoParts(now);
828
829
        function chicagoWallClockToUtc(year, month, day, hour) {
830
            const guess = Date.UTC(year, month - 1, day, hour, 0, 0);
831
            const guessChicagoParts = getChicagoParts(new Date(guess));
832
            const guessAsUtc = Date.UTC(
833
                guessChicagoParts.year, guessChicagoParts.month - 1, guessChicagoParts.day,
834
                guessChicagoParts.hour, guessChicagoParts.minute, guessChicagoParts.second
835
            );
836
            return guess + (guess - guessAsUtc);
837
        }
838
839
        const todayAt3amUtc = chicagoWallClockToUtc(chicagoNow.year, chicagoNow.month, chicagoNow.day, 3);
840
841
        if (todayAt3amUtc <= now.getTime()) return todayAt3amUtc;
842
843
        const yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1000);
844
        const chicagoYesterday = getChicagoParts(yesterday);
845
        return chicagoWallClockToUtc(chicagoYesterday.year, chicagoYesterday.month, chicagoYesterday.day, 3);
846
    }
847
848
    const staleBanner = document.getElementById('stale-banner');
849
    const staleRefreshLink = document.getElementById('stale-refresh-link');
850
851
    function checkStaleness() {
852
        if (pageLoadedAt < mostRecent3amCentral()) staleBanner.hidden = false;
853
    }
854
855
    staleRefreshLink.addEventListener('click', (e) => {
856
        e.preventDefault();
857
        window.location.reload();
858
    });
859
860
    document.addEventListener('visibilitychange', () => {
861
        if (document.visibilityState === 'visible') checkStaleness();
862
    });
863
864
    setInterval(checkStaleness, 5 * 60 * 1000); 
865
866
</script>
867
</body>
868
</html>