1<!doctype html> 2<html lang="en"> 3 <head> 4 <!-- Google tag (gtag.js) -->
vendor: 66 bytes, lines 4-5
4 5 <script async src="https://www.googletagmanager.com/gtag/js?id=
5AW-18128572376
vendor: 14 bytes, lines 5-6
5"></script> 6
6<script> 7
vendor: 140 bytes, lines 7-11
7window.dataLayer = window.dataLayer || []; 8 function gtag(){dataLayer.push(arguments);} 9 gtag('js', new Date()); 10 11 gtag('config', '
11AW-18128572376
vendor: 6 bytes, lines 11-12
11'); 12
12</script>
12 13 <meta charset="UTF-8" /> 14 <link rel="icon" type="image/png" href="https://horizons-cdn.hostinger.com/246675a5-d0bb-4fff-913b-97599f8ddb70/d8e14ef386ad34b50cb68f451d2e7682.png" /> 15 <meta name="generator" content="Hostinger Horizons" /> 16 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 17 <title>Expediters Site Services Inc. | Jacksonville Dumpster Rentals</title> 18
18<script type="module" crossorigin src="/assets/index-wzyP7nLf.js"></script>
18 19 <link rel="stylesheet" crossorigin href="/assets/index-BYhNKVYZ.css"> 20
20<script type="module"> 21window.onerror = (message, source, lineno, colno, errorObj) => { 22 const errorDetails = errorObj ? JSON.stringify({ 23 name: errorObj.name, 24 message: errorObj.message, 25 stack: errorObj.stack, 26 source, 27 lineno, 28 colno, 29 }) : null; 30 31 window.parent.postMessage({ 32 type: 'horizons-runtime-error', 33 message, 34 error: errorDetails 35 }, '*'); 36}; 37</script>
37 38
38<script type="module"> 39const observer = new MutationObserver((mutations) => { 40 for (const mutation of mutations) { 41 for (const addedNode of mutation.addedNodes) { 42 if ( 43 addedNode.nodeType === Node.ELEMENT_NODE && 44 ( 45 addedNode.tagName?.toLowerCase() === 'vite-error-overlay' || 46 addedNode.classList?.contains('backdrop') 47 ) 48 ) { 49 handleViteOverlay(addedNode); 50 } 51 } 52 } 53}); 54 55observer.observe(document.documentElement, { 56 childList: true, 57 subtree: true 58}); 59 60function handleViteOverlay(node) { 61 if (!node.shadowRoot) { 62 return; 63 } 64 65 const backdrop = node.shadowRoot.querySelector('.backdrop'); 66 67 if (backdrop) { 68 const overlayHtml = backdrop.outerHTML; 69 const parser = new DOMParser(); 70 const doc = parser.parseFromString(overlayHtml, 'text/html'); 71 const messageBodyElement = doc.querySelector('.message-body'); 72 const fileElement = doc.querySelector('.file'); 73 const messageText = messageBodyElement ? messageBodyElement.textContent.trim() : ''; 74 const fileText = fileElement ? fileElement.textContent.trim() : ''; 75 const error = messageText + (fileText ? ' File:' + fileText : ''); 76 77 window.parent.postMessage({ 78 type: 'horizons-vite-error', 79 error, 80 }, '*'); 81 } 82} 83</script>
83 84
84<script type="module"> 85const originalConsoleError = console.error; 86const MATCH_LINE_COL_REGEX = /:(\d+):(\d+)\)?\s*$/; // regex to match the :lineNum:colNum 87const MATCH_AT_REGEX = /^\s*at\s+(?:async\s+)?(?:.*?\s+)?\(?/; // regex to remove the 'at' keyword and any 'async' or function name 88const MATCH_PATH_REGEX = /^\//; // regex to remove the leading slash 89 90function parseStackFrameLine(line) { 91 const lineColMatch = line.match(MATCH_LINE_COL_REGEX); 92 if (!lineColMatch) return null; 93 const [, lineNum, colNum] = lineColMatch; 94 const suffix = `:${lineNum}:${colNum}`; 95 const idx = line.lastIndexOf(suffix); 96 if (idx === -1) return null; 97 const before = line.substring(0, idx); 98 const path = before.replace(MATCH_AT_REGEX, '').trim(); 99 100 if (!path) return null; 101 102 try { 103 const pathname = new URL(path).pathname; 104 const filePath = pathname.replace(MATCH_PATH_REGEX, '') || pathname; 105 return `${filePath}:${lineNum}:${colNum}`; 106 } catch (e) { 107 const filePath = path.replace(MATCH_PATH_REGEX, '') || path; 108 return `${filePath}:${lineNum}:${colNum}`; 109 } 110} 111 112function getFilePathFromStack(stack, skipFrames = 0) { 113 if (!stack || typeof stack !== 'string') return null; 114 const lines = stack.split('\n').slice(1); 115 116 const frames = lines.map(line => parseStackFrameLine(line.replace(/\r$/, ''))).filter(Boolean); 117 118 return frames[skipFrames] ?? null; 119} 120 121function formatConsoleMessage(args, skipStackFrames = 1) { 122 let messageString = ''; 123 let filePath = null; 124 125 for (let i = 0; i < args.length; i++) { 126 const arg = args[i]; 127 if (arg instanceof Error) { 128 filePath = getFilePathFromStack(arg.stack, 0); 129 messageString = `${arg.name}: ${arg.message}`; 130 if (filePath) { 131 messageString = `${messageString} at ${filePath}`; 132 } 133 break; 134 } 135 } 136 137 if (!messageString) { 138 messageString = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' '); 139 const stack = new Error().stack; 140 filePath = getFilePathFromStack(stack, skipStackFrames); 141 if (filePath) { 142 messageString = `${messageString} at ${filePath}`; 143 } 144 } 145 146 return messageString; 147} 148 149console.error = function(...args) { 150 originalConsoleError.apply(console, args); 151 152 window.parent.postMessage({ 153 type: 'horizons-console-error', 154 error: formatConsoleMessage(args, 1) 155 }, '*'); 156}; 157 158const originalConsoleWarn = console.warn; 159 160console.warn = function(...args) { 161 originalConsoleWarn.apply(console, args); 162 163 window.parent.postMessage({ 164 type: 'horizons-console-warn', 165 warning: formatConsoleMessage(args, 1) 166 }, '*'); 167}; 168</script>
168 169
169<script type="module"> 170// Prevents authentication failures (PB returns 400) from crashing the app â use console.info, not console.error/PM2. 171// [urlPattern, bodyPattern] tuples; align with sandboxErrorUtils ERROR_BLACKLIST. 172const BENIGN_FETCH_ERRORS = [ 173 [/hcgi\/platform\/api\/collections\/.*auth-with-password.*/i, /Failed to authenticate/i], 174 [/hcgi\/api\//i, /Insufficient credits/i], 175 // A user-supplied integration secret (Stripe/PayPal/Twilio/...) is not set yet â an expected setup state, not a bug to fix. 176 [/hcgi\/api\//i, /INTEGRATION_NOT_CONFIGURED/i], 177]; 178 179function isBenignFetchError(url, body) { 180 return BENIGN_FETCH_ERRORS.some(([urlPattern, bodyPattern]) => 181 urlPattern.test(url) && (!bodyPattern || bodyPattern.test(body))); 182} 183 184const PLATFORM_URL_PATTERN = /hcgi\/platform\//i; 185const VALIDATION_CODE_TEXT_PATTERN = /validation_/; 186 187function hasValidationCode(value) { 188 if (value == null) { 189 return false; 190 } 191 if (typeof value === 'string') { 192 return value.startsWith('validation_'); 193 } 194 if (Array.isArray(value)) { 195 return value.some(hasValidationCode); 196 } 197 if (typeof value === 'object') { 198 return Object.values(value).some(hasValidationCode); 199 } 200 return false; 201} 202 203function isValidationFetchWarning(url, body) { 204 if (!PLATFORM_URL_PATTERN.test(url)) { 205 return false; 206 } 207 try { 208 return hasValidationCode(JSON.parse(body)); 209 } catch { 210 return VALIDATION_CODE_TEXT_PATTERN.test(body); 211 } 212} 213 214const originalFetch = window.fetch; 215 216window.fetch = function(...args) { 217 const url = args[0] instanceof Request ? args[0].url : args[0]; 218 219 // Skip WebSocket URLs 220 if (url.startsWith('ws:') || url.startsWith('wss:')) { 221 return originalFetch.apply(this, args); 222 } 223 224 return originalFetch.apply(this, args) 225 .then(async response => { 226 const contentType = response.headers.get('Content-Type') || ''; 227 228 // Exclude HTML document responses 229 const isDocumentResponse = 230 contentType.includes('text/html') || 231 contentType.includes('application/xhtml+xml'); 232 233 // no-cors requests (e.g. Google Analytics/Ads beacons) always return an opaque 234 const isOpaqueResponse = response.type === 'opaque'; 235 236 if (!response.ok && !isDocumentResponse && !isOpaqueResponse) { 237 const responseClone = response.clone(); 238 const errorFromRes = await responseClone.text(); 239 const requestUrl = response.url; 240 const errorMessage = `Fetch error from ${requestUrl}: ${errorFromRes}`; 241 242 if (isBenignFetchError(requestUrl, errorFromRes)) { 243 console.info(errorMessage); 244 } else if (isValidationFetchWarning(requestUrl, errorFromRes)) { 245 console.warn(errorMessage); 246 } else { 247 console.error(errorMessage); 248 } 249 } 250 251 return response; 252 }) 253 .catch(error => { 254 if (!url.match(/.html?$/i)) { 255 // Cancelled in-flight fetch (e.g. preview reload) â not a server failure. 256 if (error?.name === 'AbortError') { 257 console.info(error); 258 } else { 259 console.error(error); 260 } 261 } 262 263 throw error; 264 }); 265}; 266</script>
266 267
267<script type="module"> 268if (window.navigation && window.self !== window.top) { 269 window.navigation.addEventListener('navigate', (event) => { 270 const url = event.destination.url; 271 272 try { 273 const destinationUrl = new URL(url); 274 const destinationOrigin = destinationUrl.origin; 275 const currentOrigin = window.location.origin; 276 277 if (destinationOrigin === currentOrigin) { 278 return; 279 } 280 } catch (error) { 281 return; 282 } 283 284 window.parent.postMessage({ 285 type: 'horizons-navigation-error', 286 url, 287 }, '*'); 288 }); 289} 290</script>
290 291 </head> 292 <body> 293 <div id="root"></div> 294 </body> 295</html>
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.