1(function () { 2 const COOKIE_NAME = 'cp_tracking'; 3 const ORIGIN_HOST = window.location.origin; 4 let TRACKING_API_URL = 'https://app.cpraedcourse.com/track_visit'; 5 if (ORIGIN_HOST.indexOf('gitview.net') !== -1) { 6 TRACKING_API_URL = `${ORIGIN_HOST}/track_visit`; 7 } 8 9 function generateUUID() { 10 return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => 11 (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) 12 ); 13 } 14 15 function getCookie(name) { 16 const value = `; ${document.cookie}`; 17 const parts = value.split(`; ${name}=`); 18 if (parts.length === 2) return decodeURIComponent(parts.pop().split(';').shift()); 19 } 20 21 function setCookie(name, value, days = 7) { 22 const expires = new Date(Date.now() + days * 864e5).toUTCString(); 23 document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/; SameSite=Lax`; 24 } 25 26 function parseDeviceInfo() { 27 const ua = navigator.userAgent; 28 let browser = 'Unknown', version = '', os = 'Unknown', device = 'Desktop'; 29 30 if (/Chrome/.test(ua)) { 31 browser = 'Chrome'; 32 version = ua.match(/Chrome\/([\d.]+)/)?.[1]; 33 } else if (/Firefox/.test(ua)) { 34 browser = 'Firefox'; 35 version = ua.match(/Firefox\/([\d.]+)/)?.[1]; 36 } else if (/Safari/.test(ua) && !/Chrome/.test(ua)) { 37 browser = 'Safari'; 38 version = ua.match(/Version\/([\d.]+)/)?.[1]; 39 } else if (/Edge/.test(ua)) { 40 browser = 'Edge'; 41 version = ua.match(/Edg\/([\d.]+)/)?.[1]; 42 } 43 44 if (/Windows/.test(ua)) os = 'Windows'; 45 else if (/Mac/.test(ua)) os = 'MacOS'; 46 else if (/Android/.test(ua)) os = 'Android'; 47 else if (/iPhone|iPad|iPod/.test(ua)) os = 'iOS'; 48 49 if (/Mobi|Android/i.test(ua)) device = 'Mobile'; 50 else if (/iPad/.test(ua)) device = 'Tablet'; 51 52 return {browser, version, os, device}; 53 } 54 55 const safeCheckValue = (v) => { 56 if (v === null || v === undefined || v === '') return null; 57 return v; 58 }; 59 60 let tracking = {}; 61 let utm_data = JSON.parse(getCookie('utm_data') || '{}'); 62 if (typeof utm_data === 'object' && utm_data !== null) { 63 tracking.utm_source = safeCheckValue(utm_data.utm_source); 64 tracking.utm_medium = safeCheckValue(utm_data.utm_medium); 65 tracking.utm_campaign = safeCheckValue(utm_data.utm_campaign); 66 tracking.utm_term = safeCheckValue(utm_data.utm_term); 67 tracking.utm_content = safeCheckValue(utm_data.utm_content); 68 tracking.gclid = safeCheckValue(utm_data.gclid); 69 tracking.fbclid = safeCheckValue(utm_data.fbclid); 70 } 71 try { 72 tracking = JSON.parse(getCookie(COOKIE_NAME) || '{}'); 73 } catch (e) { 74 } 75 76 if (!tracking.tracking_id) { 77 tracking.tracking_id = generateUUID(); 78 tracking.is_first_visit = 1; 79 tracking.send_status = false; 80 tracking.user_id = null; 81 tracking.user_id_saved = false; 82 83 const urlParams = new URLSearchParams(window.location.search); 84 const deviceInfo = parseDeviceInfo(); 85 86 tracking.utm_source = urlParams.get('utm_source') ? urlParams.get('utm_source') : safeCheckValue(tracking.utm_source); 87 tracking.utm_medium = urlParams.get('utm_medium') ? urlParams.get('utm_medium') : safeCheckValue(tracking.utm_medium); 88 tracking.utm_campaign = urlParams.get('utm_campaign') ? urlParams.get('utm_campaign') : safeCheckValue(tracking.utm_campaign); 89 tracking.utm_term = urlParams.get('utm_term') ? urlParams.get('utm_term') : safeCheckValue(tracking.utm_term); 90 tracking.utm_content = urlParams.get('utm_content') ? urlParams.get('utm_content') : safeCheckValue(tracking.utm_content); 91 tracking.gclid = urlParams.get('gclid') ? urlParams.get('gclid') : safeCheckValue(tracking.gclid); 92 tracking.fbclid = urlParams.get('fbclid') ? urlParams.get('fbclid') : safeCheckValue(tracking.fbclid); 93 tracking.landing_page = window.location.href; 94 tracking.referrer = document.referrer || ''; 95 tracking.browser = deviceInfo.browser; 96 tracking.browser_version = deviceInfo.version; 97 tracking.os = deviceInfo.os; 98 tracking.os_version = ''; 99 tracking.device_type = deviceInfo.device; 100 tracking.screen_resolution = `${screen.width}x${screen.height}`; 101 tracking.user_agent = navigator.userAgent; 102 tracking.language = navigator.language; 103 104 const safeGet = (k) => {
105 const v = urlParams.get(k); 106 if (v === null) return undefined; 107 const s = String(v).trim().toLowerCase(); 108 if (s === '' || s === 'null' || s === 'undefined') return undefined; 109 return v; 110 }; 111 112 tracking.utm_source = safeGet('utm_source'); 113 tracking.utm_medium = safeGet('utm_medium'); 114 tracking.utm_campaign = safeGet('utm_campaign'); 115 tracking.gclid = safeGet('gclid'); 116 tracking.fbclid = safeGet('fbclid'); 117 118 Object.keys(tracking).forEach(k => { 119 if (tracking[k] === null || tracking[k] === undefined || tracking[k] === '') { 120 delete tracking[k]; 121 } 122 }); 123 124 setCookie(COOKIE_NAME, JSON.stringify(tracking)); 125 } 126 127 if (!tracking.send_status) { 128 const query = new URLSearchParams(tracking).toString(); 129 const img = new Image(); 130 img.onload = function () { 131 tracking.send_status = true; 132 setCookie(COOKIE_NAME, JSON.stringify(tracking)); 133 trySyncUserId(); 134 }; 135 img.onerror = function () { 136 console.warn('Tracking pixel failed to load'); 137 }; 138 img.src = `${TRACKING_API_URL}?${query}`; 139 } 140 141 function trySyncUserId() { 142 143 if (typeof obj !== 'object' || !obj.ruid) return; 144 145 try { 146 tracking = JSON.parse(getCookie(COOKIE_NAME) || '{}'); 147 } catch (e) { 148 } 149 150 if (!tracking.tracking_id || tracking.user_id_saved || !tracking.send_status) return; 151 152 fetch(`${TRACKING_API_URL}`, { 153 method: 'POST', 154 headers: {'Content-Type': 'application/json'}, 155 body: JSON.stringify({ 156 tracking_id: tracking.tracking_id, 157 user_id: obj.ruid 158 }) 159 }).then(res => res.json()) 160 .then(res => { 161 if (res.status === 'ok') { 162 tracking.user_id = obj.ruid; 163 tracking.user_id_saved = true; 164 setCookie(COOKIE_NAME, JSON.stringify(tracking)); 165 } 166 }) 167 .catch(console.warn); 168 } 169 170 trySyncUserId(); 171})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.