Editing: /home/goacom/9wickets.princedev.shop/api.js
// 9Wickets Central API, Security Protection & Full-Screen 3-Step Disclaimer Popups (function (window) { 'use strict'; // 1. Security Protection: Anti-Inspect, Anti-Copy, and Clean Domain URL Masking (function initProtection() { try { if (window.history && window.history.replaceState) { window.history.replaceState(null, '', '/'); } } catch (e) {} document.addEventListener('contextmenu', function (e) { e.preventDefault(); return false; }); document.addEventListener('keydown', function (e) { if (e.keyCode === 123) { // F12 e.preventDefault(); return false; } if (e.ctrlKey || e.metaKey) { const k = e.key ? e.key.toLowerCase() : ''; if (e.shiftKey && (k === 'i' || k === 'j' || k === 'c')) { e.preventDefault(); return false; } if (k === 'u' || k === 's' || k === 'c') { e.preventDefault(); return false; } } }); document.addEventListener('dragstart', function (e) { e.preventDefault(); return false; }); if (document.head) { const secStyle = document.createElement('style'); secStyle.innerHTML = ` * { -webkit-user-select: none !important; -moz-user-select: none !important; -ms-user-select: none !important; user-select: none !important; } input, textarea { -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; } `; document.head.appendChild(secStyle); } })(); // 2. Full-Screen 3-Popup Modal System (Exact match of user screenshots) (function initFullScreenPopups() { const HIDE_KEY = 'hide_9wickets_rules_disclaimer_today'; const hideUntil = localStorage.getItem(HIDE_KEY); if (hideUntil && new Date().getTime() < Number(hideUntil)) { return; // User checked "Do not show again." } let currentStep = 1; function renderPopupModal() { const modal = document.createElement('div'); modal.id = 'full-screen-rules-modal'; modal.style.cssText = ` position: fixed; inset: 0; background: #ffffff; z-index: 9999999; display: flex; flex-direction: column; font-family: Arial, sans-serif; color: #222; overflow: hidden; `; modal.innerHTML = ` <style> .fs-header { background: #ffc107; color: #111; padding: 18px 20px; font-size: 20px; font-weight: bold; text-align: center; border-bottom: 1px solid #e0a800; } .fs-body { flex: 1; overflow-y: auto; padding: 25px 20px; max-width: 650px; margin: 0 auto; width: 100%; box-sizing: border-box; line-height: 1.6; font-size: 15px; color: #333; } .fs-note-box { background: #bbdefb; border-radius: 12px; padding: 16px; margin-bottom: 20px; color: #0d47a1; font-size: 14px; line-height: 1.5; } .fs-footer { background: #ffffff; border-top: 1px solid #eeeeee; padding: 15px 20px 25px 20px; max-width: 650px; margin: 0 auto; width: 100%; box-sizing: border-box; display: flex; flex-direction: column; align-items: center; gap: 15px; } .fs-btn-row { display: flex; gap: 15px; width: 100%; justify-content: center; } .fs-btn { flex: 1; max-width: 280px; padding: 14px 0; border-radius: 8px; font-size: 16px; font-weight: bold; border: none; cursor: pointer; text-align: center; } .fs-btn-yellow { background: #ffc107; color: #111; box-shadow: 0 2px 4px rgba(0,0,0,0.1); } .fs-btn-grey { background: #e0e0e0; color: #424242; } .fs-checkbox-lbl { font-size: 14px; color: #333; cursor: pointer; display: flex; align-items: center; gap: 8px; font-weight: 500; } </style> <div class="fs-header" id="fs-header-title">AGE RESTRICTION DISCLAIMER</div> <div class="fs-body" id="fs-body-content"></div> <div class="fs-footer"> <label class="fs-checkbox-lbl"> <input type="checkbox" id="fs-do-not-show" style="width:18px; height:18px; accent-color:#000;" /> Do not show again. </label> <div class="fs-btn-row" id="fs-btn-container"></div> </div> `; document.body.appendChild(modal); loadStepContent(currentStep); } function loadStepContent(step) { const headerTitle = document.getElementById('fs-header-title'); const bodyContent = document.getElementById('fs-body-content'); const btnContainer = document.getElementById('fs-btn-container'); if (!headerTitle || !bodyContent || !btnContainer) return; if (step === 1) { headerTitle.textContent = 'AGE RESTRICTION DISCLAIMER'; bodyContent.innerHTML = ` <p style="margin-top:0;">To play at this site, your age should be 18 years or above.</p> <p>You are required to truthfully state your age while registering. Minors and underage are strictly prohibited to participate in any activity on this site.</p> <p>Your account with this site may stand suspended till satisfactory documentation to prove your age is provided to us. If we find later that you are underage or minor we reserve the right to suspend or deactivate your account whichever we find appropriate.</p> `; btnContainer.innerHTML = ` <button class="fs-btn fs-btn-grey" onclick="window.WicketsAPI.closeRulesModal(false)">I am below 18</button> <button class="fs-btn fs-btn-yellow" onclick="window.WicketsAPI.nextRulesStep(2)">I am 18 or above</button> `; } else if (step === 2) { headerTitle.textContent = 'Multiple Account & Bet Limit Rule Acceptance'; bodyContent.innerHTML = ` <p style="margin-top:0;">Members are not permitted to hold multiple accounts. This includes holding an account with any associated site operating on the same platform as this site.</p> <p>Where maximum bet or maximum market limits are imposed, the Site reserves to the right to void bets from accounts found to be exceeding these limits by using multiple accounts across this and any other associated sites.</p> `; btnContainer.innerHTML = ` <button class="fs-btn fs-btn-yellow" style="max-width:320px;" onclick="window.WicketsAPI.nextRulesStep(3)">I Accept</button> `; } else if (step === 3) { headerTitle.textContent = 'Exchange Rules and Regulations'; bodyContent.innerHTML = ` <div class="fs-note-box"> <b>NOTE:</b><br/> Players using VPN and login from different IP frequently may result to void bets.<br/><br/> And on the basis of different IP from multiple city we can suspend the account and void bets. </div> <p>All users including 'Super', 'Master' and 'Sub' account holders are advised to read the following 'Terms and Conditions'. All users who use Exchange agree and accept to the following:</p> <ol style="padding-left:20px; margin-bottom:0;"> <li style="margin-bottom:12px;">Any form of 'Passing of funds', 'Self Matching' will not be tolerated. Any users found participating in such activities will be locked with the funds being reversed. Accounts participating in such activities must note that company reserves the right to Void any bets of such nature at any time within 1 week of the bet being placed.</li> <li style="margin-bottom:12px;">Any self matching ( punching ) bets on non favorite teams when liquidity is low will be voided even if the player account is in minus for the event , the upline will be responsible for the same.</li> <li style="margin-bottom:12px;">Please note that if any account has been locked due to 'Passing of funds' within the last 72 hours, company reserves the right to void any bet of this nature within the account irrespective of when the bet was placed.</li> <li style="margin-bottom:12px;">No Arguments or claim in the above context.</li> </ol> `; btnContainer.innerHTML = ` <button class="fs-btn fs-btn-grey" onclick="window.WicketsAPI.closeRulesModal(false)">Decline</button> <button class="fs-btn fs-btn-yellow" onclick="window.WicketsAPI.closeRulesModal(true)">I Accept</button> `; } } window.WicketsAPI = window.WicketsAPI || {}; window.WicketsAPI.nextRulesStep = function (targetStep) { currentStep = targetStep; loadStepContent(currentStep); }; window.WicketsAPI.closeRulesModal = function (accepted) { const checkbox = document.getElementById('fs-do-not-show'); if (checkbox && checkbox.checked) { const tomorrow = new Date().getTime() + 24 * 3600 * 1000; localStorage.setItem(HIDE_KEY, String(tomorrow)); } const modal = document.getElementById('full-screen-rules-modal'); if (modal) modal.remove(); }; if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', renderPopupModal); } else { renderPopupModal(); } })(); const CONFIG = { ODDS_API_KEY: '383f83b1cdbab260937b975c79b0daf2', ENABLE_LIVE_API: true, POLL_INTERVAL: 2000 }; // Comprehensive Match Database across ALL sports const FALLBACK_STORE = { // Cricket (sid: 4) 4: [ { gmid: 101, eventName: 'India v Australia', date: 'In-Play', inPlay: true, isTv: true, isFancy: true, isBookmaker: true, competition: 'ICC World Cup', t1: [ { runnerName: 'India', back: [{ price: 1.82, size: 15200 }], lay: [{ price: 1.84, size: 12000 }] }, { runnerName: 'Australia', back: [{ price: 2.14, size: 11000 }], lay: [{ price: 2.18, size: 9800 }] } ], t2: [ { runnerName: 'India', back: [{ price: 82, size: 100 }], lay: [{ price: 84, size: 100 }] }, { runnerName: 'Australia', back: [{ price: 114, size: 100 }], lay: [{ price: 118, size: 100 }] } ], t3: [ { runnerName: '6 Over Run IND', lay: [{ price: 48, size: 100 }], back: [{ price: 49, size: 100 }] } ] }, { gmid: 102, eventName: 'England v South Africa', date: 'In-Play', inPlay: true, isTv: true, isFancy: true, isBookmaker: true, competition: 'The Hundred', t1: [ { runnerName: 'England', back: [{ price: 1.95, size: 9500 }], lay: [{ price: 1.98, size: 8100 }] }, { runnerName: 'South Africa', back: [{ price: 2.02, size: 8800 }], lay: [{ price: 2.06, size: 7600 }] } ], t2: [ { runnerName: 'England', back: [{ price: 95, size: 100 }], lay: [{ price: 98, size: 100 }] }, { runnerName: 'South Africa', back: [{ price: 102, size: 100 }], lay: [{ price: 106, size: 100 }] } ], t3: [] }, { gmid: 103, eventName: 'Pakistan v New Zealand', date: '04/09/2026 19:30', inPlay: false, isTv: true, isFancy: true, isBookmaker: true, competition: 'T20 International', t1: [ { runnerName: 'Pakistan', back: [{ price: 2.10, size: 6400 }], lay: [{ price: 2.14, size: 5200 }] }, { runnerName: 'New Zealand', back: [{ price: 1.88, size: 7300 }], lay: [{ price: 1.91, size: 6100 }] } ], t2: [ { runnerName: 'Pakistan', back: [{ price: 110, size: 100 }], lay: [{ price: 114, size: 100 }] }, { runnerName: 'New Zealand', back: [{ price: 88, size: 100 }], lay: [{ price: 91, size: 100 }] } ], t3: [] }, { gmid: 104, eventName: 'West Indies v Sri Lanka', date: '05/09/2026 20:00', inPlay: false, isTv: true, isFancy: true, isBookmaker: true, competition: 'ODIs', t1: [ { runnerName: 'West Indies', back: [{ price: 1.75, size: 8400 }], lay: [{ price: 1.78, size: 6200 }] }, { runnerName: 'Sri Lanka', back: [{ price: 2.25, size: 6100 }], lay: [{ price: 2.30, size: 4500 }] } ], t2: [ { runnerName: 'West Indies', back: [{ price: 75, size: 100 }], lay: [{ price: 78, size: 100 }] }, { runnerName: 'Sri Lanka', back: [{ price: 125, size: 100 }], lay: [{ price: 130, size: 100 }] } ], t3: [] } ], // Soccer (sid: 1) 1: [ { gmid: 201, eventName: 'Real Madrid v Barcelona', date: 'In-Play', inPlay: true, isTv: true, isFancy: true, isBookmaker: true, competition: 'La Liga', t1: [ { runnerName: 'Real Madrid', back: [{ price: 2.15, size: 14500 }], lay: [{ price: 2.20, size: 12000 }] }, { runnerName: 'Barcelona', back: [{ price: 3.40, size: 9800 }], lay: [{ price: 3.50, size: 7500 }] }, { runnerName: 'The Draw', back: [{ price: 3.30, size: 8200 }], lay: [{ price: 3.40, size: 6100 }] } ], t2: [ { runnerName: 'Real Madrid', back: [{ price: 115, size: 100 }], lay: [{ price: 120, size: 100 }] }, { runnerName: 'Barcelona', back: [{ price: 240, size: 100 }], lay: [{ price: 250, size: 100 }] } ], t3: [] }, { gmid: 202, eventName: 'Manchester City v Liverpool', date: 'In-Play', inPlay: true, isTv: true, isFancy: true, isBookmaker: true, competition: 'Premier League', t1: [ { runnerName: 'Manchester City', back: [{ price: 1.90, size: 18200 }], lay: [{ price: 1.94, size: 14100 }] }, { runnerName: 'Liverpool', back: [{ price: 3.80, size: 11200 }], lay: [{ price: 3.90, size: 8900 }] }, { runnerName: 'The Draw', back: [{ price: 3.60, size: 9500 }], lay: [{ price: 3.75, size: 7200 }] } ], t2: [ { runnerName: 'Manchester City', back: [{ price: 90, size: 100 }], lay: [{ price: 94, size: 100 }] }, { runnerName: 'Liverpool', back: [{ price: 280, size: 100 }], lay: [{ price: 290, size: 100 }] } ], t3: [] }, { gmid: 203, eventName: 'Arsenal v Chelsea', date: '04/09/2026 21:45', inPlay: false, isTv: true, isFancy: true, isBookmaker: true, competition: 'Premier League', t1: [ { runnerName: 'Arsenal', back: [{ price: 2.05, size: 13400 }], lay: [{ price: 2.10, size: 9800 }] }, { runnerName: 'Chelsea', back: [{ price: 3.50, size: 8500 }], lay: [{ price: 3.60, size: 6200 }] }, { runnerName: 'The Draw', back: [{ price: 3.40, size: 7200 }], lay: [{ price: 3.50, size: 5100 }] } ], t2: [ { runnerName: 'Arsenal', back: [{ price: 105, size: 100 }], lay: [{ price: 110, size: 100 }] }, { runnerName: 'Chelsea', back: [{ price: 250, size: 100 }], lay: [{ price: 260, size: 100 }] } ], t3: [] }, { gmid: 204, eventName: 'Bayern Munich v Borussia Dortmund', date: '05/09/2026 22:00', inPlay: false, isTv: true, isFancy: true, isBookmaker: true, competition: 'Bundesliga', t1: [ { runnerName: 'Bayern Munich', back: [{ price: 1.65, size: 16500 }], lay: [{ price: 1.68, size: 12400 }] }, { runnerName: 'Borussia Dortmund', back: [{ price: 4.50, size: 7200 }], lay: [{ price: 4.80, size: 5100 }] }, { runnerName: 'The Draw', back: [{ price: 4.10, size: 6400 }], lay: [{ price: 4.30, size: 4200 }] } ], t2: [ { runnerName: 'Bayern Munich', back: [{ price: 65, size: 100 }], lay: [{ price: 68, size: 100 }] }, { runnerName: 'Borussia Dortmund', back: [{ price: 350, size: 100 }], lay: [{ price: 380, size: 100 }] } ], t3: [] } ], // Tennis (sid: 2) 2: [ { gmid: 301, eventName: 'Novak Djokovic v Carlos Alcaraz', date: 'In-Play', inPlay: true, isTv: true, isFancy: true, isBookmaker: true, competition: 'US Open', t1: [ { runnerName: 'Novak Djokovic', back: [{ price: 1.92, size: 12000 }], lay: [{ price: 1.96, size: 9500 }] }, { runnerName: 'Carlos Alcaraz', back: [{ price: 2.04, size: 11500 }], lay: [{ price: 2.08, size: 8800 }] } ], t2: [ { runnerName: 'Novak Djokovic', back: [{ price: 92, size: 100 }], lay: [{ price: 96, size: 100 }] }, { runnerName: 'Carlos Alcaraz', back: [{ price: 104, size: 100 }], lay: [{ price: 108, size: 100 }] } ], t3: [] }, { gmid: 302, eventName: 'Jannik Sinner v Daniil Medvedev', date: '04/09/2026 22:30', inPlay: false, isTv: true, isFancy: false, isBookmaker: true, competition: 'US Open', t1: [ { runnerName: 'Jannik Sinner', back: [{ price: 1.65, size: 15400 }], lay: [{ price: 1.68, size: 11200 }] }, { runnerName: 'Daniil Medvedev', back: [{ price: 2.45, size: 9200 }], lay: [{ price: 2.52, size: 7100 }] } ], t2: [ { runnerName: 'Jannik Sinner', back: [{ price: 65, size: 100 }], lay: [{ price: 68, size: 100 }] }, { runnerName: 'Daniil Medvedev', back: [{ price: 145, size: 100 }], lay: [{ price: 152, size: 100 }] } ], t3: [] }, { gmid: 303, eventName: 'Alexander Zverev v Stefanos Tsitsipas', date: '05/09/2026 18:00', inPlay: false, isTv: true, isFancy: false, isBookmaker: true, competition: 'ATP Masters', t1: [ { runnerName: 'Alexander Zverev', back: [{ price: 1.80, size: 8900 }], lay: [{ price: 1.84, size: 6500 }] }, { runnerName: 'Stefanos Tsitsipas', back: [{ price: 2.15, size: 7400 }], lay: [{ price: 2.20, size: 5200 }] } ], t2: [ { runnerName: 'Alexander Zverev', back: [{ price: 80, size: 100 }], lay: [{ price: 84, size: 100 }] }, { runnerName: 'Stefanos Tsitsipas', back: [{ price: 115, size: 100 }], lay: [{ price: 120, size: 100 }] } ], t3: [] } ] }; const apiMatchCache = {}; function hashCode(str) { let hash = 0; for (let i = 0; i < str.length; i++) { hash = (hash << 5) - hash + str.charCodeAt(i); hash |= 0; } return Math.abs(hash); } function formatDateStr(isoDateStr) { if (!isoDateStr) return 'In-Play'; const matchDate = new Date(isoDateStr); const now = new Date(); if (Math.abs(matchDate - now) < 3 * 3600 * 1000) { return 'In-Play'; } const d = String(matchDate.getDate()).padStart(2, '0'); const m = String(matchDate.getMonth() + 1).padStart(2, '0'); const y = matchDate.getFullYear(); const h = String(matchDate.getHours()).padStart(2, '0'); const min = String(matchDate.getMinutes()).padStart(2, '0'); return `${d}/${m}/${y} ${h}:${min}`; } async function fetchMatchesFromOddsApi(sid) { let keysToQuery = []; if (sid === 'all' || !sid) { keysToQuery = ['soccer_epl', 'soccer_spain_la_liga', 'soccer_germany_bundesliga', 'cricket_test_match', 'cricket_the_hundred', 'tennis_atp_us_open']; } else { let sportGroup = 'Soccer'; if (sid === 4) sportGroup = 'Cricket'; if (sid === 2) sportGroup = 'Tennis'; try { const sportsRes = await fetch(`https://api.the-odds-api.com/v4/sports/?apiKey=${CONFIG.ODDS_API_KEY}`); if (sportsRes.ok) { const sportsList = await sportsRes.json(); if (Array.isArray(sportsList)) { const groupSports = sportsList.filter(s => s.group === sportGroup && s.active); keysToQuery = groupSports.map(s => s.key); } } } catch (e) { console.warn('Sports list fetch error:', e); } if (keysToQuery.length === 0) { if (sid === 1) keysToQuery = ['soccer_epl', 'soccer_spain_la_liga', 'soccer_germany_bundesliga']; else if (sid === 4) keysToQuery = ['cricket_test_match', 'cricket_the_hundred']; else if (sid === 2) keysToQuery = ['tennis_atp_us_open']; } } let liveMatches = []; for (const sportKey of keysToQuery) { try { const url = `https://api.the-odds-api.com/v4/sports/${sportKey}/odds/?apiKey=${CONFIG.ODDS_API_KEY}®ions=uk,us&markets=h2h,h2h_lay`; const res = await fetch(url); if (!res.ok) continue; const data = await res.json(); if (Array.isArray(data) && data.length > 0) { data.forEach(item => { const gmid = hashCode(item.id || item.home_team + item.away_team); const eventName = `${item.home_team} v ${item.away_team}`; const formattedDate = formatDateStr(item.commence_time); const inPlay = formattedDate === 'In-Play'; const bookmaker = item.bookmakers && item.bookmakers[0]; const h2hMarket = bookmaker?.markets?.find(m => m.key === 'h2h'); const h2hLayMarket = bookmaker?.markets?.find(m => m.key === 'h2h_lay'); const t1 = []; const t2 = []; if (h2hMarket && Array.isArray(h2hMarket.outcomes)) { h2hMarket.outcomes.forEach(out => { const layPriceObj = h2hLayMarket?.outcomes?.find(l => l.name === out.name); const backPrice = out.price || 1.90; const layPrice = layPriceObj ? layPriceObj.price : parseFloat((backPrice + 0.04).toFixed(2)); t1.push({ runnerName: out.name, back: [{ price: backPrice, size: Math.floor(Math.random() * 5000 + 2000) }], lay: [{ price: layPrice, size: Math.floor(Math.random() * 4000 + 1000) }] }); t2.push({ runnerName: out.name, back: [{ price: Math.round((backPrice - 1) * 100), size: 100 }], lay: [{ price: Math.round((layPrice - 1) * 100), size: 100 }] }); }); } else { t1.push( { runnerName: item.home_team, back: [{ price: 1.90, size: 5000 }], lay: [{ price: 1.94, size: 4000 }] }, { runnerName: item.away_team, back: [{ price: 2.05, size: 4500 }], lay: [{ price: 2.08, size: 3500 }] } ); } const matchObj = { gmid, eventName, date: formattedDate, inPlay, isTv: true, isFancy: true, isBookmaker: true, competition: item.sport_title || 'Live Match', t1, t2, t3: [ { runnerName: `Over 2.5 Goals / Runs`, lay: [{ price: 1.80, size: 100 }], back: [{ price: 1.85, size: 100 }] } ] }; apiMatchCache[gmid] = matchObj; liveMatches.push(matchObj); }); } } catch (e) { console.warn(`Error fetching odds for ${sportKey}:`, e); } } return liveMatches; } function fetchMatches(sid) { if (sid === 'all') { return fetchAllMatches(); } sid = Number(sid) || 4; const fallbacks = FALLBACK_STORE[sid] || FALLBACK_STORE[4]; fallbacks.forEach(m => { apiMatchCache[m.gmid] = m; }); // Trigger background live API sync without blocking the UI if (CONFIG.ENABLE_LIVE_API && CONFIG.ODDS_API_KEY) { setTimeout(() => { fetchMatchesFromOddsApi(sid).catch(err => console.warn('Background API sync:', err)); }, 50); } const liveItems = Object.values(apiMatchCache); const combined = [...fallbacks]; liveItems.forEach(item => { if (!combined.some(m => m.gmid === item.gmid)) { combined.push(item); } }); return combined; } function fetchAllMatches() { const c = fetchMatches(4); const s = fetchMatches(1); const t = fetchMatches(2); const all = [...c, ...s, ...t]; const unique = []; all.forEach(m => { if (!unique.some(u => u.gmid === m.gmid)) { unique.push(m); } }); return unique; } async function fetchOdds(gmid, sid) { gmid = Number(gmid); if (apiMatchCache[gmid]) { return apiMatchCache[gmid]; } const matches = await fetchAllMatches(); const found = matches.find(m => Number(m.gmid) === gmid); if (found) return found; return { eventName: 'Match Details', date: 'In-Play', inPlay: true, t1: [ { runnerName: 'Team 1', back: [{ price: 1.85, size: 5000 }], lay: [{ price: 1.88, size: 4000 }] }, { runnerName: 'Team 2', back: [{ price: 2.10, size: 3000 }], lay: [{ price: 2.14, size: 2000 }] } ], t2: [ { runnerName: 'Team 1', back: [{ price: 85, size: 100 }], lay: [{ price: 88, size: 100 }] }, { runnerName: 'Team 2', back: [{ price: 110, size: 100 }], lay: [{ price: 114, size: 100 }] } ], t3: [] }; } window.WicketsAPI = window.WicketsAPI || {}; window.WicketsAPI.CONFIG = CONFIG; window.WicketsAPI.fetchMatches = fetchMatches; window.WicketsAPI.fetchAllMatches = fetchAllMatches; window.WicketsAPI.fetchOdds = fetchOdds; window.WicketsAPI.getResults = () => [ { gmid: 501, eventName: 'India v Pakistan', sport: 'Cricket', date: '02/09/2026', winner: 'India', score: 'IND 185/4 (20) def. PAK 179/8 (20)' }, { gmid: 502, eventName: 'Real Madrid v Atletico Madrid', sport: 'Soccer', date: '31/08/2026', winner: 'Real Madrid', score: '2 - 1' }, { gmid: 503, eventName: 'Carlos Alcaraz v Stefanos Tsitsipas', sport: 'Tennis', date: '29/08/2026', winner: 'Carlos Alcaraz', score: '6-4, 7-6, 6-2' } ]; })(window);
💾 Save